【知其所以然】-对链接的思考

引言:

写一段程序很容易、也能很容易的得到一个能正确运行的执行、学习语言很容易,难的是掌握它

不管接触什么语言,最经典的入门例子大概就是“hello world”了。然而,对于“hello world”背后的东西、当时却不曾深究。

作为做程序的普通小菜、我仍醉心于基础和底层的东西。诚然、我也认为这些东西很重要。练好“内功”、有扎实的底层基础才能走的更快更远。

 

知其所以然:承上、今天看了一下关于编译过程中链接的部分、觉得很有价值遂分享如下。

由于链接器是从编译器中分割出来的单独程序,所以先要对编译有一个基本的认识。

 

编译器的基本概念:

简单的说,一个编译器就是一个程序,它可以阅读某一种程序语言编写的程序,并把改程序翻译成一个等价的用另一种语言编写的程序。

绝大多数的编译器并不是一个单一的庞大程序,通常由六七个较小的单独的程序组成,这些程序由一个叫做“编译器驱动器”的控制程序

来调用。这些单独的程序一般包括:预处理器,语法和语义检查器,代码生成器,优化器,汇编程序,链接器。(一段程序也正是经过上面的那些顺序而被编译的)

 

链接器

由汇编程序产生的目标文件并不能马上执行,而是被送入连接器生成可执行文件。链接器确人main函数为程序入口点,吧符号引用绑定到内存地址,把所有是目标文件

组合在一起,再加上库文件,从而产生可执行程序。

用于pc的链接机制和那些更大的系统有明显区别,pc连接器只提供几个基本的IO服务,就是被称作BIOS的程序。它们存在于内存的固定地点,并不是可执行文件的一部分。

如果需要其他功能,可以通过库函数提供,但编译器必须吧库函数链接到每个可执行文件中。也就是每个可执行文件都会有一个库函数的拷贝。

之前的UNIX系统也是如此,当链接程序时,程序需要的每个函数都拷贝一份到执行文件中。这就是可以说已经用的不多的链接技术:静态链接

表面上好像顺理成章、或许善于思考的你已经能想象出这样做的不妥之处了吧、这里先不说,等看完了动态链接就会豁然开朗的


动态链接:

动态链接是对静态链接的一种优化。动态链接允许系统提供一个庞大的函数集合,可以提供各种各样的服务。和静态链接不同,在程序允许需要函数的

时候从系统中取出直接用,而不是和静态链接一样把函数作为可执行文件的一部分。目前大多数情况都会使用动态链接。

如果函数库的一份拷贝是可执行文件的物理组成部分,那么我们称为静态链接。如果可执行文件只包含了文件名,让载入器在运行的时候能从系统中找到

程序需要的函数,那么称为动态链接。

静态链接的模块被链接编辑并载入可执行文件中一边执行。动态链接的模块被编辑后载入(运行的时候不需要链接),并在执行的时候链接(链接调用的库函数)一边运行

(运行时候要链接所调用的函数)。(动态链接生成的可执行文件)执行时,在main()函数被调用之前,运行时载入器吧共享的数据对象载入到进程的地址空间。

外部函数被调用之前, 运行时载入器并不解析他们。所以即使链接了函数库,如果没有实际调用个,也不会带来额外开销。

 

动态链接的优点:

1.动态链接可执行文件比同功能的静态链接文件体积小 。能节省磁盘空间和虚拟内存

2.所有动态链接到某个特定函数库 的可执行文件在运行时共享该函数库的一个单独拷贝。操作系统内核保证映射到内存中的函数库可以被所有他们的进程共享。提高了更好的

I/O和交换空间利用率,节省物理内存而提高系统的整体性能。

3.动态链接使得函数库的版本升级更为容易。新的函数库可随时发布,只要更新到系统中就可而不用改动程序。

 

 

暂时就写这些吧、欢迎补充、、、

不足之处还望指正。

 

参考资料:《C专家编程》

《compliers》

http://en.wikipedia.org/wiki/Compiler

http://library.thinkquest.org/C001341/tuts/opentut.php3?mn=c&pn=t&id=21&page=1

 

 

如转载请注明出处:http://www.cnblogs.com/yanlingyin/

一条鱼~博客园

 

posted @ 2011-11-24 19:57  Geek_Ling  阅读(2175)  评论(5编辑  收藏  举报