c - Linux:是否可以在进程之间共享代码?

标签 c linux memory ipc mmap

我想知道 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/

相关文章:

c - 如何比较多个 Gprof Profiler 报告?

c - 循环线程中的 pthread_barrier_t

linux - Makefile - 每次编译所有文件

python - 在 Ubuntu 上启动时启动 python 脚本

linux - 如何删除 uid 为 0 的用户?

java - 内存管理 : how to reset a list correctly

java - 在 "Out Of Memory"之后在哪里可以找到堆转储

c++ - 是否有库函数来确定 IP 地址(IPv4 和 IPv6)在 C/C++ 中是私有(private)的还是本地的?

c - C多维数组和解引用数组指针

c - 如何在 c 用户定义函数中返回 "struct"数据类型?