aboutsummaryrefslogtreecommitdiffstats
path: root/pkg/cover
diff options
context:
space:
mode:
authorJoey Jiao <quic_jiangenj@quicinc.com>2024-07-09 10:15:44 +0800
committerDmitry Vyukov <dvyukov@google.com>2024-08-05 07:58:22 +0000
commitd945c1fd68fda7bedde3bc8dbba7831ff6c40ab3 (patch)
tree8de628bb8b334346a8abc592310eb57a1dbe6065 /pkg/cover
parent1786a2a82636054a2b049857ef8b011c7e539fb6 (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')
-rw-r--r--pkg/cover/backend/dwarf.go18
-rw-r--r--pkg/cover/backend/elf.go9
-rw-r--r--pkg/cover/backend/modules.go4
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,