diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/omf/OmfCommentRecord.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/omf/OmfCommentRecord.java index e93d4def4a..a5398e28ed 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/omf/OmfCommentRecord.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/omf/OmfCommentRecord.java @@ -27,6 +27,10 @@ public class OmfCommentRecord extends OmfRecord { public static final byte COMMENT_CLASS_LIBMOD = (byte) 0xA3; // Default library cmd public static final byte COMMENT_CLASS_DEFAULT_LIBRARY = (byte) 0x9F; + // Watcom compile parameters + public static final byte COMMENT_CLASS_WATCOM_SETTINGS = (byte) 0x9b; + // Microsoft compile parameters + public static final byte COMMENT_CLASS_MICROSOFT_SETTINGS = (byte) 0x9d; private byte commentType; private byte commentClass; diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/omf/OmfFileHeader.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/omf/OmfFileHeader.java index 18a7d67ce0..2dd3089ce3 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/omf/OmfFileHeader.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/omf/OmfFileHeader.java @@ -37,6 +37,7 @@ public class OmfFileHeader extends OmfRecord { private ArrayList fixup = new ArrayList(); private ArrayList extraSeg = null; // Holds implied segments that don't have official header record // private OmfModuleEnd endModule = null; + private boolean format16bit; public OmfFileHeader(BinaryReader reader) throws IOException { readRecordHeader(reader); @@ -65,7 +66,7 @@ public class OmfFileHeader extends OmfRecord { * @return the string identifying the architecture this object was compiled for */ public String getMachineName() { - return "i386"; // This is the only possibility + return format16bit ? "16bit" : "32bit"; } /** @@ -250,13 +251,13 @@ public class OmfFileHeader extends OmfRecord { * Scan the object file, for the main header and comment records. Other records are parsed but not saved * @param reader is the byte stream * @param monitor is checked for cancellation - * @param initialCommentsOnly is true if we only want to scan the header and the initial comments, + * @param fastscan is true if we only want to scan the header until first seghead, * @return the header record * @throws IOException for problems reading program data * @throws OmfException for malformed records */ public static OmfFileHeader scan(BinaryReader reader, TaskMonitor monitor, - boolean initialCommentsOnly) throws IOException, OmfException { + boolean fastscan) throws IOException, OmfException { OmfRecord record = OmfRecord.readRecord(reader); if (!(record instanceof OmfFileHeader)) { throw new OmfException("Object file does not start with proper header"); @@ -274,16 +275,26 @@ public class OmfFileHeader extends OmfRecord { } if (record instanceof OmfCommentRecord comment) { - byte commentClass = comment.getCommentClass(); - if (commentClass == OmfCommentRecord.COMMENT_CLASS_TRANSLATOR) { + switch(comment.getCommentClass()) { + case OmfCommentRecord.COMMENT_CLASS_TRANSLATOR: header.translator = comment.getValue(); - } - else if (commentClass == OmfCommentRecord.COMMENT_CLASS_LIBMOD) { + break; + case OmfCommentRecord.COMMENT_CLASS_LIBMOD: header.libModuleName = comment.getValue(); + break; + case OmfCommentRecord.COMMENT_CLASS_WATCOM_SETTINGS: + header.translator = "Watcom"; + break; + case OmfCommentRecord.COMMENT_CLASS_MICROSOFT_SETTINGS: + header.translator = "Microsoft"; + break; } } - else if (initialCommentsOnly) { - break; + else if (record instanceof OmfSegmentHeader head) { + header.format16bit = head.is16Bit(); + if(fastscan) { + break; + } } } return header; diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/omf/OmfSegmentHeader.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/omf/OmfSegmentHeader.java index 5dfcc66af6..bcf11252f5 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/omf/OmfSegmentHeader.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/omf/OmfSegmentHeader.java @@ -206,6 +206,13 @@ public class OmfSegmentHeader extends OmfRecord { return (segAttr >> 2) & 0x7; } + /** + * @return if 16 or 32 bit segments are used + */ + public boolean is16Bit() { + return (segAttr & 1) == 0; + } + /** * @return true if this block uses filler other than zero bytes */ diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/opinion/OmfLoader.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/opinion/OmfLoader.java index 3caaaab634..df9683efd6 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/opinion/OmfLoader.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/opinion/OmfLoader.java @@ -70,6 +70,12 @@ public class OmfLoader extends AbstractProgramWrapperLoader { if (record.startsWith("CodeGear")) { return "codegearcpp"; } + if (record.equals("MS C")) { + return "windows"; + } + if(record.startsWith("Watcom")) { + return "watcom"; + } return null; } diff --git a/Ghidra/Processors/x86/data/languages/x86.opinion b/Ghidra/Processors/x86/data/languages/x86.opinion index f5da1bff16..1ce7911ffa 100644 --- a/Ghidra/Processors/x86/data/languages/x86.opinion +++ b/Ghidra/Processors/x86/data/languages/x86.opinion @@ -65,17 +65,17 @@ - + - + - - + + - +