静态链接

来源:互联网 发布:淘宝宝贝分类怎么设置 编辑:程序博客网 时间:2024/04/25 23:14
静态链接是由链接器在链接时将库的内容加入到可执行程序中的做法。
每个模块的源代码文件经过编译器编译成目标文件(linux的.o或者win的.obj),目标文件和库(library)一起链接形参最终的额可执行文件。

动态链接库:win的.dll和linux下的.so文件
静态链接库:win的.lib和linux下的.a文件

链接器是一个独立程序,将一个或多个库或目标文件(先前由编译器或汇编器生成)链接到一块生成可执行程序。 
静态链接的最大缺点是生成的可执行文件太大,需要更多的系统资源,在装入内存时也会消耗更多的时间。
Unix ld程序这样的静态链接器(static linker)以一组可重定位的目标文件作为输入,生成一个完全连接的可以加载和运行的可执行目标文件作为输出


输入的可重定位目标文件由各种不同的代码和数据节(section)组成。
指令在一个节中(.text);
初始化的全局变量和局部静态变量在一个节中(.data);
而未初始化的变量在另外一个节中(.bss)----预留位置而已;
除此之外还有文件头,描述文件属性和指定静态或者动态链接的入口地址等。
分节的原因(我的理解):可以避免把数据当成指令执行了;可以提高编译器工作的效率;户对于代码段,只有读的权限,就可以保证代码段不受破坏;在装载到内存之后,更有利于内存的组织,例如内存里的哪一块是堆区,哪一块是栈区,哪一块是代码区;最后就是可以使结构更清晰,可读性更好。

为了构造可执行文件,链接器必须完成两个主要的任务:
1、符号解析(symbol resolution)。目标文件定义和引用符号。符号解析的目的是将每个符号引用(例如函数调用和引用变量)刚好和一个符号定义联系起来。
   注:符号----链接中,我们将函数和变量统称为符号。namespace就是为多模块的符号冲突而生!
2、重定位(relocation)。编译器和汇编器生成从地址0开始的代码和数据节。链接器通过把每个符号定义和一个存储器位置联系起来,然后,修改所有对这些符号的引用,使他们指向这个存储器位置,从而重定位这些节。

目标文件、可执行文件与进程空间:





原创粉丝点击