8.19. Binutils-2.42

Binutils 包含汇编器、链接器以及其他用于处理目标文件的工具。

估计构建时间: 2.2 SBU
需要硬盘空间: 2.7 GB

8.19.1. 安装 Binutils

首先,修复导致一些软件包在启用链接时优化 (LTO) 时构建失败的问题。注意一些 BLFS 软件包在构建时默认启用 LTO,即使您不主动启用 LTO:

for i in LO12 HI20 ADD; do
  sed -e '/DESC64_HI12/a\    case BFD_RELOC_LARCH_TLS_LE_'${i}'_R:' \
      -i gas/config/tc-loongarch.c
done

Binutils 文档推荐创建一个新的目录,以在其中构建 Binutils:

mkdir -v build
cd       build

准备编译 Binutils:

../configure --prefix=/usr       \
             --sysconfdir=/etc   \
             --enable-ld=default \
             --enable-plugins    \
             --enable-shared     \
             --disable-werror    \
             --enable-64-bit-bfd \
             --with-system-zlib  \
             --enable-default-hash-style=gnu

新的配置选项的含义:

--enable-ld=default

构建传统的 bfd 链接器,并且将它安装为 ld (默认链接器) 和 ld.bfd。

--enable-plugins

启用链接器插件支持。

--with-system-zlib

使用安装好的 zlib 库,而不是构建附带的版本。

编译该软件包:

make tooldir=/usr

make 命令参数的含义:

tooldir=/usr

一般来说,工具目录 (最终存放该软件包中可执行文件的目录) 被设定为 $(exec_prefix)/$(target_alias)。例如,在 64 位 LoongArch 机器上,它将展开为 /usr/loongarch64-unknown-linux-gnu。因为 LFS 是定制系统,不需要 /usr 中的特定目标工具目录。如果系统用于交叉编译 (例如,在 Intel 机器上编译软件包,生成可以在 PowerPC 机器上执行的代码),就会使用 $(exec_prefix)/$(target_alias) 目录。

[重要]

重要

本节中,Binutils 的测试套件被认为是十分关键的,在任何情况下都不能跳过。

测试编译结果:

make -k check

如果需要列出所有失败的测试,执行:

grep '^FAIL:' $(find -name '*.log')

安装该软件包:

make tooldir=/usr install

删除无用的静态库:

rm -fv /usr/lib/lib{bfd,ctf,ctf-nobfd,gprofng,opcodes,sframe}.a

8.19.2. Binutils 的内容

安装的程序: addr2line, ar, as, c++filt, dwp, elfedit, gprof, gprofng, ld, ld.bfd, ld.nm, objcopy, objdump, ranlib, readelf, size, strings, 以及 strip
安装的库: libbfd.so, libctf.so, libctf-nobfd.so, libgprofng.so, libopcodes.so, 以及 libsframe.so
安装的目录: /usr/lib/ldscripts

简要描述

addr2line

将程序中的地址翻译成文件名和行号;给定一个内存地址以及可执行程序的名字,该程序使用可执行文件中的调试信息,确定与该地址相关的源代码文件和行号

ar

创建、修改、提取档案文件

as

一个能够汇编 gcc 输出的汇编代码并生成目标文件的汇编器

c++filt

被链接器用于 demangle C++ 和 Java 符号,防止重载函数冲突

dwp

DWARF 封装工具

elfedit

更改 ELF 文件的 ELF 头

gprof

显示函数调用图性能分析数据

gprofng

收集和分析性能数据

ld

一个链接器,将一些目标文件和档案文件组合为一个单独的文件,重定位它们的数据,并绑定符号引用

ld.bfd

一个指向 ld.bfd 的硬链接

nm

列出给定目标文件中的符号

objcopy

将一种目标文件翻译成另一种

objdump

显示给定目标文件的信息,通过命令行选项指定要显示哪些信息;这些信息对开发编译工具的程序员很有用

ranlib

生成档案文件内容的索引,并将索引存入档案文件;索引列出档案文件中所有可重定位目标文件定义的符号

readelf

显示 ELF 格式二进制文件的信息

size

列出给定文件各个段的大小和文件总大小

strings

对于每个给定文件,输出其中长度不小于给定长度 (默认是 4) 的可打印字符序列;对于目标文件,它默认只输出可加载的已初始化数据段中的字符串,对于其他文件,它扫描整个文件

strip

移除目标文件中的符号

libbfd

二进制文件描述符库

libctf

紧凑 ANSI-C 类型格式调试支持库

libctf-nobfd

libctf 的变体,它不需要 libbfd 的功能

libgprofng

包含 gprofng 使用的多数子程序的库

libopcodes

一个用于处理操作码 —— 处理器指令的 可读文本版本的库;它被 objdump 等构建工具所使用

libsframe

使用简单的栈展开器支持在线栈回溯的库