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