Inhaltsverzeichnis
Raspberry Pi ARM assembly
Hier sammle ich Kommandos die für Assembler auf dem Raspberry Pi notwendig/hilfreich sind. Ich gehe davon aus dass die Befehle direkt auf dem Raspberry Pi ausgeführt werden (oder halt via SSH).
Kommandos
Mit "as" von Quelltext zu Objekt Code
Das Ergebnis ist dann noch nicht ausführbar und muss noch mit „ld“ gelinked werden (oder alternativ gcc).
as 002.asm -o 002.o
file 002.o 002.o: ELF 32-bit LSB relocatable, ARM, EABI5 version 1 (SYSV), not stripped
Linken
ld 002.o -o 002.elf
alternativ: („-nostdlib“ da mein Quelltext bisher äußert simpel ist ;))
gcc 002.o -o 002.elf -nostdlib
file 002.elf 002.elf: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), statically linked, not stripped
Debug mit gdb
Notizen für die Benutzung von gdb
Breakpoint setzen
(gdb) break _start Breakpoint 1 at 0x10074
Programm ausführen
(gdb) run Starting program: /home/pi/arm-assembly/002.elf Breakpoint 1, 0x00010074 in _start ()
Programm disassemblen
(gdb) disass Dump of assembler code for function _start: => 0x00010074 <+0>: mov r7, #4 0x00010078 <+4>: mov r0, #1 0x0001007c <+8>: ldr r1, [pc, #36] ; 0x100a8 <_start+52> 0x00010080 <+12>: mov r2, #19 0x00010084 <+16>: svc 0x00000000 0x00010088 <+20>: mov r7, #3 0x0001008c <+24>: mov r0, #0 0x00010090 <+28>: ldr r1, [pc, #20] ; 0x100ac <_start+56> 0x00010094 <+32>: mov r2, #1 0x00010098 <+36>: svc 0x00000000
Register ansehen
(gdb) info reg r0 0x0 0 r1 0x0 0 r2 0x0 0 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 0xbefff360 0xbefff360 lr 0x0 0 pc 0x10074 0x10074 <_start> cpsr 0x10 16 fpscr 0x0 0
Nächste Instruktion
(gdb) ni 0x0001007c in _start () (gdb)
gdbserver und remote
Ich hatte in einigen Fällen STDOUT nicht in der gdb-cmd-Ausgabe (zumindes nicht, wie ich es erwartet hatte). In solchen Fällen hilft es das Programm über gdbserver zu starten
gdbserver 127.0.0.1:12345 003.elf aaaabbb Listening on port 12345 Remote debugging from host 127.0.0.1 aaaabbb
Nun steuert man das Programm remote via
gdb target remote :12345 break _start cont
Umfangreichere gdb-Ansicht
Mein Favorit ist „lay regs“ da es die Register, den disassembled Code und die Command-Box zeigt.
(gdb) lay regs
Wer dies gern nutzt, sollte es in der ~/.gdbinit hinterlegen. Mit „focus cmd“ funktioniert dann der „Pfeil nach oben“ auch wieder. Wer im ASM-Code navigieren möchte, setzt den „focus asm“ oder „focus prev“.
Speicher an einer bestimmten Stelle/Adresse inspizieren
(gdb) x/s 0x200db 0x200db: "A\021"
Verschiedene Ausgaben
(gdb) p/d 0xA # hex to dec $1 = 10 (gdb) p/t 0xA # hex to bin $2 = 1010 (gdb) p/t 0x4 # dec to bin $3 = 100 (gdb) p/x 10 # dec to hex $4 = 0xa
objdump
objdump -d
objdump -d <file> # oder -D
objdump -x
objdump -x <file>
strace
Details zu strace
strace ./002.elf execve("./002.elf", ["./002.elf"], 0xbe85f3a0 /* 44 vars */) = 0 write(1, "Enter a character: ", 19Enter a character: ) = 19 read(0, Benny "Benny\n", 8) = 6 write(1, "Benny\n", 6Benny ) = 6 exit(65) = ? +++ exited with 65 +++