如何以与具有冲突 SONAME 的库的两个现有版本兼容的方式链接二进制文件?
这两个版本不共享相同的 SONAME 前缀。一个是 libcapi10.so.3,另一个是 libcapi10.so.4。
我无法重新编译它们,因为我将它们作为二进制文件获取,并且由于这些是经过认证的加密库,我无法请求具有正确 SONAME 的新加密库。当然,如果一个是 libcap10.so.3,另一个是 libcap10.so.3.1,我不会遇到任何问题,因为我只需要链接第一个即可与第二个兼容。
这两个库被告知是二进制兼容的(我应该相信这个信息)。
我进行了搜索,但没有找到任何好的方法,无论是使用链接器选项还是使用 objcopy。我想避免手动修补二进制文件以在编译链接时使用它。
回到我最初的问题:如何指定 SONAME(在本例中为 libcap10.so)用于链接?
(我已经搜索过,我目前的发现只是这是不行的,但不幸的是这是一个要求......)。
更新:
我使用类似 sed 的二进制工具修补了 .so 库,将 libcapi10.so.6\0 替换为 libcapi10.so\0,这是有效的,因为新名称比以前的短,并且 SONAME 的 elf 结构是一个以 a 结尾的 C 字符串0 并且 elf 校验和在 gcc 链接期间不使用。我仅在编译时使用该修补库,然后我可以在目标系统上使用相同的二进制文件使用一个或另一个原始库。
patchelf https://www.mankier.com/1/patchelf是你的朋友。你可以这样做:patchelf --replace-needed libcapi10.so.3 libcapi10.so.4 <your_thing>
.
Patchelf 对于许多其他事情也很有用,例如更改 RPATH。查看联机帮助页。非常漂亮的玩具。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)