117 Followers
·
Follow

hidden symbol __gcov_init in /…/libgcov.a(_gcov.o) is referenced by DSO

/usr/local/x86_64-pc-linux-gnu/lib/gcc/x86_64-pc-linux-gnu/4.9.3/../../../../x86_64-pc-linux-gnu/bin/ld: contacts-mailplus-server: hidden symbol `__gcov_init’ in /usr/
local/x86_64-pc-linux-gnu/lib/gcc/x86_64-pc-linux-gnu/4.9.3/libgcov.a(_gcov.o) is referenced by DSO
/usr/local/x86_64-pc-linux-gnu/lib/gcc/x86_64-pc-linux-gnu/4.9.3/../../../../x86_64-pc-linux-gnu/bin/ld: final link failed: Bad value

編譯時遇到這個問題,花了好長一段時間分析之後發現是 library 沒有 link 到 -lgcov 的問題,但不是很直覺。

我的 library 如下:

A.so <- B.so <- binary

其中 A.so 編譯的時候有下 --coverage 但 linking 的時候沒有下,編譯的時候下會導致 gcc gen 出一些 code,需要在 link time 得時候 link 起來,但 linking 沒下就導致那個 .so 存在一些 undefined symbol (__gcov_init),然而 __gcov_init 這隻 symbol 被宣告成 hidden 因此不能借用其他 so 的 symbol,就導致了這個狀況。

解法就是 A.so 在 linking 的時候也要下 --coverage

Written by

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store