如何修复 /libgcov.a(_gcov.o) 中的隐藏符号 __gcov_init 被 DSO 引用
问题
当我们引入 Gocv 来构建我的代码覆盖项目时,我遇到了以下错误消息:
错误 1
g++ -m64 -z muldefs -L/lib64 -L/usr/lib64 -lglib-2.0 -m64 -DUV_64PORT -DU2_64_BUILD -fPIC -g DU_starter.o
NFA_msghandle.o NFA_svr_exit.o du_err_printf.o -L/workspace/code/myproject/src/home/x64debug/bin/
-L/workspace/code/myproject/src/home/x64debug/bin/lib/ -lundata -lutcallc_nfasvr
-Wl,-rpath=/workspace/code/myproject/src/home/x64debug/bin/ -Wl,-rpath=/.dulibs28 -Wl,--enable-new-dtags
-L/.dulibs28 -lodbc -lm -lncurses -lrt -lcrypt -lgdbm -ldl -lpam -lpthread -ldl -lglib-2.0
-lstdc++ -lnsl -lrt -lgcov -o /workspace/code/myproject/src/home/x64debug/objs/du/share/dutsvr
/usr/bin/ld: /workspace/code/myproject/src/home/x64debug/objs/du/share/dutsvr:
hidden symbol `__gcov_init' in /usr/lib/gcc/x86_64-redhat-linux/4.8.5/libgcov.a(_gcov.o) is referenced by DSO
错误 2
也可能是这样的错误
/home/p7539c/cutest/CuTest.c:379: undefined reference to `__gcov_init'
CuTest.o:(.data+0x184): undefined reference to `__gcov_merge_add'
定位问题
让我们以错误 1 为例。
从错误消息中,我注意到 -lundata -lutcallc_nfasvr
所有链接库(-l库)
我一一检查库 undata
,发现它显示并表示未定义的符号。utcallc_nfasvr
U __gcov_init
U
使用 find
命令搜索库,使用 nm
命令列出库中的符号。
-sh-4.2$ find -name *utcallc_nfasvr*
./bin/libutcallc_nfasvr.so
./objs/du/work/libutcallc_nfasvr.so
-sh-4.2$ nm ./bin/libutcallc_nfasvr.so | grep __gcov_init
U __gcov_init
怎么修
就我而言,我只是添加了以下代码 LIB_1_LIBS := -lgcov
以允许 utcallc_nfasvr
库调用 gcov。
LIB_1 := utcallc_nfasvr
# added below code to my makefile
LIB_1_LIBS := -lgcov
重建,错误消失,然后检查库,这次显示 t __gcov_init
了,这意味着符号值存在而不是隐藏。
-sh-4.2$ nm ./bin/libutcallc_nfasvr.so | grep __gcov_init
t __gcov_init
或者在你的情况下可能会像这样构建一个共享库,类似地,只需添加编译参数 -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 /usr/lib/gcc/x86_64-redhat-linux/4.8.5/libgcov.a(_gcov.o) is referenced by DSO`
每次我都可以通过添加 -glcov
然后重新编译来修复它。重建后错误消失了。您使用 nm
命令再次检查符号是否已添加成功。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论