重新映射子进程上的共享库

时间:2013-11-22 10:56:38

标签: linker shared-libraries fork loader mmap

父母正在分娩新孩子。

此子级继承父共享库libfoo.so 如果我查看与libfoo.so相关的子进程内存映射,虚拟映射与父进程相同(因为它应该,因为做fork())

我希望能够将子共享库(libfoo.so)重新映射到不同的虚拟映射(当然这与父代不同)

你知道吗?还是现成的解决方案? 可能吗 ?

1 个答案:

答案 0 :(得分:0)

这通常是不可能的。动态加载程序在spawn上加载和重定位库,您不应该尝试直接从运行代码中调用它。

即使你可以以某种方式适应动态加载器的调用,它也希望开始干净(意味着它将要重新定位自己,但它已经重新定位了......)。它还需要加载和重新定位所有库,而不仅仅是其中一个。

因此,简单来说,在Glibc和其他所有C库中都没有这样做的接口。

然后,还有不同格式的重定位信息。对于x86和x86-64,它是RELA,这意味着重定位在单独的表中有明确的加数,因此(原则上)可以再次编辑地址。但是在ARM上,重定位是REL,这意味着一旦进行重定位,加数是隐式的并且会丢失(覆盖)。

你应该看看dlopen和他。 - 也许他们符合你的目的。