gpt4 book ai didi

在c程序的运行中更改堆栈

转载 作者:太空宇宙 更新时间:2023-11-04 02:55:38 24 4
gpt4 key购买 nike

我正在编写以下能够更改函数调用堆栈的代码。但它总是在 printf 上遇到段错误。我用汇编调试代码,栈切换成功。造成段错误的是 printf 语句,不确定原因。有人知道我应该进一步研究哪个方向吗?

谢谢。

char stack[4000000*4]; 

void foo(int ad) {
int i = 100;
int sum = i*i + ad;
printf("stack changed to %X\n", stack);
}

/* in this example, foo (and its decendents) live on a new stack */
void change_stack(void *newstack) {
void *ctx[5]; // Jump buffer for setjmp/longjmp.
if (0 == __builtin_longjmp(ctx)) {
ctx[2] = newstack; // switch stack
__builtin_longjmp(ctx, 1);/* here stack is switched */
} else {
/* now live on new stack, can we pass parameters now ? */
int ad = 20;
foo(ad);
}
}

int main (int argc, char** argv)
{
int i = 10;
change_stack(stack);
printf("return, %d\n", i);
return 0;
}

最佳答案

您无需复制旧堆栈的内容即可切换堆栈。当 change_stack 返回时,结果是未定义的(例如,它可能跳转到地址 NULL,导致段错误)。此外,局部变量之类的东西也将是未定义的。

此外,(假设我们在这里讨论的是 x86),堆栈指针在推送时递减。由于您分配的新堆栈指针是您的 stack 数组的基址(即最低地址),任何推送都会减少该数组外的指针,也可能导致段错误。

关于在c程序的运行中更改堆栈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17820756/

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