注意:以下说明都是针对SRV4系统而言的。
一、编译器
1、组成
1)、预处理器
2)、语法和语义检查器(前端)
3)、代码生成器(后端)
4)、优化器
5)、汇编程序
6)、连接-载入器
2、使用
1)、-#选项查看编译过程的各个独立阶段。
2)、-V选项能提供版本信息
3)、-W选项向各个阶段传递选项信息。
a、W后面跟一个字符(表示那个阶段),一个逗号,然后就是具体的选项。
例:cc -W1, -m main.c > main.linker.map
4)、-M选项传递给链接载入器,要求它产生连接器映象。
二、动态与静态链接
1、动态链接:执行文件只是包含了文件名,让载入器在运行时能够寻找程序所在的函数库。
2、静态链接:函数的一份拷贝是可执行文件的物理组成部分。
3、动态链接的优点
1)、动态链接可执行文件比功能相同的静态链接可执行文件体积小。
2)、提供了更好的I/O和交换空间率,节省了物理内存,提高了系统的整体性能。
3)、动态链接是函数库的版本升级更为容易。
4)、动态链接允许用户在运行是选择需要执行的函数库,使提高速度或提高内存使用效率或包含额外的调试信息而创建新版本函数库是完全可能的。
注意:所以的应用程序都使用动态链接。
4、ABI(应用程序二进制接口)
1)、ABI优点:使软件不必因为新版本函数库或操作系统的发布而重新连接且能提高系统的总体性能。
三、函数库链接的秘密
1、动态库文件的扩展名是“.so”,而静态库文件名是“.a”
2、传给C编译器的命令行参数里并没有提到函数的完整路径名。他甚至没有提到在函数库目录中该文件的完整名字。
3、编译器期望在确定的目录找到库。
4、观察头文件,确认所使用的函数库。
1)、头文件的名字通常并不与它所对应的函数库名相似。
2)、函数库包含许多函数的定义,但这些函数的原型声明却散布于多个头文件中。
5、与提取动态库中的符号相比,静态库中的符号提取方法限制更严。
注意:始终将-1函数库选项放在编译命令行的最右边。
四、警惕Interpositioning
1、定义:通过编写与库函数同名的函数来代替库函数的行为。
2、C保留字不应该出现在自己程序的声明中。(P104-106表5-2)
注意:不要让程序中的任何符号成为全局的,除非有意把他们作为程序的接口之一。
五、产生链接报告文件。