diff options
Diffstat (limited to 'src/cmd')
| -rw-r--r-- | src/cmd/internal/objfile/elf.go | 9 | ||||
| -rw-r--r-- | src/cmd/internal/objfile/goobj.go | 4 | ||||
| -rw-r--r-- | src/cmd/internal/objfile/macho.go | 4 | ||||
| -rw-r--r-- | src/cmd/internal/objfile/objfile.go | 8 | ||||
| -rw-r--r-- | src/cmd/internal/objfile/pe.go | 4 | ||||
| -rw-r--r-- | src/cmd/internal/objfile/plan9obj.go | 4 | ||||
| -rw-r--r-- | src/cmd/pprof/pprof.go | 13 |
7 files changed, 42 insertions, 4 deletions
diff --git a/src/cmd/internal/objfile/elf.go b/src/cmd/internal/objfile/elf.go index 3bad034097..c8114603d7 100644 --- a/src/cmd/internal/objfile/elf.go +++ b/src/cmd/internal/objfile/elf.go @@ -106,6 +106,15 @@ func (f *elfFile) goarch() string { return "" } +func (f *elfFile) loadAddress() (uint64, error) { + for _, p := range f.elf.Progs { + if p.Type == elf.PT_LOAD { + return p.Vaddr, nil + } + } + return 0, fmt.Errorf("unknown load address") +} + func (f *elfFile) dwarf() (*dwarf.Data, error) { return f.elf.DWARF() } diff --git a/src/cmd/internal/objfile/goobj.go b/src/cmd/internal/objfile/goobj.go index 5a084a94be..43435efc68 100644 --- a/src/cmd/internal/objfile/goobj.go +++ b/src/cmd/internal/objfile/goobj.go @@ -94,6 +94,10 @@ func (f *goobjFile) goarch() string { return "GOARCH unimplemented for debug/goobj files" } +func (f *goobjFile) loadAddress() (uint64, error) { + return 0, fmt.Errorf("unknown load address") +} + func (f *goobjFile) dwarf() (*dwarf.Data, error) { return nil, errors.New("no DWARF data in go object file") } diff --git a/src/cmd/internal/objfile/macho.go b/src/cmd/internal/objfile/macho.go index 754674d757..1d22a09b13 100644 --- a/src/cmd/internal/objfile/macho.go +++ b/src/cmd/internal/objfile/macho.go @@ -125,6 +125,10 @@ func (x uint64s) Len() int { return len(x) } func (x uint64s) Swap(i, j int) { x[i], x[j] = x[j], x[i] } func (x uint64s) Less(i, j int) bool { return x[i] < x[j] } +func (f *machoFile) loadAddress() (uint64, error) { + return 0, fmt.Errorf("unknown load address") +} + func (f *machoFile) dwarf() (*dwarf.Data, error) { return f.macho.DWARF() } diff --git a/src/cmd/internal/objfile/objfile.go b/src/cmd/internal/objfile/objfile.go index 48ed9ed489..e5d99f086b 100644 --- a/src/cmd/internal/objfile/objfile.go +++ b/src/cmd/internal/objfile/objfile.go @@ -18,6 +18,7 @@ type rawFile interface { pcln() (textStart uint64, symtab, pclntab []byte, err error) text() (textStart uint64, text []byte, err error) goarch() string + loadAddress() (uint64, error) dwarf() (*dwarf.Data, error) } @@ -95,6 +96,13 @@ func (f *File) GOARCH() string { return f.raw.goarch() } +// LoadAddress returns the expected load address of the file. +// This differs from the actual load address for a position-independent +// executable. +func (f *File) LoadAddress() (uint64, error) { + return f.raw.loadAddress() +} + // DWARF returns DWARF debug data for the file, if any. // This is for cmd/pprof to locate cgo functions. func (f *File) DWARF() (*dwarf.Data, error) { diff --git a/src/cmd/internal/objfile/pe.go b/src/cmd/internal/objfile/pe.go index c024762371..46b2317242 100644 --- a/src/cmd/internal/objfile/pe.go +++ b/src/cmd/internal/objfile/pe.go @@ -199,6 +199,10 @@ func (f *peFile) goarch() string { return "" } +func (f *peFile) loadAddress() (uint64, error) { + return 0, fmt.Errorf("unknown load address") +} + func (f *peFile) dwarf() (*dwarf.Data, error) { return f.pe.DWARF() } diff --git a/src/cmd/internal/objfile/plan9obj.go b/src/cmd/internal/objfile/plan9obj.go index 6ee389dc2e..3e34f65ae7 100644 --- a/src/cmd/internal/objfile/plan9obj.go +++ b/src/cmd/internal/objfile/plan9obj.go @@ -147,6 +147,10 @@ func (f *plan9File) goarch() string { return "" } +func (f *plan9File) loadAddress() (uint64, error) { + return 0, fmt.Errorf("unknown load address") +} + func (f *plan9File) dwarf() (*dwarf.Data, error) { return nil, errors.New("no DWARF data in Plan 9 file") } diff --git a/src/cmd/pprof/pprof.go b/src/cmd/pprof/pprof.go index bce37dcb97..0187045b4a 100644 --- a/src/cmd/pprof/pprof.go +++ b/src/cmd/pprof/pprof.go @@ -117,6 +117,9 @@ func (*objTool) Open(name string, start uint64) (plugin.ObjFile, error) { name: name, file: of, } + if load, err := of.LoadAddress(); err == nil { + f.offset = start - load + } return f, nil } @@ -169,10 +172,11 @@ func (*objTool) SetConfig(config string) { // (instead of invoking GNU binutils). // A file represents a single executable being analyzed. type file struct { - name string - sym []objfile.Sym - file *objfile.File - pcln *gosym.Table + name string + offset uint64 + sym []objfile.Sym + file *objfile.File + pcln *gosym.Table triedDwarf bool dwarf *dwarf.Data @@ -200,6 +204,7 @@ func (f *file) SourceLine(addr uint64) ([]plugin.Frame, error) { } f.pcln = pcln } + addr -= f.offset file, line, fn := f.pcln.PCToLine(addr) if fn != nil { frame := []plugin.Frame{ |
