0

我打算为Raspberry Pi交叉编译,基本上是一台小型ARM计算机。主机将是一个运行 Arch Linux 的 i686 机器。

我的第一反应是使用 Arch Linux 提供的交叉编译器 arm-elf-gcc-base 和 arm-elf-binutils。但是,我阅读的每个 wiki 和帖子似乎都使用了某些版本的自定义 gcc 构建。他们似乎花费了大量时间来烹饪自己的 gcc。问题是他们从不说为什么使用他们的 gcc 比另一个重要。

  1. 库存发行版提供的交叉编译器能否用于在通用内核和应用程序中构建 Raspberry Pi 或 ARM?

  2. ARM架构是否需要多个编译器?如果是这样,为什么,因为单个 gcc 可以支持所有 x86 变体?

  3. 如果是 2),那么我如何推断特定版本的 gcc 支持的目标子集?

  4. 更一般的问题,什么一般用例需要自定义 gcc 构建?

请尽可能技术,我想知道为什么以及如何。

4

1 回答 1

2

当开发人员谈论为与他们自己的(主机)不同的机器(目标)构建软件(交叉编译)时,他们使用该术语toolchain来描述构建二进制文件所需的工具集。这是因为当您需要构建可执行二进制文件时,您需要的不仅仅是编译器。

您需要例程 ( crt0.o ) 根据操作系统和标准库的要求来初始化运行时。您需要一组标准库,并且这些库需要了解目标内核,因为系统调用 API 和几个操作系统级别配置(fe 页面大小)和数据结构(fe 时间结构)。

在硬件方面,有一组不同的 ARM 架构。架构可以向后兼容,但工具链本质上是二进制的,并且针对特定架构。默认情况下,您可以拥有最广泛的架构,但对于已经受到约束的环境(嵌入式设备)来说,这不会太有成效。如果您拥有最新的架构,那么它对于基于旧架构的目标将没有用处。

当您在您的主机上为您的主机构建二进制文件时,编译器可以从其自己的环境中查找所有必要的位或使用主机上的内容 - 因此上述大多数细节对开发人员是不可见的。但是,当您为不同于主机类型的目标构建时,工具链必须了解硬件、操作系统和标准库的详细信息。您将这些告诉工具链的方式是……根据可能需要某种程度的引导的那些细节来构建它。(或者,如果工具链支持/为它构建,您可以通过大量参数来执行此操作。)

因此,当有一个通用(库存)交叉编译工具链时,它已经设置了一些目标细节,可能无法满足您的要求。请参阅这个关于 Ubuntu 上情况的最新问题作为示例。

于 2012-10-30T21:39:47.283 回答