Как вручную добавить информацию о типе отладки в символ «массив» сборки GNU GAS? - PullRequest
0 голосов

Например, рассмотрим следующую отдельно стоящую программу 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 чуть позже, если это будет продолжать беспокоить меня.

1 Ответ

2 голосов
/ 19 июня 2019

Я тоже не эксперт DWARF, но возню с dwarfdump достаточно, чтобы ответить на вопрос.

$ dwarfdump ./main_c.out

..  DW_TAG_variable
        DW_AT_name                  my_longs
        ...
        DW_AT_type                  <0x00000031>

И если мы посмотрим на узел типа, то увидим, что это массив (элементы которого имеют тип, описанный с узлом 0x0048, который соответствует long int).

$ dwarfdump ./main_c.out  | egrep -A3 '00031'

< 1><0x00000031>    DW_TAG_array_type
                      DW_AT_type                  <0x00000048>
                      DW_AT_sibling               <0x00000041>
...
...