diff options
| author | Rafael Espindola <rafael.espindola@gmail.com> | 2017-01-13 19:18:11 +0000 |
|---|---|---|
| committer | Rafael Espindola <rafael.espindola@gmail.com> | 2017-01-13 19:18:11 +0000 |
| commit | 8a59f5c79fec30f876d30f4e8347dfed64ea3df5 (patch) | |
| tree | 1a5b4fb6d1b39b8c922461640fb08e40f7047108 /lld/ELF/SymbolTable.cpp | |
| parent | 99a2ce2af239ca0eb3e78eba08a51ee04ee1fcb5 (diff) | |
| download | bcm5719-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.cpp | 8 |
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; |

