From bc258b506da8ceda014bf1d40d695d1890e9f785 Mon Sep 17 00:00:00 2001 From: Alexander Egorenkov Date: Tue, 2 Jun 2020 08:17:38 +0200 Subject: pkg: support compiler triple for 'nm' and 'addr2line' In preparation to support big-endian architectures. --- pkg/cover/report.go | 9 +++++---- pkg/cover/report_test.go | 3 ++- pkg/report/akaros.go | 2 +- pkg/report/bsd.go | 5 +++-- pkg/report/fuchsia.go | 2 +- pkg/report/linux.go | 5 +++-- pkg/symbolizer/nm.go | 17 +++++++++++------ pkg/symbolizer/nm_test.go | 3 ++- pkg/symbolizer/symbolizer.go | 12 +++++++++--- tools/syz-check/check.go | 3 ++- 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 } -- cgit mrf-deployment