有没有办法直接更改二进制文件的SONAME?

时间:2013-08-27 13:41:06

标签: linux linker shared-libraries libcurl binaryfiles

我的程序取决于libcurl.so.3,但在RHEL6中没有符号链接libcurl.so.3 ⇾ libcurl.so.4(当我创建此链接时,我的程序可以顺利运行)。但是,有符号链接libcurl.so ⇾ libcurl.so.4

我想将SONAME文件中嵌入的libcurl.so.3.0.0.0修改为libcurl.so.3libcurl.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

2 个答案:

答案 0 :(得分:9)

是的,你可以像这样使用patchelf(来自Readme):

patchelf --set-soname libnewname.so.3.4.5 path/to/libmylibrary.so.1.2.3

答案 1 :(得分:0)

您应该避免删除SO对象的版本,例如,当您的应用程序依赖于特定的libc(libc.so.6)时。

正确的方法是,如果你想使用另一个lib,那就是在调用你的应用程序之前使用LD_PRELOAD变量

如果将LD_PRELOAD设置为新文件的路径,则该文件将在任何其他库(甚至包括C运行库,libc.so)之前加载。