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

ash*_*ish 18 linker gcc shared-libraries

我在用户空间保险丝库中添加了一个新功能(fuse_lowlevel_notify_inval_directory).libfuse.so的编译和创建完成没有错误.但是当我的应用程序尝试使用这个新函数时,链接器抛出错误:未定义引用`fuse_lowlevel_notify_inval_directory'colle2: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
Run Code Online (Sandbox Code Playgroud)

T/t表示符号出现在文本部分中.如果是大写,则符号为全局(外部).我怀疑这是问题所在.新添加的功能显示小写t,而其他旧功能有大写T.任何关于我可能做错的想法?

Emp*_*ian 19

关于我可能做错什么的任何想法?

t函数确实是库的本地函数.这可能由于一些或多个原因而发生.最可能的是:

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

    请参阅示例--version-script用于限制符号可见性.