Убрать неиспользуемые функции времени выполнения, которые раздувают исполняемый файл (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.

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

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