0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

一文了解Prelink的特點和機理

如意 ? 來源:CSDN ? 作者:CaspianSea ? 2020-06-20 11:54 ? 次閱讀

一、What is Prelink?

1.1 Prelink 簡介

Prelink 是 Red Hat 開發(fā)者 Jakub Jelinek 所設(shè)計的工具。正如其名字所示,Prelink 利用事先鏈接代替運行時鏈接的方法來加速共享庫的加載。它不僅可以加快起動速度,還可以減少部分內(nèi)存開銷,是各種 Linux 架構(gòu)上用于減少程序加載時間、縮短系統(tǒng)啟動時間和加快應(yīng)用程序啟動的很受歡迎的一個工具。

Linux 系統(tǒng)運行時的動態(tài)鏈接尤其是重定位 (Relocation) 的開銷,對于大型系統(tǒng)來說是很大的。相比之下,早期 UNIX 下的 a.out 格式的老式鏈接方法在速度和占用內(nèi)存方面有明顯的優(yōu)勢(但不如ELF格式更靈活,能方便的構(gòu)建動態(tài)共享庫)。Prelink 工具是試圖在保持一部分靈活性的基礎(chǔ)上,借鑒 a.out 格式在速度和占用內(nèi)存方面的優(yōu)點,對 ELF 文件進行一些改進。

Prelink 工具的原理主要基于這樣一個事實:動態(tài)鏈接和加載的過程開銷很大,并且在大多數(shù)的系統(tǒng)上,函數(shù)庫并不會常常被更動,每次程序被執(zhí)行時所進行的鏈接動作都是完全相同的,對于嵌入式系統(tǒng)來說尤其如此。因此,這一過程可以改在運行時之前就可以預(yù)先處理好,即花一些時間利用 Prelink 工具對動態(tài)共享庫和可執(zhí)行文件進行處理,修改這些二進制文件并加入相應(yīng)的重定位等信息,節(jié)約了本來在程序啟動時的比較耗時的查詢函數(shù)地址等工作,這樣可以減少程序啟動的時間,同時也減少了內(nèi)存的耗用。

Prelink 的這種做法當然也有代價:每次更新動態(tài)共享庫時,相關(guān)的可執(zhí)行文件都需要重新執(zhí)行一遍 Prelink 才能保證有效,因為新的共享庫中的符號信息、地址等很可能與原來的已經(jīng)不同了。這種代價對于嵌入式系統(tǒng)的開發(fā)者來說可能稍微帶來一些復雜度,不過好在對用戶來說幾乎是可以忽略的。

很多 Linux 發(fā)行版上已經(jīng)預(yù)裝了或者已經(jīng)使用了 Prelink 工具,不過我們需要適用于嵌入式平臺,比如 ARM 的版本,這樣我們需要到下載 Prelink 的源代碼并重新編譯。

1.2 Prelink 機理

從我們最熟悉的 hello world 程序開始分析:

#include 《stdio.h》

int main(int argc, const char* argv[]) {

printf(“Hello, World!\n”);

return 0;

}

我們知道,printf 是在 c語言運行庫 libc 中定義的。如果不使用動態(tài)庫,也就是使用glibc 的靜態(tài)庫版本,鏈接到 a.out 中的話,那么 printf 函數(shù)的地址在運行之前就是已知的,很簡單的一句地址轉(zhuǎn)移就可以完成了。

可是使用動態(tài)庫的話,在程序編譯階段,我們是無法得知 printf 的函數(shù)地址,因為動態(tài)庫的加載的內(nèi)存地址是隨機的。那么對于動態(tài)庫的情況,針對 printf 是如何尋址的呢?

在程序啟動時,當調(diào)用 printf 的時候,程序會將處理權(quán)交給 loader,由其負責在進程以及其鏈接的動態(tài)庫中查找 printf 的函數(shù)地址。由于 loader 不知道 printf 是在哪個動態(tài)庫,所以它將在整個進程和動態(tài)庫的范圍內(nèi)查找。更糟糕的是在 C++ 程序中,符號的命名是類名+函數(shù)名,這導致在做字符串比較時,往往直到字符串的結(jié)尾才能獲得結(jié)果。

