希望这还没有被问过和回答,但我只是有一个关于 ARM 的快速问题。
具体来说,如果在编译 Android(有很多 C 和 C++)时,使用 GCC 编译,那不是创建基于 x86 的代码吗?使用精简指令集的 ARM 处理器如何解释这段代码并像它一样运行?
谢谢!
希望这还没有被问过和回答,但我只是有一个关于 ARM 的快速问题。
具体来说,如果在编译 Android(有很多 C 和 C++)时,使用 GCC 编译,那不是创建基于 x86 的代码吗?使用精简指令集的 ARM 处理器如何解释这段代码并像它一样运行?
谢谢!
构建gcc
经过一个配置步骤,其中一部分是指定后端。后端负责op-code
生成。典型的编译器有很多阶段。简要地,
有关更多信息,请参阅stackoverflow 编译器wiki。
因此,第一到第三部分对于( 或任何gcc )x86
的ARM
版本是常见的。Android 编译器是已配置为生成ARM代码的版本。它与通常在x86上运行的编译器不同。您可能在 PC 上运行ARM 模拟器,然后相信此代码是由x86运行的。但是,这是运行此代码的虚拟 ARM 机器。处理器不能本机运行代码。gcc
gcc
x86
ARM
Android gcc是一个 ARM 配置的gcc
. 普通的Linux 发行版 gcc
配置为x86
或x86_64
。
上面缺少一些东西:谁编译编译器?在这两种情况下,x86编译器都会编译新的编译器。不同之处在于选择的后端。一个是x86,另一个是ARM。两种编译器都在x86上运行,但它们为不同的目标生成代码。Gcc只能为 anARM
或an生成代码x86
;永远不要同时通过任何类型的命令行开关。编译器构建通常指的是三种不同的 CPU 类型。
我想也许人们在想,因为他们都在同一个主机上运行,他们必须为同一个目标生成代码。但这不是真的。起初有点弯曲。根据设置,您可能需要为这些机器中的每台机器提供编译器来制作最终编译器。
任何机器的第一个编译器通常是交叉编译器。除了一些很久以前在汇编器中制作原始编译器的人。
另请参阅:交叉编译器。
GCC 不只是为 x86 编译。它实际上可以编译为任何指令集。如果您愿意,只需添加几个文件即可创建一个新文件。
ARM 不是精简指令集。它是一个完全不同的指令集。ARM 有一些 x86 没有的东西,反之亦然。
简而言之,当您在 x86 计算机上为 ARM 构建时,您使用的是交叉编译器 - 一种在一个平台上运行但为另一个平台生成代码的编译器。这在为嵌入式或移动平台开发时极为常见。