我正在尝试使用--whole-archive
选项,但似乎无法使用-Xlinker
。如何使用 - Xlinker
?
以下是整个故事: 我写了一个主程序A,以及几个共享库B1,B2等。主程序将使用dlopen在运行时加载这些共享库。我编译主程序A链接主程序(S1,S2 ......等)或共享库(S3,S4等)使用的所有可能的静态库。然后我编译没有静态库的共享库。 调用dlopen时,由于共享库中的未定义符号,程序失败。这个符号确实存在于静态库S3中,但我无法在主程序的符号表中找到它。
所以我在编译主程序时添加了--whole-archive选项,但该符号在最终二进制文件中仍然不存在。如何在主程序中直接使用此符号时,如何将此符号添加到主程序中。
答案 0 :(得分:1)
所以我在编译主程序时添加了--whole-archive选项
你仍然没有回答这个问题:你使用了什么命令行。 编译时添加链接器选项通常毫无意义:它们只在链接时才有用。
您描述的情况的正确链接行(假设您在UNIX / ELF系统上使用GCC):
gcc -rdynamic -o exename main.c \
-Wl,--whole-archive -lS1 -lS2 -Wl,--no-whole-archive
重点解释:
-rdynamic
以便在主要内容中定义符号
可执行文件对dlopen
ed共享库可见。--whole-archive
和--no-whole-archive
选项包围。