aboutsummaryrefslogtreecommitdiffstats
path: root/pkg/build/linux.go
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2022-06-23 16:34:02 +0200
committerAleksandr Nogikh <wp32pw@gmail.com>2022-06-24 12:52:57 +0200
commit7d5020531b93ad5bdf442b60c12806254d1a9e4a (patch)
tree685480f26788d50df5054a10aedd31f785a3708b /pkg/build/linux.go
parentb5477f49462d2d6885f4756ef27624b244da77c6 (diff)
pkg/build: support debug tracing
Add ability to trace build process and save debug artefacts. Add tracing of ELF signature calculation. Useful for debugging of #2297.
Diffstat (limited to 'pkg/build/linux.go')
-rw-r--r--pkg/build/linux.go18
1 files changed, 14 insertions, 4 deletions
diff --git a/pkg/build/linux.go b/pkg/build/linux.go
index 775991664..be9a38377 100644
--- a/pkg/build/linux.go
+++ b/pkg/build/linux.go
@@ -10,7 +10,6 @@ import (
"debug/elf"
"encoding/hex"
"fmt"
- "io"
"io/ioutil"
"os"
"path"
@@ -19,6 +18,7 @@ import (
"runtime"
"time"
+ "github.com/google/syzkaller/pkg/debugtracer"
"github.com/google/syzkaller/pkg/osutil"
"github.com/google/syzkaller/sys/targets"
)
@@ -58,7 +58,8 @@ func (linux linux) build(params Params) (ImageDetails, error) {
} else if err := embedLinuxKernel(params, kernelPath); err != nil {
return details, err
}
- details.Signature, err = elfBinarySignature(filepath.Join(params.OutputDir, "obj", "vmlinux"))
+ vmlinux := filepath.Join(params.OutputDir, "obj", "vmlinux")
+ details.Signature, err = elfBinarySignature(vmlinux, params.Tracer)
return details, err
}
@@ -243,7 +244,7 @@ func queryLinuxCompiler(kernelDir string) (string, error) {
// elfBinarySignature calculates signature of an elf binary aiming at runtime behavior
// (text/data, debug info is ignored).
-func elfBinarySignature(bin string) (string, error) {
+func elfBinarySignature(bin string, tracer debugtracer.DebugTracer) (string, error) {
f, err := os.Open(bin)
if err != nil {
return "", fmt.Errorf("failed to open binary for signature: %v", err)
@@ -262,7 +263,16 @@ func elfBinarySignature(bin string) (string, error) {
if sec.Flags&elf.SHF_ALLOC == 0 || sec.Type == elf.SHT_NOBITS || sec.Type == elf.SHT_NOTE {
continue
}
- io.Copy(hasher, sec.Open())
+ data, err := sec.Data()
+ if err != nil {
+ return "", fmt.Errorf("failed to read ELF section %v: %v", sec.Name, err)
+ }
+ hasher1 := sha256.New()
+ hasher1.Write(data)
+ hash := hasher1.Sum(nil)
+ hasher.Write(hash)
+ tracer.Log("section %v: size %v signature %v", sec.Name, len(data), hex.EncodeToString(hash[:8]))
+ tracer.SaveFile(sec.Name, data)
}
return hex.EncodeToString(hasher.Sum(nil)), nil
}