一 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例子:
sectionscmd中也可以自定義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 在編...