http://lfs.linuxsir.org/doc/lfs6.1zh/chapter06/binutils.html
6.13. Binutils-2.15.94.0.2.2
Binutils 是一组开发工具,包括连接器、汇编器和其他用于目标文件和档案的工具。
预计编译时间:
1.3 SBU
所需磁盘空间:
158 MB
安装依赖于:
Bash, Bison, Coreutils, Diffutils, Flex, GCC, Gettext, Glibc, Grep, M4, Make, Perl, Sed, Texinfo
6.13.1. 安装 Binutils
如果你把这个包缺省的优化参数(包括 -march 和 -mcpu 参数)改变的话,它会有些不正常的表现。因此,如果你定义了任何优化参数的话,比如 CFLAGS 和 CXXFLAGS,我们劝你在编译 Binutils 时 unset 或修改它们。
现在我们测试一下在 chroot 环境中,你的伪终端(PTY)是否正常工作。运行下面的命令:
expect -c "spawn ls"
如果看到这样的输出:
The system has no more ptys. Ask your system administrator to create more.
说明你的 chroot 环境没有设置好PTY,这时运行 Binutils 和 GCC 的测试套件就没有意义了,你必须先解决PTY设置。
Binutils 的文档推荐用一个新建的目录来编译它,而不是在源码目录中:
mkdir ../binutils-build
cd ../binutils-build
为编译 Binutils 做准备:
../binutils-2.15.94.0.2.2/configure --prefix=/usr \
--enable-shared
编译软件包:
make tooldir=/usr
通常情况下,tooldir(可执行文件的安装目录) 是 $(exec_prefix)/$(target_alias)。例如在i686的机器上,将是 /usr/i686-pc-linux-gnu 。因为我们只为自己的系统进行编译,就并不需要在 /usr目录后面再存在特殊的后缀。它只是在交叉编译时(比如在Intel机器上编译将要在PowerPC上执行的程序)才用到。
重要
本节的 Binutils 测试套件很重要。在任何情况下都不要省略这一步。
对编译结果进行测试:
make check
安装软件包:
make tooldir=/usr install
安装某些软件包需要的 libiberty 头文件:
cp ../binutils-2.15.94.0.2.2/include/libiberty.h /usr/include
安装的程序:
addr2line, ar, as, c++filt, gprof, ld, nm, objcopy, objdump, ranlib, readelf, size, strings, strip
安装的库:
libiberty.a, libbfd.[a,so], libopcodes.[a,so]
简要描述
addr2line | 把程序地址转换为文件名和行号。在命令行中给它一个地址和一个可执行文件名,它就会使用这个可执行文件的调试信息指出在给出的地址上是哪个文件以及行号。 |
ar | 建立、修改、提取归档文件。归档文件是包含多个文件内容的一个大文件,其结构保证了可以恢复原始文件内容。 |
as | 主要用来编译GNU C编译器 gcc 输出的汇编文件,产生的目标文件由连接器ld连接。 |
c++filt | 连接器使用它来过滤 C++ 和 Java 符号,防止重载函数冲突。 |
gprof | 显示程序调用段的各种数据。 |
ld | 连接器,它把一些目标和归档文件结合在一起,重定位数据,并链接符号引用。通常,建立一个新编译程序的最后一步就是调用ld。 |
nm | 列出目标文件中的符号。 |
objcopy | 把一种目标文件中的内容复制到另一种类型的目标文件中。 |
objdump | 显示一个或者更多目标文件的信息。显示一个或者更多目标文件的信息。使用选项来控制其显示的信息。它所显示的信息通常只有编写编译工具的人才感兴趣。 |
ranlib | 产生归档文件索引,并将其保存到这个归档文件中。在索引中列出了归档文件各成员所定义的可重分配目标文件。 |
readelf | 显示 ELF 格式可执行文件的信息。 |
size | 列出目标文件每一段的大小以及总体的大小。默认情况下,对于每个目标文件或者一个归档文件中的每个模块只产生一行输出。 |
strings | 打印某个文件的可打印字符串,这些字符串最少4个字符长,也可以使用选项“-n”设置字符串的最小长度。默认情况下,它只打印目标文件初始化和可加载段中的可打印字符;对于其它类型的文件它打印整个文件的可打印字符,这个程序对于了解非文本文件的内容很有帮助。 |
strip | 删除目标文件中的全部或者特定符号。 |
libiberty | 包含许多GNU程序都会用到的函数,这些程序有:getopt, obstack, strerror, strtol, strtoul |
libbfd | 二进制文件描述库。 |
libopcodes | 用来处理 opcodes(文本格式可读的处理器操作指令) 的库, 在生成一些应用程序的时候也会用到它, 比如 objdump |