【发布时间】:2020-01-01 01:16:09
【问题描述】:
我正在支持一个 Linux 程序,该程序允许用户编写他们自己的基于 .so 文件的插件,这些插件在运行时使用 dlopen() 加载。有时用户会忘记在包含必要函数定义的 makefile 中包含 C++ 文件。当插件管理器使用 dlsym() 从依赖于这些缺失函数定义之一的插件加载导出函数时,我得到一个空函数地址。
我的问题:如何提前检测到此错误?我已经尝试了 -z defs 和 -Wno-undef 链接器标志,但它们不会产生错误。我已经尝试了带有各种标志的 nm、readelf 和 objdump 命令,但未定义的函数根本没有出现在符号表中。有什么建议?谢谢!
【问题讨论】:
-
如果对函数的唯一引用是那些隐含在
dlsym使用中的函数,那么链接器如何知道它们丢失了? -
如果通过
dlsym找不到这些符号中的任何一个,只需终止主程序。此外,如果在nm -D plugin.so的输出中找不到任何所需的符号,则插件已损坏。
标签: c++ linux g++ shared-libraries