diff options
-rw-r--r-- | lld/ELF/Config.h | 1 | ||||
-rw-r--r-- | lld/ELF/Driver.cpp | 2 | ||||
-rw-r--r-- | lld/ELF/Options.td | 4 | ||||
-rw-r--r-- | lld/ELF/Writer.cpp | 3 | ||||
-rw-r--r-- | lld/test/ELF/linkerscript/overlapping-sections.s | 4 |
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: |