LFS学习系列 第5章. 编译交叉工具链(1)

5.1 介绍

本章介绍如何构建交叉编译器及其相关工具。尽管这里的交叉编译是“伪造”、“假装”的,但其原理与真正的交叉工具链相同。 

本章中编译的程序将安装在$LFS/tools目录下,以使它们与以下章节中安装的文件分离。而另一方面,库被安装到它们的最终位置,因为它们属于我们想要构建的系统。

5.2. Binutils-2.41 - 第一遍

Binutils包包含一个链接器、一个汇编器和其它用于处理对象文件的工具。

所需磁盘空间:647MB。

5.2.1. 交叉Binutils的安装

注:

返回并重读“iii. General Compilation Instructions(一般编译指导)”部分中的注释。理解标记为“重要”的注意事项可以在以后省去很多问题。

这很重要,Binutils是编译的第一个包,因为Glibc和GCC都会对可用的链接器和汇编器执行各种测试,以确定要启用它们自己的哪些功能。

Binutils文档建议在专用的构建目录中构建Binutils:

mkdir -v build
cd       build

注:

为了使本书其余部分中列出的SBU值具有任何用途,请测量从配置到第一次安装(包括第一次安装)构建此软件包所需的时间。要轻松实现这一点,请将命令封装在时间命令中,如下所示:time{../configure…&&make&&makeinstall;}。

现在准备进行Binutils编译:

../configure --prefix=$LFS/tools \
             --with-sysroot=$LFS \
             --target=$LFS_TGT   \
             --disable-nls       \
             --enable-gprofng=no \
             --disable-werror

各配置选项的含义:

  • --prefix=$LFS/tools

此项告诉配置脚本准备在$LFS/tools目录中安装Binutils程序。 

  • --with-sysroot=$LFS

对于交叉编译,此项告诉构建系统根据需要在$LFS中查找目标系统库。

  • --target=$LFS_TGT

由于LFS_TGT变量中的机器描述与config.guess脚本返回的值略有不同,因此此开关将告诉configure脚本调整binutils的构建系统以构建交叉链接器。

  • --disable-nls

此项将禁用国际化,因为临时工具不需要i18n。 

  • --enable-gprofng=no

这将禁用临时工具不需要的构建gprofng。

  • --disable-werror

此项可以防止在主机的编译器发出警告时中止编译。

接着编译(源码)包:

make

安装(Binutils)包:

sudo make install

知识补充(以下内容参考GNU Binutils 介绍):

Binutils介绍

从事 Linux 开发的朋友们都不可避免地用到一些工具,比如 objcopy、nm、objdump、readelf 等等。其实这一系列的工具,就是所谓的 Binutils,当然 GNU 就表示它们都是可以自由地使用的 GNU 软件。

GNU Binutils,是 GNU Binary Utilities 的简写,一般简称为 Binutils。中文可以翻译为 GNU 的二进制工具集。显然,Binutils 是一组二进制工具的集合。也就是说,Binutils 不是指某一个工具,而是指一组工具,并且这些工具都是专门针对于二进制的。注意,这里千万不要理解错了,不是说这些 Binutils 工具只提供二进制文件,而是说这些工具的目的是用于操作二进制文件的,而不是针对于文本或者源代码。

再说一遍:Binutils 工具是专门用于操作二进制的,而不是用于去操作或者编译文本、源代码的。在 Linux 环境下,这种二进制文件主要指 *.o 文件和 elf 执行文件。显然,编译源代码的是 gcc,所以 Binutils 不包含 gcc(这是一种简单的说法,实际上还是有很多关联的)。

Binutils 工具

现在我们已经知道,Binutils 是一组工具集合,那到底包含了哪些工具呢?Binutils 中比较重要的是 ld 和 as。

ld —— 链接器
将多个目标文件,链接成一个可执行文件(或目标库文件)。

as —— 汇编器
将汇编源代码,编译为(目标)机器代码。

addr2line
将地址转换为(文件名和)行号的工具,一般主要用于反汇编。

ar
用来操作(.a)档案文件,比如创建,修改,提取内容等

c++filt
Filter to demangle encoded C++ symbols

dlltool
Creates files for building and using DLLs

gold
一个新的,速度更快的,只针对于ELF的链接器(可能还不是很成熟稳定)。

gprof
Displays profiling information

nlmconv
Converts object code into an NLM

nm
列出目标文件中的符号

objcopy
拷贝并翻译(转换)文件,可用于不同格式的二进制文件的转换。

objdump
显示目标文件中的信息。

ranlib
Generates an index to the contents of an archive

readelf
显示 ELF 格式的(目标)文件的信息。

size
显示目标文件或(.a)档案文件中的节(section)的大小。

strings
显示文件中的(可打印)的字符串信息。

strip
去除符号。一般用来把可执行文件中的一些信息(比如 debug 信息)去除掉,以实现在不影响程序功能的前提下,减少可执行文件的大小,减少程序的空间占用。

windmc
A Windows compatible message compiler

windres
A compiler for Windows resource files

猜你喜欢

转载自blog.csdn.net/phmatthaus/article/details/132343661