1.1. 地址無(wú)關(guān)代碼
需要被 Prelink 的 ELF 文件,無(wú)論是共享庫(kù)還是可執(zhí)行文件,編譯時(shí)必須加 -fpic/-fPIC 參數(shù),生成目標(biāo)無(wú)關(guān)地址代碼。對(duì)于可執(zhí)行文件,不能使用 -fpie/-fPIE 加 –pie 生成地址無(wú)關(guān)可執(zhí)行文件,否則無(wú)法被 prelink。
這個(gè)結(jié)論是根據(jù)上述測(cè)試程序得出的,其中的詳細(xì)機(jī)理有待進(jìn)一步研究。
1.2. 檢查Prelink 狀態(tài)
可以使用 readelf 和 objdump 工具來(lái)檢查一個(gè) ELF 文件是否已經(jīng)被 prelink。例如:
注意觀察到 6~14 行,對(duì)比沒(méi)有被 prelink 之前的狀態(tài),INIT、FINI、STRTAB、SYMTAB 等 section 的地址已經(jīng)修改為運(yùn)行時(shí)進(jìn)程空間的虛擬內(nèi)存地址。第 30 行,RELACOUNT 表示已經(jīng)預(yù)先進(jìn)行重定位的符號(hào)的數(shù)量;第 31 行是 prelink 根據(jù) ELF 所直接依賴的共享庫(kù)計(jì)算的 MD5 值,該值用于判斷該 ELF 所以來(lái)的共享庫(kù)是否被修改過(guò);從第 32 行可以看出該 ELF 已被加上 PRELINKED 標(biāo)記和時(shí)間戳。
但是,并非所有被成功 prelink 的 ELF 文件都會(huì)加上 PRELINKED 的標(biāo)記和時(shí)間戳。在用 prelink 處理完我們的SDK的后,發(fā)現(xiàn) target_bin 所有的依賴項(xiàng)都有 PRELINKED 標(biāo)記,target_bin 自身并沒(méi)有此標(biāo)記。但是通過(guò)測(cè)試其啟動(dòng)速度,確有巨大的提升,證明 prelink 在 target_bin 上確實(shí)發(fā)揮了作用。
至于為什么沒(méi)有這個(gè)標(biāo)記,暫時(shí)還沒(méi)有調(diào)查清楚,仍待進(jìn)一步研究。
對(duì)于上述情況,通過(guò) objdump 等工具查看ELF文件的 section header,我們?nèi)匀豢梢园l(fā)現(xiàn) prelink 處理后留下的蛛絲馬跡。
Prelink 之前,查看 target_bin 的節(jié)頭:
Prelink 之后,再次查看節(jié)頭:
對(duì)比 prelink 前后的節(jié)頭信息,我們發(fā)現(xiàn) prelink 后每個(gè)節(jié)的地址都有了調(diào)整,增加了.gnu.liblist , .gnu.conflict 和 .gnu.prelink_undo 這三個(gè)節(jié)。同時(shí) .dynstr 節(jié)的 size 由 0xa3cb1 增加到了 0xa3e8c。這些都是 prelink 之后 ELF 的 size 有所增大的原因。
1.3. 查看ELF依賴樹
Prelink 的處理過(guò)程是從目標(biāo) ELF 文件開始,檢查其依賴樹。從葉子節(jié)點(diǎn)開始處理,自底向上,直至根節(jié)點(diǎn)。若中間任何節(jié)點(diǎn)處理異常,則目標(biāo)文件都無(wú)法被 prelink。同理,如果已經(jīng)被 prelink 處理的 ELF 文件,如果其依賴樹的中任何節(jié)點(diǎn)對(duì)應(yīng)的 ELF 文件有更改,則需要從根開始重新 prelink。如果被更改的 ELF 所處的層級(jí)較低,被很多可執(zhí)行文件依賴,則可能整個(gè)系統(tǒng)的 ELF 都需要重新進(jìn)行 Prelink 處理。
可以使用 lddtree 查看 ELF 文件的依賴樹。但是這個(gè)工具比較雞肋,只適用于處理本機(jī)的 ELF 文件,無(wú)法像 prelink 一樣可以在運(yùn)行時(shí)指定 sysroot 和 LD_LIBRARY_PATH。
1.4. 不必要的依賴項(xiàng)
如果 prelink 在處理某個(gè) ELF 文件(記為 A)的過(guò)程中,發(fā)現(xiàn) A 并沒(méi)有使用其直接依賴的另一個(gè) ELF 文件(記為 B),而 A 又通過(guò) C 間接依賴到 B,并且 B 已經(jīng)被 prelink 處理。此時(shí),A 將無(wú)法被 prelink。
1.5. 動(dòng)態(tài)加載的共享庫(kù)
Prelink 對(duì)于通過(guò) dlopen 方式打開的共享庫(kù)沒(méi)有效果。
-
編譯
+關(guān)注
關(guān)注
0文章
647瀏覽量
32746 -
Prelink
+關(guān)注
關(guān)注
0文章
2瀏覽量
1617
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論