我想模仿一个' 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.
不确定这是否会导致问题。静态链接库也没有帮助 我的目标是改变给定地址的指令
答案 0 :(得分:1)
问题是您尝试修改的内存是只读的。看起来您正在尝试修改可执行文件的文本段中的代码,该代码通常是只读映射的,因此这不是意料之外的。如果您希望能够修改它,则需要将其映射为可写。
您可以通过链接-N
标记来构建具有可写文本段的可执行文件(因此默认情况下将加载为可写) - 使用您的-Xlinker -N
或-Wl,-N
gcc命令行。