代码改变世界

对链接的认识续篇

2013-08-22 21:28  zhanjl  阅读(155)  评论(0)    收藏  举报

上篇文章完整的介绍了静态链接的过程,其实,链接的整个过程也大致如此。下面说一下动态链接和静态链接的不同之处。

既然静态链接能很好的完成任务,为什么会出现动态链接呢?静态链接的哪些问题促使了动态链接的出现?

静态链接有两个主要问题,

一浪费资源,我们知道,几乎每个C程序都会使用标注I/O函数,例如printf,scanf等等,静态链接会把这些函数复制到可执行文件中。所以运行时,每一个使用这些函数的进程中都有这些函数的副本,在一个运行50-100个进程的典型系统上,这是对存储资源的极大浪费。

另一个问题是如果要更新静态库的话,那么要重新链接每一个之前使用该库的文件,会很麻烦。

共享库很好的解决了上述问题,我们来看他是如何解决的。

动态链接使用的是动态库,解决问题的关键就是动态库如何和程序链接到一块的。

简单的说,链接时,动态库并不会放入到可执行文件中,只是放入了一些重定位和符号表信息。

当运行可执行文件时,动态库会被复制到内存中,然后可执行文件借助链接时放进去的符号表和重定位信息来定义符号的引用,此时可执行文件的信息就完整了。

所有使用动态库的进程都共享一份动态库副本,在物理存储器中只存在这一个副本,可执行文件中没有动态库副本,所以可执行文件会变小。

当我们更新动态库时,不用再重新链接,运行时,会自动链接到更新后的库版本。

                                               

关于链接,粗浅的说到这,详细的内容可以看《深入理解计算机系统》第七章,很详细。

  可执行文件结构 a.out

其他段,包括符号表,重定位表等等

BSS段 存放的是未初始化全局变量的大小,注意存放的只是大小而已。

数据段

存放的是初始化的全局变量

文本段 放的是代码 指令

 运行对应的时存储器映像

        堆栈段
         BSS段,不是大小,而是一块内存
          数据段
          文本段
          未映射区域

 

 

关于运行时栈的内容,稍后再加上吧。