Windows和Linux生成的可执行文件有什么区别?

4

3
为什么适用于特定 CPU 的可执行程序在 Linux 和 Windows 上都无法运行? - Remus Rusanu
5个回答

7
他们使用不同的容器格式。
大多数Linux可执行文件是ELF文件;所有Windows可执行文件和DLL都是PE文件。

2
早些年,Windows支持COM可执行文件,它基本上只是原始汇编 - 没有任何头文件。有人知道它现在是否仍然支持吗? - Anon.
1
@lpthnc:Mac OS X使用继承自NeXTSTEP的Mach-O格式。经典的Mac OS使用PEF格式。 - ephemient

6

3
二进制类型是不同的。例如,Linux可能使用可执行和可链接格式,而Windows使用可移植可执行格式。
但最大的问题在于API。Windows程序会调用Windows API来设置其进程,如堆栈和分配内存。显然,这些API调用在其他操作系统上不可用。

1
这就是他写下的原因,“假设我编译一个简单的C程序,其中包含在Windows和Linux上都常见的函数调用”。 - SLaks
2
即使您不调用任何函数,编译器也必须生成API调用来设置堆栈。 - Andomar
@andomar 编译器不会进行调用,而是进程执行调用操作... - Hassan Syed
如果您正在为该平台编译,则可以使用编译器指令(例如,包括Windows API并调用WinMain)构建代码以在两个平台上进行编译。 - Tim
他写入程序的任何函数调用并不重要。启动序列(在他的 main() 开始之前运行的东西)可能会非常依赖于机器和操作系统,而且在 Windows 和 Linux 之间可能会有很大的区别。 - Carl Smotricz
显示剩余2条评论

3
是的,这些可执行文件使用不同的文件格式。在两种情况下,加载可执行文件以创建进程涉及大量的工作,而且它们都没有(至少直接)包括处理加载其他二进制格式代码的功能。即使它有,大多数程序也会遇到重大问题。例如,许多Linux程序链接到共享库,因此要在Windows下成功加载它们,您不仅需要加载器,还需要一个副本来代替该共享库。实际上,当然,并不只有一个共享库 - 有几十个。如果你模拟了它们所有,你将把整个操作系统的相当大一部分移植到Windows上。

0

在Windows和Linux中,没有任何单个函数调用可以影响进程地址空间之外的任何内容,即使您可以让两个系统都执行该程序。除非也许:

void f()
{
    *((char*)0) = 0;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接