在 PE 文件(Portable Executable)中,.text
和 .data
是两种常见的段(section),它们分别存储不同类型的数据。以下是它们的区别和一个具体例子:
1. .text
段
- 作用:存储程序的代码部分,也就是可执行的机器指令。
- 属性:
- 通常是 只读 的。
- 可执行(具有执行权限)。
- 用途:
- 包含程序的逻辑代码(函数、控制流、指令等)。
- 这部分是加载到内存后执行的核心部分。
2. .data
段
- 作用:存储程序的全局变量、静态变量等已初始化的数据。
- 属性:
- 可读可写(通常允许修改)。
- 不可执行(不具备执行权限)。
- 用途:
- 包含程序运行中需要使用的已初始化数据。
- 存储可以修改的全局变量和静态变量。
3. 关键区别
特性 | .text 段 |
.data 段 |
---|---|---|
内容 | 机器指令(程序代码) | 初始化的全局变量和静态变量 |
权限 | 只读,可执行 | 可读可写,不可执行 |
数据类型 | 逻辑指令或函数实现 | 全局变量、静态变量的值 |
大小 | 通常较小,代码段紧凑 | 根据全局变量和静态变量的大小决定 |
4. 举例说明
假设有以下 C 程序:
PE 文件中的分布:
.text
段:- 存储
say_hello()
函数的机器指令。 - 存储
main()
函数的机器指令。 - 例如:
- 存储
.data
段:- 存储
global_var
的值42
。 - 例如:
- 存储
5. 加载到内存后的行为
- 当程序运行时:
.text
段 被映射为只读和可执行,CPU 直接执行这里的指令。.data
段 被映射为可读可写,程序可以修改global_var
的值。
6. 调试时的观察
- 在调试工具(如 IDA Pro 或 Ghidra)中:
.text
段 显示为代码部分,包含反汇编后的指令。.data
段 显示为数据部分,包含全局变量和静态变量的值。
通过以上描述,可以看到 .text
和 .data
的不同在于其存储的内容和运行时的属性,它们共同组成了一个程序的核心部分。如果有进一步的疑问,可以告诉我!