aboutsummaryrefslogtreecommitdiffstats
path: root/pkg/symbolizer
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 /pkg/symbolizer
parentb1b22865fc4567c79793620400109f2220335f84 (diff)
pkg: support compiler triple for 'nm' and 'addr2line'
In preparation to support big-endian architectures.
Diffstat (limited to 'pkg/symbolizer')
-rw-r--r--pkg/symbolizer/nm.go17
-rw-r--r--pkg/symbolizer/nm_test.go3
-rw-r--r--pkg/symbolizer/symbolizer.go12
3 files changed, 22 insertions, 10 deletions
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