希望这已经没有被问过和回答,但我刚刚对ARM提出了一个快速的问题。
具体来说,如果编译Android(它有很多C和C ++),你使用GCC编译,那不是创建基于x86的代码吗?使用精简指令集的ARM处理器如何解释此代码并像它一样运行?
谢谢!
答案 0 :(得分:3)
GCC不只是为x86编译。它实际上编译为任何指令集。如果你想,你可以通过添加几个文件来创建一个新的。
ARM不是精简指令集。它是一个完全不同的指令集。 ARM有一些x86没有的东西,反之亦然。
答案 1 :(得分:3)
构建gcc
会执行配置步骤,其中一部分是指定back-end。 后端负责生成op-code
。典型的编译器是许多阶段。简言之,将
有关详情,请参阅stackoverflow compiler wiki。
部分一个到三个对x86
和ARM
版gcc
(或任何 GCC )。 Android编译器是gcc
的一个版本,已配置为生成 ARM 代码。它与通常在 x86 上运行的编译器不同。您可以在PC上运行 ARM模拟器,然后相信此代码由 x86 运行。但是,这是运行此代码的virtual ARM machine。 x86
处理器本身无法运行ARM
代码。
Android gcc 是ARM配置的gcc
。为gcc
或x86
配置了正常的 Linux发行版 x86_64
。
上面缺少一些东西:谁编译编译器?在这两种情况下, x86 编译器都会编译新的编译器。区别在于所选的后端。一个是 x86 ,另一个是 ARM 。两个编译器都运行在 x86 上,但它们为不同的目标生成代码。 Gcc可以仅为ARM
或 x86
生成代码;从来没有通过任何类型的命令行开关。编译器 build 通常指三种不同的CPU类型。
我想也许人们在想,因为他们都在同一个主机上运行,他们必须为同一个目标生成代码。但事实并非如此;起初它是一个小小的心灵弯曲。根据设置的不同,您可能需要为这些机器中的每台机器编译器才能进行最终编译。
任何机器的第一个编译器通常都是交叉编译器。除了一些很久以前在汇编程序中编写原始编译器的人。
另见:Cross compiler。
答案 2 :(得分:1)
简单地说,当你在x86计算机上为ARM构建时,你正在使用交叉编译器 - 一个在一个平台上运行但为另一个平台生成代码的编译器。这在开发嵌入式或移动平台时非常常见。