在编译和链接过程中,代码被划分为多个段(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 | <--- 低地址
+------------------+
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。