共享 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
函数确实是库的本地函数。这可能由于多种原因而发生。最有可能的是:
- 您声明了函数
static
,或
- 您使用
-fvisibility=hidden
编译了库并且 没有 有 __attribute__((visibility("default")))
函数,或者
- 您将此库与一个链接器版本脚本(即带有
--version-script=libfoo.version
标志)链接起来,该脚本隐藏了所有函数,除了那些明确导出的函数,并且您没有将您的函数添加到该列表中。
请参阅 this 使用 --version-script
限制符号可见性的示例。
我在用户 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
函数确实是库的本地函数。这可能由于多种原因而发生。最有可能的是:
- 您声明了函数
static
,或 - 您使用
-fvisibility=hidden
编译了库并且 没有 有__attribute__((visibility("default")))
函数,或者 - 您将此库与一个链接器版本脚本(即带有
--version-script=libfoo.version
标志)链接起来,该脚本隐藏了所有函数,除了那些明确导出的函数,并且您没有将您的函数添加到该列表中。
请参阅 this 使用--version-script
限制符号可见性的示例。