Убрать неиспользуемые функции времени выполнения, которые раздувают исполняемый файл (GCC)

Я собрал GCC4.7.1 кросс-инструментарий для ARM (cortex-m3). Сейчас я'м связывание исполняемого файла из кода C / C ++, который, безусловно, неиспользовать некоторые определенные классы STL (например,std::string). Кроме того, исключения и RTTI отключены.

Хотя, когда ясмотря на целевой ELF (например, используя nm),s много символов (очевидно из libstdc ++), связанных вне ожидаю найти там (например,std::exceptionstd::ios_base, так далее.).

Почему это там, и как я могу избавиться от этого материала, чтобы уменьшить.text размер раздела моей цели?

Коллега дал мне совет отменить некоторые функции-заглушки GCC:

namespace __gnu_cxx
{
    void __verbose_terminate_handler()
    {
        for (;;)
            ;
    }
}

Одно это уменьшило размер кода примерно на 20 КБ.

Есть ли еще такие заглушки, которые я могу переопределить?

ОБНОВИТЬ:

Хорошо, я обнаружил одну действительно глупую ошибку, которая удалила большинство вещей, о которых я задумывался, при ее исправлении:

Это был#include  оператор оставил (хотя оттуда ничего не вызывали) в одном из исходных файлов. Это будет, конечно, ссылка в статике,std::cinstd::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.

Ответы на вопрос(4)

Ваш ответ на вопрос