summaryrefslogtreecommitdiffstats
path: root/llvm/tools/llvm-objcopy/Object.h
diff options
context:
space:
mode:
authorPetr Hosek <phosek@chromium.org>2017-09-06 23:41:02 +0000
committerPetr Hosek <phosek@chromium.org>2017-09-06 23:41:02 +0000
commitd7df9b20a2cac7d4c634c837762147314dd62699 (patch)
treef1a4982621095bade941f3b6d020847452a03c10 /llvm/tools/llvm-objcopy/Object.h
parent92334e07cab5deef32cf7337fce04ab30c6314d8 (diff)
downloadbcm5719-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.h29
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;
OpenPOWER on IntegriCloud