19

我的程序依赖libcurl.so.3,但是在 RHEL6 中没有符号链接libcurl.so.3 ⇾ libcurl.so.4(我的程序在创建这个链接时可以顺利运行)。但是,有符号链接libcurl.so ⇾ libcurl.so.4

我想将SONAME嵌入libcurl.so.3.0.0.0文件从libcurl.so.3to修改,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.

4

2 回答 2

22

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

patchelf --set-soname libnewname.so.3.4.5 path/to/libmylibrary.so.1.2.3
于 2018-01-15T14:01:21.580 回答
1

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

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

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

于 2014-11-06T19:09:25.590 回答