gpt4 book ai didi

c - 如何确定堆栈上的返回地址?

转载 作者:IT王子 更新时间:2023-10-29 00:20:19 25 4
gpt4 key购买 nike

我知道如果我在某个函数 foo() 中,该函数从 bar() 函数的某处调用,那么这个返回地址将被压入堆栈。

    #include <stdio.h>

void foo()
{
unsigned int x;
printf("inside foo %x\n", &x);
}
int main()
{
foo();
printf("in main\n");
return 0;
}

在上面的代码中,当 foo 函数处于事件状态时,我将获取堆栈中第一个压入的局部变量的地址。如何访问在堆栈上此变量之前某处推送的返回地址(主要称为 foo)?该位置是否固定并且可以相对于第一个局部变量进行访问?我该如何修改它?

编辑:我的环境是带有 gcc 编译器的 x86 处理器上的 Ubuntu 9.04。

最佳答案

有一个 gcc 内置函数:void * __builtin_return_address (unsigned int level)

参见 http://gcc.gnu.org/onlinedocs/gcc/Return-Address.html

在某些架构上,您可以在与第一个参数相关的堆栈中找到它。例如,在 ia32 上,参数被压入(以相反的顺序),然​​后调用将压入返回地址。请记住,堆栈几乎总是(在 ia32 上)向下增长。尽管从技术上讲您需要针对您的语言和硬件平台的ABI调用约定(有时称为链接约定),但实际上您通常可以猜测是否你知道过程调用机器操作是如何工作的。

函数的第一个参数与返回地址在堆栈上的位置之间的关系比局部变量与返回地址之间的关系更可能是可靠的固定值。但是,您当然可以打印出本地地址和第一个参数的地址,您通常会在两者之间找到 PC。

$ expand < ra.c
#include <stdio.h>

int main(int ac, char **av) {
printf("%p\n", __builtin_return_address(0));
return 0;
}
$ cc -Wall ra.c; ./a.out
0xb7e09775
$

关于c - 如何确定堆栈上的返回地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1693011/

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