【问题标题】:gdb cannot access memory for program running in qemu-arm emulatorgdb 无法访问在 qemu-arm 模拟器中运行的程序的内存
【发布时间】:2014-11-03 04:03:13
【问题描述】:

我正在尝试使用 qemu 指令级模拟器来模拟“C”程序。通过发出以下命令来编译“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.

不确定这是否会导致问题。静态链接库也无济于事 我的目标是更改给定地址的指令

【问题讨论】:

    标签: assembly gdb embedded arm qemu


    【解决方案1】:

    问题是您尝试修改的内存是只读的。看起来您正在尝试修改可执行文件的文本段中的代码,该代码通常被映射为只读,所以这并不意外。如果您希望能够对其进行修改,则需要将其映射为可写。

    您可以通过链接-N 标志来构建带有可写文本段的可执行文件(因此默认情况下它将加载为可写)——在 gcc 命令行上使用 -Xlinker -N-Wl,-N

    【讨论】:

    • 我尝试了您分别提到的两个选项。我仍然收到相同的“无法访问地址处的内存”错误。现在代码中没有共享库,因为它是静态链接的
    • @user2955638:检查二进制文件以确保它可以用objdump -p-x 正确写入。您还可以修改现有二进制文件以使文本可使用objcopy --writable-text 写入,这应该允许您创建可写入的文本动态链接的可执行文件。
    • 感谢您的快速回复,但仍然无法正常工作。 qemu-arm 接受 ELF 可执行文件和二进制平面文件作为输入,但不是可写文件。 gdb 的输入文件始终是可写的。我仍然无法写入某个位置。我倾向于认为这更多是 qemu-arm 的问题。还有其他方法吗?
    猜你喜欢
    • 2023-03-14
    • 1970-01-01
    • 2014-08-28
    • 2017-02-07
    • 2018-09-08
    • 1970-01-01
    • 2014-12-11
    相关资源
    最近更新 更多