gcc DWARF输出因编译器版本而异

2ledvvac  于 2023-04-06  发布在  其他
关注(0)|答案(1)|浏览(170)

我编译了一个包含调试信息的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”,但到目前为止还没有成功。

sbdsn5lh

sbdsn5lh1#

有没有什么方法可以让新编译器版本的debug-info恢复到原来的样子?
不,新的方法更准确,编译器不会为了解析器的利益而降低它输出的信息。

相关问题