Ожидается ли, что изменения, внесенные в адресное пространство программы, не будут отменены во время обратной отладки?
Я выполнял отладку программы, которая вызывает ошибки, когда указатель на strlen
в GOT повреждается во время ход исполнения. Благодаря совету, основанному на комментариях к этому вопросу , я получил ПОЛУЧЕНИЕ этой программы только для чтения, связавшись с опцией -z relro
; однако это не предотвращает перезапись указанного указателя. А именно, я могу start
программу в gdb, перейти к первому появлению strlen
, проверить, что указатель действителен (например, x/g 0x5555555d10a8 ==> 0x5555555d10a8 <strlen@got.plt>: 0x00007ffff7e8d1e0
), continue
запущен, и ждать, пока указатель станет недействительным (указывая на бессмысленный адрес за пределами адресного пространства программы; например: x/g 0x5555555d10a8 ==>
0x5555555d10a8 <strlen@got.plt>: 0x0000000000002156
), запрашивая segv
.
Однако, если я record full
всего выполнения (от первой строки до программа с ошибками), а затем awatch
адрес с указателем на strlen
во время reverse-continue
, точка наблюдения никогда не срабатывает. И когда программа, наконец, вернулась к инструкции # 0, указатель все еще указывает на неверный адрес, который у нее был при сбое.
Это приводит к двум вопросам. Во-первых, почему GOT изменчив, несмотря на параметр компоновщика -z relro
? Во-вторых, ожидается ли, что место в памяти (указатель на strlen
), измененное во время выполнения программы, не будет восстановлено до исходного значения во время обратного выполнения?