@@ -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 }
0 commit comments