【发布时间】:2020-10-13 06:50:19
【问题描述】:
在阅读this blogpost 时,当作者试图证明共享库需要 PIC 时,我遇到了以下情况。
如果您的共享库被构建为仅在加载到一个特定地址时才能工作,那么一切可能都很好 - 直到出现另一个使用该地址构建的库。
如果库的起始地址决定了库进入内存的位置,那么虚拟内存管理在这里做什么?我的意思是内存映射应该能够确定该物理地址空间中已经存在某些内容,因此我们可以将下一个共享库放置在其他地方。
而且库指定的加载地址是虚拟地址空间对吗?那么,如果两个库具有相同的虚拟地址空间加载地址,为什么还会产生问题。
所以我基本上有这个问题:
- 当使用非 PIC 时,两个库在同一个地址中的问题目前对我来说意义不大。这是否与第一个库与第二个库的地址重叠有关?但同样,操作系统内存管理应该能够将东西放入物理内存空闲的空间,那么冲突在哪里呢?
【问题讨论】:
-
问题与物理地址无关。它只依赖一件事:在虚拟地址空间中,两个库不能驻留在同一个地址。
标签: c gcc memory-management linker code-generation