2013-08-27 78 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 
相關問題