github.com/zeebo/goof@v0.0.0-20190312211016-1ee209ef0510/process_go18.go (about) 1 // +build go1.8 2 3 package goof 4 5 import ( 6 "debug/dwarf" 7 "debug/elf" 8 "debug/macho" 9 "debug/pe" 10 "fmt" 11 "io" 12 "os" 13 "runtime" 14 15 "github.com/zeebo/errs" 16 ) 17 18 func openProc() (*dwarf.Data, error) { 19 path, err := os.Executable() 20 if err != nil { 21 return nil, errs.Wrap(err) 22 } 23 24 var fh interface { 25 io.Closer 26 DWARF() (*dwarf.Data, error) 27 } 28 29 switch runtime.GOOS { 30 case "linux": 31 fh, err = elf.Open(path) 32 case "darwin": 33 fh, err = macho.Open(path) 34 case "windows": 35 fh, err = pe.Open(path) 36 default: 37 return nil, fmt.Errorf("unknown goos: %q", runtime.GOOS) 38 } 39 if err != nil { 40 return nil, errs.Wrap(err) 41 } 42 defer fh.Close() 43 44 data, err := fh.DWARF() 45 return data, errs.Wrap(err) 46 }