分类: C/C++
2009-05-19 00:18:46
一、整个编译的大体过程
1、主要包括六个步骤:
C预处理器、语法和语义检查器、代码生成器、汇编程序、优化器、链接器
整个过程由“编译器驱动器”的控制程序来调用。它们之所以分成独立的程序,是因为他它们每个都具有特定功能的部分自身都是一个完整的程序,独立出来就会更容易设计和编护
2、链接的两种方式
1)静态链接:如果函数库的一份拷贝是可执行文件的物理组成部分,那么就称之为静态链接;模块被链接编辑并载入以便运行
2)动态链接:如果可执行文件只包含了文件名,让载入器在运行时能够寻找程序所需要的函数库,那么我们称之为动态链接。模块被链接编辑后载入,并在运行时进行链接以便运行。
收集模块准备执行的三个阶段的规范名称是链接-编辑(link-editing)、载入(link-editing)和运行时链接(runtime linking)。程序执行时,在main函数被调用前,运行时载入器把共享的数据对象载入到进程的地址空间,外部函数被真正调用之前,运行时载入器并不解析他们,所以即使链接了函数库,如果没有实际调用,也不会带来额外开销。
注意:即使是静态链接中,程序也只装入所需要的函数,而不会是整个静态库中所有的函数。
二、动态链接的优点:
静态链接已经基本被淘汰,动态链接是一种更为现代的方法,它的优点是可执行文件的体积可以非常小,可以更加有效的利用磁盘空间,而且链接-编辑阶段的时间也会缩短
具体优点和原理:
1) 动态链接可执行文件比功能相同的静态链接可执行文件体积小,它能够节省磁盘空间和虚拟内存,因为函数库只有在需要时才被映射到进程中。
2) 所有动态链接到某个特定函数库的可执行文件在运行时共享该函数一个单独拷贝。操作系统内核保证映射到内存中的函数库可以被所有使用它们的进程共享。这就提供了更好的I/O和交换空间利用率,节省了物理内存。从而提高系统的整体性能。如果为静态链接。每个文件都将拥有一份函数库的拷贝。显然极为浪费
3) 动态链接使得函数库的版本升级更为容易。新的函数库可以随时发布,只要安装到系统中。旧的程序就能够自动获得新版本函数库的优点而无需重新链接。
三、注意点
1)动态链接是一种”just-in-time(JIT)”链接,这意味着程序在动行时必须能够找到它们所需要的函数库。这意味着,函数库的路径不能随意移动。
2)-L –R 选项分别告诉链接器在链接时和运行时从哪个目录寻找需要链接的函数库。(还可以通知系统的环境变量来设置LD_LIBRARY_PATH和LD_RUN_PATH);
3)-K pic 产生与位置无关的代码.(问题:什么号位置无关?)
4)动态链接库文件的扩展名是”.so”,而静态库存文件的扩展名是”.a”
5)当你通过 –lthread选项,告诉编译链接到libthread.so(省掉了扩展名和前面的lib)
6)编译器期望在确定的目录找到库,-L或系统环境变量LD_LIBRARY_PATH和LD_RUN_PATH
7)可以通过头文件确认所使用的函数库
五、关于Interpositioning
Interpositioning就是通过编写与库函数同名的函数来取代该库函数的行为,这不是个好方法。正常情况应避开这种做法