Reputation: 85
I am compiling files a.c
& b.c
with flag -fstack-protector-strong
which results to introduce new symbol __stack_chk_fail
in object files a.o, b.o
nm a.o | grep __stack_chk_fail
U __stack_chk_fail
nm b.o | grep __stack_chk_fail
U __stack_chk_fail
I am creating one static library libstat.a
using above object files :
ar rc libstat.a a.o b.o
Finally, I am trying to create dynamic library libtest.so
using above static library. The above symbol __stack_chk_fail
is defined in library libssp.so
which is in gcc tool chain path /home/test_usr/gcc-10.3.0/aarch64-unknown-linux-gnu/lib64
objdump -T /home/test_usr/gcc-10.3.0/aarch64-unknown-linux-gnu/lib64/libssp.so.0.0.0 | grep __stack_chk_fail
0000000000000ff0 g DF .text 0000000000000020 LIBSSP_1.0 __stack_chk_fail
Build command:-
bin/gcc -include ... -L /home/test_usr/gcc-10.3.0/aarch64-unknown-linux-gnu/lib64/ -lssp -o libtest.so libstat.a
i was expecting to have the symbol defined in my final library libtest.so
, But no luck.
nm libtest.so | grep __stack_chk_fail
U __stack_chk_fail@LIBSSP_1.0
Am i missing some thing here? Why this symbols is not getting defined though i try to link with -lssp
which has this symbol definition. Please help!
Upvotes: 2
Views: 469
Reputation: 118425
No, this is not how shared libraries work. If the symbol is defined in some .so it does not "migrate" to every library or executable that gets linked with it. You are thinking of static libraries, not dynamic libraries.
A static library, a .a
file, consists of multiple object modules with exported symbols. Any symbol that's referenced by whatever you link with the shared library results in its module being copied out of a static library and into an executable or another library that gets linked with it.
A shared library (or a dynamic library as you call them), a .so
file, does not work that way.
The library gets loaded at run time, and at runtime all unresolved symbols in your executable or library get resolved with the symbols exported from the shared library, so nothing needs to get copied out of the shared library.
A static library does not get loaded at runtime, and does not need to be installed, because everything that's needed gets extracted from the static library, by your linker, and included in the executable or library that gets linekd with the static library.
The whole reason to use shared libraries, .so
s, is to not bloat everything that gets linked with the library with the code from the linked library. The code, and all exported symbols, remain in the .so
file, they do not get "defined" or added into whatever gets linked with it.
Upvotes: 1