Operating system 为什么可以';编译后的机器代码(EXE、PE、APP)是否能在所有平台上运行?

Operating system 为什么可以';编译后的机器代码(EXE、PE、APP)是否能在所有平台上运行?,operating-system,cross-platform,executable,Operating System,Cross Platform,Executable,当C代码被编译成exe/pe/app时,(据我所知),它被转换成机器代码。这可以由处理器运行 我的问题是,由于这是一个非常低的级别,它不应该对操作系统特定的函数进行任何调用(因为这些函数也已经编译为机器代码)。那么,为什么它不能在不同的平台上运行,比如Linux、Windows、OSX?这个问题的前提是对计算机如何工作的误解 编译一个简单的“hello world”可执行文件。拆开它,或者 它是否包含put/printf的库实现的副本?不,它是到libc的,所以每个程序不需要它使用的每个库函数的

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


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

这个问题的前提是对计算机如何工作的误解

编译一个简单的“hello world”可执行文件。拆开它,或者

它是否包含
put
/
printf
的库实现的副本?不,它是到libc的,所以每个程序不需要它使用的每个库函数的自己的副本

它是否包含实际在视频内存中绘制文本的图形驱动程序?不,当然不可能,对于运行在a中的程序来说,这是不可能的:操作系统不能让进程直接访问硬件;他们可以使电脑崩溃或者在彼此的窗口上画画

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



撇开所有这些不谈,有多个体系结构不理解彼此的机器代码。因此,即使在同一操作系统中,x86二进制文件也不会在ARM CPU上本机运行。

首先,二进制文件格式不同,因此需要适当的加载程序。其次,它可能使用具有不同调用约定的库。第三,代码通常会调用特定于操作系统的函数,哪些函数可用以及如何调用它们取决于操作系统<代码>winelinux上的windows代码基本上以本机模式运行,模拟必要的库和操作系统接口。@Jester但链接器不会将操作系统特定函数中的程序集代码添加到主可执行文件中,这样就可以在不同平台上运行程序集了吗?操作系统不是可执行文件的一部分,它是另一层,能够启动可执行文件并提供服务。每个平台上的操作系统都会不同,编译器也不会有一个包含所有不同平台的操作系统的库。从源代码的角度来看,C是通用的,而不是二进制的。然后,随着时间的推移,处理器会有无数的差异,也许你可以用最小公分母来编译……还有很多需要补充的:调用约定(cdecl vs fastcall vs…),二进制格式(elf vs mach-o vs win32 vs…),等等@Leandros:我正试图基于这样一个错误的前提来思考这个问题的一个接近的原因;太宽可能就行了。我本来想留下一条评论,但这足以成为一个答案。你说得对:一个完整的答案应该是一本书。我投了反对票,不是因为信息不好。这个问题显然很宽泛(出于同样的原因,我否决了它并推荐了close),我认为用宽泛的答案回答宽泛的问题是没有帮助的(你承认答案可能是一本书)。发表评论可能会更好。我会对这个答案投赞成票(如果不太宽泛的话),并将其与一个特定的问题联系起来。你可以写你自己的问题,更具体,并提供一个具体的答案,其中有一些信息。你的开场白有点夸张antagonistic@MichaelPetch:谢谢你在开场白上的评论。将其更改为对问题怀有敌意,而不是询问者本人。(问一个糟糕的问题不会让你变成一个坏人。)这只是“太宽泛了”,因为要纠正导致这个问题的错误理解需要大量的信息。从某些观点来看,这个问题本身似乎相当具体。理解答案需要阅读我链接到的wiki页面,但我认为它可以相当直接地回答这个问题,说“不,这不是东西的工作原理”,而不会涉及其他可移植性问题。@MichaelPetch:我没有投票,但我可以看到这个问题可能对网站有未来价值。任何已经知道答案的人都可以从问题标题中看到这是关于什么的,所以搜索结果混乱不是一个大问题。如果其他人认为应该删除这个Q,我可以先删除这个答案来启用它。