跳过正文
  1. Posts/

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

·362 字·1 分钟· ·
沈显鹏
作者
沈显鹏
DevOps & Build 工程师 | Python 爱好者 | 开源贡献者
目录

问题描述
#

在项目中引入 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攻城狮」。

相关文章