diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/opinion/CoffLoader.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/opinion/CoffLoader.java index 1d2659400b..ab40b0dec0 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/opinion/CoffLoader.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/opinion/CoffLoader.java @@ -30,8 +30,7 @@ import ghidra.app.util.importer.MessageLog; import ghidra.framework.model.DomainObject; import ghidra.program.database.mem.FileBytes; import ghidra.program.model.address.*; -import ghidra.program.model.data.DataType; -import ghidra.program.model.data.Undefined; +import ghidra.program.model.data.*; import ghidra.program.model.lang.Language; import ghidra.program.model.listing.*; import ghidra.program.model.mem.*; @@ -182,6 +181,7 @@ public class CoffLoader extends AbstractLibrarySupportLoader { processSymbols(header, program, monitor, log, sectionsMap, symbolsMap); processEntryPoint(header, program, monitor, log); processRelocations(header, program, sectionsMap, symbolsMap, log, monitor); + markupHeaders(header, program, fileBytes, log, monitor); } catch (AddressOverflowException e) { throw new IOException(e); @@ -752,6 +752,50 @@ public class CoffLoader extends AbstractLibrarySupportLoader { Msg.error(this, program.getName() + ": " + logMessage, causeToReport); } + private void markupHeaders(CoffFileHeader header, Program program, FileBytes fileBytes, + MessageLog log, TaskMonitor monitor) { + monitor.setMessage("Marking up headers..."); + try { + Map dtMap = new HashMap<>(); + long blockSize = 0; + + // Header + dtMap.put(blockSize, header.toDataType()); + blockSize += header.sizeof(); + + // Optional Header + AoutHeader optionalHeader = header.getOptionalHeader(); + if (header.getOptionalHeader() != null) { + dtMap.put(blockSize, optionalHeader.toDataType()); + blockSize += header.getOptionalHeaderSize(); + } + + // Sections + for (CoffSectionHeader section : header.getSections()) { + DataType dt = section.toDataType(); + dtMap.put(blockSize, dt); + blockSize += dt.getLength(); + } + + // Create memory block + Address headerSpaceAddr = AddressSpace.OTHER_SPACE.getAddress(0); + MemoryBlock headerBlock = + MemoryBlockUtils.createInitializedBlock(program, true, "HEADER", headerSpaceAddr, + fileBytes, 0, blockSize, "", "", false, false, false, log); + Address addr = headerBlock.getStart(); + + // Create data + for (long offset : dtMap.keySet()) { + DataUtilities.createData(program, addr.add(offset), dtMap.get(offset), -1, + DataUtilities.ClearDataMode.CHECK_FOR_SPACE); + } + + } + catch (Exception e) { + log.appendMsg("Failed to markup headers"); + } + } + @Override public String getName() { return COFF_NAME; diff --git a/Ghidra/Processors/PowerPC/data/languages/PowerPC.opinion b/Ghidra/Processors/PowerPC/data/languages/PowerPC.opinion index dddc58e63d..c422f7ce28 100644 --- a/Ghidra/Processors/PowerPC/data/languages/PowerPC.opinion +++ b/Ghidra/Processors/PowerPC/data/languages/PowerPC.opinion @@ -3,6 +3,10 @@ + + + +