diff options
| author | Eugene Leviant <evgeny.leviant@gmail.com> | 2016-08-15 07:24:20 +0000 |
|---|---|---|
| committer | Eugene Leviant <evgeny.leviant@gmail.com> | 2016-08-15 07:24:20 +0000 |
| commit | a5c8a685356a5c5e956723429f7c2c39f8fbcd37 (patch) | |
| tree | 5a070b7e4e4f5b62e119b31f5efc36690a03bf85 /lld | |
| parent | b439dfe6babc77800d9f71d0dc5d4ef6cf676a46 (diff) | |
| download | bcm5719-llvm-a5c8a685356a5c5e956723429f7c2c39f8fbcd37.tar.gz bcm5719-llvm-a5c8a685356a5c5e956723429f7c2c39f8fbcd37.zip | |
[ELF] Do not add start and end symbols in case they are already defined
llvm-svn: 278657
Diffstat (limited to 'lld')
| -rw-r--r-- | lld/ELF/Writer.cpp | 12 | ||||
| -rw-r--r-- | lld/test/ELF/linkerscript/linkerscript-start-end.s | 16 |
2 files changed, 25 insertions, 3 deletions
diff --git a/lld/ELF/Writer.cpp b/lld/ELF/Writer.cpp index 416ef76a45d..108ca54afea 100644 --- a/lld/ELF/Writer.cpp +++ b/lld/ELF/Writer.cpp @@ -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); diff --git a/lld/test/ELF/linkerscript/linkerscript-start-end.s b/lld/test/ELF/linkerscript/linkerscript-start-end.s new file mode 100644 index 00000000000..b68606abc18 --- /dev/null +++ b/lld/test/ELF/linkerscript/linkerscript-start-end.s @@ -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 |

