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

标签 linux gcc arm cross-compiling

我创建了一个基本的 Linux ARM 系统。它在我的 ARM 系统上启动到一个 busybox shell 没有任何问题。

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

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

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

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

我读过的所有教程都展示了如何将系统构建到一个独立的目标目录中,但它们没有解释我需要将哪些部分复制到目标 ARM 系统根目录中。

最佳答案

So, I probably need to use "cross-compiling" to create this gcc/glibc, but the result should be ARM for ARM and not a ARM for x86. Am I correct?

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

Is it just a matter of playing around with the "target", "host" variables?

这比您最初想象的要复杂。我想向您推荐 crosstool-NG's Toolchain TypesWikipedia's Canadian Cross供引用。

稍微阅读一下就会发现您正在尝试制作一个跨原生编译器,我假设构建为 x86-glibc-linux,主机为 arm-glibc-linux,目标为 arm- glibc-linux。您需要一个 native 编译器 (x86-glibc-linux) 来制作在 x86(主机)上运行的交叉 arm-glibc-linux。这是因为跨原生 arm-glibc-linux 需要构建一个 glibc 作为将在 ARM 上运行的工具链的一部分。您需要的不仅仅是一个编译器;链接器(黄金?)、库(共享/静态)等。

Crosstool-ng 支持这个,通常 yocto 和发行版在某些地方使用它来创建他们的版本。通常有比使用 crosstool-ng 更有效的方法来做到这一点,因为有时只有引导编译器就足够了和/或您可以重用为以前的编译器构建构建的代码。参见例如,

A “cross-native” toolchain can be built as a trivial case of the “canadian” toolchain. It is suboptimal, as it makes crosstool-NG build the tools targeting the host machine twice (first, as a separate toolchain which is a prerequisite for all canadian builds; and second, as a part of temporary toolchain created as a part of the canadian build itself). This will likely be improved in the future.

但是,如果很少这样做,您可以在做其他事情的同时 build 这座建筑。我花了几天时间制作了“x86-64-linux/x86-mingw/arm-linux”的加拿大交叉版本,以允许为 ARM Linux 设备进行 Windows 开发。如果您认为您将多次创建此编译器(例如跟踪 gcc 开发),您可能希望查看自定义脚本而不是 crosstool-NG。

关于linux - 如何通过运行 x86 构建要在 ARM 系统中使用的 ARM gcc/glibc 环境?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56595836/

相关文章:

linux - 带有数字扩展名的 Grep 文件

c++ - Qt:使用脚本从二进制文件运行时无法找到应用程序 pid

gcc中的C void指针计算

c++ - 使用 gcc 编译时 PowerPC 上的 long double 错误

gcc - ARM7TDMI 不支持请求的专用寄存器

c - 将两个 C 结构打包成一个 uint8_t 指针以写入 DataFlash

linux - CentOS rpm 包依赖于它使用 cmake 构建的 lib "soname"

linux - 如何正确添加前缀和后缀双引号?

c++ - 我在哪里可以找到真正的 arm-none-linux-gnueabi?

assembly - ARM 汇编分支到寄存器或内存内部的地址