GCC -rdynamic不能使用静态库

时间:2011-05-19 06:59:37

标签: gcc static-libraries dynamic-linking

为什么-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但没有成功。

我提到了一个解决方法,但我仍然希望了解我所缺少的内容。提前谢谢!

2 个答案:

答案 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标志时,它正在查找动态对象文件。

我认为链接器无需查看存档并提取符号。