<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 解析基于ELF的嵌入式軟件源碼級交叉調試技術(shù)

解析基于ELF的嵌入式軟件源碼級交叉調試技術(shù)

作者: 時(shí)間:2012-08-10 來(lái)源:網(wǎng)絡(luò ) 收藏

開(kāi)發(fā)任何一個(gè)都不可避免地存在各種錯誤,要修正錯誤必須找出其錯誤原因。通常程序員利用器來(lái)跟蹤程序執行情況,快速有效地定位錯誤產(chǎn)生的位置從而找到引起錯誤的原因,并改正錯誤。

本文引用地址:http://dyxdggzs.com/article/148626.htm

器為用戶(hù)提供的主要功能包括:在目標程序中設置、刪除斷點(diǎn);以單步執行或連續執行等方式控制目標程序運行;瀏覽程序中的變量或表達式的值;查看、修改目標機寄存器的內容;查看、修改目標機內存的內容。器是面向高級語(yǔ)言的符號調試工具,它源代碼的語(yǔ)句和符號跟蹤觀(guān)察目標程序,同時(shí)提供匯編級的程序跟蹤功能以滿(mǎn)足用戶(hù)底層的調試需要。通用計算機一般在同一臺機器上進(jìn)行編輯、編譯、調試;而的目標系統多為特殊的專(zhuān)用系統,通常采用宿主機/目標機開(kāi)發(fā)環(huán)境,借助通用計算機作為編輯源文件的宿主機,利用編譯器在宿主機上編譯生成目標機的可執行代碼,調試時(shí)通過(guò)通訊介質(zhì)(串線(xiàn)或網(wǎng)絡(luò ))將目標代碼下載到目標系統上運行,利用調試器進(jìn)行跟蹤調試。

一、調試器的實(shí)現途徑

程序運行過(guò)程中目標程序的指令代碼和數據都映射到目標機上相應的內存內容,為了實(shí)現級調試,利用目標文件中在程序編譯鏈接時(shí)生成的調試信息來(lái)實(shí)現目標程序與源程序之間的映射,從而在源碼級實(shí)現對程序執行情況的控制和觀(guān)察。其關(guān)鍵在于找到調試控制點(diǎn)和數據在源程序與目標程序之間的映射關(guān)系。

任何數據都有名和值兩個(gè)側面,數據名與數據值之間的映射關(guān)系為:根據數據名得到存放該數據值的內存地址,再從目標機的內存地址取出其內容即為數據值:

調試中的程序控制點(diǎn)通常為源程序中的函數、語(yǔ)句行等,它們對應于裝載到目標內存中的相應目標代碼,要實(shí)現程序的運行控制關(guān)鍵在于得到源代碼與目標代碼之間的映射關(guān)系:由源碼定位信息得到相應的目標碼信息;由目標碼地址得到相應的源碼定位信息。源碼定位信息為源文件名+行號或函數名;目標碼信息為目標指令在目標機內存中的起始和終止地址。

軟件以宿主機/目標機模式開(kāi)發(fā),其交叉調試器分為宿主機部分和目標機部分,兩者以統一的通訊協(xié)議進(jìn)行通信,宿主機向目標機發(fā)送命令,目標機接收、執行命令并將結果返回宿主機,從而實(shí)現兩機之間的交互控制。免費軟件基金會(huì )FSF提供的調試工具gdb具有一套比較成熟的通訊協(xié)議----remote通訊協(xié)議,該協(xié)議作為開(kāi)放軟件被廣為采用,在此我們選擇了rmote協(xié)議作為交叉調試器的遠程通訊協(xié)議。

二、格式目標文件

目標文件是實(shí)現源碼級調試的基礎,需要詳細分析文件的格式及內容以從中獲取有用的調試信息。在設計調試器時(shí)采用可執行連接格式DD格式目標文件作為開(kāi)發(fā)基礎,(Executable and Linking Format)是UNIX系統實(shí)驗室(USL)作為應用程序二進(jìn)制接口(Application Binary Interface(ABI))而開(kāi)發(fā)和發(fā)布的,已被軟件業(yè)廣泛采用,在Linux系統中ELF格式是其默認的目標文件格式,許多軟件都采用ELF格式作為目標文件格式。

