我有一个程序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'中的所有逻辑移动到一个新的共享库中,导出正确的符号,然后将你的插件和主线与库相连。