You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

不同arm-none-eabi-gcc版本DWARF输出差异及格式恢复问询

问题:新版arm-none-eabi-gcc生成的DWARF调试信息格式变化导致解析器失效

背景

我编译包含调试信息的ELF文件后,会读取并解析调试信息以获取RAM中所有全局变量和类变量的列表。该流程在旧版编译器(7.3.1)中可正常运行,但升级到10.3.1版本后,尽管同样采用DWARF v4格式,调试信息的结构却发生了变化,导致现有解析器失效。

新旧调试信息格式对比

旧版(7.3.1)格式

全局变量仅对应一个包含DW_AT_location地址信息的DW_TAG_variable节点:

<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_variable节点:首节点存储名称等声明信息,末节点存储地址信息,节点之间通过DW_AT_specification和DW_AT_abstract_origin字段关联:

<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)

已尝试的解决方法

尝试过使用-gdwarf-version编译选项,未能让新版编译器生成旧格式的调试信息。

疑问

是否有办法让新版arm-none-eabi-gcc(10.3.1)生成与旧版(7.3.1)一致的调试信息格式?


内容的提问来源于stack exchange,提问作者Martin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 03:47:46