例如,出于说明目的,请考虑以下具有独立变量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。
答案 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>
...