diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/opinion/MachoProgramBuilder.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/opinion/MachoProgramBuilder.java index 5478eb466d..9cf7c808c0 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/opinion/MachoProgramBuilder.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/opinion/MachoProgramBuilder.java @@ -151,7 +151,8 @@ public class MachoProgramBuilder { processCorruptLoadCommands(); // Markup structures - markupHeaders(machoHeader, setupHeaderAddr(machoHeader.getAllSegments())); + markupHeaders(machoHeader, + setupHeaderAddr(machoHeader.getAllSegments(), provider.getName())); markupSections(); markupLoadCommandData(machoHeader, provider.getName()); markupChainedFixups(machoHeader, chainedFixups); @@ -1100,10 +1101,11 @@ public class MachoProgramBuilder { * area in the "OTHER" address space for the header to live in. * * @param segments A {@link Collection} of {@link SegmentCommand Mach-O segments} + * @param source A name that represents where the header came from * @return The {@link Address} of {@link MachHeader} in memory * @throws AddressOverflowException if the address lies outside the address space */ - protected Address setupHeaderAddr(Collection segments) + protected Address setupHeaderAddr(Collection segments, String source) throws AddressOverflowException { Address headerAddr = null; long lowestFileOffset = Long.MAX_VALUE; @@ -1125,7 +1127,7 @@ public class MachoProgramBuilder { // and copy the header there. headerAddr = AddressSpace.OTHER_SPACE.getAddress(0); MemoryBlock headerBlock = MemoryBlockUtils.createInitializedBlock(program, true, "HEADER", - headerAddr, fileBytes, 0, lowestFileOffset, "Header", "", false, false, false, log); + headerAddr, fileBytes, 0, lowestFileOffset, "Header", source, false, false, false, log); return headerBlock.getStart(); } diff --git a/Ghidra/Features/Base/src/main/java/ghidra/util/table/field/MemorySourceProgramLocationBasedTableColumn.java b/Ghidra/Features/Base/src/main/java/ghidra/util/table/field/MemorySourceProgramLocationBasedTableColumn.java new file mode 100644 index 0000000000..839c86e351 --- /dev/null +++ b/Ghidra/Features/Base/src/main/java/ghidra/util/table/field/MemorySourceProgramLocationBasedTableColumn.java @@ -0,0 +1,50 @@ +/* ### + * IP: GHIDRA + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package ghidra.util.table.field; + +import ghidra.docking.settings.Settings; +import ghidra.framework.plugintool.ServiceProvider; +import ghidra.program.model.listing.Program; +import ghidra.program.model.mem.Memory; +import ghidra.program.model.mem.MemoryBlock; +import ghidra.program.util.ProgramLocation; + +public class MemorySourceProgramLocationBasedTableColumn extends + ProgramLocationTableColumnExtensionPoint { + + @Override + public String getColumnName() { + return "Mem Source"; + } + + @Override + public String getValue(ProgramLocation rowObject, Settings settings, Program program, + ServiceProvider serviceProvider) throws IllegalArgumentException { + Memory memory = program.getMemory(); + MemoryBlock block = memory.getBlock(rowObject.getAddress()); + if (block == null) { + return ""; + } + return block.getSourceName(); + } + + @Override + public ProgramLocation getProgramLocation(ProgramLocation rowObject, Settings settings, + Program program, ServiceProvider serviceProvider) { + return rowObject; + } + +}