如何以跨本地方式在 Crosstools-NG 中使用 canadian 以在 arm board 上获取 gcc?
How to use candian in Crosstools-NG in a cross-native fashion to get gcc on an arm board?
据我所知,要让 gcc 在 armv5 板上编译可执行文件,同时使用我的 x86 机器编译那个 arm 原生 gcc,我需要这个设置:
- 配置工具链组件的机器:配置机器:x86_64
- 构建工具链组件的机器:构建机器:x86_64
- 机器运行使用工具链:主机:ARM
- 工具链正在为目标机器生成代码的机器:ARM
根据阅读 cross-ng 文档 here,我应该使用跨原生设置,但是当我尝试使用 ct-ng menuconfig
启用它时,我需要启用:
在 Paths and misc options -> Try features marked as EXPERIMENTAL
进行实验
Toolchain options -> Type (Cross) -> Cross-native (NO CODE!) (EXPERIMENTAL)
当然,Cross-Native 是行不通的,因为它没有代码。谷歌搜索让我在邮件列表上进行了 this and this 讨论,说我应该尝试使用加拿大的构建风格来做到这一点,但是对于 Build System
和 Host System
在 crosstool-ng 的菜单配置中,或者如果这仍然是考虑两个讨论如何超过 3 年的正确方法。
SO 上的 This post 似乎暗示构建系统和主机系统元组应该是 arm-unknown-linux-gnueabi
?
明确地说,我已经能够使用从 crosstool-ng 生成的交叉编译器编译和 运行 可执行文件,现在我想在那个 armv5 系统上有一个编译器。
编辑:所以我只是将crosstools-ng生成的普通交叉编译器(arm-unknown-linux-gnueabi
)添加到Toolchain options -> General toolchain options -> Host system -> Tuple
中的元组中,并且能够编译 gcc 并让它在 arm 上执行。 Example
我现在只需要解决图书馆的问题,应该就是这样。
这个答案是我 关于交叉编译工具链的一般工作流程的扩展。
我的总体思路是正确的,你必须做一个 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 系统相同的工具链引用路径和符号链接以及您想做的任何事情。
据我所知,要让 gcc 在 armv5 板上编译可执行文件,同时使用我的 x86 机器编译那个 arm 原生 gcc,我需要这个设置:
- 配置工具链组件的机器:配置机器:x86_64
- 构建工具链组件的机器:构建机器:x86_64
- 机器运行使用工具链:主机:ARM
- 工具链正在为目标机器生成代码的机器:ARM
根据阅读 cross-ng 文档 here,我应该使用跨原生设置,但是当我尝试使用 ct-ng menuconfig
启用它时,我需要启用:
在
Paths and misc options -> Try features marked as EXPERIMENTAL
进行实验
Toolchain options -> Type (Cross) -> Cross-native (NO CODE!) (EXPERIMENTAL)
当然,Cross-Native 是行不通的,因为它没有代码。谷歌搜索让我在邮件列表上进行了 this and this 讨论,说我应该尝试使用加拿大的构建风格来做到这一点,但是对于 Build System
和 Host System
在 crosstool-ng 的菜单配置中,或者如果这仍然是考虑两个讨论如何超过 3 年的正确方法。
This post 似乎暗示构建系统和主机系统元组应该是 arm-unknown-linux-gnueabi
?
明确地说,我已经能够使用从 crosstool-ng 生成的交叉编译器编译和 运行 可执行文件,现在我想在那个 armv5 系统上有一个编译器。
编辑:所以我只是将crosstools-ng生成的普通交叉编译器(arm-unknown-linux-gnueabi
)添加到Toolchain options -> General toolchain options -> Host system -> Tuple
中的元组中,并且能够编译 gcc 并让它在 arm 上执行。 Example
我现在只需要解决图书馆的问题,应该就是这样。
这个答案是我
我的总体思路是正确的,你必须做一个 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 系统相同的工具链引用路径和符号链接以及您想做的任何事情。