链接脚本lds 相关的知识
鏈接腳本lds相關(guān)的知識
目錄
- 鏈接腳本lds相關(guān)的知識
- 前言
- 關(guān)于vmlinux.lds目標的生成與構(gòu)建
- 關(guān)于鏈接腳本的語法
- sections 輸出段
- 關(guān)于vmlinux.lds鏈接腳本的解讀
- 參考資料
前言
本文主要記錄與鏈接腳本相關(guān)的知識。文中內(nèi)容多來自網(wǎng)上資料,或者書本內(nèi)容。(解讀的除外)。把重要的、常用的或容易忘記的知識點總結(jié)記錄下來,供以后查詢與鞏固。
關(guān)于vmlinux.lds目標的生成與構(gòu)建
-
未經(jīng)編譯的內(nèi)核源碼是不存在vmlinux.lds鏈接腳本的,在arch/arm/kernel目錄只有vmlinux.lds.S文件,以及在include/asm-generi目錄有一個與之關(guān)聯(lián)的vmlinux.lds.h文件。在內(nèi)核編譯的時候會根據(jù)一些宏定義和傳入的參數(shù)構(gòu)建出針對特定平臺、特定架構(gòu)的vmlinux.lds鏈接腳本。
-
鏈接器在鏈接過程中需要使用鏈接腳本。如果沒有通過 “-T” 參數(shù)指定鏈接腳本時,鏈接器會使用內(nèi)置的鏈接腳本。
-
鏈接腳本中有幾種設(shè)置入口點的方法,請參考鏈接腳本說明手冊。鏈接器將按順序嘗試以下每一種方法來設(shè)置入口點,當其中一種方法成功時停止:
1、 -e 命令行選項
2 、腳本中的entry(symbol)命令
3 、如定義了start的值,取其值為入口點
4 、text段的第一個字節(jié)的地址
5 、地址0
關(guān)于鏈接腳本的語法
- 在鏈接腳本中,符號可以像高級語言比如C語言一樣進行賦值和操作,允許的操作包括賦值、加減乘除、左移、右移、與、或等
- foo = 0x100 鏈接腳本定義一個foo符號并賦值,0x100 表示地址的位置。對于符號foo并沒有分配任何內(nèi)存。
- 在C語言中,符號可以通過"&"來獲取符號的址,也可以將符號理解為數(shù)組在C語言中使用(具體怎么使用要看鏈接腳本中怎么定義)
例如
在C語言中,使用以下代碼可以很方便地訪問這些段的起始地址和結(jié)束地址。
extern char start_of_text[]; extern char end_of_text[]; extern char start_of_data[]; extern char end_of_data[];- “.” 代表的是當前計數(shù)器(Location Counter, LC)
上面注意注釋的地方:從4字節(jié)對齊的設(shè)置方法
- HIDDEN 語法HIDDEN(symbol = expression)為ELF目標的端口定義一個符號,符號將被隱藏并且不會被導出
在本例中,這三個符號在此模塊之外都不可見
- PROVIDE 當程序文件(.c , .h , .S中) 沒有定義變量,函數(shù),但卻引用(extern )了,這時才會用到鏈接腳本中的符號變量。 有點類似gcc 中的__weak 關(guān)鍵字定義的函數(shù)。
例如
在本例中,如果程序定義了’ _etext ‘(帶有前導下劃線),鏈接器將給出重復定義錯誤。另一方面,如果程序定義了’ etext ‘(沒有前導下劃線),鏈接器會默認使用程序中的定義。如果程序引用了’ etext '但沒有定義它,鏈接器將使用鏈接器腳本中的定義。
sections 輸出段
輸出段的描述格式如下:
section [address] [(type)]:[AT(lma)][ALIGN(section_align)][constraint]{output-section-commandoutput-section-command...} [>region] [AT>lma_region] [:phdr :phdr ...] [=fillexp]section : 段的名字,輸出段的描述,例如代碼(.data)段、數(shù)據(jù)(.data)段等
address : 輸出段虛擬內(nèi)存地址。這個是可選參數(shù)。
AT[lam] lma 表示加載地址
region: 特定的內(nèi)存區(qū)域
加載地址由 AT 或 AT> 關(guān)鍵字指定 AT 關(guān)鍵字經(jīng)常出現(xiàn)在lds中
可以使用’=fillexp’為整個段設(shè)置填充模板。fillexp是一個表達式(參考Expressions)。任何其它的未被特殊指定的輸出段的內(nèi)存區(qū)域(例如,因為對其輸入段產(chǎn)生的縫隙)將會被用fillexp的值填充
關(guān)于vmlinux.lds鏈接腳本的解讀
待完成,后面有機會找個時間再完成。
參考資料
1.官方文檔 https://sourceware.org/binutils/docs/ld/
2.https://blog.csdn.net/m0_47799526/article/details/108765403
3.https://blog.csdn.net/m0_47799526/article/details/106205109
4.https://zhuanlan.zhihu.com/p/521964756
總結(jié)
以上是生活随笔為你收集整理的链接脚本lds 相关的知识的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: autojs教程:完善找图函数,图片内随
- 下一篇: 小程序需要买ssl数字证书吗