Linking archives (.a) into shared object (.so)
Solution 1
symbols/object files in .a files that's not used, will be discarded by the linker.
Use -Wl,--whole-archive
for the linking to include the entire .a file
Edit, you'll need to add -Wl,--no-whole-archive
after you specify your library as well, so the whole thing will be -Wl,--whole-archive archive1.a archive2.a -Wl,--no-whole-archive
Solution 2
Regarding your edit: Put "-Wl,--no-whole-archive" at the end of the link command you're running. That fixed it for me.
Atmocreations
Updated on June 25, 2022Comments
-
Atmocreations almost 2 years
I'm compiling some shared objects file into an
archive.a
:$ 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
So far so good. The resulting
archive.a
has a good size of some KB. A dump withnm
shows that the corresponding object-files are contained within the files.Now I'm wanting to compile several of these archives into a shared object file.
g++ -g -O0 -Iinclude/ -I/usr/include/somelibrary -shared -o libLibrary.so archive1.a archive2.a
The result is that my resulting library file is nearly empty:
$ 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
Any idea what I'm doing wrong?
Edit:
When I try the switch
-Wl,--whole-archive
, following happens:/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
-
Atmocreations over 12 yearsThanks for your fast reply. Unfortunately, I seem to run in another problem. I modified the question.