//============================================================================ // main : Entry point. //---------------------------------------------------------------------------- func main() { var dwarfData *dwarf.Data var theFile *macho.File var theErr os.Error var relativeAddress uint64 var runtimeAddress uint64 var loadAddress uint64 var segmentAddress uint64 var pathMacho string var pathDsym string // Parse our arguments flag.Uint64Var(&runtimeAddress, "raddr", 0, "") flag.Uint64Var(&loadAddress, "laddr", 0, "") flag.StringVar(&pathMacho, "macho", "", "") flag.StringVar(&pathDsym, "dsym", "", "") flag.Parse() if runtimeAddress == 0 || loadAddress == 0 || pathMacho == "" || pathDsym == "" { printHelp() } // Find the text segment address theFile, theErr = macho.Open(pathMacho) if theErr != nil { fatalError("Can't open Mach-O file: " + theErr.String()) } segmentAddress = theFile.Segment("__TEXT").Addr theFile.Close() // Calculate the target address relativeAddress = runtimeAddress - loadAddress gTargetAddress = segmentAddress + relativeAddress // Find the target theFile, theErr = macho.Open(pathDsym) if theErr != nil { fatalError("Can't open .dsym file: " + theErr.String()) } dwarfData, theErr = theFile.DWARF() if theErr != nil { fatalError("Can't find DWARF info: " + theErr.String()) } processChildren(dwarfData.Reader(), 0, false) theFile.Close() }
// Open an input file. func open(name string) (*file, error) { efile, err := Open(name) var mfile *macho.File if err != nil { var merr error mfile, merr = macho.Open(name) if merr != nil { return nil, err } } r := &file{elf: efile, macho: mfile} if efile != nil { r.dwarf, err = efile.DWARF() } else { r.dwarf, err = mfile.DWARF() } if err != nil { return nil, err } var syms []sym if efile != nil { esyms, err := efile.Symbols() if err != nil { return nil, err } syms = make([]sym, 0, len(esyms)) for _, s := range esyms { if ST_TYPE(s.Info) == STT_FUNC { syms = append(syms, sym{s.Name, uintptr(s.Value)}) } } } else { syms = make([]sym, 0, len(mfile.Symtab.Syms)) for _, s := range mfile.Symtab.Syms { syms = append(syms, sym{s.Name, uintptr(s.Value)}) } } r.symsByName = make([]sym, len(syms)) copy(r.symsByName, syms) sort.Sort(symsByName(r.symsByName)) r.symsByAddr = syms sort.Sort(symsByAddr(r.symsByAddr)) return r, nil }