【问题标题】:GCC -rdynamic not working with static librariesGCC -rdynamic 不适用于静态库
【发布时间】:2011-05-19 06:59:37
【问题描述】:

为什么 -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”来提取 .a 中的 .o 文件并仅使用 .o 进行链接,则符号会被插件导出并找到(如果您想知道,插件会加载 dlopen )。

我尝试使用 -Wl,-export-dynamic 但没有成功。

如上所述,我确实有一个解决方法,但我仍然希望了解我缺少什么。提前致谢!

【问题讨论】:

    标签: gcc static-libraries dynamic-linking


    【解决方案1】:

    通常,链接器仅包含被引用的静态档案(.a 文件)的那些部分。

    要强制链接器包含.a 文件的全部内容,您可以使用--whole-archive 链接器选项(所以-Wl,--whole-archive 在gcc 命令行上)。

    请注意,-Wl,--whole-archive 在命令行上是位置敏感的——它只影响在命令行上跟随它的.a 文件。如果还有其他您不想完全包含的静态存档,则可以随后使用-Wl,--no-whole-archive 关闭其效果。

    因此,例如,使用您的命令:

    $(CXX) $(CXXFLAGS) -o $(SAMPLE) main.o -Wl,--whole-archive $(STATICLIBS) -Wl,--no-whole-archive $(SHAREDLIBS) $(INCLUDES)
    

    【讨论】:

    • 非常感谢,我试试看!
    【解决方案2】:

    .o 文件是 ELF 可重定位文件,.so 文件是 ELF 共享对象。而.a 文件是当前存档。当链接器从gcc 通过-rdynamic 传递--export-dynamic 标志时,它正在寻找一个动态对象文件。

    我认为链接器并不关心查看存档并提取符号。

    【讨论】:

    • 感谢您的宝贵时间!现在,那个错误报告页面在哪里?
    猜你喜欢
    • 2021-07-28
    • 1970-01-01
    • 2017-08-05
    • 2019-09-15
    • 2023-03-04
    • 1970-01-01
    • 2014-07-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多