详解ELF
文件-> main.o
elf
文件可以分成三部分
ELF
头——ELF header
- 不同的
section
——Sections
- 以及描述这些
section
信息的表——Section header table
假设有如下main.c
文件
#include<stdio.h> int count = 10; int value; void func(int sum) { printf("sum is:%d\n", sum); } int main() { static int a = 1; static int b = 0; int x = 1; func(a + b + x); return 0; }
- ELF头
gcc -c
编译后产生main.o
文件然后使用readelf -h main.o
查看ELF
头
前十六个字节的含义
7f 45 4c 46
前四个字节被称为ELF
文件的魔数
- 分别与
ascll
码中的DEL
控制符、字符E
、字符L
、字符F
对应 - 魔数就是用来确认文件类型的
02 01 01
- 最后
9
个字节ELF
的标准中没有定义,用0
填充
推测elf
的大小
- 本头的大小可以推出
sections
的起始地址,这里就是0x40
- 推测整个
elf
文件的大小, 利用本头的大小和下图的三个信息
start of section headers:
可以确定节头部表的起始位置- 节头大小和节头数量可以确定节头表的大小
查看节头部表
readelf -S main.o
:查看节头部表的信息
推断每个section
在elf
中的具体位置
- 整个
elf
一共包含12
个section
offset
代表每个section
的起始位置size
每个section
的大小
- 例如
.text
这一section
他的offset
是0x40
,大小为0x54
,由于elf
头的大小为0x40
,所以.text
是紧跟在elf
的后面的
查看.text
的内容
已知.text
是存放已编译程序的机器代码
objdump -s -d main.o
-s
:查看机器指令-d
:查看汇编代码
- 前两个字节是指令地址
- 后面的指令是机器指令
- 每个指令对应的汇编代码可以在
-d
中查看
查看.data
的内容
已知.data
是存放已初始化的全局和静态C
变量,而初始化为0的全局和静态变量被存在.bss
中
objdump -s -d main.o
- 由于
.text
的起始位置是0x40
,大小为0x56
,故可以推断出下一个section
的起始位置是0x94
,查表可知.data
的offset
是0x94
,刚好对应的上
- 小端存储
- 初始化为
0
的b
不会出现在此处
关于.bss
已知其是存放未初始化的静态C
变量(未初始化的全局变量放在COMMON
中)和初始化为0的全局和静态变量
- 观察节头部表可以发现,
.bss
和.rodata
的起始位置一样但大小不一样
- 这是因为
bss
不占据实际的空间,他就是一个占位符,程序区分已初始化和未初始化的变量是为了节省空间,当程序运行是,会在内存中分配这些变量,并把初始值设为0
查看.rodata
的内容
ro
就是read only
,代表只读,此区域就是存放只读数据的,例如printf
语句中的格式串,或者是switch
的跳转表
0x73
对应115(d)
对应s的ascll
码
关于其他的节表示的信息
详解符号表
typedef struct{ int name; // 符号的名称 通过在字符串表中的字节偏移中得到 char type:4, // 该符号的类别 函数还是变量 binding:4; // 全局还是本地 char reserved; // 没有被用到 short section; // 符号所属目标文件的节 long value; // 符号的地址相对于所属节起始位置的偏移 long size; // 符号的大小 } Elf64_Symbol;
- 符号是链接的粘合剂,整个链接过程是基于符号才能正确完成
readelf -s main.o
Ndx
对应section
,代表符号所属目标文件的节
Ndx
的取值还有三个,他们分别是ABS、UNDEF、COMMON
,他们被统称为伪节,他们在节头部表中没有条目。只有可重定位目标文件才有这些伪节,可执行目标文件中没有
ABS
:不该被重定位的符号UNDEF
:未定义的符号,但是在其他文件有定义COMMON
:还未被分配位置的未初始化的数据目标,也就是未初始化的全局变量会存放于此
Value
代表符号的地址相对于所属节起始位置的偏移
- 例如
func
符号,属于.text
节,value
为0x00
,大小为36
。
深入理解计算机系统第七章知识点总结(下)+https://developer.aliyun.com/article/1416627