linux中一个进程不共享的是,Linux:可以在进程之间共享代码吗?

我想知道linux进程是否可以调用位于另一个进程内存中的代码?

假设我们在进程A中有一个函数f(),我们希望进程B调用它.我想到的是使用带有MAP_SHARED和PROT_EXEC标志的mmap映射包含函数代码的内存并将指针传递给B,假设f()不会调用A二进制中的任何其他函数.它会工作吗?如果是,那么如何确定内存中f()的大小?

===编辑===

我知道,共享库将完全这样做,但我想知道是否可以在进程之间动态共享代码.

解决方法:

是的,您可以这样做,但第一个进程必须首先通过mmap和内存映射文件或使用shm_open创建的共享区域创建共享内存.

如果您正在共享已编译的代码,那么这就是为其创建的共享库.您可以以普通方式链接它们,并且共享将自动发生,或者您可以使用dlopen手动加载它们(例如,用于插件).

更新:

由于代码已由编译器生成,因此您将需要担心重定位.编译器不会生成只在任何地方工作的代码.它期望.data部分位于某个位置,并且.bss部分已归零.需要填充GOT.必须调用任何静态构造函数.

简而言之,你想要的可能是dlopen.此系统允许您打开共享库,就像它是一个文件,然后按名称提取函数指针.每个使程序库运行的程序都将共享代码段,从而节省内存,但每个程序都有自己的数据部分副本,因此它们不会相互干扰.

请注意,您需要使用-fPIC编译库代码,否则您将无法获得任何代码共享(实际上,许多架构的链接器和动态加载器可能不支持非PIC的库).

标签:linux,memory,mmap,ipc,c-3

来源: https://codeday.me/bug/20190716/1479404.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值