本文最后更新于:2021年5月31日 下午
目标文件 先从目标文件说起,编译器编译源码之后的就是目标文件,目标文件除了没有链接库,格式和ELF相同。
目标文件中包括链接是所需的信息,如符号表、调试信息、字符串等。以“段”的形式存储。
机器指令通常放在代码段.text
或.code
。
初始化的全局变量和局部静态变量放在数据段.data
。
未初始化的全局变量和局部静态变量放在数据段.bss
。
gcc -c SimpleSection.c
gcc -c 是 只编译不链接,得到.o文件。
1 2 3 .rodata .comment .note .GNU-stack
dec 表示三个段长度之和的十进制,hex 是十六进制
。
代码段 objdump -s -d SimpleSection.o
-s 以16进制打印段内容 -d 指令反汇编
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 SimpleSection .o: file format elf32 -i386 Contents of section .text: 0000 5589 e583 ec188 b45 08894424 04 c70424 U......E..D$...$ 0010 00000000 e8 fcffff ffc9 c355 89 e583 e4 ...........U.... 0020 f083 ec20 c7442418 01000000 8 b150400 ... .D$......... 0030 0000 a100 00000001 d0034424 18034424 ..........D$..D$ 0040 1 c890424 e8 fcffff ff8 b4424 18 c9 c3 ...$......D$... Contents of section .data: 0000 54000000 55000000 T...U... Contents of section .rodata: 0000 25640 a00 %d.. Contents of section .comment: 0000 00474343 3 a202855 62756 e74 752 f4 c69 .GCC: (Ubuntu/Li 0010 6 e61726 f 20342 e36 2 e332 d31 7562756 e naro 4 .6 .3 -1 ubun 0020 74753529 20342 e36 2 e3300 tu5 ) 4 .6 .3 . Contents of section .eh_frame: 0000 14000000 00000000 017 a5200 017 c0801 .........zR..|.. 0010 1 b0 c0404 88010000 1 c000000 1 c000000 ................ 0020 00000000 1 b000000 00410 e08 8502420 d .........A....B. 0030 0557 c50 c 04040000 1 c000000 3 c000000 .W..........<... 0040 1 b000000 34000000 00410 e08 8502420 d ....4 ....A....B. 0050 0570 c50 c 04040000 .p...... Disassembly of section .text:00000000 <func1 >: 0 : 55 push %ebp 1 : 89 e5 mov %esp,%ebp 3 : 83 ec 18 sub $0 x18 ,%esp 6 : 8 b 45 08 mov 0 x8 (%ebp),%eax 9 : 89 44 24 04 mov %eax,0 x4 (%esp) d : c7 04 24 00 00 00 00 movl $0 x0 ,(%esp) 14 : e8 fc ff ff ff call 15 <func1 +0 x15 > 19 : c9 leave 1a : c3 ret 0000001b <main>: 1b : 55 push %ebp 1c : 89 e5 mov %esp,%ebp 1e : 83 e4 f0 and $0 xfffffff0 ,%esp 21 : 83 ec 20 sub $0 x20 ,%esp 24 : c7 44 24 18 01 00 00 movl $0 x1 ,0 x18 (%esp) 2b : 00 2c : 8 b 15 04 00 00 00 mov 0 x4 ,%edx 32 : a1 00 00 00 00 mov 0 x0 ,%eax 37 : 01 d0 add %edx,%eax 39 : 03 44 24 18 add 0 x18 (%esp),%eax 3d : 03 44 24 1 c add 0 x1 c(%esp),%eax 41 : 89 04 24 mov %eax,(%esp) 44 : e8 fc ff ff ff call 45 <main+0 x2 a> 49 : 8 b 44 24 18 mov 0 x18 (%esp),%eax 4d : c9 leave 4e : c3 ret
-x 可打印符号表
其他段 各个段的功能说明。
objcopy可以将二进制文件、音频等文件作为目标文件的一个段。
自定义段 :__attribute__((section("name")))
。
ELF文件结构描述 ELF基本结构图:
ELF文件与段有关的重要结构是“段表”。
文件头 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 j1nx @j1 nxu3 -pc:~/work$ readelf -h SimpleSection.oELF Header: Magic : 7 f 45 4 c 46 01 01 01 00 00 00 00 00 00 00 00 00 Class : ELF32 Data : 2 's complement, little endian Version : 1 (current) OS /ABI: UNIX - System V ABI Version: 0 Type : REL (Relocatable file) Machine : Intel 80386 Version : 0 x1 Entry point address: 0 x0 Start of program headers: 0 (bytes into file) Start of section headers: 372 (bytes into file) Flags : 0 x0 Size of this header: 52 (bytes) Size of program headers: 0 (bytes) Number of program headers: 0 Size of section headers: 40 (bytes) Number of section headers: 13 Section header string table index: 10
Magic:
1 2 3 4 前4 个字节: 魔数 第5 个字节: 表示ELF文件类 第6 个字节: 字节序 第7 个字节:ELF 主版本号
文件类型 Type:
机器类型 Machine: