假設在linux下,你有一個可執行檔案,其依賴於100個動態庫,而這100個動態庫來自網路中不同的位置,甚至可能來自不同的region,即使網路用的是專用光纖,其網路延遲也不可忽視,那麼在啟動該可執行檔案時發生了什麼:
- 100個rpath
- 100個動態庫
為了載入任意一個動態庫,都需要在這100個rpath逐個尋找,假設其實一一對應,那麼查詢的次數為:1+2+3+...100=5050,在分散式的環境中,這個代價是非常大的(根據網路環境的不同,有的甚至能達到10分鐘以上)。
但其實有個蠻簡單的方法,可以完全消除這些無謂的查詢:
把rpath設為只有一個entry,比如當前目錄,然後把這個可執行檔案所有的dependency,symblink到當前目錄
這個想法簡單,實現起來也可以很簡單:
#!/bin/bash -e test $1 for i in `ldd $1 | grep -o '/[^ ]*'`; do ln -fs $i; done if test $1 != `basename $1`; then cp $1 .; fi patchelf --set-rpath `pwd` `basename $1`
對於Windows,這個方法應該也是試用的,可以起一個runscript,或者叫做bootstrap的bat指令碼,在裡面設定PATH為當前目錄,並就depenency建立link