github.com/undoio/delve@v1.9.0/service/debugger/debugger_unix.go (about)

     1  //go:build !windows
     2  // +build !windows
     3  
     4  package debugger
     5  
     6  import (
     7  	"debug/elf"
     8  	"debug/macho"
     9  	"os"
    10  	"runtime"
    11  
    12  	"github.com/undoio/delve/service/api"
    13  )
    14  
    15  func verifyBinaryFormat(exePath string) error {
    16  	f, err := os.Open(exePath)
    17  	if err != nil {
    18  		return err
    19  	}
    20  	defer f.Close()
    21  
    22  	fi, err := f.Stat()
    23  	if err != nil {
    24  		return err
    25  	}
    26  	if (fi.Mode() & 0111) == 0 {
    27  		return api.ErrNotExecutable
    28  	}
    29  
    30  	// check that the binary format is what we expect for the host system
    31  	var exe interface{ Close() error }
    32  	switch runtime.GOOS {
    33  	case "darwin":
    34  		exe, err = macho.NewFile(f)
    35  	case "linux", "freebsd":
    36  		exe, err = elf.NewFile(f)
    37  	default:
    38  		panic("attempting to open file Delve cannot parse")
    39  	}
    40  	if err != nil {
    41  		return api.ErrNotExecutable
    42  	}
    43  	exe.Close()
    44  	return nil
    45  }