快速业务通道

UNIX/LINUX 平台可执行文件格式分析

作者 佚名技术 来源 Linux系统 浏览 发布时间 2012-05-01
上面的描述可以看出,加载文件最重要的是完成两件事情:加载程序段和数据段到内存;进行外部定义符号的重定位.重定位是程序连接中一个重要概念.我们知道,一个可执行程序通常是由一个含有 main() 的主程序文件、若干目标文件、若干共享库(Shared Libraries)组成.(注:采用一些特别的技巧,也可编写没有 main 函数的程序,请参阅参考资料 2)一个 C 程序可能引用共享库定义的变量或函数,换句话说就是程序运行时知道这些变量/函数的地址.在静态连接中,程序所有需要使用的外部定义都完全包含在可执行程序中,而动态连接则只在可执行文件中设置相关外部定义的一些引用信息,真正的重定位是在程序运行之时.静态连接方式有两个大问题:如果库中变量或函数有任何变化都重新编译连接程序;如果多个程序引用同样的变量/函数,则此变量/函数会在文件/内存中出现多次,浪费硬盘/内存空间.比较两种连接方式生成的可执行文件的大小,可以看出有明显的区别. 拥有帝国一切,皆有可能。欢迎访问phome.net

  a.out 文件格式分析

  a.out 格式在不同的机器平台和不同的 UNIX 操作系统上有轻微的不同,例如在 MC680x0 平台上有 6 个 section.下面我们讨论的是最"标准"的格式.

  a.out 文件包含 7 个 section,格式如下:

  exec header(执行头部,也可理解为文件头部)

  text segment(文本段)

  data segment(数据段)

  text relocations(文本重定位段)

  data relocations(数据重定位段)

  symbol table(符号表)

  string table(字符串表)

  执行头部的数据结构:

  struct exec {

  unsigned long a_midmag; /* 魔数和其它信息 */

  unsigned long a_text; /* 文本段的长度 */

  unsigned long a_data; /* 数据段的长度 */

  unsigned long a_bss; /* BSS段的长度 */

  unsigned long a_syms; /* 符号表的长度 */

  unsigned long a_entry; /* 程序进入点 */

  unsigned long a_trsize; /* 文本重定位表的长度 */

  unsigned long a_drsize; /* 数据重定位表的长度 */

  };


文件头部主要描述了各个 section 的长度,比较重要的字段是 a_entry(程序进入点),代表了系统在加载程序并初试化各种环境后开始执行程序代码的入口.这个字段在后面讨论的 ELF 文件头部中也有出现.由 a.out 格式和头部数据结构我们可以看出,a.out 的格式非常紧凑,只包含了程序运行所的信息(文本、数据、BSS),每个 section 的顺序是固定的.这种结构缺乏扩展性,如不能包含"现代"可执行文件中常见的调试信息,最初的 UNIX 黑客对 a.out 文件调试使用的工具是 adb,而 adb 是一种机器语言调试器!

  a.out 文件中包含符号表和两个重定位表,这三个表的内容在连接目标文件以生成可执行文件时起作用.在最终可执行的 a.out 文件中,这三个表的长度都为 0.a.out 文件在连接时就把所有外部定义包含在可执行程序中,如果从程序设计的角度来看,这是一种硬编码方式,或者可称为模块之间是强藕和的.在后面的讨论中,我们将会具体看到ELF格式和动态连接机制是如何对此进行改进的.

  a.out 是早期UNIX系统使用的可执行文件格式,由 AT&T 设计,现在基本上已被 ELF 文件格式代替.a.out 的设计比较简单,但其设计思想明显的被后续的可执行文件格式所继承和发扬.可以参阅参考资料 16 和阅读参考资料 15 源代码加深对 a.out 格式的理解.参考资料 12 讨论了如何在"现代"的红帽LINUX运行 a.out 格式文件. 拥有帝国一切,皆有可能。欢迎访问phome.net

  COFF 文件格式分析

  COFF 格式比 a.out 格式要复杂一些,最重要的是包含一个节段表(section table),因此除了 .text,.data,和 .bss 区段以外,还可以包含其它的区段.另外也多了一个可选

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号