這就導致了,在進程啟動過程中,符號查找往往占據(jù)了大部分時間。據(jù)統(tǒng)計,在 Linux 的 KDE 進程中啟動過程中,符號查找表竟占據(jù)了進程啟動 80% 的時間。有沒有辦法來改進呢?

如果進程在運行前,就能獲知動態(tài)庫的加載地址,那么函數(shù)調(diào)用的地址就應(yīng)該是已知的,我們就可以通過修改執(zhí)行程序,來避免符號的查找。從而節(jié)省進程啟動的時間。

實際上 Prelink 正是這么做的。Prelink 最早是在 Redhat 中引用的,用來加速 KDE 的啟動速度。那時侯 Prelink 作為系統(tǒng)的一個進程,不定期的啟動,對系統(tǒng)中的進程和動態(tài)庫進行優(yōu)化,這在系統(tǒng)中進程和動態(tài)庫不怎么變化的情況下非常有用。

在做 Prelink 時,需要為其指定需要做 Prelink 的進程和動態(tài)庫的目錄。Prelink 需要做以下幾件事情:

分析所有的進程和動態(tài)庫,為每個動態(tài)庫指定一塊唯一的(虛擬)內(nèi)存地址;

分析進程和動態(tài)庫中,所有需要重定位的函數(shù)、全局變量等,用 loader 進行符號查找,對齊地址進行解析;

修改進程中和動態(tài)庫的二進制文件;

眾所周知,在 32 位 Linux 操作系統(tǒng)上有 4G 的地址空間,3G 以上為操作系統(tǒng)使用,0000000~4000000 歸進程的代碼段、數(shù)據(jù)段和堆段使用,從 3G 往下歸棧段使用?;旧衔覀兛梢哉J為從 1G~3G 的地址空間可以用來指定動態(tài)庫的加載地址,地址空間還是很豐富的。

凡事總有萬一,如果地址空間不夠怎么辦呢?Prelink 關(guān)于這個問題,做了兩個約定:

總是一同出現(xiàn)的動態(tài)庫,其動態(tài)庫的加載地址一定不能重疊;

總是不同時間段出現(xiàn)的動態(tài)庫,其動態(tài)庫的加載地址可以重疊;

有了這兩個約定之后,基本上就可以保證,為每個動態(tài)庫指定加載地址,從而在運行前就能獲知函數(shù)和全局變量等符號的地址。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11209

    瀏覽量

    208721
  • Ha-VIS preLink
    +關(guān)注

    關(guān)注

    0

    文章

    2

    瀏覽量

    1565
  • 權(quán)重定位
    +關(guān)注

    關(guān)注

    0

    文章

    2

    瀏覽量

    1280
