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

Pet*_*aut 5 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
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好.

问题是,这不会检测未定义的符号,例如由于代码中的错误或头文件和库之间的不匹配.链接成功,您只有在加载插件或在插件中调用某些内容时才会收到错误(取决于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
Run Code Online (Sandbox Code Playgroud)

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

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

acm*_*acm 0

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