From df2c0dc2f9a0d6a096080058e4460d18e52bd336 Mon Sep 17 00:00:00 2001 From: ISSOtm Date: Sun, 22 Mar 2020 11:54:57 +0100 Subject: [PATCH] Check for unsatisfiable alignment constraints Fixes #493 --- src/asm/section.c | 3 +++ src/link/section.c | 7 +++++++ 2 files changed, 10 insertions(+) diff --git a/src/asm/section.c b/src/asm/section.c index 4dbf0130..a919d759 100644 --- a/src/asm/section.c +++ b/src/asm/section.c @@ -108,6 +108,9 @@ static struct Section *getSection(char const *pzName, enum SectionType type, yyerror("Section \"%s\"'s fixed address doesn't match its alignment", pzName); alignment = 1; /* Ignore it if it's satisfied */ + } else if (startaddr[type] & mask) { + yyerror("Section \"%s\"'s alignment cannot be attained in %s", + pzName, typeNames[type]); } } diff --git a/src/link/section.c b/src/link/section.c index 3cdaee06..095ec21e 100644 --- a/src/link/section.c +++ b/src/link/section.c @@ -161,6 +161,13 @@ static void doSanityChecks(struct Section *section, void *ptr) if (section->isAlignFixed && section->alignMask == 1) section->isAlignFixed = false; + /* Too large an alignment may not be satisfiable */ + if (section->isAlignFixed + && (section->alignMask & startaddr[section->type])) + fail("%s: %s sections cannot be aligned to $%x bytes", + section->name, typeNames[section->type], + section->alignMask + 1); + uint32_t minbank = bankranges[section->type][0], maxbank = bankranges[section->type][1];