最簡單的鏈結指令碼只有乙個命令'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 鏈結器 的一種。完成的功...