动态库和静态库

来源:互联网 发布:知彼软件是干什么的 编辑:程序博客网 时间:2024/05/26 20:21

简单的说,使用动态库就是在链接的时候,不会将动态库的代码链接到可执行文件中,而是采用symbol的方式。

使用静态库,生成可执行文件的时候,会将静态库的代码链接到可执行文件中。这样,动态库体积会很小,并且可以,依赖于更新的动态库,但是,缺点是不稳定。静态库会更加稳定,但是体积会很大。

===============

静态库 : 就是多个目标文件的合并;


动态库:  生成和run time load 会比较复杂:

1、 load time relocation   (gcc 默认)

2、 position independent code  (-fPIC)

动态库与可执行文件不同的地方时,(由于虚拟内存的存在)

可执行文件连接之后,会有确定的load address ,所以程序中的指令的地址都确定(虚拟地址,物理地址当然不确定)。

动态链接库,没有确定的load address,所以,在动态链接库内部,对于全局变量,或者是函数的调用,都无法确定它的实际运行的地址。为了解决这个问题,提出了两种方法。

1、 load time relocation:

在可执行文件中,有一个.relocation 段中,存放的是各使用的变量的信息,(变量出现位置, 变量存储的偏移地址, 变量名)

$ readelf -r libmlreloc.soRelocation section '.rel.dyn' at offset 0x2fc contains 7 entries: Offset     Info    Type            Sym.Value  Sym. Name00002008  00000008 R_386_RELATIVE00000470  00000401 R_386_32          0000200C   myglob00000478  00000401 R_386_32          0000200C   myglob0000047d  00000401 R_386_32          0000200C   myglob[...] skipping stuff
在load time的时候,dynamic linker 会查这个表,将每一个出现的变量,都换为实际的虚拟地址。这样,任务就完成了。
问题:   如果多个进程共享同一个.so时,由于代码上已经是实际运行的虚拟地址,所以,就不能同时供多个进程共享。
2、  position independent code
将代码中需要用到的地址写为一个表的地址,这个表存放的是实际变量,或者函数的地址(函数和变量的实际方法不一样),而这个表存放在数据段。
所以,如果多个进程共享同一个.so也没有问题,因为,他们的代码是一样的,只是数据段不同而已。

0 0
原创粉丝点击