gcc - nm 符号输出 t vs T 在共享 so 库中

标签 gcc linker shared-libraries

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

    相关文章:

    gcc 新安装的库 (libexpat1-dev) 在当前终端 (debian) 中无法识别

    c - 为什么 "gcc-std=c99 ...."不允许我使用 VLA?

    c++ - gcc soname 无法识别的命令行

    c++ - OSX 上 Boost 和 C++ 的链接器错误

    visual-c++ - 在禁用优化的情况下发布时链接缓慢

    c - 符号版本控制和 dlsym

    android - 创建包含外部( native 或 Java)包的 Android 库包

    c - 转换为 void* 和基本结构指针之间是否存在性能差异?

    .net - 从 .Net v4.0 程序集链接到 .Net v2.0 程序集似乎也链接(和别名)mscorlib v2.0。为什么?

    shared-libraries - 安装 netCDF4 时“找不到 hdf5 库”