ARM与GCC编译

ARM与GCC编译,gcc,android-ndk,x86,arm,Gcc,Android Ndk,X86,Arm,希望这还没有被问到和回答,但我只是有一个简单的问题 具体地说,如果在编译Android(它有很多C和C++)时,您使用GCC进行编译,这不是创建了基于x86的代码吗?一个使用精简指令集的ARM处理器如何能够解释此代码并像它那样运行 谢谢 GCC不只是为x86编译。它实际上编译成任何指令集。如果你想,你可以通过添加几个文件来创建一个新的 ARM并不是一个精简的指令集。这是一个完全不同的指令集。ARM有一些东西是x86没有的,反之亦然。构建gcc需要一个配置步骤,其中一部分是指定一个配置。后端负责生

希望这还没有被问到和回答,但我只是有一个简单的问题

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


谢谢

GCC不只是为x86编译。它实际上编译成任何指令集。如果你想,你可以通过添加几个文件来创建一个新的


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

构建
gcc
需要一个配置步骤,其中一部分是指定一个配置。后端负责生成
op代码。典型的编译器是多阶段的。简而言之

  • 解析器-将文本转换为数据表示形式
  • 前端-通过更改代码结构(可能是特定于语言的)进行优化
  • 中间端-执行任何编译器都通用的计算机科学优化
  • 后端-执行特定于目标CPU的优化
  • 有关更多信息,请参见wiki

    因此,第1部分到第3部分对于
    x86
    ARM
    版本的
    gcc
    (或任何gcc)是通用的。Android编译器是
    gcc
    的一个版本,已配置为生成ARM代码。它与通常在x86上运行的编译器不同。您可能在PC上运行ARM仿真器,然后相信此代码是由x86运行的。但是,这是一个运行此代码的过程。
    x86
    处理器不能以本机方式运行
    ARM
    代码

    Android gcc是一个ARM配置的
    gcc
    。为
    x86
    x86\u 64
    配置正常的Linux发行版
    gcc


    上面缺少了一些东西:谁编译编译器?在这两种情况下,x86编译器编译新的编译器。不同之处在于所选的后端。一个是x86,另一个是ARM。这两个编译器都在x86上运行,但它们为不同的目标生成代码。Gcc只能为
    ARM
    x86
    生成代码;决不能通过任何命令行开关来实现这两种功能。编译器构建通常涉及三种不同的CPU类型

  • 构建-构建编译器的机器。这是编译器的编译器
  • 主机-编译器运行的机器。不是它的输出,而是编译器本身
  • 目标-机器将锁定后端目标。一个代码是为其生成的
  • 我想人们可能会这样想,因为他们都在同一台主机上运行,他们必须为同一个目标生成代码。但事实并非如此;一开始有点心不在焉。根据设置的不同,您可能需要这些机器的编译器来生成最终的编译器

    任何机器的第一个编译器通常是交叉编译器。除了一些很久以前用汇编语言编写原始编译器的人


    另见:

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

    从x86机器编写ARM代码没有冲突……但确实如此,不是吗?我从未知道你的问题,我的应用程序有很多C++代码,它在ARM上运行得很好,我发誓,“缩减指令集”是一个引用,与之相比,OK,编译时,它将默认为x86,因为大多数人都会使用GCC在Windows /Linux下运行C程序,但是如果你指定要在ARM上运行它,它将为此生成适当的装配/机器代码。谢谢你的澄清!呃,RISC和CISC现在几乎都没有意义了。x86有一个CISC指令集,可以减少RISC微操作集。ARM拥有大量不属于RISC模型的指令。它们现在作为讨论设计理念的场所比作为类别更有用。@AnitGandhi:我没有研究GCC在不同平台上是如何配置的,但我希望它通常被配置为默认编译到本机架构或某些相关子集。例如,在英特尔系统上,它编译为英特尔体系结构的一个公共子集;在PowerPC上,它编译为PowerPC等等。但是,这可能是可配置的。如果有人在他们的英特尔系统上安装GCC,主要是为了在ARM代码上工作,可以将GCC配置为默认的ARM。ARM代表高级RISC机器,至少是基于精简的指令集。