预计所需编译时间: 1.0 SBU 预计所需硬盘空间: 194 MB |
Binutils 是一组开发工具,包括连接器,汇编器和其他用于目标文件和档案的工具。
安装下列程序: addr2line, ar, as, c++filt, gprof, ld, nm, objcopy, objdump, ranlib, readelf, size, strings 和 strip
安装下列库文件: libiberty.a, libbfd.[a,so] 和 libopcodes.[a,so]
Binutils 依赖于: Bash, Coreutils, Diffutils, GCC, Gettext, Glibc, Grep, Make, Perl, Sed, Texinfo.
第一个安装的软件包是 Binutils,这非常重要,因为 Glibc 和 GCC 会针对可用的连接器和汇编器进行多种测试,以决定打开某些特性。
注: 尽管 Binutils 是很重要的工具链软件包,我们这里并不运行测试套件。这是因为,测试套件所需要的程序还没有安装,而且第一遍安装的程序很快就会被第二遍的程序所覆盖。
如果你把这个包缺省的优化参数(包括 -march 和 -mcpu参数)改变的话,它会有很不良的表现。最好不要优化这个包。因此,如果你定义了任何优化参数的话,比如CFLAGS 和 CXXFLAGS,我们劝你在编译 Binutils 时 unset 或修改它们。
Binutils的安装指南推荐用一个新建的目录来编译它,而不是在源码目录中:
mkdir ../binutils-build cd ../binutils-build |
注: 如果你想利用本书余下部份列出的SBU值,那么现在就要测量一下编译本软件包的时间。你可以用类似于下面这样的命令: time { ./configure ... && ... && ... && make install; }.
然后为编译 Binutils 作准备:
../binutils-2.14/configure \ --prefix=/tools --disable-nls |
配置参数的意思是:
--prefix=/tools:这个参数告诉 configure 脚本,应该把 Binutils 软件包中的程序安装到 /tools 目录中.
--disable-nls: 这个参数禁止了国际化(通常简称i18n)。我们的静态程序不需要国际化的特性,并且在静态连接时nls常常引起错误。
接下来编译它:
make configure-host make LDFLAGS="-all-static" |
make 命令参数的意思是:
configure-host: 它强制所有的子目录都进行配置,如果没有这个参数,静态连接就会失败,因此我们暂且用它来解决这个问题。
LDFLAGS="-all-static": 这个参数告诉连接器,把 Binutils 软件包中所有的程序都静态连接。然而,严格地说,首先是"-all-static" 被传递给libtool,libtool再把"-static" 传递给连接器。
安装软件包:
make install |
现在,为后面的"锁定"glibc准备连接器脚本:
make -C ld clean make -C ld LDFLAGS="-all-static" LIB_PATH=/tools/lib |
make 参数的意思是:
-C ld clean: 它告诉make,删除所有编译生成的文件,但子目录ld里的保留。
-C ld LDFLAGS="-all-static" LIB_PATH=/tools/lib: 它重新编译 ld 子目录中的所有文件。LIB_PATH是 makefile 中的一个变量,在命令行里指定它,使我们可以覆盖缺省值,让它指向我们的临时工具目录。这个变量的值就是连接器的缺省库搜索路径。本章后面,你会看到这样做的目的。
警告 |
现在不能删除Binutils的编译目录和源码目录,我们在本章后面部份还要用到它们,所以请别动它们。 |