如何在GNU / Linux上链接插件时巧妙地检测未定义的符号?

时间:2012-08-28 17:58:07

标签: c linux macos linker ld

我有一个程序foo可以通过dlopen()加载插件。我正在编写一个这样的插件foobar,它与第三方库libfoo提供的功能接口。

在Linux上,我正在构建foobar,如下所示:

gcc -fpic -c -o foobar.o foobar.c
gcc -fpic -shared -o foobar.so foobar.o -lbar

到目前为止一切顺利。

问题是这不会检测未定义的符号,例如代码中的错误或头文件和库之间的不匹配。链接成功,只有在加载插件或在插件中调用某些内容时才会出现错误(取决于dlopen()标志)。

要检测共享库中的未定义符号,通常会使用-Wl,-z,defs-Wl,--no-allow-shlib-undefined。但这会失败,因为它还会报告应该在运行时在foo程序中找到的符号。我想检测未定义的符号,但托管程序提供的符号除外。

例如,在Mac OS X上,这是由-bundle_loader选项完成的。等效的链接命令是

gcc -bundle -o foobar.so foobar.o -lbar -bundle_loader=foo

并以我想要的方式检测未定义的符号。

如何在GNU / Linux或GNU ld上执行此操作? (我查看了ld手册页中列出的所有选项,但没有一个看起来很有希望。)

1 个答案:

答案 0 :(得分:0)

我无法做到这一点。但是,如果'foo'的结构在你的控制之下,你可以将'foo'中的所有逻辑移动到一个新的共享库中,该库导出正确的符号,然后将你的插件和主线链接到该库。 / p>