[ELF] Do not add start and end symbols in case they are already defined

llvm-svn: 278657
This commit is contained in:
Eugene Leviant
2016-08-15 07:24:20 +00:00
parent b439dfe6ba
commit a5c8a68535
2 changed files with 25 additions and 3 deletions

View File

@@ -521,6 +521,13 @@ static Symbol *addOptionalSynthetic(StringRef Name,
return Symtab<ELFT>::X->addSynthetic(Name, Sec, Val);
}
template <class ELFT>
static void addSynthetic(StringRef Name, OutputSectionBase<ELFT> *Sec,
typename ELFT::uint Val) {
SymbolBody *S = Symtab<ELFT>::X->find(Name);
if (!S || S->isUndefined() || S->isShared())
Symtab<ELFT>::X->addSynthetic(Name, Sec, Val);
}
// The beginning and the ending of .rel[a].plt section are marked
// with __rel[a]_iplt_{start,end} symbols if it is a statically linked
// executable. The runtime needs these symbols in order to resolve
@@ -856,9 +863,8 @@ template <class ELFT> void Writer<ELFT>::addStartEndSymbols() {
auto Define = [&](StringRef Start, StringRef End,
OutputSectionBase<ELFT> *OS) {
if (OS) {
Symtab<ELFT>::X->addSynthetic(Start, OS, 0);
Symtab<ELFT>::X->addSynthetic(End, OS,
DefinedSynthetic<ELFT>::SectionEnd);
addSynthetic(Start, OS, 0);
addSynthetic(End, OS, DefinedSynthetic<ELFT>::SectionEnd);
} else {
addOptionalSynthetic(Start, (OutputSectionBase<ELFT> *)nullptr, 0);
addOptionalSynthetic(End, (OutputSectionBase<ELFT> *)nullptr, 0);

View File

@@ -0,0 +1,16 @@
# REQUIRES: x86
# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.o
# RUN: echo "SECTIONS { \
# RUN: .init_array : { \
# RUN: __init_array_start = .; \
# RUN: *(.init_array) \
# RUN: __init_array_end = .; } }" > %t.script
# RUN: ld.lld %t.o -script %t.script -o %t 2>&1
.globl _start
.text
_start:
nop
.section .init_array, "aw"
.quad 0