You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用GCC 13.1.0在独立环境运行测试覆盖率遇未定义引用问题

GCC 13.1.0下gcov教程编译未定义引用问题

环境与操作步骤

我在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这两个关键符号。

解决方式

  1. 直接使用GCC默认链接逻辑(推荐)
    去掉自定义链接脚本参数,执行以下链接命令即可:

    gcc-13 --coverage main.o app.o -Wl,-Map,app.map
    
  2. 修复自定义链接脚本
    如果必须使用自定义链接脚本,需在linkcmds中添加.gcov_info段的收集定义,示例如下:

    .gcov_info : {
      __gcov_info_start = .;
      *(.gcov_info)
      __gcov_info_end = .;
    }
    

    添加后重新执行链接命令即可。

  3. 验证段生成
    可以通过以下命令检查编译后的目标文件是否生成了.gcov_info段:

    objdump -h main.o
    

    如果没有该段,说明编译参数-fprofile-info-section未生效,需确认GCC版本支持该选项(GCC 11+支持)。

内容的提问来源于stack exchange,提问作者Jimmy Stone

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 06:02:13