Убрать неиспользуемые функции времени выполнения, которые раздувают исполняемый файл (GCC)
Я собрал GCC4.7.1 кросс-инструментарий для ARM (cortex-m3). Теперь я связываю исполняемый файл из кода C / C ++, который, безусловно, не использует некоторые определенные классы STL (например,std::string
). Кроме того, исключения и RTTI отключены.
Хотя, когда я смотрю на целевой ELF (например, используя nm), в нем содержится много символов (очевидно, из libstdc ++), которые я не ожидаю найти (например,std::exception
, std::ios_base
, и т.д.).
Почему это там, и как я могу избавиться от этого материала, чтобы уменьшить.text
размер раздела моей цели?
Коллега дал мне совет отменить некоторые функции-заглушки GCC:
namespace __gnu_cxx
{
void __verbose_terminate_handler()
{
for (;;)
;
}
}
Одно это уменьшило размер кода примерно на 20 КБ.
Есть ли еще такие заглушки, которые я могу переопределить?
ОБНОВИТЬ:
Хорошо, я обнаружил одну действительно глупую ошибку, которая удалила большинство вещей, о которых я задумывался, при ее исправлении:
Это был#include <iostream>
оператор оставил (хотя оттуда ничего не вызывали) в одном из исходных файлов. Это будет, конечно, ссылка в статическомstd::cin
, std::cout
а такжеstd::cerr
экземпляры и все прочее, что приходит вместе с ними.
Удаление#include <iostream>
заявление уменьшило.text
сегмент о другой> 100 КБ порции.
тем не менее:
Там ещеstd::exception
а такжеstd::basic_string
вещи, которые меня интересуют:
Namespace summaries:
==============================================================================
Type Size Namespace
T 774 'std'
W 184 'std::string::_Rep'
W 268 'std'
W 472 'std::string'
Class summaries:
==============================================================================
Type Size Class
T 50 'std::error_category'
T 52 'std::type_info'
T 54 'std::bad_exception'
T 54 'std::exception'
T 68 'std::bad_alloc'
T 98 'std::length_error'
T 214 'std::logic_error'
W 268 'std::basic_string<char, std::char_traits<char>, std::allocator<char> >'
На самом деле используется не очень большой размер кода, всего несколько сотен байтов, так что я мог бы не обращать на это внимания, но был бы признателен, если бы смог избавиться и от этого.
Поскольку я явно не использую никаких исключений, я удивляюсь, почему они все еще создаются при линковке. Использование исключений или нет не может быть определено во время выполнения?!?
Единственное, что осталось от__gnu_cxx
пространство имен я оставил сейчас
Type Size Class
T 58 '__gnu_cxx::recursive_init_error'
Это еще один класс исключений.
НАКОНЕЦ-ТО:
Я использовал некоторые дополнительные флаги для настройки кросс-сборки GCC4.7:
--enable-gold=yes
--enable-lto
--enable-cxx-flags='-fno-exceptions -ffunction-sections -fno-omit-frame-pointer'
Последние флаги используются для компиляции libstdc ++ и по сути те же, что и для сборки целевого кода (что в любом случае является разумным действием). Ссылки на исключения, которые исчезли впоследствии (включая__gnu_cxx::recursive_init_error
).
Последнее, что я нашел неожиданное использованиеstd::string
в нашей кодовой базе. После исправления, ссылка наstd::basic_string<char, std::char_traits<char>, std::allocator<char> >
также исчез.
Итак, я доволен результатом сейчас, больше никаких ненужных, неожиданных накладных расходов от libstdc ++, нет причин не использовать C ++ в предпочтении над C.