我想知道 linux 进程是否有可能调用位于另一个进程内存中的代码?
假设我们在进程 A 中有一个函数 f() 并且我们希望进程 B 调用它。我想到的是使用带有 MAP_SHARED 和 PROT_EXEcflags的 mmap 来映射包含函数代码的内存并将指针传递给 B,假设 f() 不会从 A 二进制文件调用任何其他函数。它会起作用吗?如果是,那么如何确定 f() 在内存中的大小?
=== 编辑 ===
我知道,共享库可以做到这一点,但我想知道是否可以在进程之间动态共享代码。
最佳答案
是的,你可以这样做,但第一个进程必须首先通过 mmap
和内存映射文件或使用 shm_open创建的共享区域创建共享内存
.
如果您要共享编译后的代码,那么共享库就是为创建的。您可以以普通方式链接它们,共享将自动发生,或者您可以使用 dlopen
手动加载它们(例如,对于插件)。
更新:
由于代码是由编译器生成的,因此您需要担心重定位。编译器不会生成可以在任何地方运行的代码。它期望 .data
部分位于某个位置,并且 .bss
部分已被归零。需要填充 GOT。必须调用任何静态构造函数。
简而言之,你想要的可能是dlopen
。该系统允许您像打开文件一样打开共享库,然后按名称提取函数指针。 dlopen
库的每个程序将共享代码段,从而节省内存,但每个程序都有自己的数据段副本,因此它们不会相互干扰。
请注意,您需要使用 -fPIC
编译您的库代码,否则您也不会获得任何代码共享(实际上,许多架构的链接器和动态加载器可能不支持库无论如何都不是 PIC)。
关于c - Linux:是否可以在进程之间共享代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15114233/