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 /pkg/cover/backend | |
| 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.
Diffstat (limited to 'pkg/cover/backend')
| -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, |
