编译结果中各段意义

编译器编译出来的结果在map 或try文件中可以看到很多.text .bss等段却不知道具体的意义,现在就来整理分析一下各段的含义

可执行代码段,.text

   Windows 3.1和WindowsNT之间的一个区别就是WindowsNT默认的做法是将所有的代码段(正如它们在Windows3.1中所提到的那样)组成了一个单独的段,名为 “.text”。既然WindowsNT使用了基于页面的虚拟内存管理系统,那么将分开的代码放入不同的段之中的做法就不太明智了。因此,拥有一个大的代码段对于操作系统和应用程序开发者来说,都是十分方便的。
  .text段也包含了早先提到过的入口点。IAT亦存在于.text段之中的模块入 口点之前。(IAT在.text段之中的存在非常有意义,因为这个表事实上是一系列的跳转指令,并且它们的跳转目标位置是已固定的地址。)当 WindowsNT的可执行映像装载入进程的地址空间时,IAT就和每一个导入函数的物理地址一同确定了。要在.text段之中查找IAT,装载器只用将 模块的入口点定位,而IAT恰恰出现于入口点之前。既然每个入口拥有相同的尺寸,那么向后退查找这个表的起始位置就很容易了。

数据段,.bss、.rdata、.data

   .bss段表示应用程序的未初始化数据,包括所有函数或源模块中声明为static的变量。
   .rdata段表示只读的数据,比如字符串文字量、常量和调试目录信息。
  所有其它变量(除了出现在栈上的自动变量)存储在.data段之中。基本上,这些是应用程序或模块的全局变量。

资源段,.rsrc

  .rsrc段包含了模块的资源信息。它起始于一个资源目录结构,这个结构就像其它大多数结构一样,但是它的数据被更进一步地组织在了一棵资源树之中。以下的IMAGE_RESOURCE_DIRECTORY结构形成了这棵树的根和各个结点。

 

 

除了最常见的为 .text, .data, .bss 这 3 个段之外,还有其它的一些常见段,如下所示:

.strtab : String Table 字符串表,用于存储ELF 文件中用到的各种字符串。

.symtab : Symbol Table 符号表,从这里可以所以文件中的各个符号。

.shstrtab : 是各个段的名称表,实际上是由各个段的名字组成的一个字符串数组。

.hash : 符号哈希表。

.debug_line : 调试时的行号表,即源代码行号与编译后指令的对应表。

.dynamic : 动态链接信息。

.debug : 调试信息。

.comment : 存放编译器版本信息,比如"GCC:(GNU)4.2.0"。

.plt 和 .got : 动态链接的跳转表和全局入口表。

.init 和 .fini : 程序初始化和终结代码段。

.rodata1: Read Only Data,只读数据段,存放字符串常量,全局 const 变量,该段和 .rodata 一样
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值