父母正在分娩新孩子。
此子级继承父共享库libfoo.so 如果我查看与libfoo.so相关的子进程内存映射,虚拟映射与父进程相同(因为它应该,因为做fork())
我希望能够将子共享库(libfoo.so)重新映射到不同的虚拟映射(当然这与父代不同)
你知道吗?还是现成的解决方案? 可能吗 ?答案 0 :(得分:0)
这通常是不可能的。动态加载程序在spawn
上加载和重定位库,您不应该尝试直接从运行代码中调用它。
即使你可以以某种方式适应动态加载器的调用,它也希望开始干净(意味着它将要重新定位自己,但它已经重新定位了......)。它还需要加载和重新定位所有库,而不仅仅是其中一个。
因此,简单来说,在Glibc和其他所有C库中都没有这样做的接口。
然后,还有不同格式的重定位信息。对于x86和x86-64,它是RELA
,这意味着重定位在单独的表中有明确的加数,因此(原则上)可以再次编辑地址。但是在ARM上,重定位是REL
,这意味着一旦进行重定位,加数是隐式的并且会丢失(覆盖)。
你应该看看dlopen
和他。 - 也许他们符合你的目的。