diff options
Diffstat (limited to 'lld/lib/ReaderWriter/ELF/ARM')
| -rw-r--r-- | lld/lib/ReaderWriter/ELF/ARM/ARMLinkingContext.h | 1 | ||||
| -rw-r--r-- | lld/lib/ReaderWriter/ELF/ARM/ARMRelocationHandler.cpp | 1 | ||||
| -rw-r--r-- | lld/lib/ReaderWriter/ELF/ARM/ARMRelocationPass.cpp | 10 |
3 files changed, 10 insertions, 2 deletions
diff --git a/lld/lib/ReaderWriter/ELF/ARM/ARMLinkingContext.h b/lld/lib/ReaderWriter/ELF/ARM/ARMLinkingContext.h index 0c33e881fdd..f687713b25b 100644 --- a/lld/lib/ReaderWriter/ELF/ARM/ARMLinkingContext.h +++ b/lld/lib/ReaderWriter/ELF/ARM/ARMLinkingContext.h @@ -38,6 +38,7 @@ public: return false; assert(r.kindArch() == Reference::KindArch::ARM); switch (r.kindValue()) { + case llvm::ELF::R_ARM_GLOB_DAT: case llvm::ELF::R_ARM_TLS_TPOFF32: case llvm::ELF::R_ARM_COPY: return true; diff --git a/lld/lib/ReaderWriter/ELF/ARM/ARMRelocationHandler.cpp b/lld/lib/ReaderWriter/ELF/ARM/ARMRelocationHandler.cpp index e16379f631f..5142d4b80a9 100644 --- a/lld/lib/ReaderWriter/ELF/ARM/ARMRelocationHandler.cpp +++ b/lld/lib/ReaderWriter/ELF/ARM/ARMRelocationHandler.cpp @@ -665,6 +665,7 @@ std::error_code ARMTargetRelocationHandler::applyRelocation( case R_ARM_LDR_PC_G2: return relocR_ARM_LDR_PC_G2(loc, reloc, target, addend); case R_ARM_JUMP_SLOT: + case R_ARM_GLOB_DAT: case R_ARM_IRELATIVE: // Runtime only relocations. Ignore here. return std::error_code(); diff --git a/lld/lib/ReaderWriter/ELF/ARM/ARMRelocationPass.cpp b/lld/lib/ReaderWriter/ELF/ARM/ARMRelocationPass.cpp index 7a95362d77e..517e201b4cd 100644 --- a/lld/lib/ReaderWriter/ELF/ARM/ARMRelocationPass.cpp +++ b/lld/lib/ReaderWriter/ELF/ARM/ARMRelocationPass.cpp @@ -945,9 +945,15 @@ public: return _plt0; } + const GOTAtom *getSharedGOTEntry(const SharedLibraryAtom *sla) { + return getGOT<R_ARM_GLOB_DAT>(sla); + } + std::error_code handleGOT(const Reference &ref) { - assert(!isa<const SharedLibraryAtom>(ref.target()) && - "Shared GOT entries aren't handled yet"); + if (const auto sla = dyn_cast<const SharedLibraryAtom>(ref.target())) { + const_cast<Reference &>(ref).setTarget(getSharedGOTEntry(sla)); + return std::error_code(); + } return ARMRelocationPass::handleGOT(ref); } }; |

