summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2015-10-07 04:22:55 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2015-10-07 04:22:55 +0000
commitcea0b3b45d503a81f075f94bc9751be0fea131ba (patch)
tree2c007baf5f0a1c9dc8f9ffdcb5da72bd72e18c0a
parent55bbe664bd13fdfe1ba5d9d1600e1b3075b3847c (diff)
downloadbcm5719-llvm-cea0b3b45d503a81f075f94bc9751be0fea131ba.tar.gz
bcm5719-llvm-cea0b3b45d503a81f075f94bc9751be0fea131ba.zip
Don't create dynamic relocations for weak undefined symbols.
llvm-svn: 249520
-rw-r--r--lld/ELF/OutputSections.cpp4
-rw-r--r--lld/test/elf2/dynamic-reloc.s2
2 files changed, 5 insertions, 1 deletions
diff --git a/lld/ELF/OutputSections.cpp b/lld/ELF/OutputSections.cpp
index 6caf99069b4..9b276b2f326 100644
--- a/lld/ELF/OutputSections.cpp
+++ b/lld/ELF/OutputSections.cpp
@@ -413,7 +413,9 @@ lld::elf2::getLocalSymVA(const typename ELFFile<ELFT>::Elf_Sym *Sym,
bool lld::elf2::canBePreempted(const SymbolBody *Body) {
if (!Body)
return false;
- if (Body->isShared() || Body->isUndefined())
+ if (Body->isShared())
+ return true;
+ if (Body->isUndefined() && !Body->isWeak())
return true;
if (!Config->Shared)
return false;
diff --git a/lld/test/elf2/dynamic-reloc.s b/lld/test/elf2/dynamic-reloc.s
index 75cfde9ec4a..3fe8574fb10 100644
--- a/lld/test/elf2/dynamic-reloc.s
+++ b/lld/test/elf2/dynamic-reloc.s
@@ -59,4 +59,6 @@
.global _start
_start:
.quad bar + 0x42
+.weak foo
+.quad foo
call main
OpenPOWER on IntegriCloud