From 4dfd9e9b413004160c9965fd0d829a88178e1ad6 Mon Sep 17 00:00:00 2001 From: Joey Jiao Date: Tue, 14 May 2024 14:15:07 +0800 Subject: all: fix larger module size in /proc/modules Module size from /proc/modules is bigger than that from .text size in elf. --- pkg/cover/backend/elf.go | 4 ++-- pkg/cover/backend/modules.go | 24 ++++++++++++++++++++---- pkg/vminfo/linux.go | 6 +++++- 3 files changed, 27 insertions(+), 7 deletions(-) (limited to 'pkg') diff --git a/pkg/cover/backend/elf.go b/pkg/cover/backend/elf.go index 2126292b4..e81d693ce 100644 --- a/pkg/cover/backend/elf.go +++ b/pkg/cover/backend/elf.go @@ -220,7 +220,7 @@ func elfGetCompilerVersion(path string) string { return string(data[:]) } -func elfReadTextSecRange(module KernelModule) (*SecRange, error) { +func elfReadTextSecRange(module *KernelModule) (*SecRange, error) { text, err := elfReadTextSec(module) if err != nil { return nil, err @@ -232,7 +232,7 @@ func elfReadTextSecRange(module KernelModule) (*SecRange, error) { return r, nil } -func elfReadTextSec(module KernelModule) (*elf.Section, error) { +func elfReadTextSec(module *KernelModule) (*elf.Section, error) { file, err := elf.Open(module.Path) if err != nil { return nil, err diff --git a/pkg/cover/backend/modules.go b/pkg/cover/backend/modules.go index b91ca8025..249b87d0d 100644 --- a/pkg/cover/backend/modules.go +++ b/pkg/cover/backend/modules.go @@ -25,9 +25,19 @@ type KernelModule struct { func discoverModules(target *targets.Target, objDir string, moduleObj []string, hostModules []*KernelModule) ( []*KernelModule, error) { + module := &KernelModule{ + Path: filepath.Join(objDir, target.KernelObject), + } + textRange, err := elfReadTextSecRange(module) + if err != nil { + return nil, err + } modules := []*KernelModule{ // A dummy module representing the kernel itself. - {Path: filepath.Join(objDir, target.KernelObject)}, + { + Path: module.Path, + Size: textRange.End - textRange.Start, + }, } if target.OS == targets.Linux { modules1, err := discoverModulesLinux(append([]string{objDir}, moduleObj...), @@ -54,12 +64,18 @@ func discoverModulesLinux(dirs []string, hostModules []*KernelModule) ([]*Kernel log.Logf(0, "failed to discover module %v", mod.Name) continue } - log.Logf(0, "module %v -> %v", mod.Name, path) - modules = append(modules, &KernelModule{ + log.Logf(2, "module %v -> %v", mod.Name, path) + module := &KernelModule{ Name: mod.Name, Addr: mod.Addr, Path: path, - }) + } + textRange, err := elfReadTextSecRange(module) + if err != nil { + return nil, err + } + module.Size = textRange.End - textRange.Start + modules = append(modules, module) } return modules, nil } diff --git a/pkg/vminfo/linux.go b/pkg/vminfo/linux.go index c8e81dd01..4f180e9ff 100644 --- a/pkg/vminfo/linux.go +++ b/pkg/vminfo/linux.go @@ -68,6 +68,10 @@ func (linux) parseModules(files filesystem) ([]*cover.KernelModule, error) { modules = append(modules, &cover.KernelModule{ Name: name, Addr: textAddr, + // The size is wrong as there is overlap in /proc/modules + // ex. module1['Addr'] + module1['Size'] > module2['Addr'] + // runtime kernel doesn't export .text section size to /sys/module/*/sections/.text + // so we need to read it from elf Size: modSize - offset, }) } @@ -75,7 +79,7 @@ func (linux) parseModules(files filesystem) ([]*cover.KernelModule, error) { if err != nil { return nil, err } - modules = append(modules, cover.KernelModule{ + modules = append(modules, &cover.KernelModule{ Name: "", Addr: _stext, Size: _etext - _stext, -- cgit mrf-deployment