mirror of
https://github.com/intel/llvm.git
synced 2026-01-20 01:58:44 +08:00
[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:
@@ -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;
|
||||
}
|
||||
|
||||
21
lld/test/ELF/linkerscript/empty-link-order.test
Normal file
21
lld/test/ELF/linkerscript/empty-link-order.test
Normal 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: ]
|
||||
Reference in New Issue
Block a user