summaryrefslogtreecommitdiffstats
path: root/lld
diff options
context:
space:
mode:
authorEugene Leviant <evgeny.leviant@gmail.com>2016-08-15 07:24:20 +0000
committerEugene Leviant <evgeny.leviant@gmail.com>2016-08-15 07:24:20 +0000
commita5c8a685356a5c5e956723429f7c2c39f8fbcd37 (patch)
tree5a070b7e4e4f5b62e119b31f5efc36690a03bf85 /lld
parentb439dfe6babc77800d9f71d0dc5d4ef6cf676a46 (diff)
downloadbcm5719-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.cpp12
-rw-r--r--lld/test/ELF/linkerscript/linkerscript-start-end.s16
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
OpenPOWER on IntegriCloud