【问题标题】:Unable to locate symbol inside shared library (.so)无法在共享库 (.so) 中找到符号
【发布时间】:2012-09-13 19:16:51
【问题描述】:

我正在尝试映射应该存在于共享库 (.so) 中的函数的地址。我成功地打开了库并尝试获取其中的函数地址:

fn_read = dlsym (handle, "functionName");

但是我遇到了一个错误,经过检查,错误是找不到该符号。我很确定我打这个电话是正确的。我也 100% 确定我尝试映射的函数包含在共享库本身中。我不确定在这里做什么...有人可以指出一些我可能忽略的错误/要点吗?

谢谢, 法尔

【问题讨论】:

  • 如果你这样做nm -D /path/to/your/lib.so,你看到列出的函数名称了吗?
  • 你确定“functionName”不是错字吗?

标签: c linux debugging shared-libraries


【解决方案1】:

尝试使用 unix/linux 命令nm -g <library>.so。它将列出您所有的 C 样式符号。

请注意,C++ 参与“名称修改”,因此如果您没有导出“C 样式”符号,则很可能名称已被修改且无法直接访问。 nm -gC <library>.so 也会显示错位的 C++ 名称。

如果您尝试访问 C++ 符号,并且名称修改导致了问题,那么遵循 C++ FAQ light on mixing C and C++ 中的指南可能会有所帮助。

【讨论】:

    【解决方案2】:

    如果该符号确实存在,唯一合理的原因是functionName 是一个尚未声明extern "C" 的C++ 函数。您可以添加 extern "C" 组件,或者确定错误名称并找到它。

    【讨论】:

    • 我正在查看共享库的源代码。该函数是一个 c 函数。
    • 如果函数是 c,那么很可能是符号不存在。使用@Edwin_Buck 建议的nm 命令来确定它是否存在。如果它不存在,则该符号可能已使用不允许其导出的属性构建。在 gcc 下使用 -fvisibility=hidden 编译会将符号默认隐藏,而符号定义上的 __attribute__ ((visibility("default"))) 会将其导出。
    猜你喜欢
    • 2022-12-03
    • 1970-01-01
    • 2015-11-24
    • 2018-04-13
    • 1970-01-01
    • 2023-02-25
    • 2016-09-28
    • 2014-11-01
    • 2023-02-09
    相关资源
    最近更新 更多