凯哥stack

可执行程序和共享库格式的演化史

引言

之前研究过一个cygwin问题,「 细说windows dll加载,一个cygwin错误引发的思考 」,文中谈到windows的PE格式,实际上COFF的扩展,于是就把几个计算机历史上比较出名的几种可执行程序和共享库格式做了个分析,记录如下。

演化简史

演化过程

  • A.OUT
    操作系统: UNIX
    早期UNIX可执行程序格式,从1971年开始使用,本意为“assembler output”,在早期UNIX时代该文件格式主要包含1个文件头和3个段(text、symtable、relocation)参考链接,其中data段合并在text段中,以点开头。链接,当前在linux系统中默认编译的可执行程序名字还沿用a.out名字,但它的格式已经是ELF格式了。
  • COFF
    操作系统: UNIX
    Common Object File Format(COFF),诞生于AT&T于1983年发布的UNIX System V,共享库的概念在此年代开始流行,因此COFF覆盖了可执行程序、目标文件(object)、共享库,扩展性强于A.OUT,对段的数量没有限制,但是由于64位MIPS处理器,COFF马上遇到扩展性问题,即其文件头部分字段使用32位类型对64位支持不足,很快在COFF上扩展了几种格式,如ECOFF、XCOFF,以及一直沿用到现在的微软PE格式。参考链接
  • ECOFF
    操作系统: UNIX
    针对MIPS处理器扩展的一种基于COFF的文件格式,主要是修改了文件头的部分字段为Long型,即CPU位宽。
  • XCOFF
    操作系统: UNIX
    IBM基于COFF扩展的一种文件格式,除了64位问题外,还扩展了一些调试信息,分为XCOFF32/XCOFF64两种格式。
  • PE
    操作系统: Windows
    Portable Executable,微软在可执行程序、目标文件(object)、DLL(共享库)文件中使用的格式,基于COFF扩展,首先用于1993年发布的Windows NT3.1,在文件头增加了MS-DOS头,然后是COFF文件头,COFF可选文件头,但是已经在COFF定义的字段基础上扩展了很多字段,比如支持共享物理地址的ImageBase字段,为DLL扩展的DllCharacteristics字段等等,沿用了COFF relocation,COFF symtable,COFF string table,从整体上看基本上是大改魔改了。参考链接
  • ELF
    操作系统: UNIX LIKE
    Executable and Linking Format,目前Unix Like系统中最常用的可执行和共享库、目标文件格式,主要解决COFF扩展性问题,重新对文件格式进行设计,并于1988年首次在UNIX System V Release 4(SVR4)中使用,在随后的时间大部分Unix Like操作系统包括linux、freeBSD等都切换到该文件格式,并一直沿用至今,在linux使用readelf -h a.out,会发现如下打印,其中有一个OS/ABI一直保留UNIX - System V参考链接
    1
    2
    3
    4
    5
    6
    ELF Header:
    Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
    Class: ELF64
    Data: 2's complement, little endian
    Version: 1 (current)
    OS/ABI: UNIX - System V

参考材料
[1] https://en.wikipedia.org/wiki/COFF
[2] https://docs.microsoft.com/en-us/windows/win32/debug/pe-format

凯哥stack

著作权归作者所有,禁止转载


专题:

本文发表于 2020-05-02,最后修改于 2020-05-03。

本站永久域名kaige86.com,也可搜索「 凯哥stack 」找到我。

期待关注我的 ,查看最近的文章和动态。


上一篇 « 新冠接触者追踪(三) -- 技术草案更新 下一篇 » 计算机体系结构(一) 三大体系结构浅析

推荐阅读

Big Image