mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
cmd/objdump: implement objdump of .o files
Update goobj reader so it can provide all the information necessary to disassemble .o (and .a) files. Grab architecture of .o files from header. .o files have relocations in them. This CL also contains a simple mechanism to disassemble relocations and add relocation info as an extra column in the output. Fixes #13862 Change-Id: I608fd253ff1522ea47f18be650b38d528dae9054 Reviewed-on: https://go-review.googlesource.com/24818 Reviewed-by: Ian Lance Taylor <iant@golang.org> Run-TryBot: Ian Lance Taylor <iant@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org>
This commit is contained in:
parent
873dca4c17
commit
a99f812cba
14 changed files with 187 additions and 42 deletions
|
|
@ -30,11 +30,24 @@ type File struct {
|
|||
|
||||
// A Sym is a symbol defined in an executable file.
|
||||
type Sym struct {
|
||||
Name string // symbol name
|
||||
Addr uint64 // virtual address of symbol
|
||||
Size int64 // size in bytes
|
||||
Code rune // nm code (T for text, D for data, and so on)
|
||||
Type string // XXX?
|
||||
Name string // symbol name
|
||||
Addr uint64 // virtual address of symbol
|
||||
Size int64 // size in bytes
|
||||
Code rune // nm code (T for text, D for data, and so on)
|
||||
Type string // XXX?
|
||||
Relocs []Reloc // in increasing Addr order
|
||||
}
|
||||
|
||||
type Reloc struct {
|
||||
Addr uint64 // Address of first byte that reloc applies to.
|
||||
Size uint64 // Number of bytes
|
||||
Stringer RelocStringer
|
||||
}
|
||||
|
||||
type RelocStringer interface {
|
||||
// insnOffset is the offset of the instruction containing the relocation
|
||||
// from the start of the symbol containing the relocation.
|
||||
String(insnOffset uint64) string
|
||||
}
|
||||
|
||||
var openers = []func(*os.File) (rawFile, error){
|
||||
|
|
@ -80,7 +93,13 @@ func (x byAddr) Less(i, j int) bool { return x[i].Addr < x[j].Addr }
|
|||
func (x byAddr) Len() int { return len(x) }
|
||||
func (x byAddr) Swap(i, j int) { x[i], x[j] = x[j], x[i] }
|
||||
|
||||
func (f *File) PCLineTable() (*gosym.Table, error) {
|
||||
func (f *File) PCLineTable() (Liner, error) {
|
||||
// If the raw file implements Liner directly, use that.
|
||||
// Currently, only Go intermediate objects and archives (goobj) use this path.
|
||||
if pcln, ok := f.raw.(Liner); ok {
|
||||
return pcln, nil
|
||||
}
|
||||
// Otherwise, read the pcln tables and build a Liner out of that.
|
||||
textStart, symtab, pclntab, err := f.raw.pcln()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue