静态内存布局
进程内存布局由多个段(segment)组成,包括:
- 未初始化的数据段或由符号段开始块BSS
- 数据段(Data段)
- 文本段或代码段Text段(或Code段)
- 栈段(Stack段)
- 堆段(Heap段)
借助系统工具可以比较直观辅助分析静态内存布局:
- size
- objdump
如下示例在linux系统上的使用
1 size
shell
1 |
|
2 objdump
2.1 objdump -S ${obj}
汇编源码
shell
1 |
|
2.2 objdump -s ${obj}
所有节的全部内容
shell
1 |
|
2.3 objdump -s -j .data ${obj}
查看.data块的内容
shell
1 |
|
3 如下3个版本的c代码比较
3.1 只定义了一个main函数
3.1.1 code
c
1 |
|
3.1.2 size
shell
1 |
|
3.1.3 data
内存地址0x4000开始16个byte上的内容
shell
1 |
|
3.2 定义2个全局变量
- 一个未初始化
- 一个初始化为0
3.2.1 code
c
1 |
|
3.2.2 size
bss从8byte->16byte,我尝试了定义3个int类型全局变量,bss依然是16byte,所以初始的时候应该被占用了4byte,但是分配了8byte。
shell
1 |
|
3.2.3 data
为初始化的全局变量和初始化为0的全局变量都分配在bss段上,因此data段没有变化。
shell
1 |
|
3.3 定义2个全局变量
2个变量都进行初始化为非0
- 一个声明为int类型
- 一个声明为char类型
3.3.1 code
objdump内容一行代表一个4byte的内存内容,为了方便计算就直接将整型定义为16进制表达,更容易看出来内存序是大端序还是小端序。
c
1 |
|
3.3.2 size
data大小从512byte->517byte,就是g_i
和g_j
这两个变量分配占用的内容空间。
shell
1 |
|
3.3.3 data
从第2行开始,即内存地址0x4010开始的地址上,前4个byte放了0x56341200,g_i
是int类型占用4byte,而g_i
的值是0x123456,所以当前这台机器的字节序是小端序。紧随其后的1个byte存放的是0x61,对应的十进制是97,g_j
的值是a
,对应的ASCII是97,因此在data块上存储着初始化为非0的全局变量。
shell
1 |
|
静态内存布局
https://bannirui.github.io/2023/11/21/静态内存布局/