如何在GNU / Linux上链接插件时巧妙地检测未定义的符号?
发布时间:2020-12-14 01:39:45 所属栏目:Linux 来源:网络整理
导读:我有一个程序foo,可以通过dlopen()加载插件.我正在编写一个这样的插件foobar,它与第三方库libfoo提供的功能接口. 在Linux上,我正在构建像这样的foobar: gcc -fpic -c -o foobar.o foobar.cgcc -fpic -shared -o foobar.so foobar.o -lbar 到现在为止还挺好.
我有一个程序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手册页上列出的所有选项,但没有一个看起来很有希望.) 解决方法
我不知道这样做.但是,如果’foo’的结构在你的控制之下,你可以将’foo’中的所有逻辑移动到一个新的共享库中,该库导出正确的符号,然后将你的插件和主线链接到该库.
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |