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

ELF格式

可加载文件格式

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

可执行文件格式

在这里插入图片描述
.init:程序初始化时调用_init函数
program header table:elf文件加载到内存中时的映射需求

加载过程

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

动态链接库

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值