我编译了一个包含调试信息的ELF文件,然后读取debug-info并解析它以获得RAM中所有变量(全局变量和类变量)的列表。这已经适用于旧版本的编译器,但在新版本中,debug-info看起来不同,尽管两个输出都是DWARF v4格式。因此现有的解析器不再工作。
例如,在编译器版本7.3.1中,全局变量的输出只有一个DW_TAG_变量,它直接包括地址(DW_AT_location):
<1><26ec2>: Abbrev Number: 90 (DW_TAG_variable)
<26ec3> DW_AT_name : (indirect string, offset: 0x165b): SystemCoreClock
<26ec7> DW_AT_decl_file : 120
<26ec8> DW_AT_decl_line : 135
<26ec9> DW_AT_type : <0x4d>
<26ecd> DW_AT_location : 5 byte block: 3 68 0 0 20 (DW_OP_addr: 20000068)
现在在版本10.3.1中,它被分成3个不同的DW_TAG_变量,它们被反向链接。第一个包含名称,最后一个包含地址:
<1><b3540>: Abbrev Number: 13 (DW_TAG_variable)
<b3541> DW_AT_name : (indirect string, offset: 0x2f0a0): SystemCoreClock
<b3545> DW_AT_decl_file : 4
<b3546> DW_AT_decl_line : 58
<b3547> DW_AT_decl_column : 17
<b3548> DW_AT_type : <0xb3379>
<b354c> DW_AT_external : 1
<b354c> DW_AT_declaration : 1
<1><b37d5>: Abbrev Number: 14 (DW_TAG_variable)
<b37d6> DW_AT_specification: <0xb3540>
<b37da> DW_AT_decl_file : 6
<b37db> DW_AT_decl_line : 135
<b37dc> DW_AT_decl_column : 12
<1><14cfe>: Abbrev Number: 30 (DW_TAG_variable)
<14cff> DW_AT_abstract_origin: <0xb37d5>
<14d03> DW_AT_location : 5 byte block: 3 0 0 0 20 (DW_OP_addr: 20000000)
使用的编译器是arm-none-eabi-gcc。
有没有什么方法可以让新编译器版本的debug-info恢复到原来的样子?
我已经尝试了一些不同的编译器选项,如“-gdwarf-version”,但到目前为止还没有成功。
1条答案
按热度按时间sbdsn5lh1#
有没有什么方法可以让新编译器版本的debug-info恢复到原来的样子?
不,新的方法更准确,编译器不会为了解析器的利益而降低它输出的信息。