日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

链接脚本lds 相关的知识

發布時間:2023/12/15 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 链接脚本lds 相关的知识 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

鏈接腳本lds相關的知識

目錄

  • 鏈接腳本lds相關的知識
    • 前言
    • 關于vmlinux.lds目標的生成與構建
    • 關于鏈接腳本的語法
      • sections 輸出段
    • 關于vmlinux.lds鏈接腳本的解讀
    • 參考資料

前言

本文主要記錄與鏈接腳本相關的知識。文中內容多來自網上資料,或者書本內容。(解讀的除外)。把重要的、常用的或容易忘記的知識點總結記錄下來,供以后查詢與鞏固。

關于vmlinux.lds目標的生成與構建

  • 未經編譯的內核源碼是不存在vmlinux.lds鏈接腳本的,在arch/arm/kernel目錄只有vmlinux.lds.S文件,以及在include/asm-generi目錄有一個與之關聯的vmlinux.lds.h文件。在內核編譯的時候會根據一些宏定義和傳入的參數構建出針對特定平臺、特定架構的vmlinux.lds鏈接腳本。

  • 鏈接器在鏈接過程中需要使用鏈接腳本。如果沒有通過 “-T” 參數指定鏈接腳本時,鏈接器會使用內置的鏈接腳本。

  • 鏈接腳本中有幾種設置入口點的方法,請參考鏈接腳本說明手冊。鏈接器將按順序嘗試以下每一種方法來設置入口點,當其中一種方法成功時停止:

1、 -e 命令行選項
2 、腳本中的entry(symbol)命令
3 、如定義了start的值,取其值為入口點
4 、text段的第一個字節的地址
5 、地址0

關于鏈接腳本的語法

  • 在鏈接腳本中,符號可以像高級語言比如C語言一樣進行賦值和操作,允許的操作包括賦值、加減乘除、左移、右移、與、或等
  • foo = 0x100 鏈接腳本定義一個foo符號并賦值,0x100 表示地址的位置。對于符號foo并沒有分配任何內存。
  • 在C語言中,符號可以通過"&"來獲取符號的址,也可以將符號理解為數組在C語言中使用(具體怎么使用要看鏈接腳本中怎么定義)
    例如
SECTIONS {start_of_text = . ;.text: {*(.text)}end_of_text = . ;start_of_data = . ;.data: {*(.data)}end_of_data = . ; }

在C語言中,使用以下代碼可以很方便地訪問這些段的起始地址和結束地址。

extern char start_of_text[]; extern char end_of_text[]; extern char start_of_data[]; extern char end_of_data[];
  • “.” 代表的是當前計數器(Location Counter, LC)
SECTIONS {.text :{*(.text)_etext = .;}/*設置_bdata 的起始地址為當前位置后下一個與4字節對齊的地方。*/_bdata = (. + 3 ) & ~ 3; .data:( *(.data) ) }

上面注意注釋的地方:從4字節對齊的設置方法

  • HIDDEN 語法HIDDEN(symbol = expression)為ELF目標的端口定義一個符號,符號將被隱藏并且不會被導出
HIDDEN(floating_point = 0); SECTIONS {.text :{*(.text)HIDDEN(_etext = .);}HIDDEN(_bdata = (. + 3) & ~ 3);.data : { *(.data) } }

在本例中,這三個符號在此模塊之外都不可見

  • PROVIDE 當程序文件(.c , .h , .S中) 沒有定義變量,函數,但卻引用(extern )了,這時才會用到鏈接腳本中的符號變量。 有點類似gcc 中的__weak 關鍵字定義的函數。
    例如
SECTIONS {.text :{*(.text)_etext = .;PROVIDE(etext = .);} }

在本例中,如果程序定義了’ _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)段、數據(.data)段等
address : 輸出段虛擬內存地址。這個是可選參數。
AT[lam] lma 表示加載地址
region: 特定的內存區域

加載地址由 AT 或 AT> 關鍵字指定 AT 關鍵字經常出現在lds中

可以使用’=fillexp’為整個段設置填充模板。fillexp是一個表達式(參考Expressions)。任何其它的未被特殊指定的輸出段的內存區域(例如,因為對其輸入段產生的縫隙)將會被用fillexp的值填充

關于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

總結

以上是生活随笔為你收集整理的链接脚本lds 相关的知识的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。