一个已编译的C程序如何在多个体系结构上运行?

一个已编译的C程序如何在多个体系结构上运行?,c,architecture,compilation,C,Architecture,Compilation,以从某个网站下载的程序为例,可以选择的不同选项是常用的操作系统(Linux、Mac、Windows),但CPU架构又如何呢?该程序是一个二进制可执行文件。它只是假设amd64吗?还是将程序编译到所有受支持的体系结构中,并与顶部选择正确的脚本打包在一起 我只对C感兴趣,想知道这是如何实现的 在进一步的调查中,感谢下面的个人提供的可爱的信息,我在Mac和Linux上都得到了支持。它似乎不像windows那样支持它。Mac OS X二进制格式包括一种机制,用于在同一文件中为多个体系结构提供代码,因此

以从某个网站下载的程序为例,可以选择的不同选项是常用的操作系统(Linux、Mac、Windows),但CPU架构又如何呢?该程序是一个二进制可执行文件。它只是假设amd64吗?还是将程序编译到所有受支持的体系结构中,并与顶部选择正确的脚本打包在一起

我只对C感兴趣,想知道这是如何实现的



在进一步的调查中,感谢下面的个人提供的可爱的信息,我在Mac和Linux上都得到了支持。它似乎不像windows那样支持它。

Mac OS X二进制格式包括一种机制,用于在同一文件中为多个体系结构提供代码,因此单个Mac应用程序可以支持32位和64位x86;在最近的过去,PowerPC支持也是可能的,尽管现在已经过时了。但对于Windows和Linux,通常每个CPU架构都需要单独的二进制文件(正如评论所指出的,可以编写类似的文件,尽管这与标准做法相去甚远。)默认的,也是最常见的,是amd64,但有时您仍然会看到32位机器的单独下载。在这方面,世界过去更有趣,但现在的事情比以往任何时候都更加标准化。

您通常可以创建一个多体系结构的可执行文件,并有一个小的“最小公分母”boostrap部分,用于检测操作环境并启动特定于体系结构的代码。但是你不可能有一个通用的可执行文件可以在所有平台上运行。每个操作系统都有不同的可执行文件格式,并且没有一个与其他操作系统兼容,例如Linux使用ELF,Windows使用PE,OSX使用Mach-O。例如,作为一个很好的例子,从MS网站上获取任何Sysinternal实用程序。它是一个单独的small.exe,包含32位和64位版本,并带有一个小的boostrap部分。你做过什么谷歌搜索,都失败了?我尝试了一个搜索:“编译器是如何工作的”,得到了,还有很多其他的。谢谢你的回答,马克,这正是我需要知道的。现在我真的知道要研究什么了:p@MarcB我非常确定,如果没有内核干预,您无法在32位和64位模式之间切换。您所能做的最好的事情就是用所需的arch生成另一个进程,但这基本上是一个自解压的可执行文件,而不是一个引导程序。