func lookupSym(dwarfData *dwarf.Data, name string) (uint64, error) { r := dwarfData.Reader() for { entry, err := r.Next() if err != nil { return 0, err } if entry == nil { // TODO: why don't we get an error here. break } if entry.Tag != dwarf.TagSubprogram { continue } nameAttr := lookupAttr(entry, dwarf.AttrName) if nameAttr == nil { // TODO: this shouldn't be possible. continue } if nameAttr.(string) != name { continue } addrAttr := lookupAttr(entry, dwarf.AttrLowpc) if addrAttr == nil { return 0, fmt.Errorf("symbol %q has no LowPC attribute", name) } addr, ok := addrAttr.(uint64) if !ok { return 0, fmt.Errorf("symbol %q has non-uint64 LowPC attribute", name) } return addr, nil } return 0, fmt.Errorf("symbol %q not found", name) }
// New returns a reader for the specified dwarf data. func New(data *dwarf.Data) *Reader { return &Reader{data.Reader(), 0} }