]> Cypherpunks repositories - gostls13.git/commitdiff
debug/plan9obj, cmd/addr2line: on Plan 9 use a.out header
authorAram Hăvărneanu <aram@mgk.ro>
Wed, 9 Jul 2014 10:33:13 +0000 (12:33 +0200)
committerAram Hăvărneanu <aram@mgk.ro>
Wed, 9 Jul 2014 10:33:13 +0000 (12:33 +0200)
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
src/pkg/debug/plan9obj/file.go

index b94ba12efdc1330df9eda30e2baff59162dc9894..c6e4563db75f31bf79b3b456234d960cdd00ef72 100644 (file)
@@ -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
 }
index 60a5857193e9f2770124e18811b8834e497584e1..b11ed86f185dedffe46f24bf572da838e8d2cf72 100644 (file)
@@ -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)