【发布时间】:2012-08-23 07:00:14
【问题描述】:
我有一个程序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 手册页上列出的所有选项,但没有一个看起来很有希望。)
【问题讨论】: