diff --git a/lld/ELF/ScriptParser.cpp b/lld/ELF/ScriptParser.cpp index 671a5ec4decc..4c52bfda7a70 100644 --- a/lld/ELF/ScriptParser.cpp +++ b/lld/ELF/ScriptParser.cpp @@ -988,20 +988,8 @@ OutputDesc *ScriptParser::readOverlaySectionDescription() { ctx.script->createOutputSection(readName(), getCurrentLocation()); osd->osec.inOverlay = true; expect("{"); - while (auto tok = till("}")) { - uint64_t withFlags = 0; - uint64_t withoutFlags = 0; - if (tok == "INPUT_SECTION_FLAGS") { - std::tie(withFlags, withoutFlags) = readInputSectionFlags(); - tok = till(""); - } - if (tok == "CLASS") - osd->osec.commands.push_back(make( - StringRef{}, withFlags, withoutFlags, readSectionClassName())); - else - osd->osec.commands.push_back( - readInputSectionRules(tok, withFlags, withoutFlags)); - } + while (auto tok = till("}")) + osd->osec.commands.push_back(readInputSectionDescription(tok)); osd->osec.phdrs = readOutputSectionPhdrs(); return osd; } diff --git a/lld/test/ELF/linkerscript/overlay-keep.test b/lld/test/ELF/linkerscript/overlay-keep.test new file mode 100644 index 000000000000..1b163523eead --- /dev/null +++ b/lld/test/ELF/linkerscript/overlay-keep.test @@ -0,0 +1,51 @@ +# REQUIRES: x86 +# RUN: rm -rf %t && split-file %s %t && cd %t +# RUN: llvm-mc -filetype=obj -triple=x86_64 a.s -o a.o +# RUN: ld.lld a.o --gc-sections --script nokeep.t -o a +# RUN: llvm-objdump --section-headers a | FileCheck --check-prefix=NOKEEP %s +# RUN: ld.lld a.o --gc-sections --script keep.t -o a +# RUN: llvm-objdump --section-headers a | FileCheck --check-prefix=KEEP %s + +# NOKEEP: Sections: +# NOKEEP-NEXT: Idx Name Size +# NOKEEP-NEXT: 0 00000000 +# NOKEEP-NEXT: 1 .text 00000004 +# NOKEEP-NEXT: 2 .keep1 00000000 + +# KEEP: Sections: +# KEEP-NEXT: Idx Name Size +# KEEP-NEXT: 0 00000000 +# KEEP-NEXT: 1 .text 00000004 +# KEEP-NEXT: 2 .keep1 00000004 +# KEEP-NEXT: 3 .keep2 00000004 + +#--- a.s +.global _start +_start: + .long 1 + +.section .keep1, "a" +keep1: + .long 2 + +.section .keep2, "a" +keep2: + .long 3 + +#--- nokeep.t +SECTIONS { + .text : { *(.text) } + OVERLAY 0x1000 : AT ( 0x4000 ) { + .keep1 { *(.keep1) } + .keep2 { *(.keep2) } + } +} + +#--- keep.t +SECTIONS { + .text : { *(.text) } + OVERLAY 0x1000 : AT ( 0x4000 ) { + .keep1 { KEEP(*(.keep1)) } + .keep2 { KEEP(*(.keep2)) } + } +}