summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lld/ELF/Config.h1
-rw-r--r--lld/ELF/Driver.cpp2
-rw-r--r--lld/ELF/Options.td4
-rw-r--r--lld/ELF/Writer.cpp3
-rw-r--r--lld/test/ELF/linkerscript/overlapping-sections.s4
5 files changed, 12 insertions, 2 deletions
diff --git a/lld/ELF/Config.h b/lld/ELF/Config.h
index 3779e7efe6a..756ee4decfc 100644
--- a/lld/ELF/Config.h
+++ b/lld/ELF/Config.h
@@ -112,6 +112,7 @@ struct Configuration {
bool AsNeeded = false;
bool Bsymbolic;
bool BsymbolicFunctions;
+ bool CheckSections;
bool CompressDebugSections;
bool DefineCommon;
bool Demangle = true;
diff --git a/lld/ELF/Driver.cpp b/lld/ELF/Driver.cpp
index 921ed2d7f67..4256491fe03 100644
--- a/lld/ELF/Driver.cpp
+++ b/lld/ELF/Driver.cpp
@@ -600,6 +600,8 @@ void LinkerDriver::readConfigs(opt::InputArgList &Args) {
Config->AuxiliaryList = args::getStrings(Args, OPT_auxiliary);
Config->Bsymbolic = Args.hasArg(OPT_Bsymbolic);
Config->BsymbolicFunctions = Args.hasArg(OPT_Bsymbolic_functions);
+ Config->CheckSections =
+ Args.hasFlag(OPT_check_sections, OPT_no_check_sections, true);
Config->Chroot = Args.getLastArgValue(OPT_chroot);
Config->CompressDebugSections = getCompressDebugSections(Args);
Config->DefineCommon = Args.hasFlag(OPT_define_common, OPT_no_define_common,
diff --git a/lld/ELF/Options.td b/lld/ELF/Options.td
index 91974c3d397..a1e00ee28ee 100644
--- a/lld/ELF/Options.td
+++ b/lld/ELF/Options.td
@@ -31,6 +31,10 @@ def build_id: F<"build-id">, HelpText<"Generate build ID note">;
def build_id_eq: J<"build-id=">, HelpText<"Generate build ID note">;
+defm check_sections : B<"check-sections",
+ "Check section addresses for overlaps",
+ "Do not check section addresses for overlaps">;
+
defm compress_debug_sections : Eq<"compress-debug-sections">,
HelpText<"Compress DWARF debug sections">;
diff --git a/lld/ELF/Writer.cpp b/lld/ELF/Writer.cpp
index 4367eecfc31..3063dd81a1f 100644
--- a/lld/ELF/Writer.cpp
+++ b/lld/ELF/Writer.cpp
@@ -455,7 +455,8 @@ template <class ELFT> void Writer<ELFT>::run() {
Sec->Addr = 0;
}
- checkNoOverlappingSections();
+ if (Config->CheckSections)
+ checkNoOverlappingSections();
// It does not make sense try to open the file if we have error already.
if (errorCount())
diff --git a/lld/test/ELF/linkerscript/overlapping-sections.s b/lld/test/ELF/linkerscript/overlapping-sections.s
index 9929bc4aaaa..cb21a1a5fed 100644
--- a/lld/test/ELF/linkerscript/overlapping-sections.s
+++ b/lld/test/ELF/linkerscript/overlapping-sections.s
@@ -66,8 +66,10 @@
# LMA-OVERLAP-ERR-NEXT: >>> .sec1 range is [0x8000 -> 0x80FF]
# LMA-OVERLAP-ERR-NEXT: >>> .sec2 range is [0x8080 -> 0x817F]
-# check that we create the expected binary with --noinhibit-exec:
+# Check that we create the expected binary with --noinhibit-exec or --no-check-sections:
# RUN: ld.lld -o %t.so --script %t-lma.script %t.o -shared --noinhibit-exec
+# RUN: ld.lld -o %t.so --script %t-lma.script %t.o -shared --no-check-sections
+# RUN: ld.lld -o %t.so --script %t-lma.script %t.o -shared --check-sections --no-check-sections
# Verify that the .sec2 was indeed placed in a PT_LOAD where the PhysAddr
# overlaps with where .sec1 is loaded:
OpenPOWER on IntegriCloud