代码之家  ›  专栏  ›  技术社区  ›  codehippo

nm报告符号已定义,但ldd报告符号未定义

  •  2
  • codehippo  · 技术社区  · 17 年前

    我的链接有问题。我需要链接到一个共享库 libfoo.so 这取决于一个函数 read 我想在read.c文件中定义我自己。

    我编译并链接所有东西,但在运行时我得到了错误

    /home/bar/src/libfoo.so: undefined symbol: sread.
    

    nm报告符号已定义

    $nm baz | grep sread
      00000000000022f8 t sread
    

    但ldd报告该符号未定义

    $ldd -r baz | grep sread 
    undefined symbol: sread (/home/bar/src/libfoo.so)
    

    有什么好处?libfoo.so是一个共享库这一事实是否存在一些问题?

    3 回复  |  直到 16 年前
        1
  •  14
  •   Employed Russian    17 年前

    首先,定义一个名为“read”的函数是个坏主意(TM),因为它是所有UNIXen上的标准libc函数。执行此操作时,程序的行为未定义。

    其次是 read libbaz.so 用一个字母标记 't' 在里面 nm 输出这意味着此功能是本地的(外部不可见) libbaz.so )。全局函数标记为 'T' 通过 纳米

    你用过吗 'static int read(...)' 当您在read.c中定义它时? 如果没有,您是否使用了链接器脚本,或者 attribute((visibility(hidden))) ,或者 -fvisibility=hidden 编译和链接时在命令行上 libbaz.so ?

        2
  •  1
  •   fredbaba    13 年前

    我今天遇到了同样的行为,除了我的问题在上一节所述的行动后得到了解决 Wikipedia . 基本上,用C++编译器编译的C代码在符号表中将有一个“被损坏”的名称,导致C样式符号解析失败。

        3
  •  -1
  •   lothar    17 年前

    构建共享库时,需要解决以下问题: 全部的 来自同一库或其他(共享)库的未定义符号。链接器将 不 使用应用程序中的符号解析库中未定义的符号。