我有一个程序 foo
可以通过 dlopen()
加载插件。我正在编写一个这样的插件 foobar
,它可以连接第三方库 libfoo
提供的功能。
在 Linux 上,我正在像这样构建 foobar
:
gcc -fpic -c -o foobar.o foobar.c
gcc -fpic -shared -o foobar.so foobar.o -lbar
到目前为止一切顺利。
问题是这不会检测 undefined symbol ,例如由于代码中的错误或头文件和库之间的不匹配。链接成功,您只会在稍后加载插件或调用插件中的某些内容时遇到错误(取决于 dlopen()
标志)。
要检测共享库中的 undefined symbol ,通常会使用 -Wl,-z,defs
或者 -Wl,--no-allow-shlib-undefined
。但这会失败,因为它还会报告应该在运行时在 foo
程序中找到的符号。我想检测 undefined symbol ,但托管程序提供的符号除外。
例如,在 Mac OS X 上,这是通过 -bundle_loader
选项完成的。等效的链接命令是
gcc -bundle -o foobar.so foobar.o -lbar -bundle_loader=foo
并且以我想要的方式检测 undefined symbol 。
一般如何在 GNU/Linux 或 GNU ld 上执行此操作? (我查看了 ld
手册页中列出的所有选项,但没有一个看起来很有希望。)
最佳答案
据我所知,没有办法做到这一点。但是,如果“foo”的结构在您的控制之下,您可以将“foo”中的所有逻辑移动到一个导出正确符号的新共享库中,然后将您的插件和主线链接到该库。
关于c - 在 GNU/Linux 上链接插件时如何巧妙地检测 undefined symbol ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12164864/