六进制编辑的共享库 "未找到x.so版本 "错误

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

当我在A.so上使用ld时,我看到B被链接为B.so.10,但在我的电脑上,链接是。

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

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

我试图让A链接到只是B.so,并使用符号链接加载什么版本。我对A.so进行了十六进制编辑,并将B.so.10的所有发现都替换为B.so,ld链接就很好,但当我尝试dlopen A.so时,它说:"Error loading A.so. Version B.so not found。B.so版本未找到",我读过关于符号版本之类的东西,但老实说,我不知道该从哪里寻找导致这个问题的原因?

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

linux hex shared-libraries elf dlopen
1个回答
1
投票

如果你运行 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)

看到一些差异有。

我试图使A链接到JUST B.so,并使用符号链接加载什么版本。

你似乎有一个 XY问题. 你在干什么?真的 努力实现?

更新。

最初的问题是我想让我的软件CUDA版本不可知... ... 我不能把这个二进制文件放到另一个不同的cufft版本的系统上,因为cufft链接到一个特定的版本,即使ABI一直没有改变。

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

不能 事实上推断 ABI 没有改变,除非您确认 每一 潜在的结构 ABI 没有改变(这不同于验证 API 并没有改变,而你很可能是这么做的)。)

如果你成功打出了版本补丁,最终的结果很可能是在使用不同版本的CUFFT的系统上发生神秘的崩溃。

如果你很幸运,崩溃会很快发生,而且可以重现。如果你不走运,它将很少发生,而且看起来完全神秘和无关,只会发生在某些系统上,只会发生在某些客户的机器上,只会发生在你对你的库做了完全无关的修改之后,等等等等。

TL;DR:你正在为自己设置重大的痛苦。只是不要这样做。

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