From d945c1fd68fda7bedde3bc8dbba7831ff6c40ab3 Mon Sep 17 00:00:00 2001 From: Joey Jiao Date: Tue, 9 Jul 2024 10:15:44 +0800 Subject: pkg/cover: fix pc for core kernel we use offset to symbolize pc for module, while use absolute pc for core kernel. Fix by removing base address from module only. --- pkg/cover/backend/dwarf.go | 18 +++++++++++++++--- pkg/cover/backend/elf.go | 9 +++++---- pkg/cover/backend/modules.go | 4 ---- 3 files changed, 20 insertions(+), 11 deletions(-) diff --git a/pkg/cover/backend/dwarf.go b/pkg/cover/backend/dwarf.go index 23c141ea5..70ad06a63 100644 --- a/pkg/cover/backend/dwarf.go +++ b/pkg/cover/backend/dwarf.go @@ -390,7 +390,11 @@ func readTextRanges(debugInfo *dwarf.Data, module *vminfo.KernelModule, pcFix pc continue } } - ranges = append(ranges, pcRange{r[0] + module.Addr, r[1] + module.Addr, unit}) + if module.Name == "" { + ranges = append(ranges, pcRange{r[0], r[1], unit}) + } else { + ranges = append(ranges, pcRange{r[0] + module.Addr, r[1] + module.Addr, unit}) + } } r.SkipChildren() } @@ -427,7 +431,11 @@ func symbolizeModule(target *targets.Target, interner *symbolizer.Interner, objD var res symbolizerResult for pcs := range pcchan { for i, pc := range pcs { - pcs[i] = pc - mod.Addr + if mod.Name == "" { + pcs[i] = pc + } else { + pcs[i] = pc - mod.Addr + } } frames, err := symb.SymbolizeArray(mod.Path, pcs) if err != nil { @@ -456,9 +464,13 @@ func symbolizeModule(target *targets.Target, interner *symbolizer.Interner, objD } for _, frame := range res.frames { name, path := CleanPath(frame.File, objDir, srcDir, buildDir, splitBuildDelimiters) + pc := frame.PC + if mod.Name != "" { + pc = frame.PC + mod.Addr + } frames = append(frames, Frame{ Module: mod, - PC: frame.PC + mod.Addr, + PC: pc, Name: interner.Do(name), FuncName: frame.Func, Path: interner.Do(path), diff --git a/pkg/cover/backend/elf.go b/pkg/cover/backend/elf.go index 05e15ad45..5073c5603 100644 --- a/pkg/cover/backend/elf.go +++ b/pkg/cover/backend/elf.go @@ -74,9 +74,7 @@ func elfReadSymbols(module *vminfo.KernelModule, info *symbolInfo) ([]*Symbol, e if err != nil { return nil, fmt.Errorf("failed to read ELF symbols: %w", err) } - if module.Name == "" { - info.textAddr = text.Addr - } + info.textAddr = text.Addr var symbols []*Symbol for i, symb := range allSymbols { if symb.Info&0xf != uint8(elf.STT_FUNC) && symb.Info&0xf != uint8(elf.STT_NOTYPE) { @@ -85,7 +83,10 @@ func elfReadSymbols(module *vminfo.KernelModule, info *symbolInfo) ([]*Symbol, e } text := symb.Value >= text.Addr && symb.Value+symb.Size <= text.Addr+text.Size if text && symb.Size != 0 { - start := symb.Value + module.Addr + start := symb.Value + if module.Name != "" { + start += module.Addr + } symbols = append(symbols, &Symbol{ Module: module, ObjectUnit: ObjectUnit{ diff --git a/pkg/cover/backend/modules.go b/pkg/cover/backend/modules.go index 206b6986a..fbce68a49 100644 --- a/pkg/cover/backend/modules.go +++ b/pkg/cover/backend/modules.go @@ -170,10 +170,6 @@ func FixModules(localModules, modules []*vminfo.KernelModule, pcBase uint64) []* continue } addr := mod.Addr - kaslrOffset - if mod.Name == "" { - // mod.Addr for core kernel from target is _stext addr - addr = 0 - } modules1 = append(modules1, &vminfo.KernelModule{ Name: mod.Name, Size: size, -- cgit mrf-deployment