GDB показывает сообщение об ошибке при попытке печати переменной в программе сборки - PullRequest
0 голосов
/ 10 сентября 2018

При изучении ассемблера из книги есть список, показывающий некоторые основные операции:

segment .data
a   dq  176
b   dq  4097

segment .text
global _start

_start:
    mov rax, [a]    ; Move a into rax.
    add rax, [b]    ; add b o rax.
    xor rax, rax
    ret

После сборки с помощью команды "$yasm -f elf64 -g dwarf2 -l listing.lst listing.asm" и связывания с "$ld -o listing listing.o" я запустил программу в gdb. Там всякий раз, когда я пытался напечатать значение переменной, GDB показывал это сообщение об ошибке:

(gdb) p a
'a' has unknown type; cast it to its declared type

То же самое для другой переменной 'b'. Однако приведение 'a' или 'b' к int сработало:

(gdb) p (int)a
$11 = 176
(gdb) p (int)b
$12 = 4097

Но разве это не должно работать без кастинга? Зачем мне кастовать? Какую ошибку я допустил в моем исходном файле?

Ответы [ 2 ]

0 голосов
/ 10 сентября 2018

Старая GDB по умолчанию использовалась для предположения, что символ был int, когда у него не было отладочной информации, описывающей размер / тип.

Это обычно вызывает больше путаницы, чемтекущее поведение, поэтому оно было изменено.например, Значение, отображаемое в Kdbg, неверно - NASM

0 голосов
/ 10 сентября 2018

Но разве это не должно работать без кастинга?

Нет. GDB говорит вам, что он понятия не имеет, что такое type a и b.

Какую ошибку я допустил в моем исходном файле?

Вы не допустили никаких ошибок, но вы также не предоставили отладочной информации, которую мог бы использовать GDB.

Возможно, вы ожидали, что yasm -g dwarf2 ... сделает это, но он только создает минимальную отладочную информацию, описывающую источник, и ничего больше:

$ readelf -wi listing.o

Contents of the .debug_info section:

  Compilation Unit @ offset 0x0:
   Length:        0x37 (32-bit)
   Version:       2
   Abbrev Offset: 0x0
   Pointer Size:  8
 <0><b>: Abbrev Number: 1 (DW_TAG_compile_unit)
    <c>   DW_AT_stmt_list   : 0x0
    <10>   DW_AT_low_pc      : 0x0
    <18>   DW_AT_high_pc     : 0x14
    <20>   DW_AT_name        : listing.asm
    <28>   DW_AT_comp_dir    : /tmp/
    <2e>   DW_AT_producer    : yasm 1.3.0
    <39>   DW_AT_language    : 32769    (MIPS assembler)
...