ELF详解 | 链接动态库时的虚拟物理地址映射

🪐🪐🪐欢迎来到程序员餐厅💫💫💫

          主厨:邪王真眼

主厨的主页:Chef‘s blog  

所属专栏:青果大战linux

总有光环在陨落,总有新星在闪烁


把焦虑的时间节省下来,我还可以再A一题


温馨提示

本章可以视为非重点,大家看完心里有个概念就行,不用非常清楚。

ELF

显然,所谓的可执行程序本质上也属于文件,只要是文件就一定由两部分组成--

我们现在写一个源码如下 

#include<stdio.h>
int a;
int b=0;
int main(){
    int c=1;
    c++;
    printf("EFF\n");
    return 0;
}

对生成的可执行文件使用size指令,即显示出下面的内容  

  • text(代码段):包含程序的可执行指令,这些指令在程序运行时被加载到内存的代码区。代码段通常是只读的,以防止程序在运行过程中意外修改自身的指令。
  • data(数据段):存放已经初始化的全局变量和静态变量。这些变量的值在程序启动时就被初始化好了,并且在程序运行过程中可以被读写。
  • bss(未初始化数据段):存储未初始化的全局变量和静态变量。这个段在程序启动时会被初始化为零。
  • dec(十进制总和):text、data 和 bss 段大小的十进制总和,代表程序在内存中占用的总字节数。
  • hex(十六进制总和):text、data 和 bss 段大小的十六进制总和。
  • filename :文件名

可以看出,在编译链接后形成的可执行程序中,其数据并不是毫无规律的以二进制的形式保存,而是分为了几个区进行存储。

ELF(Executable and Linkable Format)是一种用于可执行文件、目标文件和共享库的标准文件格式

具体如下

在黄色的部分,被称为Section(节),每个节都存放了一种类型的数据,具体如下

text Section(文本段)

  1. ​​​​​​​ 这个 section 主要存储程序的可执行指令,也就是 CPU 执行的机器码。以一个简单的函数int add(int a, int b) {return a + b;}为例,函数的机器码会被编译到.text section。当程序运行时,CPU 会从这个 section 中读取指令来执行加法操作并返回结果。
  2. 通常是只读的。这是为了防止程序在运行过程中意外地修改自身的指令代码。因为如果代码被随意修改,可能会导致程序崩溃或者出现不可预测的行为。

rodata Section(只读数据段)

  1. 存放只读的数据,比如常量字符串。在 C 程序中,像字符串"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值