是否可以将函数加载到某些分配的内存中并从那里运行它?

2024-01-28

我正在处理一些进程间通信的东西,我很好奇是否可以将函数复制到某些共享内存中并从任一进程中运行它。

就像是:

memcpy(shared_memory_address, &func, &func + sizeof(func));

我知道你无法确定函数的大小,但这就是我脑海中突然浮现的想法。


蛮好玩的。
但看起来你可以。虽然我会NEVER做这个:

在运行 Windows 7 的 lenovo:T61p 上编译:使用 g++ 4.3.4

我要注意的是,某些类型的硬件会阻止这种情况,因为您只能执行特定内存区域(程序区域)中的代码,该区域在硬件内存映射文件中标记为只读(以防止自修改代码)。

另请注意,函数的类型非常有限:

在这个例子中, func() 做了很少的事情,因此可以工作。
但如果您执行以下任何操作,它将无法移植到其他进程:

  • 调用函数或方法。
  • Pass a pointer (or reference)
    • 任何包含指针或引用的对象都不起作用。
  • 使用全局变量。
  • You could pass a method pointer:
    • 但使用它的对象必须按值传递。

上述方法都不起作用,因为一个进程的地址空间与另一个进程的地址空间没有相似之处(因为它在硬件级别映射到物理内存)。

愚蠢的例子

#include <vector>
#include <iostream>
#include <string.h>

int func(int x)
{
    return x+1;
}

typedef int (*FUNC)(int);


int main()
{
    std::vector<char>   buffer(5000);

    ::memcpy(&buffer[0],reinterpret_cast<char*>(&func),5000);

    FUNC func   = reinterpret_cast<FUNC>(&buffer[0]);

    int result  = (*func)(5);

    std::cout << result << std::endl;

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是否可以将函数加载到某些分配的内存中并从那里运行它? 的相关文章

随机推荐