Например, рассмотрим следующую отдельно стоящую программу Linux true
с бесполезной переменной my_longs
в иллюстративных целях:
main.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
on, добавив дополнительную аннотацию в мою программу сборки?
При написании программы на 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 чуть позже, если это будет продолжать беспокоить меня.