C ++保存/加载函数作为字节。获得函数的大小

时间:2011-09-27 01:42:32

标签: c++

好的,所以我已经使用了函数指针一段时间了。我试图弄清楚这是否可能。

首先。可以将函数指针转换为字节数组。

也可以用该数组中的字节重建该函数。

我想将一个函数保存到一个字节数组中,然后将其保存到文本文件(func.dat)中。然后读取该文本文件并执行特定功能...... 可能吗?似乎应该有可能我遇到的唯一问题是找到构成函数的数组的大小。

有没有办法做到这一点?

int func()
{
    return 1+1;
}

int main()
{
    int (*foo)() = func;

    char* data = (char*)func;

    // write all the data
    char* copyFunc = new char[sizeof(func)];
    for(int i = 0; i < sizeof(func); i++)
        copyFunc[i] = data[i];

    int (*constructedFoo)() = (int (*)())copyFunc;

    return 0;
}

当然这段代码不能编译,因为sizeof对函数不起作用,有没有人知道如何获得函数的大小?或者函数页眉/页脚的大小。

我尝试过像

这样的事情
int func()
{
    1+1;
    new char('}');
}

然后搜索了} char(作为函数的结尾)但该大小不起作用。

如果你想知道为什么我需要它,可以用它来说,发送一个函数到远程计算机执行(考虑并行处理)或甚至将函数保存在文件中,就像在我的第一个例子中稍后一样使用,这可能会有所帮助。

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:6)

在C / C ++中,您无法实现的目标。首先,函数在二进制文件的内存中可能不连续。所以没有明确的“大小”。

其次,你不能只将它加载到另一个程序并执行它,因为它会违反内存保护(除了地址空间等)。

最后(如果你设法做到这一点),函数中的所有非相对跳转和引用都可能会被破坏。

编辑:

将代码发送到远程计算机的方法是发送整个(已编译的)二进制文件。然后让本地和远程机器进行通信。

答案 1 :(得分:1)

实际上有一种方法可以保存和加载代码字节甚至运行它们。关于这一点,这是一个很棒的例子:

http://www.codeproject.com/KB/tips/Self-generating-code.aspx?msg=2633508#xx2633508xx

答案 2 :(得分:0)

如果您想要动态加载的函数,可以做的一件事:

  • 创建包含您的功能的动态库(.dll.so

  • 使用extern "C"导出这些符号,必要时declspec(dllexport)

  • 使用LoadLibrary()dlopen()

  • 在运行时加载库
  • 使用GetProcAddress()dlsym()

  • 提取特定符号
  • 使用libffi执行。

  • 使用FreeLibrary()dlclose()

  • 自行清理