summaryrefslogtreecommitdiffstats
path: root/lld/lib/ReaderWriter/ELF/ARM
diff options
context:
space:
mode:
authorDenis Protivensky <dprotivensky@accesssoftek.com>2015-05-20 13:39:33 +0000
committerDenis Protivensky <dprotivensky@accesssoftek.com>2015-05-20 13:39:33 +0000
commit56b12d75bf20187f96fa04573e45813b8bc8f1b8 (patch)
tree8f891181da38b31f9f0c7fd3b2ad02df0e49b056 /lld/lib/ReaderWriter/ELF/ARM
parent196390e8af67ecadbd7f735e2cdcc5e73c3c905b (diff)
downloadbcm5719-llvm-56b12d75bf20187f96fa04573e45813b8bc8f1b8.tar.gz
bcm5719-llvm-56b12d75bf20187f96fa04573e45813b8bc8f1b8.zip
[ARM] Add needed symbols during dynamic executable linking
These include _GLOBAL_OFFSET_TABLE_ and _DYNAMIC. llvm-svn: 237791
Diffstat (limited to 'lld/lib/ReaderWriter/ELF/ARM')
-rw-r--r--lld/lib/ReaderWriter/ELF/ARM/ARMExecutableWriter.h15
1 files changed, 15 insertions, 0 deletions
diff --git a/lld/lib/ReaderWriter/ELF/ARM/ARMExecutableWriter.h b/lld/lib/ReaderWriter/ELF/ARM/ARMExecutableWriter.h
index bed4e9e78d2..50d4754885d 100644
--- a/lld/lib/ReaderWriter/ELF/ARM/ARMExecutableWriter.h
+++ b/lld/lib/ReaderWriter/ELF/ARM/ARMExecutableWriter.h
@@ -17,6 +17,7 @@
namespace {
const char *gotSymbol = "_GLOBAL_OFFSET_TABLE_";
+const char *dynamicSymbol = "_DYNAMIC";
}
namespace lld {
@@ -53,6 +54,13 @@ ARMExecutableWriter::ARMExecutableWriter(ARMLinkingContext &ctx,
void ARMExecutableWriter::createImplicitFiles(
std::vector<std::unique_ptr<File>> &result) {
ExecutableWriter::createImplicitFiles(result);
+ // Add default atoms for ARM.
+ if (_ctx.isDynamic()) {
+ auto file = llvm::make_unique<RuntimeFile<ELF32LE>>(_ctx, "ARM exec file");
+ file->addAbsoluteAtom(gotSymbol);
+ file->addAbsoluteAtom(dynamicSymbol);
+ result.push_back(std::move(file));
+ }
}
void ARMExecutableWriter::finalizeDefaultAtomValues() {
@@ -68,6 +76,13 @@ void ARMExecutableWriter::finalizeDefaultAtomValues() {
gotAtom->_virtualAddr = 0;
}
+ if (auto *dynamicAtom = _armLayout.findAbsoluteAtom(dynamicSymbol)) {
+ if (auto dynamicSection = _armLayout.findOutputSection(".dynamic"))
+ dynamicAtom->_virtualAddr = dynamicSection->virtualAddr();
+ else
+ dynamicAtom->_virtualAddr = 0;
+ }
+
// Set required by gcc libc __ehdr_start symbol with pointer to ELF header
if (auto ehdr = _armLayout.findAbsoluteAtom("__ehdr_start"))
ehdr->_virtualAddr = _elfHeader->virtualAddr();
OpenPOWER on IntegriCloud