[llvm-objcopy] Add support for .dynamic, .dynsym, and .dynstr
This change adds support for sections involved in dynamic loading such
as SHT_DYNAMIC, SHT_DYNSYM, and allocated string tables.
The two added binaries used for tests can be downloaded [[
https://drive.google.com/file/d/0B3gtIAmiMwZXOXE3T0RobFg4ZTg/view?usp=sharing
| here ]] and [[
https://drive.google.com/file/d/0B3gtIAmiMwZXTFJSQUJZMGxNSXc/view?usp=sharing
| here ]]
Differential Revision: https://reviews.llvm.org/D36560
llvm-svn: 313663
diff --git a/llvm/tools/llvm-objcopy/Object.h b/llvm/tools/llvm-objcopy/Object.h
index 1b7127e..7a6f013 100644
--- a/llvm/tools/llvm-objcopy/Object.h
+++ b/llvm/tools/llvm-objcopy/Object.h
@@ -194,6 +194,34 @@
}
};
+class SectionWithStrTab : public Section {
+private:
+ StringTableSection *StrTab;
+
+public:
+ SectionWithStrTab(llvm::ArrayRef<uint8_t> Data) : Section(Data) {}
+ void setStrTab(StringTableSection *StringTable) { StrTab = StringTable; }
+ void finalize() override;
+ static bool classof(const SectionBase *S);
+};
+
+class DynamicSymbolTableSection : public SectionWithStrTab {
+public:
+ DynamicSymbolTableSection(llvm::ArrayRef<uint8_t> Data)
+ : SectionWithStrTab(Data) {}
+ static bool classof(const SectionBase *S) {
+ return S->Type == llvm::ELF::SHT_DYNSYM;
+ }
+};
+
+class DynamicSection : public SectionWithStrTab {
+public:
+ DynamicSection(llvm::ArrayRef<uint8_t> Data) : SectionWithStrTab(Data) {}
+ static bool classof(const SectionBase *S) {
+ return S->Type == llvm::ELF::SHT_DYNAMIC;
+ }
+};
+
template <class ELFT> class Object {
private:
typedef std::unique_ptr<SectionBase> SecPtr;
@@ -210,6 +238,12 @@
void readProgramHeaders(const llvm::object::ELFFile<ELFT> &ElfFile);
void readSectionHeaders(const llvm::object::ELFFile<ELFT> &ElfFile);
+ SectionBase *getSection(uint16_t Index, llvm::Twine ErrMsg);
+
+ template <class T>
+ T *getSectionOfType(uint16_t Index, llvm::Twine IndexErrMsg,
+ llvm::Twine TypeErrMsg);
+
protected:
StringTableSection *SectionNames;
SymbolTableSection *SymbolTable;