From ada93ab0c3763d4a4ab607cbc73c24d74bc94ff4 Mon Sep 17 00:00:00 2001 From: Shamus Hammons Date: Wed, 4 Oct 2017 11:25:45 -0500 Subject: [PATCH] Patch to fix lack of WORD sized symbol relocations by SainT. Version now at 1.8.7. --- mach.c | 1 - mark.c | 24 ++++++++++++++++++++++-- version.h | 2 +- 3 files changed, 23 insertions(+), 4 deletions(-) diff --git a/mach.c b/mach.c index 7473002..e01ea88 100644 --- a/mach.c +++ b/mach.c @@ -1251,7 +1251,6 @@ int m_br30(WORD inst, WORD siz) // int m_bfop(WORD inst, WORD siz) { - if ((bfval1 > 31) || (bfval1 < 0)) return error("bfxxx offset: immediate value must be between 0 and 31"); diff --git a/mark.c b/mark.c index 7495c71..955fcab 100644 --- a/mark.c +++ b/mark.c @@ -377,6 +377,12 @@ printf(" validsegment: raddr = $%08X\n", loc); if (w & MMOVEI) rflag |= 0x00000001; + // This tells the linker to do a WORD relocation (otherwise it + // defaults to doing a LONG, throwing things off for WORD sized + // fixups) + if (!(w & MLONG)) + rflag |= 0x00000002; + if (symbol != NULL) { // Deposit external reference @@ -414,7 +420,7 @@ printf(" validsegment(3): rflag = $%08X\n", rflag); if (from == DATA) dp += tsize; - uint32_t diff = GETBE32(dp, 0); + uint32_t diff = (rflag & 0x02 ? GETBE16(dp, 0) : GETBE32(dp, 0)); DEBUG printf("diff=%uX ==> ", diff); #ifdef DEBUG_IMAGE_MARKING printf(" validsegment(4): diff = $%08X --> ", diff); @@ -430,7 +436,21 @@ printf(" validsegment(4): diff = $%08X --> ", diff); if (rflag & 0x01) diff = WORDSWAP32(diff); - SETBE32(dp, 0, diff); + // Make sure to deposit the correct size payload + // N.B.: The braces around the SETBExx macros are needed + // because the macro supplies its own set of braces, + // thus leaving a naked semicolon afterwards to + // screw up the if/else structure. This is the price + // you pay when using macros pretending to be code. + if (rflag & 0x02) + { + SETBE16(dp, 0, diff); + } + else + { + SETBE32(dp, 0, diff); + } + DEBUG printf("%uX\n", diff); #ifdef DEBUG_IMAGE_MARKING printf("$%08X\n", diff); diff --git a/version.h b/version.h index d5f4427..b5e0f1c 100644 --- a/version.h +++ b/version.h @@ -15,7 +15,7 @@ #define MAJOR 1 // Major version number #define MINOR 8 // Minor version number -#define PATCH 6 // Patch release number +#define PATCH 7 // Patch release number #endif // __VERSION_H__ -- 2.37.2