十六进制编辑的共享库'Version x.so not found'错误



我的库 A 依赖于外部库 B。当我在 A.so 上使用 ld 时,我看到 B 被链接为 B.so.10,但在我的计算机上链接是:

B.so -> B.so.10

B.so.10 -> B.so.10.5

我试图将一个链接链接到 JUST B.so 并使用符号链接来加载哪个版本。我十六 A.so 编辑并用 B.so 替换了 B.so.10 的所有发现,ld 链接得很好,但是当我尝试 dlopen A.so 时,它说:"加载 A.so 时出错:找不到版本 B.so" 我已经阅读了有关符号版本控制之类的信息,但老实说,我不知道在哪里寻找导致问题的原因?

我检查了 readelf 并将未编辑的版本与我的版本进行了比较,除了 SO 名称之外,我在差异中看不到任何东西。Elfedit也没有工作,只是将二进制文件变成了垃圾数据。

如果你运行readelf -V B.so,你可能会发现它没有定义版本B.so,但确实定义了版本B.so.10

通过将所有B.so.10字符串替换为B.so,您可以向运行时加载程序声明A.so依赖于版本B.so,而不是它过去依赖的版本B.so.10

由于在运行时不存在这样的版本,因此加载程序会正确抱怨。

我检查了 readelf 并将未编辑的版本与我的版本进行了比较,除了 SO 名称之外,我在差异中看不到任何东西。

再次检查。特别是,执行以下操作:

diff <(readelf -V A.so.orig) <(readelf -V A.so)

您应该在那里看到一些差异。

我试图建立一个链接到 JUST B.so 并使用符号链接来加载哪个版本。

您似乎有 XY 问题。你真正想实现的目标是什么?

更新:

最初的问题是我试图让我的软件 CUDA 版本不可知。 我不能把这个二进制文件放在另一个具有不同袖口版本的系统上,因为袖口链接到特定版本,即使 ABI 没有永远改变。

啊,你确实有一个XY问题。

实际上,您无法推断ABI没有更改,除非您验证该ABI中可能使用的每个结构都没有更改(这与验证API未更改不同,您可能这样做了(。

如果您成功修补了版本,最终结果可能是具有不同版本的 CUFFT 的系统发生神秘崩溃。

如果幸运的话,崩溃将迅速且可重复地发生。如果你运气不好,它很少发生,看起来完全神秘和无关,只会在某些系统上发生,只发生在一些客户机器上,只有在你对库进行完全不相关的更改之后,等等。

TL;唐:你正在让自己承受巨大的痛苦。只是不要这样做。

相关内容

最新更新