跳过正文
Background Image
  1. Posts/

修复 "hidden symbol `__gcov_init' in ../libgcov.a(_gcov.o) is referenced by DSO" 错误

·362 字·1 分钟· ·
沈显鹏
作者
沈显鹏
目录

问题描述
#

在项目中引入 Gcov 做代码覆盖率构建时,可能遇到以下报错:

错误 1
#

hidden symbol `__gcov_init' in /usr/lib/gcc/x86_64-redhat-linux/4.8.5/libgcov.a(_gcov.o) is referenced by DSO

错误 2
#

undefined reference to `__gcov_init'
undefined reference to `__gcov_merge_add'

问题定位
#

错误 1 为例,从报错中可看到涉及多个 .so 动态库,例如:

-lundata -lutcallc_nfasvr

使用 nm 命令查看库文件符号,发现 __gcov_init 被标记为 U(未定义符号):

find -name *utcallc_nfasvr*
nm ./bin/libutcallc_nfasvr.so | grep __gcov_init
# 输出:
#                  U __gcov_init

解决方法
#

在我的项目中,只需在 Makefile 中为对应的库添加 -lgcov 链接选项即可:

LIB_1 := utcallc_nfasvr
LIB_1_LIBS := -lgcov

重新构建后,查看符号时标记变为 t(符号已定义):

nm ./bin/libutcallc_nfasvr.so | grep __gcov_init
# 输出:
#                  t __gcov_init

对于直接构建 .so 库的情况,也可以在编译命令中直接添加 -lgcov

g++ -shared -o libMyLib.so src_a.o src_b.o src_c.o -lgcov

总结
#

我遇到过以下多种形式的报错:

undefined reference to `__gcov_init`
undefined reference to `__gcov_merge_add`
hidden symbol `__gcov_init' in libgcov.a(_gcov.o) is referenced by DSO

通用修复方式:在链接阶段添加 -lgcov 选项,然后重新编译,并用 nm 检查符号是否已正确引入。


转载本文请注明作者与出处,禁止用于商业用途。欢迎关注公众号「DevOps攻城狮」。

相关文章

关于代码覆盖率 (About Code Coverage)
·1527 字·4 分钟
本文简要介绍了代码覆盖率的概念、重要性、常见指标、工作原理以及主流工具,强调了不要过度依赖代码覆盖率指标。
JaCoCo 实现原理 (JaCoCo Implementation Design)
·2684 字·6 分钟
介绍 JaCoCo 的实现设计,包括覆盖率分析机制、Java 版本要求、字节码操纵、内存使用等方面的内容。
C/C++ 代码覆盖率工具
·225 字·1 分钟
代码覆盖率衡量自动化测试覆盖的代码行、语句或代码块的比例,是评估 QA 质量的重要指标。本文列出了常见的 C/C++ 代码覆盖率工具及其特性。
代码覆盖率工具 Squish Coco 使用示例
·596 字·2 分钟
介绍代码覆盖率工具 Squish Coco,并展示在 Visual Studio C++ 项目中如何安装、配置、执行和查看覆盖率结果。
DevOps 实践
·242 字·1 分钟
本文介绍了 DevOps 实践的核心概念、目标和实施方法,强调了持续集成、持续交付和自动化的重要性。
JaCoCo 代码覆盖率实践分享
·1803 字·4 分钟
本文介绍了 JaCoCo 的使用方法,包括 Gradle 配置、执行测试生成报告、报告参数说明以及如何忽略指定的包或类影响测试覆盖率结果。