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.
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? –
@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
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 –