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
相关产品推荐
相关产品推荐

