Linux学习之Linux应用程序地址布局

Linux学习之Linux应用程序地址布局

刚开始学习Linux没多久,基本算是超级新手,因此想通过写博客来得到先贤的指教,同时也起到督促自己学习的习惯。

笔者是从国嵌买的视频资料开始学习的,目前正学到Linux应用程序地址布局这一期,因此下面我就说说笔者的学习到的知识点吧。

说到Linux应用程序地址布局,主要就是涉及到下面几个存放区了

(1)    代码段

(2)    数据段

(3)    堆(heap)

(4)    栈(stack)

其实应该还有个bss段,但是其广义上说属于数据段,我们也称呼其为未初始化的数据段,因此暂且先将其归类为数据段吧,下面我们就来看看我们的程序中的代码分别属于哪一段。

首先,我们自己在Linux中写一个简单的小程序fir.c,先定义一部分全局的变量或常量,然后定义一部分局部的变量或者常量,如p1所示。


这些应该基本上涵盖了我们平时的变量什么了,下面我们就通过一系列的printf()函数来打印出这些变量的地址,运行结果如p2,


由此我们就可以看到我们刚才定义的各个变量的内存地址了,之后我们要做的就是找区间了,找对应变量的地址是属于哪个地址布局,如此我们就先要知道我们的Linux的地址布局区间了,如何获取我们的Linux地址布局区间内?那就是要利用我们前面写的程序fir.c了,首先就是让我们写的程序不断运行,也就是在最后面加个while(1);就行了,然后打开linux终端,查看当前系统下的所有进程,通过

                                                             ps aux

命令就可以列出所有的进程了,找到我们程序运行的进程,记住其进程号,我的电脑是3699(对了,我的linux版本是Red Hat Enterprise Linux 6)

之后就在我们的终端输入如下所示命令就可以获取我们的linux地址布局区间了(一定要注意你打开的进程号一定是你自己电脑分配的,不一定是3699


由p3我们看到,这么多区间,那么哪一些是我们的代码段,数据段,堆和栈内?通过我们最后面的标识基本上我们可能不清楚的就是数据段和代码段的差别了,堆和栈的分配还是很明显的。数据段和代码段主要就在我们上图的倒数第6、7行,代码段是具可执行权限的,而数据段是必须具备可写的权限的,这么一说我们就很容易知道倒数第七行是代码段,倒数第六行是数据段了。下面就可以对比我们程序声明变量的地址和我们的地址布局区间来判定我们程序定义的变量各属于哪个段了。我们可以做出如下总结:

代码段:代码,全局常量
   
数据段:全局变量(包括初始化和未初始化的),静态变量(全局的局部的都是,无论初始化否)

堆:动态分配的区域,也就是我们的malloc()函数,使用new分配的也是

栈:所有的局部变量(除了静态的)都是放在栈中。

 

 

 另外我们上面有提到一个BSS段,下面我们就来分析一下我们的BSS段了,利用

readelf  –S 程序名

这个方法可以很好的分析我们的BSS段,我们知道再windows下我们的可执行文件是.exe文件后缀的,而我们的linux下可执行文件的后缀是.elf,这个命令就是要读取我们的可执行文件来查看该程序的各个段的情况


这就是我们运行该命令后的情况,我们看图p4第【25】就是我们的bss段,其第四列为起始地址,第五列为偏移数据段大小,第六列为该段的尺寸,由此我们可以知道我们的BSS段,就是属于我们的数据段,其主要存放的是未初始化的数据。

以上就是学习Linux应用程序地址布局后的一些总结,第一次写博客,非常希望得到大家的指正。


 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值