From 5be1c0da622d4cf7a294b7a8011f08394d045931 Mon Sep 17 00:00:00 2001 From: ISSOtm Date: Sat, 9 Jan 2021 23:29:08 +0100 Subject: [PATCH] Fix intra-section ALIGN not computing offset correctly --- src/asm/section.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/asm/section.c b/src/asm/section.c index 912e96a5..6405496a 100644 --- a/src/asm/section.c +++ b/src/asm/section.c @@ -383,24 +383,24 @@ void sect_AlignPC(uint8_t alignment, uint16_t offset) { checksection(); struct Section *sect = sect_GetSymbolSection(); + uint16_t alignSize = 1 << alignment; // Size of an aligned "block" if (sect->org != -1) { - if ((sym_GetPCValue() - offset) % (1 << alignment)) - error("Section's fixed address fails required alignment (PC = $%04" - PRIx32 ")\n", sym_GetPCValue()); + if ((sym_GetPCValue() - offset) % alignSize) + error("Section's fixed address fails required alignment (PC = $%04" PRIx32 + ")\n", sym_GetPCValue()); } else if (sect->align != 0) { - if ((((sect->alignOfs + curOffset) % (1 << sect->align)) - - offset) % (1 << alignment)) { + if ((((sect->alignOfs + curOffset) % (1 << sect->align)) - offset) % alignSize) { error("Section's alignment fails required alignment (offset from section start = $%04" PRIx32 ")\n", curOffset); } else if (alignment > sect->align) { sect->align = alignment; - sect->alignOfs = - (offset - curOffset) % (1 << alignment); + sect->alignOfs = (offset - curOffset) % alignSize; } } else { sect->align = alignment; - sect->alignOfs = offset; + // We need `(sect->alignOfs + curOffset) % alignSize == offset + sect->alignOfs = (offset - curOffset) % alignSize; } }