日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁(yè) > 智能硬件 > 智能硬件
[導(dǎo)讀]c編譯器在c程序編寫過(guò)程中發(fā)揮著不可替代的作用,對(duì)于c編譯器,相關(guān)人員應(yīng)當(dāng)給予足夠重視。前文中,小編曾介紹過(guò)基于gcc c編譯器的程序插裝技術(shù),但這并非c編譯器插裝技術(shù)的全面貌。本文,為基于gcc c編譯器程序插裝技術(shù)下篇,一起繼續(xù)來(lái)了解這項(xiàng)技術(shù)吧。

c編譯器在c程序編寫過(guò)程中發(fā)揮著不可替代的作用,對(duì)于c編譯器,相關(guān)人員應(yīng)當(dāng)給予足夠重視。前文中,小編曾介紹過(guò)基于gcc c編譯器的程序插裝技術(shù),但這并非c編譯器插裝技術(shù)的全面貌。本文,為基于gcc c編譯器程序插裝技術(shù)下篇,一起繼續(xù)來(lái)了解這項(xiàng)技術(shù)吧。

一、基于GCC的程序插裝技術(shù)

根據(jù)插裝測(cè)試的要求,需要在函數(shù)開始時(shí)為每個(gè)參數(shù)調(diào)用鉤子函數(shù),并用鉤子函數(shù)的返回值更新參數(shù)的值;同時(shí),將被插裝函數(shù)的名稱壓入函數(shù)本地棧內(nèi),作為該函數(shù)的一個(gè)匿名本地變量,只用于傳遞給鉤子函數(shù)。從上面列出的tree_rest_of_compilation函數(shù)源碼得知,負(fù)責(zé)建立被編譯函數(shù)參數(shù)和返回值的函數(shù)是expand_function_start,定義是在文件function.c中。expand_function_start中處理函數(shù)參數(shù)和返回值的函數(shù)是assign_pARMs,這是需要特別關(guān)注的函數(shù)。以下是該函數(shù)簡(jiǎn)化的偽碼:

斜體加粗的部分是增加的代碼。在for循環(huán)前,獲得當(dāng)前編譯的函數(shù)名(見源碼中①位置);

但暫時(shí)不能輸出到函數(shù)的RTL鏈中,因?yàn)楸镜貤R谒袇?shù)傳遞完畢才完全建立起來(lái)。在for循環(huán)體結(jié)束前,記錄下函數(shù)參數(shù)的一份拷貝(見②),最后調(diào)用。insert_function_name_local函數(shù),將當(dāng)前函數(shù)名插入本地棧,并且修正棧指針(見③)。經(jīng)過(guò)以上修改,得到了插裝所需的所有信息,包括函數(shù)參數(shù)和函數(shù)名稱的RTX表示。GCC將函數(shù)編譯后生成的RTX表示以鏈表形式組織,最后一次性把這個(gè)RTX鏈表輸出為后端平臺(tái)的匯編碼。完成這項(xiàng)工作的是rest_of_compilation函數(shù),所以在調(diào)用rest_of_complilation函數(shù)前插入我們的RTX,最終完成插裝,由函數(shù)inject_rtl負(fù)責(zé)完成。下面是inject_rtl的主要代碼:

二、APCS與程序插裝實(shí)現(xiàn)

編譯器必須以一套統(tǒng)一的方法編譯函數(shù)的定義和調(diào)用過(guò)程,才能確保不同語(yǔ)言編寫的函數(shù)能相互調(diào)用。規(guī)定這些細(xì)節(jié)的便叫作“函數(shù)調(diào)用規(guī)范(Procedure Call Stand-ard)”。ARM體系結(jié)構(gòu)定義了自己的函數(shù)調(diào)用規(guī)范——ARM函數(shù)調(diào)用標(biāo)準(zhǔn)(ARM Procedure Call Standard,APCS)。雖然APCS不是強(qiáng)制性的,但實(shí)現(xiàn)APCS并不困難,而且可獲得統(tǒng)一的二進(jìn)制兼容的好處,所以大部分的編譯器都實(shí)現(xiàn)了APCS,其中包括GCC。

