2014-09-13 3 views
1

Я пытаюсь получить доступ к различным фреймам стека в системе Linux с архитектурой x86-64. Я могу получить доступ к базовому указателю регистра (rbp) всех фреймов. Теперь я хочу получить доступ к аргументам для каждого вызова функции. Я проверил этот link, в котором говорится, что первые 6 аргументов передаются через регистры. Однако, насколько я понимаю, я могу получить только аргументы самого главного вызова функции, читая регистры. Но как насчет аргументов, переданных другим функциям (т. Е. Кадры стека, лежащие ниже текущего кадра)? Предположительно, они должны быть сохранены в какой-либо позиции в самой стеке, но я не смог получить местоположение. Может кто-нибудь помочь объяснить это?Доступ к стеку стека на архитектуре x86-64 в Linux

Большое спасибо.

+1

Они не обязательно хранятся в стеке, поэтому, как правило, у вас нет доступа к ним. Также обратите внимание, что использование указателя фрейма 'rbp' также необязательно. – Jester

ответ

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 и гексогена согласно вызывающему конвенции. Затем он умножает каждый из этих регистров на 2 и вызывает f2(). Эти регистры определяются как сохраненные звонящие, но их не нужно сохранять, так как f1() не будет использовать их снова. Поэтому, как только мы находимся в f2(), мы не можем разумно ожидать, что у вас есть какой-либо способ получить исходные аргументы, переданные f1(). Они просто не существуют и не могут быть восстановлены, потому что нет возможности «отменить» даже простую операцию, например, умножить на 2 (потому что она могла переполниться).

+0

Но что, если эти аргументы нужны снова? В этом случае a1, a2 и a3 (из f1) нужно было где-то сохранить. Но где? – Arani

+0

Их можно сохранить в других регистрах. :) Но ты не знаешь, что. –

+0

Спасибо, но в этом случае, как это возможно для gdb для выполнения backtrace? – Arani

Смежные вопросы