![](https://img.51dongshi.com/20250104/wz/18542808052.jpg)
系統大全為您提供
???現在PC上流行的可執行文件格式主要是windows下的PE和linux下的ELF文件,他們都是COFF格式文件變種。目標文件時源代碼編譯后但未進行鏈接的那些中間文件,它跟可執行文件的格式幾乎沒有什么區別,因此目標文件(.o文件)也和可執行文件使用一樣的儲存格式。?在linux中除了可執行文件還有幾種文件也是使用ELF格式儲存的,其中包括動態庫文件(.so),可重定位文件(.o),核心轉儲文件(進程終止時系統將一些進程信息儲存到該類型的文件)。我們可以使用file命令查看文件類型?eg:??123xiang@xiang:~/workspacenux$?file?primprim:?ELF?32-bit?LSB?executable,?Intel?80386,?version?1?(SYSV),?dynamically?linked?(uses?shared?libs),?for?GNU/Linux?2.6.24,?BuildID[sha1]=0xd54ce2ecedb22482c79f597093ff8c0b8f7c7113,?not?strippedxiang@xiang:~/workspacenux$關于ELF文件的格式,其中包含了文件頭(file?header),代碼段(.text),數據段(.data)未初始化數據段(.bss)等,通過objdump?命令可以查看各個段的信息。???123456789101112131415161718192021222324xiang@xiang:~/workspace/algorithm$?g++?-c?prim.cpp?-o?prim.oxiang@xiang:~/workspace/algorithm$?objdump?-h?prim.o?prim.o:?????file?format?elf32-i386?Sections:Idx?Name??????????Size??????VMA???????LMA???????File?off??Algn??0?.text?????????0000031f??00000000??00000000??00000034??2**2??????????????????CONTENTS,?ALLOC,?LOAD,?RELOC,?READONLY,?CODE??1?.data?????????00000000??00000000??00000000??00000354??2**2??????????????????CONTENTS,?ALLOC,?LOAD,?DATA??2?.bss??????????003d3c21??00000000??00000000??00000360??2**5??????????????????ALLOC??3?.rodata???????00000008??00000000??00000000??00000360??2**2??????????????????CONTENTS,?ALLOC,?LOAD,?READONLY,?DATA??4?.ctors????????00000004??00000000??00000000??00000368??2**2??????????????????CONTENTS,?ALLOC,?LOAD,?RELOC,?DATA??5?.comment??????0000002c??00000000??00000000??0000036c??2**0??????????????????CONTENTS,?READONLY??6?.note.GNU-stack?00000000??00000000??00000000??00000398??2**0??????????????????CONTENTS,?READONLY??7?.eh_frame?????000000dc??00000000??00000000??00000398??2**2??????????????????CONTENTS,?ALLOC,?LOAD,?RELOC,?READONLY,?DATAxiang@xiang:~/workspace/algorithm$?objdump?-h?prim1,文件頭(file?header)在文件頭中包含了文件的魔數,機器字長,版本,運行平臺,文件類型,入口地址,短信息等內容,其中魔數用于告訴系統文件的類型,如ELF文件的魔數就是DEL符+ELF,?2,代碼,數據段這些段非常熟悉,需要說明的一點就是.data段包含的是已經初始化的全局變量和靜態變量,而。bss段包含的時未初始化的全局變臉和靜態變量。其中有些文件中還存在。rodata段,存放只讀數據段。另外在.bss段中的變量的默認值為0,因此.bss在elf文件中實際上并不占用空間,只是在裝載的時候需要分配虛擬內存空間。3.段表,段表是elf文件除了文件頭之外最重要的一個數據結構,其中包含了elf的各個段的信息,如每個段的段名,段的長度,在文件中的偏移,讀寫權限等,elf文件中的段結構就是由段表決定的,編譯器,鏈接器裝載器都是通過段表進行訪問各個段的,段表的位置文件頭中e_shoff決定,是在文件中的相對偏移。4,重定位表,鏈接器的作用是鏈接多個目標文件,在一個文件中變量引用或函數引用可能定義在其他的目標文件中,而這些符號引用需要使用絕對地址。對于這些符號引用需要放在一個特定的段中,這個段就是重定位表。代碼段的重定位信息放在.rel.text中,數據段的重定位信息放在.rel.data中。5,字符串表,在ELF文件中有好多字符串,如段名,變量名,因為字符串的長度往往是不確定的,使用固定的結構來表示比較困難,一種常用的方法就是將所有的字符串放在一個單獨的表中,而使用該字符串的地方只需要有個對該字符串的引用就可以了。6,符號表,為了能將不同的目標文件鏈接起來,需要解決不同目標文件之間的相互引用問題。為了解決這個問題,在每個文件中存在很多符號表,其中包括全局符號表,外部符號表,局部符號等。其中全局符號包含定義在本目標文件中的全局符號,這些符號可以被其他的目標文件引用,外部符號包含了在本目標文件中引用,卻未在本目標文件中定義的符號。局部符號,指只有在編譯單元內部可見的符號,在鏈接的過程中沒有實際作用,鏈接器一般會忽略他們。關于符號還涉及函數簽名,強符號,弱符號等問題。???以上就是系統大全給大家介紹的如何使的方法都有一定的了解了吧,好了,如果大家還想了解更多的資訊,那就趕緊點擊系統大全官網吧。??本文來自系統大全http:///如需轉載請注明!推薦:win7純凈版