可执行文件实际包含什么? ..它是否包含Opcode和操作数形式的处理器指令?如果是这样,为什么我们为不同的操作系统提供不同的可执行文件?
答案 0 :(得分:10)
是的,代码采用操作码和操作数的形式,当然也包括数据。您想要做的任何事情都涉及操作系统,取决于操作系统,而不是CPU。这就是为什么您需要针对不同操作系统的不同程序。在Windows中打开一个窗口不是使用与Linux中相同的指令序列,依此类推。
答案 1 :(得分:10)
处理器根据操作码理解程序 - 所以你对包含操作码的可执行文件的直觉是正确的,你猜对了,任何可执行文件都必须有操作码和操作数才能在处理器上执行程序。
但是,程序主要是在操作系统的帮助下执行的(你可以编写不使用操作系统来执行的程序,但这将是很多不必要的工作) - 它们提供了程序硬件之上的抽象。可以使用。操作系统负责为任何程序运行设置“上下文”,即为程序提供所需的内存,提供通用库,程序可以使用它来执行常见的操作,例如写入文件,打印到控制台等。 / p>
但是,要设置程序的上下文(提供内存,加载数据,为其设置堆栈),操作系统需要读取程序的可执行文件,并且需要了解程序的一些内容作为程序期望使用的数据,该数据的大小,存储在该数据区域中的初始值,组成该程序的操作码列表(也称为过程的文本区域),它们的大小等。所有这些数据和更多(调试信息,只读数据,如程序中的硬编码字符串,符号表等)存储在可执行文件中。每个操作系统都了解此可执行文件的不同格式,因为他们希望所有这些信息以不同的方式存储在可执行文件中。查看Groo提供的链接。
用于在可执行文件中存储信息的几种格式是UNIX系统上的ELF和COFF以及Windows上的PE。
P.S。 - 并非所有程序都需要可执行格式。在Google上查找引导加载程序。这些是占用硬盘上可引导分区的第一个扇区的特殊程序,用于加载操作系统本身。
答案 2 :(得分:8)
正如unwind在他的回答中暗示的那样,可执行文件包含对操作系统中的例程的调用。
对于可执行文件来说,尝试实现操作系统已经提供的功能(例如,写入磁盘,接受输入)是非常低效的,因此大量使用对OS功能的调用。
不同的操作系统提供执行类似操作的功能,但如何调用这些功能(以及其中)的详细信息可能不同。
因此,除了处理器类型的主要差异之外,为一个操作系统编写的可执行文件将无法与另一个操作系统一起使用。
答案 3 :(得分:4)
要执行任何形式的IO,可执行文件需要使用sys-calls与操作系统进行交互。在Windows中,这些是对Win32 API的调用,在linux / unit上,这些调用主要是posix调用。
此外,可执行文件格式与OS的不同之处与PNG文件与GIF文件的不同之处不同。数据的排序方式不同,并且有不同的标题和子标题。
答案 4 :(得分:1)
答案 5 :(得分:0)
可执行文件包含几个数据块和有关如何将数据加载到内存中的说明。其中一些部分恰好包含可以执行的机器代码。其他部分包含程序数据,资源,重定位信息,导入信息等。