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

use*_*786 11 linux linker binaryfiles shared-libraries libcurl

我的程序依赖于libcurl.so.3,但在RHEL6中,没有像这样的软件libcurl.so.3 ? libcurl.so.4(当我创建此链接时,我的程序可以顺利运行).但是有这样一个软链接:libcurl.so ? libcurl.so.4.

我想修改SONAMElibcurl.so.3.0.0.0直接libcurl.so.3libcurl.so.然后我可以在RHEL 6上运行我的程序,而无需自己创建软链接.

也许我的解决方案很愚蠢,但我认为学习如何直接修改二进制文件是一件有趣的事情.

Tahnk你的评论,devnull.也许我没说清楚.

$ readelf -d libcurl.so.3.0.0

偏移量0x303cc处的动态段包含25个条目:

标签类型名称/值

0x00000001(NEEDED)共享库:[libssl.so.2]

0x0000000e(SONAME)库soname:[ libcurl.so.3 ] --->我想将此更改为libcurl.so

Tim*_*mmm 10

是的,您可以像这样使用patchelf(来自其自述文件):

patchelf --set-soname libnewname.so.3.4.5 path/to/libmylibrary.so.1.2.3
Run Code Online (Sandbox Code Playgroud)


Bre*_*tão 1

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

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

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