Operating system 创建许多可执行文件格式有什么用?

Operating system 创建许多可执行文件格式有什么用?,operating-system,kernel,executable,portable-executable,coff,Operating System,Kernel,Executable,Portable Executable,Coff,我正在学习操作系统的概念。我已经设法自己创建了一个引导加载程序。 我生成的每个可执行文件都在BIN中 我看到微软的系统使用PE文件格式。类似地,Unix使用COFF 这些多种文件格式有什么用途?与其他团队相比,他们是否有任何文件保护或其他功能?除了独立团队以不同的方式解决同一问题外,可能没有其他原因。几年前,当每一个计算机系统都是不同的、不兼容的,都有专有的操作系统,并且没有开源代码可言时,对象文件格式标准化将毫无用处。随着CP/M、Unix、MS-DOS、Linux和Windows等便携式操作

我正在学习操作系统的概念。我已经设法自己创建了一个引导加载程序。 我生成的每个可执行文件都在BIN中

我看到微软的系统使用PE文件格式。类似地,Unix使用COFF

这些多种文件格式有什么用途?与其他团队相比,他们是否有任何文件保护或其他功能?

除了独立团队以不同的方式解决同一问题外,可能没有其他原因。几年前,当每一个计算机系统都是不同的、不兼容的,都有专有的操作系统,并且没有开源代码可言时,对象文件格式标准化将毫无用处。随着CP/M、Unix、MS-DOS、Linux和Windows等便携式操作系统的引入,同一类型系统之间的一些标准化元素变得必要,但没有必要跨这些系统进行标准化

请注意,Microsoft的可执行文件格式为PE,但PE中使用的对象文件格式为COFF

使不同格式适合不同环境的目标代码格式的另一个方面是运行时环境。加载到ROM的代码不需要元数据,因为它不是动态加载的,因为可能会使用原始二进制或十六进制编码的文件,类似地,位置相关代码需要加载的信息很少,但是,由操作系统加载的用户应用程序代码包含操作系统的加载程序用于在适当的运行时环境中加载和启动应用程序的信息。不同的操作系统执行此过程的方式不同,因此它们具有不同的可执行格式可能并不奇怪。

除了独立的团队以不同的方式解决相同的问题外,可能没有其他原因。几年前,当每一个计算机系统都是不同的、不兼容的,都有专有的操作系统,并且没有开源代码可言时,对象文件格式标准化将毫无用处。随着CP/M、Unix、MS-DOS、Linux和Windows等便携式操作系统的引入,同一类型系统之间的一些标准化元素变得必要,但没有必要跨这些系统进行标准化

请注意,Microsoft的可执行文件格式为PE,但PE中使用的对象文件格式为COFF


使不同格式适合不同环境的目标代码格式的另一个方面是运行时环境。加载到ROM的代码不需要元数据,因为它不是动态加载的,因为可能会使用原始二进制或十六进制编码的文件,类似地,位置相关代码需要加载的信息很少,但是,由操作系统加载的用户应用程序代码包含操作系统的加载程序用于在适当的运行时环境中加载和启动应用程序的信息。不同的操作系统执行此过程的方式不同,因此它们具有不同的可执行格式可能并不奇怪。

历史上,今天使用的通用对象文件格式是,并且完全独立地为特定的操作系统(Windows NT、Unix System V R4和Mach)开发的旨在解决以前对象文件格式的缺点

Unix a、 出去 Unix最早使用的对象文件和可执行文件格式是。这是一种非常简单的格式,几乎是当时硬件所需的最低限度。它的名称是由Unix汇编器和链接器使用的默认输出文件名获得的。如果没有指定输出文件,这些程序将创建一个名为
a.out
的文件。今天大多数Unix汇编器和链接器仍然这样做

咖啡 在Unix System V中,AT&T引入了(通用对象文件格式)来取代a.out格式。它也是一种可执行和对象文件格式。与a.out格式相比,它的主要改进是多个部分。a.out格式仅支持带有隐含
.bss
节的文本和数据节。多个部分使工具和应用程序在布局可执行文件时具有更大的灵活性,例如允许它们创建只读数据部分。COFF还增加了对共享库的支持

精灵 为了解决COFF的许多问题,AT&T为Unix系统VR4创建了ELF(可执行和可链接格式)。COFF的主要问题是它不是很灵活,也没有很好的定义,因此它必须由不同的供应商以各种不兼容的方式进行扩展。这不是人们希望的“通用”格式。ELF还支持与位置无关的共享对象,其符号链接形式比COFF共享库更具动态性。它还有一个相当复杂和可扩展的关联调试格式,称为

在Unix机器上,ELF是主要的可执行文件和对象文件格式。只有少数操作系统(如AIX)坚持使用基于COFF的自定义格式。所有大型开放源代码操作系统,Linux和BSD,都使用ELF,但值得注意的是,它们直接从基于a.out的格式转换为ELF,跳过了COFF。由于ELF是一种对象文件格式和可执行文件格式,这意味着大多数Unix开发工具创建ELF对象,这些对象链接在一起以创建ELF可执行文件

微软 OMF、.COM和MZ.EXE 在MS-DOS下,标准对象文件格式是Intel为其x86处理器创建的(对象模块格式)。MS-DOS本身使用两种不同的可执行格式。起初,它只支持简单的文件,只支持从CP/M(类似于MS-DOS1.x中的几乎所有内容)获取的简单二进制文件,如引导加载程序。在MS-DOS2.0中,Microsoft增加了对可执行文件的支持,之所以称为可执行文件,是因为它使用两个字符
MZ
作为一个神奇的数字来标识文件类型。MZ格式允许可执行文件使用多个段,而