Это более точная версия этого вопроса: Создание символов отладки для gdb вручную. Я генерирую ассемблерный код для своего языка и хочу иметь возможность наблюдать за переменными. AFAIK, что позволяет это сделать, определяется после
.section .debug_info,"",@progbits
Вопрос: как мне сгенерировать .section .debug_info
для DWARF (поскольку у меня Linux, но на самом деле меня устраивает все, что работает)? Есть ли где-нибудь документация по этому разделу?
Давайте для конкретности поговорим об этой программе:
int sum(int a, int b) {
return a+b;
}
Сгенерированный asm можно увидеть здесь (x86-64 gcc 7.3): https://godbolt.org/z/ooTuuO Та его часть, которая, как мне кажется, мне нужна:
.Ldebug_info0:
.long 0x6f
.value 0x4
.long .Ldebug_abbrev0
.byte 0x8
.uleb128 0x1
.long .LASF0
.byte 0x4
.long .LASF1
.long .LASF2
.quad .Ltext0
.quad .Letext0-.Ltext0
.long .Ldebug_line0
.uleb128 0x2
.string "sum"
.byte 0x1
.byte 0x1
.long .LASF3
.long 0x6b
.quad .LFB0
.quad .LFE0-.LFB0
.uleb128 0x1
.byte 0x9c
.long 0x6b
.uleb128 0x3
.string "a"
.byte 0x1
.byte 0x1
.long 0x6b
.uleb128 0x2
.byte 0x91
.sleb128 -20
.uleb128 0x3
.string "b"
.byte 0x1
.byte 0x1
.long 0x6b
.uleb128 0x2
.byte 0x91
.sleb128 -24
.byte 0
.uleb128 0x4
.byte 0x4
.byte 0x5
.string "int"
.byte 0
Я вижу имена переменных, но кроме этого ничего не понимаю. Что я пытался посмотреть:
- https://stackoverflow.com/a/30212164/2956272. Он содержит некоторую полезную информацию (например, значение меток
.loc
и.LFB, .LFE
), но ее недостаточно для понимания содержания раздела. - https://sourceware.org/binutils/docs-2.18/as/Symbols.html — есть некоторая информация о символах, но она слишком общая.
- Документация по гномам: http://dwarfstd.org/doc/DWARF4.pdf . Я, конечно, только бегло просмотрел, но не увидел ничего, что соответствовало бы тому, что я вижу в ассемблере. Как я понимаю, есть почти прямой перевод того, что я вижу, в Dwarf, но я не знаю, как это делается.
- И многие другие.
Другими словами, мне не удалось найти документацию по этому разделу. Вы знаете, где я могу найти его?