summaryrefslogtreecommitdiff
path: root/lib/ReaderWriter/ELF/ExecutableWriter.h
diff options
context:
space:
mode:
Diffstat (limited to 'lib/ReaderWriter/ELF/ExecutableWriter.h')
-rw-r--r--lib/ReaderWriter/ELF/ExecutableWriter.h157
1 files changed, 0 insertions, 157 deletions
diff --git a/lib/ReaderWriter/ELF/ExecutableWriter.h b/lib/ReaderWriter/ELF/ExecutableWriter.h
deleted file mode 100644
index 9d9f4d9ce0a5..000000000000
--- a/lib/ReaderWriter/ELF/ExecutableWriter.h
+++ /dev/null
@@ -1,157 +0,0 @@
-//===- lib/ReaderWriter/ELF/ExecutableWriter.h ----------------------------===//
-//
-// The LLVM Linker
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-#ifndef LLD_READER_WRITER_ELF_EXECUTABLE_WRITER_H
-#define LLD_READER_WRITER_ELF_EXECUTABLE_WRITER_H
-
-#include "OutputELFWriter.h"
-
-namespace lld {
-namespace elf {
-using namespace llvm;
-using namespace llvm::object;
-
-//===----------------------------------------------------------------------===//
-// ExecutableWriter Class
-//===----------------------------------------------------------------------===//
-template<class ELFT>
-class ExecutableWriter : public OutputELFWriter<ELFT> {
-public:
- ExecutableWriter(ELFLinkingContext &ctx, TargetLayout<ELFT> &layout)
- : OutputELFWriter<ELFT>(ctx, layout) {}
-
-protected:
- void buildDynamicSymbolTable(const File &file) override;
- void createImplicitFiles(std::vector<std::unique_ptr<File>> &) override;
- void finalizeDefaultAtomValues() override;
- void createDefaultSections() override;
-
- bool isNeededTagRequired(const SharedLibraryAtom *sla) const override {
- return this->_layout.isCopied(sla);
- }
-
- unique_bump_ptr<InterpSection<ELFT>> _interpSection;
-
-private:
- std::unique_ptr<RuntimeFile<ELFT>> createRuntimeFile();
-};
-
-//===----------------------------------------------------------------------===//
-// ExecutableWriter
-//===----------------------------------------------------------------------===//
-template<class ELFT>
-void ExecutableWriter<ELFT>::buildDynamicSymbolTable(const File &file) {
- for (auto sec : this->_layout.sections())
- if (auto section = dyn_cast<AtomSection<ELFT>>(sec))
- for (const auto &atom : section->atoms()) {
- const DefinedAtom *da = dyn_cast<const DefinedAtom>(atom->_atom);
- if (!da)
- continue;
- if (da->dynamicExport() != DefinedAtom::dynamicExportAlways &&
- !this->_ctx.isDynamicallyExportedSymbol(da->name()) &&
- !(this->_ctx.shouldExportDynamic() &&
- da->scope() == Atom::Scope::scopeGlobal))
- continue;
- this->_dynamicSymbolTable->addSymbol(atom->_atom, section->ordinal(),
- atom->_virtualAddr, atom);
- }
-
- // Put weak symbols in the dynamic symbol table.
- if (this->_ctx.isDynamic()) {
- for (const UndefinedAtom *a : file.undefined()) {
- if (this->_layout.isReferencedByDefinedAtom(a) &&
- a->canBeNull() != UndefinedAtom::canBeNullNever)
- this->_dynamicSymbolTable->addSymbol(a, ELF::SHN_UNDEF);
- }
- }
-
- OutputELFWriter<ELFT>::buildDynamicSymbolTable(file);
-}
-
-template<class ELFT>
-std::unique_ptr<RuntimeFile<ELFT>> ExecutableWriter<ELFT>::createRuntimeFile() {
- auto file = llvm::make_unique<RuntimeFile<ELFT>>(this->_ctx, "C runtime");
- file->addUndefinedAtom(this->_ctx.entrySymbolName());
- file->addAbsoluteAtom("__bss_start");
- file->addAbsoluteAtom("__bss_end");
- file->addAbsoluteAtom("_end");
- file->addAbsoluteAtom("end");
- file->addAbsoluteAtom("__preinit_array_start", true);
- file->addAbsoluteAtom("__preinit_array_end", true);
- file->addAbsoluteAtom("__init_array_start", true);
- file->addAbsoluteAtom("__init_array_end", true);
- if (this->_ctx.isRelaOutputFormat()) {
- file->addAbsoluteAtom("__rela_iplt_start");
- file->addAbsoluteAtom("__rela_iplt_end");
- } else {
- file->addAbsoluteAtom("__rel_iplt_start");
- file->addAbsoluteAtom("__rel_iplt_end");
- }
- file->addAbsoluteAtom("__fini_array_start", true);
- file->addAbsoluteAtom("__fini_array_end", true);
- return file;
-}
-
-/// \brief Hook in lld to add CRuntime file
-template <class ELFT>
-void ExecutableWriter<ELFT>::createImplicitFiles(
- std::vector<std::unique_ptr<File> > &result) {
- OutputELFWriter<ELFT>::createImplicitFiles(result);
- result.push_back(createRuntimeFile());
-}
-
-template <class ELFT> void ExecutableWriter<ELFT>::createDefaultSections() {
- OutputELFWriter<ELFT>::createDefaultSections();
- if (this->_ctx.isDynamic()) {
- _interpSection.reset(new (this->_alloc) InterpSection<ELFT>(
- this->_ctx, ".interp", TargetLayout<ELFT>::ORDER_INTERP,
- this->_ctx.getInterpreter()));
- this->_layout.addSection(_interpSection.get());
- }
-}
-
-/// Finalize the value of all the absolute symbols that we
-/// created
-template <class ELFT> void ExecutableWriter<ELFT>::finalizeDefaultAtomValues() {
- OutputELFWriter<ELFT>::finalizeDefaultAtomValues();
- AtomLayout *bssStartAtom = this->_layout.findAbsoluteAtom("__bss_start");
- AtomLayout *bssEndAtom = this->_layout.findAbsoluteAtom("__bss_end");
- AtomLayout *underScoreEndAtom = this->_layout.findAbsoluteAtom("_end");
- AtomLayout *endAtom = this->_layout.findAbsoluteAtom("end");
-
- assert((bssStartAtom || bssEndAtom || underScoreEndAtom || endAtom) &&
- "Unable to find the absolute atoms that have been added by lld");
-
- this->updateScopeAtomValues("preinit_array", ".preinit_array");
- this->updateScopeAtomValues("init_array", ".init_array");
- if (this->_ctx.isRelaOutputFormat())
- this->updateScopeAtomValues("rela_iplt", ".rela.plt");
- else
- this->updateScopeAtomValues("rel_iplt", ".rel.plt");
- this->updateScopeAtomValues("fini_array", ".fini_array");
-
- auto bssSection = this->_layout.findOutputSection(".bss");
-
- // If we don't find a bss section, then don't set these values
- if (bssSection) {
- bssStartAtom->_virtualAddr = bssSection->virtualAddr();
- bssEndAtom->_virtualAddr =
- bssSection->virtualAddr() + bssSection->memSize();
- underScoreEndAtom->_virtualAddr = bssEndAtom->_virtualAddr;
- endAtom->_virtualAddr = bssEndAtom->_virtualAddr;
- } else if (auto dataSection = this->_layout.findOutputSection(".data")) {
- underScoreEndAtom->_virtualAddr =
- dataSection->virtualAddr() + dataSection->memSize();
- endAtom->_virtualAddr = underScoreEndAtom->_virtualAddr;
- }
-}
-
-} // namespace elf
-} // namespace lld
-
-#endif // LLD_READER_WRITER_ELF_EXECUTABLE_WRITER_H