diff options
| author | Joey Jiao <quic_jiangenj@quicinc.com> | 2024-07-09 10:15:44 +0800 |
|---|---|---|
| committer | Dmitry Vyukov <dvyukov@google.com> | 2024-08-05 07:58:22 +0000 |
| commit | d945c1fd68fda7bedde3bc8dbba7831ff6c40ab3 (patch) | |
| tree | 8de628bb8b334346a8abc592310eb57a1dbe6065 | |
| parent | 1786a2a82636054a2b049857ef8b011c7e539fb6 (diff) | |
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.
| -rw-r--r-- | pkg/cover/backend/dwarf.go | 18 | ||||
| -rw-r--r-- | pkg/cover/backend/elf.go | 9 | ||||
| -rw-r--r-- | 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, |
