aboutsummaryrefslogtreecommitdiffstats
path: root/pkg
diff options
context:
space:
mode:
authorJoey Jiao <quic_jiangenj@quicinc.com>2024-05-14 14:15:07 +0800
committerDmitry Vyukov <dvyukov@google.com>2024-07-03 08:00:41 +0000
commit4dfd9e9b413004160c9965fd0d829a88178e1ad6 (patch)
tree2566587171acfabd64bac3d4d20dec1b8db482b6 /pkg
parent1e708ca121f9ce1b476fbfe46a11372e4de36cb7 (diff)
all: fix larger module size in /proc/modules
Module size from /proc/modules is bigger than that from .text size in elf.
Diffstat (limited to 'pkg')
-rw-r--r--pkg/cover/backend/elf.go4
-rw-r--r--pkg/cover/backend/modules.go24
-rw-r--r--pkg/vminfo/linux.go6
3 files changed, 27 insertions, 7 deletions
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,