diff options
author | Petr Hosek <phosek@chromium.org> | 2017-09-06 16:19:48 +0000 |
---|---|---|
committer | Petr Hosek <phosek@chromium.org> | 2017-09-06 16:19:48 +0000 |
commit | bdc3e61d21eaaf1c4f5203e47d39fd8d120251ee (patch) | |
tree | 3d9e5fd5508d81d989f5cf127efedb8a47910563 /llvm/tools/llvm-objcopy/Object.h | |
parent | f43f714213d431806a292bf3888a99eefc09ea5f (diff) | |
download | bcm5719-llvm-bdc3e61d21eaaf1c4f5203e47d39fd8d120251ee.tar.gz bcm5719-llvm-bdc3e61d21eaaf1c4f5203e47d39fd8d120251ee.zip |
[llvm-objcopy] Add support for relocations
This change adds support for SHT_REL and SHT_RELA sections in
llvm-objcopy.
Patch by Jake Ehrlich
Differential Revision: https://reviews.llvm.org/D36554
llvm-svn: 312643
Diffstat (limited to 'llvm/tools/llvm-objcopy/Object.h')
-rw-r--r-- | llvm/tools/llvm-objcopy/Object.h | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/llvm/tools/llvm-objcopy/Object.h b/llvm/tools/llvm-objcopy/Object.h index c41bd36490c..1e3691b6ac4 100644 --- a/llvm/tools/llvm-objcopy/Object.h +++ b/llvm/tools/llvm-objcopy/Object.h @@ -146,6 +146,35 @@ template <class ELFT> class SymbolTableSectionImpl : public SymbolTableSection { void writeSection(llvm::FileOutputBuffer &Out) const override; }; +struct Relocation { + const Symbol *Symbol; + uint64_t Offset; + uint64_t Addend; + uint32_t Type; +}; + +template <class ELFT> class RelocationSection : public SectionBase { +private: + typedef typename ELFT::Rel Elf_Rel; + typedef typename ELFT::Rela Elf_Rela; + + std::vector<Relocation> Relocations; + SymbolTableSection *Symbols; + SectionBase *SecToApplyRel; + + template <class T> void writeRel(T *Buf) const; + +public: + void setSymTab(SymbolTableSection *StrTab) { Symbols = StrTab; } + void setSection(SectionBase *Sec) { SecToApplyRel = Sec; } + void addRelocation(Relocation Rel) { Relocations.push_back(Rel); } + void finalize() override; + void writeSection(llvm::FileOutputBuffer &Out) const override; + static bool classof(const SectionBase *S) { + return S->Type == llvm::ELF::SHT_REL || S->Type == llvm::ELF::SHT_RELA; + } +}; + template <class ELFT> class Object { private: typedef std::unique_ptr<SectionBase> SecPtr; |