如何从静态库中添加特定符号

时间:2011-11-17 09:54:30

标签: build compilation linker

我正在尝试使用--whole-archive选项,但似乎无法使用-Xlinker。如何使用 - Xlinker

添加此选项

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

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

1 个答案:

答案 0 :(得分:1)

  

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

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

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

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

重点解释:

  1. 需要-rdynamic以便在主要内容中定义符号 可执行文件对dlopen ed共享库可见。
  2. 图书馆应遵循链接线上的来源(图书馆和资源来源matters)。
  3. 您要完全链接的图书馆应该被--whole-archive--no-whole-archive选项包围。