linux - 符号查找错误 undefined symbol,但所有符号似乎都存在

标签 linux ld elf

可执行文件似乎无法解析链接库中的符号。 LD_DEBUG=libs 的相关输出表明加载了正确的库:

6557:     /usr/lib/libcharon.so.0: error: symbol lookup error: undefined symbol: auth_class_names (fatal)
                /usr/libexec/ipsec/charon: symbol lookup error: /usr/lib/libcharon.so.0: undefined symbol: auth_class_names

nm -D 表明定义了符号auth_class_names:

nm -D /usr/lib/libcharon.so.0|grep auth_class_names
        U auth_class_names

编辑:添加 ldd 的输出:

/usr/lib# ldd /usr/lib/libstrongswan.so
    libpthread.so.0 => /lib/arm-linux-gnueabi/libpthread.so.0 (0xb6ecd000)
    libdl.so.2 => /lib/arm-linux-gnueabi/libdl.so.2 (0xb6ec2000)
    librt.so.1 => /lib/arm-linux-gnueabi/librt.so.1 (0xb6eb3000)
    libc.so.6 => /lib/arm-linux-gnueabi/libc.so.6 (0xb6d78000)
    /lib/ld-linux.so.3 (0xb6f25000)
/usr/lib# ldd /usr/lib/libcharon.so
    libm.so.6 => /lib/arm-linux-gnueabi/libm.so.6 (0xb6ea6000)
    libpthread.so.0 => /lib/arm-linux-gnueabi/libpthread.so.0 (0xb6e86000)
    libdl.so.2 => /lib/arm-linux-gnueabi/libdl.so.2 (0xb6e7b000)
    libcap.so.2 => /lib/arm-linux-gnueabi/libcap.so.2 (0xb6e70000)
    libc.so.6 => /lib/arm-linux-gnueabi/libc.so.6 (0xb6d35000)
    /lib/ld-linux.so.3 (0xb6fa6000)
    libattr.so.1 => /lib/arm-linux-gnueabi/libattr.so.1 (0xb6d27000)

# nm -D /usr/lib/libstrongswan.so|grep auth_class
00036a50 D auth_class_names

最佳答案

nm -D shows that the symbol auth_class_names is defined

否:它表明 auth_class_names libcharon.so 中定义。

libstrongswan provides the auth_class symbol, but libcharon doesn't reference it.

又错了:libcharon.so 确实引用了符号。

ldd /usr/lib/libstrongswan.so

这不是您想要的。你想要 ldd/usr/lib/libcharon.so

您的问题很可能是相邻的 libcharon.so 和主要的可执行文件都没有链接到 libstrongswan.so,所以当您动态加载 libcharon.so ,找不到libstrongswan.so;因此加载失败并显示 undefined symbol 。

有几种可能的解决方案,从更正确到更 hacky 排序:

  1. libcharon.so 链接到 libstrongswan.so。加载 libcharon.so 将加载其所有依赖项(现在将包括 libstrongswan.so,并且将找到该符号)。

  2. charon 二进制文件链接到 libstrongswan.so

  3. 动态加载libstrongswan.so加载libcharon.so之前。
  4. LD_PRELOAD=libstrongswan.so

关于linux - 符号查找错误 undefined symbol,但所有符号似乎都存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50688237/

相关文章:

linux - 链接后显示长地址的 objdump

c - 如何获取结构 "Elf64_Rela"中的符号名称

linux - 为什么打开字符设备文件时Python为什么执行 `TIOCGWINSZ` ioctl调用?

linux - 使用 Linux shell 脚本在字符串中的位置?

linux - bash 脚本仅搜索目录特定文件类型

elf - readelf -S 的输出中 ES、Lk、Inf 和 A​​l 列标题的含义是什么?

linux - 从 ELF 中删除汇编指令

mysql - 如何在mysql数据库中插入多行数据

c - LD:将共享库链接到静态库

c - Linux 上对共享库的弱依赖