I have a program, myprogram
, which is linked with a static convenience library, call it libconvenience.a
, which contains a function, func()
. The function func()
isn't called anywhere in myprogram
; it needs to be able to be called from a plugin library, plugin.so
.
The symbol func()
is not getting exported dynamically in myprogram
. If I run
nm myprogram | grep func
I get nothing. However, it isn't missing from libconvenience.a
:
nm libconvenience/libconvenience.a | grep func
00000000 T func
I am using automake, but if I do the last linking step by hand on the command line instead, it doesn't work either:
gcc -Wl,--export-dynamic -o myprogram *.o libconvenience/libconvenience.a `pkg-config --libs somelibraries`
However, if I link the program like this, skipping the use of a convenience library and linking the object files that would have gone into libconvenience.a
directly, func()
shows up in myprogram
's symbols as it should:
gcc -Wl,--export-dynamic -o myprogram *.o libconvenience/*.o `pkg-config --libs somelibraries`
If I add a dummy call to func()
somewhere in myprogram
, then func()
also shows up in myprogram
's symbols. But I thought that --export-dynamic
was supposed to export all symbols regardless of whether they were used in the program or not!
I am using automake 1.11.1 and gcc 4.5.1 on Fedora 14. I am also using Libtool 2.2.10 to build plugin.so
(but not the convenience library.)
I didn't forget to put -Wl,--export-dynamic
in myprogram_LDFLAGS
, nor did I forget to put the source that contains func()
in libconvenience_a_SOURCES
(some Googling suggests that these are common causes of this problem.)
Can somebody help me understand what is going on here?
See Question&Answers more detail:
os