【发布时间】:2014-11-04 20:34:19
【问题描述】:
我知道以前有人问过这些问题 - 但我仍然无法将所有内容调和成一个整体。
-
静态库与动态库
- 静态库将其代码复制并链接到生成的可执行文件中
- 静态库仅将所需模块复制并链接到可执行文件中,而不是整个库实现
- 静态库不需要编译为 PIC,因为它们是生成的可执行文件的一部分
- 动态库在描述如何在运行时加载/链接(?)函数实现的存根中复制和链接
- 动态库可以是 PIC 或可重定位的
- 为什么有单独的静态库和动态库?以上所有似乎都是静态或动态链接器的工作。为什么我需要 2 个实现
scanf的库? - (bonus #1)共享库指的是什么?我听说它被用作 (1) 总括术语,与库同义,(2) 直接用于动态库,(3) 使用虚拟内存将库的相同物理内存映射到多个地址空间。您只能使用动态库来做到这一点吗? (4) 内存中有同一个动态库的不同版本。
-
(bonus #2) 标准库(libc、libc++、stdlibc++、..)是默认动态链接还是静态链接?我永远不需要
dlopen()..
-
静态与动态链接
- 这与静态库和动态库有何不同?我不明白为什么不只有 1 个库,我们使用静态或动态链接器(除了 PIC 问题)。与其讨论静态库与动态库,不如讨论更通用的静态动态链接?
- 是否仍然在编译时执行符号解析?
-
静态与动态加载
- 静态加载意味着在执行之前将完整的可执行文件复制到 MM 中
- 动态加载意味着在执行前只将可执行文件头复制到 MM 中,在请求时将附加功能加载到 MM 中。这与分页有何不同?
- 如果可执行文件是动态链接的,为什么不能动态加载?
- 静态加载和动态加载可能会也可能不会执行重定位
我知道这里有很多让我感到困惑的事情 - 我没有必要找人来解决每个问题。我希望通过列出所有让我感到困惑的事情,了解这一点的人会看到我的理解失误在哪里,并能够描绘出关于这些事情如何协同工作的更大图景..
【问题讨论】:
-
如果在 Linux 上,请阅读 Drepper's paper: How to Write Shared Libraries。这是一篇很长的论文,但它回答了你的大部分问题。
-
@BasileStarynkevitch 谢谢你的论文——我会读的!操作系统之间的概念是否有很大差异?
-
您应该将语句“静态库仅将所需模块复制并链接到可执行文件中,而不是整个库实现”改写为“链接器仅将每个静态库的所需模块链接到可执行文件中"。
-
@BasileStarynkevitch 是的,我以前看过推荐的,我会看看!感谢您的回复
标签: c linker shared-libraries loading paging