I'm trying to learn about ARM assembler programming using the GNU assembler. I've setup my PC with QEmu and have a Debian ARM-HF chroot environment.
If I assemble and link my test program:
.text
.global _start
_start:
mov r0, #6
bx lr
with:
as test.s -o test.o
ld test.o -o test
Then load the file into gdb and set a breakpoint on _start:
root@Latitude-E6420:/root# gdb test GNU gdb (GDB) 7.6.1 (Debian 7.6.1-1) Copyright (C) 2013 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "arm-linux-gnueabihf". For bug reporting instructions, please see: ... Reading symbols from /root/test...(no debugging symbols found)...done. (gdb) break _start Breakpoint 1 at 0x8054 (gdb)
How do I single step the code, display the assembler source code and monitor the registers? I tried some basic commands and they did not work:
(gdb) break _start Breakpoint 1 at 0x8054 (gdb) info regi The program has no registers now. (gdb) stepi The program is not being run. (gdb) disas No frame selected. (gdb) r Starting program: /root/test qemu: Unsupported syscall: 26 qemu: uncaught target signal 11 (Segmentation fault) - core dumped qemu: Unsupported syscall: 26 During startup program terminated with signal SIGSEGV, Segmentation fault. (gdb)
Your problem here is that you're trying to run an ARM gdb under QEMU's user-mode emulation. QEMU doesn't support the ptrace syscall (that's what syscall number 26 is), so this is never going to work.
What you need to do is run your test binary under QEMU with the QEMU options to enable QEMU's own builtin gdb stub which will listen on a TCP port. Then you can run a gdb compiled to run on your host system but with support for ARM targets, and tell that to connect to the TCP port.
(Emulating ptrace within QEMU is technically very tricky, and it would not provide much extra functionality that you can't already achieve via the QEMU builtin gdbstub. It's very unlikely it'll ever be implemented.)