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

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


person Ciro Santilli 新疆再教育营六四事件ۍ    schedule 19.06.2019    source источник


Ответы (1)


Я тоже не эксперт по 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>
...
person Vladislav Ivanishin    schedule 19.06.2019
comment
Спасибо, не знал dwarfdump. ОК, из этого не следует, что есть простой способ вручную закодировать информацию о DWARF :-( - person Ciro Santilli 新疆再教育营六四事件ۍ 19.06.2019
comment
Да, я узнал об этом, скрываясь на SO. Ручное кодирование кажется слишком сложным, я согласен. - person Vladislav Ivanishin; 19.06.2019