让 dlopen 忽略未定义的符号

Get dlopen to ignore undefined symbols

我正在将动态生成的 C++ 文件编译为共享对象,其中包含对仅在其完整构建中可用的符号的引用。

g++ -o tmp_form.so -fPIC -shared -lsomelib -std=gnu99 tmp_form.cc

我不需要当前程序缺少的符号,只需要链接库中的符号。但是 dlopen 确实要求它们可用,否则就会失败。缺少的符号是在结构中引用的所有变量。

一种选择是将弱引用属性添加到生成的代码中缺失的符号。但我想尽可能避免更改代码生成器。

如有任何建议,我们将不胜感激。

尝试dlopen("/path/to/the/library", RTLD_LAZY);

您的 link 命令不正确:

... -lsomelib ... tmp_form.cc

应该是

... tmp_form.cc -lsomelib

sources/objects 和库在 link 行的顺序 重要。

如果您使用的是 ELF 平台和最新版本的 Gold linker,您可以 "downgrade" 未解析的符号使用 --weak-unresolved-symbols 选项进行弱化(添加 here) 不修改源代码。

否则就得修改源码,没有别的办法。

P.S。由于惰性绑定,函数引用 不会RTLD_LAZY 有问题,但对于弱未解决的数据引用是您唯一的选择,惰性绑定对它们来说是不可能的。