summaryrefslogtreecommitdiffstats
path: root/lld/lib/ReaderWriter/ELF/ARM
diff options
context:
space:
mode:
Diffstat (limited to 'lld/lib/ReaderWriter/ELF/ARM')
-rw-r--r--lld/lib/ReaderWriter/ELF/ARM/ARMLinkingContext.h1
-rw-r--r--lld/lib/ReaderWriter/ELF/ARM/ARMRelocationHandler.cpp1
-rw-r--r--lld/lib/ReaderWriter/ELF/ARM/ARMRelocationPass.cpp10
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);
}
};
OpenPOWER on IntegriCloud