From ef03809335e5650f1c906b95a755264c9d3d25e0 Mon Sep 17 00:00:00 2001 From: Anthony Martin Date: Wed, 21 May 2014 23:24:38 +0200 Subject: [PATCH] cmd/objdump: fix dissasembly of Plan 9 object files Ignore symbols that aren't text, data, or bss since they cause problems when dissassembling instructions with small immediate values. Before: build.go:142 0x10ee 83ec50 SUBL $text/template/parse.autotmp_1293(SB), SP After: build.go:142 0x10ee 83ec50 SUBL $0x50, SP Fixes #7947. LGTM=rsc R=rsc, 0intro CC=golang-codereviews https://golang.org/cl/93520045 --- src/cmd/objdump/objdump_test.go | 4 ---- src/cmd/objdump/plan9obj.go | 15 +++++++++++++++ 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/cmd/objdump/objdump_test.go b/src/cmd/objdump/objdump_test.go index 354e5d407acfc..2c61c484cb1d7 100644 --- a/src/cmd/objdump/objdump_test.go +++ b/src/cmd/objdump/objdump_test.go @@ -155,10 +155,6 @@ var armNeed = []string{ // can handle that one. func TestDisasm(t *testing.T) { - if runtime.GOOS == "plan9" { - t.Skip("skipping test; see http://golang.org/issue/7947") - } - tmp, exe := buildObjdump(t) defer os.RemoveAll(tmp) diff --git a/src/cmd/objdump/plan9obj.go b/src/cmd/objdump/plan9obj.go index 5434f8e4403fe..34462f31c5f28 100644 --- a/src/cmd/objdump/plan9obj.go +++ b/src/cmd/objdump/plan9obj.go @@ -12,6 +12,15 @@ import ( "sort" ) +var validSymType = map[rune]bool{ + 'T': true, + 't': true, + 'D': true, + 'd': true, + 'B': true, + 'b': true, +} + func plan9Symbols(f *os.File) (syms []Sym, goarch string) { p, err := plan9obj.NewFile(f) if err != nil { @@ -31,11 +40,17 @@ func plan9Symbols(f *os.File) (syms []Sym, goarch string) { // We infer the size of a symbol by looking at where the next symbol begins. var addrs []uint64 for _, s := range plan9Syms { + if !validSymType[s.Type] { + continue + } addrs = append(addrs, s.Value) } sort.Sort(uint64s(addrs)) for _, s := range plan9Syms { + if !validSymType[s.Type] { + continue + } sym := Sym{Addr: s.Value, Name: s.Name, Code: rune(s.Type)} i := sort.Search(len(addrs), func(x int) bool { return addrs[x] > s.Value }) if i < len(addrs) {