go-delve/delve · error

is not an exe file

Error message

%v is not an exe file

What it means

The executable paired with a core must be a loadable ELF image: e_type must be ET_EXEC or ET_DYN. Relocatable objects (ET_REL), core files, or other ELF types passed as the executable are rejected with this error naming the file.

Solutions

  1. Pass the fully linked executable (as built by 'go build'), not an object or archive.
  2. Verify with 'file <exe>' that it reports 'ELF 64-bit ... executable' or 'pie executable'.
  3. Ensure argument order is <executable> <core>.
  4. Rebuild the binary if it was stripped/transformed into a non-executable form.

Example fix

// before
dlv core ./pkg/foo.o ./core
// after
dlv core ./myapp ./core  # linked executable
Defensive patterns

Strategy: validation

Validate before calling

e, err := elf.Open(exePath)
if err != nil { return err }
if e.Type != elf.ET_EXEC && e.Type != elf.ET_DYN {
	return fmt.Errorf("%s is ET_%s; pass the linked executable", exePath, e.Type)
}

Type guard

func isExecutableELF(path string) bool {
	e, err := elf.Open(path)
	if err != nil { return false }
	defer e.Close()
	return e.Type == elf.ET_EXEC || e.Type == elf.ET_DYN
}

Try / catch

p, err := core.ReadFile(exePath, corePath)
if err != nil && strings.Contains(err.Error(), "is not an exe file") {
	return fmt.Errorf("pass the fully linked binary (go build output), not an object/archive")
}

Prevention

When it happens

Trigger: readLinuxOrPlatformIndependentCore: the machine type matched, but exeELF.Type is neither elf.ET_EXEC nor elf.ET_DYN — e.g. a .o object file or another core dump was passed as the executable argument.

Common situations: Passing a compiled package archive/object instead of the linked binary; accidentally passing the core as the executable; using a partially linked artifact from the build directory.

Related errors


AI-assisted analysis of go-delve/delve@a23773e6c3 (2026-08-31). Data as JSON: /api/errors/825948dfdd34ad5b. Report an issue: GitHub.

Appendix: source

Thrown at pkg/proc/core/linux_core.go:145

	if err != nil {
		return nil, nil, err
	}

	exe, err := os.Open(exePath)
	if err != nil {
		return nil, nil, err
	}
	exeELF, err := elf.NewFile(exe)
	if err != nil {
		if !platformIndependentDelveCore {
			return nil, nil, err
		}
	} else {
		if exeELF.Machine != machineType {
			return nil, nil, fmt.Errorf("architecture mismatch between core file (%#x) and executable file (%#x)", machineType, exeELF.Machine)
		}
		if exeELF.Type != elf.ET_EXEC && exeELF.Type != elf.ET_DYN {
			return nil, nil, fmt.Errorf("%v is not an exe file", exeELF)
		}
	}

	memory := buildMemory(coreFile, exeELF, exe, notes)

	// TODO support 386
	var bi *proc.BinaryInfo
	if platformIndependentDelveCore {
		goos, goarch, err := platformFromNotes(notes)
		if err != nil {
			return nil, nil, err
		}
		bi = proc.NewBinaryInfo(goos, goarch)
	} else if goarch, ok := supportedLinuxMachines[machineType]; ok {
		bi = proc.NewBinaryInfo("linux", goarch)
	} else {
		return nil, nil, errors.New("unsupported machine type")
	}

View on GitHub (pinned to a23773e6c3)