Я вне целевого исполняемого файла GDB, и у меня даже нет стека, соответствующего этой цели. В любом случае я хочу сделать один шаг, чтобы я мог проверить, что происходит в моем коде сборки, потому что я не являюсь экспертом в сборке x86. К сожалению, GDB отказывается делать эту простую отладку на уровне сборки. Это позволяет мне устанавливать и останавливаться на соответствующей точке останова, но как только я пытаюсь сделать шаг вперед, GDB сообщает об ошибке «Не удается найти границы текущей функции», и EIP не изменяется.
Дополнительные детали:
Машинный код был сгенерирован операторами gcc asm, и я скопировал его в область памяти ядра, где он выполняется, из вывода objdump -d. Я не возражаю против простого способа использовать загрузчик для загрузки моего объектного кода по перемещенному адресу, но имейте в виду, что загрузка должна выполняться в модуле ядра.
Я полагаю, что другой альтернативой было бы создание поддельного модуля ядра или файла отладочной информации для передачи в gdb, чтобы заставить его поверить, что эта область находится в программном коде. GDB отлично работает на самом исполняемом ядре.
(Для тех, кто действительно хочет знать, я вставляю код во время выполнения в пространство данных ядра Linux внутри виртуальной машины VMware и отлаживаю его с помощью удаленной отладки gdb с помощью встроенной заглушки gdb рабочей станции VMware. Примечание. не пишу эксплойты ядра; я аспирант безопасности, пишу прототип.)
(Я могу установить точку останова для каждой инструкции в моей сборке. Это работает, но через некоторое время станет довольно трудоемким, поскольку размер сборочных инструкций x86 меняется, и расположение сборки будет меняться при каждой перезагрузке.)