码迷,mamicode.com
首页 > 其他好文 > 详细

深入理解程序的结构

时间:2018-10-20 23:52:59      阅读:320      评论:0      收藏:0      [点我收藏+]

标签:相关信息   正是   存储   就是   初始   根据   lock   技术   角度   

 

程序的构成:从操作系统的角度来看

技术分享图片

技术分享图片

 

文件头记录了与可执行文件相关的一些基本信息。

静态分析工具大多根据程序的文件头获得相关信息。

初始化的变量进入.data段,没有初始化的全局变量进入.bss段。

技术分享图片

 

 

技术分享图片

 

技术分享图片

 

未初始化的变量默认为0,为了存储效率和加载效率。

技术分享图片

 

 

没有初始化的默认为0,在程序文件中就不用存储初始值了,只需在程序文件中记录:有几个全局变量,以及它们的类型。

而data段要保存初始值。

实验分析:

代码如下:

技术分享图片

 

做如下编译:

技术分享图片

-e指明程序入口,-nostartfiles说明不使用程序自带的那些启动文件。

使用objdump可以查看程序有哪些段:

技术分享图片

 

 

1、2这两个段是gnu系统特有的辅助段,7这个段也是可以去掉的。 最重要的就是.text段。我们这个程序中没有数据段。

 

改写程序:

技术分享图片

 

 

objdump结果如下:

技术分享图片

.data和.bss段都有了。

改编程序:

技术分享图片

 

objdump结果如下:

技术分享图片

 

编译器默认按4字节对齐,因此bss段还是占用8字节。

将程序改成如下形式就占用4个字节了:

技术分享图片

 

 

使用nm查看符号:

技术分享图片

 

 技术分享图片

 

dt_main和text段的初始地址正好对应上。

g_no_value在bss段,其中的B代表bss。g_value在data段,D代表data。

c_no_value和bss的起始地址是一致的。

c_no_value之后就是g_no_value。

用objdump查看data段中保存的初始值信息:

技术分享图片

 

 

上图表示从8049ff4开始存储了01000000  02000000

改造程序:

技术分享图片

 

 编译之后objdump结果如下:

技术分享图片

 

data段的字节数是21,4字节对齐之后data段的大小应该是24,图中显示的18是16进制。正好等于十进制的24。

nm查看符号:

技术分享图片

 

可以看到多了一个符号g_str。

再次改写程序:

技术分享图片

 

objdump结果和nm结果:

技术分享图片

 

 

g_c的内存地址正是rodata段的起始地址。

查看rodata段的内容:

技术分享图片

 

深入理解程序的结构

标签:相关信息   正是   存储   就是   初始   根据   lock   技术   角度   

原文地址:https://www.cnblogs.com/wanmeishenghuo/p/9823345.html

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