Binary 可执行文件实际上包含什么?

Binary 可执行文件实际上包含什么?,binary,operating-system,Binary,Operating System,可执行文件实际上包含什么。。它是否包含以操作码和操作数形式发送给处理器的指令?如果是这样,为什么不同的操作系统有不同的可执行文件?是的,以操作码和操作数的形式编写的代码,当然还有数据。任何涉及操作系统的操作都取决于操作系统,而不是CPU。这就是为什么不同的操作系统需要不同的程序。在Windows中打开窗口的指令顺序与在Linux中不同,依此类推。正如他的回答所暗示的,可执行文件包含对操作系统中例程的调用 如果一个可执行文件试图实现操作系统已经提供的功能(例如,写入磁盘、接受输入),那么对操作系统

可执行文件实际上包含什么。。它是否包含以操作码和操作数形式发送给处理器的指令?如果是这样,为什么不同的操作系统有不同的可执行文件?

是的,以操作码和操作数的形式编写的代码,当然还有数据。任何涉及操作系统的操作都取决于操作系统,而不是CPU。这就是为什么不同的操作系统需要不同的程序。在Windows中打开窗口的指令顺序与在Linux中不同,依此类推。

正如他的回答所暗示的,可执行文件包含对操作系统中例程的调用

如果一个可执行文件试图实现操作系统已经提供的功能(例如,写入磁盘、接受输入),那么对操作系统功能的调用将是非常低效的

不同的操作系统提供做相似事情的函数,但是如何调用这些函数(以及它们在哪里)的细节可能不同


因此,除了处理器类型的主要差异外,为一个操作系统编写的可执行文件不会与另一个操作系统一起工作。

要执行任何形式的IO,可执行文件需要使用sys调用与操作系统接口。在Windows中,这些是对Win32 API的调用,在linux/unit上,这些调用主要是posix调用


此外,可执行文件格式与操作系统不同,就像PNG文件与GIF文件不同一样。数据的顺序不同,有不同的头和子头。

处理器从操作码的角度理解程序-因此您对包含操作码的可执行文件的直觉是正确的,并且您正确地猜测,任何可执行文件都必须具有操作码和操作数,才能在处理器上执行程序

然而,程序大多是在操作系统的帮助下执行的(您可以编写不使用操作系统执行的程序,但这将是大量不必要的工作),操作系统在程序可以使用的硬件之上提供抽象。操作系统负责为任何要运行的程序设置“上下文”,即为程序提供所需的内存,提供通用库,程序可以使用这些库来执行常见操作,如写入文件、打印到控制台等

但是,为了设置程序的上下文(为程序提供内存、加载数据、设置堆栈),操作系统需要读取程序的可执行文件,并需要了解一些有关程序的信息,例如程序预期使用的数据、数据的大小、存储在该数据区域中的初始值,组成程序的操作码列表(也称为进程的文本区域)、大小等。所有这些数据以及更多数据(调试信息、只读数据,如程序中的硬编码字符串、符号表等)都存储在可执行文件中。每个操作系统都理解此可执行文件的不同格式,因为它们希望所有这些信息以不同的方式存储在可执行文件中。查看Groo提供的链接

用于在可执行文件中存储信息的两种格式是UNIX系统上的ELF和COFF以及Windows上的PE


另外,并非所有程序都需要可执行格式。在谷歌上查找引导加载程序。这些特殊程序占据硬盘上可引导分区的第一个扇区,用于加载操作系统本身。

可执行文件包含多个数据块以及有关如何将数据加载到内存的说明。其中一些部分碰巧包含可以执行的机器代码。其他部分包含程序数据、资源、重新定位信息、导入信息等。

可执行文件通常包含有关程序本身的元数据,操作系统可以将这些元数据用于某些事情。我认为
.com
文件是可执行程序的最后残余,这些程序只是代码和数据,操作系统只是将文件加载到内存中,将IP指向那里并让它运行:-)在Windows中,系统调用构成本机API,而不是Win32 API。Win32是前NT时代的遗留物,只是本机API的包装器。没错,除了本机API没有正式的文档记录,您永远不应该使用它之外。