[ELF] - Drop special flags for empty output sections.

This fixes PR36598.

LLD currently crashes when we have empty output section
with SHF_LINK_ORDER flag. This might happen if we place an 
empty synthetic section in the linker script, but keep output
section alive with the use of additional symbol, for example.

The patch fixes the issue by dropping all special flags
for empty sections.

Differential revision: https://reviews.llvm.org/D44376

llvm-svn: 327374
This commit is contained in:
George Rimar 2018-03-13 08:32:56 +00:00
parent 2371e0a1c8
commit afbf90aef9
2 changed files with 32 additions and 7 deletions

View File

@ -813,7 +813,7 @@ static bool isDiscardable(OutputSection &Sec) {
for (BaseCommand *Base : Sec.SectionCommands)
if (!isa<InputSectionDescription>(*Base))
return false;
return getInputSections(&Sec).empty();
return true;
}
void LinkerScript::adjustSectionsBeforeSorting() {
@ -845,14 +845,18 @@ void LinkerScript::adjustSectionsBeforeSorting() {
continue;
// A live output section means that some input section was added to it. It
// might have been removed (gc, or empty synthetic section), but we at least
// know the flags.
// might have been removed (if it was empty synthetic section), but we at
// least know the flags.
if (Sec->Live)
Flags = Sec->Flags & (SHF_ALLOC | SHF_WRITE | SHF_EXECINSTR);
else
Sec->Flags = Flags;
Flags = Sec->Flags;
if (isDiscardable(*Sec)) {
// We do not want to keep any special flags for output section
// in case it is empty.
bool IsEmpty = getInputSections(Sec).empty();
if (IsEmpty)
Sec->Flags = Flags & (SHF_ALLOC | SHF_WRITE | SHF_EXECINSTR);
if (IsEmpty && isDiscardable(*Sec)) {
Sec->Live = false;
Cmd = nullptr;
}

View File

@ -0,0 +1,21 @@
# REQUIRES: x86
# RUN: llvm-mc -filetype=obj -triple=arm-arm-none-eabi -o %t.o < /dev/null
SECTIONS {
.foo : {
bar = .;
*(.ARM.exidx*)
}
}
# RUN: ld.lld %t.o -o %t --script %s
## Check we do not crash and do not set SHF_LINK_ORDER flag for .foo
# RUN: llvm-readobj -s %t | FileCheck %s
# CHECK: Section {
# CHECK: Index:
# CHECK: Name: .foo
# CHECK-NEXT: Type: SHT_ARM_EXIDX
# CHECK-NEXT: Flags [
# CHECK-NEXT: SHF_ALLOC
# CHECK-NEXT: ]