Skip to content

Commit

Permalink
[ELF] - Don't crash when --emit-relocs is used with --gc-sections
Browse files Browse the repository at this point in the history
We crashed when --emit-relocs was used
and relocated section was collected by GC.

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

llvm-svn: 313620
  • Loading branch information
George Rimar committed Sep 19, 2017
1 parent 696a7f9 commit af52534
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 1 deletion.
18 changes: 17 additions & 1 deletion lld/ELF/InputSection.cpp
Expand Up @@ -75,6 +75,22 @@ static ArrayRef<uint8_t> getSectionContents(ObjFile<ELFT> *File,
return check(File->getObj().getSectionContents(Hdr));
}

// Return true if a section with given section flags is live (will never be
// GCed) by default. If a section can be GCed, this function returns false.
static bool isLiveByDefault(uint64_t Flags, uint32_t Type) {
// If GC is enabled, all memory-mapped sections are subject of GC.
if (!Config->GcSections)
return true;
if (Flags & SHF_ALLOC)
return false;

// Besides that, relocation sections can also be GCed because their
// relocation target sections may be GCed. This doesn't really matter
// in most cases because the linker usually consumes relocation
// sections instead of emitting them, but -emit-reloc needs this.
return Type != SHT_REL && Type != SHT_RELA;
}

InputSectionBase::InputSectionBase(InputFile *File, uint64_t Flags,
uint32_t Type, uint64_t Entsize,
uint32_t Link, uint32_t Info,
Expand All @@ -83,7 +99,7 @@ InputSectionBase::InputSectionBase(InputFile *File, uint64_t Flags,
: SectionBase(SectionKind, Name, Flags, Entsize, Alignment, Type, Info,
Link),
File(File), Data(Data), Repl(this) {
Live = !Config->GcSections || !(Flags & SHF_ALLOC);
Live = isLiveByDefault(Flags, Type);
Assigned = false;
NumRelocations = 0;
AreRelocsRela = false;
Expand Down
18 changes: 18 additions & 0 deletions lld/test/ELF/emit-relocs-gc.s
@@ -0,0 +1,18 @@
# REQUIRES: x86
# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t.o

## Show that we emit .rela.bar when GC is disabled.
# RUN: ld.lld --emit-relocs %t.o -o %t
# RUN: llvm-objdump %t -section-headers | FileCheck %s --check-prefix=NOGC
# NOGC: .rela.bar

## GC collects .bar section and we exclude .rela.bar from output.
# RUN: ld.lld --gc-sections --emit-relocs --print-gc-sections %t.o -o %t \
# RUN: | FileCheck --check-prefix=MSG %s
# MSG: removing unused section from '.bar' in file
# MSG: removing unused section from '.rela.bar' in file
# RUN: llvm-objdump %t -section-headers | FileCheck %s --check-prefix=GC
# GC-NOT: rela.bar

.section .bar,"a"
.quad .bar

0 comments on commit af52534

Please sign in to comment.