Например, рассмотрим следующую автономную программу true
для Linux с бесполезной переменной my_longs
для наглядности:
главная.S
.section .rodata
my_longs: .quad 0x12, 0x34
.text
.global _start
_start:
asm_main_after_prologue:
mov $60, %rax
mov $0, %rdi
syscall
который вы можете собрать и запустить с помощью:
as -o main.o main.S
ld -o main.out main.o
gdb main.out
Затем запустите программу с помощью:
starti
Теперь, чтобы увидеть значение my_longs
, мне нужно ввести раздражающую часть (long[2])
:
p/x (long[2])my_longs
Есть ли способ указать GDB тип my_longs
, добавив дополнительную аннотацию в мою программу сборки?
При написании программы на C:
main_c.c
long my_longs[] = {0x12, 0x34};
int main(void) {
return 0;
}
скомпилировано с:
gcc -O0 -ggdb3 -save-temps -o main_c.out main_c.c
Я могу видеть символы непосредственно с;
p/x my_longs
предположительно из-за добавления отладочной информации DWARF GCC.
Когда я взглянул на сгенерированную сборку, я смог найти только следующие ссылки на my_longs
:
.Ltext0:
.comm my_longs,16,16
.Ldebug_info0:
.long .LASF351
.quad my_longs
.LASF351:
.string "my_longs"
поэтому я не уверен, где хранится информация о типе.
Я знаю, что этот вопрос может сводиться в основном к следующему: как кодируются типы в DWARF и практично ли вручную кодировать эту информацию. Я намереваюсь изучить DWARF чуть позже, если это продолжит беспокоить меня.