2011-11-17 23 views
0

我试图使用--whole-archive选项,但它似乎不适用于-Xlinker。我如何使用 - Xlinker来添加此选项?如何从静态库中添加特定符号

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

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

+0

假设你使用的是GNU binutils,''-whole-archive'与'-Xlinker'完美兼容。你可能想澄清一下你的问题:你使用的是什么命令行,是什么让你相信' - 整个档案文件'不起作用,等等。 –

+0

谢谢我已经使整个故事更加清晰 – Shawn

回答

1

所以我编译主程序时添加--whole存档选项

你还没有回答的问题是:你使用什么命令行。当编译时添加链接器选项一般毫无意义:它们只在链接时才有意义。

为你描述(假设你是一个UNIX/ELF系统上使用GCC)形势的正确链接线:

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

的要点说明:

  1. -rdynamic需要因此在主要的 可执行文件中定义的符号对于共享库是可见的。
  2. 图书馆应遵循链接线上的来源(图书馆和来源的顺序matters)。
  3. 要完全链接的库应包含--whole-archive--no-whole-archive选项。
+0

其实我正在使用工具来生成Makefile,我无法控制--whole-archive,-l *,--no-whole-archive的顺序。因此,正如你所指出的那样,这是因为我想完全链接的静态库不是跟随 - 整个归档选项。谢谢,这是非常有帮助的 – Shawn

相关问题