Регистры rsp и rbp после входа в фунцию
Есть программа на Си:
#include <stdio.h>
void f(int a, int b, int c, int d)
{
char buffer[10];
int value;
value = 31337;
buffer[0] = 'A';
}
int main()
{
f(10,4,1,5);
}
Я ее дизассемблирую на Kali linux x88-64 при помощи gcc(gdb) без оптимизации.
Ставлю точку остановки перед входом в функцию и после. Ожидаю, что регистры rbp и rsp будут хранить один адрес, а после захода в функцию - разные, но этого не происходит. Читал, что компилятор может оптимизировать rbp и не использовать как регистр стекового фрейма, но вроде у меня он его так использует.
Reading symbols from file.out...
(gdb) list 1
1 #include <stdio.h>
2 void f(int a, int b, int c, int d)
3 {
4 char buffer[10];
5 int value;
6 value = 31337;
7 buffer[0] = 'A';
8 }
9 int main()
10 {
(gdb)
11 f(10,4,1,5);
12 }
(gdb) break 11
Breakpoint 1 at 0x114b: file file.c, line 11.
(gdb) break f
Breakpoint 2 at 0x1139: file file.c, line 6.
(gdb) run
Starting program: /home/domori/Рабочий стол/file.out
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
Breakpoint 1, main () at file.c:11
11 f(10,4,1,5);
(gdb) i r rsp rbp
rsp 0x7fffffffdce0 0x7fffffffdce0
rbp 0x7fffffffdce0 0x7fffffffdce0
(gdb) c
Continuing.
Breakpoint 2, f (a=10, b=4, c=1, d=5) at file.c:6
6 value = 31337;
(gdb) i r rsp rbp
rsp 0x7fffffffdcd0 0x7fffffffdcd0
rbp 0x7fffffffdcd0 0x7fffffffdcd0
(gdb)
Не могу понять, в чем проблема.
Ответы (1 шт):
Автор решения: Stanislav Volodarskiy
→ Ссылка
Компилирую gcc -g -S file.c. Код функции f из file.s с моими комментариями:
f:
.LFB0:
.file 1 "file.c"
.loc 1 6 1
.cfi_startproc
pushq %rbp ; сохранение регистра rbp в стеке
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp ; копирование rsp в rbp
.cfi_def_cfa_register 6
movl %edi, -20(%rbp)
movl %esi, -24(%rbp)
movl %edx, -28(%rbp)
movl %ecx, -32(%rbp)
.loc 1 9 11
movl $31336, -4(%rbp) ; точка останова
.loc 1 10 16
movb $65, -14(%rbp)
.loc 1 11 1
nop
popq %rbp
.cfi_def_cfa 7, 8
ret
.cfi_endproc
Ничего удивительного что в регистрах одинаковые значения.