summaryrefslogtreecommitdiffstats
path: root/lld/ELF/SymbolTable.cpp
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2017-01-13 19:18:11 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2017-01-13 19:18:11 +0000
commit8a59f5c79fec30f876d30f4e8347dfed64ea3df5 (patch)
tree1a5b4fb6d1b39b8c922461640fb08e40f7047108 /lld/ELF/SymbolTable.cpp
parent99a2ce2af239ca0eb3e78eba08a51ee04ee1fcb5 (diff)
downloadbcm5719-llvm-8a59f5c79fec30f876d30f4e8347dfed64ea3df5.tar.gz
bcm5719-llvm-8a59f5c79fec30f876d30f4e8347dfed64ea3df5.zip
Don't add DT_INIT/DT_FINI for undef and shared symbols.
The freebsd dynamic linker doesn't check if the value is null (and it is reasonable for it to do that). That means that producing a .so with a null DT_INIT/DT_FINI causes the base address to be called. This should fix the libreoffice build. llvm-svn: 291944
Diffstat (limited to 'lld/ELF/SymbolTable.cpp')
-rw-r--r--lld/ELF/SymbolTable.cpp8
1 files changed, 8 insertions, 0 deletions
diff --git a/lld/ELF/SymbolTable.cpp b/lld/ELF/SymbolTable.cpp
index 6afe3dde9ba..eceb6dc96e1 100644
--- a/lld/ELF/SymbolTable.cpp
+++ b/lld/ELF/SymbolTable.cpp
@@ -468,6 +468,14 @@ template <class ELFT> SymbolBody *SymbolTable<ELFT>::find(StringRef Name) {
}
template <class ELFT>
+SymbolBody *SymbolTable<ELFT>::findDefined(StringRef Name) {
+ if (SymbolBody *S = find(Name))
+ if (S->isDefined() && !S->isShared())
+ return S;
+ return nullptr;
+}
+
+template <class ELFT>
void SymbolTable<ELFT>::addLazyArchive(ArchiveFile *F,
const object::Archive::Symbol Sym) {
Symbol *S;
OpenPOWER on IntegriCloud