在编译和链接过程中,代码被划分为多个段(sections),每个段都有特定的用途。这些段在最终的可执行文件或目标文件中被组织和管理。以下是一些常见的段及其用途:
常见的段

.text 段
用途:存放可执行代码。
特点:通常是只读的,包含程序的机器指令。
示例:函数代码、方法实现。

int main() {
    return 0;
}

.rodata 段(Read-Only Data):
用途:存放只读数据。
特点:通常是只读的,包含程序中的常量数据。
示例:字符串常量、常量数组。

const char *message = "Hello, World!";

.data 段:
用途:存放已初始化的全局变量和静态变量。
特点:可读写,包含程序启动时就已初始化的数据。
示例:已初始化的全局变量和静态变量。

const char *message = "Hello, World!";

.bss 段(Block Started by Symbol):
用途:存放未初始化的全局变量和静态变量。
特点:可读写,在程序启动时被初始化为零。
示例:未初始化的全局变量和静态变量。

int uninitialized_global;
static int uninitialized_static;

.heap 段:
用途:用于动态内存分配。
特点:可读写,内存大小在运行时动态分配。
示例:通过 malloc、calloc 和 realloc 分配的内存。

int *dynamic_array = (int *)malloc(10 * sizeof(int));

.stack 段:
用途:用于函数调用的栈空间。
特点:可读写,内存大小在运行时动态调整。
示例:函数调用时的局部变量、返回地址、参数。


+------------------+
|      Stack       |  <--- 高地址
| (向下增长)        |
+------------------+
|      Heap        |  <--- 动态分配内存
| (向上增长)        |
+------------------+
| .bss             |  <--- 未初始化的全局和静态变量
+------------------+
| .data            |  <--- 已初始化的全局和静态变量
+------------------+
| .rodata          |  <--- 只读数据
+------------------+
| .text            |  <--- 可执行代码
+------------------+
| Program Headers  |  <--- 低地址
+------------------+

putao
8 声望1 粉丝

推动世界向前发展,改善民生。