我想知道在 C 中如何将函数的内容复制到内存中并执行它?
我正在尝试做这样的事情:
typedef void(*FUN)(int *);
char * myNewFunc;
char *allocExecutablePages (int pages)
{
template = (char *) valloc (getpagesize () * pages);
if (mprotect (template, getpagesize (),
PROT_READ|PROT_EXEC|PROT_WRITE) == -1) {
perror ("mprotect");
}
}
void f1 (int *v) {
*v = 10;
}
// allocate enough spcae but how much ??
myNewFunc = allocExecutablePages(...)
/* Copy f1 somewere else
* (how? assume that i know the size of f1 having done a (nm -S foo.o))
*/
((FUN)template)(&val);
printf("%i",val);
感谢您的回答
最佳答案
您似乎已经弄清楚了有关保护标志的部分。如果您知道函数的大小,现在您可以执行 memcpy() 并将 f1 的地址作为源地址传递。
一个重要的警告是,在许多平台上,您将无法从您正在复制的函数 (f1) 中调用任何其他函数,因为相对地址被硬编码到函数的二进制代码中,并移动它到不同的位置,内存会使这些相对地址变坏。
关于在内存中复制一个函数并执行它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4546071/