关于可重定位目标文件的格式与其符号表的概述
? ? ? ? 我們知道一個(gè)可執(zhí)行的C程序要經(jīng)過語(yǔ)言預(yù)處理、編譯器、匯編器生成擴(kuò)展名為.o的可重定位目標(biāo)文件,再通過鏈接器鏈接生成可執(zhí)行的目標(biāo)文件。
1.什么是可重定位目標(biāo)文件
? ? ? ?一個(gè)擴(kuò)展名為.s 的ASCII匯編語(yǔ)言文件經(jīng)由匯編器翻譯成一個(gè)包含二進(jìn)制代碼和數(shù)據(jù)的.o文件,即可重定位目標(biāo)文件。其特點(diǎn)是可在編譯時(shí)與其它可重定位目標(biāo)文件合并起來(lái),由此創(chuàng)建一個(gè)可執(zhí)行目標(biāo)文件。
2.可重定位目標(biāo)文件格式
? (這里討論的是現(xiàn)代X86-64Linux和?Unix系統(tǒng)使用的ELF格式)
? ? ? ?前四個(gè)節(jié)圖中已作出解釋,(ps:其中.data中放入已初始化的全局變量和靜態(tài)C變量;.bss中放入未初始化的全局和靜態(tài)C變量)現(xiàn)解釋其余的節(jié)中存的信息:
- .symtab? 一個(gè)符號(hào)表,存放程序中定義和引用的函數(shù)和全局變量的信息。
- .rel.text? 一個(gè).text節(jié)中位置的列表,當(dāng)鏈接器把這個(gè)目標(biāo)文件和其它文件組合是,需要修改這些位置。
- rel.data? 被模塊引用或定義的所有全局變量的定位信息。
- .debug 一個(gè)調(diào)試符號(hào)表,其條目是程序中定義的局部變量和類型定義,程序中定義和引用的全局變量,以及原始的C源文件。
- .line 原始C源程序中的行號(hào)和.text節(jié)中機(jī)器指令之間的映射。
- .strtab 一個(gè)字符串表,其內(nèi)容包括.symtab節(jié)和.debug節(jié)中的符號(hào)表以及節(jié)頭部中的節(jié)名字。
? ? 下面看一個(gè)例子:
???
? ?輸入命令:readelf -s main.o 查看其符號(hào)表,即.symtab節(jié)中存放的信息
? ? ? ? value表示符號(hào)在節(jié)中的偏移量;Type表示該符號(hào)是函數(shù)還是數(shù)據(jù);Bind表示該符號(hào)是全局的還是局部的;Ndx表示該符號(hào)位于節(jié)與ELF頭節(jié)的偏移,如.text節(jié)的Ndx為1;
? ? ? ? 例:靜態(tài)局部變量al1的Num是7,描述為存放在.bss節(jié)中偏移量為4的占4個(gè)字節(jié)大小的符號(hào)。
? ? ? 1. 同一個(gè)節(jié)中的字符存放遵循數(shù)據(jù)對(duì)齊的規(guī)則;如.data節(jié)中數(shù)組array放在該節(jié)的首地址,2個(gè)整型數(shù)占8個(gè)字節(jié),緊跟字符a放在偏移量為8的位置,占1個(gè)字節(jié),以初始化的局部靜態(tài)變量cal存放在.data節(jié)中偏移為12的位置,因?yàn)閕nt型對(duì)象的首地址必須是4的倍數(shù);
? ? ? 2.符號(hào)sum實(shí)際是一個(gè)函數(shù)的引用,由于此刻main.o與sum.o還沒有進(jìn)行鏈接,所以sum符號(hào)的類型還不能確定,只表示在不目標(biāo)模塊中引用但卻在其它地方定義的符號(hào)。
? ? ?3.COMMON與.bss的區(qū)別:COMMON中放未初始化的全局變量
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?.bss中放的是未初始化的靜態(tài)變量以及初始化為0的全局或靜態(tài)變量
?
? ? ? ? 再看看ELF頭中的信息,ELF頭中前16個(gè)字節(jié)的序列描述了生成了該文件的系統(tǒng)的字的大小和字節(jié)順序,剩余的部分包含了幫助鏈接器語(yǔ)法分析和解釋目標(biāo)文件的信息。若要看ELF頭中的信息則輸入命令:readelf -h main.o
? ? ? ?在main.o中的ELF頭中,前三個(gè)魔術(shù)7f454c定義了文件的類型為可重定位目標(biāo)文件,節(jié)頭部表的起始地址992(0x3e0),節(jié)條數(shù)量為13,大小是64字節(jié)。
?
? ? ? ?節(jié)頭表中描述了不同節(jié)的位置和大小, 我們?cè)倏垂?jié)頭部表中的信息,輸入命令:readelf? -S main.o
? ?
? ? ?由于已知ELF頭為64字節(jié)大小、各節(jié)的偏移量和大小及節(jié)頭部表的偏移和大小(節(jié)頭數(shù)*節(jié)頭大小=13*64Byte=832Byte),則可以畫出ELF可重定位目標(biāo)文件的結(jié)構(gòu)圖
? ? ??至此,可重定位目標(biāo)文件的結(jié)構(gòu)就已經(jīng)簡(jiǎn)單敘述完畢,如有錯(cuò)誤的地方,歡迎指出。
總結(jié)
以上是生活随笔為你收集整理的关于可重定位目标文件的格式与其符号表的概述的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 转载 - 5个在线的网站测试和验证工具
- 下一篇: 基于裸机工程移植内核