共享 so 库中的 nm 符号输出 t 与 T

nm symbol output t vs T in a shared so library

我在用户 space 保险丝库中添加了一个新函数 (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。知道我可能做错了什么吗?

Any idea about what I might be doing wrong?

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

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

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