github.com/ader1990/go@v0.0.0-20140630135419-8c24447fa791/src/cmd/nm/goobj.go (about) 1 // Copyright 2013 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 // Parsing of Go intermediate object files and archives. 6 7 package main 8 9 import ( 10 "fmt" 11 "os" 12 ) 13 14 func goobjName(id goobj_SymID) string { 15 if id.Version == 0 { 16 return id.Name 17 } 18 return fmt.Sprintf("%s<%d>", id.Name, id.Version) 19 } 20 21 func goobjSymbols(f *os.File) []Sym { 22 pkg, err := goobj_Parse(f, `""`) 23 if err != nil { 24 errorf("parsing %s: %v", f.Name(), err) 25 return nil 26 } 27 28 seen := make(map[goobj_SymID]bool) 29 30 var syms []Sym 31 for _, s := range pkg.Syms { 32 seen[s.goobj_SymID] = true 33 sym := Sym{Addr: uint64(s.Data.Offset), Name: goobjName(s.goobj_SymID), Size: int64(s.Size), Type: s.Type.Name, Code: '?'} 34 switch s.Kind { 35 case goobj_STEXT, goobj_SELFRXSECT: 36 sym.Code = 'T' 37 case goobj_STYPE, goobj_SSTRING, goobj_SGOSTRING, goobj_SGOFUNC, goobj_SRODATA, goobj_SFUNCTAB, goobj_STYPELINK, goobj_SSYMTAB, goobj_SPCLNTAB, goobj_SELFROSECT: 38 sym.Code = 'R' 39 case goobj_SMACHOPLT, goobj_SELFSECT, goobj_SMACHO, goobj_SMACHOGOT, goobj_SNOPTRDATA, goobj_SINITARR, goobj_SDATA, goobj_SWINDOWS: 40 sym.Code = 'D' 41 case goobj_SBSS, goobj_SNOPTRBSS, goobj_STLSBSS: 42 sym.Code = 'B' 43 case goobj_SXREF, goobj_SMACHOSYMSTR, goobj_SMACHOSYMTAB, goobj_SMACHOINDIRECTPLT, goobj_SMACHOINDIRECTGOT, goobj_SFILE, goobj_SFILEPATH, goobj_SCONST, goobj_SDYNIMPORT, goobj_SHOSTOBJ: 44 sym.Code = 'X' // should not see 45 } 46 if s.Version != 0 { 47 sym.Code += 'a' - 'A' 48 } 49 syms = append(syms, sym) 50 } 51 52 for _, s := range pkg.Syms { 53 for _, r := range s.Reloc { 54 if !seen[r.Sym] { 55 seen[r.Sym] = true 56 sym := Sym{Name: goobjName(r.Sym), Code: 'U'} 57 if s.Version != 0 { 58 // should not happen but handle anyway 59 sym.Code = 'u' 60 } 61 syms = append(syms, sym) 62 } 63 } 64 } 65 66 return syms 67 }