gpt4 book ai didi

c++ - 复制调用功能

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:15:03 24 4
gpt4 key购买 nike

我想复制并调用一个函数,但是下面的代码在调用缓冲区时会出现段错误。我必须改变什么? (Linux,x86)

#include <string.h>
#include <malloc.h>
#include <stdio.h>

int foo () { return 12; }
void foo_end () {}

int main () {
int s = (unsigned long long) foo_end - (unsigned long long) foo;
int (*f) () = (int (*)()) malloc (s);
memcpy ((void*) f, (const void*) foo, s);
printf ("%d %d\n", f (), foo ());
}

编辑: 工作解决方案:

#include <string.h>
#include <malloc.h>
#include <stdio.h>
#include <sys/mman.h>
#include <unistd.h>

int foo () { return 12; }
void foo_end () {}

int main () {
int s = (unsigned long long) foo_end - (unsigned long long) foo;
int (*f) () = (int (*)()) malloc (s);
memcpy ((void*) f, (const void*) foo, s);
long ps = sysconf (_SC_PAGESIZE);
void *fp = (void*) ((unsigned long long) f & ~((unsigned long long) (ps-1)));
if (mprotect ((void*) fp, ps, PROT_READ | PROT_WRITE | PROT_EXEC)) return -1;
printf ("%d %d\n", f (), foo ());
}

最佳答案

哇,那段代码有这么多问题。

  1. 你不知道函数在内存中是按顺序排列的,没有填充他们之间
  2. 你不可能知道指向两个函数的指针是可减的
  3. 你不可能知道 malloc() 返回的内存可以调用

简而言之,不要这样做。

更新:

在 Linux 中,我认为你可以使用 <a href="http://linux.die.net/man/2/mprotect" rel="noreferrer noopener nofollow">mprotect()</a>设置内存块的权限。我认为这需要 root,但显然不需要(只要您在自己的进程内存中)。

关于c++ - 复制调用功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3717499/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com