🪐🪐🪐欢迎来到程序员餐厅💫💫💫
主厨的主页: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(文本段)
- 这个 section 主要存储程序的可执行指令,也就是 CPU 执行的机器码。以一个简单的函数
int add(int a, int b) {return a + b;}
为例,函数的机器码会被编译到.text
section。当程序运行时,CPU 会从这个 section 中读取指令来执行加法操作并返回结果。 - 通常是只读的。这是为了防止程序在运行过程中意外地修改自身的指令代码。因为如果代码被随意修改,可能会导致程序崩溃或者出现不可预测的行为。
rodata Section(只读数据段)
- 存放只读的数据,比如常量字符串。在 C 程序中,像字符串
"