首页 > 系统管理 > LFS > LFS7.6 002 Binutils-2.24 – Pass 1
2015
02-20

LFS7.6 002 Binutils-2.24 – Pass 1

Binutils-2.24 – Pass 1

工具简介:

GNU Binary Utilities或binutils是一整套的编程语言工具程序,用来处理许多格式的目标文件。当这个工具程序通常搭配GCC、make、和GDB这些程序来使用。

安装的程序:

addr2line, ar, as, c++filt, elfedit, gprof, ld, ld.bfd, nm, objcopy, objdump, ranlib, readelf,

size, strings, and strip

安装的库:

libbfd.{a,so}, and libopcodes.{a,so}

binutils包含底下这些指令:

addr2line 把程序地址转换为文件名和行号。 在命令行中给它一个地址和一个可执行文件名, 它就会使用这个可执行文件的调试信息指出在给出的地址上是哪个文件以及行号。
ar 建立、修改、提取归档文件。
as 一个汇编器,用来汇编 gcc 的输出,产生的目标文件。
c++filt 连接器使用它来过滤 C++ 和 Java 符号,防止重载函数冲突。
elfedit 更新ELF可执行那个文件的ELF头部。
gprof 显示程序调用段的各种数据。
ld 连接器,它把一些目标和归档文件结合为一个文件,重定位数据,并链接符号引用。
ld.bfd 硬链接到ld。
nm 列出出现在目标文件中的符号
objcopy 把一种目标文件翻译成另一种类型的目标文件
objdump 显示所给目标文件的信息。 使用选项来控制其显示的信息。 它所显示的信息通常只有编写编译工具的人才感兴趣。
ranlib 产生归档文件索引,并将其保存到这个归档文件中。 在索引中列出了归档文件各成员所定义的可重分配目标文件。
readelf 显示 ELF 格式可执行文件的信息
size 列出目标文件每一段的大小以及总体的大小。
strings 打印每个给定文件的可打印字符串, 这些字符串最少特定的长度(默认是4), 默认情况下, 它只打印目标文件初始化和可加载段中的可打印字符; 对于其它类型的文件它打印整个文件的可打印字符。
strip 删除目标文件中的符号
libiberty 包含许多GNU程序都会用到的函数,这些程序有:getopt, obstack, strerror, strtol, 和strtoul
libbfd 二进制文件描述库
libopcodes 用来处理 opcodes("可读文本格式的")处理器操作指令)的库, 在生成一些应用程序的时候也会用到它,比如objdump.

 一、解压并建立编译目录:   

代码:

tar xvf binutils-2.24.tar.bz2
cd binutils-2.24
mkdir -v ../binutils-build
cd ../binutils-build

详解:

我们将在binutils-2.24目录中设置参数,在binutils-build目录中进行编译,而binutils-2.24目录在解压后已经被创建,我们需要的只是创建binutils-2.24目录,并切换到该目录等待下一步。

二、设置configure参数:

代码:

../binutils-2.24/configure \
--prefix=/tools \
--with-sysroot=$LFS \
--with-lib-path=/tools/lib \
--target=$LFS_TGT \
--disable-nls \
--disable-werror

详解:

Configure是一个脚本控制工具。

参数详解:

--prefix=/tools

是指配置脚本将会把binutils工具安装在目录/tools下。

--with-sysroot=$LFS

对于交叉编译,这讲述了构建系统时,在目录$LFS中寻找目标系统所需的库。

--with-lib-path=/tools/lib

这指定了哪一个路径下的库应该被链接器配置使用。

--target=$LFS_TGT

 因为 LFS_TGT 变量中的机器描述和 config.guess 脚本的返回值略有不同, 所以, 这个开关会告诉 configure 脚本,为了创建交叉链接器,要调整Binutil 的编译系统。

--disable-nls

这个参数禁止了国际化(通常简称i18n –译者),因为临时工具不需要i18n特性。

--disable-werror

在有从宿主编译器发出的警告时,这个参数防止了编译程序停止。

三、编译以及安装:

参数设置好了,那么现在就开始编译了。

代码:

make -j4

详解:

注意4是你的线程数,根据自己配置决定。

make命令是GNU的工程化编译工具,用于编译众多相互关联的源代码问价,以实现工程化的管理,提高开发效率。
j4是指使用四个线程来同时编译,提高效率。

编译完成后我们得到了二进制的代码,通常我们会运行测试套件,但是目前测试套件(Tcl, Expect, DejaGNU) 尚未安装。而且在这里运行测试也没什么用处, 因为第一遍(Pass 1)安装的程序很快就会被第二遍(Pass 2)的程序所覆盖。

如果在x86_64 上编译,就要创建一个符号链接,来确保工具链正常:

代码:

case $(uname -m) in
x86_64) mkdir -v /tools/lib && ln -sv lib /tools/lib64 ;;
esac

详解:

case结构用于多种情况的条件判断。类似于其他编程语言中的switch/case语句,但从语法形式上讲,有很大的不同。

安装这个我们自己编译好的包:

make install

四、扫尾工作。

为了养成一种好习惯每次编译安装完程序后,我都要对产生的文件进行清理。

代码:

cd ..
rm -rf binutils-build
rm -rf binutils-2.24

详解:

删除binutils-build和binutils-2.24两个目录。

rm命令可以删除一个目录中的一个或多个文件或目录,也可以将某个目录及其下属的所有文件及其子目录均删除掉。对于链接文件,只是删除整个链接文件,而原有文件保持不变。

THE END:我们的第一个工具安装完成,后续的工具也是类似的过程,下一篇:LFS7.6 003 GCC-4.9.1 – Pass 1




最后编辑:
作者:PurStar
PurStar
这个作者貌似有点懒,什么都没有留下。
捐 赠您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请狠狠点击

留下一个回复