ELF目標文件主要有三種類(lèi)型:可重定位文件,可執行文件,共享的目標文件,我們以可執行文件為分析對象。

ELF頭固定在文件的起始位置,其它各部分的位置由ELF頭及其它相關(guān)信息獲得。

1、ELF頭

ELF頭是整個(gè)文件的入口,具有固定的長(cháng)度,52個(gè)字節,包含14個(gè)值。包括ELF文件標識,程序頭表和節頭表的位置、長(cháng)度,文件中段的數目和節的數目等信息。

2、程序頭表與段

程序頭表中有多個(gè)表項,每個(gè)表項是一個(gè)程序段的信息,固定長(cháng)度為32個(gè)字節,包含8個(gè)值,包括段在文件中的位置,段在內存中的起始虛擬地址,段的長(cháng)度及其它屬性等。調試器根據程序頭表中的信息來(lái)確定需要下載到目標機上的目標文件內容(指令與數據)及其在目標機中的內存地址。

3、節頭表與節

節頭表中也有多個(gè)表項,每個(gè)表項是一個(gè)節的信息,固定長(cháng)度為40個(gè)字節,包含10個(gè)值,包括節名、節的類(lèi)型、該節在文件中的位置、該節在內存中的起始地址(如果該節出現在內存映象中)、節的長(cháng)度等信息。某些節是程序段的組成部分,如包含程序二進(jìn)制指令代碼的正文節.text和數據節.rodata,.hash等,某些節不作為段的組成部分,只提供其它的額外信息。為源碼調試服務(wù)的有 .debug,.line,.symtab,.debug_ pubname,.debug_range等節,其中.debug, .line節包含了源碼調試信息的基本內容。

.debug節中有多種類(lèi)型的記錄,可分為幾大類(lèi):

(1)、編譯模塊信息:包含組成該文件的各個(gè)模塊的源文件名,路徑,及該模塊的代碼地址范圍等。

(2)、子程序信息:包含程序名,程序類(lèi)型,起始終止地址,程序返回結果存放地址等。

(3)、變量信息:包含變量名、變量類(lèi)型、變量存放地址信息等,變量有多種類(lèi)型,簡(jiǎn)單變量、結構變量等類(lèi)型的變量其信息內容各有不同。

將.debug節中各項內容的結構關(guān)系抽象為家族關(guān)系。以節的起始為根,首先是一個(gè)編譯單元的信息,它給出下一個(gè)編譯單元(兄弟關(guān)系)在文件中的相對位置。緊跟著(zhù)編譯單元的是該編譯單元中的子程序與公共變量信息(父子關(guān)系),同樣的,編譯單元中頭一個(gè)函數記錄或變量記錄將給出它的兄弟的位置信息。緊隨該函數記錄的是該函數內部的子程序與局部變量信息。相鄰層次成員是父子關(guān)系,同一層次上的成員是兄弟關(guān)系,如圖4所示:

.line節中包含目標代碼地址與源代碼行號之間的對應關(guān)系。對每個(gè)編譯單元給出其行記錄信息的長(cháng)度和目標碼的起始基地址,以及該編譯單元中所有的行記錄,每條記錄以固定的格式表示:“該行目標碼相對于基地址的偏移,列號(保留,暫未使用),行號”。

綜合上述程序段和節的內容,即可確定源碼與目標碼的映射關(guān)系。如給定一個(gè)文件名及行號,確定其目標代碼的信息。首先根據文件名確定其在.debug節中的編譯模塊信息,從中可得該文件模塊的起始終止地址;再由其起始地址找到該編譯模塊的行記錄信息在.line節中的位置,根據行號找到行記錄,得到該行目標碼的地址范圍;由這些地址信息,可直接從目標機內存中取得目標代碼,也可結合程序段信息從目標文件的程序段中取得該行所對應的目標代碼指令內容。調試器利用地址與指令信息就可以查看、修改、執行相應目標代碼,供用戶(hù)進(jìn)行調試。

linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)

上一頁(yè) 1 2 下一頁(yè)

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>