Elimine las funciones de tiempo de ejecución que no se hayan utilizado, lo que hace que el ejecutable (GCC)

He construido la cadena de herramientas cruzadas GCC4.7.1 para ARM (cortex-m3). Ahora estoy vinculando un archivo ejecutable de código C / C ++ que seguramente no usa ciertas clases de STL (por ejemplo,std::string). Además, las excepciones y RTTI están desactivadas.

Aunque cuando estoy buscando el ELF objetivo (por ejemplo, usando nm), hay muchos símbolos (aparentemente de libstdc ++) vinculados que no esperaría encontrar allí (por ejemplo,std::exception, std::ios_base, etc.).

¿Por qué está esto ahí, y cómo puedo deshacerme de estas cosas para reducir el.text tamaño de la sección de mi objetivo?

Un compañero de trabajo me dio una sugerencia para anular algunas funciones de código auxiliar específicas de GCC:

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

Solo esto redujo el tamaño del código en unos 20KB.
¿Hay más de esos talones que puedo anular?

ACTUALIZAR:
OK, encontré un error realmente estúpido que eliminó la mayoría de las cosas que me preguntaba al corregirlo:
Había un#include <iostream> declaración dejada (aunque nada se llama desde allí) en uno de los archivos de origen. Esto por supuesto enlazará en la estática.std::cin, std::cout ystd::cerr instancias y todo lo que viene junto con estos.
La eliminación de la#include <iostream> declaración redujo el.text Segmento sobre otra porción> 100KB.

Sin embargo:
Todavía hay elstd::exception ystd::basic_string cosas sobre las que me estoy preguntando:

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> >'

Realmente no se usa mucho tamaño de código, solo unos 100 bytes, así que podría vivir descuidándolo, pero agradecería, si pudiera deshacerme de esto también.

Puesto que no estoy usando explícitamente excepciones, me pregunto por qué estas aún se crean instancias al vincular. ¿El uso de excepciones o no no se puede determinar realmente en el tiempo de ejecución?
Lo único que queda de la__gnu_cxx espacio de nombres que me queda ahora es

Type         Size Class 
T              58 '__gnu_cxx::recursive_init_error'

Es otra clase de excepción.

FINALMENTE:
Utilicé algunos indicadores adicionales para configurar la compilación cruzada de GCC4.7:

--enable-gold=yes 
--enable-lto 
--enable-cxx-flags='-fno-exceptions -ffunction-sections -fno-omit-frame-pointer'

Las últimas banderas se usan para compilar libstdc ++ y son esencialmente las mismas que se usan para construir el código de destino (lo cual es una acción razonable de todos modos). Referencias de excepción donde se fue después (incluyendo el__gnu_cxx::recursive_init_error).

Lo último fue que encontré un uso inesperado destd::string en nuestro código base. Después de arreglar eso, la referencia astd::basic_string<char, std::char_traits<char>, std::allocator<char> > También desapareció.

Así que estoy contento con el resultado ahora, no más innecesario, sobrecarga inesperada de libstdc ++, no hay razón para no usar C ++ con preferencia sobre C.

Respuestas a la pregunta(4)

Su respuesta a la pregunta