diff --git a/include/link/assign.h b/include/link/assign.h index 1dab916a..a8e8f409 100644 --- a/include/link/assign.h +++ b/include/link/assign.h @@ -42,6 +42,6 @@ int IsSectionSameTypeBankAndFloating(const char *name, enum eSectionType type, int bank); unsigned int -AssignSectionAddressByName(const char *name, unsigned int address); +AssignSectionAddressAndBankByName(const char *name, unsigned int address, int bank); #endif diff --git a/src/link/assign.c b/src/link/assign.c index 00829b9e..f3ff0f5e 100644 --- a/src/link/assign.c +++ b/src/link/assign.c @@ -244,7 +244,7 @@ IsSectionSameTypeBankAndFloating(const char *name, enum eSectionType type, int b } unsigned int -AssignSectionAddressByName(const char *name, unsigned int address) +AssignSectionAddressAndBankByName(const char *name, unsigned int address, int bank) { struct sSection *pSection; @@ -254,7 +254,10 @@ AssignSectionAddressByName(const char *name, unsigned int address) if (strcmp(pSection->pzName, name) == 0) { if (pSection->nOrg != -1 || pSection->nAlign != 1) errx(1, "Section \"%s\" from linkerscript isn't floating.\n", name); + if (pSection->nBank != -1 && pSection->nBank != bank) + errx(1, "Section \"%s\" from linkerscript has different bank number than in the source.\n", name); pSection->nOrg = address; + pSection->nBank = bank; pSection->nAlign = -1; return pSection->nByteSize; } diff --git a/src/link/script.c b/src/link/script.c index 32d6da4f..fb73c92c 100644 --- a/src/link/script.c +++ b/src/link/script.c @@ -213,6 +213,7 @@ void script_OutputSection(const char *section_name) /* Move section to its place. */ bank[current_bank].address += - AssignSectionAddressByName(section_name, bank[current_bank].address); + AssignSectionAddressAndBankByName(section_name, + bank[current_bank].address, current_real_bank); }