版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第十五講第十五講 - - 嵌入式程序編譯及嵌入式程序編譯及運(yùn)行過(guò)程分析運(yùn)行過(guò)程分析朱光明朱光明西安電子科技大學(xué)軟件學(xué)院西安電子科技大學(xué)軟件學(xué)院編譯過(guò)程分析編譯過(guò)程分析目標(biāo)文件分析目標(biāo)文件分析運(yùn)行過(guò)程分析運(yùn)行過(guò)程分析2022-4-232西安電子科技大學(xué)軟件學(xué)院3西安電子科技大學(xué)軟件學(xué)院4編譯預(yù)處理編譯預(yù)處理q在預(yù)處理階段,輸入的是C語(yǔ)言的源文件,主要處理源文件中的#ifdef、#include和#define等命令,生成中間文件*.i。q命令示例:gcc -E test.c o test.i編譯編譯q在編譯階段,輸入的是中間文件*.i,編譯后生成匯編語(yǔ)言文件*.s。q命令示例:gcc -S te
2、st.i o test.s西安電子科技大學(xué)軟件學(xué)院5匯編匯編q在匯編階段,將輸入的匯編文件*.s轉(zhuǎn)換成機(jī)器語(yǔ)言*.o。q命令示例:gcc -c test.s o test.o鏈接鏈接q在鏈接階段,將*.o文件及其它庫(kù)文件匯集成一個(gè)可執(zhí)行的二進(jìn)制文件。q命令示例:gcc test.o -o test西安電子科技大學(xué)軟件學(xué)院6西安電子科技大學(xué)軟件學(xué)院7C/C+C/C+源文件源文件cc1/g+cc1/g+頭文件頭文件匯編文件匯編文件asas目標(biāo)文件目標(biāo)文件生成庫(kù)生成庫(kù)連接命令文件連接命令文件可重定位模塊可重定位模塊ldldarar用戶庫(kù)用戶庫(kù)庫(kù)列表庫(kù)列表可執(zhí)行程序可執(zhí)行程序編譯編譯q編譯時(shí),gcc首
3、先調(diào)用預(yù)處理程序(cpp)對(duì)輸入的源程序進(jìn)行處理,然后調(diào)用cc1 將預(yù)處理后的程序編譯成匯編代碼匯編匯編qas將匯編語(yǔ)言程序轉(zhuǎn)換為ELF (Executable and Linking Format,執(zhí)行時(shí)鏈接文件格式)格式的可重定位目標(biāo)代碼,這些目標(biāo)代碼同其它目標(biāo)模塊或函數(shù)庫(kù)易于定位和鏈接。qas產(chǎn)生一個(gè)交叉參考表和一個(gè)標(biāo)準(zhǔn)的符號(hào)表,產(chǎn)生的代碼和數(shù)據(jù)能夠放在多個(gè)區(qū) (Section)中。西安電子科技大學(xué)軟件學(xué)院8庫(kù)管理庫(kù)管理qar將多個(gè)可重定位的目標(biāo)模塊歸檔為一個(gè)函數(shù)庫(kù)文件。q采用函數(shù)庫(kù)文件,應(yīng)用程序能夠從該文件中自動(dòng)裝載要參考的函數(shù)模塊,同時(shí)將應(yīng)用程序中頻繁調(diào)用的函數(shù)放入函數(shù)庫(kù)文件中,易于
4、應(yīng)用程序的開(kāi)發(fā)管理。鏈接鏈接qld根據(jù)鏈接定位文件Linkcmds中的代碼區(qū)、數(shù)據(jù)區(qū)、BSS區(qū)和棧區(qū)等定位信息,將可重定位的目標(biāo)模塊鏈接成一個(gè)單一的、絕對(duì)定位的目標(biāo)程序。西安電子科技大學(xué)軟件學(xué)院9西安電子科技大學(xué)軟件學(xué)院10目標(biāo)文件中的內(nèi)容至少有編譯后的目標(biāo)文件中的內(nèi)容至少有編譯后的機(jī)器指令代碼機(jī)器指令代碼、數(shù)據(jù)、數(shù)據(jù)。還包括了鏈接時(shí)所須要的一些信息,比。還包括了鏈接時(shí)所須要的一些信息,比如如符號(hào)表、調(diào)試信息、字符串符號(hào)表、調(diào)試信息、字符串等。等。符號(hào)修飾標(biāo)準(zhǔn)、變量?jī)?nèi)層布局、函數(shù)調(diào)用方式等符號(hào)修飾標(biāo)準(zhǔn)、變量?jī)?nèi)層布局、函數(shù)調(diào)用方式等這些跟可執(zhí)行代碼二進(jìn)制兼容性相關(guān)的內(nèi)容稱為這些跟可執(zhí)行代碼二進(jìn)制
5、兼容性相關(guān)的內(nèi)容稱為ABIABI(Application Binary InterfaceApplication Binary Interface)。常見(jiàn)的)。常見(jiàn)的ABIABI格式:格式:西安電子科技大學(xué)軟件學(xué)院11PEELF 一般目標(biāo)文件將這些信息按不同的屬性,以“節(jié)”(Section)的形式存儲(chǔ),有時(shí)候也叫“段”(Segment)。A.outA.outq不容易支持動(dòng)態(tài)鏈接q不支持C+語(yǔ)言COFFCOFFq非擴(kuò)展版本不支持C+和動(dòng)態(tài)鏈接ELFELFq支持C+q支持動(dòng)態(tài)鏈接q允許交叉編譯和交叉鏈接西安電子科技大學(xué)軟件學(xué)院12可重定位可重定位q編譯器和匯編器創(chuàng)建q運(yùn)行前需要被鏈接器處理可執(zhí)行可
6、執(zhí)行q完成了所有重定位工作和符號(hào)解析q除了運(yùn)行時(shí)解析的共享庫(kù)符號(hào)共享庫(kù)共享庫(kù)q鏈接器需要的符號(hào)信息q運(yùn)行時(shí)可以直接執(zhí)行的代碼西安電子科技大學(xué)軟件學(xué)院13西安電子科技大學(xué)軟件學(xué)院14一個(gè)典型的一個(gè)典型的ELFELF可重定位文件可重定位文件qELF文件頭部q一系列的節(jié)q節(jié)頭部表q段頭部(可選的)第一部分:第一部分:1616個(gè)字節(jié)的個(gè)字節(jié)的e_idente_ident,描述了生成該,描述了生成該文件的系統(tǒng)的字的大小文件的系統(tǒng)的字的大小和字節(jié)順序,獨(dú)立于和字節(jié)順序,獨(dú)立于ELFELF文件中的其它信息文件中的其它信息。q幻數(shù):4個(gè)字節(jié),0 x7f、E、L、Fqclass:1個(gè)字節(jié),1=32位,2=64位
7、qdata:1個(gè)字節(jié),1=小端,2=大端qversion:1個(gè)字節(jié),1=當(dāng)前版本qpad:剩余字節(jié)第二部分:幫助鏈接器第二部分:幫助鏈接器語(yǔ)法分析、解釋目標(biāo)文語(yǔ)法分析、解釋目標(biāo)文件的信息件的信息qe_type:1=重定位、2=可執(zhí)行、3=共享庫(kù)qe_machine:0=No machine、1=AT&T WE 32100、2=sparc、3=Intel 80386qe_version:0=Invalid version、1=Current versionqe_ehsize:ELF頭部的大小 (以字節(jié)為單位)qe_flags:體系結(jié)構(gòu)相關(guān)標(biāo)志,總是0可執(zhí)行文件相關(guān)的表項(xiàng)可執(zhí)行文件相關(guān)的表
8、項(xiàng)qe_entry:程序的入口地址,如無(wú)入口地址則該項(xiàng)為0qe_phoff:程序頭部表偏移量,若無(wú)則為0qe_phentsize:程序頭部表中單個(gè)entry的大小qe_phnum:程序頭部表中的entry個(gè)數(shù)重定位文件相關(guān)的表項(xiàng)重定位文件相關(guān)的表項(xiàng)qe_shoff:節(jié)頭部表偏移量,若無(wú)則為0qe_shentsize:節(jié)頭部表中單個(gè)entry的大小qe_shnum:節(jié)頭部表中的entry個(gè)數(shù)qe_shstrndx:節(jié)名字串表所在的節(jié)index.text.text:已編譯程序的機(jī)器代碼:已編譯程序的機(jī)器代碼,具有,具有ALLOCALLOC和和EXECINSTREXECINSTR屬屬性的性的PROG
9、BITSPROGBITS類型區(qū)段,相類型區(qū)段,相當(dāng)于當(dāng)于a.outa.out的文本段的文本段qPROGBITS類型:程序內(nèi)容,包括代碼,數(shù)據(jù)和調(diào)試器信息qALLOC屬性:程序加載時(shí)該區(qū) 段需要占用內(nèi)存空間qEXECINSTR屬性:該區(qū)段包含可執(zhí)行的機(jī)器代碼. .rodatarodata:只讀數(shù)據(jù),具有:只讀數(shù)據(jù),具有ALLOCALLOC屬性和屬性和PROGBITSPROGBITS類型類型區(qū)段。由于是只讀數(shù)據(jù),因此區(qū)段。由于是只讀數(shù)據(jù),因此沒(méi)有沒(méi)有WRITEWRITE屬性。屬性。.data.data:具有:具有ALLOCALLOC和和WRITEWRITE屬性的屬性的PROGBITSPROGBIT
10、S類型區(qū)段。類型區(qū)段。對(duì)應(yīng)于對(duì)應(yīng)于a.outa.out的數(shù)據(jù)段的數(shù)據(jù)段. .bssbss:具有:具有ALLOCALLOC和和WRITEWRITE屬屬性的性的NOBITSNOBITS類型區(qū)段。類型區(qū)段。BSSBSS區(qū)區(qū)段在文件中沒(méi)有分配空間,因段在文件中沒(méi)有分配空間,因此是此是NOBITSNOBITS類型,但由于會(huì)類型,但由于會(huì)在運(yùn)行時(shí)分配空間,所以具有在運(yùn)行時(shí)分配空間,所以具有ALLOCALLOC屬性。屬性。. .symsym:符號(hào)表。存放程序中定:符號(hào)表。存放程序中定義和引用的義和引用的函數(shù)和全局變量函數(shù)和全局變量的的信息。信息。.rel.txt.rel.txt:一個(gè):一個(gè).text.tex
11、t節(jié)中位置的節(jié)中位置的列表,當(dāng)鏈接器把這個(gè)目標(biāo)文列表,當(dāng)鏈接器把這個(gè)目標(biāo)文件和其它文件結(jié)合時(shí),需要修件和其它文件結(jié)合時(shí),需要修改這些位置。改這些位置。. .rel.datarel.data:一個(gè):一個(gè).data.data節(jié)中位置節(jié)中位置的列表,當(dāng)鏈接器把這個(gè)目標(biāo)的列表,當(dāng)鏈接器把這個(gè)目標(biāo)文件和其它文件結(jié)合時(shí),需要文件和其它文件結(jié)合時(shí),需要修改這些位置。修改這些位置。.line.line:源碼到目標(biāo)代碼行號(hào)映:源碼到目標(biāo)代碼行號(hào)映射,只有是使用射,只有是使用-g-g選項(xiàng)調(diào)用進(jìn)選項(xiàng)調(diào)用進(jìn)行編譯時(shí)才會(huì)得到這張表行編譯時(shí)才會(huì)得到這張表.debug.debug:一個(gè)調(diào)試用的符號(hào)表:一個(gè)調(diào)試用的符號(hào)表,包
12、含了定義的局部變量和類,包含了定義的局部變量和類型、全局變量的定義和引用型、全局變量的定義和引用. .strtabstrtab:一個(gè)字符串表,其內(nèi):一個(gè)字符串表,其內(nèi)容包括容包括. .symtabsymtab和和.debug.debug節(jié)中節(jié)中的符號(hào)表,以及節(jié)頭部中的節(jié)的符號(hào)表,以及節(jié)頭部中的節(jié)名字。名字。sh_namesh_name:節(jié)名在節(jié)字串表:節(jié)名在節(jié)字串表中的索引中的索引sh_typesh_type:節(jié)的屬性:節(jié)的屬性sh_flagssh_flags:節(jié)的標(biāo)志:節(jié)的標(biāo)志sh_addrsh_addr:若該節(jié)可加載,:若該節(jié)可加載,則為該節(jié)第一個(gè)字節(jié)的地址則為該節(jié)第一個(gè)字節(jié)的地址,否則為
13、,否則為0 0sh_offsetsh_offset:節(jié)起始點(diǎn)在文件:節(jié)起始點(diǎn)在文件中的起始位置中的起始位置sh_sizesh_size:節(jié)大?。ㄗ止?jié)為單:節(jié)大?。ㄗ止?jié)為單位)位) sh_linksh_link:相關(guān)信息對(duì)應(yīng)的節(jié):相關(guān)信息對(duì)應(yīng)的節(jié)號(hào),若沒(méi)有則為號(hào),若沒(méi)有則為0 0sh_infosh_info:節(jié)的其它信息:節(jié)的其它信息sh_alignsh_align:節(jié)的對(duì)齊粒度:節(jié)的對(duì)齊粒度sh_entsizesh_entsize:若節(jié)為一個(gè)表:若節(jié)為一個(gè)表時(shí)表項(xiàng)的大小時(shí)表項(xiàng)的大小 注:段頭部表不一定在ELF頭部后,節(jié)頭部也不一定在最后ELFELF段頭部表項(xiàng)段頭部表項(xiàng)r_offsetr_off
14、set的含義:的含義:q可重定位文件:從節(jié)開(kāi)始到受重定位影響的區(qū)域首部的偏移量q可執(zhí)行文件或共享庫(kù):受重定位影響的單元的虛擬地址r_infor_info的含義:的含義:q24位的symbol域:重定位項(xiàng)在符號(hào)表中的索引q8位的type域:指示如何進(jìn)行重定位 當(dāng)加載器運(yùn)行時(shí),創(chuàng)建了右圖所示的存儲(chǔ)器映像。 在可執(zhí)行文件中段頭表的指導(dǎo)下,將可執(zhí)行文件中的相關(guān)內(nèi)容拷貝到代碼和數(shù)據(jù)段。西安電子科技大學(xué)軟件學(xué)院38#include#includeint main(int argc, char * argv)int *p = (int *)malloc(sizeof(int);scanf(“%d”,p);p
15、rintf(“%d”,*p);free(p); return 0; 在main之前,main函數(shù)的兩個(gè)參數(shù)(argc和argv)已被正確傳了進(jìn)來(lái)。堆和I/O的初始化已經(jīng)完成。#include#includeusing namespace std; string v; / v的構(gòu)造函數(shù)已經(jīng)在main之前被調(diào)用了int foo() int n; scanf(%d,&n); return n;const int a = foo(); / a的初始化和foo函數(shù)調(diào)用也在main前進(jìn)行int main() printf(%dn,a); return 0;操作系統(tǒng)在創(chuàng)建進(jìn)程后,把控制權(quán)交到了程序的
16、入口操作系統(tǒng)在創(chuàng)建進(jìn)程后,把控制權(quán)交到了程序的入口,這個(gè)入口往往是運(yùn)行庫(kù)中的某個(gè),這個(gè)入口往往是運(yùn)行庫(kù)中的某個(gè)入口函數(shù)入口函數(shù)。入口函數(shù)對(duì)運(yùn)行庫(kù)和程序運(yùn)行環(huán)境進(jìn)行入口函數(shù)對(duì)運(yùn)行庫(kù)和程序運(yùn)行環(huán)境進(jìn)行初始化初始化,包括,包括堆、堆、I/OI/O、線程、全局變量構(gòu)造,等等。、線程、全局變量構(gòu)造,等等。入口函數(shù)在完成初始化之后,入口函數(shù)在完成初始化之后,調(diào)用調(diào)用mainmain函數(shù)函數(shù),正式開(kāi),正式開(kāi)始執(zhí)行程序主體部分。始執(zhí)行程序主體部分。mainmain函數(shù)執(zhí)行完畢之后,返回到入口函數(shù),入口函數(shù)函數(shù)執(zhí)行完畢之后,返回到入口函數(shù),入口函數(shù)進(jìn)行進(jìn)行清理工作清理工作,包括全局變量析構(gòu)、堆銷毀、關(guān)閉,包括全
17、局變量析構(gòu)、堆銷毀、關(guān)閉I/OI/O等,然后進(jìn)行系統(tǒng)調(diào)用結(jié)束進(jìn)程。等,然后進(jìn)行系統(tǒng)調(diào)用結(jié)束進(jìn)程。C C程序的入口點(diǎn),是程序的入口點(diǎn),是符號(hào)符號(hào)_start_start的地址的地址。在。在_start_start地址地址處的啟動(dòng)代碼(處的啟動(dòng)代碼(startup_codestartup_code)是在目標(biāo)文件)是在目標(biāo)文件crt1.ocrt1.o中中定義的,對(duì)所有的定義的,對(duì)所有的C C程序都一樣。程序都一樣。下圖展示了啟動(dòng)代碼的調(diào)用序列(但省略了將函數(shù)參下圖展示了啟動(dòng)代碼的調(diào)用序列(但省略了將函數(shù)參數(shù)壓入棧的代碼),數(shù)壓入棧的代碼),atexitatexit注冊(cè)程序終止時(shí)應(yīng)調(diào)用的注冊(cè)程序終止時(shí)
18、應(yīng)調(diào)用的程序,程序,exitexit函數(shù)調(diào)用函數(shù)調(diào)用atexitatexit注冊(cè)的代碼,而后從注冊(cè)的代碼,而后從_exit_exit返返回回osos。當(dāng)目標(biāo)文件和共享庫(kù)一起編譯時(shí)就能生成使當(dāng)目標(biāo)文件和共享庫(kù)一起編譯時(shí)就能生成使用共享庫(kù)的可執(zhí)行程序。用共享庫(kù)的可執(zhí)行程序。對(duì)于使用共享庫(kù)的可執(zhí)行程序,文件中會(huì)有對(duì)于使用共享庫(kù)的可執(zhí)行程序,文件中會(huì)有一一. .interpinterp節(jié),該節(jié)包含了動(dòng)態(tài)鏈接器的路徑。節(jié),該節(jié)包含了動(dòng)態(tài)鏈接器的路徑。加載器將控制傳遞給動(dòng)態(tài)鏈接器而不是程序加載器將控制傳遞給動(dòng)態(tài)鏈接器而不是程序,動(dòng)態(tài)鏈接器完成共享庫(kù)的重定位。最后,動(dòng)態(tài)鏈接器完成共享庫(kù)的重定位。最后,將控制傳遞給應(yīng)用程序。將控制傳遞給應(yīng)用程序。動(dòng)態(tài)鏈接器執(zhí)行以下步驟完成從程序到進(jìn)程動(dòng)態(tài)鏈接器執(zhí)行以下步驟完成從程序到進(jìn)程映象:映象:q1.分析可執(zhí)行文件中的動(dòng)態(tài)信息section,決定需要哪些共享庫(kù)。q2.定位和映射(map)那些共享庫(kù),并且分析它們動(dòng)態(tài)信息section決定是否需要附加的共享庫(kù)。q3.為可執(zhí)行程序和那些需要的共享庫(kù)執(zhí)行重定位。q4.調(diào)用共享庫(kù)中提供的初始化函數(shù)并且安排共享庫(kù)提供的清除(cleanu
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 專業(yè)保潔服務(wù)定制協(xié)議范本(2024版)版B版
- 2024年規(guī)范版回遷房屋交易協(xié)議版
- 2024年短期融資過(guò)橋擔(dān)保合同版B版
- 萬(wàn)達(dá)商業(yè)廣場(chǎng)2024年物業(yè)運(yùn)營(yíng)管理合同版
- 2025年度大棚建筑智能監(jiān)控系統(tǒng)開(kāi)發(fā)與應(yīng)用合同3篇
- 專業(yè)定制股東合作框架合同(2024年版)一
- 長(zhǎng)春醫(yī)學(xué)高等??茖W(xué)?!顿Y本運(yùn)營(yíng)與公司治理》2023-2024學(xué)年第一學(xué)期期末試卷
- 2024年甲方與乙方設(shè)備租賃合同
- 服裝行業(yè)顧問(wèn)工作總結(jié)
- 2024最簡(jiǎn)單的汽油購(gòu)銷合同范本
- OCT青光眼及視野報(bào)告
- 人音版小學(xué)音樂(lè)四年級(jí)下冊(cè)課程綱要
- 初中語(yǔ)文人教七年級(jí)上冊(cè)朝花夕拾學(xué)生導(dǎo)讀單
- 山西鄉(xiāng)寧焦煤集團(tuán)臺(tái)頭煤焦公司礦井兼并重組整合項(xiàng)目初步設(shè)計(jì)安全專篇
- 弱電工程自檢報(bào)告
- 民法案例分析教程(第五版)完整版課件全套ppt教學(xué)教程最全電子教案
- DB33∕T 628.1-2021 交通建設(shè)工程工程量清單計(jì)價(jià)規(guī)范 第1部分:公路工程
- 國(guó)家電網(wǎng)有限公司十八項(xiàng)電網(wǎng)重大反事故措施(修訂版)
- (完整版)八年級(jí)上綜合性學(xué)習(xí)-我們的互聯(lián)網(wǎng)時(shí)代-練習(xí)卷(含答案)
- 吉林省自學(xué)考試畢業(yè)生登記表
- 切線長(zhǎng)定理、弦切角定理、切割線定理、相交弦定理93336
評(píng)論
0/150
提交評(píng)論