diff --git a/lld/ELF/ScriptParser.cpp b/lld/ELF/ScriptParser.cpp index 4345b7bac117..f424199e4254 100644 --- a/lld/ELF/ScriptParser.cpp +++ b/lld/ELF/ScriptParser.cpp @@ -565,6 +565,7 @@ SmallVector ScriptParser::readOverlay() { addrExpr = readExpr(); expect(":"); } + bool noCrossRefs = consume("NOCROSSREFS"); Expr lmaExpr = consume("AT") ? readParenExpr() : Expr{}; expect("{"); @@ -595,6 +596,12 @@ SmallVector ScriptParser::readOverlay() { static_cast(od)->osec.memoryRegionName = std::string(regionName); } + if (noCrossRefs) { + NoCrossRefCommand cmd; + for (SectionCommand *od : v) + cmd.outputSections.push_back(static_cast(od)->osec.name); + ctx.script->noCrossRefs.push_back(std::move(cmd)); + } // According to the specification, at the end of the overlay, the location // counter should be equal to the overlay base address plus size of the diff --git a/lld/docs/ReleaseNotes.rst b/lld/docs/ReleaseNotes.rst index 43ed6fa73589..2b7b7fe52ea1 100644 --- a/lld/docs/ReleaseNotes.rst +++ b/lld/docs/ReleaseNotes.rst @@ -39,6 +39,9 @@ ELF Improvements items that kept it live during garbage collection. This is inspired by the Mach-O LLD feature of the same name. +* Linker script ``OVERLAY`` descriptions now support virtual memory regions + (e.g. ``>region``) and ``NOCROSSREFS``. + Breaking changes ---------------- diff --git a/lld/test/ELF/linkerscript/nocrossrefs.test b/lld/test/ELF/linkerscript/nocrossrefs.test index 5eb56190fe63..de0f1d0300b0 100644 --- a/lld/test/ELF/linkerscript/nocrossrefs.test +++ b/lld/test/ELF/linkerscript/nocrossrefs.test @@ -28,6 +28,10 @@ # RUN: not ld.lld a.o data.o -T 3.t 2>&1 | FileCheck %s --check-prefix=CHECK3 --implicit-check-not=error: # CHECK3: error: a.o:(.nonalloc+0x0): prohibited cross reference from '.nonalloc' to '.text' in '.text' +# RUN: not ld.lld a.o data.o -T overlay.t 2>&1 | FileCheck %s --check-prefix=OVERLAY --implicit-check-not=error: +# OVERLAY: error: a.o:(.text.start+0x11): prohibited cross reference from '.text' to 'data' in '.data' +# OVERLAY-NEXT: error: a.o:(.text.start+0x17): prohibited cross reference from '.text' to 'str1' in '.rodata' + #--- 0.t ## Some cases that do not cause errors. abs = 42; @@ -50,6 +54,17 @@ NOCROSSREFS(.text .text1 .text2 .data .rodata .data .nonalloc) abs = 42; NOCROSSREFS_TO(.text .text .text1 .text2 .data .nonalloc) +#--- overlay.t +abs = 42; +_edata = 43; +SECTIONS { + OVERLAY : NOCROSSREFS { + .text { *(.text*) } + .data { *(.data*) } + .rodata { *(.rodata*) } + } +} + #--- err1.t NOCROSSREFS ) diff --git a/lld/test/ELF/linkerscript/overlay.test b/lld/test/ELF/linkerscript/overlay.test index e230134ad554..eb451dbb0d1f 100644 --- a/lld/test/ELF/linkerscript/overlay.test +++ b/lld/test/ELF/linkerscript/overlay.test @@ -133,3 +133,11 @@ SECTIONS { # RUN: not ld.lld a.o -T unclosed.lds 2>&1 | FileCheck %s --check-prefix=UNCLOSED # UNCLOSED: error: unclosed.lds:2: unexpected EOF # UNCLOSED-NOT: {{.}} + +#--- at-nocrossrefs-order.lds +SECTIONS { OVERLAY 0x1000 : AT(0x1234) NOCROSSREFS {} } + +# RUN: not ld.lld a.o -T at-nocrossrefs-order.lds 2>&1 | FileCheck %s --check-prefix=AT-NOCROSSREFS-ORDER --strict-whitespace +# AT-NOCROSSREFS-ORDER:{{.*}}error: at-nocrossrefs-order.lds:1: { expected, but got NOCROSSREFS +# AT-NOCROSSREFS-ORDER-NEXT:>>> SECTIONS { OVERLAY 0x1000 : AT(0x1234) NOCROSSREFS {} } +# AT-NOCROSSREFS-ORDER-NEXT:>>> ^