Linux-ELF文件学习

本文最后更新于:2021年5月31日 下午

目标文件

先从目标文件说起,编译器编译源码之后的就是目标文件,目标文件除了没有链接库,格式和ELF相同。

目标文件中包括链接是所需的信息,如符号表、调试信息、字符串等。以“段”的形式存储。

机器指令通常放在代码段.text.code

初始化的全局变量和局部静态变量放在数据段.data

未初始化的全局变量和局部静态变量放在数据段.bss

gcc -c SimpleSection.c gcc -c 是 只编译不链接,得到.o文件。

image-20200401225316230

image-20200401230031389

1
2
3
.rodata //只读数据段
.comment //注释信息段
.note.GNU-stack //堆栈提示段

image-20200401230420911

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 5589e583 ec188b45 08894424 04c70424 U......E..D$...$
0010 00000000 e8fcffff ffc9c355 89e583e4 ...........U....
0020 f083ec20 c7442418 01000000 8b150400 ... .D$.........
0030 0000a100 00000001 d0034424 18034424 ..........D$..D$
0040 1c890424 e8fcffff ff8b4424 18c9c3 ...$......D$...
Contents of section .data:
0000 54000000 55000000 T...U...
Contents of section .rodata:
0000 25640a00 %d..
Contents of section .comment:
0000 00474343 3a202855 62756e74 752f4c69 .GCC: (Ubuntu/Li
0010 6e61726f 20342e36 2e332d31 7562756e naro 4.6.3-1ubun
0020 74753529 20342e36 2e3300 tu5) 4.6.3.
Contents of section .eh_frame:
0000 14000000 00000000 017a5200 017c0801 .........zR..|..
0010 1b0c0404 88010000 1c000000 1c000000 ................
0020 00000000 1b000000 00410e08 8502420d .........A....B.
0030 0557c50c 04040000 1c000000 3c000000 .W..........<...
0040 1b000000 34000000 00410e08 8502420d ....4....A....B.
0050 0570c50c 04040000 .p......

Disassembly of section .text:

00000000 <func1>:
0: 55 push %ebp
1: 89 e5 mov %esp,%ebp
3: 83 ec 18 sub $0x18,%esp
6: 8b 45 08 mov 0x8(%ebp),%eax
9: 89 44 24 04 mov %eax,0x4(%esp)
d: c7 04 24 00 00 00 00 movl $0x0,(%esp)
14: e8 fc ff ff ff call 15 <func1+0x15>
19: c9 leave
1a: c3 ret

0000001b <main>:
1b: 55 push %ebp
1c: 89 e5 mov %esp,%ebp
1e: 83 e4 f0 and $0xfffffff0,%esp
21: 83 ec 20 sub $0x20,%esp
24: c7 44 24 18 01 00 00 movl $0x1,0x18(%esp)
2b: 00
2c: 8b 15 04 00 00 00 mov 0x4,%edx
32: a1 00 00 00 00 mov 0x0,%eax
37: 01 d0 add %edx,%eax
39: 03 44 24 18 add 0x18(%esp),%eax
3d: 03 44 24 1c add 0x1c(%esp),%eax
41: 89 04 24 mov %eax,(%esp)
44: e8 fc ff ff ff call 45 <main+0x2a>
49: 8b 44 24 18 mov 0x18(%esp),%eax
4d: c9 leave
4e: c3 ret

-x 可打印符号表

其他段

各个段的功能说明。

image-20200402214117791

objcopy可以将二进制文件、音频等文件作为目标文件的一个段。

自定义段 :__attribute__((section("name")))

ELF文件结构描述

ELF基本结构图:

image-20200402214917762

ELF文件与段有关的重要结构是“段表”。

文件头

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
j1nx@j1nxu3-pc:~/work$ readelf -h SimpleSection.o
ELF Header:
Magic: 7f 45 4c 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: 0x1
Entry point address: 0x0
Start of program headers: 0 (bytes into file)
Start of section headers: 372 (bytes into file)
Flags: 0x0
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文件类 #0 无效文件; 1 32位文件; 2 64位文件
6个字节:字节序 #0 大端序; 1 小端序
7个字节:ELF主版本号 #一般是1

文件类型 Type:

image-20200402220224868

机器类型 Machine:

image-20200402220328247


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!