ogle/program/server: discover architecture by reading object file LGTM=nigeltao R=nigeltao https://golang.org/cl/85720045
diff --git a/program/server/server.go b/program/server/server.go index 687f632..fb6a503 100644 --- a/program/server/server.go +++ b/program/server/server.go
@@ -52,12 +52,12 @@ return nil, err } defer fd.Close() - dwarfData, err := loadDwarfData(fd) + architecture, dwarfData, err := loadExecutable(fd) if err != nil { return nil, err } srv := &Server{ - arch: arch.AMD64, // TODO: How do we discover this? + arch: *architecture, executable: executable, dwarfData: dwarfData, fc: make(chan func() error), @@ -68,14 +68,40 @@ return srv, nil } -func loadDwarfData(f *os.File) (*dwarf.Data, error) { +func loadExecutable(f *os.File) (*arch.Architecture, *dwarf.Data, error) { + // TODO: How do we detect NaCl? if obj, err := elf.NewFile(f); err == nil { - return obj.DWARF() + 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 + } + } + return nil, nil, fmt.Errorf("unrecognized ELF architecture") } if obj, err := macho.NewFile(f); err == nil { - return obj.DWARF() + dwarfData, err := obj.DWARF() + 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, fmt.Errorf("unrecognized binary format") + return nil, nil, fmt.Errorf("unrecognized binary format") } type file struct {