背景
使用鏈接腳本可對鏈接過程進行顯式控制,允許對鏈接器的輸入文件和輸出文件之間的映射進行完整的規范。一般使用-T
選項來顯示的指定鏈接腳本。
- input files
- file formats
- output file layout
- addresses of sections
- placement of common blocks
語法
ld腳本是語句的集合,一些是設置特定選項的簡單關鍵字,一些用於選擇和分組輸入文件、一些用於命名輸出文件,其中SECTIONS
和MEMORY
是有對鏈接過程具有基本和普遍的影響。
SECTIONS
section命令中最常用的語句是section定義,它指定輸出部分的屬性:它的位置、對齊方式、內容、填充模式和目標內存區域。這些規范中的大多數是可選的。
定義
通過以下幾種形式來指定不同的section,filename可以使用*等正則表達式,section可以用逗號或者空格區分。
filename( section )
filename( section , section, ... )
filename( section section ... )
例子
在下面的示例中,命令腳本將輸出文件排列成三個連續的部分,分別命名為.text、.data和.bss,並從所有輸入文件中相應命名的部分獲取每個部分的輸入
SECTIONS {
.text : { *(.text) }
.data : { *(.data) }
.bss : { *(.bss) *(COMMON) }
}
這個例子展示了如何使用通配符模式對文件進行分區。所有的.text部分放在.text中,所有的.bss部分放在.bss中。對於所有以大寫字符開頭的文件,.data節被放在.data,對於所有其他文件,.data節被放置在.data中。
SECTIONS {
.text : { *(.text) }
.DATA : { [A-Z]*(.data) }
.data : { *(.data) }
.bss : { *(.bss) }
}
MEMORY
鏈接器的默認配置允許分配所有可用內存。可以使用MEMORY
命令覆蓋此配置。MEMORY命令描述目標器中內存塊的位置和大小。通過仔細使用它,您可以描述鏈接器可能使用哪些內存區域,以及它必須避免哪些內存區域。鏈接器將請求的分段移動到正確的內存塊中,並在內存塊太滿時發出錯誤。
一個鏈接腳本最多只能有一條MEMORY
命令,但是可以定義多個內存塊。
MEMORY
{
name (attr) : ORIGIN = origin, LENGTH = len
...
}
- name
是鏈接器內部用來引用區域的名稱。可以使用任何符號名。
- (attr)
屬性的可選列表,指定是否使用特定內存來放置鏈接器腳本中未列出的部分。有效的屬性列表必須由字符“ALIRWX”組成,以匹配部分屬性。如果你省略了屬性列表,你也可以省略它周圍的括號。目前支持的屬性有:
`Letter'
Section Attribute
`R'
Read-only sections.
`W'
Read/write sections.
`X'
Sections containing executable code.
`A'
Allocated sections.
`I'
Initialized sections.
`L'
Same as I.
`!'
Invert the sense of any of the following attributes.
- origin
物理內存中區域的起始地址。它是一個表達式,在執行內存分配之前必須求值為一個常量。關鍵字ORIGIN可以縮寫為org或o(但不能,例如“ORG”)。
- len
以字節為單位的區域大小(表達式)。關鍵字LENGTH可以縮寫為len或l。
- exmaple
指定內存有兩個可供分配的區域:一個從0開始分配256kb字節,另一個從0x40000000開始分配4mb字節。rom內存區域將獲得所有沒有顯式的只讀或包含代碼的內存section,而ram內存區域將獲得數據section。
MEMORY
{
rom (rx) : ORIGIN = 0, LENGTH = 256K
ram (!rx) : org = 0x40000000, l = 4M
}
reference
資料
- 官方文檔
新版目錄:https://sourceware.org/binutils/docs/ld/index.html
舊版目錄:https://ftp.gnu.org/old-gnu/Manuals/ld-2.9.1/html_chapter/ld_3.html - 翻譯文檔
https://zhuanlan.zhihu.com/p/516338675
https://blog.csdn.net/m0_47799526/article/details/108765403
http://wen00072.github.io/blog/2014/03/14/study-on-the-linker-script/