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


文件头记录了与可执行文件相关的一些基本信息。
静态分析工具大多根据程序的文件头获得相关信息。
初始化的变量进入.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段的内容:

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