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

我有一个程序foo ,可以通过dlopen()加载插件。 我写了一个这样的插件foobar接口到第三方库libfoo提供的function。

在Linux上,我正在构buildfoobar

 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程序中find的符号。 我想检测未定义的符号,除了主机程序提供的。

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

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

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

在GNU / Linux或者GNU ld中,一个人怎么做呢? (我已经浏览了ld手册页上列出的所有选项,但没有一个看起来很有希望。)

我不知道这样做。 然而,如果'foo'的结构在你的控制之下,你可以将'foo'中的所有逻辑移动到一个新的共享库中,导出正确的符号,然后将你的插件和主线与库相连。