<![endif]-->
汗,本章已经是我第几次详细看了, 我居然看了一下午
不的不佩服写的好呀
链接 总结
7.1 :编译过程
.c .i( 中间文件 ) .s (汇编) .o (可重定位目标文件)
Cpp( 预处理器 ) ccl (编译器) as (汇编器)
最后用 ld (链接器) 生成可执行文件
操作系统调用 loader (加载器)运行该文件,
7.2:
链接器完成任务
1) 符号解析: 引用到定义的一一对应
2) 重定 位: 定义与实际存储器位置连续起来
引用 -> 定义 -> 实际存储器位置
7.3
可重定位目标文件格式
.text .rodata . data bss symtab rel.text rel.rodate debug strtab line
特别要注意 symtab 包含所有引用和定义的全局变量和函数 。 也包括 有 static 属性的全局变量,但是不包括有static 定义的局部变量。
7.4
强符号和弱符号
所以函数,已经初始化后的全局变量。
7.5 链接器是如何使用静态库来解析引用的? (重点)
Csap (p475)
这也说明了我们在用静态库的时候要特别注意他的顺序
7.6
重定位
1) 重定位节和符号定义
2) 重定位符号应用
7.7
Linux 运行时存储器映像 (这个特别重要)
7.8
使用共享库的时候要特别注意它的加载方式
-L : 库路径
-l : 库名
-I : 库头文件
2011-06-23
更新:
1) 习题7.1 是很好的练习题。
2) 静态库和动态库的区别??
静态库: 运行时不用加载,没有进程都需要拷贝一份,浪费内存
动态库: 运行时加载,可能影响速度。 所有的内存都共享一份.text ,节省内存。
总之,深刻理解了这一章,对以后编译是出错的问题能够有更好的思路。