深入理解程序的结构
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段的内容:
以上是关于深入理解程序的结构的主要内容,如果未能解决你的问题,请参考以下文章