让 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
有问题,但对于弱未解决的数据引用是您唯一的选择,惰性绑定对它们来说是不可能的。
我正在将动态生成的 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
有问题,但对于弱未解决的数据引用是您唯一的选择,惰性绑定对它们来说是不可能的。