【问题标题】:Linking to wrong library version in a C++ application在 C++ 应用程序中链接到错误的库版本
【发布时间】:2010-10-08 14:47:08
【问题描述】:

我正在对 RHEL/CentOS 5 上的 C++ 二进制文件进行故障排除,该二进制文件在 openssl 共享库方面存在问题。我不会做太多 C/C++ 编程,而且我很难找到根本问题。

似乎出了问题的是应用程序链接到特定版本的 libcrypto 和 libssl (0.9.8),而不是 /lib/libcrypto.so.6/lib/libssl.so.6 的符号链接路径。由于 openssl 库在编译后已更新,因此现在已损坏。

ldd 显示以下 2 个二进制问题:

libcrypto.so.0.9.8 => not found
libssl.so.0.9.8 => not found

[编辑] 我获得了源代码,并且它构建正确。我将不得不采用最简单的解释,构建机器错误地配置了非标准库,并且 makefile 很好。

【问题讨论】:

    标签: c++ linux linker qmake rhel5


    【解决方案1】:

    一些建议(我假设您无法获得链接到新版本 ssl 库的新二进制文件):

      1234563 .
    1. 使用 LD_PRELOAD 强制加载新版本的库,并希望二进制文件需要的所有符号都在那里并且二进制文件实际运行。这工作的机会很小,但值得一试。

    【讨论】:

    • 我知道我可以加载旧库,并且我认为我可以通过预加载它们或添加适当的符号链接来强制加载新库,但我想追踪问题的原因;这两个都是为了我自己,这样我就可以知道出了什么问题,所以我可以向开发人员提供更多信息。
    • 糟糕,误读了这个问题。搜索它看起来 libcrypto.so.6 是 OpenSSL 0.9.8 库的常用名称,所以我猜你的二进制文件是由使用不同发行版的人构建的,这些发行版以不同的方式命名它们。在这种情况下,我会在这里选择 2,或者甚至只是在 /lib 中为 libcrypto.so.0.9.8 -> libcrypto.so.6 等添加符号链接。我猜你现有的库实际上可以工作。刚刚看到您的评论:我会问您的开发人员他们使用的是什么发行版,因为我希望它与此相关。
    • @Rup - 假定 是在同一个平台上构建的 ;) 这是一个很好的观点,它可能是在一个简单命名 openssl 库的系统上不同。我正在尝试自己重建它以进行测试,但这是一件苦差事 - 等待 QT 立即编译。
    【解决方案2】:

    哦,我将这个问题误读为对您自己构建的二进制文件进行故障排除。


    您可以使用ldd your-binary 来检查它将在运行时加载哪些库。

    如果它故意加载不同的版本,您应该检查LD_LIBRARY_PATH 环境和/etc/ld.so.config 中的加载器配置以获取从中加载库的路径列表。或者,加载程序路径可能会使用链接行上的-rpath 开关硬编码到您的二进制文件中 - 在您的 Makefile 中查找这些。

    【讨论】:

    • 对不起,应该在我的问题中添加了 ldd 输出。
    猜你喜欢
    • 2012-10-23
    • 1970-01-01
    • 2020-09-10
    • 2019-11-30
    • 1970-01-01
    • 1970-01-01
    • 2012-03-25
    • 1970-01-01
    • 2020-12-31
    相关资源
    最近更新 更多