CCS 的鏈結器選項

2021-07-25 17:45:31 字數 3818 閱讀 2780

一 ccs鏈結器的作用和過程

彙編器已經將原始檔(.asm)順序地按段的定義(spc)轉換 成機器語言目標檔案(.obj檔案),即coff檔案, 聯結器的主要任務是根據連線命令或連線命令檔案(.cmd)將乙個或多個 coff目標檔案連線起來,生成儲存器映象檔案(.map)和可執行的輸出 檔案(.out檔案),即coff目標模組。 鏈結過程為:

(1)將各個目標檔案合併起來,將各個檔案的各個段配置到目標系統的儲存器中

(2)對各個符號和段進行重定位,並給它們指定乙個最終的位址

(3)解決輸入檔案之間未定義的外部引用 。

二 鏈結命令檔案的寫法

coff(公共目標檔案格式,common object file format)檔案格式是基於塊(section)的概念建立的,即程式被分解成各種塊的組合體:如文字塊、資料塊等。 具有一下特點:

(1)便於實現模組化程式設計

(2)為管理**塊和目標系統儲存器提供更強有力和更加靈活的方法

(3)程式設計師設計時只需基於**塊和資料塊等概念進行,不需關注每條命令或每個資料的具體目標位址。至於它們的最終將處於儲存器的哪個位置,將由鏈結器來安排

(4)為程式編寫和移植提供了很大的方便

1 section

section目標檔案中最小單位稱為塊。乙個塊就是最終在儲存器映象中佔據連續空間的一段**或資料。所有的section按照是否自定義可以分為:

(1)coff預設的section (2)自定義的section ,按照是否初始化可以分為:(1)初始化的section(2)未初始化的section 。c語言和彙編中可能有些不同。

彙編器中預設的section有:

section

作用通常位置

.text

通常包含可執行**

ram或者eprom

.data

通常包含已初始化資料

rom或者eprom

.bss

通常用來為未初始化變數保留

ram

彙編中自定義模組可以通過.sect 建立具可重定位位址的命名塊 和.usect創立未初始化塊。

c語言的section可以區分如下:

section

作用.text

可**和常數

.cinit

變數初值表

.switch

用於大型switch語句的跳轉表

.const

常量和字串

.bss

全域性變數和靜態變數

.system

全域性堆(用於儲存器的分配)

.stack

堆疊.far

以far宣告的全域性和靜態變數

.cio

用於stdio函式

.ebss

長呼叫的.bss(超過了64k位址限制)

.esysmem

長呼叫的.sysmem(超過了64k位址限制)

econst

長.const(可定位到任何地方)

當然,c語言中可以自定義段

2.cmd

鏈結器有兩種定位快的辦法,一種是採用預設的分配演算法,彙編中的過程如下:

(1)假定儲存器的起始位址為0

(2)假定有2^32字的儲存器可以用來分配

(3)將.text分配到起始位址為0的程式儲存器中

(4)將.data分配到緊接著.text的程式儲存器中

(5)將.bss分配到緊接著.data的程式儲存器中

(6)分配自定義的section。

聯結器也可以通過鏈結命令檔案來完成,cmd檔案由三部分組成

(1) 輸入輸出定義;

這一部分,可以通過ccs的「build option........」選單設定。主要包含以下幾個部分:

具體的指令有:

-a 產生絕對位址(不可重新定位)的可執行模組,若沒有指定-a或-r,預設情況為-a
-r 產生可重新定位不可執行的模組
-ar 產生可重新定位可執行的模組
-b 聯結器將不合併任何由於多個檔案而可能存在的重複符號表項,此項選擇的效果是使聯結器執行較快,但其代價是輸出的coff檔案較大
-c 使用由tms320c54x c/c++編譯器的rom自動初始化模型所定義的連線約定
-cr使用由c編譯器的ram自動初始化模型所定義的連線約定
-e global_symbol 定義全域性符號為輸出模組的指定主入口點
-f fill value為輸出段中空洞設定預設的填充值, fill value為16位的常數
-h 使所有的全域性符號為靜態變數
-g global_symbol保持指定的global_symbol為全域性符號,而不管是否使用了-h選項
-help , -? 顯示所有可利用的連線命令列選項
-head size為c語言的動態儲存器分配設定堆疊大小,以字為單位,並定義指定的堆疊大小的全域性符號,size有預設值為1k字
-i  dir 改變庫搜尋方法為在搜尋預設的位置前先搜尋dir ,該項必須在-l(l)選項之前出現
-l  filename  指定乙個存檔庫檔案為聯結器的輸入 , filename為存檔庫檔名,該選項必須在-i 選項之後出現,目錄或檔名必須遵守作業系統的規定
-m filename  產生乙個儲存器(位址)對映檔案,輸出名為filename.map , 該檔案列出了輸入和輸出段(包括空洞)的位址
-o filename 指定可執行輸出模組的檔名(filename) , 預設為a.out , 目錄或檔名必須遵守作業系統的規定
-q 請求靜態執行(quiet run) ,即壓縮旗標(banner)必須是在命令列的第乙個選項
-s 從輸出模組中去掉符號表資訊和行號
-stack  size 設定c系統堆疊,大小以字為單位,並定義指定堆疊大小的全域性符號,預設的size為1k
-u symbol 將不能分辯的外部符號放入輸出模組的符號表
-vn 指定產生的coff檔案格式n , n=0、1或2,預設為coff2
-w 當出現沒有定義的輸出段時,發出警告
-x 迫使重讀庫,以分辯後面的引用
(2) memory命令;

memory: 定義目標系統的儲存器映象,可以給它們命名,規定起始位址和長度

用法:memory

例如:

memory                                         

(3) section命令。

sections:指定怎樣組合各輸入塊以及將各輸出塊存放在儲存器 的哪個位置

用法:

sections 

例子:

sections                                       

cmd中也可以自定義section,用法如下:

#pragma data_section(函式名或全域性變數名,"使用者自定義在資料空間的段名");

#pragma code_section(函式名或全域性變數名,"使用者自定義在程式空間的段名");

具體用法如下:

sections

CCS 的鏈結器選項

一 ccs鏈結器的作用和過程 彙編器已經將原始檔 asm 順序地按段的定義 spc 轉換 成機器語言目標檔案 obj檔案 即coff檔案,聯結器的主要任務是根據連線命令或連線命令檔案 cmd 將乙個或多個 coff目標檔案連線起來,生成儲存器映象檔案 map 和可執行的輸出 檔案 out檔案 即co...

Visual C 鏈結器選項

visual c 鏈結器選項 鏈結器選項 link 是將通用物件檔案格式 coff 物件檔案和庫鏈結起來以建立可執行 exe 檔案或動態鏈結庫 dll 的工具。下表是 link.exe 選項的綜合列表。本節還包含關於以下主題的資訊 可以通過 comment 雜注指定一些鏈結器選項。選項 用途 指定響...

鏈結選項 I, l, L, Wl rpath

首先這幾個命令一般用在gcc g 或makefile中,但是一般的ide裡也會涉及。只是在ide裡的配置方式會不同,有的是配置檔案如qtcreator,有的是圖形化介面,如codeblocks。無論是什麼樣的方式其本質都是一樣的,尤其是配乙個工程的時候,這些都是必不可少的。i,新增包含路徑 i 在編...