版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_35440678/article/details/80099209
列表:
- 地址空间分为哪几段?
- 每一段存放什么?
- 怎么查看
前言
操作系统对每个进程都分配了完整的虚拟内存地址空间。进程会把整个地址空间分成多个区间来使用。堆和栈,是程序员最熟悉的部分了,除了这两块区间外,还有其他的内存区间,用来存储代码、静态、全局变量等等。
一图胜千言
地址空间分为哪几段?
地址空间分析,从低到高:
1. TEXT段:整个程序的代码,以及所有的常量;这部分内存是是固定大小的,只读的
2. DATA段:初始化为非零值的全局变量,全局变量!!
3. BSS段:初始化为0或未初始化的全局变量和静态变量
4. HEAP(堆空间):动态内存区域,使用malloc或new申请的内存
5. 未使用的内存
6. STACK(栈空间):局部变量、参数、返回值都存在这里,函数调用开始会参数入栈、局部变量入栈;调用结束依次出栈
怎么查看每个段的内容
地址空间分那么多段,有没有方法能看到每个段的信息呢?
有办法,通过objdump
和readelf
两个命令可以看到一个目标文件每个段的信息。
//1、生成目标文件
gcc -c file.c
//2、查看
objdump -h file.o
objdump -x -s -d file.o
//如何查看虚表?
objdump -s -x -d CMakeFiles/hello.dir/virtual_class.cpp.o | c++filt | grep vtable
显示如下: