aboutsummaryrefslogtreecommitdiffstats
path: root/pkg/cover/backend
diff options
context:
space:
mode:
authorJoey Jiao <quic_jiangenj@quicinc.com>2024-07-01 09:58:31 +0800
committerDmitry Vyukov <dvyukov@google.com>2024-07-03 08:00:41 +0000
commit78ffefc540a2c39840f46a92acb1f1f8cb747edb (patch)
tree2db54a20cf0200a71e4db3e57de4eb45efcc9f8c /pkg/cover/backend
parent1ecfa2d8506efdae0483eedc0b425db8537b6e80 (diff)
all: get pcBase from elf first which can be used for kaslr offset calc
Diffstat (limited to 'pkg/cover/backend')
-rw-r--r--pkg/cover/backend/backend.go8
-rw-r--r--pkg/cover/backend/elf.go21
2 files changed, 29 insertions, 0 deletions
diff --git a/pkg/cover/backend/backend.go b/pkg/cover/backend/backend.go
index bba483fa8..49f2f9508 100644
--- a/pkg/cover/backend/backend.go
+++ b/pkg/cover/backend/backend.go
@@ -6,6 +6,7 @@ package backend
import (
"fmt"
+ "github.com/google/syzkaller/pkg/mgrconfig"
"github.com/google/syzkaller/sys/targets"
)
@@ -79,3 +80,10 @@ func Make(target *targets.Target, vm, objDir, srcDir, buildDir string, splitBuil
}
return makeELF(target, objDir, srcDir, buildDir, delimiters, moduleObj, modules)
}
+
+func GetPCBase(cfg *mgrconfig.Config) (uint64, error) {
+ if cfg.Target.OS == targets.Linux {
+ return getPCBase(cfg)
+ }
+ return 0, nil
+}
diff --git a/pkg/cover/backend/elf.go b/pkg/cover/backend/elf.go
index f4f288314..25536c170 100644
--- a/pkg/cover/backend/elf.go
+++ b/pkg/cover/backend/elf.go
@@ -8,9 +8,11 @@ import (
"encoding/binary"
"fmt"
"io"
+ "path/filepath"
"strings"
"github.com/google/syzkaller/pkg/log"
+ "github.com/google/syzkaller/pkg/mgrconfig"
"github.com/google/syzkaller/sys/targets"
)
@@ -217,3 +219,22 @@ func elfGetCompilerVersion(path string) string {
}
return string(data[:])
}
+
+func getPCBase(cfg *mgrconfig.Config) (uint64, error) {
+ bin := filepath.Join(cfg.KernelObj, cfg.SysTarget.KernelObject)
+ file, err := elf.Open(bin)
+ if err != nil {
+ return 0, err
+ }
+ defer file.Close()
+ allSymbols, err := file.Symbols()
+ if err != nil {
+ return 0, err
+ }
+ for _, sym := range allSymbols {
+ if sym.Name == "_stext" {
+ return sym.Value, nil
+ }
+ }
+ return 0, fmt.Errorf("no _stext symbol")
+}