diff options
| author | Denis Protivensky <dprotivensky@accesssoftek.com> | 2015-05-20 13:39:33 +0000 |
|---|---|---|
| committer | Denis Protivensky <dprotivensky@accesssoftek.com> | 2015-05-20 13:39:33 +0000 |
| commit | 56b12d75bf20187f96fa04573e45813b8bc8f1b8 (patch) | |
| tree | 8f891181da38b31f9f0c7fd3b2ad02df0e49b056 /lld/lib/ReaderWriter/ELF/ARM | |
| parent | 196390e8af67ecadbd7f735e2cdcc5e73c3c905b (diff) | |
| download | bcm5719-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.h | 15 |
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(); |

