共享库中的nm符号输出中的t与T的含义是什么?

43

我在用户空间的fuse库中添加了一个新功能(fuse_lowlevel_notify_inval_directory)。

编译和创建libfuse.so没有出现错误。

但是当我的应用程序尝试使用这个新功能时,链接器会抛出错误:undefined reference to `fuse_lowlevel_notify_inval_directory' collect2: ld returned 1 exit status

我检查了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。你有什么想法我的错误可能是什么?


显然你没有给你的函数提供外部链接。至少需要提供代码才能更有帮助。 - Mike Kinghan
1个回答

57
有什么想法可能是我做错了吗?
确实,t函数是本地库中的。这可能是由于以下原因之一导致的:
  1. 您将函数声明为static;或者
  2. 您使用-fvisibility=hidden编译库,并且在该函数上没有使用__attribute__((visibility("default")));或者
  3. 您使用链接器版本脚本(即使用--version-script=libfoo.version标志)隐藏所有函数,除了那些明确导出的函数,并且您没有将函数添加到该列表中。

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

第三个问题是出在这里。Fuse有一些版本脚本并明确导出函数。 - ashish
但是为什么静态/本地函数会显示在符号列表中呢?我认为只有可以被外部环境调用的函数才应该显示在符号列表中? - xnervwang
“@xnervwang,‘我认为只有可以被外部环境调用的函数才应该显示在符号列表中?’--你的想法是错误的。在UNIX上,本地符号默认包括在符号表中以便于调试。” - Employed Russian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接