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

什么是交叉編譯?為什么要交叉編譯
QT/E和Qtopia的編譯詳解
交叉編譯linux內(nèi)核(raspberry_3.6.y)
嵌入式交叉編譯環(huán)境的搭建解析
arm-linux的交叉編譯環(huán)境解析
Xilinx交叉編譯鏈的安裝步驟和驗(yàn)證
ST微電子STM8的C交叉編譯用戶指南

一文了解Prelink的注意事項(xiàng)

評(píng)論