基于ELF的嵌入式軟件源碼級交叉調(diào)試技術
開發(fā)任何一個軟件都不可避免地存在各種錯誤,要修正錯誤必須找出其錯誤原因。通常程序員利用調(diào)試器來跟蹤程序執(zhí)行情況,快速有效地定位錯誤產(chǎn)生的位置從而找到引起錯誤的原因,并改正錯誤。
調(diào)試器為用戶提供的主要功能包括:在目標程序中設置、刪除斷點;以單步執(zhí)行或連續(xù)執(zhí)行等方式控制目標程序運行;瀏覽程序中的變量或表達式的值;查看、修改目標機寄存器的內(nèi)容;查看、修改目標機內(nèi)存的內(nèi)容。源碼級調(diào)試器是面向高級語言的符號調(diào)試工具,它基于源代碼的語句和符號跟蹤觀察目標程序,同時提供基于匯編級的程序跟蹤功能以滿足用戶底層的調(diào)試需要。通用計算機軟件一般在同一臺機器上進行編輯、編譯、調(diào)試;而嵌入式軟件的目標系統(tǒng)多為特殊的專用系統(tǒng),通常采用宿主機/目標機開發(fā)環(huán)境,借助通用計算機作為編輯源文件的宿主機,利用交叉編譯器在宿主機上編譯生成目標機的可執(zhí)行代碼,調(diào)試時通過通訊介質(zhì)(串線或網(wǎng)絡)將目標代碼下載到目標系統(tǒng)上運行,利用交叉調(diào)試器進行跟蹤調(diào)試。
國外計算機業(yè)在調(diào)試器領域中發(fā)展很快,開發(fā)了許多功能強大、支持多種目標機的交叉調(diào)試器。但國內(nèi)在調(diào)試器領域中一直處于落后狀態(tài),普遍采用的多是國外的工具產(chǎn)品。目前國內(nèi)的嵌入式系統(tǒng)發(fā)展迅速,對嵌入式軟件的開發(fā)環(huán)境也提出了新的要求,因此,我們著手進行嵌入式軟件的源碼級交叉調(diào)試器的設計與實現(xiàn),以適應當前嵌入式軟件發(fā)展的需要。
2 源碼級交叉調(diào)試器的實現(xiàn)途徑
程序運行過程中目標程序的指令代碼和數(shù)據(jù)都映射到目標機上相應的內(nèi)存內(nèi)容,為了實現(xiàn)源碼級調(diào)試,利用目標文件中在程序編譯鏈接時生成的調(diào)試信息來實現(xiàn)目標程序與源程序之間的映射,從而在源碼級實現(xiàn)對程序執(zhí)行情況的控制和觀察。其關鍵在于找到調(diào)試控制點和數(shù)據(jù)在源程序與目標程序之間的映射關系。
任何數(shù)據(jù)都有名和值兩個側(cè)面,數(shù)據(jù)名與數(shù)據(jù)值之間的映射關系為:根據(jù)數(shù)據(jù)名得到存放該數(shù)據(jù)值的內(nèi)存地址,再從目標機的內(nèi)存地址取出其內(nèi)容即為數(shù)據(jù)值,如圖1所示:
調(diào)試中的程序控制點通常為源程序中的函數(shù)、語句行等,它們對應于裝載到目標內(nèi)存中的相應目標代碼,要實現(xiàn)程序的運行控制關鍵在于得到源代碼與目標代碼之間的映射關系:由源碼定位信息得到相應的目標碼信息;由目標碼地址得到相應的源碼定位信息。源碼定位信息為源文件名+行號或函數(shù)名;目標碼信息為目標指令在目標機內(nèi)存中的起始和終止地址。兩者關系如圖2所示。
嵌入式軟件以宿主機/目標機模式開發(fā),其交叉調(diào)試器分為宿主機部分和目標機部分,兩者以統(tǒng)一的通訊協(xié)議進行通信,宿主機向目標機發(fā)送命令,目標機接收、執(zhí)行命令并將結(jié)果返回宿主機,從而實現(xiàn)兩機之間的交互控制。免費軟件基金會FSF提供的調(diào)試工具gdb具有一套比較成熟的通訊協(xié)議----remote通訊協(xié)議,該協(xié)議作為開放軟件被廣為采用,在此我們選擇了rmote協(xié)議作為交叉調(diào)試器的遠程通訊協(xié)議。
3 ELF格式目標文件
目標文件是實現(xiàn)源碼級調(diào)試的基礎,需要詳細分析文件的格式及內(nèi)容以從中獲取有用的調(diào)試信息。在設計調(diào)試器時采用可執(zhí)行連接格式――ELF格式目標文件作為開發(fā)基礎,ELF(Executable and Linking Format)是UNIX系統(tǒng)實驗室(USL)作為應用程序二進制接口(Application Binary Interface(ABI))而開發(fā)和發(fā)布的,已被軟件業(yè)廣泛采用,在Linux系統(tǒng)中ELF格式是其默認的目標文件格式,許多嵌入式軟件都采用ELF 格式作為目標文件格式。
ELF目標文件主要有三種類型:可重定位文件,可執(zhí)行文件,共享的目標文件,我們以可執(zhí)行文件為分析對象。
ELF文件格式如圖3所示:
ELF頭固定在文件的起始位置,其它各部分的位置由ELF頭及其它相關信息獲得。
1、ELF頭
ELF頭是整個文件的入口,具有固定的長度,52個字節(jié),包含14個值。包括ELF文件標識,程序頭表和節(jié)頭表的位置、長度,文件中段的數(shù)目和節(jié)的數(shù)目等信息。
評論