NASM und gdb, kann das funktionieren?
-
Wie kann ich ein in Assembler geschriebenes Programm mit dem GNU-Debugger (gdb) betrachten?
Immer wenn ich Folgendes versuche einzugeben
nasm -f elf64 programm.asm ld -s -o programm programm.o gdbtui ./programmerhalte ich in der Shell-Konsole die Meldung "No Source Available".
Ich weiß bei GNU-C++ (g++) gibt es die Option -g, um die Debugger-Informationen einzubinden. Aber ich habe gelesen, das NASM diese Option nicht unterstützt.
Ich habe auch den Umweg mit GCC ausprobiert. Leider funktioniert es nicht, da der Compiler verzweifelt nach der main-Funktion sucht, die es bei meinem Assembler-Objekt gar nicht gibt.
Was ist euer Vorschlag? Gibt es unter Linux auch Alternativen zu gdb?
-
Hallo,
Leider funktioniert es nicht, da der Compiler verzweifelt nach der main-Funktion sucht, die es bei meinem Assembler-Objekt gar nicht gibt.Wie machst du es ohne main Funktion? Mit _start Sprungmarke?
Läuft das Programm überhaupt, wenn du es mit
./programmstartest?
-
Ja das Programm läuft. Die Sprungmarke ist _start, aber GCC erwartet main() - glaube ich.
Hier mein "Hallo Welt!" Programm:
; AMD64 section .data hallo: db 'Hallo Welt!' strSize: equ $-hallo section .text global _start _start: mov rax, 4 mov rbx, 1 mov rcx, hallo mov rdx, strSize int 80h mov rax, 1 mov rbx, 0 int 80h
-
Hallo,
ich habe leider keine 64 Bit CPU
und nutze GNU Assembler ;).
Habe dein Programm ein wenig umgeschrieben und erfolgreich ausprobiert.
Umgeschriebenes Programm (asm2.s):.global _start .section .data hallo: .asciz "Hallo Welt!" .equ strSize, (. - hallo) .section .text _start: mov $4, %eax mov $1, %ebx mov $hallo, %ecx mov $strSize, %edx int $0x80 mov $1, %eax mov $0, %ebx int $0x80Hier mein Makefile:
all: as asm2.s -o asm2.o ld asm2.o -o asm2Programm in gdb laufen lassen:
alex@merkur:~/asm$ gdb ./asm2 GNU gdb 6.4.90-debian Copyright (C) 2006 Free Software Foundation, Inc. GDB is free software, covered by the GNU General Public License, and you are welcome to change it and/or distribute copies of it under certain conditions. Type "show copying" to see the conditions. There is absolutely no warranty for GDB. Type "show warranty" for details. This GDB was configured as "i486-linux-gnu"...(no debugging symbols found) Using host libthread_db library "/lib/tls/i686/cmov/libthread_db.so.1". (gdb) disassemble _start Dump of assembler code for function _start: 0x08048074 <_start+0>: mov $0x4,%eax 0x08048079 <_start+5>: mov $0x1,%ebx 0x0804807e <_start+10>: mov $0x8049098,%ecx 0x08048083 <_start+15>: mov $0xc,%edx 0x08048088 <_start+20>: int $0x80 0x0804808a <_start+22>: mov $0x1,%eax 0x0804808f <_start+27>: mov $0x0,%ebx 0x08048094 <_start+32>: int $0x80 End of assembler dump. (gdb) break *0x08048088 Breakpoint 1 at 0x8048088 (gdb) run Starting program: /home/alex/asm/asm2 Failed to read a valid object file image from memory. Breakpoint 1, 0x08048088 in _start () (gdb) x /i $pc 0x8048088 <_start+20>: int $0x80 (gdb) c Continuing. Hallo Welt! Program exited normally. (gdb) quit alex@merkur:~/asm$Hoffe, es hilft ein kleines Stückchen weiter...
-
Anscheinend kennt gdb nur die AT&T-Syntax. Schade

-
Ich weiß jetzt wie das geht.
nasm -g -f elf64 hallowelt.asm ld -o programm hallowelt.o gdbtui ./programmNASM kennt doch Debugger-Informationen. Meine Schuld.
-
NASM kennt doch Debugger-Informationen. Meine Schuld.
He he, von wegen "gdb kennt nur die AT&T-Syntax". Gdb und nasm klingt fast so wie Samurai und Weißkohl (na vielleicht nicht so übertrieben
