使用GCC 13.1.0在独立环境运行测试覆盖率遇未定义引用问题
环境与操作步骤
我在Ubuntu 20.04系统上尝试遵循gcov教程操作,已通过以下命令将GCC升级至13.1.0:
sudo add-apt-repository ppa:ubuntu-toolchain-r/test sudo apt install gcc-13
随后执行以下命令构建教程代码:
gcc-13 --coverage -fprofile-info-section -c main.c gcc-13 --coverage -fprofile-info-section -c app.c ld --verbose | sed '1,/^===/d' | sed '/^===/d' > linkcmds gcc-13 --coverage main.o app.o -T linkcmds -Wl,-Map,app.map
错误信息
执行后出现链接错误:
/usr/bin/ld: main.o: in function
dump_gcov_info': main.c:(.text+0x1df): undefined reference to__gcov_info_start'
/usr/bin/ld: main.c:(.text+0x1ea): undefined reference to `__gcov_info_end'
collect2: error: ld returned 1 exit status
同时收到提示:
As-needed library included to satisfy reference by file (symbol) libc.so.6 /usr/lib/gcc/x86_64-linux-gnu/13/libgcov.a(_gcov.o) (exit@@GLIBC_2.2.5) main.o: dynamic relocation against `__gcov_info_start' in read-only section `.text'
检查生成的app.map,未找到教程中提及的__gcov_info_start和__gcov_info_end符号。
问题原因与解决方法
核心原因
手动提取的linkcmds链接脚本丢失了GCC默认脚本中用于收集.gcov_info段的逻辑,导致链接器无法生成__gcov_info_start和__gcov_info_end这两个关键符号。
解决方式
直接使用GCC默认链接逻辑(推荐)
去掉自定义链接脚本参数,执行以下链接命令即可:gcc-13 --coverage main.o app.o -Wl,-Map,app.map修复自定义链接脚本
如果必须使用自定义链接脚本,需在linkcmds中添加.gcov_info段的收集定义,示例如下:.gcov_info : { __gcov_info_start = .; *(.gcov_info) __gcov_info_end = .; }添加后重新执行链接命令即可。
验证段生成
可以通过以下命令检查编译后的目标文件是否生成了.gcov_info段:objdump -h main.o如果没有该段,说明编译参数
-fprofile-info-section未生效,需确认GCC版本支持该选项(GCC 11+支持)。
内容的提问来源于stack exchange,提问作者Jimmy Stone

