ELF文件
重定位表
查看方法
objdump -r a.o //-r 查看目标文件的重定位表
表结构
- 偏移量
- 可重定位文件:该重定位入口要修正的位置的第一个字节
- 重定位入口类型
- R_386_32:保存在被修正位置的值 + 符号的实际地址(从符号表中获取)
- R_386_PC32: 保存在被修正位置的值 + 符号的实际地址(从符号表中获取)- 相对于段开始的偏移量或者虚拟地址
- 重定位入口在符号表中的下标
符号表
查看方法
readelf -s a.o 查看符号表
表结构
- name: 符号名
- value
- 目标文件中、符号的定义、并且不是COMMON块,则为符号在该段的偏移
- 目标文件中、COMMON块,表示该符号的对其属性
- 可执行文件中表示符号的虚拟地址
- size
- 函数:函数指令所占的字节数
- 数据:符号对应的数据的大小
- info
- shndx
- other
GCC总结
- 源文件汇编为目标文件
gcc -c a.c -o a.o //-c 表示输出的是目标文件
- -I 参数
gcc -I. //向 gcc 的头文件搜索路径中添加新的目录,这里是吧当前路径添加进去了
gcc -Iinclude //
- 链接
ld a.o b.o -e main -o ab
- -e main 将main函数作为程序入口,默认为_start
- -lc
寻址方式
physics address = segreg: base_add(offset_add,index,size)
segreg: base_add + offset_add + index * size
- segreg为段寄存器
- base_add为基址
- offset_add为偏移
- size * index 决定第几个元素
寄存器详解
寄存器 | 16位 | 32位 | 64位 |
---|---|---|---|
累加寄存器 | AX | EAX | RAX |
堆栈顶指针 | SP | ESP | RSP |
堆栈基指针 | BP | EBP | RBP |
作用
累加寄存器:累加器 (accumulator) 是一种寄存器,用来储存计算产生的中间结果。如果没有像累加器这样的寄存器,那么在每次计算 (加法,乘法,移位等等) 后就必须要把结果写回到 内存,也许马上就得读回来。然而存取主存的速度是比从算术逻辑单元到有直接路径的累加器存取更慢。
栈指针: ESP 和 EBP 分别是栈指针和基指针(栈是向低地址伸展的)。这两个寄存器共同负责函数的调用和栈的操 作。当一个函数被调用的时候,函数需要的参数被陆续压进栈内,最后函数的返回地址也被压进。ESP 指着栈顶,也就是返回地址。 EBP 则指着栈的底端。有时候,编译器能够做出优化,释放 EBP,使其不再用于栈的操作,只作为普通的寄存器使用。
常用命令汇总
AND指令
AND EAX 00000003 //将EAX中存储的值 和 3进行 逻辑与运算,结果存入EAX
函数调用了栈
Activity Record 记录的信息
- 函数返回地址(这个函数执行完,需要执行的指令的地址)和参数
- 函数的非静态局部变量以及编译器自动生成的其他临时变量
- 上线文,如函数调用前后需要保持不变的寄存器