一種可能性是加載,你需要成爲一個「私人」位置的輔助庫,然後改變的頭您的程序來搜索該位置。
模仿你的目標環境
- 在自己的機器上安裝一個虛擬機運行相同的CentOS的建設作爲託管公司。這意味着相同的CentOS版本和相同的CPU架構。 (
cat /etc/*-release
應該給你一個信息; uname -a
會給你另一個信息,具體來說,你要確保你有一個類似/相同的C庫版本; /lib/libc.so.?
應該是可執行的,並給你一些關於正在使用的C庫的細節)
- 在虛擬主機上使用YUM安裝必需的軟件包。
- 確保您的二進制可執行文件有效。
弄清楚什麼目標環境中缺少
運行ldd /usr/bin/your-app
獲取庫列表它所指。 具體來說,要清理該列表: ldd/usr/bin/your-app | cut -d'('-f 1 | cut -d'>'-f 2 | sed -e's,[\ t] ,, g'| sort | uniq> my-required-libs
Log到遠程服務器並複製文件;然後運行類似:
#/ bin/sh的
失蹤庫 在$ LIB(<我要求的函數庫), 做 if [-f「$ lib」] then echo「OK $ lib」 else echo「NO $ lib」 回聲「$ LIB」 >>失蹤庫 網絡 做
複製missing-libs
回到你的虛擬主機和一mkdir
例如命名的文件夾~/my-app/lib
;然後cp $(<missing-libs) /home/myself/my-app/lib
注意,你將需要建立共享的主機上,確切路徑,包括用戶名等等 - 所以如果共享主機上的可寫目錄是/home/myself
確保該目錄也位於虛擬主機上的/home/myself
之下。
改變可執行文件的RPATH指向您的備選庫的位置
找到你的應用程序的可執行文件,並改變使用chrpath
其頭文件(你可能會需要yum install chrpath
在你的虛擬機,因爲這是一個不尋常的程序需要):
chrpath --list在/ usr/bin中/你的應用程序內
如果報告任何現有RPATH,那麼你要預先考慮的路徑〜/我的應用程序內/ lib目錄到RP ATH與:
- 例如如果chrpath --list
顯示/usr/lib/my-app/plugins
,則可以使用/home/myself/my-app/lib:/usr/lib/my-app/plugins
。在更常見的情況下,只需使用--replace
以及複製必備庫的目錄名稱即可。
chrpath --replace〜/我的應用程序內/ lib目錄的/ usr/bin中/你的應用程序內
現在,複製可執行文件與新的RPATH和目錄十足的證明庫與您共享主機。
這對於多用戶共享主機設置來說都是「友好的」,而不像其他解決方案使用的是其他解決方案。 chroot
監獄。
或者,創建一個LD_LIBRARY_PATH包裝
如果chrpath
不適合您的設置工作(例如極其嚴格的SELinux上下文),你可以跳過chrpath
一步,而不是做這樣的事情:
mv ~/my-app/bin/my-app ~/my-app/bin/my-app.real
,並進行包裝腳本像
#!/bin/sh
export LD_LIBRARY_PATH=/home/myself/my-app/lib
exec /home/myself/my-app/bin/my-app.real
...以及與此替換原來的二進制文件的名稱腳本。
注意,在理論上,你幾乎可以代替任何圖書館這樣,但是當庫需要在特定地點的數據文件(例如/etc
)或動態調用的系統位置的子庫(如/usr/lib64
),你可能會面臨不得不在他們的./configure
腳本中用新路徑重新編譯它們,或者編輯它們的源代碼,除了最極端的情況外,它們可能都不值得付出努力。
EG:以這種方式不友好重新定位的東西:libc
和可插入認證模塊。
我已經使用虛擬機了好幾年了,即使這樣,它也只是VMWare(簡稱)和Virtualbox。虛擬機不會使用一堆資源嗎?可能有一些我不知道的虛擬機解決方案。我正在考慮像[docker](https://www.docker.io/)這樣的東西,但它似乎也需要sudo。你爲什麼說'chroot'會對這個不友好(除了它需要sudo,所以它不會工作)? – user137369
我成功地使用了這個解決方案的一個變種,這真的幫助我達到了這個目標。謝謝 – user137369
對不起,說明一下,假設你沒有可用於模擬系統的備用機器,虛擬機在你的本地機器上是暫時的。而且,是的,'sudo'就是爲什麼'chroot'在這裏很難使用,以及需要扭曲來從監獄外部運行'chroot'ed app – BRFennPocock