我有一个程序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
手册页中列出的所有选项,但没有一个看起来很有希望。)
答案 0 :(得分:0)
我无法做到这一点。但是,如果'foo'的结构在你的控制之下,你可以将'foo'中的所有逻辑移动到一个新的共享库中,该库导出正确的符号,然后将你的插件和主线链接到该库。 / p>