diff --git a/lld/MachO/Driver.cpp b/lld/MachO/Driver.cpp --- a/lld/MachO/Driver.cpp +++ b/lld/MachO/Driver.cpp @@ -1341,6 +1341,7 @@ } } } + assert(inputSections.size() < UNSPECIFIED_INPUT_ORDER); } if (config->deadStrip) diff --git a/lld/MachO/OutputSection.h b/lld/MachO/OutputSection.h --- a/lld/MachO/OutputSection.h +++ b/lld/MachO/OutputSection.h @@ -20,6 +20,12 @@ class InputSection; class OutputSegment; +// The default order value for OutputSections that are not constructed from +// InputSections (i.e. SyntheticSections). We make it less than INT_MAX in order +// not to conflict with the ordering of zerofill sections, which must always be +// placed at the end of their segment. +constexpr int UNSPECIFIED_INPUT_ORDER = std::numeric_limits::max() - 1024; + // Output sections represent the finalized sections present within the final // linked executable. They can represent special sections (like the symbol // table), or represent coalesced sections from the various inputs given to the @@ -61,7 +67,7 @@ // For output sections that don't have explicit ordering requirements, their // output order should be based on the order of the input sections they // contain. - int inputOrder = std::numeric_limits::max(); + int inputOrder = UNSPECIFIED_INPUT_ORDER; uint32_t index = 0; uint64_t addr = 0; diff --git a/lld/MachO/OutputSegment.h b/lld/MachO/OutputSegment.h --- a/lld/MachO/OutputSegment.h +++ b/lld/MachO/OutputSegment.h @@ -51,7 +51,7 @@ uint64_t fileOff = 0; uint64_t fileSize = 0; uint64_t vmSize = 0; - int inputOrder = std::numeric_limits::max(); + int inputOrder = UNSPECIFIED_INPUT_ORDER; StringRef name; uint32_t maxProt = 0; uint32_t initProt = 0;