我在用户空间熔断器库中添加了一个新函数 (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
限制符号可见性。 关于gcc - nm 符号输出 t vs T 在共享 so 库中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37531846/