GDB не может получить доступ к памяти для программы, запущенной в эмуляторе qemu-arm

Я пытаюсь эмулировать программу "C" с помощью имитатора уровня команд qemu. Программа "C" компилируется с помощью следующей команды

arm-none-linux-gnueabi-gcc -g ex_qsort.c -o ex_qsort_lin_work

Затем я запускаю QEMU с помощью следующей команды

"qemu-arm -g 1234 -L /path/to/codesourcery/arm-none-linux-gnueabi/libc ./ex_qsort_lin_work"

Затем я подключаюсь к программе, используя gdb. Я пытаюсь получить доступ к памяти программы и изменить код сборки. Но когда я пытаюсь получить доступ к памяти, я получаю следующую ошибку

   (gdb) x 0x00008510
   0x8510 <main+76>:    0xe3530004
   (gdb) set *(0x8510) = 0xe3530002
   Cannot access memory at address 0x8510 

Я не уверен, почему эта ошибка возникает. Gdb не дает никаких других предупреждений. Когда я запускаю GDB, я указал sysroot на библиотеку arm. Однако, когда я проверяю общую библиотеку, я получаю следующее сообщение

   (gdb) info sharedlibrary 
   From        To          Syms Read   Shared Object Library
   0xf67d67d0  0xf67f0f58  Yes (*)     /path/to/codesourcery/arm-none-linux-gnueabi/libc/lib/ld-linux.so.3
   (*): Shared library is missing debugging information.

Не уверен, если это вызывает проблему. Статическое связывание библиотек также не помогает. Моя цель - изменить инструкцию по указанному адресу.

1 ответ

Решение

Проблема в том, что память, которую вы пытаетесь изменить, доступна только для чтения. Похоже, вы пытаетесь изменить код в текстовом сегменте исполняемого файла, который обычно отображается только для чтения, что не является неожиданным. Если вы хотите иметь возможность изменить его, он должен быть отображен как доступный для записи.

Вы можете создать исполняемый файл с сегментом текста, доступным для записи (чтобы он по умолчанию загружался как доступный для записи), связавшись с -N флаг - используйте либо -Xlinker -N или же -Wl,-N в вашей командной строке gcc.

Другие вопросы по тегам