【问题标题】:How to add specific symbols from static library如何从静态库中添加特定符号
【发布时间】:2011-11-17 09:54:29
【问题描述】:

我正在尝试使用--whole-archive 选项,但它似乎不适用于-Xlinker。如何使用 -Xlinker 添加此选项?

这是整个故事: 我编写了一个主程序 A,以及几个共享库 B1、B2 等。主程序将使用 dlopen 在运行时加载这些共享库。我编译主程序 A 与主程序(S1、S2...等)或共享库(S3、S4...等)使用的所有可能的静态库链接。然后我编译没有静态库的共享库。 调用 dlopen 时,由于共享库中未定义符号,程序失败。这个符号确实存在于静态库 S3 中,但我在主程序的符号表中找不到它。

所以我在编译主程序时添加了 --whole-archive 选项,但最终二进制文件中仍然不存在该符号。如何在主程序中不直接使用此符号时将其添加到主程序中。

【问题讨论】:

  • 假设您使用的是 GNU binutils,--whole-archive-Xlinker 完美配合。您可能想澄清您的问题:您使用了什么命令行,是什么让您相信 --whole-archive 不起作用,等等。
  • 谢谢我把整个故事讲得更清楚了

标签: build compilation linker


【解决方案1】:

所以我在编译主程序时添加了--whole-archive选项

你还没有回答这个问题:你使用了什么命令行。在编译时添加链接器选项通常毫无意义:它们仅在链接时才重要。

您描述的情况的正确链接行是(假设您在 UNIX/ELF 系统上使用 GCC):

 gcc -rdynamic -o exename main.c \
   -Wl,--whole-archive -lS1 -lS2 -Wl,--no-whole-archive

重点说明:

  1. -rdynamic 是必需的,以便在 main 中定义的符号 可执行文件对dlopened 共享库可见。
  2. 图书馆应遵循链接行上的来源(图书馆和来源的顺序matters)。
  3. 您要完全链接的库应由--whole-archive--no-whole-archive 选项包围。

【讨论】:

  • 其实我是用工具生成Makefile的,无法控制--whole-archive、-l*、--no-whole-archive的顺序。因此,正如您所指出的,这是因为我要完全链接的静态库没有遵循 --whole-archive 选项。谢谢,很有帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-09-14
  • 1970-01-01
  • 2021-07-28
  • 1970-01-01
  • 1970-01-01
  • 2011-02-05
  • 1970-01-01
相关资源
最近更新 更多