aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexander Egorenkov <Alexander.Egorenkov@ibm.com>2020-06-02 08:17:38 +0200
committerDmitry Vyukov <dvyukov@google.com>2020-06-18 19:31:40 +0200
commitbc258b506da8ceda014bf1d40d695d1890e9f785 (patch)
tree8ad9a8a035b9a14ac9d35840050e589428a440b8
parentb1b22865fc4567c79793620400109f2220335f84 (diff)
pkg: support compiler triple for 'nm' and 'addr2line'
In preparation to support big-endian architectures.
-rw-r--r--pkg/cover/report.go9
-rw-r--r--pkg/cover/report_test.go3
-rw-r--r--pkg/report/akaros.go2
-rw-r--r--pkg/report/bsd.go5
-rw-r--r--pkg/report/fuchsia.go2
-rw-r--r--pkg/report/linux.go5
-rw-r--r--pkg/symbolizer/nm.go17
-rw-r--r--pkg/symbolizer/nm_test.go3
-rw-r--r--pkg/symbolizer/symbolizer.go12
-rw-r--r--tools/syz-check/check.go3
10 files changed, 39 insertions, 22 deletions
diff --git a/pkg/cover/report.go b/pkg/cover/report.go
index 754649fda..57e8ed905 100644
--- a/pkg/cover/report.go
+++ b/pkg/cover/report.go
@@ -52,7 +52,7 @@ func MakeReportGenerator(target *targets.Target, kernelObject, srcDir, buildDir
errc := make(chan error)
go func() {
var err error
- rg.symbols, err = readSymbols(kernelObject)
+ rg.symbols, err = readSymbols(target, kernelObject)
errc <- err
}()
frames, err := objdumpAndSymbolize(target, kernelObject)
@@ -317,8 +317,9 @@ func (rg *ReportGenerator) findSymbol(pc uint64) uint64 {
return s.start
}
-func readSymbols(obj string) ([]symbol, error) {
- raw, err := symbolizer.ReadTextSymbols(obj)
+func readSymbols(target *targets.Target, obj string) ([]symbol, error) {
+ symb := symbolizer.NewSymbolizer(target)
+ raw, err := symb.ReadTextSymbols(obj)
if err != nil {
return nil, fmt.Errorf("failed to run nm on %v: %v", obj, err)
}
@@ -344,7 +345,7 @@ func objdumpAndSymbolize(target *targets.Target, obj string) ([]symbolizer.Frame
pcchan := make(chan []uint64, 10)
var frames []symbolizer.Frame
go func() {
- symb := symbolizer.NewSymbolizer()
+ symb := symbolizer.NewSymbolizer(target)
defer symb.Close()
var err error
for pcs := range pcchan {
diff --git a/pkg/cover/report_test.go b/pkg/cover/report_test.go
index fb103dd51..3ce76ed3e 100644
--- a/pkg/cover/report_test.go
+++ b/pkg/cover/report_test.go
@@ -139,7 +139,8 @@ int main() {}
return nil, err
}
if test.Result == "" {
- text, err := symbolizer.ReadTextSymbols(bin)
+ symb := symbolizer.NewSymbolizer(target)
+ text, err := symb.ReadTextSymbols(bin)
if err != nil {
t.Fatal(err)
}
diff --git a/pkg/report/akaros.go b/pkg/report/akaros.go
index 8a328fce9..29c950cc4 100644
--- a/pkg/report/akaros.go
+++ b/pkg/report/akaros.go
@@ -49,7 +49,7 @@ func (ctx *akaros) Symbolize(rep *Report) error {
if ctx.objfile == "" {
return nil
}
- symb := symbolizer.NewSymbolizer()
+ symb := symbolizer.NewSymbolizer(ctx.config.target)
defer symb.Close()
var symbolized []byte
s := bufio.NewScanner(bytes.NewReader(rep.Report))
diff --git a/pkg/report/bsd.go b/pkg/report/bsd.go
index 369ffcab9..d79c36b6c 100644
--- a/pkg/report/bsd.go
+++ b/pkg/report/bsd.go
@@ -29,7 +29,8 @@ func ctorBSD(cfg *config, oopses []*oops, symbolizeRes []*regexp.Regexp) (Report
if cfg.kernelObj != "" {
kernelObject = filepath.Join(cfg.kernelObj, cfg.target.KernelObject)
var err error
- symbols, err = symbolizer.ReadTextSymbols(kernelObject)
+ symb := symbolizer.NewSymbolizer(cfg.target)
+ symbols, err = symb.ReadTextSymbols(kernelObject)
if err != nil {
return nil, err
}
@@ -63,7 +64,7 @@ func (ctx *bsd) Parse(output []byte) *Report {
}
func (ctx *bsd) Symbolize(rep *Report) error {
- symb := symbolizer.NewSymbolizer()
+ symb := symbolizer.NewSymbolizer(ctx.config.target)
defer symb.Close()
var symbolized []byte
s := bufio.NewScanner(bytes.NewReader(rep.Report))
diff --git a/pkg/report/fuchsia.go b/pkg/report/fuchsia.go
index df64055e4..bed4d8952 100644
--- a/pkg/report/fuchsia.go
+++ b/pkg/report/fuchsia.go
@@ -86,7 +86,7 @@ func (ctx *fuchsia) shortenReport(report []byte) []byte {
}
func (ctx *fuchsia) symbolize(output []byte) []byte {
- symb := symbolizer.NewSymbolizer()
+ symb := symbolizer.NewSymbolizer(ctx.config.target)
defer symb.Close()
out := new(bytes.Buffer)
for s := bufio.NewScanner(bytes.NewReader(output)); s.Scan(); {
diff --git a/pkg/report/linux.go b/pkg/report/linux.go
index d5dac95f5..03d6b72ed 100644
--- a/pkg/report/linux.go
+++ b/pkg/report/linux.go
@@ -38,7 +38,8 @@ func ctorLinux(cfg *config) (Reporter, []string, error) {
if cfg.kernelObj != "" {
vmlinux = filepath.Join(cfg.kernelObj, cfg.target.KernelObject)
var err error
- symbols, err = symbolizer.ReadTextSymbols(vmlinux)
+ symb := symbolizer.NewSymbolizer(cfg.target)
+ symbols, err = symb.ReadTextSymbols(vmlinux)
if err != nil {
return nil, nil, err
}
@@ -356,7 +357,7 @@ func (ctx *linux) Symbolize(rep *Report) error {
}
func (ctx *linux) symbolize(rep *Report) error {
- symb := symbolizer.NewSymbolizer()
+ symb := symbolizer.NewSymbolizer(ctx.config.target)
defer symb.Close()
var symbolized []byte
s := bufio.NewScanner(bytes.NewReader(rep.Report))
diff --git a/pkg/symbolizer/nm.go b/pkg/symbolizer/nm.go
index 09baf8119..626d08fd8 100644
--- a/pkg/symbolizer/nm.go
+++ b/pkg/symbolizer/nm.go
@@ -9,6 +9,7 @@ import (
"strconv"
"github.com/google/syzkaller/pkg/osutil"
+ "github.com/google/syzkaller/sys/targets"
)
type Symbol struct {
@@ -17,21 +18,25 @@ type Symbol struct {
}
// ReadTextSymbols returns list of text symbols in the binary bin.
-func ReadTextSymbols(bin string) (map[string][]Symbol, error) {
- return read(bin, "t", "T")
+func (s *Symbolizer) ReadTextSymbols(bin string) (map[string][]Symbol, error) {
+ return read(s.target, bin, "t", "T")
}
// ReadRodataSymbols returns list of rodata symbols in the binary bin.
-func ReadRodataSymbols(bin string) (map[string][]Symbol, error) {
- return read(bin, "r", "R")
+func (s *Symbolizer) ReadRodataSymbols(bin string) (map[string][]Symbol, error) {
+ return read(s.target, bin, "r", "R")
}
-func read(bin string, types ...string) (map[string][]Symbol, error) {
+func read(target *targets.Target, bin string, types ...string) (map[string][]Symbol, error) {
if len(types) != 2 || len(types[0]) != 1 || len(types[1]) != 1 {
// We assume these things below.
panic("bad types")
}
- cmd := osutil.Command("nm", "-Ptx", bin)
+ nm := "nm"
+ if target != nil && target.Triple != "" {
+ nm = target.Triple + "-" + nm
+ }
+ cmd := osutil.Command(nm, "-Ptx", bin)
stdout, err := cmd.StdoutPipe()
if err != nil {
return nil, err
diff --git a/pkg/symbolizer/nm_test.go b/pkg/symbolizer/nm_test.go
index 6061608ec..8c6e5ba25 100644
--- a/pkg/symbolizer/nm_test.go
+++ b/pkg/symbolizer/nm_test.go
@@ -8,7 +8,8 @@ import (
)
func TestSymbols(t *testing.T) {
- symbols, err := ReadTextSymbols("testdata/nm.test.out")
+ symb := NewSymbolizer(nil)
+ symbols, err := symb.ReadTextSymbols("testdata/nm.test.out")
if err != nil {
t.Fatalf("failed to read symbols: %v", err)
}
diff --git a/pkg/symbolizer/symbolizer.go b/pkg/symbolizer/symbolizer.go
index f1f8478e9..96b62fb95 100644
--- a/pkg/symbolizer/symbolizer.go
+++ b/pkg/symbolizer/symbolizer.go
@@ -14,9 +14,11 @@ import (
"strings"
"github.com/google/syzkaller/pkg/osutil"
+ "github.com/google/syzkaller/sys/targets"
)
type Symbolizer struct {
+ target *targets.Target
subprocs map[string]*subprocess
}
@@ -36,8 +38,8 @@ type subprocess struct {
scanner *bufio.Scanner
}
-func NewSymbolizer() *Symbolizer {
- return &Symbolizer{}
+func NewSymbolizer(target *targets.Target) *Symbolizer {
+ return &Symbolizer{target: target}
}
func (s *Symbolizer) Symbolize(bin string, pc uint64) ([]Frame, error) {
@@ -65,7 +67,11 @@ func (s *Symbolizer) getSubprocess(bin string) (*subprocess, error) {
if sub := s.subprocs[bin]; sub != nil {
return sub, nil
}
- cmd := osutil.Command("addr2line", "-afi", "-e", bin)
+ addr2line := "addr2line"
+ if s.target.Triple != "" {
+ addr2line = s.target.Triple + "-" + addr2line
+ }
+ cmd := osutil.Command(addr2line, "-afi", "-e", bin)
stdin, err := cmd.StdinPipe()
if err != nil {
return nil, err
diff --git a/tools/syz-check/check.go b/tools/syz-check/check.go
index a648aa54f..3a2726822 100644
--- a/tools/syz-check/check.go
+++ b/tools/syz-check/check.go
@@ -372,7 +372,8 @@ func checkNetlink(OS, arch, obj string, structTypes []prog.Type,
if rodata == nil {
return nil, fmt.Errorf("object file %v does not contain .rodata section", obj)
}
- symbols, err := symbolizer.ReadRodataSymbols(obj)
+ symb := symbolizer.NewSymbolizer(targets.Get(OS, arch))
+ symbols, err := symb.ReadRodataSymbols(obj)
if err != nil {
return nil, err
}