码迷,mamicode.com
首页 > 系统相关 > 详细

linux下进程内存布局及变量存储位置检查

时间:2020-03-01 10:25:52      阅读:113      评论:0      收藏:0      [点我收藏+]

标签:ext   png   data   存在   UNC   fun   void   char   extern   

进程的内存布局如下(虚拟内存):

              技术图片

它们分别从低地址向高地址增长

在linux中,存在三个全局符号:etext, edata, end分别指向文本段,初始化数据段,未初始化数据段结尾处的下一字节的地址。

所以我们可以在c程序中声明这些变量,然后定义一些变量再查看其地址是否在对应的地址范围内,可得出其变量被存储在哪个区中。

#include<unistd.h>
#include<stdlib.h>
#include<stdio.h>

extern char etext, edata, end;

int a = 10;

void func()
{
    int d = 666; //
    printf("func =  %p\n", func);  //文本段
    printf("局部变量d, &d =    %p\n", &d);
}

int main()
{
    int b = 100;  //栈区
    
    int *p = (int*)&edata;

    int *c = (int*)malloc(sizeof(int));  //

    *c = 99;

    printf("etext = %10p\nedata = %10p\nend =   %10p\n", &etext, &edata, &end);

    printf("全局变量a, &a =    %p\n", &a);
    printf("局部变量b, &b =    %p\n", &b);
    printf("堆分配的内存, &(*c) = %p\n", &(*c));
    printf("main  = %p\n", main);

    printf("a = %d\n", *(--p));

    func();
    
    return 0;
}

输出如下:

etext =   0x557ed79928ed
edata = 0x557ed7b93014
end =    0x557ed7b93018
全局变量a, &a =  0x557ed7b93010
局部变量b, &b =  0x7fff14f77454
堆分配的内存, &(*c) = 0x557ed7f6e260
main  = 0x557ed799275f
a = 10
func =  0x557ed79926fa
局部变量d, &d = 0x7fff14f77434                                

可以看出:

对于main: 0x557ed799275f

  func:  0x557ed79926fa , 它们的地址都小于

 etext:     0x557ed79928ed

所以可知main和func函数,都存储在文本区中。

全局变量a : 0x557ed7b93010

大于etext  : 0x557ed79928ed

小于edata: 0x557ed7b93014

所以知道初始化的全局变量a在初始化数据区中,

其它以此类推。

 

linux下进程内存布局及变量存储位置检查

标签:ext   png   data   存在   UNC   fun   void   char   extern   

原文地址:https://www.cnblogs.com/ilove-haha/p/12388325.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!