Linkerscript: do not GC non-allocated sections

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

llvm-svn: 282391
This commit is contained in:
Eugene Leviant 2016-09-26 08:32:41 +00:00
parent 5b145205b5
commit 8287b1bce1
2 changed files with 17 additions and 3 deletions

View File

@ -166,8 +166,9 @@ scanEhFrameSection(EhInputSection<ELFT> &EH,
scanEhFrameSection(EH, EObj.rels(EH.RelocSection), Enqueue);
}
// Sections listed below are special because they are used by the loader
// just by being in an ELF file. They should not be garbage-collected.
// We do not garbage-collect two types of sections:
// 1) Sections used by the loader (.init, .fini, .ctors, .dtors, .jcr)
// 2) Not allocatable sections which typically contain debugging information
template <class ELFT> static bool isReserved(InputSectionBase<ELFT> *Sec) {
switch (Sec->getSectionHdr()->sh_type) {
case SHT_FINI_ARRAY:
@ -183,7 +184,8 @@ template <class ELFT> static bool isReserved(InputSectionBase<ELFT> *Sec) {
if (isValidCIdentifier(S))
return true;
return S.startswith(".ctors") || S.startswith(".dtors") ||
bool IsAllocSec = Sec->getSectionHdr()->sh_flags & SHF_ALLOC;
return !IsAllocSec || S.startswith(".ctors") || S.startswith(".dtors") ||
S.startswith(".init") || S.startswith(".fini") ||
S.startswith(".jcr");
}

View File

@ -14,6 +14,8 @@
# NOGC: Name: .dtors
# NOGC: Name: .init
# NOGC: Name: .fini
# NOGC: Name: .debug_pubtypes
# NOGC: Name: .comment
# NOGC: Name: a
# NOGC: Name: b
# NOGC: Name: c
@ -29,6 +31,8 @@
# GC1: Name: .dtors
# GC1: Name: .init
# GC1: Name: .fini
# GC1: Name: .debug_pubtypes
# GC1: Name: .comment
# GC1: Name: a
# GC1: Name: b
# GC1: Name: c
@ -44,6 +48,8 @@
# GC2: Name: .dtors
# GC2: Name: .init
# GC2: Name: .fini
# GC2: Name: .debug_pubtypes
# GC2: Name: .comment
# GC2: Name: a
# GC2: Name: b
# GC2: Name: c
@ -100,3 +106,9 @@ y:
.section .eh_frame,"a",@unwind
.quad 0
.section .debug_pubtypes,"",@progbits
.quad 0
.section .comment,"MS",@progbits,8
.quad 0