【发布时间】:2016-10-09 11:23:39
【问题描述】:
我在两个程序中得到了 libc.so 中函数“printf”的物理地址,两个物理地址不同。而且我读取了两个不同的物理地址,内容几乎是一样的。这意味着函数“printf”在内存中有两个副本?
详情:
我的操作系统是 32 位 linux。
通过读取“/proc/self/pagemap”计算物理地址。
物理地址读取通过fmem模块实现,源码在git@github.com:NateBrune/fmem.git
【问题讨论】:
-
“内容几乎一样”是什么意思?如果这两个
printf()的实现不同,那么它们当然必须在不同的地方,也许这两个程序使用不同版本的libc? -
"物理地址"你确定吗?每个进程都使用自己的虚拟地址空间。
-
这就是现在大多数动态链接器的工作方式:它为使用该库的每个进程一次又一次地加载共享库。理想情况下,每个进程的内存访问都与任何其他进程隔离,以便它们相互保护。这适用于代码和数据,例如您不希望一个有缺陷的进程破坏或破坏另一个进程的代码。因此,为每个进程多次加载库比一次加载动态库并为多个进程多次映射内存位置更容易、更安全。
标签: c linux shared-libraries elf