据我所知,要让armv5板上的gcc编译可执行文件,同时使用我的x86机器编译arm本机gcc,我需要以下设置:
- 配置工具链组件的机器:配置机器:x86_64
- 机器构建工具链组件:构建机器:x86_64
- 运行刀具链的机器:主机:ARM
- 工具链生成代码的机器:目标机器:ARM
根据阅读此处的跨ng文档,我应该使用跨本机设置,但当我尝试使用ct-ng menuconfig
启用时,我需要启用:
-
Paths and misc options -> Try features marked as EXPERIMENTAL
的实验 -
Toolchain options -> Type (Cross) -> Cross-native (NO CODE!) (EXPERIMENTAL)
但Cross Native当然不起作用,因为它没有代码。谷歌搜索让我想到了这一点,以及邮件列表上的讨论,说我应该尝试使用加拿大构建风格来实现这一点。但我有点不知道crosstool ng的menuconfig中的Build System
和Host System
应该使用什么元组和不应该使用什么,或者考虑到这两次讨论都已经超过3年了,这是否仍然是正确的做法。
SO上的这篇帖子似乎暗示构建系统和主机系统元组应该是arm-unknown-linux-gnueabi
?
需要明确的是,我已经能够使用crosstool ng生成的交叉编译器编译和运行可执行文件,现在我想在armv5系统上有一个编译器。
编辑:所以我只是将crosstools ng生成的普通交叉编译器(arm-unknown-linux-gnueabi
)添加到Toolchain options -> General toolchain options -> Host system -> Tuple
中的元组中,并且能够编译gcc并在arm上执行它。示例
我现在只需要解决图书馆的问题,应该就是这样。
这个答案是我最初关于交叉编译工具链的一般工作流的问题的扩展。
我有一个正确的总体想法,你必须用主机系统元组做一个Canadian-Build
,它是我之前做的arm-unknown-linux-gnueabi
交叉编译器。请确保将其包含在您的路径中,或者在/bin中进行一些符号链接,或者以其他方式处理。
在使用普通HDD的Ubuntu Vmware虚拟机中使用I5-3570k的3/4核和~2GB的ram进行构建时,我不得不等待大约30分钟。使用固态硬盘可能会大大提高速度。
完成后,您应该有一个Crosstools NG为您制作的输出目录,其中包括ARM架构的工具链。您可以通过在任何二进制文件上运行file filename
来验证这一点。
现在,对于图书馆的情况,我花了一段时间,给了我一点困惑。在工具链输出中应该有一个rootfs文件夹。该文件夹包含要编译的目标(在本例中为arm)的预期根文件系统。您需要复制/lib
文件夹以及来自用户的lib,镜像此rootfs文件夹的文件夹层次结构。
您可以通过执行objdump -p filename
并查看指向rootfs中所需库的NEEDED
条目来验证库设置是否正确。
如果您使用的是基于busybox的rootfs,那么假设您没有静态编译它,那么您可能已经正确地设置了库,因为您需要它们用于busybox。我首先对busybox进行了静态构建,以确保系统能够引导到shell,然后使用toolchains rootfs文件夹中的库进行了非静态构建,以便对库进行软启动。一旦我有了一个动态链接的busybox系统,只需将交叉编译的工具链放在任意位置的rootfs中(对我来说是/usr/home/toolchain
)就足够了,之后你应该像使用x86系统一样使用工具链,引用路径和符号链接以及你想做的任何事情。