gnu ld(Linker Scripts)鏈接介紹


背景

使用鏈接腳本可對鏈接過程進行顯式控制,允許對鏈接器的輸入文件和輸出文件之間的映射進行完整的規范。一般使用-T選項來顯示的指定鏈接腳本。

  • input files
  • file formats
  • output file layout
  • addresses of sections
  • placement of common blocks

語法

ld腳本是語句的集合,一些是設置特定選項的簡單關鍵字,一些用於選擇和分組輸入文件、一些用於命名輸出文件,其中SECTIONSMEMORY是有對鏈接過程具有基本和普遍的影響。

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

資料


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM