【发布时间】:2013-08-30 07:15:39
【问题描述】:
我的程序依赖libcurl.so.3,但是在RHEL6中没有符号链接libcurl.so.3 ⇾ libcurl.so.4(我的程序在创建这个链接时可以顺利运行)。但是,有符号链接libcurl.so ⇾ libcurl.so.4。
我想将嵌入在libcurl.so.3.0.0.0 文件中的SONAME 从libcurl.so.3 修改为libcurl.so,这样我就可以在不创建符号链接的情况下在RHEL 6 上运行我的程序。
我的解决方案可能不是最优的,但我认为学习如何直接修改二进制文件很有价值。
$readelf -d libcurl.so.3.0.0
Dynamic segment at offset 0x303cc contains 25 entries:
Tag Type Name/Value
0x00000001 (NEEDED) Shared library: [libssl.so.2]
0x0000000e (SONAME) Library soname: [libcurl.so.3]
我想把上面的libcurl.so.3改成libcurl.so。
【问题讨论】:
-
您所说的是重命名文件或符号链接,而不是修改二进制文件。
-
您可以创建“libcurl.so.4”的副本,将其重命名为“libcurl.so.3”并使用十六进制编辑器将 SONAME 条目从“libcurl.so.4”重命名到“libcurl.so.3”。这通常不起作用,因为版本信息也存在于动态库中。
-
我认为最简单的方法是重建 libcurl 并修改一些构建规则以获得所需的 SONAME。对于后期构建更改,我不建议使用二进制版本。有一个关于修补 ELF 格式nixos.org/patchelf.html 的项目,它不允许更改 SONAME,但它可以提供一些关于如何实现这样的事情的想法。
标签: linux linker shared-libraries libcurl binaryfiles