【问题标题】:forcing linking with a different SONAME than this of library强制使用与库不同的 SONAME 链接
【发布时间】:2013-01-30 18:28:53
【问题描述】:

如何以与具有冲突 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 结构是一个以0 并且在 gcc 链接期间不使用 elf 校验和。我只在编译时使用了那个补丁库,然后我可以在我的目标系统上使用相同的二进制文件中的一个或另一个原始库。

【问题讨论】:

  • 自我评论:相关问题stackoverflow.com/questions/2759254/…
  • libcapi10.so.3libcapi10.so.4 是否具有相同的 SO_NAME?您是希望将可执行文件同时链接到两个库,还是希望它只选择其中一个库(如果存在且运行时)?
  • libcapi10.so.3 和 libcapi10.so.4 是 SONAME,文件是 libcapi10.so.3.6.1... 可执行文件应该与第一个或第二个一起运行,两者都不能在系统上正常安装,如果是这种情况(黑客),那么将使用在 libcapi10.so 上使用 ldconfig 创建的符号链接。

标签: c linux linker shared-libraries dynamic-linking


【解决方案1】:

patchelf 是你的朋友。你可以这样做:patchelf --replace-needed libcapi10.so.3 libcapi10.so.4 <your_thing>

Patchelf 对于其他各种事情也很有用,例如更改 RPATH。查看手册页。非常漂亮的玩具。

【讨论】:

    【解决方案2】:

    我目前的最佳答案可以满足我的需求。

    我使用类似 sed 的二进制工具修补了 .so 库,将 libcapi10.so.6\0 替换为 libcapi10.so\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?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-03
      • 2011-05-24
      相关资源
      最近更新 更多