2013-08-27 84 views
10

我的程序依赖于libcurl.so.3,但在RHEL6中没有像这样的软件libcurl.so.3 ->libcurl.so.4(当我创建这个链接时,我的程序可以顺利运行)。但是有一个像这样的软链接:libcurl.so->libcurl.so.4有没有什么办法直接改变二进制的SONAME?

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

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

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

$ readelf -d libcurl.so.3.0.0

在偏移0x303cc动态段包含25个条目:

代码类型名称/值

00000001(需要)共用资料库:[的libssl .so.2]

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

+0

你说什么是* *重命名文件或符号连接,这不是*修改*二进制。 – devnull

+1

您可以创建一个“libcurl.so.4”的副本,将其重命名为“libcurl.so.3”,并使用十六进制编辑器将SONAME条目从“libcurl.so.4”重命名为“libcurl.so.3 ”。这通常不起作用,因为版本信息也存在于动态库中。 –

+0

我认为最简单的方法就是重建libcurl并编译一下构建规则以获得所需的SONAME。对于发布后的更改,我不会建议二进制版本。有一个关于修补ELF格式的项目http://nixos.org/patchelf.html,它不允许更改SONAME,但它可以提供关于如何实现这样的事情的一些想法。 – joetde

回答

0

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

正确的方式做到这一点,如果你想如果你设置LD_PRELOAD新文件的路径,使用其他的lib使用LD_PRELOAD变量调用应用程序

之前,该文件将之前的任何加载其他库(甚至包括C运行库,libc.so)。

2

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

patchelf --set-soname libnewname.so.3.4.5 path/to/libmylibrary.so.1.2.3 
相关问题