ld鏈接腳本語法簡介


 

主要包含命令語句和賦值語句。

 

一、語法

1、分號,作為分隔符號  

2、注釋 表達式和運算符  和c一樣,其中注釋只有/**/

3、字符引用  段名文件名等有特殊字符,使用雙引號

4、命令語句

a、ENTRY(symble)  指定入口地址,入口地址就是進程執行的第一條用戶空間的指令再進程地址空間中的地址,被指定再ELF文件頭的ELF32_Ehdr的e_entry成員中。

ld有多種指定程序入口方式:(優先級逐漸降低)

ld -e

entry()

_start符號

.text

0

 

b、STARTUP(filename)  將文件filename 作為鏈接過程中的第一個輸入文件。

c、SEATCH_DIR 將路徑path加入到ld鏈接器的庫查找目錄。 ld會根據指定的目錄去查找相應的庫。

d、INPUT(file,file,...)  將指定文件作為鏈接過程中的輸入文件

e、INCLUDE filename 將指定文件包含進本鏈接腳本。

f、PROVIDE(symbol) 在鏈接腳本中定義某個符號。該符號再程序中可以被引用,起始前文提到的特殊符號都是由系統默認的鏈接腳本通過PROVIDE 命令定義在腳本中的

 

最復雜的SECTIONS

SECTIONS

{

  secname : {contents}

}

secname 表示 輸出段的段名,后面必須有一個空格,使得輸出段名沒有歧義,后面根一個冒號和一對大括號。大括號里面的contents描述了一套規則和條件,表示符合這種條件的輸入段合並到輸出段中。輸出段名必須符號輸出文件的要求,例如:a.out 輸出段名不可以是.text

.data .bss 之外的名字,因為.a.out 規定只允許這三個名。

有一個特殊的段名/DISCARD/如果使用這個名字作為輸出,那么所有符合條件的段都丟棄

 

contents 規則

包含若干個條件,每個條件用空格分開,如果輸入段符合任一條件,就表示符合cotents規則

輸入規則 :filename(sections)

 

 

ENTRY(nomain)  //指定了程序的入口地址

SECTIONS  //鏈接腳本的主體

{

  . = 0x08048000 + SIZEOF_HEADERS;  //將當前虛擬地址設置為0x08048000 + sizeof_headers. 

其中 “.”表示當前虛擬地址

 SIZEOF_HEADERS 表示文件的文件頭大小

 

  tinytext : {*(.text) *(.data) *(.rodata)} //將所有輸入文件中的三個段合並為輸出文件中的 tinytext段。

 

  /DISCARD/ : {*(.comment)}  //將輸入文件的comment段丟棄

}


免責聲明!

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



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