可執行程式產生流程;
原始檔->預處理器->編譯器->鏈結器->可執行目標檔案
預處理器(preprocessor):執行以#開頭的指令,預處理器可以刪除注釋,包含其他檔案以及執行巨集(巨集macro是一段重複文字的簡短描寫)替代.
類似於編輯器,可以給程式新增內容,也可以進行修改.
編譯器(compiler):將程式翻譯成機器指令,即目標**,但這樣的程式還不可執行
鏈結器(linker):將編譯器產生的目標**和所需的其它附加**整合在一起,最終產生可以執行的程式.鏈結器(linker)是乙個程式,將乙個或多個由彙編器或編譯器生成的目標檔案外加庫鏈結成為乙個可執行檔案.
鏈結器的主要工作:
1.符號解析.目標檔案定義和引用的符號,將每個符號引用剛好和乙個符號定義聯絡起來.
什麼是符號?比如定義了乙個函式,那麼函式名就是乙個符號.定義乙個變數,那麼變數名就是乙個符號.
符號表就是記錄符號名,以及符號定義所在位址位置資訊的表.
和符號表對應的是重定位表,記錄在某個位置引用某個符號.
cpu是不認識符號的,它只認識指令和位址,最終符合都會被位址所替代.
2.重定位. 編譯器生成位址從零開始的**和資料段.鏈結器將每個符號定義與乙個儲存器位置聯絡起來,然後修改所有對這些符號的引用,使得它們指向這個儲存器位置.從而重新定義這些段.
then icf檔案 . iar用鏈結器ilink, 參考檔案ewarm_developmentguide.enu . pdf
乙個標準的icf檔案包括下面內容;
1.可程式設計儲存空間(memory)
2.不同的儲存器位址區域(region)
3.不同的位址塊(block)
4.section的初始化與否
4.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 sectionname ][object filename ]
section-attribute [ readonly [ code | data ] | readwrite [ code | data ] | zeroinit ]
sectionname section的名稱
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:
下面是stm8s103 的icf檔案
ro section .huge.data_init,
ro section .huge_func.textrw_init,
ro section .iar.init_table,
ro section .init_array,
ro section .near.data_init,
ro section .near.rodata,
ro section .near_func.text,
ro section .near_func.textrw_init,
ro section .tiny.data_init,
ro section .tiny.rodata_init };
place in farfunccode ;
place in hugefunccode ;
place in eeprom ;
/
XML檔案學習
xml cdata 文字 所有 xml 文件中的文字均會被解析器解析。只有 cdata 區段 cdata section 中的文字會被解析器忽略。xml 解析器通常會解析 xml 文件中所有的文字。當某個 xml 元素被解析時,其標籤之間的文字也會被解析 此文字也會被解析解析器之所以這麼做是因為 x...
fstab檔案學習
孫曉明,華清遠見嵌入式學院 講師。我們在linux系統裡面的 etc 目錄下有乙個fstab檔案,那這個檔案的作用是什麼呢?其實這個檔案裡面存放的是系統中的檔案系統資訊。當正確的設定了該檔案,我們就可以通過mount 任意目錄 命令來載入乙個檔案系統,比如說我們新新增了一塊硬碟分割槽,那麼我們就可以...
fstab檔案學習
我們在 linux系統裡面的 etc 目錄下有乙個fstab檔案,那這個檔案的作用是什麼呢?其實這個檔案裡面存放的是系統中的檔案系統資訊。當正確的設定了該檔案,我們就可以通過 mount 任意目錄 命令來載入乙個檔案系統,比如說我們新新增了一塊硬碟分割槽,那麼我們就可以加入如下命令 dev sdb1...