Además de usar -nostdlib
y vincular crt1.o -lc -lgcc
, ¿hay alguna manera fácil de evitar que gcc vincule crtbegin[S].o
y crtend[S].o
? Estos archivos no son tan grandes, pero estoy jugando con pequeños binarios y me gustaría eliminar el inútil código de soporte C++ que no es necesario para los programas C. (Presumiblemente, gcc los vincula incluso para programas C en caso de que esté utilizando una biblioteca C++ con variables de objetos globales. Les ahorraré a todos la diatriba sobre cómo debería generar llamadas de inicialización seguras y únicas en todos los lugares donde se hace referencia al objeto global en C++ módulos en lugar de inicializar objetos globales antes de main
...)¿Hay alguna manera fácil de hacer que gcc omit crtbegin.o/crtend.o?
No me opondría a hackear el archivo gcc specs
para hacer la vinculación de los archivos de soporte C++ condicional en tal y tal, pero estoy no estoy seguro de cómo haría eso. Tal vez ya hay una buena manera?
Creo que también son necesarios para las funciones '__attribute__ ((constructor))' (y 'destructor'). (y estoy lejos de ser un experto en C++, pero me dijeron que para cumplir con el estándar, los constructores globales tienen que suceder antes de que se llame a 'main()') – caf
@caf: Tenía la impresión de que el C++ estándar especifica que los constructores son llamados en un tiempo no especificado entre la invocación del programa y la primera vez que se utiliza (y por supuesto en un orden no especificado, aparte de los casos donde un objeto hace referencia a otro y así invoca la "primera vez que se usa") . ¿Tiene una referencia a lo contrario? –
Probablemente una "enseñanza de chupar huevos", pero ¿ha intentado usar 'gcc' para compilar e ir directo a su enlazador de sistemas (probablemente' ld') para el paso del enlace real para que tenga un mayor control sobre el enlace? –