我的程序依賴於libcurl.so.3
,但在RHEL6中沒有像這樣的軟件libcurl.so.3 ->libcurl.so.4
(當我創建這個鏈接時,我的程序可以順利運行)。但是有一個像這樣的軟鏈接:libcurl.so->libcurl.so.4
。有沒有什麼辦法直接改變二進制的SONAME?
我想修改SONAME
的libcurl.so.3.0.0.0
直接從libcurl.so.3
到libcurl.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
你說什麼是* *重命名文件或符號連接,這不是*修改*二進制。 – devnull
您可以創建一個「libcurl.so.4」的副本,將其重命名爲「libcurl.so.3」,並使用十六進制編輯器將SONAME條目從「libcurl.so.4」重命名爲「libcurl.so.3 」。這通常不起作用,因爲版本信息也存在於動態庫中。 –
我認爲最簡單的方法就是重建libcurl並編譯一下構建規則以獲得所需的SONAME。對於發佈後的更改,我不會建議二進制版本。有一個關於修補ELF格式的項目http://nixos.org/patchelf.html,它不允許更改SONAME,但它可以提供關於如何實現這樣的事情的一些想法。 – joetde