【问题标题】:nm symbol output t vs T in a shared so library共享so库中的nm符号输出t vs T
【发布时间】:2016-09-28 15:33:42
【问题描述】:

我在用户空间熔断器库中添加了一个新函数(fuse_lowlevel_notify_inval_directory)。 libfuse.so 的编译和创建完成,没有错误。 但是当我的应用程序尝试使用这个新函数时,链接器会抛出错误:未定义的对 `fuse_lowlevel_notify_inval_directory' 的引用 collect2: ld 返回 1 个退出状态

当我用 nm 检查时

nm ../libfuse.so | grep inval
00000000000154ed T fuse_invalidate
**000000000001e142 t fuse_lowlevel_notify_inval_directory**
000000000001e26c T fuse_lowlevel_notify_inval_entry
000000000001e1cb T fuse_lowlevel_notify_inval_inode

T/t 表示符号出现在文本部分。如果是大写,则符号是全局的(外部的)。我怀疑这是问题所在。新添加的函数显示小写 t,而其他旧函数显示大写 T。知道我可能做错了什么吗?

【问题讨论】:

  • 显然你没有给你的函数外部链接。至少需要代码更有帮助。

标签: gcc linker shared-libraries


【解决方案1】:

知道我可能做错了什么吗?

t 函数确实是库的本地函数。这可能由于多种原因而发生。最有可能的是:

  1. 您声明了函数static,或者
  2. 您使用-fvisibility=hidden 编译了库,但没有函数上有__attribute__((visibility("default"))),或者
  3. 您将此库与隐藏所有函数的链接器版本脚本(即带有--version-script=libfoo.version 标志)链接,显式导出的函数除外,并且您没有将函数添加到该列表中。

    请参阅 this 使用 --version-script 限制符号可见性的示例。

【讨论】:

  • 第三点是问题。 Fuse 有一些版本脚本并显式导出函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-22
  • 1970-01-01
  • 2011-04-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多