aboutsummaryrefslogtreecommitdiffstats
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
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.
-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,