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文件格式和运行时内存布局的主要内容,如果未能解决你的问题,请参考以下文章

ELF格式解读- elf头部与节头

ELF文件格式分析

ELF格式解读-程序头与内存布局

ELF格式解读-程序头与内存布局

Android 逆向ELF 文件格式 ( ELF 文件类型 | ELF 文件对应 CPU 架构 | ELF 目标文件版本 | 可执行程序起始地址 )

Android 逆向ELF 文件格式 ( ELF 文件类型 | ELF 文件对应 CPU 架构 | ELF 目标文件版本 | 可执行程序起始地址 )