为什么-rdynamic不导出.a文件中的符号,而是导出.o文件中的符号?
我在.so文件中有一个应用程序和一个插件。主应用程序使用一系列目标文件和一个静态库链接,如下所示:
CXXFLAGS = $(CXXFLAGS_COMMON) -rdynamic
STATICLIBS = ../Utilities/Utilities.a
...
all:
$(CXX) $(CXXFLAGS) -o $(SAMPLE) main.o $(STATICLIBS) $(SHAREDLIBS) $(INCLUDES)
(CXX是Ubunut上的g ++ 4.5.2,我主要使用-std = c ++ Ox进行编译)
在这种情况下,不会导出Utilities.a中的符号(即“objdump -t a.out | grep symbol”为空)。
如果我使用“ar x”来仅仅使用.o来提取.a和。链接中的.o文件,那么这些符号将被插件导出并找到(如果你想知道的话加载了dlopen) )。
我尝试过使用-Wl,-export-dynamic但没有成功。
我提到了一个解决方法,但我仍然希望了解我所缺少的内容。提前谢谢!
答案 0 :(得分:8)
通常,链接器仅包含引用的静态存档(.a
文件)的那些部分。
要强制链接器包含.a
文件的全部内容,可以使用--whole-archive
链接器选项(在{ccc命令行中-Wl,--whole-archive
)。
请注意,-Wl,--whole-archive
在命令行上对位置敏感 - 它仅影响命令行后面的.a
个文件。如果存在您不想完全包含的静态存档,则可以使用-Wl,--no-whole-archive
关闭其效果。
因此,例如,使用您的命令:
$(CXX) $(CXXFLAGS) -o $(SAMPLE) main.o -Wl,--whole-archive $(STATICLIBS) -Wl,--no-whole-archive $(SHAREDLIBS) $(INCLUDES)
答案 1 :(得分:1)
.o
文件是ELF可重定位的,.so
文件是ELF共享对象。而.a
文件是当前存档。当链接器从--export-dynamic
通过-rdynamic
传递gcc
标志时,它正在查找动态对象文件。
我认为链接器无需查看存档并提取符号。