加入收藏 | 设为首页 | 会员中心 | 我要投稿 云计算网_泰州站长网 (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

8:动态连接器把控制传递给程序,从 ELF 文件头部中定义的程序进入点开 始执行。在 a.out 格式和ELF格式中,程序进入点的值是显式存在的,在 COFF 格式中则是由规范隐含定义。

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

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 是一种机器语言调试器!

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

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

热点阅读