diff --git a/lld/COFF/Config.h b/lld/COFF/Config.h index f7e8b2b76003..3e074e0b7816 100644 --- a/lld/COFF/Config.h +++ b/lld/COFF/Config.h @@ -140,6 +140,7 @@ struct Configuration { bool showSummary = false; bool printSearchPaths = false; bool enableFullPdbPath = false; + bool dontMergeSections = false; unsigned debugTypes = static_cast(DebugType::None); llvm::SmallVector mllvmOpts; std::vector natvisFiles; diff --git a/lld/COFF/Driver.cpp b/lld/COFF/Driver.cpp index 7221f4566804..6f2b6a071657 100644 --- a/lld/COFF/Driver.cpp +++ b/lld/COFF/Driver.cpp @@ -2026,28 +2026,30 @@ void LinkerDriver::linkerMain(ArrayRef argsArr) { for (auto *arg : args.filtered(OPT_merge)) parseMerge(arg->getValue()); - // Add default section merging rules after user rules. User rules take - // precedence, but we will emit a warning if there is a conflict. - parseMerge(".idata=.rdata"); - parseMerge(".didat=.rdata"); - if (!config->driver) - parseMerge(".edata=.rdata"); - parseMerge(".xdata=.rdata"); - parseMerge(".00cfg=.rdata"); - - parseMerge(".voltbl=.rdata"); - parseMerge("newworld=.rdata"); - - if (config->driver) - parseMerge("INIT2=INIT"); - - if (isArm64EC(config->machine)) - parseMerge(".wowthk=.text"); - - if (config->mingw) { - parseMerge(".ctors=.rdata"); - parseMerge(".dtors=.rdata"); - parseMerge(".CRT=.rdata"); + if (!config->dontMergeSections) { + // Add default section merging rules after user rules. User rules take + // precedence, but we will emit a warning if there is a conflict. + parseMerge(".idata=.rdata"); + parseMerge(".didat=.rdata"); + if (!config->driver) + parseMerge(".edata=.rdata"); + parseMerge(".xdata=.rdata"); + parseMerge(".00cfg=.rdata"); + + parseMerge(".voltbl=.rdata"); + parseMerge("newworld=.rdata"); + + if (config->driver) + parseMerge("INIT2=INIT"); + + if (isArm64EC(config->machine)) + parseMerge(".wowthk=.text"); + + if (config->mingw) { + parseMerge(".ctors=.rdata"); + parseMerge(".dtors=.rdata"); + parseMerge(".CRT=.rdata"); + } } // Handle /section diff --git a/lld/COFF/Options.td b/lld/COFF/Options.td index bb00e226bdf9..e4a6f6e457b8 100644 --- a/lld/COFF/Options.td +++ b/lld/COFF/Options.td @@ -28,6 +28,9 @@ multiclass B_priv { def _no : F; } +def dont_merge_sections: F<"dont-merge-sections">, + HelpText<"Each data directory will have its own section">; + def align : P<"align", "Section alignment">; def aligncomm : P<"aligncomm", "Set common symbol alignment">; def alternatename : P<"alternatename", "Define weak alias">;