windows和linux生成的可执行文件之间有什么区别

时间:2010-01-14 21:01:13

标签: c linux compiler-construction

  

可能重复:
  Why an executable program for a specific CPU does not work on Linux and Windows?

为什么用linux编写的程序不能在windows中执行?假设我编译了一个简单的C程序,其中包含windows和linux共有的函数调用,编译器是否在windows和linux下生成不同的二进制文件?

5 个答案:

答案 0 :(得分:5)

他们使用不同的容器格式。

大多数Linux可执行文件都是ELF个文件;所有Windows可执行文件和DLL都是PE个文件。

答案 1 :(得分:5)

以下是我能想到的一些原因:

  1. 不同的容器格式(到目前为止似乎是这个答案的主要区别 - 但不是唯一的原因)。
  2. different dynamic linker semantics
  3. 不同ABI
  4. 不同的异常处理机制 - windows has SEH -- upon which C++ exception handling is built
  5. 不同的系统调用语义和不同的系统调用 - 因此不同的低级库。

答案 2 :(得分:3)

二进制类型不同。例如,Linux可能使用Executable and Linkable格式,而Windows使用Portable Executable格式。

但最大的问题是API。 Windows程序会调用Windows API来设置它的进程,如堆栈,并分配内存。很明显,这些API调用在其他操作系统上不可用。

答案 3 :(得分:3)

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

答案 4 :(得分:0)

在Windows和Linux中都没有单一的函数调用可以影响进程的地址空间,即使你可以让两个系统都执行程序。除了:

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