我知道每个CPU/体系 struct 都有自己的指令集,因此为特定CPU编写的程序(二进制)不能在另一个CPU上运行.但我真正不明白的是,为什么一个可执行文件(比如二进制文件,比如.exe)不能在Linux上运行,但可以在windows上运行,即使是在同一台机器上.

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

有没有消息来源能让我得到关于这件事的简短而详细的信息?

推荐答案

为了做一些有意义的事情,应用程序需要与操作系统接口.由于Windows和Unix/Linux上的系统调用和用户空间基础 struct 看起来有fundamentally种不同,因此可执行程序的不同格式是最小的麻烦.需要改变的是program logic.

(如果你的程序完全依赖于标准化组件,比如C运行时库,你可能会认为这是毫无意义的.这在理论上是正确的——但对大多数应用程序来说并不重要,因为它们被迫使用依赖操作系统的东西).

Windows PE之间的其他差异(EXE、DLL等)文件和Linux ELF个二进制文件与两种操作系统的不同图像加载程序和一些设计特征有关.例如,在Linux上,一个单独的程序用于解析外部库导入,而此功能是Windows上内置的.另一个例子:Linux共享库的功能不同于Windows上的DLL.更不用说这两种格式都经过了优化,以使各自的操作系统内核能够尽快加载程序.

像Wine这样的模拟器试图填补这一空白(and actually prove that the biggest problem is not the binary format but rather the OS interface!).

Linux相关问答推荐

空字符串和空文件的区别

是否有例外情况需要在.gitconfig中使用?

如何检测文件系统是否支持权限?

操作系统信号处理循环 - 阻塞或非阻塞读取?

如何使用 awk 重新排列列?

docker rm 命令在具有相同操作系统的不同机器上返回不同的状态码

try 使用 patchelf 修补 MuJoCo 二进制文件时出现执行格式错误

如何在 Linux 上使用 Python 判断进程是否仍在运行?

每次来宾重新启动后 Vagrant 执行脚本或命令(vagrant up)

GLIBCXX 版本

Git为每次推送输入长密码

为什么这个命令会杀死我的 shell?

无法覆盖符号链接 RedHat Linux

如何获取/使用 LibUUID?

从bash中的字符串中删除所有特殊字符和大小写

cmake : 从脚本设置环境变量

网络共享文件夹上的 GIT 存储库中的并发性

如何将所有文件从一个目录移动(和覆盖)到另一个目录?

ImportError:在 ubuntu 14.04 中没有名为 _io 的模块

仅当文件存在于 shell 脚本中时才移动