【问题标题】:what are the differences between an executable generated by windows and linux [duplicate]windows和linux生成的可执行文件有什么区别[重复]
【发布时间】:2010-01-14 21:01:12
【问题描述】:

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

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

【问题讨论】:

标签: c linux compiler-construction


【解决方案1】:

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

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

【讨论】:

  • 过去,Windows 支持 COM 可执行文件,这基本上只是原始程序集 - 没有任何标题。有人知道它是否仍然这样做?
  • @lpthnc:Mac OS X 使用 Mach-O 格式,继承自 NeXTSTEP。 Classic Mac OS 使用 PEF 格式。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 这就是他写信的原因,Suppose I compile a simple C program containing function calls that are common to both windows and linux
    • 好吧,即使你不调用任何函数,编译器也必须生成API调用来设置堆栈
    • @andomar 编译器没有进行进程调用....
    • 如果您正在为该平台进行编译,则可以使用编译器指令(即包含 Windows API 并调用 WinMain)构建代码以在两个平台上进行编译。
    • 在他的程序中写入什么函数调用并不重要。启动顺序(在他的main() 启动之前运行的东西)可能完全取决于机器和操作系统,并且在 Windows 和 Linux 之间完全不同。
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

        猜你喜欢
        • 2018-07-02
        • 2014-08-30
        • 1970-01-01
        • 2020-08-16
        • 1970-01-01
        • 1970-01-01
        • 2011-03-05
        • 2010-12-28
        • 1970-01-01
        相关资源
        最近更新 更多