IAR ILINK 鏈結指令碼

2021-06-19 04:07:04 字數 4357 閱讀 1338

sections在位址空間中的存放是由ilink鏈結器來實現的,而ilink鏈結器是按照使用者在icf檔案中的規定來放置sections的,所以理 解icf檔案的內容尤其重要。

乙個標準的icf檔案可包括下面這些內容:

1.       可編址的儲存空間(memory)

2.       不同的儲存器位址區域(region)

3.       不同的位址塊(block)

4.       section的初始化與否

5.       section在儲存空間中的放置

下 面介紹了幾條icf檔案中常見的指令,詳細內容請參考ilink相關說明文件(ewarm_developmentguide.pdf):

1.    define [ exported ] symbol name = expr;

作用:   指定某個符號的值。

引數:    exported 匯出該symbol,使其對可執行映象可用

name     --符號名

expr     --符號值

舉例:

define symbol ram_start_address = 0x40000000;

define symbol ram_end_address = 0x4000ffff;    

2.    define memory name with size = expr [, unit-size];

作用:   定義乙個可編址的儲存位址空間(memory)。

引數:    name     --memory的名稱

expr     --位址空間的大小

unit-size --expr的單位,可以是位(unitbitsize),預設是位元組(unitbytesize)

舉例:

define memory mem with size = 4g;

3.    define region name = region-expr;

作用:    定義乙個儲存位址區域(region)。乙個區域可由乙個或多個範圍組成,每個範圍內位址必須連續,但幾個範圍之間不必是連續的。

引數:    name region的名稱

region-expr memory:[from expr ],可以定義起止範圍,也可以定義起始位址和region的大小

舉例:

define region rom = mem:[from 0x0 size 0x10000];

define region rom = mem:[from 0x0 to 0xffff];

4.    define block name[ with param, param... ]

; 作用:    定義乙個位址塊(block);它可以是個空塊,比如棧、堆;也可以包含一系列sections。

引數:    name     block的名稱

param 可以是:     size = expr (塊的大小)

maximum size = expr (塊大小的上限)

alignment = expr (最小對齊位元組數)

fixed order (按照固定順序放置sections)

extended-selector [ first | last ]

first 最先存放

last 最後存放

section-selector [ section-attribute ][section-type][ section sectionname ][object filename ]

section-attribute--  [ ro  [ code | data ] | rw  [ code | data ] | zi ]

section-type – preinit_array|init_array

sectionname -- section的名稱

object filename 目標檔案的名稱

即可以按照section的屬性,名稱及其所在目標檔案的名稱這三個過濾條件中,任意選取乙個條件,或選取多個條件進行組合,來圈定所要求的 sections。

name block或overlay的名稱

舉例:

define block heap with size = 0x1000, alignment = 4 ;

define block myblock1 = ;

define block myblock2 = ;

5.    initialize [ with param, param... ]

; 作用:    初始化sections。

引數:    by copy 在程式啟動時自動執行初始化。

manually 在程式啟動時不自動執行初始化。

param 可以是: packing =

copy routine = functionname

packing表示是否壓縮資料,預設是auto。

functionname表示是否使用自己的拷貝函式來取代預設函式。

section-selector 同上

舉例:

initialize by copy ;

6.    do not initialize

; 作用:    規定在程式啟動時不需要初始化的sections。一般用於__no_init宣告的變數段(.noinit)。

引數:    section-selector 同上

舉例:

do not initialize ;

7.    place at

; 作用:    把一系列sections和blocks放置在某個具體的位址,或者乙個region的開始或者結束處。

引數:    memory memory的名稱

expr 位址值,該位址必須在memory所定義的範圍內

region_expr region的名稱

extended-selector 同上

舉例:

place at start of rom ; place at end of rom ; place at address mem:0x0 ;

8.    place in region-expr

; 作用:    把一系列sections和blocks放置在某個region中。sections和blocks將按任意順序放置。

引數:    region-expr region的名稱

extended-selector 同上

舉例:

place in rom ;         /* all readonly sections */

place in ram ;         /* all readwrite sections */

place in ram ;

place in rom ;     /* the .text section of myfile.o */

place in rom ;         /* all read-only sections of myfile.o */

place in rom ;     /* all read-only data sections myfile.o */

from:

iar的icf檔案中巨集給程式使用

如果想定在rom空間

icf中:

place at address mem:0x08090000 ;

c:中:

#pragma location = ".test"

const u32 uidata[512];// const 切不可省略

如果想定在ram空間

icf中:

place at address mem:0x08090000 ;

c:中:

#pragma location = ".test"

u32 uidata[512];

可發現uidata的值為0x08090000

該法可方便通過icf指定某變數的位址。

程式也可以。寫法類似.vector

如果用block的方。類似

define block cstack    with alignment = 8, size = __icfedit_size_cstack__   ;

c中:

#pragma language="extended"

#pragma segment="cstack"

ptr = __sfe( "cstack" );可得到cstack的高階位址+1

__sfe: returns last address of segment.

uboot鏈結指令碼

gnu編譯器生成的目標檔案預設為elf格式,elf檔案由若干段 section 組成,如不特殊指明,由c源程式生成的目標 中包含如下段 text 正文段 包含程式的指令 data 資料段 包含固定的資料,如常量 字串 bss 未初始化資料段 包含未初始化的變數 陣列等。c 源程式生成的目標 中還包括...

鏈結指令碼(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 鏈結器 的一種。完成的功...