summaryrefslogtreecommitdiffstats
path: root/lld/lib/ReaderWriter
diff options
context:
space:
mode:
authorDenis Protivensky <dprotivensky@accesssoftek.com>2015-05-22 11:00:31 +0000
committerDenis Protivensky <dprotivensky@accesssoftek.com>2015-05-22 11:00:31 +0000
commit214122cffc2f7f42405253616cae3b50162b0e6c (patch)
tree874f3c57430006d6bdf2e2bf4e5720fef1ce369d /lld/lib/ReaderWriter
parent3396a8b8e6d95bc5288c392307bd60c221e3725a (diff)
downloadbcm5719-llvm-214122cffc2f7f42405253616cae3b50162b0e6c.tar.gz
bcm5719-llvm-214122cffc2f7f42405253616cae3b50162b0e6c.zip
[ARM] Implement R_ARM_GLOB_DAT for GOT entries
This is used when referencing global or static data in shared objects. This is also used when function's address is taken and function call is made indirectly. llvm-svn: 238014
Diffstat (limited to 'lld/lib/ReaderWriter')
-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