【问题标题】:How to call the function of particular library version if we have 2 versions of same library?如果我们有同一个库的两个版本,如何调用特定库版本的函数?
【发布时间】:2022-01-23 21:22:59
【问题描述】:

在我的项目中链接了两个版本的 libssl(1.0.2k 和 1.1.1i)。不能删除任何一个,因为 libcurl、libunbound 等其他库依赖于 libssl1.0.2k。

所以我已经在我的进程中链接了两个库版本,但是当我调用某个函数时,它是从 libssl1.0.2k 而不是从 libssl1.1.1i 调用的。 由于库版本不匹配导致段错误。

#0  0x00007f6104ac5696 in ssl_cert_set1_chain () from /lib64/libssl.so.10
#1  0x00007f610550fe6a in ERR_peek_error () from /opt/runtime/current/lib/libcrypto.so.1.1
#2  0x00007f61058e8f70 in SSL_CTX_use_certificate_chain_file () from /opt/runtime/current/lib/libssl.so.1.1
#3  0x0000000003a6699b in evhtp_ssl_init ()

如何解决这个崩溃?

【问题讨论】:

  • 执行时设置LD_LIBRARY_PATH
  • 如何加载/链接这些库?
  • 在 CentOS/RHEL 中,openssl 使用版本化符号,所以如果可以在这里应用,我希望这样的事情能让你摆脱困境。它将导致您使用的所有符号绑定到 1.1 版本的 openssl,而其他库将绑定到 openssl 的通用符号版本(希望)
  • @stark ,我尝试设置 LD_LIBRARY_PATH 但没有帮助。
  • @MarekR,我链接如下 $(THIRDPTYBIN_DIR)/lib/libssl.so.1.1 $(THIRDPTYBIN_DIR)/lib/libcrypto.so.1.1 \ $(THIRDPTYBIN_DIR)/libevent/ix64 /lib/libevent.so \ $(THIRDPTYBIN_DIR)/libevent/ix64/lib/libevent_openssl.so \ $(THIRDPTYBIN_DIR)/libevent/ix64/lib/libevent_core.so \ $(THIRDPTYBIN_DIR)/libevhtp/ix64/libevhtp.a \ -lssl -lcrypto -lunbound -lexpat -lgmp \

标签: c++ linux gcc makefile shared-libraries


【解决方案1】:

如果我们有两个版本的同一个库,如何调用特定库版本的函数?

从给定库中调用函数很简单:使用dlopen()dlsym(),但这是最少的问题。

在我的项目中链接了两个版本的 libssl(1.0.2k 和 1.1.1i)。

这是你的问题。 无论你尝试什么,这个都行不通1。您的程序很可能会SIGSEGV

不能删除任何一个,因为libcurl、libunbound等其他库依赖于libssl1.0.2k

要获得一个健全的执行环境,您必须安排一组一致的库——要么全部依赖libssl-1.0.2k,要么全部依赖libssl-1.1.1i .

您列出的所有库都是开源的,最好的解决方案(如果您找不到任何您想要的 libssl 版本的预构建库)是重建它们。


1 一种可能的解决方法是使用 dlmopen 并将依赖于 libssl-1.0.2k 的库与依赖于 libssl-1.1.1i 的库放在一个单独的链接器命名空间中。

这是推荐的——你真的需要知道你在做什么,而且调试你的程序会更加困难。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多