符号查找错误未定义符号,但所有符号似乎都存在

Kon*_*ads 5 linux elf ld

可执行文件似乎无法解析链接库中的符号。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
Run Code Online (Sandbox Code Playgroud)

nm -D 显示符号 auth_class_names 已定义:

nm -D /usr/lib/libcharon.so.0|grep auth_class_names
        U auth_class_names
Run Code Online (Sandbox Code Playgroud)

编辑:添加 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
Run Code Online (Sandbox Code Playgroud)

Emp*_*ian 6

nm -D 显示符号 auth_class_names 已定义

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

libstrongswan 提供了 auth_class 符号,但 libcharon 没有引用它。

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

ldd /usr/lib/libstrongswan.so

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

您的问题很可能是 neigherlibcharon.so或主要可执行文件都链接到libstrongswan.so,因此当您动态加载时libcharon.solibstrongswan.so无处可找到;因此加载失败并出现未定义的符号。

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

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

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

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