2014-09-13 78 views
1

我试图在x86-64体系结构的Linux系统上访问不同的堆栈帧。我能够访问所有帧的寄存器基址指针(rbp)。现在我想访问每个函数调用的参数。我检查了link这说明前6个参数正在通过寄存器传递。但据我所知,通过读取寄存器,我只能得到最顶层函数调用的参数。但是发送给其他函数的参数(即,位于当前帧之下的栈帧)呢?据推测,他们必须存储在堆栈本身的某个位置,但我无法获取位置。任何人都可以帮忙解释一下吗?在Linux上访问x86-64体系结构上的堆栈帧

非常感谢。

+1

它们不一定存储在堆栈中,所以一般来说你无法访问它们。还要注意,使用'rbp'作为堆栈帧指针也是可选的。 – Jester 2014-09-13 11:18:10

回答

1

把这个代码:

int f1(int a1, int a2, int a3) { 
    return f2(2 * a1, 2 * a2, 2 * a3); 
} 

int f2(int a1, int a2, int a3) { 
    return a1 + a2 + a3; 
} 

现在说我们叫F1():我们把它的参数到RDI,RSI和RDX按调用约定。然后它将每个寄存器乘以2并调用f2()。这些寄存器被定义为调用者保存,但不需要保存它们,因为f1()将不再使用它们。因此,一旦我们在f2()中,我们不能合理地期望有任何方法来获得传递给f1()的原始参数。它们根本不存在,并且无法恢复,因为即使像乘以2这样的简单操作(因为它可能已经溢出),也无法“撤消”。

+0

但是如果再次需要这些论点呢?在这种情况下,a1,a2和a3(f1)必须保存在某处。但是哪里? – Arani 2014-09-13 12:33:07

+0

它们可以保存在其他寄存器中。 :)但你不知道哪个。 – 2014-09-13 12:49:31

+0

谢谢 - 但在那种情况下,gdb怎么可能做回溯? – Arani 2014-09-13 12:53:34