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

问题描述 投票:23回答:1

我在用户空间熔断器库中添加了一个新函数(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个回答
25
投票

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

t函数确实是本地库。这可能是由于多种原因造成的。最可能的是:

  1. 您已声明函数static,或
  2. 您使用-fvisibility=hidden编译了库,并且not在函数上具有__attribute__((visibility("default"))),或
  3. 您已使用链接器版本脚本(即带有--version-script=libfoo.version标志的链接器)将此库链接起来,该脚本隐藏了所有函数,但那些显式导出的函数除外,并且没有将函数添加到该列表中。请参阅this使用--version-script限制符号可见性的示例。
© www.soinside.com 2019 - 2024. All rights reserved.