2014-09-13 79 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