Distro提供了交叉编译器与自定义构建的gcc

时间:2012-10-30 16:21:26

标签: gcc arm cross-compiling archlinux raspberry-pi

我打算为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构建?

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

1 个答案:

答案 0 :(得分:2)

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

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

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

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

因此,当存在通用(库存)交叉编译工具链时,它已经设置了一些目标细节,可能不符合您的要求。有关示例,请参阅最近的question关于Ubuntu的情况。