gpt4 book ai didi

linux - 检测加载到单个程序中的我的共享库的两个 ABI 不兼容版本

转载 作者:IT王子 更新时间:2023-10-29 00:55:00 26 4
gpt4 key购买 nike

我写了一个有几个不兼容版本的共享库。我更改了 SONAME,因此它们被称为:

  • lib_mylib.so.1.0.0(旧库)
  • lib_mylib.so.2.0.0

有些函数只在mylib.so.1中,有些只在mylib.so.2中,很多函数是通用的(但有几个改变了参数的数量)

我担心可以将两个版本的 mylib 链接到单个应用程序中,例如当应用程序本身很大并且包含许多库时。当应用程序被部分重建时,会出现这样的情况:

  • 申请
  • app_lib1.so(使用 mylib.so.1 构建——我的库的第一个版本)
  • app_lib2.so(用 mylib.so.2 重建——第二个版本)

我已经看到加载了两个版本的应用程序(ldd 报告了这两个版本)。

那么,是否可以向 mylib.so.2 添加一些检查代码来检测是否已经加载了两个版本的库并且它们具有冲突的 ABI/接口(interface)。 (我无法修改 lib_mylib.so.1 以向其中添加内容)

最佳答案

您可以修改您的版本 2 库以在初始化期间解析某些特定于版本 1 的符号 (dlsym(3)),并在找到时崩溃。

例子:

extern __attribute__((constructor)) void _version_check2()
{
if (dlsym(RTLD_DEFAULT, "version_1_function"))
abort();
}

一个更优雅的解决方案是让版本 2 库模仿版本 1 的行为,但这会引入遗留代码。

编辑

为了面向 future ,您还可以引入一个静态版本变量,所有函数调用都会检查它是否与当前版本匹配。然后在未来的版本中,您只需要更改该变量的值并在不匹配时崩溃。

编辑 2

您还可以在每个 版本 2 函数上调用此函数,这样当加载版本 1 时您的应用迟早会崩溃。

关于linux - 检测加载到单个程序中的我的共享库的两个 ABI 不兼容版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19166428/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com