func loadDwarfData(f *os.File) (*dwarf.Data, error) { if obj, err := elf.NewFile(f); err == nil { return obj.DWARF() } if obj, err := macho.NewFile(f); err == nil { return obj.DWARF() } return nil, fmt.Errorf("unrecognized binary format") }
func loadExecutable(f *os.File) (*arch.Architecture, *dwarf.Data, error) { // TODO: How do we detect NaCl? if obj, err := elf.NewFile(f); err == nil { dwarfData, err := obj.DWARF() if err != nil { return nil, nil, err } switch obj.Machine { case elf.EM_ARM: return &arch.ARM, dwarfData, nil case elf.EM_386: switch obj.Class { case elf.ELFCLASS32: return &arch.X86, dwarfData, nil case elf.ELFCLASS64: return &arch.AMD64, dwarfData, nil } case elf.EM_X86_64: return &arch.AMD64, dwarfData, nil } return nil, nil, fmt.Errorf("unrecognized ELF architecture") } if obj, err := macho.NewFile(f); err == nil { dwarfData, err := obj.DWARF() if err != nil { return nil, nil, err } /* TODO table, err := parseMachO(obj) if err != nil { return nil, nil, err } */ switch obj.Cpu { case macho.Cpu386: return &arch.X86, dwarfData, nil case macho.CpuAmd64: return &arch.AMD64, dwarfData, nil } return nil, nil, fmt.Errorf("unrecognized Mach-O architecture") } return nil, nil, fmt.Errorf("unrecognized binary format") }