【问题标题】:How to smartly detect undefined symbols when linking a plugin on GNU/Linux?在 GNU/Linux 上链接插件时如何巧妙地检测未定义的符号?
【发布时间】: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 手册页上列出的所有选项,但没有一个看起来很有希望。)

【问题讨论】:

    标签: c linux macos linker ld


    【解决方案1】:

    据我所知,没有办法做到这一点。但是,如果 'foo' 的结构在您的控制之下,您可以将 'foo' 中的所有逻辑移动到导出正确符号的新共享库中,然后将您的插件和主线链接到该库。

    【讨论】:

      猜你喜欢
      • 2012-02-22
      • 1970-01-01
      • 1970-01-01
      • 2010-10-04
      • 2010-09-17
      • 1970-01-01
      • 2013-10-01
      • 1970-01-01
      相关资源
      最近更新 更多