如何在 Crosstools-NG 中以跨本地方式使用 canadian 来将 gcc 加载到 Arm 板上?

2024-04-26

据我了解,要让 gcc 在 armv5 板上编译可执行文件,同时使用我的 x86 机器编译该 arm 本机 gcc,我需要以下设置:

  • 配置工具链组件的机器:配置机器:x86_64
  • 机器构建工具链组件:构建机器:x86_64
  • 运行工具链的机器:主机:ARM
  • 工具链正在为其生成代码的机器:目标机器:ARM

基于阅读 cross-ng 文档here https://github.com/crosstool-ng/crosstool-ng/blob/master/docs/6%20-%20Toolchain%20types.txt,我应该使用跨本机设置,但是当我尝试使用ct-ng menuconfig我需要启用:

  • 实验中Paths and misc options -> Try features marked as EXPERIMENTAL

  • Toolchain options -> Type (Cross) -> Cross-native (NO CODE!) (EXPERIMENTAL)

但当然,跨原生是行不通的,因为没有代码。谷歌搜索引导我到this https://sourceware.org/ml/crossgcc/2010-03/msg00025.html and this https://sourceware.org/ml/crossgcc/2012-11/msg00016.html邮件列表上的讨论说我应该尝试使用加拿大构建风格来做到这一点,但我对使用什么元组和不使用什么元组有些迷失Build System and Host System在 crosstool-ng 的 menuconfig 中,或者考虑到这两个讨论已经超过 3 年了,这是否仍然是正确的方法。

This https://stackoverflow.com/questions/9866367/how-to-change-the-host-type-for-a-canadian-cross-compilation-of-gcc-with-cross/SO 上的帖子似乎暗示构建系统和主机系统元组应该是arm-unknown-linux-gnueabi?

需要明确的是,我已经能够使用 crosstool-ng 生成的交叉编译器来编译和运行可执行文件,现在我想在该 armv5 系统上有一个编译器。

Edit:所以我只是添加了普通的交叉编译器(arm-unknown-linux-gnueabi)由 crosstools-ng 生成到元组中Toolchain options -> General toolchain options -> Host system -> Tuple并能够编译 gcc 并使其在arm上执行。Example https://gist.github.com/hak8or/e461a6a878b4c793979e

我现在只需要修复图书馆的情况就应该是这样。


这个答案是我的延伸原问题 https://stackoverflow.com/questions/29190790/how-to-cross-compile-a-toolchain-to-an-armv5-platform/29321358#29321358关于交叉编译工具链的一般工作流程。

我有正确的总体想法,你必须做一个Canadian-Build主机系统元组是arm-unknown-linux-gnueabi我之前做的交叉编译器。确保将其包含到您的路径中或在 /bin 中进行一些符号链接,或者您想要处理的其他方式。

在使用普通 HDD 的 Ubuntu Vmware 虚拟机中使用 I5-3570k 的 3/4 核心和 ~2GB 内存进行构建时,我不得不等待大约 30 分钟。使用 SSD 可能会显着提高速度。

完成此操作后,您应该拥有 Crosstools-NG 为您创建的输出目录,其中包括 ARM 架构的工具链。您可以通过运行来验证这一点file filename在任何二进制文件上。

现在,对于图书馆的情况,这花了我一段时间并给我带来了一些困惑。在工具链输出中应该有一个 rootfs 文件夹。该文件夹包含您将要编译的目标(在本例中为arm)的预期根文件系统。您需要复制/lib文件夹以及来自用户的 lib,镜像此 rootfs 文件夹的文件夹层次结构。

您可以通过执行以下操作来验证库设置是否正确objdump -p filename并看到NEEDED指向 rootfs 中所需库的条目。

如果您使用的是基于 busybox 的 rootfs,那么假设您没有静态编译它,那么您可能已经正确设置了库,因为您需要它们用于 busybox。我首先对 busybox 进行了静态构建,以确保可以让系统启动到 shell,然后使用工具链 rootfs 文件夹中的库进行非静态构建,以对库进行软启动。一旦我让动态链接的 busybox 系统开始工作,只需将交叉编译的工具链放入 rootfs 的任意位置(/usr/home/toolchain对我来说)应该就足够了,之后您应该使用与 x86 系统相同的工具链来引用路径和符号链接以及您想要执行的任何操作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Crosstools-NG 中以跨本地方式使用 canadian 来将 gcc 加载到 Arm 板上? 的相关文章

随机推荐