ELF可重定位目标文件
ELF可重定位目标文件
参考网址:http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=4115265
这是在Linux下测试所用的代码
x是初始化的全局变量,y是没有初始化的全局变量,e_g_z是外部符号,s_g_x是初始化的静态变量,s_g_y是没有初始化的静态变量,g_f是函数。
我们首先用gcc -g -c test.c进行编译但不链接,得到test.o文件
再用 readelf -h test.o 查看头结构
定义了ELF魔数、版本、小 端/大端、操作系统平台、 目标文件的类型、机器结构 类型、程序执行的入口地址 、程序头表(段头表)的起 始位置和长度、节头表的起 始位置和长度
然后查看test.o的符号表 readelf -s test.o
local为局部变量,global为全局变量
type列 object为变量 func为函数
我们再用readelf -S test.o查看节
Addr全为0,它表示还没有给变量和指令分配运行时地址(在链接时分配)
画出可重定位目标文件test.o的结构
最后用objdump -d test.o进行反编译得到
[email protected]:~$ objdump -d test.o
test.o: 文件格式 elf32-i386
Disassembly of section .text:
00000000 <n_s_f>:
0: 55 push %ebp
1: 89 e5 mov %esp,%ebp
3: b8 00 00 00 00 mov $0x0,%eax
8: 5d pop %ebp
9: c3 ret
0000000a <s_f>:
a: 55 push %ebp
b: 89 e5 mov %esp,%ebp
d: b8 00 00 00 00 mov $0x0,%eax
12: 5d pop %ebp
13: c3 ret
00000014 :
14: 8d 4c 24 04 lea 0x4(%esp),%ecx
18: 83 e4 f0 and $0xfffffff0,%esp
1b: ff 71 fc pushl -0x4(%ecx)
1e: 55 push %ebp
1f: 89 e5 mov %esp,%ebp
21: 57 push %edi
22: 56 push %esi
23: 53 push %ebx
24: 51 push %ecx
25: 83 ec 18 sub $0x18,%esp
28: c7 45 e0 04 00 00 00 movl $0x4,-0x20(%ebp)
2f: c7 45 e4 05 00 00 00 movl $0x5,-0x1c(%ebp)
36: e8 fc ff ff ff call 37 <main+0x23>
3b: e8 fc ff ff ff call 3c <main+0x28>
40: c7 05 00 00 00 00 04 movl $0x4,0x0
47: 00 00 00
4a: 8b 3d 08 00 00 00 mov 0x8,%edi
50: 8b 35 0c 00 00 00 mov 0xc,%esi
56: 8b 1d 00 00 00 00 mov 0x0,%ebx
5c: 8b 0d 04 00 00 00 mov 0x4,%ecx
62: 8b 15 00 00 00 00 mov 0x0,%edx
68: a1 00 00 00 00 mov 0x0,%eax
6d: 83 ec 0c sub $0xc,%esp
70: 57 push %edi
71: 56 push %esi
72: ff 75 e4 pushl -0x1c(%ebp)
75: ff 75 e0 pushl -0x20(%ebp)
78: 53 push %ebx
79: 51 push %ecx
7a: 52 push %edx
7b: 50 push %eax
7c: 68 00 00 00 00 push $0x0
81: e8 fc ff ff ff call 82 <main+0x6e>
86: 83 c4 30 add $0x30,%esp
89: b8 00 00 00 00 mov $0x0,%eax
8e: 8d 65 f0 lea -0x10(%ebp),%esp
91: 59 pop %ecx
92: 5b pop %ebx
93: 5e pop %esi
94: 5f pop %edi
95: 5d pop %ebp
96: 8d 61 fc lea -0x4(%ecx),%esp
99: c3 ret