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

Symbol lookup error undefined symbol, but all symbols seem to be present

可执行文件似乎无法解析链接库中的符号。 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

实际上"U"意味着,那个符号是未定义的。 ldd 在您的 libcharon.so.0 上显示什么? libstrongswan.so.0 是您应该找到 auth_class_names.

的地方

nm -D shows that the symbol auth_class_names is defined

否:说明auth_class_namesun定义在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 无处可去被发现;因此加载失败并显示未定义的符号。

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

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

  2. Link charon 二进制对 libstrongswan.so.

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