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

GCC 12(arm_none_eabi)调用__gcov_dump()无法生成.gcda文件及链接错误

GCC 12 arm_none_eabi 测试覆盖问题解决及参考文档翻译

问题分析

升级到GCC 12后,替换__gcov_flush为__gcov_dump() + __gcov_reset()出现undefined reference to __gcov_exit错误,且无法生成.gcda文件,核心原因是GCC 12对嵌入式独立环境(freestanding)下的gcov运行时依赖做了调整:独立环境下编译器不再默认提供__gcov_exit这类内部清理函数,同时gcov的文件写入逻辑依赖用户实现的文件系统接口。

解决方案

  • 手动实现__gcov_exit函数,该函数是GCC 12新增的内部依赖,独立环境无默认实现:
    void __gcov_exit(void) {
        // 空实现即可,__gcov_dump已完成覆盖数据的写入操作
    }
    
  • 确认编译链接参数正确,需保留-fprofile-arcs -ftest-coverage(或直接用--coverage),同时显式指定-ffreestanding以适配嵌入式独立环境。
  • 确保程序具备.gcda文件的写入能力:嵌入式环境需自行实现fopen、fwrite、fclose等文件操作函数,或搭建可访问的模拟文件系统(如RAM磁盘),否则gcov无法输出覆盖数据文件。

GCC官方独立环境文档相关内容翻译

在独立环境中,GCC不提供标准库的大部分功能,包括与文件系统交互的组件。而gcov运行时依赖文件系统来写入.gcda覆盖数据文件,因此用户必须自行实现必要的文件操作接口,或提供模拟的文件系统支持。

GCC 12及后续版本中,gcov的部分内部依赖函数(如__gcov_exit)不再默认提供。这是因为独立环境没有统一的程序退出流程,编译器无法自动生成通用的清理逻辑,需要用户根据自身需求手动实现这些函数。

使用__gcov_dump()和__gcov_reset()时,需确保覆盖数据可被正确访问,且目标文件系统支持写入操作,否则无法生成.gcda文件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 17:39:52