diff options
| author | Joey Jiao <quic_jiangenj@quicinc.com> | 2024-07-01 10:45:10 +0800 |
|---|---|---|
| committer | Dmitry Vyukov <dvyukov@google.com> | 2024-07-03 08:00:41 +0000 |
| commit | d819d4df2ae41917fefc7f25a0bcb8a7d3573c25 (patch) | |
| tree | 4df3c1fc2dde1ff07af33272ca2d37d8b949290e /pkg/cover | |
| parent | 9dde10367399d3f211ebc68b4b3c8fa8ba718917 (diff) | |
all: calc kaslr offset and remove kaslr_offset from module addr
Diffstat (limited to 'pkg/cover')
| -rw-r--r-- | pkg/cover/backend/modules.go | 41 | ||||
| -rw-r--r-- | pkg/cover/report_test.go | 6 |
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 } |
