elf文件格式和运行时内存布局
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了elf文件格式和运行时内存布局相关的知识,希望对你有一定的参考价值。
elf的类型: Linux下的可执行文件格式叫做elf,全称是Executable Linkable Format。其实不仅仅是可执行文件,linux中常见的目标文件有目标文件.o、可执行文件如/bin/bash、共享目标文件(.so)、和核心转储文件core dump。可以使用file命令确定文件格式。 elf的结构: 如其结构如下图所示:
ELF file format: +---------------+ | File header | +---------------+ | .text section | +---------------+ | .data section | +---------------+ | .bss section | +---------------+ | ... | +---------------+ | xxx section | +---------------+
elf由很多段组成,文件头中保存各段的类型和长度,每个段存放不同属性内容,这样elf可以有很高的灵活性。同时,x86保护模式的内存也是段页式存储的,elf文件中的段很容易映射到内存中的段。 上图列出了elf文件中最主要的几个段,他们和c语言程序的映射关系如下(代码和表格摘自《程序员的自我修养》p58页):
int global_init_var = 84; -------------------- .data section int global_uninit_var; -------------------- .bass section void func1( int i ) -------------------- .text section { -------------------- .text section printf( "%d\n", i ); -------------------- .text section } -------------------- .text section int main(void) -------------------- .text section { -------------------- .text section static int static_var = 85; -------------------- .data section static int static_var; -------------------- .bass section int a = 1; -------------------- .text section int b; -------------------- .text section func1 ( static_var + static_var2 + ----------------- .text section a + b ); -------------------- .text section return 0; -------------------- .text section } -------------------- .text section
代码和指令放在代码段(.text);未初始化的全局变量和静态变量放在bss段中,在运行时这些变量会被自动初始化为0;初始化的全局变量和静态变量存放在数据段中;局部变量和函数参数分别在栈中分配(栈和堆分别在内存中分配,在elf文件中不存在对应的部分)。
elf中的段:
elf中常见的段有如下几种:
代码段 text 存放函数指令
数据段 data 存放已初始化的全局变量和静态变量,
只读数据段 rodata 存放只读常量或const关键字标识的全局变量
bss段 bss 存放未初始化的全局变量和静态变量,这些变量由于为初始化,所以没有必要在elf中为其分配空间。bss段的长度总为0。
调试信息段 debug 存放调试信息
行号表 line 存放编译器代码行号和指令的duiing关系
字符串表 strtab 存储elf中存储的各种字符串
符号表 symtab elf中到处的符号,用于链接 注:局部变量在函数中运行中动态的分配和释放,在elf中并没有对应的段。使用malloc和free函数动态申请的空间在运行时在堆中分配,elf中没有对应的段。
运行时内存布局 Linux程序运行时的内存布局如下:
+------------------------+ Oxffffffff | kernel space | +------------------------+ 0xC0000000 | stack | +------------------------+ | | | unused | | | +------------------------+ | dynamic libraries | +------------------------+ 0x40000000 | | | unused | | | +------------------------+ | heap | +------------------------+ | read/write sections | | (.data .bss) | +------------------------+ | read only sections | | (.init .rodata .text) | +------------------------+ 0x08048000 | reserved | +------------------------+ 0
elf文件中的段和内存布局的关系如括号中的小字所示。
转载自:http://blog.sina.com.cn/s/blog_4ed962ae01013vhr.html
以上是关于elf文件格式和运行时内存布局的主要内容,如果未能解决你的问题,请参考以下文章
Android 逆向ELF 文件格式 ( ELF 文件类型 | ELF 文件对应 CPU 架构 | ELF 目标文件版本 | 可执行程序起始地址 )
Android 逆向ELF 文件格式 ( ELF 文件类型 | ELF 文件对应 CPU 架构 | ELF 目标文件版本 | 可执行程序起始地址 )