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

可能重复:
为什么针对特定CPU的可执行程序在Linux和Windows上不起作用?

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

Solutions Collecting From Web of "由windows和linux生成的可执行文件有什么区别"

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

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

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

  1. 不同的容器格式(迄今为止似乎是这个答案的主要区别 – 但不是唯一的原因)。
  2. 不同的动态链接器语义 。
  3. 不同的ABI 。
  4. 不同的异常处理机制 – windows有SEH,C ++异常处理就是在这个机制上建立的
  5. 不同的系统调用语义和不同的系统调用 – 因此是不同的低级库。

二进制类型是不同的。 例如,Linux可以使用可执行文件和可链接格式,而Windows使用可执行文件格式。

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

是的,可执行文件使用不同的文件格式。 在这两种情况下,加载一个可执行文件来创建一个进程涉及到大量的工作,而且两者都没有(至少直接)包含处理加载其他二进制格式的代码。 即使这样做,大多数项目也会遇到很多问题。 举例来说,不少Linux程序都与共享库链接,因此要在Windows下成功加载它们,您不仅需要加载器,而且还需要一些东西来代替共享库。 实际上,当然不是只有一个共享的图书馆 – 有几十个。 当你模拟他们所有的时候,你将有一个相当大的操作系统作为一个整体移植到Windows。

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

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