0

希望这还没有被问过和回答,但我只是有一个关于 ARM 的快速问题。

具体来说,如果在编译 Android(有很多 C 和 C++)时,使用 GCC 编译,那不是创建基于 x86 的代码吗?使用精简指令集的 ARM 处理器如何解释这段代码并像它一样运行?

谢谢!

4

3 回答 3

3

构建gcc经过一个配置步骤,其中一部分是指定后端后端负责op-code生成。典型的编译器有很多阶段。简要地,

  1. 解析器 - 将文本转换为数据表示。
  2. 前端 - 通过更改代码结构进行优化,可能是特定于语言的。
  3. 中端 - 执行任何编译器通用的计算机科学优化。
  4. 后端 - 执行特定于目标 CPU 的优化。

有关更多信息,请参阅stackoverflow 编译器wiki。

因此,第一第三部分对于( 或任何gcc )x86ARM版本是常见的。Android 编译器是已配置为生成ARM代码的版本。它与通常在x86上运行的编译器不同。您可能在 PC 上运行ARM 模拟器,然后相信此代码是由x86运行的。但是,这是运行此代码的虚拟 ARM 机器。处理器不能本机运行代码。gccgccx86ARM

Android gcc是一个 ARM 配置的gcc. 普通的Linux 发行版 gcc配置为x86x86_64


上面缺少一些东西:谁编译编译器?在这两种情况下,x86编译器都会编译新的编译器。不同之处在于选择的后端。一个是x86,另一个是ARM。两种编译器都在x86上运行,但它们为不同的目标生成代码。Gcc只能为 anARM an生成代码x86;永远不要同时通过任何类型的命令行开关。编译器构建通常指的是三种不同的 CPU 类型。

  1. Build - 编译编译器的机器。这是编译器的编译器。
  2. 主机- 编译器运行的机器。不是它的输出,而是编译器本身。
  3. Target - 机器的后端目标。生成一个代码。

我想也许人们在想,因为他们都在同一个主机上运行,​​他们必须为同一个目标生成代码。但这不是真的。起初有点弯曲。根据设置,您可能需要为这些机器中的每台机器提供编译器来制作最终编译器。

任何机器的第一个编译器通常是交叉编译器。除了一些很久以前在汇编器中制作原始编译器的人。

另请参阅:交叉编译器

于 2013-05-09T20:17:37.140 回答
3

GCC 不只是为 x86 编译。它实际上可以编译为任何指令集。如果您愿意,只需添加几个文件即可创建一个新文件。

ARM 不是精简指令集。它是一个完全不同的指令集。ARM 有一些 x86 没有的东西,反之亦然。

于 2013-05-09T19:54:06.697 回答
1

简而言之,当您在 x86 计算机上为 ARM 构建时,您使用的是交叉编译器 - 一种在一个平台上运行但为另一个平台生成代码的编译器。这在为嵌入式或移动平台开发时极为常见。

于 2013-05-10T05:58:37.527 回答