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 ./programm
    

    erhalte 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

    ./programm
    

    startest?



  • 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 $0x80
    

    Hier mein Makefile:

    all:
    	as asm2.s -o asm2.o
    	ld asm2.o -o asm2
    

    Programm 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 ./programm
    

    NASM 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 😉


Anmelden zum Antworten