Skip to content

Commit 2dd83ff

Browse files
committed
Minor improvements
1 parent f785360 commit 2dd83ff

File tree

5 files changed

+58
-29
lines changed

5 files changed

+58
-29
lines changed

src/main/java/yetmorecode/ghidra/LxLoader.java

Lines changed: 19 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -191,8 +191,9 @@ private void createImageMappings(LxExecutable executable, Program program, ByteP
191191
program.getSymbolTable().createLabel(b.getStart(), "IMAGE_LE_HEADER", SourceType.ANALYSIS);
192192
log(CHECK + "Mapped LX Header Section");
193193

194-
// LE loader section
194+
195195
if (loaderOptions.mapExtra) {
196+
// LE loader section
196197
addr = b.getStart().add(header.objectTableOffset);
197198
monitor.setMessage(String.format(ARROW + "Mapping LX Loader section"));
198199
createData(
@@ -202,9 +203,7 @@ private void createImageMappings(LxExecutable executable, Program program, ByteP
202203
);
203204
program.getSymbolTable().createLabel(addr, "IMAGE_LE_LOADER", SourceType.ANALYSIS);
204205
log(CHECK + "Mapped LX Loader Section");
205-
}
206-
207-
if (loaderOptions.mapExtra) {
206+
208207
// LE fixup section
209208
var dm = program.getDataTypeManager();
210209
var cat = dm.createCategory(new CategoryPath("/_le/_fixup"));
@@ -215,7 +214,8 @@ private void createImageMappings(LxExecutable executable, Program program, ByteP
215214
header.dataPagesOffset - dosHeader.e_lfanew() - header.fixupPageTableOffset,
216215
loaderOptions,
217216
cat,
218-
program
217+
program,
218+
b
219219
);
220220
createData(program, addr, ft);
221221
program.getSymbolTable().createLabel(addr, "IMAGE_LE_FIXUP", SourceType.ANALYSIS);
@@ -277,11 +277,10 @@ private Data createData(Program program, Address address, DataType dt) {
277277
return null;
278278
}
279279

280-
private byte[] createObjectBlock(Program program, LxExecutable le, ObjectTableEntry object, boolean isLastObject) throws IOException, UsrException {
280+
private byte[] createObjectBlock(Program program, LxExecutable le, ObjectTableEntry object, boolean isLastObject) throws IOException {
281281
var header = le.getLeHeader();
282282
var pageMapOffset = le.getDosHeader().e_lfanew() + header.pageTableOffset;
283283
var pageSize = header.pageSize;
284-
var space = program.getAddressFactory().getDefaultAddressSpace();
285284

286285
// Temporary memory to assemble all pages to one block
287286
byte block[] = new byte[object.size+4096];
@@ -299,15 +298,6 @@ private byte[] createObjectBlock(Program program, LxExecutable le, ObjectTableEn
299298

300299
PageMapEntry entry = new PageMapEntry(le.getReader(), pageMapOffset + (index-1) * 4);
301300
var pageOffset = header.dataPagesOffset + (entry.getIndex()-1)*pageSize;
302-
303-
// Create a label for each page
304-
if (loaderOptions.createPageLabels) {
305-
program.getSymbolTable().createLabel(
306-
space.getAddress(loaderOptions.getBaseAddress(object) + blockIndex),
307-
"LE_PAGE_" + index,
308-
SourceType.ANALYSIS
309-
);
310-
}
311301

312302
// Read page from file
313303
FactoryBundledWithBinaryReader r = le.getReader();
@@ -486,11 +476,16 @@ private void createEntrypoint(LxExecutable exe, Program program, TaskMonitor mon
486476
addr = unit.getAddress();
487477
}
488478

489-
var to = s.getAddress(loaderOptions.getBaseAddress(f.objectNumber) + f.targetOffset);
490-
program.getReferenceManager().removeAllReferencesFrom(addr);
491-
var ref = new MemReferenceImpl(addr, to, RefType.JUMP_OVERRIDE_UNCONDITIONAL, SourceType.ANALYSIS, 0, true);
492-
program.getReferenceManager().addReference(ref);
493-
479+
if (loaderOptions.fixupEnabled(f) && f.is1616PointerFixup()) {
480+
// 16:16 pointer fixups are weird since they involve segment selectors
481+
// and Ghidra only knows DOS segmented memory (no protected mode segmentation),
482+
// so we remove the old ref and place on calculated by ourself
483+
var to = s.getAddress(loaderOptions.getBaseAddress(f.objectNumber) + f.targetOffset);
484+
program.getReferenceManager().removeAllReferencesFrom(addr);
485+
var ref = new MemReferenceImpl(addr, to, RefType.JUMP_OVERRIDE_UNCONDITIONAL, SourceType.ANALYSIS, 0, true);
486+
program.getReferenceManager().addReference(ref);
487+
}
488+
494489
if (loaderOptions.createFixupLabels) {
495490
program.getListing().setComment(
496491
addr,
@@ -503,11 +498,12 @@ private void createEntrypoint(LxExecutable exe, Program program, TaskMonitor mon
503498
}
504499
}
505500
}
506-
501+
502+
// Create a label for each page
507503
if (loaderOptions.createPageLabels) {
508504
for (var i = 1; i <= exe.header.pageCount; i++) {
509505
var addr = s.getAddress(header.dataPagesOffset - dosHeader.e_lfanew()).add((i-1)*header.pageSize);
510-
program.getSymbolTable().createLabel(addr, "IMAGE_LE_DATA", SourceType.ANALYSIS);
506+
program.getSymbolTable().createLabel(addr, "LE_PAGE_" + i, SourceType.ANALYSIS);
511507
}
512508
}
513509
}

src/main/java/yetmorecode/ghidra/format/lx/LoaderOptions.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ public class LoaderOptions {
4141
// Default options
4242
public boolean disassembleEntry = true;
4343
public boolean addEntry = true;
44-
public boolean mapExtra = true;
44+
public boolean mapExtra = false;
4545
public boolean[] enableType = new boolean[9];
4646

4747
// More options available through "loader options"

src/main/java/yetmorecode/ghidra/format/lx/datatype/FixupSectionType.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,14 @@
77
import ghidra.program.model.data.Category;
88
import ghidra.program.model.data.StructureDataType;
99
import ghidra.program.model.listing.Program;
10+
import ghidra.program.model.mem.MemoryBlock;
1011
import ghidra.util.exception.UsrException;
1112
import yetmorecode.ghidra.format.lx.LoaderOptions;
1213
import yetmorecode.ghidra.format.lx.model.LxExecutable;
1314

1415
public class FixupSectionType extends StructureDataType {
1516

16-
public FixupSectionType(LxExecutable executable, int end, LoaderOptions options, Category cat, Program program) throws UsrException, IOException {
17+
public FixupSectionType(LxExecutable executable, int end, LoaderOptions options, Category cat, Program program, MemoryBlock b) throws UsrException, IOException {
1718
super("IMAGE_LE_FIXUP", 0);
1819

1920
var h = executable.header;
@@ -29,7 +30,7 @@ public FixupSectionType(LxExecutable executable, int end, LoaderOptions options,
2930
for (var object : executable.getObjects()) {
3031
if (executable.objectHasFixups(object)) {
3132
add(
32-
new ObjectFixupsType(executable, object, options, cat, program),
33+
new ObjectFixupsType(executable, object, options, cat, program, b),
3334
"fixups_object" + object.number,
3435
"Fixup records for object #" + object.number
3536
);

src/main/java/yetmorecode/ghidra/format/lx/datatype/ObjectFixupsType.java

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,23 +2,32 @@
22

33
import java.io.IOException;
44

5+
import ghidra.program.model.address.AddressSpace;
56
import ghidra.program.model.data.Category;
67
import ghidra.program.model.data.CategoryPath;
78
import ghidra.program.model.data.StructureDataType;
89
import ghidra.program.model.listing.Program;
10+
import ghidra.program.model.mem.MemoryBlock;
11+
import ghidra.program.model.symbol.MemReferenceImpl;
12+
import ghidra.program.model.symbol.RefType;
13+
import ghidra.program.model.symbol.SourceType;
914
import ghidra.util.exception.UsrException;
1015
import yetmorecode.ghidra.format.lx.LoaderOptions;
1116
import yetmorecode.ghidra.format.lx.model.LxExecutable;
1217
import yetmorecode.ghidra.format.lx.model.ObjectTableEntry;
1318

1419
public class ObjectFixupsType extends StructureDataType {
1520

16-
public ObjectFixupsType(LxExecutable executable, ObjectTableEntry object, LoaderOptions options, Category cat, Program program) throws UsrException, IOException {
21+
public ObjectFixupsType(LxExecutable executable, ObjectTableEntry object, LoaderOptions options, Category cat, Program program, MemoryBlock b) throws UsrException, IOException {
1722
super(String.format("%08x_%d", options.getBaseAddress(object), object.number), 0);
1823
setCategoryPath(cat.getCategoryPath());
24+
25+
// Iterate over all object pages
1926
for (int i = 0; i < object.pageCount; i++) {
2027
var page = object.pageTableIndex + i;
2128
var pageSize = executable.header.pageSize;
29+
30+
// If page has fixups
2231
if (executable.fixups.get(page).size() > 0) {
2332
var sub = new StructureDataType(String.format("%08x", options.getBaseAddress(object) + i*pageSize), 0);
2433
sub.setCategoryPath(new CategoryPath(
@@ -29,17 +38,36 @@ public ObjectFixupsType(LxExecutable executable, ObjectTableEntry object, Loader
2938
)
3039
));
3140
add(sub, "page_" + page, "Page #" + page + " fixups");
41+
42+
// Each single fixup
43+
var current = 0;
3244
for (var f : executable.fixups.get(page)) {
45+
// Add datatype
3346
var fixupData = f.toDataType();
47+
3448
fixupData.setCategoryPath(new CategoryPath(
35-
String.format(
36-
"%s/%08x/%08x",
49+
String.format("%s/%08x/%08x",
3750
cat.getCategoryPathName(),
3851
options.getBaseAddress(object) + i*pageSize,
3952
f.getSourceAddress()
4053
)
4154
));
4255
sub.add(fixupData, "fix_" + f.index, "Fixup record #" + f.index);
56+
57+
// Add xref
58+
var to = b.getStart().add(executable.header.dataPagesOffset - executable.getDosHeader().e_lfanew() + (page-1)*pageSize + current);
59+
var space = program.getAddressFactory().getDefaultAddressSpace();
60+
var ref = new MemReferenceImpl(
61+
space.getAddress(f.getSourceAddress()),
62+
to,
63+
RefType.DATA_IND,
64+
SourceType.ANALYSIS,
65+
0,
66+
false
67+
);
68+
program.getReferenceManager().addReference(ref);
69+
70+
current += fixupData.getLength();
4371
}
4472
}
4573
}

src/main/java/yetmorecode/ghidra/format/lx/model/FixupRecord.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,10 @@ public int getSourceType() {
135135
public boolean isTargetOffset32Bit() {
136136
return (targetFlags & 0x10) > 0;
137137
}
138+
139+
public boolean is1616PointerFixup() {
140+
return getSourceType() == SOURCE_1616PTR_FIXUP;
141+
}
138142

139143
@Override
140144
public DataType toDataType() throws DuplicateNameException, IOException {

0 commit comments

Comments
 (0)