【问题标题】:Missing functions in Linux shared libraryLinux 共享库中缺少函数
【发布时间】: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


【解决方案1】:

我怀疑空函数地址主要是 在 .so 文件中使用一些第三方库 而linux程序做dlopen()时,找不到第三方,返回null函数地址

我建议对“好”和“坏”.so 文件都尝试 nm 命令 并查找带有“ U”(未定义符号)的符号模式 "bad" .so 文件会有更多的 'U'

另请参阅 Unresolved external symbol in object filesLinux shared library that uses a shared library undefined symbol

【讨论】:

  • 缺少的函数不在第三方库中。它们是在用户创建的 C++ 文件中定义的,他们忘记包含在 makefile 中。我无法使用 nm 搜索它们,因为函数名称根本不在符号表中。
【解决方案2】:

--no-undefined / -z defs 文档:

未定义的符号 仍然允许在共享库中。

使用另一个标志:--no-allow-shlib-undefined:

允许或禁止共享库中未定义的符号。这 switch 类似于--no-undefined,只是它决定了 当未定义的符号在共享库中时的行为,而不是 比普通的目标文件。它不影响未定义的程度 处理常规目标文件中的符号。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多