diff options
-rw-r--r-- | lld/ELF/Relocations.cpp | 11 | ||||
-rw-r--r-- | lld/ELF/Symbols.cpp | 3 | ||||
-rw-r--r-- | lld/ELF/Symbols.h | 1 |
3 files changed, 8 insertions, 7 deletions
diff --git a/lld/ELF/Relocations.cpp b/lld/ELF/Relocations.cpp index 131954629e2..a8d4a540384 100644 --- a/lld/ELF/Relocations.cpp +++ b/lld/ELF/Relocations.cpp @@ -525,8 +525,12 @@ template <class ELFT> static void addCopyRelSymbol(SharedSymbol *SS) { // See if this symbol is in a read-only segment. If so, preserve the symbol's // memory protection by reserving space in the .bss.rel.ro section. bool IsReadOnly = isReadOnly<ELFT>(SS); - BssSection *Sec = IsReadOnly ? InX::BssRelRo : InX::Bss; - uint64_t Off = Sec->reserveSpace(SymSize, SS->getAlignment<ELFT>()); + BssSection *Sec = make<BssSection>(IsReadOnly ? ".bss.rel.ro" : ".bss"); + Sec->reserveSpace(SymSize, SS->getAlignment<ELFT>()); + if (IsReadOnly) + InX::BssRelRo->getParent()->addSection(Sec); + else + InX::Bss->getParent()->addSection(Sec); // Look through the DSO's dynamic symbol table for aliases and create a // dynamic symbol for each one. This causes the copy relocation to correctly @@ -534,11 +538,10 @@ template <class ELFT> static void addCopyRelSymbol(SharedSymbol *SS) { for (SharedSymbol *Sym : getSymbolsAt<ELFT>(SS)) { Sym->CopyRelSec = Sec; Sym->IsPreemptible = false; - Sym->CopyRelSecOff = Off; Sym->symbol()->IsUsedInRegularObj = true; } - In<ELFT>::RelaDyn->addReloc({Target->CopyRel, Sec, Off, false, SS, 0}); + In<ELFT>::RelaDyn->addReloc({Target->CopyRel, Sec, 0, false, SS, 0}); } static void errorOrWarn(const Twine &Msg) { diff --git a/lld/ELF/Symbols.cpp b/lld/ELF/Symbols.cpp index a80034f7b5e..906d32589cd 100644 --- a/lld/ELF/Symbols.cpp +++ b/lld/ELF/Symbols.cpp @@ -110,8 +110,7 @@ static uint64_t getSymVA(const SymbolBody &Body, int64_t &Addend) { case SymbolBody::SharedKind: { auto &SS = cast<SharedSymbol>(Body); if (SS.CopyRelSec) - return SS.CopyRelSec->getParent()->Addr + SS.CopyRelSec->OutSecOff + - SS.CopyRelSecOff; + return SS.CopyRelSec->getParent()->Addr + SS.CopyRelSec->OutSecOff; if (SS.NeedsPltAddr) return Body.getPltVA(); return 0; diff --git a/lld/ELF/Symbols.h b/lld/ELF/Symbols.h index 8cea404e194..11364807874 100644 --- a/lld/ELF/Symbols.h +++ b/lld/ELF/Symbols.h @@ -243,7 +243,6 @@ public: // CopyRelSec and CopyRelSecOff are significant only when NeedsCopy is true. InputSection *CopyRelSec; - uint64_t CopyRelSecOff; private: template <class ELFT> const typename ELFT::Sym &getSym() const { |