Index: lld/trunk/ELF/LinkerScript.cpp =================================================================== --- lld/trunk/ELF/LinkerScript.cpp +++ lld/trunk/ELF/LinkerScript.cpp @@ -380,7 +380,10 @@ // For -emit-relocs we have to ignore entries like // .rela.dyn : { *(.rela.data) } // which are common because they are in the default bfd script. - if (Sec->Type == SHT_REL || Sec->Type == SHT_RELA) + // We do not ignore SHT_REL[A] linker-synthesized sections here because + // want to support scripts that do custom layout for them. + if (!isa(Sec) && + (Sec->Type == SHT_REL || Sec->Type == SHT_RELA)) continue; std::string Filename = getFilename(Sec->File); @@ -405,7 +408,7 @@ void LinkerScript::discard(ArrayRef V) { for (InputSection *S : V) { if (S == InX::ShStrTab || S == InX::Dynamic || S == InX::DynSymTab || - S == InX::DynStrTab) + S == InX::DynStrTab || S == InX::RelaPlt || S == InX::RelaDyn) error("discarding " + S->Name + " section is not allowed"); // You can discard .hash and .gnu.hash sections by linker scripts. Since Index: lld/trunk/test/ELF/linkerscript/discard-section-err.s =================================================================== --- lld/trunk/test/ELF/linkerscript/discard-section-err.s +++ lld/trunk/test/ELF/linkerscript/discard-section-err.s @@ -22,4 +22,14 @@ # RUN: FileCheck -check-prefix=DYNSTR %s # DYNSTR: discarding .dynstr section is not allowed +# RUN: echo "SECTIONS { /DISCARD/ : { *(.rela.plt) } }" > %t.script +# RUN: not ld.lld -pie -o %t --script %t.script %t.o 2>&1 | \ +# RUN: FileCheck -check-prefix=RELAPLT %s +# RELAPLT: discarding .rela.plt section is not allowed + +# RUN: echo "SECTIONS { /DISCARD/ : { *(.rela.dyn) } }" > %t.script +# RUN: not ld.lld -pie -o %t --script %t.script %t.o 2>&1 | \ +# RUN: FileCheck -check-prefix=RELADYN %s +# RELADYN: discarding .rela.dyn section is not allowed + .comm foo,4,4 Index: lld/trunk/test/ELF/linkerscript/synthetic-relsec-layout.s =================================================================== --- lld/trunk/test/ELF/linkerscript/synthetic-relsec-layout.s +++ lld/trunk/test/ELF/linkerscript/synthetic-relsec-layout.s @@ -0,0 +1,16 @@ +# REQUIRES: x86 +# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.o +# RUN: echo "SECTIONS { .foo : { *(.rela.dyn) } }" > %t.script +# RUN: ld.lld -T %t.script %t.o -o %t.so -shared +# RUN: llvm-readobj -r %t.so | FileCheck %s + +# Check we are able to do custom layout for synthetic sections. +# (here we check we can place synthetic .rela.dyn into .foo). + +# CHECK: Relocations [ +# CHECK: Section ({{.*}}) .foo { +# CHECK: R_X86_64_64 .foo 0x0 +# CHECK: } + +.data +.quad .foo