From 0a2083edd7a31f2248da1cdaca6e39466a9fb05b Mon Sep 17 00:00:00 2001 From: =?utf8?q?Aram=20H=C4=83v=C4=83rneanu?= Date: Wed, 9 Jul 2014 12:33:13 +0200 Subject: [PATCH] debug/plan9obj, cmd/addr2line: on Plan 9 use a.out header size instead of abusing text symbol cmd/addr2line needs to know the virtual address of the start of the text segment (load address plus header size). For this, it used the text symbol added by the linker. This is wrong on amd64. Header size is 40 bytes, not 32 like on 386 and arm. Function alignment is 16 bytes causing text to be at 0x200030. debug/plan9obj now exports both the load address and the header size; cmd/addr2line uses this new information and doesn't rely on text anymore. LGTM=0intro R=0intro, gobot, ality CC=ality, golang-codereviews, jas, mischief https://golang.org/cl/106460044 --- src/cmd/addr2line/main.go | 6 +----- src/pkg/debug/plan9obj/file.go | 27 +++++++++++++++------------ 2 files changed, 16 insertions(+), 17 deletions(-) diff --git a/src/cmd/addr2line/main.go b/src/cmd/addr2line/main.go index b94ba12efd..c6e4563db7 100644 --- a/src/cmd/addr2line/main.go +++ b/src/cmd/addr2line/main.go @@ -237,10 +237,6 @@ func loadPlan9Table(f *plan9obj.File, sname, ename string) ([]byte, error) { if err != nil { return nil, err } - text, err := findPlan9Symbol(f, "text") - if err != nil { - return nil, err - } sect := f.Section("text") if sect == nil { return nil, err @@ -249,5 +245,5 @@ func loadPlan9Table(f *plan9obj.File, sname, ename string) ([]byte, error) { if err != nil { return nil, err } - return data[ssym.Value-text.Value : esym.Value-text.Value], nil + return data[ssym.Value-(f.LoadAddress+f.HdrSize) : esym.Value-(f.LoadAddress+f.HdrSize)], nil } diff --git a/src/pkg/debug/plan9obj/file.go b/src/pkg/debug/plan9obj/file.go index 60a5857193..b11ed86f18 100644 --- a/src/pkg/debug/plan9obj/file.go +++ b/src/pkg/debug/plan9obj/file.go @@ -15,10 +15,12 @@ import ( // A FileHeader represents a Plan 9 a.out file header. type FileHeader struct { - Magic uint32 - Bss uint32 - Entry uint64 - PtrSize int + Magic uint32 + Bss uint32 + Entry uint64 + PtrSize int + LoadAddress uint64 + HdrSize uint64 } // A File represents an open Plan 9 a.out file. @@ -148,20 +150,21 @@ func NewFile(r io.ReaderAt) (*File, error) { } f := &File{FileHeader: FileHeader{ - Magic: ph.Magic, - Bss: ph.Bss, - Entry: uint64(ph.Entry), - PtrSize: 4, + Magic: ph.Magic, + Bss: ph.Bss, + Entry: uint64(ph.Entry), + PtrSize: 4, + LoadAddress: 0x1000, + HdrSize: 4 * 8, }} - hdrSize := 4 * 8 - if ph.Magic&Magic64 != 0 { if err := binary.Read(sr, binary.BigEndian, &f.Entry); err != nil { return nil, err } f.PtrSize = 8 - hdrSize += 8 + f.LoadAddress = 0x200000 + f.HdrSize += 8 } var sects = []struct { @@ -177,7 +180,7 @@ func NewFile(r io.ReaderAt) (*File, error) { f.Sections = make([]*Section, 5) - off := uint32(hdrSize) + off := uint32(f.HdrSize) for i, sect := range sects { s := new(Section) -- 2.48.1