深入理解程序的结构

Posted wanmeishenghuo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深入理解程序的结构相关的知识,希望对你有一定的参考价值。

 

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

技术分享图片

技术分享图片

 

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

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

初始化的变量进入.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段的内容:

技术分享图片

 

以上是关于深入理解程序的结构的主要内容,如果未能解决你的问题,请参考以下文章

软件开发--深入理解程序的结构

使用Java语言深入理解程序逻辑——循环结构

使用Java语言深入理解程序逻辑——循环结构

深入理解Java内存结构

深入理解程序的结构

使用Java语言深入理解程序逻辑——条件结果