aboutsummaryrefslogtreecommitdiffstats
path: root/pkg
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
parent1ecfa2d8506efdae0483eedc0b425db8537b6e80 (diff)
all: get pcBase from elf first which can be used for kaslr offset calc
Diffstat (limited to 'pkg')
-rw-r--r--pkg/cover/backend/backend.go8
-rw-r--r--pkg/cover/backend/elf.go21
-rw-r--r--pkg/cover/report.go4
-rw-r--r--pkg/rpcserver/rpcserver.go6
4 files changed, 39 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")
+}
diff --git a/pkg/cover/report.go b/pkg/cover/report.go
index 4a557c252..b41a96356 100644
--- a/pkg/cover/report.go
+++ b/pkg/cover/report.go
@@ -30,6 +30,10 @@ type Prog struct {
type KernelModule = backend.KernelModule
+func GetPCBase(cfg *mgrconfig.Config) (uint64, error) {
+ return backend.GetPCBase(cfg)
+}
+
func MakeReportGenerator(cfg *mgrconfig.Config, subsystem []mgrconfig.Subsystem,
modules []*KernelModule, rawCover bool) (*ReportGenerator, error) {
impl, err := backend.Make(cfg.SysTarget, cfg.Type, cfg.KernelObj,
diff --git a/pkg/rpcserver/rpcserver.go b/pkg/rpcserver/rpcserver.go
index 40ca9a316..0cb1e05a9 100644
--- a/pkg/rpcserver/rpcserver.go
+++ b/pkg/rpcserver/rpcserver.go
@@ -41,6 +41,7 @@ type Config struct {
PrintMachineCheck bool
Procs int
Slowdown int
+ PCBase uint64
}
type Manager interface {
@@ -81,6 +82,10 @@ type Server struct {
}
func New(cfg *mgrconfig.Config, mgr Manager, debug bool) (*Server, error) {
+ pcBase, err := cover.GetPCBase(cfg)
+ if err != nil {
+ return nil, err
+ }
sandbox, err := flatrpc.SandboxToFlags(cfg.Sandbox)
if err != nil {
return nil, err
@@ -109,6 +114,7 @@ func New(cfg *mgrconfig.Config, mgr Manager, debug bool) (*Server, error) {
PrintMachineCheck: true,
Procs: cfg.Procs,
Slowdown: cfg.Timeouts.Slowdown,
+ PCBase: pcBase,
}, mgr)
}