Linux 共享库中缺少函数

noa*_*h.b 5 c++ linux g++ shared-libraries

我支持一个 Linux 程序,该程序允许用户编写自己的基于 .so 文件的插件,这些插件在运行时使用 dlopen() 加载。有时用户会忘记在包含必要函数定义的 makefile 中包含一个 C++ 文件。当插件管理器使用 dlsym() 从依赖于这些缺失函数定义之一的插件加载导出函数时,我得到一个空函数地址。

我的问题:我怎样才能提前检测到这个错误?我试过 -z defs 和 -Wno-undef 链接器标志,但它们不会产生错误。我已经尝试了带有各种标志的 nm、readelf 和 objdump 命令,但是未定义的函数根本没有出现在符号表中。有什么建议?谢谢!

小智 0

我怀疑空函数地址主要是在.so文件中使用某些第三方库的结果,当linux程序执行dlopen()时,它无法找到第三方,然后返回空函数地址

我建议在“好”和“坏”.so 文件上尝试 nm 命令,并查找带有“U”(未定义符号)的符号模式“坏”.so 文件将有更多“U”

另请参见 目标文件中未解析的外部符号使用共享库未定义符号的 Linux 共享库