diff options
author | Petr Hosek <phosek@chromium.org> | 2017-09-06 23:41:02 +0000 |
---|---|---|
committer | Petr Hosek <phosek@chromium.org> | 2017-09-06 23:41:02 +0000 |
commit | d7df9b20a2cac7d4c634c837762147314dd62699 (patch) | |
tree | f1a4982621095bade941f3b6d020847452a03c10 /llvm/tools/llvm-objcopy/Object.h | |
parent | 92334e07cab5deef32cf7337fce04ab30c6314d8 (diff) | |
download | bcm5719-llvm-d7df9b20a2cac7d4c634c837762147314dd62699.tar.gz bcm5719-llvm-d7df9b20a2cac7d4c634c837762147314dd62699.zip |
Reland "[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: 312680
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..61d5f80c051 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 *RelocSymbol; + 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; |