Младшие 32 бита 0x0000000500000000
- все нули. x86 имеет младший порядок. Первые 8 бит старшей работы GDB (слово x86) в GDB-гиганте (x86 qword) равны 5.
Дамп как отдельные байты, чтобы увидеть это, например, x /8xb
Поскольку $rbp - 0x84
равно 0xff...
, set $rbp-0x84 = 0x1
изменило RBP (сам регистр) до некоторого небольшого числа, поэтому x $rbp-0x84
переносит.
Это не изменит память, потому что вы этого не сделали разыменуйте его как значение указателя, например *(long*)($rbp-0x84) = 1
. x
содержит неявное разыменование (оно берет указатель arg и показывает вашу память). set
и print
нет.
Я удивлен, что это вообще сработало с выражением в левой части назначения. Это не разрешено в C, но, очевидно, GDB это позволяет. На самом деле я тестировал, и он выдает $rbp = 1
в GDB 9.1.
После этого изменения в RBP, $rbp - 0x84
- это число чуть ниже 0
, то есть 0xff ..... Обратите внимание, что это не 0x7f...
больше и шире 1 . Эта страница не отображается. (И забавный факт; Linux никогда не позволит вам отобразить эту виртуальную страницу даже в ядре, потому что значения в этом диапазоне рассматриваются как коды ошибок, а не действительные указатели.)
сноска 1: Виртуальные адреса в пользовательском пространстве имеют ширину не более 47 бит (до тех пор, пока процессоры PML5 с таким большим объемом оперативной памяти, что ОС решит использовать дополнительный уровень таблиц страниц). Linux ставит стек ближе к вершине.