2012-12-07 69 views
50

我有一箇舊的可執行文件,計劃用於廢料堆,但尚未完成。它依賴於已經從我的環境中刪除的一些庫,但我有一些存根庫位於工作正常的地方。我想將這個可執行文件指向這些存根庫。是的,我可以設置LD_LIBRARY_PATH,但是這個可執行文件是從很多腳本中調用的,很多用戶和我很想將它修復到一個地方。我可以在已編譯的二進制文件中更改'rpath'嗎?

我沒有這方面的資料,而且很難得到它。我在想 - 我可以編輯這個文件,使用ELF感知編輯器,並添加一個簡單的路徑到rpath,讓它到達新的庫?這是可能的,或者一旦你創建了一個ELF二進制文件,你將東西修復到位置並且它們不能被移動?

+3

把它包成設置LD_LIBRARY_PATH並調用二進制一個shell腳本。將shell腳本放在調用者PATH中的某個位置。 – wildplasser

+0

LD_LIBRARY_PATH由子進程繼承。你可能不想要那個。 – Will

+1

@是的,我已經說過我不想那樣做。 :) –

回答

52

有一個名爲chrpath的工具可以做到這一點 - 它可能在您的發行包中可用。

+0

很明顯,我不知道這個工具,多虧了 –

+6

只需要注意一下mac用戶,'install_name_tool'可以用'-rpath'標誌來做到這一點 –

+1

如果出現錯誤:':no rpath or runpath標籤found.',你不能用'chrpath'來代替它,但是你可以在這種情況下使用'patchelf':'patchelf --set-rpath/path/to/libaries ' – phyatt

94

還有一種比chrpath更爲通用的工具,叫做patchelf。它最初創建用於製作Nix和NixOS(包裝系統和GNU/Linux發行版)的軟件包。

但如果是二進制(這裏稱爲rdsamp)沒有rpath的,chrpath失敗:

chrpath -r '$ORIGIN/../lib64' rdsamp 
rdsamp: no rpath or runpath tag found. 

在另一方面,

patchelf --set-rpath '$ORIGIN/../lib64' rdsamp 

成功就好了。

+6

特別是'patchelf'是能夠將rpath添加到不包含rpath的二進制文件,但是 - chrpath似乎只能修改已存在的條目。 – maxschlepzig

+2

作爲一般說明,值得理解'rpath'和'runpath'之間的細微區別。基本上,可以重寫'LD_LIBRARY_PATH',其他則不能。有關詳細信息,請參閱http://blog.tremily.us/posts/rpath/ –

+2

令人討厭的是,'chrpath'和'patchelf'對於它們的術語來說都是草率的。例如,除非你還提供'--force-rpath'選項,否則上面顯示的'patchelf'命令將改變'runpath',而不是'rpath'。 –

0

這適用於我,用$ ORIGIN替換XORIGIN。

chrpath -r '\$\ORIGIN/../lib64' httpd

相關問題