在linux中除了可執行文件還有幾種文件也是使用ELF格式儲存的,其中包括動態庫文件(.so),可重定位文件(.o),核心轉儲文件(進程終止時系統將一些進程信息儲存到該類型的文件)。我們可以使用file命令查看文件類型 eg:
? 1 2 3 xiang@xiang:~/workspace/linux$ file prim prim: 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 stripped xiang@xiang:~/workspace/linux$ 關於ELF文件的格式,其中包含了文件頭(file header),代碼段(.text),數據段(.data)未初始化數據段(.bss)等,通過objdump 命令可以查看各個段的信息。
? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 xiang@xiang:~/workspace/algorithm$ g++ -c prim.cpp -o prim.o xiang@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, DATA xiang@xiang:~/workspace/algorithm$ objdump -h prim 1,文件頭(file header)在文件頭中包含了文件的魔數,機器字長,版本,運行平台,文件類型,入口地址,短信息等內容,其中魔數用於告訴系統文件的類型,如ELF文件的魔數就是DEL符+ELF,