c - 在 GNU/Linux 上链接插件时如何巧妙地检测 undefined symbol ?

标签 c linux macos linker ld

我有一个程序 foo 可以通过 dlopen() 加载插件。我正在编写一个这样的插件 foobar,它可以连接第三方库 libfoo 提供的功能。

在 Linux 上,我正在像这样构建 foobar:

gcc -fpic -c -o foobar.o foobar.c
gcc -fpic -shared -o foobar.so foobar.o -lbar

到目前为止一切顺利。

问题是这不会检测 undefined symbol ,例如由于代码中的错误或头文件和库之间的不匹配。链接成功,您只会在稍后加载插件或调用插件中的某些内容时遇到错误(取决于 dlopen() 标志)。

要检测共享库中的 undefined symbol ,通常会使用 -Wl,-z,defs 或者 -Wl,--no-allow-shlib-undefined。但这会失败,因为它还会报告应该在运行时在 foo 程序中找到的符号。我想检测 undefined symbol ,但托管程序提供的符号除外。

例如,在 Mac OS X 上,这是通过 -bundle_loader 选项完成的。等效的链接命令是

gcc -bundle -o foobar.so foobar.o -lbar -bundle_loader=foo

并且以我想要的方式检测 undefined symbol 。

一般如何在 GNU/Linux 或 GNU ld 上执行此操作? (我查看了 ld 手册页中列出的所有选项,但没有一个看起来很有希望。)

最佳答案

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

关于c - 在 GNU/Linux 上链接插件时如何巧妙地检测 undefined symbol ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12164864/

相关文章:

linux - 在我自己的用户文件夹中时,Flutter 需要 sudo

objective-c - 覆盖调度命令

objective-c - 如何获取 cocoa 中目录的大小和可用空间?

C 代码时间函数在 Debian Linux 和 OpenWRT 上返回不同的结果

c++ - 使用环境变量 C++ 在 Linux 上用 C++ 启动进程

windows - 源代码管理 - XCode - Visual Studio 2005/2008/2010

c - gtk_label_set_text() 无法正常工作

c - 消息的 Adler32 + adler 总和是否为零(如 CRC32)

c - 为什么这个 C 程序会崩溃?

c - 快速读取文件