NationalSecurityAgency/ghidra · warning · IOException

Not a Sleigh Language:

Error message

Not a Sleigh Language: 

What it means

Thrown by GNUExternalDisassembler.GdisConfig.parseGdisOptionsFile() when the language's LanguageDescription is not a SleighLanguageDescription. The external GNU disassembler integration relies on Sleigh-specific data (the .defs file location via SleighLanguageDescription.getDefsFile()), so non-Sleigh languages cannot use this path. An IOException is thrown (and is caught/logged by the constructor, resetting config fields).

Source

Thrown at Ghidra/Extensions/SleighDevTools/src/main/java/ghidra/app/util/disassemble/GNUExternalDisassembler.java:199

					parseGdisOptionsFile(gDisOptionsFile.get(0));
				}
				catch (IOException e) {
					Msg.error(this, "Error reading gdis options file " + e.getMessage());
					contextRegister = null;
					valueToOptionString = null;
					valueToDisplayPrefix = null;
				}
			}
		}

		GdisConfig(Language lang) {
			this(lang, lang.isBigEndian());
		}

		private void parseGdisOptionsFile(String fileName) throws IOException {
			LanguageDescription desc = lang.getLanguageDescription();
			if (!(desc instanceof SleighLanguageDescription)) {
				throw new IOException("Not a Sleigh Language: " + lang.getLanguageID());
			}

			SleighLanguageDescription sld = (SleighLanguageDescription) desc;
			ResourceFile defsFile = sld.getDefsFile();
			ResourceFile parentFile = defsFile.getParentFile();
			ResourceFile gdisOpts = new ResourceFile(parentFile, fileName);
			SAXBuilder sax = XmlUtilities.createSecureSAXBuilder(false, false);
			try (InputStream fis = gdisOpts.getInputStream()) {
				Document doc = sax.build(fis);
				Element rootElem = doc.getRootElement();
				Element globalElement = rootElem.getChild("global");
				if (globalElement != null) {
					globalDisassemblerOptions = globalElement.getAttributeValue("optstring");
				}
				Element contextRegisterElement = rootElem.getChild("context_register");
				if (contextRegisterElement == null) {
					//no context_register element found in the xml file 
					//this is not necessarily an error - might only be a global optstring

View on GitHub (pinned to d5f144c24d)

Solutions

  1. Use a Sleigh-based language for the program (the normal case for Ghidra targets); re-import with a Sleigh language ID.
  2. If the language should be Sleigh, ensure its LanguageDescription is a SleighLanguageDescription (defined via .slaspec/.ldefs).
  3. Avoid the GNU external disassembler for non-Sleigh languages; use the built-in Sleigh disassembly.

Example fix

null
Defensive patterns

Strategy: type-guard

Validate before calling

import ghidra.program.model.lang.LanguageDescription;
import ghidra.app.plugin.processors.sleigh.SleighLanguageDescription;
LanguageDescription desc = lang.getLanguageDescription();
if (!(desc instanceof SleighLanguageDescription)) {
    // cannot use GNU external disassembler; skip or re-import with a Sleigh language
}

Type guard

public boolean isSleighLanguage(Language lang) {
    return lang.getLanguageDescription() instanceof SleighLanguageDescription;
}

Try / catch

try {
    // external disassembler use
} catch (IOException e) {
    if (e.getMessage().startsWith("Not a Sleigh Language")) {
        // fall back to built-in Sleigh disassembly for this language
    } else throw e;
}

Prevention

When it happens

Trigger: Attempting to use the GNU external disassembler with a program whose language is not Sleigh-based (e.g. an old built-in language, or a language registered with a plain LanguageDescription); GdisConfig constructed for such a language triggers parseGdisOptionsFile which fails the instanceof check.

Common situations: Pointing the external disassembler at a legacy/programmatic language that wasn't defined via a .slaspec; mixed installations where some languages are Sleigh and others are not.

Related errors


AI-assisted analysis of NationalSecurityAgency/ghidra@d5f144c24d (2026-08-14). Data as JSON: /api/errors/a0b9d48f13185654. Report an issue: GitHub.