ELF(executable and linkable file)文件内容及加载过程

ELF格式

可加载文件格式

ELF(executable and linkable file)文件内容及加载过程_第1张图片
每一个.开头的都是一个section。
.text:机器代码
.data:已初始化的数据段,包括全局变量和static变量
.bss:未初始化的全局变量以及所有被初始化为0的全局变量,这个段的目的时为了节省空间
.rodata:只读数据,比如printf中的字符串
.comment:编译器版本信息
.shstrtab:section名称表
Section header table:节头部表,描述目标文件的节
.rel.text:调用外部函数时,实际调用位置的列表
.rel.data:被模块引用的全局变量的重定位信息
.symtab:符号表,包括函数和全局变量,由编译器构造
.debug:调试符号表,包括局部变量和类型定义,全局变量,以及原始的源文件,只有打开-g编译开关才有
.strtab:字符串表,包括.symtab和.debug节中符号表

可执行文件格式

ELF(executable and linkable file)文件内容及加载过程_第2张图片
.init:程序初始化时调用_init函数
program header table:elf文件加载到内存中时的映射需求

加载过程

调用操作系统加载器 loader,加载器讲可执行文件中的代码和数据从磁盘复制到内存中,然后跳转到程序的第一条指令运行。
ELF(executable and linkable file)文件内容及加载过程_第3张图片
程序入口函数_start
ELF(executable and linkable file)文件内容及加载过程_第4张图片
_libc_start_main初始化执行环境,调用main函数,处理main的返回值。加载过程就是把progam段映射到内存的过程,注意不是数据拷贝,只有CPU引用被映射的虚拟页时才会被复制到内存。

动态链接库

在内存中,共享库的.text节的一个副本能被不同的正在运行的进程共享。
编译时,链接器只复制了一些重定位和符号表信息。在加载时,链接器会重定位库的文本和数据到某个内存段,再重定位可执行程序中所有对动态链接库的符号的引用。
.plt:过程链接表

你可能感兴趣的:(os,操作系统)