我知道这些问题之前已经被问到 - 但我仍然无法将所有内容协调到一个整体画面。链接,加载和虚拟内存
- 静态VS动态库
- 静态库有自己的代码复制并链接到生成的可执行文件
- 静态库只复制所需的模块链接到可执行文件,而不是整个库实现
- 静态库不需要编译为PIC,因为它们是生成的可执行文件的一部分
- 动态库在描述h的存根中复制和链接负载/链接(?)运行时的功能实现
- 动态库可以是PIC或可重定位的
- 为什么存在单独的静态和动态库?以上所有内容似乎都是静态或动态链接器的工作。为什么我需要2个实现
scanf
的库? - (奖金#1)共享库是指什么?我听说它被用作(1)总括术语,与库的同义词,(2)直接用于动态库,(3)使用虚拟内存将库的相同物理内存映射到多个地址空间。你只能用动态库来做到这一点吗? (4)在内存中具有相同动态库的不同版本。
- (奖金#2)是默认情况下动态或静态链接的标准库(libc,libC++,stdlibC++,..)吗?我从来不需要
dlopen()
..
- 静态VS动态链接
- 这怎么比静态VS动态库有什么不同?我不明白为什么不只有一个库,我们使用静态或动态链接器(PIC问题除外)。我们是否应该讨论更一般的静态动态链接,而不是谈论静态库和动态库?
- 是仍然在编译时为两者执行的符号分辨率?
- 静态VS动态加载
- 静态加载装置执行它之前复制完整的可执行到MM
- 动态加载意味着仅可执行标头执行前复制到MM,附加功能被装入MM请求时。这与分页有什么不同?
- 如果可执行文件是动态链接的,为什么不能动态加载?
- 静态负载和动态加载可能会或可能不会进行拆迁
我知道有很多事情我感到困惑在这里 - 我没有必要找人来解决每个问题。我希望通过列出所有令我困惑的事情,理解这一点的人会看到我理解中的失误在广泛的层面上,并且能够描绘出这些事物如何协作的更大的图片。
如果在Linux上,请阅读[Drepper的论文:*如何编写共享库*](http://people.redhat.com/drepper/dsohowto.pdf)。这是一篇很长的论文,但它回答了你的大部分问题。 – 2014-11-04 20:45:32
@BasileStarynkevitch谢谢你的论文 - 我会读它!操作系统的概念差异很大吗? – user167524 2014-11-04 20:48:32
另请参见[Levine的书:*链接器和加载器*](http://www.iecc.com/linker/) – 2014-11-04 20:49:12