程序文件的一般布局
代码在可执行程序中的对应关系
文件布局在内存中映射
各个段的作用
堆栈段在
程序运行后才
正式存在,是程序运行的
基础
text段存放的是程序中的
可执行代码
bss段存放的是
未初始化的 全局变量和静态变量
data段保存的是那些
已经初始化了的 全局变量和静态变量
rodata段
存放程序中的常量值, 如
字符串常量
int *p = "hello world!";//rodata段,只读数据段
程序术语对应关系
静态存储区通常指程序中的
.bss和.data段
只读区通常指程序中的
.rodata段
局部变量所占空间为
栈上空间
动态空间为
堆中的空间----空闲列表管理法
程序
可执行代码存放于
.text段
问题:
函数的地址对应程序的哪个段?
在大多数程序执行环境中,函数的地址通常对应程序的 .text段(也称为代码段或文本段)。.text段包含了程序的可执行代码,包括函数体中的机器指令。这些指令是CPU在运行时执行的对象。
当程序被加载到内存中时,.text段的内容通常会被标记为只读,以防止程序意外地修改其指令。这是因为如果指令被修改,程序的行为可能会变得不可预测,导致错误或安全漏洞。
同是全部变量和静态变量 ,为什么初始化的和未初始化的保存在不同段中?
-
初始化的变量 :这些变量在程序编译时就已经被赋予了特定的值。为了提高程序的启动效率,编译器会将这些已初始化的变量放在同一个段中,通常是 .data 段。这样,在程序启动时,启动代码可以简单地复制或初始化这些变量的值,而无需进行额外的计算或操作。
-
未初始化的变量 :未初始化的变量在程序编译时没有具体的值。为了节省空间和提高效率,这些变量通常会被放在 .bss 段中。在程序启动时,启动代码可以简单地调用 memset 或其他类似函数,将这些变量的内存区域全部设置为0或某个默认值,而无需为每个变量单独赋值。