前些天写的gcov相关的功能:https://mzhan017.blog.csdn.net/article/details/135140232;
最近和同事看一个问题,就是虽然将所需的选项–coverage加到了产品的编译环境里,但是还是没有生成所希望的文件。而且自己写小程序来验证这个选项,也是没问题,可以产生程序运行时的代码覆盖率统计文件。如下:
[-rwxr-xr-x. 1 root root 33K Dec 23 12:35 a.out
-rw-r–r–. 1 root root 256 Dec 23 12:35 else.gcda //the file
?
root@10 test]# gcov else
File ‘else.c’
Lines executed:75.00% of 8
Creating ‘else.c.gcov’
那问题出现到了哪里呢?后来同事经过查看一个链接脚本的更改记录,发现是链接脚本里的改动影响了这个行为。
那接下来就是要看到底是什么样的改动影响了这个行为。最终一步一步的发现是因为,在链接init_array/fini_array段的时候,默认链接脚本是使用如下的脚本,做链接:
.init_array :
{
PROVIDE_HIDDEN (__init_array_start = .);
KEEP ((SORT_BY_INIT_PRIORITY(.init_array.) SORT_BY_INIT_PRIORITY(.ctors.)))
KEEP ((.init_array EXCLUDE_FILE (crtbegin.o crtbegin?.o crtend.o crtend?.o ) .ctors))
PROVIDE_HIDDEN (__