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 optstringView on GitHub (pinned to d5f144c24d)
Solutions
- Use a Sleigh-based language for the program (the normal case for Ghidra targets); re-import with a Sleigh language ID.
- If the language should be Sleigh, ensure its LanguageDescription is a SleighLanguageDescription (defined via .slaspec/.ldefs).
- 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
- Prefer Sleigh languages when importing programs that need external disassembly.
- Guard with the instanceof check before constructing the external disassembler config.
- Keep legacy non-Sleigh languages out of the external-disassembler code path.
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
- No context_register element or global element in gdis option
- No context register name provided.
- Error: disassemble_fn is NULL. Nothing I can do.\n
- Sleigh language required
- Emulation requires a Sleigh language
AI-assisted analysis of NationalSecurityAgency/ghidra@d5f144c24d (2026-08-14).
Data as JSON: /api/errors/a0b9d48f13185654.
Report an issue: GitHub.