aboutsummaryrefslogtreecommitdiffstats
path: root/pkg/cover
diff options
context:
space:
mode:
authorJoey Jiao <quic_jiangenj@quicinc.com>2024-07-01 10:45:10 +0800
committerDmitry Vyukov <dvyukov@google.com>2024-07-03 08:00:41 +0000
commitd819d4df2ae41917fefc7f25a0bcb8a7d3573c25 (patch)
tree4df3c1fc2dde1ff07af33272ca2d37d8b949290e /pkg/cover
parent9dde10367399d3f211ebc68b4b3c8fa8ba718917 (diff)
all: calc kaslr offset and remove kaslr_offset from module addr
Diffstat (limited to 'pkg/cover')
-rw-r--r--pkg/cover/backend/modules.go41
-rw-r--r--pkg/cover/report_test.go6
2 files changed, 46 insertions, 1 deletions
diff --git a/pkg/cover/backend/modules.go b/pkg/cover/backend/modules.go
index c9501d34c..c96d4bd05 100644
--- a/pkg/cover/backend/modules.go
+++ b/pkg/cover/backend/modules.go
@@ -148,3 +148,44 @@ func searchModuleName(data []byte) string {
}
return string(data[pos+len(key) : end])
}
+
+func getKaslrOffset(modules []*KernelModule, pcBase uint64) uint64 {
+ for _, mod := range modules {
+ if mod.Name == "" {
+ return mod.Addr - pcBase
+ }
+ }
+ return 0
+}
+
+// when CONFIG_RANDOMIZE_BASE=y, pc from kcov already removed kaslr_offset.
+func FixModules(localModules, modules []*KernelModule, pcBase uint64) []*KernelModule {
+ kaslrOffset := getKaslrOffset(modules, pcBase)
+ var modules1 []*KernelModule
+ for _, mod := range modules {
+ size := uint64(0)
+ path := ""
+ for _, modA := range localModules {
+ if modA.Name == mod.Name {
+ size = modA.Size
+ path = modA.Path
+ break
+ }
+ }
+ if path == "" {
+ continue
+ }
+ addr := mod.Addr - kaslrOffset
+ if mod.Name == "" {
+ // mod.Addr for core kernel from target is _stext addr
+ addr = 0
+ }
+ modules1 = append(modules1, &KernelModule{
+ Name: mod.Name,
+ Size: size,
+ Addr: addr,
+ Path: path,
+ })
+ }
+ return modules1
+}
diff --git a/pkg/cover/report_test.go b/pkg/cover/report_test.go
index 5fad4ebfc..ac0afd6c7 100644
--- a/pkg/cover/report_test.go
+++ b/pkg/cover/report_test.go
@@ -318,6 +318,10 @@ func generateReport(t *testing.T, target *targets.Target, test *Test) (*reports,
},
},
}
+ modules, err := backend.DiscoverModules(cfg.SysTarget, cfg.KernelObj, cfg.ModuleObj)
+ if err != nil {
+ return nil, err
+ }
// Deep copy, as we are going to modify progs. Our test generate multiple reports from the same
// test object in parallel. Without copying we have a datarace here.
@@ -326,7 +330,7 @@ func generateReport(t *testing.T, target *targets.Target, test *Test) (*reports,
progs = append(progs, Prog{Sig: p.Sig, Data: p.Data, PCs: append([]uint64{}, p.PCs...)})
}
- rg, err := MakeReportGenerator(cfg, subsystem, nil, false)
+ rg, err := MakeReportGenerator(cfg, subsystem, modules, false)
if err != nil {
return nil, err
}