GNU连结器ld的手册介绍了GNU工具链中的核心组件ld(Link Editor),版本为2.14,它是一个强大的链接编辑器,用于构建可执行文件和共享对象(如动态链接库)。binutils套件是GNU工具集的一部分,提供了一系列与链接过程相关的实用程序,包括:
1. **objdump**:这是一个用于分析OBJ文件(二进制对象文件)的工具,能查看其详细信息,如指令集、节(sections)等。
2. **nm**:符号表查看器,用来检查OBJ文件的符号(函数名、全局变量等)及其类型,这对于调试和理解代码结构至关重要。
3. **strip**:虽然主要用于去除符号表和调试信息,但在简化执行文件时并非终极手段,因为某些节(如调试信息)不会被删除。在资源受限的嵌入式系统中,使用低级语言(如汇编)编写代码并直接链接更有利于节省内存。
4. **strings**:字符串查看器,用于找出二进制文件中的文本字符串,但无法替代符号表查看功能。
5. **ar**:归档程序,用于创建静态库(如libxxx.a),将多个对象文件组合成一个可链接的集合。
6. **ld**:作为link editor,ld不仅负责链接,还可以构建共享对象(动态链接库,libxxx.so)。例如,通过`int main() { return 0; }`的示例,ld将gcctest.c编译为a.out。
7. **$objdump -x a.out** 和 **$nm a.out**:分别显示a.out的汇编代码细节和符号表。
8. **strip a.out**:尽管strip能够去掉符号表和调试信息,但它并未完全简化二进制文件,特别是对于relocatable对象文件(没有符号表的链接目标),必须保留符号以便进行链接。
9. **动态链接**:strip在处理共享库(如libcxxxx.so)时不会移除动态符号表,这允许动态链接的发生。
10. **nasm或GNUas**:在Unix系统下,用于编写汇编语言的工具,nasm支持Intel语法,而GNUas则遵循AT&T语法,学习时需注意不同语法的差异。
理解并熟练使用这些工具对构建高效、优化的二进制文件和库至关重要,尤其是在嵌入式系统开发和性能优化的场景中。同时,掌握汇编语言基础和系统层面的知识,有助于更好地利用这些工具进行高级链接和优化工作。