加入收藏 | 设为首页 | 会员中心 | 我要投稿 云计算网_泰州站长网 (http://www.0523zz.com/)- 视觉智能、AI应用、CDN、行业物联网、智能数字人!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

Linux/Unix平台可执行文件格式分析

发布时间:2016-01-26 08:35:52 所属栏目:Linux 来源:网络整理
导读:简介:本文讨论了 UNIX/LINUX 平台下三种主要的可执行文件格式:a.out( assembler and link editor output 汇编器和链接编辑器的输出)、COFF (Common Object

COFF 文件格式分析

COFF 格式比 a.out 格式要复杂一些,最重要的是包含一个节段表(section table),因此除了 .text,.data,和 .bss 区段以外,还可以包含其它的区段 。另外也多了一个可选的头部,不同的操作系统可一对此头部做特定的定义。

COFF 文件格式如下:

File Header(文件头部)
Optional Header(可选文件头部)
Section 1 Header(节头部)
………
Section n Header(节头部)
Raw Data for Section 1(节数据)
Raw Data for Section n(节数据)
Relocation Info for Sect. 1(节重定位数据)
Relocation Info for Sect. n(节重定位数据)
Line Numbers for Sect. 1(节行号数据)
Line Numbers for Sect. n(节行号数据)
Symbol table(符号表)
String table(字符串表)

文件头部的数据结构:

struct filehdr
  {
   unsigned short f_magic;  /* 魔数 */
    unsigned short f_nscns;  /* 节个数 */
    long      f_timdat;  /* 文件建立时间 */
    long      f_symptr;  /* 符号表相对文件的偏移量 */
    long      f_nsyms;  /* 符号表条目个数 */
    unsigned short f_opthdr;  /* 可选头部长度 */
    unsigned short f_flags;  /* 标志 */
  };

COFF 文件头部中魔数与其它两种格式的意义不太一样,它是表示针对的机器 类型,例如 0x014c 相对于 I386 平台,而 0x268 相对于 Motorola 68000系列 等。当 COFF 文件为可执行文件时,字段 f_flags 的值为 F_EXEC(0X00002) ,同时也表示此文件没有未解析的符号,换句话说,也就是重定位在连接时就已 经完成。由此也可以看出,原始的 COFF 格式不支持动态连接。为了解决这个问 题以及增加一些新的特性,一些操作系统对 COFF 格式进行了扩展。Microsoft 设计了名为 PE(Portable Executable)的文件格式,主要扩展是在 COFF 文件 头部之上增加了一些专用头部,具体细节请参阅参考资料 18,某些 UNIX 系统 也对 COFF 格式进行了扩展,如 XCOFF(extended common object file format )格式,支持动态连接,请参阅参考资料 5。

紧接文件头部的是可选头部,COFF 文件格式规范中规定可选头部的长度可以 为 0,但在 LINUX 系统下可选头部是必须存在的。下面是 LINUX 下可选头部的 数据结构:

typedef struct
{
   char  magic[2];  /* 魔数 */
   char  vstamp[2];  /* 版本号 */
   char  tsize[4];  /* 文本段长度 */
   char  dsize[4];  /* 已初始化数据段长度 */
   char  bsize[4];  /* 未初始化数据段长度 */
   char  entry[4];  /* 程序进入点 */
   char  text_start[4];    /* 文本段基地址 */
   char  data_start[4];    /* 数据段基地址 */
}
COFF_AOUTHDR;

(编辑:云计算网_泰州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读