Estoy compilando algunos objetos compartidos archivo en una archive.a
:archivos de enlace (.a) en objeto compartido (.so)
$ g++ -c -Iinclude/ -fPIC -O0 -o object1.o source1.cpp
$ g++ -c -Iinclude/ -fPIC -O0 -o object2.o source2.cpp
$ ar rvs archive.a object1.o object2.o
r - object1.o
r - object2.o
Hasta aquí todo bien. El resultante archive.a
tiene un buen tamaño de algunos KB. Un volcado con nm
muestra que los archivos de objeto correspondientes están contenidos en los archivos.
Ahora quiero compilar varios de estos archivos en un archivo de objeto compartido.
g++ -g -O0 -Iinclude/ -I/usr/include/somelibrary -shared -o libLibrary.so archive1.a archive2.a
El resultado es que mi archivo de la biblioteca resultante es casi vacío :
$ nm -D libLibrary.so
w _Jv_RegisterClasses
0000000000201010 A __bss_start
w __cxa_finalize
w __gmon_start__
0000000000201010 A _edata
0000000000201020 A _end
0000000000000578 T _fini
0000000000000430 T _init
Alguna idea de lo que estoy haciendo mal?
Editar:
Cuando intento el interruptor -Wl,--whole-archive
, ocurre lo siguiente:
/usr/lib/x86_64-linux-gnu/libc_nonshared.a(elf-init.oS): In function `__libc_csu_init':
(.text+0xd): undefined reference to `__init_array_end'
/usr/bin/ld: /usr/lib/x86_64-linux-gnu/libc_nonshared.a(elf-init.oS): relocation R_X86_64_PC32 against undefined hidden symbol `__init_array_end' can not be used when making a shared object
/usr/bin/ld: final link failed: Bad value
collect2: ld returned 1 exit status
make: *** [libKeynect.so] Error 1
posible duplicado de [¿Cómo incluir todos los objetos de un archivo en un objeto compartido?] (Http://stackoverflow.com/questions/2763988/how-to-include-all-objects-of-an-archive- in-a-shared-object) – Atmocreations