From 703ca45bb7ef43679d6bfc489a86baa74cf518cc Mon Sep 17 00:00:00 2001 From: Joey Jiao Date: Tue, 14 May 2024 14:08:15 +0800 Subject: pkg/vminfo: parse linux core kernel to get Addr and .text Size --- pkg/vminfo/linux.go | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) (limited to 'pkg') 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 { -- cgit mrf-deployment