为什么编译后的机器代码(EXE,PE,APP)无法在所有平台上运行?

时间:2016-04-27 15:04:18

标签: operating-system cross-platform executable

当C代码被编译到exe / pe / app时(据我所知),它被转换为机器代码。然后,这可以由处理器运行。

我的问题是,由于这是非常低级别的,因此不应该对OS特定函数进行任何调用(因为这些函数也已经编译为机器代码)。那么为什么它不能在不同的平台上运行,比如Linux,Windows,OSX?

1 个答案:

答案 0 :(得分:1)

问题的前提是基于对计算机如何工作的重大误解。

编译一个简单的" hello world"可执行文件。反汇编,或let the Godbolt Compiler Explorer do that for you

它是否包含puts / printf的库实现的副本?不。它是libc dynamically linked所以每个程序都不需要它自己使用的每个库函数的副本。

它是否包含实际在视频内存中绘制文本的图形驱动程序?不,当然不是,对于在multi-tasking OS with memory protection中运行的程序来说甚至是不可能的:操作系统不能让进程直接访问硬件;他们可以使计算机崩溃或在彼此的窗户上画画。

相反,进程使系统调用与自身之外的事物进行交互。

将所有这些放在一边,有多种架构无法理解彼此的机器代码。因此,即使在同一个操作系统中,x86二进制文件也不会在ARM CPU上本机运行。