2012-04-12 11 views
9

La compilación/vinculación con -nostdlib parece evitar la inicialización estática, incluso si agrego mis propios crti.s y crtn.s con las secciones .init/.fini.g ++, inicialización estática y -nostdlib

¿Existen soluciones provisionales para hacer que g ++ genere el código de inicialización estática que se inserta en .init o que puedo llamar manualmente?

Esto es lo que he intentado:

g++ -o test.o -c -fno-use-cxa-atexit test.cc # has _start (entry point) 
               # that calls _init and _main 
as -o crti.o crti.s  # has _init in section .init 
as -o crtn.o crtn.s 
g++ -o test ./crti.o test.o -nodefaultlibs -nostartfiles ./crtn.o 

-nodefaultlibs solo incluye el código de inicialización estática y llamar, pero las fuerzas uso de libc-_start/_init.

-nodefaultlibs -nostartfiles me permite usar mi propio _start/_init, pero no incluye el código ni la llamada a la inicialización estática.

+0

Prueba este 'g ++ -o prueba ./crti.o ./crtn.o test.o -Wl, -nodefaultlibs -nostartfiles' Y mirando a su uso me siento solo ¿Quieres que se incluyan tus archivos de inicio y pareces estar bien con otras librerías de la biblioteca estándar? –

+0

@Pavan: Intenté '-Wl, -nodefaultlibs -Wl, -nostartfiles', pero luego libc-_init está incluido en el compilador. El uso es para IBM Cell SPU: necesito mi propio código de inicio para configurar todo y no uso las funciones de libc, pero aún necesito los constructores estáticos para que me llamen. – Thomas

+0

No soy muy versado en C++, así que no entiendo lo que quieres decir con "pero aún necesitas los constructores estáticos para que te llamen". ¿Puedes decirme un ejemplo? Estaba pensando en librerías estáticas todo el tiempo –

Respuesta

9

De gcc linker docs,

-nostdlib

No utilice los archivos de inicio del sistema estándar o bibliotecas cuando de enlace. No hay archivos de inicio y sólo las bibliotecas que especifique habrá pasado al enlazador, y las opciones que especifican la vinculación del sistema bibliotecas, tales como -static-libgcc o -shared-libgcc, se ignoran.

usan Por lo tanto,

-nodefaultlibs

No utilice las bibliotecas estándar del sistema cuando se enlaza. Solo las bibliotecas que especifique se pasarán al vinculador, se ignorarán las opciones que especifiquen la vinculación de las bibliotecas del sistema, como -static-libgcc o -shared-libgcc. Los archivos de inicio estándar se usan normalmente, a menos que se use -nostartfiles. El compilador puede generar llamadas a memcmp, memset, memcpy y memmove. Estas entradas generalmente se resuelven por entradas en libc. Estos puntos de entrada se deben suministrar a través de algún otro mecanismo cuando se especifica esta opción.

Proveedores,

g++ -Wl, -static 

-Wl  passes the next command on to the linker 
-static On systems that support dynamic linking, this prevents linking with 
     the shared libraries. On other systems, this option has no effect. 
+0

Esto ayudó mucho, gracias. – Thomas

+0

Con -nodefaultlibs se incluye y se invoca el código para la inicialización estática, pero luego no veo la forma de usar mi propio código .init/_start. ¿Es eso posible? – Thomas

+0

¿Usó '-nostartfiles'? –

Cuestiones relacionadas