aboutsummaryrefslogtreecommitdiffstats
path: root/pkg/vminfo
diff options
context:
space:
mode:
authorJoey Jiao <quic_jiangenj@quicinc.com>2024-05-14 14:08:15 +0800
committerDmitry Vyukov <dvyukov@google.com>2024-07-03 08:00:41 +0000
commit703ca45bb7ef43679d6bfc489a86baa74cf518cc (patch)
tree3e3cab05ef854ab3044d8b8ed960de6f22aa7265 /pkg/vminfo
parent78ffefc540a2c39840f46a92acb1f1f8cb747edb (diff)
pkg/vminfo: parse linux core kernel to get Addr and .text Size
Diffstat (limited to 'pkg/vminfo')
-rw-r--r--pkg/vminfo/linux.go36
1 files changed, 36 insertions, 0 deletions
diff --git a/pkg/vminfo/linux.go b/pkg/vminfo/linux.go
index 96f6bf47c..c8e81dd01 100644
--- a/pkg/vminfo/linux.go
+++ b/pkg/vminfo/linux.go
@@ -10,6 +10,7 @@ import (
"io"
"path"
"regexp"
+ "sort"
"strconv"
"strings"
@@ -70,6 +71,18 @@ func (linux) parseModules(files filesystem) ([]*cover.KernelModule, error) {
Size: modSize - offset,
})
}
+ _stext, _etext, err := linuxParseCoreKernel(files)
+ if err != nil {
+ return nil, err
+ }
+ modules = append(modules, cover.KernelModule{
+ Name: "",
+ Addr: _stext,
+ Size: _etext - _stext,
+ })
+ sort.Slice(modules, func(i, j int) bool {
+ return modules[i].Addr < modules[j].Addr
+ })
return modules, nil
}
@@ -86,6 +99,29 @@ func linuxModuleTextAddr(files filesystem, module string) (uint64, error) {
return addr, nil
}
+func linuxParseCoreKernel(files filesystem) (uint64, uint64, error) {
+ _Text, _ := files.ReadFile("/proc/kallsyms")
+ re := regexp.MustCompile(`([a-fA-F0-9]+) T _stext\n`)
+ m := re.FindSubmatch(_Text)
+ if m == nil {
+ return 0, 0, fmt.Errorf("failed to get _stext symbol")
+ }
+ _stext, err := strconv.ParseUint("0x"+string(m[1]), 0, 64)
+ if err != nil {
+ return 0, 0, fmt.Errorf("address parsing error in /proc/kallsyms for _stext: %w", err)
+ }
+ re = regexp.MustCompile(`([a-fA-F0-9]+) [DT] _etext\n`)
+ m = re.FindSubmatch(_Text)
+ if m == nil {
+ return 0, 0, fmt.Errorf("failed to get _etext symbol")
+ }
+ _etext, err := strconv.ParseUint("0x"+string(m[1]), 0, 64)
+ if err != nil {
+ return 0, 0, fmt.Errorf("address parsing error in /proc/kallsyms for _etext: %w", err)
+ }
+ return _stext, _etext, nil
+}
+
func linuxReadCPUInfo(files filesystem, w io.Writer) (string, error) {
data, err := files.ReadFile("/proc/cpuinfo")
if err != nil {