diff --git a/include/link/output.hpp b/include/link/output.hpp index 0f4436b0..ed0f7fd2 100644 --- a/include/link/output.hpp +++ b/include/link/output.hpp @@ -11,7 +11,8 @@ void out_AddSection(Section const §ion); // Finds an assigned section overlapping another one. Section const *out_OverlappingSection(Section const §ion); -// Writes all output (bin, sym, map) files. -void out_WriteFiles(); +void out_WriteROMIfAny(); +void out_WriteSymIfAny(); +void out_WriteMapIfAny(); #endif // RGBDS_LINK_OUTPUT_HPP diff --git a/src/link/main.cpp b/src/link/main.cpp index 0d20b6ff..d74de2cb 100644 --- a/src/link/main.cpp +++ b/src/link/main.cpp @@ -433,14 +433,14 @@ int main(int argc, char *argv[]) { sectionTypeInfo[SECTTYPE_VRAM].lastBank = 0; } - // Read all object files first, + // Read all object files... size_t nbFiles = localOptions.inputFileNames.size(); obj_Setup(nbFiles); for (size_t i = 0; i < nbFiles; ++i) { obj_ReadFile(localOptions.inputFileNames[i], nbFiles - i - 1); } - // apply the linker script's modifications, + // Apply the linker script's modifications... if (localOptions.linkerScriptName) { verbosePrint(VERB_NOTICE, "Reading linker script...\n"); @@ -453,16 +453,25 @@ int main(int argc, char *argv[]) { requireZeroErrors(); } - // then process them, + // Attempt to generate a layout... sect_DoSanityChecks(); requireZeroErrors(); assign_AssignSections(); + + // Emit the symbol and/or map files now (if requested on the CLI), + // so that more link-time info is available to debug any failing assertions. + // This is safe to do, since we have a valid layout at this point; + // assertions only check user-level assumptions made about it. + out_WriteSymIfAny(); + out_WriteMapIfAny(); + + // Make any last-minute verifications... patch_CheckAssertions(); - // and finally output the result. + // And, finally, make the ROM and emit it! patch_ApplyPatches(); requireZeroErrors(); - out_WriteFiles(); + out_WriteROMIfAny(); return 0; } diff --git a/src/link/output.cpp b/src/link/output.cpp index a8098be9..c64b5a04 100644 --- a/src/link/output.cpp +++ b/src/link/output.cpp @@ -204,7 +204,7 @@ static void } } -static void writeROM() { +void out_WriteROMIfAny() { if (options.outputFileName) { char const *outputFileName = options.outputFileName->c_str(); if (*options.outputFileName != "-") { @@ -536,7 +536,7 @@ static void writeMapSummary() { } } -static void writeSym() { +void out_WriteSymIfAny() { if (!options.symFileName) { return; } @@ -587,7 +587,7 @@ static void writeSym() { } } -static void writeMap() { +void out_WriteMapIfAny() { if (!options.mapFileName) { return; } @@ -615,9 +615,3 @@ static void writeMap() { } } } - -void out_WriteFiles() { - writeROM(); - writeSym(); - writeMap(); -}