linux - GDB se queja Sin fuente disponible
assembly nasm (2)
Me estoy ejecutando en Ubuntu 12.10 64 bits.
Estoy intentando depurar un programa de ensamblaje simple en GDB. Sin embargo, el modo gui de GDB (-tui) parece no poder encontrar el código fuente de mi archivo de ensamblaje. Reconstruí el proyecto en el directorio actual y busqué google sin éxito, por favor ayúdenme aquí.
Mis comandos:
nasm -f elf64 -g -F dwarf hello.asm
gcc -g hello.o -o hello
gdb -tui hello
La información de depuración parece estar cargada, puedo establecer un punto de interrupción en main () pero la mitad superior de la pantalla aún dice '' [Sin fuente disponible] ''.
Aquí está hello.asm si estás interesado:
; hello.asm a first program for nasm for Linux, Intel, gcc
;
; assemble: nasm -f elf -l hello.lst hello.asm
; link: gcc -o hello hello.o
; run: hello
; output is: Hello World
SECTION .data ; data section
msg: db "Hello World",10 ; the string to print, 10=cr
len: equ $-msg ; "$" means "here"
; len is a value, not an address
SECTION .text ; code section
global main ; make label available to linker
main: ; standard gcc entry point
mov edx,len ; arg3, length of string to print
mov ecx,msg ; arg2, pointer to string
mov ebx,1 ; arg1, where to write, screen
mov eax,4 ; write command to int 80 hex
int 0x80 ; interrupt 80 hex, call kernel
mov ebx,0 ; exit code, 0=normal
mov eax,1 ; exit command to kernel
int 0x80 ; interrupt 80 hex, call kernel
El problema en este caso es que el ensamblador no está produciendo información de número de línea para el depurador. Entonces, aunque la fuente está ahí (si haces "list" en gdb, muestra una lista del campo de origen - al menos cuando sigo tus pasos, sí lo hace), pero el depurador necesita información del número de línea del archivo para saber qué línea corresponde a qué dirección. No puede hacer eso con la información dada.
Hasta donde puedo encontrar, no hay una manera de hacer que NASM emita la directiva .loc que se usa al usar gcc
por ejemplo. Pero as
no es capaz de tomar su archivo fuente sin generar un montón de errores [incluso con -msyntax = intel -mmnemonic = intel - usted pensaría que eso debería funcionar].
Así que, a menos que alguien más inteligente pueda encontrar una forma de generar las entradas .loc que proporciona la información del número de línea del depurador, no estoy del todo seguro de cómo podemos responder a su pregunta de una manera que le haga feliz.
Esta declaración es falsa.
El ensamblador produce información del número de línea (observe los bits -g -F enano).
Por otro lado, ensambla lo que obviamente es código de 32 bits como 64 bits, que pueden funcionar o no.
Ahora, si hay errores en la salida de depuración de NASM, necesitamos saber eso.
Un par de experimentos rápidos muestra que addr2line (¡pero no gdb!) Decodifica correctamente la información del número de línea generada por NASM utilizando puñaladas, pero no usa enanismo, por lo que probablemente haya algo incorrecto en la forma en que NASM genera DWARF ... pero también algo extraño gdb.
GNU addr2line versión 2.22.52.0.1-10.fc17 20120131, GNU gdb (GDB) Fedora (7.4.50.20120120-52.fc17)).