How to prelink?
1. Prelink 的交叉編譯
1.1 獲取源碼
原版的 prelink 不適用于嵌入式平臺;需要使用 Yocto Project 下的 prelink-cross 版本:
也可以通過 git 獲取最新的源碼:
$ git clone https://git.yoctoproject.org/git/prelink-cross
$ cd prelink-cross
$ git checkout 20151030_cross
注意,需要切換到 cross 分支。
1.2.交叉編譯
prelink 工具類似于 gcc 等工具鏈,如果處理的 ELF 文件所屬系統架構不同于宿主系統架構(也就是當前的操作系統),則需要指定交叉編譯參數。例如,如果目標軟件運行的平臺為 arm,需要將 -target 參數指定為 arm-linux。
此外,還需要加上 –without-sysroot 參數,使得我們編譯出來的 prelink 工具可以在運行時指定 sysroot 路徑。
2. Prelink 的使用詳解
針對目標程序 target_bin 的 prelink 過程如下:
對于上述 prelink 過程所用到的重要參數解釋如下:
–root 選項指定包含目標程序和系統共享庫的 sysroot 路徑,也就是嵌入式系統的根目錄拷貝到宿主操作系統上的路徑;后續所有路徑都可指定為 sysroot 的相對路徑。上述操作中,–root 參數指定的目錄,其層級結構應與板子上根目錄層級結構一致:
–cache-file 參數用于指定prelink 建立索引過程中的 cache 文件;
–config_file 參數用于指定 prelink 的配置文件,默認為 /etc/prelink.conf 。里面是所有需要進行 prelink 的 ELF 文件路徑;如果 prelink 后加 -a 選項,則會處理此文件中所有的目錄或文件;
–ld-library-path 參數用于指定目標可執行文件運行時的共享庫搜索路徑。由于我們需要從 target_bin 開始進行 prelink,因此指定其運行時的 LD_LIBRARY_PATH。
-h 和 -l 參數用于指定對目錄為目錄的軟連接的不同處理方式;加 -h 參數時,會處理軟鏈接文件指向的目標目錄;加 -l 參數時,如果目標目錄跨文件系統,則會忽略。
-b 參數用于添加黑名單,所有用 –b 參數指定的目標都不會處理。
-a 參數表示會處理配置文件中所有添加的路徑或文件。
-m 節省虛擬定址分配;如果有大量的共享庫需要 prelink 就會需要這個選項。
-R 參數會為共享庫選擇隨機的基址;這個是為安全考慮。
-f 強制重新 prelink 已經做過 prelink 的 ELF 文件。prelink 默認會忽略之前已經被 prelink 的 ELF 文件。
-v 參數表示會輸出中間的詳細處理過程。
其他參數的解釋請參考 man 手冊。
單個可執行文件的 prelink 處理時間在秒級,如果對整個系統進行 prelink,可能要花幾分鐘或者十幾分鐘。
這里需要注意,使用 prelink 處理多個可執行文件時,如果每個文件運行時的動態庫搜索路徑不同,建議通過指定 LD_LIBRARY_PATH 來分別處理,而非通過 -a 參數一次性處理,否則可能會 prelink 錯誤的共享庫,導致運行時 prelink 機制并沒能發揮作用。
如果需要取消已經做過 Prelink 的 ELF 文件的,也非常簡單:
1$ prelink -au
警告:在對本機的 ELF 文件進行 prelink 處理過程中,如果被強制中斷,可能會將整個系統弄崩掉。
-
Prelink
+關注
關注
0文章
2瀏覽量
1618
發布評論請先 登錄
相關推薦
評論