msodbcsql 在 LD_LIBRARY_PATH 之外搜索并加载 libssl

问题描述 投票:0回答:1

我正在开发 Linux/C++ 应用程序,我想使用 Microsoft ODBC 驱动程序 (

libmsodbcsql.so
)

启动时,我的应用程序由于与 libssl 冲突而崩溃。经过调查,我意识到:

  • 我的应用程序加载
    libssl.so.1.0.0
    ;这是完全正常的:
    • 因为我的应用程序的一些第三方一直依赖它
    • 总的来说,
      libssl.so.1.0.0
      在我的
      LD_LIBRARY_PATH
  • 我的应用程序也加载
    libssl.so.1.1
    ...可以说远不那么完全正常
    • libssl.so.1.1
      根本不属于我的
      LD_LIBRARY_PATH

我在Microsoft ODBC编程指南

上找到了部分解释

从版本 17.4 开始,驱动程序动态加载 OpenSSL,这使得它可以在版本 1.0 或 1.1 的系统上运行,而无需单独的驱动程序文件。从版本 17.9 开始,驱动程序除了以前的版本之外还支持 OpenSSL 3.0。 当存在多个版本的 OpenSSL 时,驱动程序将尝试加载最新版本

...

如果使用驱动程序(或其组件之一)的应用程序链接或动态加载不同版本的 OpenSSL,则

可能会发生潜在冲突。如果系统上存在多个版本的 OpenSSL 并且应用程序使用它,强烈建议您格外小心,确保应用程序加载的版本和驱动程序不会不匹配,因为这些错误可能会损坏内存,从而导致不一定会以明显或一致的方式表现出来。

使用

strace
,我可以看到驱动程序搜索所有Linux系统,找到最近安装的libssl,而不关心
LD_LIBRARY_PATH
中指定的内容!!!

我现在正在寻找绕过此机制的正确方法?这可能是:

  • 做一些事情(我不知道为什么),这样我的程序就看不到
    libssl.so.1.1
    -...

当然我不想通过删除

libssl.so.1.1
来改变我的系统(和任何客户端系统)

感谢您的帮助

mysql linux openssl odbc shared-libraries
1个回答
0
投票

我的应用程序加载

libssl.so.1.0.0
我的应用程序也加载了
libssl.so.1.1

行不通(正如您所发现的)。您已将您的应用程序与“不兼容”库链接。要解决此问题,您必须链接到一组兼容库(即所有依赖项必须依赖于任一libssl.so.1.0.0

libssl.so.1.1)。

LD_LIBRARY_PATH

之外

LD_LIBRARY_PATH

可能会改变加载程序查找库的

位置,但它不会
改变正在搜索的库。让加载程序找不到 libssl.so.1.1 不会为您解决任何问题 - 加载程序只会失败并出现 libssl.so.1.1 not found 错误。
    

© www.soinside.com 2019 - 2024. All rights reserved.