APCS中函數(shù)傳遞參數(shù)的定義如下:

◇前4個(gè)整數(shù)實(shí)參(或者更少)被裝載到r0~r3。前4個(gè)整數(shù)實(shí)參(或者更少)被裝載到r0~r3。

◇前4個(gè)浮點(diǎn)實(shí)參(或者更少)被裝載到f0~f3。

◇如果參數(shù)為雙字(8字節(jié)),就必須從偶數(shù)寄存器開始放置。

◇如果一個(gè)參數(shù)不能完全放入寄存器中,則超過(guò)的那部分拷貝到棧中。

其他任何實(shí)參(如果有的話)存儲(chǔ)在內(nèi)存中,用進(jìn)入函數(shù)時(shí)緊接在sp值上面的字來(lái)指向。換句話說(shuō),其余的參數(shù)被壓入棧頂。所以,要想簡(jiǎn)單,最好定義接受4個(gè)或更少的整數(shù)參數(shù)的函數(shù)。

本文所述的插入函數(shù)只有兩個(gè)整型形參,所以調(diào)用時(shí)只需將兩個(gè)實(shí)參分別傳入ro和rl。GCC提供emit_li-brary_call函數(shù)用來(lái)生成函數(shù)調(diào)用的RTL碼,GCC將按照APCS產(chǎn)生正確的函數(shù)調(diào)用匯編碼。函數(shù)定義在calls.c中,原型為:

插入所需函數(shù)后,需要將返回值賦值給對(duì)應(yīng)的被插裝函數(shù)的形參。以下是插入函數(shù)insert_parms_test_function的完整代碼:

三、實(shí)例

為便于檢查插裝效果,用經(jīng)過(guò)修改的GCC編譯一段簡(jiǎn)單的C語(yǔ)言程序。該程序?yàn)橐粋€(gè)獨(dú)立函數(shù)foo,接受兩個(gè)整數(shù)類型的參數(shù)。具體代碼如下:

從GCC輸出的匯編碼可以看到,foo函數(shù)的兩個(gè)參數(shù)都經(jīng)過(guò)鉤子函數(shù)pt_hook_partns的處理更新;在pt_hook_parms函數(shù)內(nèi),可以根據(jù)測(cè)試算法返回不同的邊界值,從而達(dá)到測(cè)試的目的。依照此方法,一個(gè)實(shí)際程序經(jīng)過(guò)插裝后,在ARM模擬器上順利運(yùn)行,并取得預(yù)期的測(cè)試效果。

四、結(jié)語(yǔ)

本文詳細(xì)地論述了修改GCC增加插裝功能的實(shí)現(xiàn)方法。按照這樣的思路,成功地實(shí)現(xiàn)了基于ARM7芯片的嵌入式系統(tǒng)的動(dòng)態(tài)參數(shù)邊界測(cè)試,達(dá)到了預(yù)期的效果。本文所述的插裝函數(shù)比較簡(jiǎn)單,沒有區(qū)分參數(shù)的類型,所有參數(shù)均按照一個(gè)字大小來(lái)處理;下一步的工作是細(xì)分參數(shù)不同類型,插裝不同的處理函數(shù)。作為一種通用的插裝方法,在此摹礎(chǔ)上。通過(guò)識(shí)別不同的插裝點(diǎn)和插裝不同的函數(shù),可以實(shí)現(xiàn)函數(shù)調(diào)用棧檢查,程序覆蓋率測(cè)試,獲取函數(shù)實(shí)際執(zhí)行時(shí)間等需要插裝技術(shù)作為基礎(chǔ)的功能。

