我正在开发带有 RTOS 的 ARMv7 SoC 系统。
现在我有一个二进制文件,它是通过从正在运行的系统中转储内存生成的,我想用 QEMU 和 GDB 运行/调试二进制文件。
我是在一个 Linux 终端上做的,
qemu-system-arm --machine vexpress-a9 -nographic -m 1024 -kernel ./memory0_4k.bin -s -S
在另一个终端,
gdb-multiarch memory0_4k.bin
The program has no registers now.
(gdb) target remote localhost:1234
Remote debugging using localhost:1234
warning: No executable has been specified and target does not support
determining executable automatically. Try using the "file" command.
0x05d2b46c in ?? ()
(gdb) info registers
r0 0x0 0
r1 0x8e0 2272
r2 0x60000100 1610612992
r3 0x0 0
r4 0x0 0
r5 0x0 0
r6 0x0 0
r7 0x0 0
r8 0x0 0
r9 0x0 0
r10 0x0 0
r11 0x0 0
r12 0x0 0
sp 0x0 0x0
lr 0x10000060 268435552
pc 0x5d2b46c 0x5d2b46c
cpsr 0x400001db 1073742299
fpscr 0x0 0
fpsid 0x41033090 1090728080
fpexc 0x0 0
NSACR 0x0 0
MIDR_S 0x410fc090 1091551376
......
我也试过 objdump 如下,
arm-linux-gnueabi-objdump -bbinary -marm -D memory0_4k
memory0_4k: file format binary
Disassembly of section .data:
00000000 <.data>:
0: e59fffb8 ldr pc, [pc, #4024] ; 0xfc0
4: e59fffb8 ldr pc, [pc, #4024] ; 0xfc4
8: e59fffb8 ldr pc, [pc, #4024] ; 0xfc8
c: e59fffb8 ldr pc, [pc, #4024] ; 0xfcc
10: e59fffb8 ldr pc, [pc, #4024] ; 0xfd0
14: e59fffb8 ldr pc, [pc, #4024] ; 0xfd4
18: e59fffb8 ldr pc, [pc, #4024] ; 0xfd8
1c: e59fffb8 ldr pc, [pc, #4024] ; 0xfdc
20: e59f1028 ldr r1, [pc, #40] ; 0x50
24: e3a00001 mov r0, #1
28: e5810000 str r0, [r1]
2c: e1a00000 nop ; (mov r0, r0)
显示.data部分!
那么在这种情况下,如何使用QEMU+GDB调试内存转储的二进制文件呢?