Убрать неиспользуемые функции времени выполнения, которые раздувают исполняемый файл (GCC)
Я собрал GCC4.7.1 кросс-инструментарий для ARM (cortex-m3). Сейчас я'м связывание исполняемого файла из кода C / C ++, который, безусловно, неиспользовать некоторые определенные классы STL (например,std::string
). Кроме того, исключения и RTTI отключены.
Хотя, когда ясмотря на целевой ELF (например, используя nm),s много символов (очевидно из libstdc ++), связанных вне ожидаю найти там (например,std::exception
std::ios_base
, так далее.).
Почему это там, и как я могу избавиться от этого материала, чтобы уменьшить.text
размер раздела моей цели?
Коллега дал мне совет отменить некоторые функции-заглушки GCC:
namespace __gnu_cxx
{
void __verbose_terminate_handler()
{
for (;;)
;
}
}
Одно это уменьшило размер кода примерно на 20 КБ.
Есть ли еще такие заглушки, которые я могу переопределить?
ОБНОВИТЬ:
Хорошо, я обнаружил одну действительно глупую ошибку, которая удалила большинство вещей, о которых я задумывался, при ее исправлении:
Это был#include
оператор оставил (хотя оттуда ничего не вызывали) в одном из исходных файлов. Это будет, конечно, ссылка в статике,std::cin
std::cout
а такжеstd::cerr
экземпляры и все прочее, что приходит вместе с ними.
Удаление#include
заявление уменьшило.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'
НетНа самом деле используется большой размер кода, всего несколько сотен байтов, так что я мог бы пренебречь им, но был бы признателен, если бы я мог избавиться и от этого.
Так как я'Я явно не использую исключений. Интересно, почему они все еще создаются при линковке? Использование исключений или не может 'быть действительно определенным во время выполнения?!?
Единственное, что осталось от__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
также исчез.
Так что я'Я доволен результатом сейчас, больше никаких ненужных, неожиданных накладных расходов от libstdc ++, нет причин не использовать C ++ в предпочтении над C.