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") }
func (dbp *Process) findExecutable(path string) (*elf.File, error) { if path == "" { path = fmt.Sprintf("/proc/%d/exe", dbp.Pid) } f, err := os.OpenFile(path, 0, os.ModePerm) if err != nil { return nil, err } elfFile, err := elf.NewFile(f) if err != nil { return nil, err } dbp.dwarf, err = elfFile.DWARF() if err != nil { return nil, err } return elfFile, nil }