【问题标题】:Symbol lookup error undefined symbol, but all symbols seem to be present符号查找错误未定义符号,但所有符号似乎都存在
【发布时间】:2018-11-14 05:46:57
【问题描述】:

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

【问题讨论】:

    标签: linux ld elf


    【解决方案1】:

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

    【讨论】:

    • 嗨,确实 libstrongswan 提供了 auth_class 符号,但 libcharon 没有引用它...
    【解决方案2】:

    nm -D 表示定义了符号 auth_class_names

    否:这表明auth_class_namesunlibcharon.so 中定义的。

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

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

    ldd /usr/lib/libstrongswan.so

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

    您的问题很可能是相邻的libcharon.so,也不是主可执行文件与libstrongswan.so 链接,因此当您动态加载libcharon.so 时,libstrongswan.so 无处可寻;因此加载失败,符号未定义。

    有几种可能的解决方案,从更正确到更老套:

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

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

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

    【讨论】:

    • 谢谢,您说的应用程序和库版本错误是正确的
    猜你喜欢
    • 2012-06-19
    • 2017-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-02
    • 2017-05-04
    • 1970-01-01
    相关资源
    最近更新 更多