我正在尝试构建一个gcc交叉编译器。我知道在编译交叉编译器之前我需要已经构建了目标binutils。为什么编译器的构建需要目标binutils?单独的编译器只接受高级代码并将其转换为我在编译器源中定义它的程序集。那么为什么我需要目标bintools来编译交叉编译器呢?它编写在所有交叉编译器文档中,我需要在编译交叉编译器之前构建它们。 (例如http://wiki.osdev.org/Building_GCC和http://www.ifp.illinois.edu/~nakazato/tips/xgcc.html)。
答案 0 :(得分:1)
GCC需要一个汇编程序将它生成的程序集转换为目标文件(机器代码),并使用链接器将目标文件链接在一起以生成可执行文件和共享库。它还需要一个归档器来生成静态库/档案。
这三个通常由binutils包(以及其他有用工具)提供:GNU汇编程序as
,链接器ld
和ar
归档程序。
答案 1 :(得分:1)
您的关键问题似乎是:
为什么构建编译器需要目标binutils?
如Building a cross compiler中所述,GNU交叉编译器的部分构建过程是使用新编译的交叉编译器为目标构建运行时库。因此,目标的binutils
需要存在才能使该步骤成功。
可能可以首先构建交叉编译器,使用空文件来处理binutils
所需的gcc
组件子集 - 例如as
然后ld
和ar
以及ranlib
- 然后构建目标binutils
组件并将其安装到正确的位置然后构建目标运行时库。
但是以下面的方式执行操作会更容易出错(并且文档建议这样做):首先为目标构建binutils
,将指定的可执行文件放在gcc
的源代码树中,然后构建交叉编译器。
答案 2 :(得分:0)
binutils(二进制实用程序)提供low-level handling of
binary files
,例如linking
,assembling
和parsing ELF files
。海湾合作委员会
编译器依赖于这些工具来创建executable
,因为它会生成
binutils汇编成可执行映像的目标文件。
ELF是Linux用于二进制可执行文件的格式
文件。 GCC
编译器依赖binutils
来提供platform-specific functionality
的大部分内容。
这里是针对其他一些不适用于x86的架构的交叉编译。因此产生的binutils是platform-specific
虽然配置必须给--host!= target。即--host = i686-pc-linux-gnu 其中--target = arm-none-linux-gnueabi。 因此,生成的可执行文件与已经拥有binutils的主机不同。
<强>除了强> 基本的事情需要知道。
构建工具链的build machine
。
host machine
,其中将执行工具链。
target machine
,其中二进制文件由
工具链被执行。
所以binutils将拥有生成和操作二进制文件的工具 对于给定的CPU架构。不是因为一个主机正在使用