gcc - Linux 内核 5.4 GCC 9.1.0 不显示代码覆盖率
问题描述
我们在不同的架构(arm、arm64、x86_64)上使用 Linux 内核 5.4 和 gcc 9.1.0。我负责为内核模块创建代码覆盖率。我没有选择 Linux 内核版本,也没有选择编译器版本。
我能够为 arm/arm64 创建代码覆盖率,并像往常一样在 /sys/kernel/debugfs/gcov/... 中查看结果。此外,加载的模块在 gcov 子目录中可见。
但是,对于 x86_64,我只看到 /sys/kernel/debubfs/gcov/reset 而没有其他内容,即使我设置了 CONFIG_GCOV_COVERAGE_ALL=y。
kernel/gcov/base.c 中的 __gcov_init 通常会创建一个
pr_info("version magic=...")
这在启动时在 arm/arm64 上可见,但对于 x86_64 不可见。__gcov_init 应该作为 gcc 构造函数为每个源文件调用,第一次调用会创建版本魔法消息。
在我看来,在我的组合中,代码覆盖函数 __gcov_init 从未在 x86_64 中调用过。
在配置中,我使用
CONFIG_GCOV_PROFILE=y
CONFIG_GCOV_FORMAT_4_7=y
有时仅适用于 x86 CONFIG_GCOV_PROFILE_ALL=y。对于 x86,除了“重置”文件之外什么都看不见 /sys/kernel/debug/gcov/...。
欢迎任何建议。
解决方案
代码覆盖构造函数现在写在“.ctors.65435”部分(该数字可能是构造函数优先级),但内核 5.4 只知道“.ctors”。
对于内核内部代码覆盖率,以下更改(已经在更高版本的内核中,例如 5.12)带回了代码覆盖率
--- a/include/asm-generic/vmlinux.lds.h
+++ b/include/asm-generic/vmlinux.lds.h
@@ -631,6 +631,7 @@
#ifdef CONFIG_CONSTRUCTORS
#define KERNEL_CTORS() . = ALIGN(8); \
__ctors_start = .; \
+ KEEP(*(SORT(.ctors.*))) \
KEEP(*(.ctors)) \
KEEP(*(SORT(.init_array.*))) \
KEEP(*(.init_array)) \
但是,kernel/module.c 也不知道“.ctors.65435”,并且使用 gcc9 或 gcc10 编译的模块没有“.ctors” ELF 部分。所以我只是变身为 HACK (!)
--- a/kernel/module.c
+++ b/kernel/module.c
@@ -3294,7 +3294,7 @@ static int find_module_sections(struct module *mod, struct load_info *info)
mod->unused_gpl_crcs = section_addr(info, "__kcrctab_unused_gpl");
#endif
#ifdef CONFIG_CONSTRUCTORS
- mod->ctors = section_objs(info, ".ctors",
+ mod->ctors = section_objs(info, ".ctors.65435",
sizeof(*mod->ctors), &mod->num_ctors);
if (!mod->ctors)
mod->ctors = section_objs(info, ".init_array",
这带回了模块代码覆盖率,但是
.ctors.* 模块在最新的 5.x 内核中是未知的,所以我认为这应该在 Linux 内核模块处理中修复
推荐阅读
- discord - discord.py-rewrite - 覆盖命令冷却的最佳方法
- css - ion-item 内的 Ionic 4 ion-skeleton 未填充项目空间
- ruby - 为什么某些 ruby 整数不是 Marshal 可转储 to_json
- php - 如何使用 html 表上传 angular 和 laravel 中的多个文件?
- json - Api 响应和 Json laravel 格式
- github - 如何在 GitHub 中创建规则?
- vba - 选择所有没有 ActiveX 按钮的文本
- xamarin.forms - 如何通过 xamarin 表单共享文件(pdf、docx)
- c# - XAML 样式属性没有被继承
- typescript - Iterating a Multidimensional Array in TypeScript