ELF header(ELF头部)
Program header table(程序头表)
Segment1(段1)
Segment2(段2)
………
Sengmentn(段n)
Setion header table(节头表,可选)//描述了映射加载关系,可由OBJDUMP查看objdump -h 我的程序
Unix系统在可执行文件的加载过程中,除了读取必要的头部信息,并没有任何从磁盘到存储器的数据拷贝,只是简单进行映射,知道CPU访问一个被映射的虚拟页产生缺页异常后,才进行拷贝。
地址
|
作用
|
说明
|
>=0xc000 0000
|
内核虚拟存储器
|
系统保留区
|
<0xc000 0000
|
Stack(用户栈)
|
%EBP,%ESP
|
|
↓
↑
|
空闲/动态库也放在此
|
>=0x4000 0000
|
文件映射区
|
只映射,page fault后加载
|
<0x4000 0000
|
↑
|
空闲
|
|
Heap(运行时堆)
|
通过brk/sbrk系统调用扩大堆,向上增长(malloc)。
|
|
.data、.bss(读写段)
|
可执行文件中获取,重定位
|
>=0x0804 8000
|
.init、.text、.rodata(只读段)
|
可执行文件中获取,重定位
|
<0x0804 8000
|
保留区域
|
|
C程序的入口点是_start,这段启动代码是在目标文件ctrl.o中定义的。启动代码中首先调用初始化函数,然后调用atexit函数,用于注册在exit函数被调用(程序退出)时应该被调用的函数。最后,启动代码调用main函数,在main函数返回后,调用系统调用_exit(),将控制返回给操作系统。