1 // Copyright 2009 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 // Package dwarf provides access to DWARF debugging information loaded from 6 // executable files, as defined in the DWARF 2.0 Standard at 7 // http://dwarfstd.org/doc/dwarf-2.0.0.pdf 8 package dwarf 9 10 import "encoding/binary" 11 12 // Data represents the DWARF debugging information 13 // loaded from an executable file (for example, an ELF or Mach-O executable). 14 type Data struct { 15 // raw data 16 abbrev []byte 17 aranges []byte 18 frame []byte 19 info []byte 20 line []byte 21 pubnames []byte 22 ranges []byte 23 str []byte 24 25 // parsed data 26 abbrevCache map[uint32]abbrevTable 27 order binary.ByteOrder 28 typeCache map[Offset]Type 29 typeSigs map[uint64]*typeUnit 30 unit []unit 31 } 32 33 // New returns a new Data object initialized from the given parameters. 34 // Rather than calling this function directly, clients should typically use 35 // the DWARF method of the File type of the appropriate package debug/elf, 36 // debug/macho, or debug/pe. 37 // 38 // The []byte arguments are the data from the corresponding debug section 39 // in the object file; for example, for an ELF object, abbrev is the contents of 40 // the ".debug_abbrev" section. 41 func New(abbrev, aranges, frame, info, line, pubnames, ranges, str []byte) (*Data, error) { 42 d := &Data{ 43 abbrev: abbrev, 44 aranges: aranges, 45 frame: frame, 46 info: info, 47 line: line, 48 pubnames: pubnames, 49 ranges: ranges, 50 str: str, 51 abbrevCache: make(map[uint32]abbrevTable), 52 typeCache: make(map[Offset]Type), 53 typeSigs: make(map[uint64]*typeUnit), 54 } 55 56 // Sniff .debug_info to figure out byte order. 57 // bytes 4:6 are the version, a tiny 16-bit number (1, 2, 3). 58 if len(d.info) < 6 { 59 return nil, DecodeError{"info", Offset(len(d.info)), "too short"} 60 } 61 x, y := d.info[4], d.info[5] 62 switch { 63 case x == 0 && y == 0: 64 return nil, DecodeError{"info", 4, "unsupported version 0"} 65 case x == 0: 66 d.order = binary.BigEndian 67 case y == 0: 68 d.order = binary.LittleEndian 69 default: 70 return nil, DecodeError{"info", 4, "cannot determine byte order"} 71 } 72 73 u, err := d.parseUnits() 74 if err != nil { 75 return nil, err 76 } 77 d.unit = u 78 return d, nil 79 } 80 81 // AddTypes will add one .debug_types section to the DWARF data. A 82 // typical object with DWARF version 4 debug info will have multiple 83 // .debug_types sections. The name is used for error reporting only, 84 // and serves to distinguish one .debug_types section from another. 85 func (d *Data) AddTypes(name string, types []byte) error { 86 return d.parseTypes(name, types) 87 } 88