DSP編程技巧之13-揭開(kāi)編譯器神秘面紗之鏈接器的基本選項
在我們對DSP編程的時(shí)候,相信沒(méi)有人會(huì )把所有的代碼都放在同一個(gè)源文件里面:光各種寄存器的初始化代碼就有幾百上千行了,再加上我們自己書(shū)寫(xiě)的代碼,想想假如一個(gè).c文件里面有一萬(wàn)行,該如何管理、調試呢?所以要按照功能、寄存器分類(lèi)等進(jìn)行劃分,這樣一個(gè)工程就包含了很多的頭文件、源程序等等,每個(gè)源程序經(jīng)過(guò)編譯、匯編之后都會(huì )產(chǎn)生單獨的目標文件。因為對于程序的任何一點(diǎn)修改,都需要編譯器進(jìn)行編譯,如果每次都把所有的程序進(jìn)行重新編譯的話(huà),是對時(shí)間和資源的極大浪費:特別是那些基于Eclipse的編譯環(huán)境,因為基于Java這樣的技術(shù),本身就很慢,如果一次編譯的文件很多,編譯過(guò)程是非常痛苦的等待,甚至經(jīng)常懷疑編譯環(huán)境是不是已經(jīng)掛掉了?所以為了提高效率,我們可以使用增量編譯技術(shù)只對有修改的文件進(jìn)行重新編譯和匯編,而沒(méi)有修改的則不需要更新目標文件。但是因為編譯器和匯編器對每個(gè)源文件是單獨匯編的,它們并不知道某個(gè)模塊中的數據和程序相對于另一個(gè)模塊而言,具體位置在哪里,所以接下來(lái)我們就需要使用鏈接器把所有的目標文件給“拼接”起來(lái),最終生成一個(gè)可以獨立運行的文件,即可執行文件。它的功能包括三個(gè)主要的步驟:
本文引用地址:http://dyxdggzs.com/article/248688.htm(1)將代碼和數據放入“假想”中的內存:鏈接器基于.cmd文件中對存儲器地址的劃分,按照不同的段把代碼和數據分別裝入對應的地址中;當然這完全是在電腦上完成的,不需要實(shí)際的DSP和RAM“出面”。
(2)為數據和指令分配內存地址:最簡(jiǎn)單的例子,為函數中斷的入口制定一個(gè)地址,這樣在進(jìn)中斷的時(shí)候,程序指針直接跳轉到中斷入口的地址就行了。
(3)修改內部和外部的引用:鏈接器使用每個(gè)目標文件中的重定位信息和符號表,來(lái)解析某個(gè)目標文件中未定義的符號,因為它有可能是在別的目標文件中定義的。
為了更好地理解鏈接器的行為,我們就需要了解一下它的配置選項。鏈接器的配置選項也很多,但是和程序優(yōu)化的那些選項相比,其含義要更容易理解一些。表1是鏈接器的最基本選項,定義了鏈接器正常工作所必須的參數。

鏈接器的文件搜索選項則是鏈接器用來(lái)尋找文件時(shí)使用的,例如查找某個(gè)和FPU運行有關(guān)的浮點(diǎn)庫函數,如表2所示。


評論