版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、第十五講第十五講 - - 嵌入式程序編譯及嵌入式程序編譯及運行過程分析運行過程分析朱光明朱光明西安電子科技大學軟件學院西安電子科技大學軟件學院編譯過程分析編譯過程分析目標文件分析目標文件分析運行過程分析運行過程分析2022-4-232西安電子科技大學軟件學院3西安電子科技大學軟件學院4編譯預處理編譯預處理q在預處理階段,輸入的是C語言的源文件,主要處理源文件中的#ifdef、#include和#define等命令,生成中間文件*.i。q命令示例:gcc -E test.c o test.i編譯編譯q在編譯階段,輸入的是中間文件*.i,編譯后生成匯編語言文件*.s。q命令示例:gcc -S te
2、st.i o test.s西安電子科技大學軟件學院5匯編匯編q在匯編階段,將輸入的匯編文件*.s轉換成機器語言*.o。q命令示例:gcc -c test.s o test.o鏈接鏈接q在鏈接階段,將*.o文件及其它庫文件匯集成一個可執(zhí)行的二進制文件。q命令示例:gcc test.o -o test西安電子科技大學軟件學院6西安電子科技大學軟件學院7C/C+C/C+源文件源文件cc1/g+cc1/g+頭文件頭文件匯編文件匯編文件asas目標文件目標文件生成庫生成庫連接命令文件連接命令文件可重定位模塊可重定位模塊ldldarar用戶庫用戶庫庫列表庫列表可執(zhí)行程序可執(zhí)行程序編譯編譯q編譯時,gcc首
3、先調用預處理程序(cpp)對輸入的源程序進行處理,然后調用cc1 將預處理后的程序編譯成匯編代碼匯編匯編qas將匯編語言程序轉換為ELF (Executable and Linking Format,執(zhí)行時鏈接文件格式)格式的可重定位目標代碼,這些目標代碼同其它目標模塊或函數(shù)庫易于定位和鏈接。qas產(chǎn)生一個交叉參考表和一個標準的符號表,產(chǎn)生的代碼和數(shù)據(jù)能夠放在多個區(qū) (Section)中。西安電子科技大學軟件學院8庫管理庫管理qar將多個可重定位的目標模塊歸檔為一個函數(shù)庫文件。q采用函數(shù)庫文件,應用程序能夠從該文件中自動裝載要參考的函數(shù)模塊,同時將應用程序中頻繁調用的函數(shù)放入函數(shù)庫文件中,易于
4、應用程序的開發(fā)管理。鏈接鏈接qld根據(jù)鏈接定位文件Linkcmds中的代碼區(qū)、數(shù)據(jù)區(qū)、BSS區(qū)和棧區(qū)等定位信息,將可重定位的目標模塊鏈接成一個單一的、絕對定位的目標程序。西安電子科技大學軟件學院9西安電子科技大學軟件學院10目標文件中的內容至少有編譯后的目標文件中的內容至少有編譯后的機器指令代碼機器指令代碼、數(shù)據(jù)、數(shù)據(jù)。還包括了鏈接時所須要的一些信息,比。還包括了鏈接時所須要的一些信息,比如如符號表、調試信息、字符串符號表、調試信息、字符串等。等。符號修飾標準、變量內層布局、函數(shù)調用方式等符號修飾標準、變量內層布局、函數(shù)調用方式等這些跟可執(zhí)行代碼二進制兼容性相關的內容稱為這些跟可執(zhí)行代碼二進制
5、兼容性相關的內容稱為ABIABI(Application Binary InterfaceApplication Binary Interface)。常見的)。常見的ABIABI格式:格式:西安電子科技大學軟件學院11PEELF 一般目標文件將這些信息按不同的屬性,以“節(jié)”(Section)的形式存儲,有時候也叫“段”(Segment)。A.outA.outq不容易支持動態(tài)鏈接q不支持C+語言COFFCOFFq非擴展版本不支持C+和動態(tài)鏈接ELFELFq支持C+q支持動態(tài)鏈接q允許交叉編譯和交叉鏈接西安電子科技大學軟件學院12可重定位可重定位q編譯器和匯編器創(chuàng)建q運行前需要被鏈接器處理可執(zhí)行可
6、執(zhí)行q完成了所有重定位工作和符號解析q除了運行時解析的共享庫符號共享庫共享庫q鏈接器需要的符號信息q運行時可以直接執(zhí)行的代碼西安電子科技大學軟件學院13西安電子科技大學軟件學院14一個典型的一個典型的ELFELF可重定位文件可重定位文件qELF文件頭部q一系列的節(jié)q節(jié)頭部表q段頭部(可選的)第一部分:第一部分:1616個字節(jié)的個字節(jié)的e_idente_ident,描述了生成該,描述了生成該文件的系統(tǒng)的字的大小文件的系統(tǒng)的字的大小和字節(jié)順序,獨立于和字節(jié)順序,獨立于ELFELF文件中的其它信息文件中的其它信息。q幻數(shù):4個字節(jié),0 x7f、E、L、Fqclass:1個字節(jié),1=32位,2=64位
7、qdata:1個字節(jié),1=小端,2=大端qversion:1個字節(jié),1=當前版本qpad:剩余字節(jié)第二部分:幫助鏈接器第二部分:幫助鏈接器語法分析、解釋目標文語法分析、解釋目標文件的信息件的信息qe_type:1=重定位、2=可執(zhí)行、3=共享庫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:體系結構相關標志,總是0可執(zhí)行文件相關的表項可執(zhí)行文件相關的表
8、項qe_entry:程序的入口地址,如無入口地址則該項為0qe_phoff:程序頭部表偏移量,若無則為0qe_phentsize:程序頭部表中單個entry的大小qe_phnum:程序頭部表中的entry個數(shù)重定位文件相關的表項重定位文件相關的表項qe_shoff:節(jié)頭部表偏移量,若無則為0qe_shentsize:節(jié)頭部表中單個entry的大小qe_shnum:節(jié)頭部表中的entry個數(shù)qe_shstrndx:節(jié)名字串表所在的節(jié)index.text.text:已編譯程序的機器代碼:已編譯程序的機器代碼,具有,具有ALLOCALLOC和和EXECINSTREXECINSTR屬屬性的性的PROG
9、BITSPROGBITS類型區(qū)段,相類型區(qū)段,相當于當于a.outa.out的文本段的文本段qPROGBITS類型:程序內容,包括代碼,數(shù)據(jù)和調試器信息qALLOC屬性:程序加載時該區(qū) 段需要占用內存空間qEXECINSTR屬性:該區(qū)段包含可執(zhí)行的機器代碼. .rodatarodata:只讀數(shù)據(jù),具有:只讀數(shù)據(jù),具有ALLOCALLOC屬性和屬性和PROGBITSPROGBITS類型類型區(qū)段。由于是只讀數(shù)據(jù),因此區(qū)段。由于是只讀數(shù)據(jù),因此沒有沒有WRITEWRITE屬性。屬性。.data.data:具有:具有ALLOCALLOC和和WRITEWRITE屬性的屬性的PROGBITSPROGBIT
10、S類型區(qū)段。類型區(qū)段。對應于對應于a.outa.out的數(shù)據(jù)段的數(shù)據(jù)段. .bssbss:具有:具有ALLOCALLOC和和WRITEWRITE屬屬性的性的NOBITSNOBITS類型區(qū)段。類型區(qū)段。BSSBSS區(qū)區(qū)段在文件中沒有分配空間,因段在文件中沒有分配空間,因此是此是NOBITSNOBITS類型,但由于會類型,但由于會在運行時分配空間,所以具有在運行時分配空間,所以具有ALLOCALLOC屬性。屬性。. .symsym:符號表。存放程序中定:符號表。存放程序中定義和引用的義和引用的函數(shù)和全局變量函數(shù)和全局變量的的信息。信息。.rel.txt.rel.txt:一個:一個.text.tex
11、t節(jié)中位置的節(jié)中位置的列表,當鏈接器把這個目標文列表,當鏈接器把這個目標文件和其它文件結合時,需要修件和其它文件結合時,需要修改這些位置。改這些位置。. .rel.datarel.data:一個:一個.data.data節(jié)中位置節(jié)中位置的列表,當鏈接器把這個目標的列表,當鏈接器把這個目標文件和其它文件結合時,需要文件和其它文件結合時,需要修改這些位置。修改這些位置。.line.line:源碼到目標代碼行號映:源碼到目標代碼行號映射,只有是使用射,只有是使用-g-g選項調用進選項調用進行編譯時才會得到這張表行編譯時才會得到這張表.debug.debug:一個調試用的符號表:一個調試用的符號表,包
12、含了定義的局部變量和類,包含了定義的局部變量和類型、全局變量的定義和引用型、全局變量的定義和引用. .strtabstrtab:一個字符串表,其內:一個字符串表,其內容包括容包括. .symtabsymtab和和.debug.debug節(jié)中節(jié)中的符號表,以及節(jié)頭部中的節(jié)的符號表,以及節(jié)頭部中的節(jié)名字。名字。sh_namesh_name:節(jié)名在節(jié)字串表:節(jié)名在節(jié)字串表中的索引中的索引sh_typesh_type:節(jié)的屬性:節(jié)的屬性sh_flagssh_flags:節(jié)的標志:節(jié)的標志sh_addrsh_addr:若該節(jié)可加載,:若該節(jié)可加載,則為該節(jié)第一個字節(jié)的地址則為該節(jié)第一個字節(jié)的地址,否則為
13、,否則為0 0sh_offsetsh_offset:節(jié)起始點在文件:節(jié)起始點在文件中的起始位置中的起始位置sh_sizesh_size:節(jié)大?。ㄗ止?jié)為單:節(jié)大?。ㄗ止?jié)為單位)位) sh_linksh_link:相關信息對應的節(jié):相關信息對應的節(jié)號,若沒有則為號,若沒有則為0 0sh_infosh_info:節(jié)的其它信息:節(jié)的其它信息sh_alignsh_align:節(jié)的對齊粒度:節(jié)的對齊粒度sh_entsizesh_entsize:若節(jié)為一個表:若節(jié)為一個表時表項的大小時表項的大小 注:段頭部表不一定在ELF頭部后,節(jié)頭部也不一定在最后ELFELF段頭部表項段頭部表項r_offsetr_off
14、set的含義:的含義:q可重定位文件:從節(jié)開始到受重定位影響的區(qū)域首部的偏移量q可執(zhí)行文件或共享庫:受重定位影響的單元的虛擬地址r_infor_info的含義:的含義:q24位的symbol域:重定位項在符號表中的索引q8位的type域:指示如何進行重定位 當加載器運行時,創(chuàng)建了右圖所示的存儲器映像。 在可執(zhí)行文件中段頭表的指導下,將可執(zhí)行文件中的相關內容拷貝到代碼和數(shù)據(jù)段。西安電子科技大學軟件學院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ù)的兩個參數(shù)(argc和argv)已被正確傳了進來。堆和I/O的初始化已經(jīng)完成。#include#includeusing namespace std; string v; / v的構造函數(shù)已經(jīng)在main之前被調用了int foo() int n; scanf(%d,&n); return n;const int a = foo(); / a的初始化和foo函數(shù)調用也在main前進行int main() printf(%dn,a); return 0;操作系統(tǒng)在創(chuàng)建進程后,把控制權交到了程序的
16、入口操作系統(tǒng)在創(chuàng)建進程后,把控制權交到了程序的入口,這個入口往往是運行庫中的某個,這個入口往往是運行庫中的某個入口函數(shù)入口函數(shù)。入口函數(shù)對運行庫和程序運行環(huán)境進行入口函數(shù)對運行庫和程序運行環(huán)境進行初始化初始化,包括,包括堆、堆、I/OI/O、線程、全局變量構造,等等。、線程、全局變量構造,等等。入口函數(shù)在完成初始化之后,入口函數(shù)在完成初始化之后,調用調用mainmain函數(shù)函數(shù),正式開,正式開始執(zhí)行程序主體部分。始執(zhí)行程序主體部分。mainmain函數(shù)執(zhí)行完畢之后,返回到入口函數(shù),入口函數(shù)函數(shù)執(zhí)行完畢之后,返回到入口函數(shù),入口函數(shù)進行進行清理工作清理工作,包括全局變量析構、堆銷毀、關閉,包括全
17、局變量析構、堆銷毀、關閉I/OI/O等,然后進行系統(tǒng)調用結束進程。等,然后進行系統(tǒng)調用結束進程。C C程序的入口點,是程序的入口點,是符號符號_start_start的地址的地址。在。在_start_start地址地址處的啟動代碼(處的啟動代碼(startup_codestartup_code)是在目標文件)是在目標文件crt1.ocrt1.o中中定義的,對所有的定義的,對所有的C C程序都一樣。程序都一樣。下圖展示了啟動代碼的調用序列(但省略了將函數(shù)參下圖展示了啟動代碼的調用序列(但省略了將函數(shù)參數(shù)壓入棧的代碼),數(shù)壓入棧的代碼),atexitatexit注冊程序終止時應調用的注冊程序終止時
18、應調用的程序,程序,exitexit函數(shù)調用函數(shù)調用atexitatexit注冊的代碼,而后從注冊的代碼,而后從_exit_exit返返回回osos。當目標文件和共享庫一起編譯時就能生成使當目標文件和共享庫一起編譯時就能生成使用共享庫的可執(zhí)行程序。用共享庫的可執(zhí)行程序。對于使用共享庫的可執(zhí)行程序,文件中會有對于使用共享庫的可執(zhí)行程序,文件中會有一一. .interpinterp節(jié),該節(jié)包含了動態(tài)鏈接器的路徑。節(jié),該節(jié)包含了動態(tài)鏈接器的路徑。加載器將控制傳遞給動態(tài)鏈接器而不是程序加載器將控制傳遞給動態(tài)鏈接器而不是程序,動態(tài)鏈接器完成共享庫的重定位。最后,動態(tài)鏈接器完成共享庫的重定位。最后,將控制傳遞給應用程序。將控制傳遞給應用程序。動態(tài)鏈接器執(zhí)行以下步驟完成從程序到進程動態(tài)鏈接器執(zhí)行以下步驟完成從程序到進程映象:映象:q1.分析可執(zhí)行文件中的動態(tài)信息section,決定需要哪些共享庫。q2.定位和映射(map)那些共享庫,并且分析它們動態(tài)信息section決定是否需要附加的共享庫。q3.為可執(zhí)行程序和那些需要的共享庫執(zhí)行重定位。q4.調用共享庫中提供的初始化函數(shù)并且安排共享庫提供的清除(cleanu
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度航空航天零部件噴漆加工與質量控制協(xié)議2篇
- 2025年度航空航天零部件委托制造協(xié)議3篇
- 2025年度二零二五年度城市供熱能源供應保障合同3篇
- 2025年度工程合同管理課程內容優(yōu)化合同3篇
- 榆林學院《奢侈品管理》2023-2024學年第一學期期末試卷
- 永城職業(yè)學院《證券投資分析實驗實驗教學》2023-2024學年第一學期期末試卷
- 永城職業(yè)學院《馬克思主義基礎理論專題研究》2023-2024學年第一學期期末試卷
- 應天職業(yè)技術學院《景觀生態(tài)學原理及應用》2023-2024學年第一學期期末試卷
- 營口理工學院《教學技術與媒體》2023-2024學年第一學期期末試卷
- 銀川能源學院《水利水能規(guī)劃》2023-2024學年第一學期期末試卷
- 江西省景德鎮(zhèn)市2023-2024學年高二上學期1月期末考試物理試題
- 期末試卷-2023-2024學年語文六年級上冊統(tǒng)編版
- 2024年1月國開電大法律事務??啤斗勺稍兣c調解》期末考試試題及答案
- 快速響應客戶需求機制
- 北京市東城區(qū)2023-2024學年九年級上學期期末語文試題(含答案)
- 汽車安全與法規(guī) (第3版) 課件 第4-6章 汽車被動安全性、汽車主動安全系統(tǒng)、汽車被動安全性能試驗
- 劉鐵敏《金融專業(yè)英語》(第2版)-習題參考答案20
- 交通事故的處理流程
- 小學學科競賽頒獎詞
- 《生產(chǎn)異常培訓》課件
- 數(shù)學分析(一)試卷1
評論
0/150
提交評論