动态库和静态库
来源:互联网 发布:知彼软件是干什么的 编辑:程序博客网 时间: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
- 动态库和静态
- 静态库和动态库
- 静态库和动态库
- 动态库和静态库
- 静态库和动态库
- 静态库和动态库
- 静态库和动态库
- 静态库和动态库
- 动态库和静态库
- 静态库和动态库
- 静态库和动态库
- 静态库和动态库
- 静态库和动态库
- 静态库和动态库
- 动态库和静态库
- 动态库和静态库
- 静态库和动态库
- 静态库和动态库
- Java 集合类
- win10+boost for gcc
- Oracle表中的一条记录占用weblogic多少内存
- Eclipse Remot Debug
- rabbitmq学习4:Routing
- 动态库和静态库
- 个人对web前端工作时候的一些见解
- TYVJ1360Imperishable Shooting
- tomcat的启动顺序
- php函数随记1
- Android联系人列表,实现ListView的A-Z字母排序和过滤搜索功能,字母条目上顶
- Jquery 数组操作大全个人总结
- rabbitmq学习5:Topics
- hibernate性能优化