如何以一种方式链接二进制文件以兼容具有冲突SONAME的两个现有版本的库? 这两个版本不共享相同的SONAME前缀。一个是libcapi10.so.3,另一个是libcapi10.so.4。 我无法重新编译它们,因为我将它们作为二进制文件,并且由于这些是经过认证的加密库,因此我无法使用正确的SONAME请求新的加密库。当然我不会遇到任何问题,如果一个是libcap10.so.3和另一个libcap10.so.3.1,因为我只需要链接第一个与第二个兼容。 这两个库被告知是二进制兼容的(我应该相信这个信息)。 我搜索但没有找到任何好的方法,使用链接器选项或使用objcopy。我想避免手动修补二进制文件,以便在编译链接时使用它。
回到我最初的问题:如何指定用于链接的SONAME(在本例中为libcap10.so)?
(我已经搜索过了,我目前的调查结果只是说它不行,但不幸的是这是一个要求......)。
更新: 我使用二进制类似sed的工具修补.so库,用libcapi10.so \ 0替换libcapi10.so.6 \ 0,因为新名称比之前更短,所以有效,SONAME的elf结构是一个以字符串结尾的C字符串0并且在gcc链接期间不使用该elf校验和。我只在编译时使用了这个修补过的库,然后我可以使用相同的二进制文件在我的目标系统上使用一个或另一个原始库。
答案 0 :(得分:4)
patchelf
是你的朋友。您可以执行以下操作:patchelf --replace-needed libcapi10.so.3 libcapi10.so.4 <your_thing>
。
Patchelf也适用于各种其他事情,例如改变RPATH。查看联机帮助页。非常漂亮的玩具。
答案 1 :(得分:0)
我目前最好的答案是满足我的需要。
我使用类似二进制sed的工具修补了.so库,用libcapi10.so \ 0替换了libcapi10.so.6 \ 0,因为新名称比之前更短,并且SONAME的elf结构是C字符串,所以有效以0结束,并且在gcc链接期间不使用elf校验和。我只在编译时使用了这个修补过的库,然后我可以使用相同的二进制文件在我的目标系统上使用一个或另一个原始库。
stackverflow中的最佳提示: How can I change the filename of a shared library after building a program that depends on it?