我的库 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;唐:你正在让自己承受巨大的痛苦。只是不要这样做。