GNU鏈結指令碼學習(1)

2021-07-05 18:21:09 字數 1359 閱讀 2322

最簡單的鏈結指令碼只有乙個命令'sections',使用'sections'命令描述輸出檔案記憶體布局。

'sections'命令是非常強大的,在這我們將解釋它的簡單用法。

現在假設你的程式只是由單一**段初始化數段未初始化資料段,分別對應'.text'、'.data'、'.bss'的段名。再假設輸入檔案中也只出現這些段。

在這個例子中,制定**段裝入位址在0x10000,資料段開始在0x8000000,下面指令碼即是指令碼描述:

sections

. = 0x8000000;

.data :

.bss : 

}關鍵字'sections'作為命令,後面跟隨的是花括號中包含符號分配和輸出描述串。

在'sections'裡面第一行特殊符號'.'是用作位置計數。如果你沒有以其它方式指定輸出段位址(其它方式以後在講解),則位址被設定成位置計數的當前值。位置計數依從輸出區大小增長,在'sections'命令起始處位置計數賦值為0。

第二行定義輸出區'.text',冒號是語法必須的,現在可以忽略。輸出區名字後面的花括號內,列出所有輸入區名字,他們將被安置到輸出區中。'*'是萬用字元,匹配任何檔名。表示式'*(.text)'意思是所有輸入檔案的輸入區。

因為位置計數在輸出區中定義為0x10000,鏈結器就會設定輸出檔案'.text'位址到0x10000。

剩下行定義輸出檔案'.data'和'.bss'區,鏈結器將安排'.data'輸出區在位址0x8000000。鏈結器安排好'.data'輸出區後,位置計數的值將是0x8000000加'.data'輸出大小,作用就是鏈結器在記憶體中緊跟'.data'輸出區安排'.bss'輸出區。

鏈結器確保每個輸出區是對齊的,需要時通過增長位置計數。這個例子中指定'.text'和'.data'區位址將滿足強制對齊,但是鏈結器可能會建立間隙在'.data'和'.bss'之間。

到此為止,這就是乙個簡單而又完整的鏈結指令碼.

GNU鏈結指令碼 05 符號值分配

原文 1 簡單符號值 第一節已經對符號做了描述,並且提及鏈結指令碼也是符號的產生原因之一。符號支援如下運算。symbol expression symbol expression symbol expression symbol expression symbol expression symbol...

鏈結指令碼(1)

1 什麼是ld?它有什麼作用?ld是gnu binutils工具集中的乙個,是眾多linkers 鏈結器 的一種。完成的功能自然也就是鏈結器的基本功能 把各種目標檔案和庫檔案鏈結起來,並重定向它們的資料,完成符號解析。linking其實主要就是完成四個方面的工作 storage allocation...

鏈結指令碼(1)

分類 鏈結指令碼 makefile 2012 05 17 20 49 1126人閱讀收藏 舉報 指令碼linker makefile allocation file flash 1 什麼是ld?它有什麼作用?ld是gnu binutils工具集中的乙個,是眾多linkers 鏈結器 的一種。完成的功...