如何通过运行x86构建在ARM系统中使用的ARM gcc / glibc环境?

时间:2019-06-14 10:00:06

标签: linux gcc arm cross-compiling

我创建了一个准系统的Linux ARM系统。它可以引导到busybox shell,而在我的ARM系统上没有任何问题。

现在,我想构建一个可以在我的ARM系统上使用的gcc / glibc环境。

我的开发机器是x86。我已经阅读了有关做“交叉编译器”的教程,但这似乎不是我想要的。似乎只是在x86上运行的编译器,但可以生成ARM二进制文件。

我需要创建一个在ARM上运行的编译器并创建ARM二进制文件。但是我需要在x86机器上构建它,然后将其复制到我的ARM机器上。然后,我可以通过在ARM机器上进行本地编译来扩展系统。

因此,我可能需要使用“交叉编译”来创建此gcc / glibc,但是结果应该是ARM for ARM而不是ARM for x86。我对么?仅仅是玩弄“ taget”,“ host”变量的问题吗?

我阅读的所有教程都显示了如何将系统构建到一个隔离的目标目录中,但没有说明我需要复制哪些部分到目标ARM系统根目录。

1 个答案:

答案 0 :(得分:0)

  

因此,我可能需要使用“交叉编译”来创建此gcc / glibc,但是结果应该是ARM for ARM而不是ARM for x86。我说得对吗?

这是正确的,但不是完整的工作流程。您需要比想象中更多的编译器。

  

仅仅是玩弄“目标”,“主机”变量吗?

这比您最初想象的要复杂。我想请您参考 crosstool-NG's Toolchain TypesWikipedia's Canadian Cross以供参考。

稍作阅读就会发现,您正在尝试使用 cross native 编译器进行编译,我假设该编译器以x86-glibc-linux进行构建,宿主为arm-glibc-linux,并以arm-作为目标。 glibc-linux。您需要一个本机编译器(x86-glibc-linux)来制作在x86(主机)上运行的cross arm-glibc-linux。这是因为跨原生的arm-glibc-linux需要构建一个glibc作为将在ARM上运行的工具链的一部分。您不仅需要编译器,还需要更多的信息。链接器(金?),库(共享/静态)等。

Crosstool-ng支持此功能,通常yocto和发行版都在某些地方使用它来创建其版本。与使用crosstool-ng相比,通常有更有效的方法,因为有时仅一个引导编译器就足够了,和/或您可以重用为以前的编译器构建而来的代码。例如,参见

  

可以将“跨本地”工具链构建为“加拿大”工具链的琐碎案例。它不是最优的,因为它使crosstool-NG两次针对主机构建工具(第一,作为单独的工具链,这是所有加拿大构建的前提;第二,作为作为加拿大一部分创建的临时工具链的一部分)自行构建)。将来可能会改善。

但是,如果很少执行此操作,则可以在执行其他操作时进行此构建。我花了几天时间制作了“ x86-64-linux / x86-mingw / arm-linux”的加拿大版十字架,以允许Windows开发ARM Linux设备。如果您认为将多次创建此编译器(例如,跟踪gcc的开发),则可能需要查看自定义脚本而不是crosstool-NG。