GP-6147: Added a new table column for memory block source

This commit is contained in:
Ryan Kurtz
2025-11-21 06:43:32 -05:00
parent cd1a188eca
commit 506a95e3c0
2 changed files with 55 additions and 3 deletions

View File

@@ -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<SegmentCommand> segments)
protected Address setupHeaderAddr(Collection<SegmentCommand> 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();
}

View File

@@ -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<ProgramLocation, String> {
@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;
}
}