任何技艺的提升都在于积累与总结;而对工具与流程的认识,有利于我们更深入的理解系统结构与执行环境。
任何东西都要硬币一样有正反两面:
感谢GNU,为我们提供了一整套完整的开发工具与运行环境,让我们能够更容易地开发与理解软件系统。
唾弃GNU,为我们提供了一整套完整的开发工具与执行环境,让我们在复杂的软件环境中沉重的学习,同时也丧失了自我的“创造力”。
然而对于工具与环境的把控,也正是提升与提炼自己的好机会,能让我们更加深入的理解软件系统,从而才能创造出更完备,更精炼的程序与系统。
认识ELF文件与Binutils工具,是我们熟悉编译工具的基本步骤;因为在Linux平台或者说GNU环境下的编译器——GCC,只是工具中重要的一环与很友善的接口界面而已。
一.ELF文件(在linux上的可执行与链接的二进制文件)的要点:
1.在linux平台中存在的主要形式:*.o(编译与汇编后的目标文件),*.so(链接之后的动态链接库),*.out(链接之后的可执行文件),*.ko(编译链接之后的驱动模块);
2.分析二进制文件的一个很有效的方式,就是用对应的头文件进行数据模块化的读取,而ELF文件的完整描述方式为elf.h文件:http://linux.die.net/include/elf.h;
3.ELF文件简介,该文件主要由ELF头信息与程序头信息表或者段表组成,详细的描述见:http://linux.die.net/man/5/elf;或者http://refspecs.linuxbase.org/LSB_4.1.0/LSB-Core-generic/LSB-Core-generic.html#ELF-GENERIC
二.Binutils工具(该工具一般不需要编译,只有在制作交叉编译工具时)介绍http://www.sourceware.org/binutils/:
1.主要内容,参考LFS7.6(Linux From Scratch)6.13.2:
a)工具集——默认的命令行有很多参数,但是实际使用的确很少,用如下表简单总结一下
命令 |
功能 |
常用参数 |
意义 |
实例 |
说明 |
ar |
创建、修改、抽取静态库(*.a归档文件) |
r |
创建 |
ar -r libXX.a YY.o |
|
d |
删除obj |
ar -d libXX.a YY.o |
|
||
x |
抽取obj |
ar -x libXX.a YY.o |
|
||
t |
查看有哪些成员 |
ar -t libXX.a |
|
||
nm |
列举obj文件的符号表 |
|
|
nm XXX |
|
objcopy |
拷贝与转换格式obj文件中的部分内容 |
j |
提取elf文件分区 |
objcopy -j XX YY |
|
R |
删除elf文件分区 |
objcopy -R XX YY |
|
||
S |