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

Sph*_*inx 21 binary operating-system

可执行文件实际包含什么?..它是否包含Opcode和操作数形式的处理器指令?如果是这样,为什么我们为不同的操作系统提供不同的可执

unw*_*ind 10

是的,代码以操作码和操作数的形式,当然还有数据.您想要做的任何事情都涉及操作系统,取决于操作系统,而不是CPU.这就是为什么您需要针对不同操作系统的不同程序.在Windows中打开一个窗口不是使用与Linux中相同的指令序列,依此类推.

  • 可执行文件包含有关程序本身的元数据,操作系统可以将其用于某些事情.我认为`.com`文件是可执行程序的最后一个残余,只有代码和数据,操作系统只是将文件加载到内存中,指向那边的IP并让它运行:-) (2认同)

Sud*_*shu 10

处理器根据操作码来理解程序 - 所以你对包含操作码的可执行文件的直觉是正确的,你猜对了,任何可执行文件都必须有操作码和操作数来在处理器上执行程序.

但是,程序主要是在操作系统的帮助下执行的(您可以编写不使用OS来执行的程序,但这将是许多不必要的工作) - 它们提供了程序可以使用的硬件之上的抽象.操作系统负责为任何程序设置"上下文",即为程序提供所需的内存,提供通用库,程序可以使用它来执行常见的操作,例如写入文件,打印到控制台等.

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

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

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


pav*_*ium 8

作为开卷在他的回答暗示,一个可执行文件包含在操作系统例程的调用.

对于可执行文件来说,尝试实现OS已经提供的功能(例如,写入磁盘,接受输入)是非常低效的,因此大量使用对OS功能的调用.

不同的操作系统提供执行类似操作的功能,但是如何调用这些功能(以及它们所在的位置)的细节可能不同.

因此,除了处理器类型的主要差异之外,为一个OS编写的可执行文件将无法与另一个OS一起使用.