如何将调试类型信息手动添加到GNU GAS程序集“数组”符号?

时间:2019-06-19 08:45:54

标签: gcc gdb gas dwarf

例如,出于说明目的,请考虑以下具有独立变量true的Linux独立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类型?

编写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

大概是由于添加了GCC的DWARF调试信息。

当我查看生成的程序集时,我只能找到对my_longs的引用:

.Ltext0:
    .comm   my_longs,16,16
.Ldebug_info0:
    .long   .LASF351
    .quad   my_longs
.LASF351:
    .string "my_longs"

所以我不确定类型信息存储在哪里。

我知道这个问题基本上可以归结为:DWARF中的类型是如何编码的,手动编码该信息是否可行。如果这一直困扰着我,我打算稍后再研究DWARF。

1 个答案:

答案 0 :(得分:2)

我也不是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>
...