为什么“可执行文件”操作系统依赖于?

我知道每个CPU /架构都有它自己的指令集,因此为特定CPU编写的程序(二进制)不能在另一个CPU上运行。 但是我不明白为什么一个可执行文件(像.exe这样的二进制文件)不能在Linux上运行,但是即使在同一台机器上也可以在Windows上运行。

这是一个基本的问题,我期待的答案是.exe和其他二进制格式可能不是原始机器指令,但它们包含一些依赖于操作系统的数据。 如果这是真的,那么这个操作系统相关的数据是什么样的? 作为一个例子.exe文件的格式和它和Linux可执行文件的区别是什么?

有一个来源,我可以得到简短的和详细的信息呢?

为了做一些有意义的事情,应用程序将需要与操作系统连接。 由于系统调用和用户空间基础结构在Windows和Unix / Linux上看起来根本不同,因此具有不同的可执行程序格式是最小的麻烦。 这是需要改变的程序逻辑

(如果你有一个完全依赖于标准化组件的程序,例如C运行时库,你可能会认为这是没有意义的,理论上这是正确的,但是对于大多数应用程序来说,这是不相干的,因为它们被迫使用与OS相关的东西。

Windows PE (EXE,DLL,..)文件和Linux ELF二进制文件之间的其他差异与两种操作系统的不同图像加载器和一些devise特性有关。 例如,在Linux上,使用单独的程序来parsing外部库导入,而此function是在Windows上内置的。 另一个例子:Linux共享库的function与Windows上的DLL不同。 更不用说,两种格式都经过优化,可以使相应的操作系统内核尽快加载程序。

像Wine这样的模拟器试图填补这个空白( 事实certificate,最大的问题不是二进制格式,而是OS界面! )。

.exe和其他二进制格式[绝对]不是原始机器指令,但它们包含一些依赖于操作系统的数据。

这个操作系统相关的数据是什么样的 作为一个例子.exe文件的格式和它和Linux可执行文件的区别是什么?

那么,我想Google完全失败了。 .EXE格式由Windows文档定义得非常好。

http://support.microsoft.com/kb/65122

Linux ld应用程序在将“exec”加载到该文件之前将可执行文件加载到内存中。 你可以阅读ld格式,甚至是着名的a.out文件。

http://linux.die.net/man/1/ld

http://en.wikipedia.org/wiki/A.out

http://en.wikipedia.org/wiki/Executable

除了必须被系统加载器识别的可执行格式(即将可执行文件带入内存的操作系统的一部分),真正的问题是操作系统的接口。 您可以将操作系统看作是一种API,它提供了进行特定操作所需的入口点,例如,将字符写入控制台。

这些细节通常或多或less地隐藏在最终用户的身上,以便您可以在高级语言中使用相同的源代码将字符写入屏幕。 但是经常情况下,情况会更加不同,例如Windowing环境。 并不是所有的高级语言都提供了一个窗口层,即使在这些差异上也是抽象的。

一个非常天真的答案:

  1. 由于不同的工艺装载机,其结构不同;
  2. 使用操作系统相关的function,如系统调用,从操作系统到操作系统。

我不能在* nix上评论太多,但是,二进制的代码部分通常很喜欢在任何一种环境中运行,但是它是对二进制文件有一定要求的操作系统。 在Windows中,您应该阅读PE头 。

第二部分简单地由开发人员决定,很多时候代码部分会引用特定于操作系统的库文件 – 这就是为什么在编译为二进制代码之前可以同时使用可移植和不可移植的C ++代码。

通常,程序会调用Windows中的各种API,以免每次都“重新发明轮子”。

希望其他操作系统也包含类似API的方法,以允许程序调用它们的function。 不过我不知道。 我是个人电脑。 🙂

显然,在不同的操作系统下运行在同一台机器上时,这些API不会被定义。

程序需要知道如何调用操作系统服务。 如何做到这一点取决于操作系统:一些使用中断,一些使用x86 lcall指令,一些(特别是Windows)具有独特的共享库,并且不logging如何直接调用服务。 旧的680×0 Mac和其他一些680×0操作系统使用了一个保留的指令集区域,并捕获了“无效的CPU操作码”exception。 此外,即使机制相同,系统调用的顺序和参数格式在操作系统(有时也是相同操作系统的不同版本)上有所不同;请参阅Linux内核中的stat() ,以获取已更改接口的示例几次)。

有一些处理其他操作系统惯例的能力:FreeBSD具有处理Linux特定内核接口的“linuxulator”,NetBSD同样具有仿真器,用于使用相同硬件的其他操作系统的系统调用格式(例如,Ultrix MIPS或Alpha上的OSF / 1),Linux曾经使用iBCS2来处理UnixWare / SCO Unix内核接口,Wine为PE风格的Windows可执行文件提供了替代共享库和二进制加载器。 (我不记得Wine是否也支持OS / 2样式的LX.exe;它可能处理原始格式的.exe ;然后是.com ,这是一个原始内存转储,头部被打上了。)即便如此,总是有一些使用不同惯例的格式,有时这些惯例足够相似,需要操作系统提示如何处理它。 (例如,请参阅FreeBSD上的bless 。)