收藏 人收藏

    評論

    相關(guān)推薦

    了解激光測距傳感器

    來源:SonneWay 編輯:感知芯視界 Link 在工業(yè)自動化中,激光測距傳感器是最常見的傳感器之。不過,您對它真的了解嗎?本文將讓您了解
    的頭像 發(fā)表于 09-09 09:03 ?162次閱讀

    帶你詳細了解工業(yè)電腦

    工業(yè)計算機或電腦專為處理復雜的工業(yè)任務(wù)而設(shè)計和制造。工業(yè)電腦采用工業(yè)級組件和堅固外殼制成,并經(jīng)過嚴格的可靠性測試,在普通臺式計算機無法適應(yīng)的環(huán)境中也能表現(xiàn)出色。工業(yè)電腦的基本特點包括:無通風口和無風
    的頭像 發(fā)表于 06-12 14:24 ?320次閱讀
    <b class='flag-5'>一</b><b class='flag-5'>文</b>帶你詳細<b class='flag-5'>了解</b>工業(yè)電腦

    晶閘管的失效模式與機理

    電路性能下降甚至系統(tǒng)癱瘓。因此,深入了解晶閘管的失效模式與機理,對于提高電路設(shè)計的可靠性具有重要意義。本文將從晶閘管的基本原理出發(fā),詳細探討其失效模式與機理,并結(jié)合相關(guān)數(shù)字和信息進行說明。
    的頭像 發(fā)表于 05-27 15:00 ?983次閱讀

    get面陣工業(yè)相機

    快速了解面陣工業(yè)相機
    的頭像 發(fā)表于 04-17 16:09 ?551次閱讀
    <b class='flag-5'>一</b><b class='flag-5'>文</b>get面陣工業(yè)相機

    電機干貨!了解電機的原理及分類

    了解電機的原理及分類 電機是傳動及控制系統(tǒng)中的重要部分,目前電機應(yīng)用的重點也從過去簡單的傳動向電機的速度、位置、轉(zhuǎn)矩的精確控制轉(zhuǎn)移; 電機為何能夠轉(zhuǎn)動?電機又有哪些分類?不同工作環(huán)境下需要選用
    發(fā)表于 03-12 09:35

    pcb應(yīng)變測試有多重要?了解!

    pcb應(yīng)變測試有多重要?了解
    的頭像 發(fā)表于 02-24 16:26 ?1000次閱讀

    帶您起詳細了解IEEE802.3bt(PoE++)的有關(guān)特點

    Hqst華強盛(盈盛電子)導讀:帶您起詳細了解IEEE802.3bt(PoE++)的有關(guān)特點,讓我們對IEEE802.3bt(PoE++)協(xié)議有更具體的了解
    的頭像 發(fā)表于 01-04 11:26 ?1903次閱讀
    帶您<b class='flag-5'>一</b>起詳細<b class='flag-5'>了解</b>IEEE802.3bt(PoE++)的有關(guān)<b class='flag-5'>特點</b>

    帶你了解 DAC

    了解 DAC
    的頭像 發(fā)表于 12-07 15:10 ?8445次閱讀
    <b class='flag-5'>一</b><b class='flag-5'>文</b>帶你<b class='flag-5'>了解</b> DAC

    了解相控陣天線中的真時延

    了解相控陣天線中的真時延
    的頭像 發(fā)表于 12-06 18:09 ?1796次閱讀

    了解單向晶閘管的結(jié)構(gòu)及導電特性

    了解單向晶閘管的結(jié)構(gòu)及導電特性
    的頭像 發(fā)表于 12-05 15:52 ?1145次閱讀
    <b class='flag-5'>一</b><b class='flag-5'>文</b><b class='flag-5'>了解</b>單向晶閘管的結(jié)構(gòu)及導電特性

    了解剛?cè)峤Y(jié)合制造過程

    了解剛?cè)峤Y(jié)合制造過程
    的頭像 發(fā)表于 12-04 16:22 ?691次閱讀

    繞組磁勢諧波產(chǎn)生的原因和機理

    前幾期文章介紹了整數(shù)槽繞組的磁勢。通過講解我們了解到,繞組的磁勢除了基波外還包括了系列諧波,那么這些諧波磁勢產(chǎn)生的原因是什么?機理如何?這些諧波的大小又與哪些因素有關(guān)?如何才能削弱甚至消除這些諧波呢?接下來的兩期,就把這些問題
    的頭像 發(fā)表于 12-01 14:04 ?1487次閱讀
    繞組磁勢諧波產(chǎn)生的原因和<b class='flag-5'>機理</b>

    為什么血氧監(jiān)測很重要?快速了解它的“奧秘”

    為什么血氧監(jiān)測很重要?快速了解它的“奧秘”
    的頭像 發(fā)表于 11-29 11:46 ?477次閱讀
    為什么血氧監(jiān)測很重要?<b class='flag-5'>一</b><b class='flag-5'>文</b>快速<b class='flag-5'>了解</b>它的“奧秘”

    了解 PCB 的有效導熱系數(shù)

    了解 PCB 的有效導熱系數(shù)
    的頭像 發(fā)表于 11-24 15:48 ?1803次閱讀
    <b class='flag-5'>一</b><b class='flag-5'>文</b><b class='flag-5'>了解</b> PCB 的有效導熱系數(shù)

    了解皮膚電活動測量系統(tǒng)的設(shè)計、開發(fā)與評估

    電子發(fā)燒友網(wǎng)站提供《了解皮膚電活動測量系統(tǒng)的設(shè)計、開發(fā)與評估.pdf》資料免費下載
    發(fā)表于 11-24 10:42 ?0次下載
    <b class='flag-5'>一</b><b class='flag-5'>文</b><b class='flag-5'>了解</b>皮膚電活動測量系統(tǒng)的設(shè)計、開發(fā)與評估