以上便是小編此次為大家?guī)?lái)的所有內(nèi)容,希望大家喜歡,have a nice day!

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

如果你是在Linux下做開發(fā),你就必須知道Makefile是什么東西,如果不知道那就可以說(shuō)你不是一個(gè)合格的Linux開發(fā)工程師,因?yàn)镸akefile是必備的一項(xiàng)技能。那么,Makefile到底有什么作用呢?首先,gcc大...

關(guān)鍵字: Linux Makefile gcc

眾所周知,LLVM的Clang C / C ++編譯器比GCC提供更快的編譯速度。 但是,新版本的GCC中的編譯速度有所提高。

關(guān)鍵字: gcc Linux llvm

上篇文章中,小編對(duì)Turbo c編譯器已做部分介紹。本文中,小編將對(duì)Turbo c編譯器余下內(nèi)容加以講解。如果你對(duì)c編譯器具有興趣,不妨繼續(xù)往下閱讀哦。

關(guān)鍵字: c編譯器 turbo 指數(shù)

為增進(jìn)大家對(duì)c編譯器的認(rèn)識(shí),本文將對(duì)Turbo C c編譯器予以講解。如果你對(duì)c編譯器具有興趣,不妨繼續(xù)往下閱讀哦。

關(guān)鍵字: c編譯器 turbo 指數(shù)

本文中,小編將對(duì)c編譯器和c編輯器的區(qū)別予以介紹。如果你對(duì)c編譯器具有興趣,不妨繼續(xù)往下閱讀哦。

關(guān)鍵字: c編譯器 指數(shù) c編輯器

最近發(fā)布的 GCC 10 編譯器已對(duì) C++20 的主要功能協(xié)程(Co-Routines)進(jìn)行了初始支持,但是除非顯式地開啟該選項(xiàng),否則并不會(huì)啟用此功能。當(dāng) GCC 10 在 C++20 模式(std

關(guān)鍵字: gcc

許多朋友經(jīng)?;煜齝編譯器和c編輯器,注意,c編譯器的作用在于編譯,而c編輯器在于編寫代碼。對(duì)于c編譯器,小編曾帶來(lái)諸多文章。但有網(wǎng)友提問(wèn),有沒有較為推薦的c編譯器。為解決大家的疑問(wèn),本文將對(duì)6款c編譯器予以介紹,大家可以...

關(guān)鍵字: c編譯器 指數(shù) 編譯器

c編譯器每天都在被使用,但對(duì)c編譯器十分了解的人卻不多,而對(duì)c編譯器編譯過(guò)程有所認(rèn)知的朋友更是少之又少。在上篇文章中,小編對(duì)c編譯器的工作過(guò)程有所講解。本文中,為繼續(xù)增進(jìn)大家對(duì)c編譯器的講解,將對(duì)編譯器工作過(guò)程的余下步驟...

關(guān)鍵字: c編譯器 指數(shù) 編譯器

c編譯器的問(wèn)世是程序界的里程碑之一,沒有c編譯器,c程序?qū)o(wú)法運(yùn)行。由此可見,c編譯器尤為重要。為增進(jìn)大家對(duì)c編譯器的了解,本文將帶來(lái)c編譯器的通識(shí)篇,以使大家能夠了解編譯器的運(yùn)行過(guò)程。此外,本文僅為上篇,剩余內(nèi)容將在后...

關(guān)鍵字: c編譯器 指數(shù) 編譯器

對(duì)于c編譯器,很多朋友均有所了解。往期文章中,小編為大家?guī)?lái)過(guò)諸多c編譯器文章。在這篇c編譯器相關(guān)文章中,小編將介紹如何基于SDCC c編譯器開發(fā)微控制器。如果你對(duì)c編譯器的應(yīng)用同樣存在興趣,不妨繼續(xù)往下閱讀哦。

關(guān)鍵字: c編譯器 sdcc 微控制器 指數(shù)
關(guān)閉