ld script 命令摘錄

SECTIONS命令中的輸出段描述
MEMORY命令
KEEP()關鍵字
//---- SECTIONS命令中的輸出段描述 --------------------------
 
在SECTIONS命令中的類似於下面的描述結構就是輸出段描述:

.start ALIGN(4) : {

    *(.text.start)

}

.start 爲output section name,ALIGN(4)返回一個基於location counter(.)的4字節對齊的地址值。*(.text.start)是輸入段描述,*爲通配符,意思是把所有被鏈接的object文件中的.text.start段都鏈接進這個名爲.start的輸出段。

源文件中所標識的section及其屬性實際上就是對輸入段的描述,例如.text.start輸入段在源文件start.S中的代碼如下:

.section .text.start

.global _start

_start :

    b start


//------ MEMORY命令/ 內存區域命令 -----------

注意:以下存儲區域指的是在程序地址空間內的。
在默認情形下,連接器可以爲section分配任意位置的存儲區域。
你也可以用MEMORY命令定義存儲區域,並通過輸出section描述的>
REGION屬性顯示地將該輸出section限定於某塊存儲區域,當存儲區域大小不能滿足要求時,連接器會報告該錯誤。
MEMORY命令的文法如下,
MEMORY {
NAME1 [(ATTR)] : ORIGIN = ORIGIN1, LENGTH = LEN2
NAME2 [(ATTR)] : ORIGIN = ORIGIN2, LENGTH = LEN2
...
}
NAME :存儲區域的名字,這個名字可以與符號名、文件名、section名重複,因爲它處於一個獨立的名字空間。
ATTR:定義該存儲區域的屬性,在講述SECTIONS命令時提到,當某輸入section沒有在SECTIONS命令內引用時,連接器會把該輸入
section直接拷貝成輸出section,然後將該輸出section放入內存區域內。
如果設置了內存區域設置了ATTR屬性,那麼該區域只接受滿足
該屬性的section(怎麼判斷該section是否滿足?輸出section描述內好象沒有記錄該section的讀寫執行屬性)。
ATTR屬性內可以出現以下7個字符,
  R 只讀section
  W 讀/寫section
  X 可執行section
  A ‘可分配的’section
  I 初始化了的section
  L 同I
  ! 不滿足該字符之後的任何一個屬性的section
ORIGIN :關鍵字,區域的開始地址,可簡寫成org或o
LENGTH :關鍵字,區域的大小,可簡寫成len或l
例子,
MEMORY
{
rom (rx) : ORIGIN = 0, LENGTH = 256K
ram (!rx) : org = 0x40000000, l = 4M
}
此例中,把在SECTIONS命令內*未*引用的且具有讀屬性或寫屬性的輸入section放入rom區域內,把其他未引用的輸入section放入
ram。如果某輸出section要被放入某內存區域內,而該輸出section又沒有指明ADDRESS屬性,那麼連接器將該輸出section放在該
區域內下一個能使用位置。

//---- KEEP()關鍵字 ----------------

輸入section和垃圾回收:
在連接命令行內使用了選項--gc-sections後,連接器可能將某些它認爲沒用的section過濾掉,
此時就有必要強制連接器保留一些特定的section,可用KEEP()關鍵字達此目的。
如KEEP(*(.text))或KEEP(SORT(*)(.text))

//---- reference --------
<<ld script>>
http://blog.csdn.net/panwuqiong/article/details/7269489
本文乃轉載. 原作者的E-mail是[email protected][email protected]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章