From 021c11683ca28c7e01a2eca5ccbb9b8bd34e3bc1 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Wed, 22 Jan 2014 23:30:52 +0100 Subject: [PATCH] debug/plan9obj: implement parsing of Plan 9 a.out executables It implements parsing of the header and symbol table for both 32-bit and 64-bit Plan 9 binaries. The nm tool was updated to use this package. R=rsc, aram CC=golang-codereviews https://golang.org/cl/49970044 --- src/cmd/nm/nm.go | 4 + src/cmd/nm/plan9obj.go | 48 +++ src/pkg/debug/plan9obj/file.go | 346 ++++++++++++++++++ src/pkg/debug/plan9obj/file_test.go | 81 ++++ src/pkg/debug/plan9obj/plan9obj.go | 91 +++++ .../debug/plan9obj/testdata/386-plan9-exec | Bin 0 -> 37232 bytes .../debug/plan9obj/testdata/amd64-plan9-exec | Bin 0 -> 34279 bytes src/pkg/debug/plan9obj/testdata/hello.c | 8 + 8 files changed, 578 insertions(+) create mode 100644 src/cmd/nm/plan9obj.go create mode 100644 src/pkg/debug/plan9obj/file.go create mode 100644 src/pkg/debug/plan9obj/file_test.go create mode 100644 src/pkg/debug/plan9obj/plan9obj.go create mode 100755 src/pkg/debug/plan9obj/testdata/386-plan9-exec create mode 100755 src/pkg/debug/plan9obj/testdata/amd64-plan9-exec create mode 100644 src/pkg/debug/plan9obj/testdata/hello.c diff --git a/src/cmd/nm/nm.go b/src/cmd/nm/nm.go index fdf6ef673e..a4036184e4 100644 --- a/src/cmd/nm/nm.go +++ b/src/cmd/nm/nm.go @@ -105,6 +105,10 @@ var parsers = []struct { {[]byte("\xCE\xFA\xED\xFE"), machoSymbols}, {[]byte("\xCF\xFA\xED\xFE"), machoSymbols}, {[]byte("MZ"), peSymbols}, + {[]byte("\x00\x00\x01\xEB"), plan9Symbols}, // 386 + {[]byte("\x00\x00\x04\x07"), plan9Symbols}, // mips + {[]byte("\x00\x00\x06\x47"), plan9Symbols}, // arm + {[]byte("\x00\x00\x8A\x97"), plan9Symbols}, // amd64 } func nm(file string) { diff --git a/src/cmd/nm/plan9obj.go b/src/cmd/nm/plan9obj.go new file mode 100644 index 0000000000..006c66ebfd --- /dev/null +++ b/src/cmd/nm/plan9obj.go @@ -0,0 +1,48 @@ +// Copyright 2014 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Parsing of Plan 9 a.out executables. + +package main + +import ( + "debug/plan9obj" + "os" + "sort" +) + +func plan9Symbols(f *os.File) []Sym { + p, err := plan9obj.NewFile(f) + if err != nil { + errorf("parsing %s: %v", f.Name(), err) + return nil + } + + plan9Syms, err := p.Symbols() + if err != nil { + errorf("parsing %s: %v", f.Name(), err) + return nil + } + + // Build sorted list of addresses of all symbols. + // We infer the size of a symbol by looking at where the next symbol begins. + var addrs []uint64 + for _, s := range plan9Syms { + addrs = append(addrs, s.Value) + } + sort.Sort(uint64s(addrs)) + + var syms []Sym + + for _, s := range plan9Syms { + 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) { + sym.Size = int64(addrs[i] - s.Value) + } + syms = append(syms, sym) + } + + return syms +} diff --git a/src/pkg/debug/plan9obj/file.go b/src/pkg/debug/plan9obj/file.go new file mode 100644 index 0000000000..a4c95a92a5 --- /dev/null +++ b/src/pkg/debug/plan9obj/file.go @@ -0,0 +1,346 @@ +// Copyright 2014 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package plan9obj implements access to Plan 9 a.out object files. +package plan9obj + +import ( + "encoding/binary" + "errors" + "fmt" + "io" + "os" +) + +// A FileHeader represents an Plan 9 a.out file header. +type FileHeader struct { + Ptrsz int +} + +// A File represents an open Plan 9 a.out file. +type File struct { + FileHeader + Sections []*Section + closer io.Closer +} + +type SectionHeader struct { + Name string + Size uint32 + Offset uint32 +} + +// A Section represents a single section in an Plan 9 a.out file. +type Section struct { + SectionHeader + + // Embed ReaderAt for ReadAt method. + // Do not embed SectionReader directly + // to avoid having Read and Seek. + // If a client wants Read and Seek it must use + // Open() to avoid fighting over the seek offset + // with other clients. + io.ReaderAt + sr *io.SectionReader +} + +// Data reads and returns the contents of the Plan 9 a.out section. +func (s *Section) Data() ([]byte, error) { + dat := make([]byte, s.sr.Size()) + n, err := s.sr.ReadAt(dat, 0) + return dat[0:n], err +} + +// Open returns a new ReadSeeker reading the Plan 9 a.out section. +func (s *Section) Open() io.ReadSeeker { return io.NewSectionReader(s.sr, 0, 1<<63-1) } + +// A ProgHeader represents a single Plan 9 a.out program header. +type ProgHeader struct { + Magic uint32 + Text uint32 + Data uint32 + Bss uint32 + Syms uint32 + Entry uint64 + Spsz uint32 + Pcsz uint32 +} + +// A Prog represents the program header in an Plan 9 a.out binary. +type Prog struct { + ProgHeader + + // Embed ReaderAt for ReadAt method. + // Do not embed SectionReader directly + // to avoid having Read and Seek. + // If a client wants Read and Seek it must use + // Open() to avoid fighting over the seek offset + // with other clients. + io.ReaderAt + sr *io.SectionReader +} + +// Open returns a new ReadSeeker reading the Plan 9 a.out program body. +func (p *Prog) Open() io.ReadSeeker { return io.NewSectionReader(p.sr, 0, 1<<63-1) } + +// A Symbol represents an entry in a Plan 9 a.out symbol table section. +type Sym struct { + Value uint64 + Type rune + Name string +} + +/* + * Plan 9 a.out reader + */ + +type FormatError struct { + off int + msg string + val interface{} +} + +func (e *FormatError) Error() string { + msg := e.msg + if e.val != nil { + msg += fmt.Sprintf(" '%v'", e.val) + } + msg += fmt.Sprintf(" in record at byte %#x", e.off) + return msg +} + +// Open opens the named file using os.Open and prepares it for use as an Plan 9 a.out binary. +func Open(name string) (*File, error) { + f, err := os.Open(name) + if err != nil { + return nil, err + } + ff, err := NewFile(f) + if err != nil { + f.Close() + return nil, err + } + ff.closer = f + return ff, nil +} + +// Close closes the File. +// If the File was created using NewFile directly instead of Open, +// Close has no effect. +func (f *File) Close() error { + var err error + if f.closer != nil { + err = f.closer.Close() + f.closer = nil + } + return err +} + +func parseMagic(magic [4]byte) (*ExecTable, error) { + for _, e := range exectab { + if string(magic[:]) == e.Magic { + return &e, nil + } + } + return nil, &FormatError{0, "bad magic number", magic[:]} +} + +// NewFile creates a new File for accessing an Plan 9 binary in an underlying reader. +// The Plan 9 binary is expected to start at position 0 in the ReaderAt. +func NewFile(r io.ReaderAt) (*File, error) { + sr := io.NewSectionReader(r, 0, 1<<63-1) + // Read and decode Plan 9 magic + var magic [4]byte + if _, err := r.ReadAt(magic[:], 0); err != nil { + return nil, err + } + mp, err := parseMagic(magic) + if err != nil { + return nil, err + } + + f := &File{FileHeader{mp.Ptrsz}, nil, nil} + + ph := new(prog) + if err := binary.Read(sr, binary.BigEndian, ph); err != nil { + return nil, err + } + + p := new(Prog) + p.ProgHeader = ProgHeader{ + Magic: ph.Magic, + Text: ph.Text, + Data: ph.Data, + Bss: ph.Bss, + Syms: ph.Syms, + Entry: uint64(ph.Entry), + Spsz: ph.Spsz, + Pcsz: ph.Pcsz, + } + + if mp.Ptrsz == 8 { + if err := binary.Read(sr, binary.BigEndian, &p.Entry); err != nil { + return nil, err + } + } + + var sects = []struct { + name string + size uint32 + }{ + {"text", ph.Text}, + {"data", ph.Data}, + {"syms", ph.Syms}, + {"spsz", ph.Spsz}, + {"pcsz", ph.Pcsz}, + } + + f.Sections = make([]*Section, 5) + + off := mp.Hsize + + for i, sect := range sects { + s := new(Section) + s.SectionHeader = SectionHeader{ + Name: sect.name, + Size: sect.size, + Offset: off, + } + off += sect.size + s.sr = io.NewSectionReader(r, int64(s.SectionHeader.Offset), int64(s.SectionHeader.Size)) + s.ReaderAt = s.sr + f.Sections[i] = s + } + + return f, nil +} + +func walksymtab(data []byte, ptrsz int, fn func(sym) error) error { + var order binary.ByteOrder = binary.BigEndian + var s sym + p := data + for len(p) >= 4 { + // Symbol type, value. + if len(p) < ptrsz { + return &FormatError{len(data), "unexpected EOF", nil} + } + // fixed-width value + if ptrsz == 8 { + s.value = order.Uint64(p[0:8]) + p = p[8:] + } else { + s.value = uint64(order.Uint32(p[0:4])) + p = p[4:] + } + + var typ byte + typ = p[0] & 0x7F + s.typ = typ + p = p[1:] + + // Name. + var i int + var nnul int + for i = 0; i < len(p); i++ { + if p[i] == 0 { + nnul = 1 + break + } + } + switch typ { + case 'z', 'Z': + p = p[i+nnul:] + for i = 0; i+2 <= len(p); i += 2 { + if p[i] == 0 && p[i+1] == 0 { + nnul = 2 + break + } + } + } + if len(p) < i+nnul { + return &FormatError{len(data), "unexpected EOF", nil} + } + s.name = p[0:i] + i += nnul + p = p[i:] + + fn(s) + } + return nil +} + +// NewTable decodes the Go symbol table in data, +// returning an in-memory representation. +func newTable(symtab []byte, ptrsz int) ([]Sym, error) { + var n int + err := walksymtab(symtab, ptrsz, func(s sym) error { + n++ + return nil + }) + if err != nil { + return nil, err + } + + fname := make(map[uint16]string) + syms := make([]Sym, 0, n) + err = walksymtab(symtab, ptrsz, func(s sym) error { + n := len(syms) + syms = syms[0 : n+1] + ts := &syms[n] + ts.Type = rune(s.typ) + ts.Value = s.value + switch s.typ { + default: + ts.Name = string(s.name[:]) + case 'z', 'Z': + for i := 0; i < len(s.name); i += 2 { + eltIdx := binary.BigEndian.Uint16(s.name[i : i+2]) + elt, ok := fname[eltIdx] + if !ok { + return &FormatError{-1, "bad filename code", eltIdx} + } + if n := len(ts.Name); n > 0 && ts.Name[n-1] != '/' { + ts.Name += "/" + } + ts.Name += elt + } + } + switch s.typ { + case 'f': + fname[uint16(s.value)] = ts.Name + } + return nil + }) + if err != nil { + return nil, err + } + + return syms, nil +} + +// Symbols returns the symbol table for f. +func (f *File) Symbols() ([]Sym, error) { + symtabSection := f.Section("syms") + if symtabSection == nil { + return nil, errors.New("no symbol section") + } + + symtab, err := symtabSection.Data() + if err != nil { + return nil, errors.New("cannot load symbol section") + } + + return newTable(symtab, f.Ptrsz) +} + +// Section returns a section with the given name, or nil if no such +// section exists. +func (f *File) Section(name string) *Section { + for _, s := range f.Sections { + if s.Name == name { + return s + } + } + return nil +} diff --git a/src/pkg/debug/plan9obj/file_test.go b/src/pkg/debug/plan9obj/file_test.go new file mode 100644 index 0000000000..cc1db40929 --- /dev/null +++ b/src/pkg/debug/plan9obj/file_test.go @@ -0,0 +1,81 @@ +// Copyright 2014 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package plan9obj + +import ( + "reflect" + "testing" +) + +type fileTest struct { + file string + hdr FileHeader + sections []*SectionHeader +} + +var fileTests = []fileTest{ + { + "testdata/386-plan9-exec", + FileHeader{4}, + []*SectionHeader{ + {"text", 0x4c5f, 0x20}, + {"data", 0x94c, 0x4c7f}, + {"syms", 0x2c2b, 0x55cb}, + {"spsz", 0x0, 0x81f6}, + {"pcsz", 0xf7a, 0x81f6}, + }, + }, + { + "testdata/amd64-plan9-exec", + FileHeader{8}, + []*SectionHeader{ + {"text", 0x4213, 0x28}, + {"data", 0xa80, 0x423b}, + {"syms", 0x2c8c, 0x4cbb}, + {"spsz", 0x0, 0x7947}, + {"pcsz", 0xca0, 0x7947}, + }, + }, +} + +func TestOpen(t *testing.T) { + for i := range fileTests { + tt := &fileTests[i] + + f, err := Open(tt.file) + if err != nil { + t.Error(err) + continue + } + if !reflect.DeepEqual(f.FileHeader, tt.hdr) { + t.Errorf("open %s:\n\thave %#v\n\twant %#v\n", tt.file, f.FileHeader, tt.hdr) + continue + } + + for i, sh := range f.Sections { + if i >= len(tt.sections) { + break + } + have := &sh.SectionHeader + want := tt.sections[i] + if !reflect.DeepEqual(have, want) { + t.Errorf("open %s, section %d:\n\thave %#v\n\twant %#v\n", tt.file, i, have, want) + } + } + tn := len(tt.sections) + fn := len(f.Sections) + if tn != fn { + t.Errorf("open %s: len(Sections) = %d, want %d", tt.file, fn, tn) + } + } +} + +func TestOpenFailure(t *testing.T) { + filename := "file.go" // not a Plan 9 a.out file + _, err := Open(filename) // don't crash + if err == nil { + t.Errorf("open %s: succeeded unexpectedly", filename) + } +} diff --git a/src/pkg/debug/plan9obj/plan9obj.go b/src/pkg/debug/plan9obj/plan9obj.go new file mode 100644 index 0000000000..4e3b08f416 --- /dev/null +++ b/src/pkg/debug/plan9obj/plan9obj.go @@ -0,0 +1,91 @@ +// Copyright 2014 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +/* + * Plan 9 a.out constants and data structures + */ + +package plan9obj + +import ( + "bytes" + "encoding/binary" +) + +// Plan 9 Program header. +type prog struct { + Magic uint32 /* magic number */ + Text uint32 /* size of text segment */ + Data uint32 /* size of initialized data */ + Bss uint32 /* size of uninitialized data */ + Syms uint32 /* size of symbol table */ + Entry uint32 /* entry point */ + Spsz uint32 /* size of pc/sp offset table */ + Pcsz uint32 /* size of pc/line number table */ +} + +// Plan 9 symbol table entries. +type sym struct { + value uint64 + typ byte + name []byte +} + +const ( + hsize = 4 * 8 + _HDR_MAGIC = 0x00008000 /* header expansion */ +) + +func magic(f, b int) string { + buf := new(bytes.Buffer) + var i uint32 = uint32((f) | ((((4 * (b)) + 0) * (b)) + 7)) + binary.Write(buf, binary.BigEndian, i) + return string(buf.Bytes()) +} + +var ( + _A_MAGIC = magic(0, 8) /* 68020 (retired) */ + _I_MAGIC = magic(0, 11) /* intel 386 */ + _J_MAGIC = magic(0, 12) /* intel 960 (retired) */ + _K_MAGIC = magic(0, 13) /* sparc */ + _V_MAGIC = magic(0, 16) /* mips 3000 BE */ + _X_MAGIC = magic(0, 17) /* att dsp 3210 (retired) */ + _M_MAGIC = magic(0, 18) /* mips 4000 BE */ + _D_MAGIC = magic(0, 19) /* amd 29000 (retired) */ + _E_MAGIC = magic(0, 20) /* arm */ + _Q_MAGIC = magic(0, 21) /* powerpc */ + _N_MAGIC = magic(0, 22) /* mips 4000 LE */ + _L_MAGIC = magic(0, 23) /* dec alpha (retired) */ + _P_MAGIC = magic(0, 24) /* mips 3000 LE */ + _U_MAGIC = magic(0, 25) /* sparc64 (retired) */ + _S_MAGIC = magic(_HDR_MAGIC, 26) /* amd64 */ + _T_MAGIC = magic(_HDR_MAGIC, 27) /* powerpc64 */ + _R_MAGIC = magic(_HDR_MAGIC, 28) /* arm64 */ +) + +type ExecTable struct { + Magic string + Ptrsz int + Hsize uint32 +} + +var exectab = []ExecTable{ + {_A_MAGIC, 4, hsize}, + {_I_MAGIC, 4, hsize}, + {_J_MAGIC, 4, hsize}, + {_K_MAGIC, 4, hsize}, + {_V_MAGIC, 4, hsize}, + {_X_MAGIC, 4, hsize}, + {_M_MAGIC, 4, hsize}, + {_D_MAGIC, 4, hsize}, + {_E_MAGIC, 4, hsize}, + {_Q_MAGIC, 4, hsize}, + {_N_MAGIC, 4, hsize}, + {_L_MAGIC, 4, hsize}, + {_P_MAGIC, 4, hsize}, + {_U_MAGIC, 4, hsize}, + {_S_MAGIC, 8, hsize + 8}, + {_T_MAGIC, 8, hsize + 8}, + {_R_MAGIC, 8, hsize + 8}, +} diff --git a/src/pkg/debug/plan9obj/testdata/386-plan9-exec b/src/pkg/debug/plan9obj/testdata/386-plan9-exec new file mode 100755 index 0000000000000000000000000000000000000000..748e83f8e6acc310edc5081a27d989c63f0eb2de GIT binary patch literal 37232 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

Y)F+f*6M$||H$)p@hh?u|@d*UGPA5sgqKdoGS> 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 S=qDPNM3&i=eclVzoc|w+l~vRL literal 0 HcmV?d00001 diff --git a/src/pkg/debug/plan9obj/testdata/amd64-plan9-exec b/src/pkg/debug/plan9obj/testdata/amd64-plan9-exec new file mode 100755 index 0000000000000000000000000000000000000000..3e257dd8ffc00ca4a19d9552a10d782134387e8b GIT binary patch literal 34279 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 literal 0 HcmV?d00001 diff --git a/src/pkg/debug/plan9obj/testdata/hello.c b/src/pkg/debug/plan9obj/testdata/hello.c new file mode 100644 index 0000000000..c0d633e29f --- /dev/null +++ b/src/pkg/debug/plan9obj/testdata/hello.c @@ -0,0 +1,8 @@ +#include +#include + +void +main(void) +{ + print("hello, world\n"); +} -- 2.48.1