English 中文(简体)
我怎样才能确定返回地址。
原标题:How can I determine the return address on stack?
  • 时间:2009-11-07 13:22:29
  •  标签:

我知道,如果我是在<条码>(<>foo(>)”的某些职能范围内,即从<条码>/条码>功能中点起,那么这一返回地址就被推向 st。

    #include <stdio.h>

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

在上述法典中,我将在禁忌功能活跃时,先把当地变量推向 st。 我怎样才能获得返回地址(主要称为“oo”),而返回地址在这种变数上 st倒之前被推向其他地方? 该地点是固定的,可以与当地第一个变量相对取用? 我怎么能加以修改?

EDIT:我的环境是乌班第9.04号,涉及X86的加工商和电离层编。

最佳回答

此处插入一个缩略语:void* __builtin_return_address(未签署定级)

rel=“noreferer”http://gcc.gnu.org/onlinedocs/gcc/Return-Address.html

在某些结构上,你可以发现它与第一个参数相对应。 例如,在ia32,参数被推延(相反次序),然后发出呼吁,推动返回地址。 认为 st(和ia)几乎总是增长down<>>>。 虽然在技术上,您需要ABI(有时称为linkage conventions)的语文和硬件平台,但在实践中,如果你知道程序如何使用机器,你通常会猜测。

第一个参数与功能的关系和返回地址在 st上的位置,远比当地和返回地址之间的关系更可能具有可靠的固定价值。 然而,你当然可以勾画一个地方和第一个参数的地址,而且你往往在两者之间发现个人电脑的权利。

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

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

当你宣布当地变量时,这些变量也处于等舱位。

如果您随后宣布<代码>int * xptr,并将其初步定为&x,则该代码应为x。

没有什么(结果)阻止你把这个点推到一点之前的 pe,或将其推到后面。 你们的返回地址在其他地方。

你们可以坐在 like上。

// assuming a 32 bit machine here
void digInStack(void) {

    int i;
    long sneak[1];

    // feel free to adjust the search limits
    for( i = -32; i <= 32; ++i) {
        printf("offset %3d: data 0x%08X
", i, sneak[i]);
    }
 }

你们可以放弃这一点,因为C是名副其实的,因为你是如何把一个阵列指数化。 在这里,你宣布一阵列,然后在+/--上方 pe。

正如罗伯克·沃克指出的,你当然需要知道你召集公约的汇编者,了解你正在研究的数据。 你可以勾画几个功能的地址,并寻找范围相似的价值观,以及返回地址相对交错阵列的直观。

谨慎之辞——阅读你所希望的,但不会改变使用这种阵列的任何内容,除非(a) 您绝对相信,那部分是你正在修改的,或(b) 只是想看到一种有趣的、不可预测的坠毁模式。

并请指出,总的来说,C语没有保证,你返回的地址是停滞不前的,或者实际上在援助团任何地方。

有一些加工商结构将返回地址储存在登记册中,只是在电话开始充电时才使用区域援助团。 还有一些其他结构,在返回地址方面有单独的障碍,这是万国邮联无法理解的。 这两者仍然可以有为他们实施的C汇编者。

因此,你需要更明确地了解你的环境。

引言

//test1.cc
//compile with
//g++ -g test1.cc -o test1 

#include <stdio.h>

void
print_function(void *p) {
    char cmd[128];
    FILE *fp;

    snprintf(cmd, sizeof(cmd), "addr2line -e %s -f %p", "test1", p);
    fp = popen(cmd, "r");
    if (fp) {
    char buf[128];
    while (fgets(buf, sizeof(buf), fp)) {
        printf("%s", buf); 
    }
    }
}

void
f2(void) {
    print_function(__builtin_return_address(0));
}

void
f1(void) {
    f2();
}

int
main(int argc, char *argv[]) {
    f1();
    return(0);
}

产出应该看上去。

_Z2f1v
/home/<user>/<dir>/test1.cc:30




相关问题