aboutsummaryrefslogtreecommitdiff
path: root/core/elffile.h
diff options
context:
space:
mode:
Diffstat (limited to 'core/elffile.h')
-rw-r--r--core/elffile.h722
1 files changed, 722 insertions, 0 deletions
diff --git a/core/elffile.h b/core/elffile.h
new file mode 100644
index 0000000..d9809ce
--- /dev/null
+++ b/core/elffile.h
@@ -0,0 +1,722 @@
+#ifndef ELFFILE_H
+#define ELFFILE_H
+
+class ELFFile;
+class ELFArchitecture;
+class ELFSegmentList;
+class ELFDirectoryList;
+class ELFImport;
+class ELFImportList;
+class ELFFixupList;
+class ELFSymbolList;
+class ELFExportList;
+class ELFSymbol;
+class ELFStringTable;
+class ELFRelocationList;
+class ELFSectionList;
+class ELFVerneedList;
+class ELFVerneed;
+class ELFVerdefList;
+class ELFVerdef;
+class ELFRuntimeFunctionList;
+class CommonInformationEntry;
+class CommonInformationEntryList;
+
+class ELFSegment : public BaseSection
+{
+public:
+ explicit ELFSegment(ELFSegmentList *owner);
+ explicit ELFSegment(ELFSegmentList *owner, uint64_t address, uint64_t size, uint32_t physical_offset,
+ uint32_t physical_size, uint32_t flags, uint32_t type, uint64_t alignment);
+ explicit ELFSegment(ELFSegmentList *owner, const ELFSegment &src);
+ virtual ELFSegment *Clone(ISectionList *owner) const;
+ void ReadFromFile(ELFArchitecture &file);
+ size_t WriteToFile(ELFArchitecture &file);
+ virtual uint32_t type() const { return type_; }
+ virtual void set_type(uint32_t type) { type_ = type; }
+ virtual uint64_t address() const { return address_; }
+ virtual uint64_t size() const { return size_; }
+ virtual uint32_t physical_offset() const { return physical_offset_; }
+ virtual uint32_t physical_size() const { return physical_size_; }
+ virtual std::string name() const;
+ virtual uint32_t memory_type() const;
+ virtual void update_type(uint32_t mt);
+ void set_size(uint64_t size) { size_ = size; }
+ void set_physical_offset(uint32_t offset) { physical_offset_ = offset; }
+ void set_physical_size(uint32_t size) { physical_size_ = size; }
+ virtual uint32_t flags() const { return flags_; }
+ virtual void Rebase(uint64_t delta_base);
+ uint64_t alignment() const { return alignment_; }
+ uint32_t prot() const;
+private:
+ uint32_t type_;
+ uint64_t address_;
+ uint64_t size_;
+ uint32_t physical_offset_;
+ uint32_t physical_size_;
+ uint32_t flags_;
+ uint64_t alignment_;
+};
+
+class ELFSegmentList : public BaseSectionList
+{
+public:
+ explicit ELFSegmentList(ELFArchitecture *owner);
+ explicit ELFSegmentList(ELFArchitecture *owner, const ELFSegmentList &src);
+ virtual ELFSegmentList *Clone(ELFArchitecture *owner) const;
+ virtual ELFSegment *GetSectionByAddress(uint64_t address) const;
+ virtual ELFSegment *GetSectionByOffset(uint64_t offset) const;
+ ELFSegment *GetSectionByType(uint32_t type) const;
+ void ReadFromFile(ELFArchitecture &file, size_t count);
+ size_t WriteToFile(ELFArchitecture &file);
+ ELFSegment *item(size_t index) const;
+ ELFSegment *last() const;
+ ELFSegment *Add(uint64_t address, uint64_t size, uint32_t physical_offset, uint32_t physical_size, uint32_t flags,
+ uint32_t type, uint64_t alignment);
+private:
+ ELFSegment *Add();
+};
+
+class ELFSection : public BaseSection
+{
+public:
+ explicit ELFSection(ELFSectionList *owner);
+ explicit ELFSection(ELFSectionList *owner, uint64_t address, uint32_t size, uint32_t physical_offset, uint32_t flags, uint32_t type, const std::string &name);
+ explicit ELFSection(ELFSectionList *owner, const ELFSection &src);
+ virtual ELFSection *Clone(ISectionList *owner) const;
+ void ReadFromFile(ELFArchitecture &file);
+ void WriteToFile(ELFArchitecture &file);
+ void ReadName(ELFStringTable &string_table);
+ void WriteName(ELFStringTable &string_table);
+ virtual uint64_t address() const { return address_; }
+ virtual uint64_t size() const { return size_; }
+ virtual uint32_t physical_offset() const { return physical_offset_; }
+ virtual uint32_t physical_size() const { return size_; }
+ virtual std::string name() const { return name_; }
+ void set_name(const std::string &name) { name_ = name; }
+ virtual uint32_t memory_type() const { return parent_->memory_type(); }
+ virtual ELFSegment *parent() const { return parent_; }
+ virtual uint32_t flags() const { return static_cast<uint32_t>(flags_); }
+ virtual void Rebase(uint64_t delta_base);
+ virtual void update_type(uint32_t mt) { }
+ uint32_t type() const { return type_; }
+ uint32_t link() const { return link_; }
+ uint64_t entry_size() const { return entry_size_; }
+ void set_physical_offset(uint32_t physical_offset) { physical_offset_ = physical_offset; }
+ void set_size(uint32_t size) { size_ = size; }
+ uint32_t alignment() const { return addralign_; }
+ uint32_t info() const { return info_; }
+ void set_info(uint32_t info) { info_ = info; }
+ void set_link(uint32_t link) { link_ = link; }
+ void set_entry_size(uint64_t entry_size) { entry_size_ = entry_size; }
+ void RemapLinks(const std::map<size_t, size_t> &index_map);
+private:
+ ELFSegment *parent_;
+ uint64_t address_;
+ uint32_t size_;
+ uint32_t type_;
+ uint32_t physical_offset_;
+ uint32_t name_idx_;
+ std::string name_;
+ uint32_t link_;
+ uint32_t info_;
+ uint32_t addralign_;
+ uint64_t flags_;
+ uint64_t entry_size_;
+};
+
+class ELFStringTable
+{
+public:
+ ELFStringTable *Clone();
+ std::string GetString(uint32_t pos) const;
+ uint32_t AddString(const std::string &str);
+ void clear();
+ void ReadFromFile(ELFArchitecture &file);
+ void ReadFromFile(ELFArchitecture &file, const ELFSection &section);
+ size_t WriteToFile(ELFArchitecture &file);
+ size_t size() const { return data_.size(); }
+private:
+ std::vector<char> data_;
+ std::map<std::string, uint32_t> map_;
+};
+
+class ELFSectionList : public BaseSectionList
+{
+public:
+ explicit ELFSectionList(ELFArchitecture *owner);
+ explicit ELFSectionList(ELFArchitecture *owner, const ELFSectionList &src);
+ ELFSection *item(size_t index) const;
+ virtual ELFSectionList *Clone(ELFArchitecture *owner) const;
+ void ReadFromFile(ELFArchitecture &file, size_t count);
+ uint64_t WriteToFile(ELFArchitecture &file);
+ ELFSection *GetSectionByType(uint32_t type) const;
+ ELFSection *GetSectionByAddress(uint64_t address) const;
+ ELFSection *GetSectionByName(const std::string &name) const;
+ ELFSection *Add(uint64_t address, uint32_t size, uint32_t physical_offset, uint32_t flags, uint32_t type, const std::string &name);
+ ELFStringTable *string_table() { return &string_table_; }
+ void RemapLinks(const std::map<size_t, size_t> &index_map);
+private:
+ ELFSection *Add();
+
+ ELFStringTable string_table_;
+};
+
+class ELFImportFunction : public BaseImportFunction
+{
+public:
+ explicit ELFImportFunction(ELFImport *owner, uint64_t address, const std::string &name, ELFSymbol *symbol);
+ explicit ELFImportFunction(ELFImport *owner, uint64_t address, APIType type, MapFunction *map_function);
+ explicit ELFImportFunction(ELFImport *owner, const ELFImportFunction &src);
+ virtual ELFImportFunction *Clone(IImport *owner) const;
+ virtual uint64_t address() const { return address_; }
+ virtual std::string name() const { return name_; }
+ virtual std::string display_name(bool show_ret = true) const;
+ virtual void Rebase(uint64_t delta_base);
+ void set_address(uint64_t address) { address_ = address; }
+ ELFSymbol *symbol() const { return symbol_; }
+ void set_symbol(ELFSymbol *symbol) { symbol_ = symbol; }
+private:
+ uint64_t address_;
+ std::string name_;
+ ELFSymbol *symbol_;
+};
+
+class ELFImport : public BaseImport
+{
+public:
+ explicit ELFImport(ELFImportList *owner, bool is_sdk = false);
+ explicit ELFImport(ELFImportList *owner, const std::string &name);
+ explicit ELFImport(ELFImportList *owner, const ELFImport &src);
+ ELFImportFunction *item(size_t index) const;
+ ELFImportFunction *GetFunctionBySymbol(ELFSymbol *symbol) const;
+ virtual ELFImport *Clone(IImportList *owner) const;
+ virtual std::string name() const { return name_; }
+ void set_name(const std::string &name) { name_ = name; }
+ virtual bool is_sdk() const { return is_sdk_; }
+ void set_is_sdk(bool is_sdk) { is_sdk_ = is_sdk; }
+ ELFImportFunction *Add(uint64_t address, const std::string &name, ELFSymbol *symbol);
+protected:
+ virtual IImportFunction *Add(uint64_t address, APIType type, MapFunction *map_function);
+private:
+ std::string name_;
+ bool is_sdk_;
+};
+
+class ELFImportList : public BaseImportList
+{
+public:
+ explicit ELFImportList(ELFArchitecture *owner);
+ explicit ELFImportList(ELFArchitecture *owner, const ELFImportList &src);
+ virtual ELFImportList *Clone(ELFArchitecture *owner) const;
+ ELFImport *item(size_t index) const;
+ virtual ELFImportFunction *GetFunctionByAddress(uint64_t address) const;
+ virtual ELFImport *GetImportByName(const std::string &name) const;
+ void ReadFromFile(ELFArchitecture &file);
+ void Pack();
+ void WriteToFile(ELFArchitecture &file);
+protected:
+ virtual ELFImport *AddSDK();
+private:
+ ELFImport *Add(const std::string &name);
+};
+
+class ELFFixup : public BaseFixup
+{
+public:
+ explicit ELFFixup(ELFFixupList *owner, uint64_t address, OperandSize size);
+ explicit ELFFixup(ELFFixupList *owner, const ELFFixup &src);
+ virtual ELFFixup *Clone(IFixupList *owner) const;
+ virtual uint64_t address() const { return address_; }
+ virtual FixupType type() const { return ftHighLow; }
+ virtual OperandSize size() const { return size_; }
+ virtual void set_address(uint64_t address) { address_ = address; }
+ virtual void Rebase(IArchitecture &file, uint64_t delta_base);
+private:
+ uint64_t address_;
+ OperandSize size_;
+};
+
+class ELFFixupList : public BaseFixupList
+{
+public:
+ explicit ELFFixupList();
+ explicit ELFFixupList(const ELFFixupList &src);
+ virtual ELFFixupList *Clone() const;
+ ELFFixup *item(size_t index) const;
+ virtual IFixup *AddDefault(OperandSize cpu_address_size, bool is_code);
+ ELFFixup *Add(uint64_t address, OperandSize size);
+ void WriteToData(Data &data, uint64_t image_base);
+};
+
+class ELFExport : public BaseExport
+{
+public:
+ explicit ELFExport(IExportList *parent, uint64_t address);
+ explicit ELFExport(IExportList *parent, ELFSymbol *symbol);
+ explicit ELFExport(IExportList *parent, const ELFExport &src);
+ ~ELFExport();
+ virtual ELFExport *Clone(IExportList *parent) const;
+ virtual uint64_t address() const { return address_; }
+ virtual std::string name() const { return name_; }
+ virtual std::string forwarded_name() const { return std::string(); }
+ virtual std::string display_name(bool show_ret = true) const;
+ virtual APIType type() const { return type_; }
+ virtual void set_type(APIType type) { type_ = type; }
+ ELFSymbol *symbol() const { return symbol_; }
+ void set_symbol(ELFSymbol *symbol) { symbol_ = symbol; }
+ virtual void Rebase(uint64_t delta_base);
+ void set_address(uint64_t value) { address_ = value; }
+private:
+ ELFSymbol *symbol_;
+ uint64_t address_;
+ std::string name_;
+ APIType type_;
+};
+
+class ELFExportList : public BaseExportList
+{
+public:
+ explicit ELFExportList(ELFArchitecture *owner);
+ explicit ELFExportList(ELFArchitecture *owner, const ELFExportList &src);
+ virtual ELFExportList *Clone(ELFArchitecture *owner) const;
+ ELFExport *item(size_t index) const;
+ virtual std::string name() const { return std::string(); }
+ void ReadFromFile(ELFArchitecture &file);
+ virtual void ReadFromBuffer(Buffer &buffer, IArchitecture &file);
+ ELFExport *GetExportByAddress(uint64_t address) const;
+protected:
+ virtual IExport *Add(uint64_t address);
+private:
+ ELFExport *Add(ELFSymbol *symbol);
+};
+
+class ELFSymbol : public ISymbol
+{
+public:
+ explicit ELFSymbol(ELFSymbolList *owner);
+ explicit ELFSymbol(ELFSymbolList *owner, const ELFSymbol &src);
+ ~ELFSymbol();
+ virtual ELFSymbol *Clone(ELFSymbolList *owner) const;
+ void ReadFromFile(ELFArchitecture &file, const ELFStringTable &strtab);
+ size_t WriteToFile(ELFArchitecture &file, ELFStringTable &string_table);
+ void Rebase(uint64_t delta_base);
+ uint8_t type() const { return (info_ & 0x0f); }
+ uint8_t bind() const { return (info_ >> 4); }
+ void set_bind(uint8_t bind) { info_ = (bind << 4) | (info_ & 0x0f); }
+ uint64_t address() const { return address_; }
+ uint64_t value() const { return value_; }
+ std::string name() const { return name_; }
+ uint16_t section_idx() const { return section_idx_; }
+ uint32_t name_idx() const { return name_idx_; }
+ bool is_deleted() const { return is_deleted_; }
+ void set_deleted(bool value) { is_deleted_ = value; }
+ ELFSymbolList *owner() const { return owner_; }
+ uint16_t version() const { return version_; }
+ void set_version(uint16_t version) { version_ = version; }
+ bool need_hash() const { return (type() == STT_TLS) || (value_ && section_idx_); }
+ size_t size() const { return static_cast<size_t>(size_); }
+ virtual std::string display_name(bool show_ret = true) const;
+private:
+ ELFSymbolList *owner_;
+ uint64_t address_;
+ std::string name_;
+ uint8_t info_;
+ uint8_t other_;
+ uint16_t section_idx_;
+ uint32_t name_idx_;
+ uint64_t value_;
+ uint64_t size_;
+ bool is_deleted_;
+ uint16_t version_;
+};
+
+class ELFSymbolList : public ObjectList<ELFSymbol>
+{
+public:
+ explicit ELFSymbolList(bool is_dynamic);
+ explicit ELFSymbolList(const ELFSymbolList &src);
+ virtual ELFSymbolList *Clone() const;
+ void ReadFromFile(ELFArchitecture &file);
+ void WriteToFile(ELFArchitecture &file);
+ void Pack();
+ void Rebase(uint64_t delta_base);
+ ELFStringTable *string_table() { return &string_table_; }
+private:
+ ELFSymbol *Add();
+ size_t WriteHash(ELFArchitecture &file);
+ template <typename T>
+ size_t WriteGNUHash(ELFArchitecture &file);
+ size_t WriteVersym(ELFArchitecture &file);
+
+ bool is_dynamic_;
+ ELFStringTable string_table_;
+
+ // no assignment op
+ ELFSymbolList &operator =(const ELFSymbolList &);
+};
+
+class ELFVernaux : public IObject
+{
+public:
+ ELFVernaux(ELFVerneed *owner);
+ ELFVernaux(ELFVerneed *owner, const ELFVernaux &src);
+ ~ELFVernaux();
+ ELFVernaux *Clone(ELFVerneed *owner) const;
+ void ReadFromFile(ELFArchitecture &file);
+ size_t WriteToFile(ELFArchitecture &file);
+ void WriteStrings(ELFStringTable &string_table);
+ uint32_t next() const { return next_; }
+ uint32_t hash() const { return hash_; }
+ uint16_t other() const { return other_; }
+ void set_other(uint16_t other) { other_ = other; }
+private:
+ ELFVerneed *owner_;
+ uint32_t hash_;
+ uint16_t flags_;
+ uint16_t other_;
+ uint32_t name_pos_;
+ uint32_t next_;
+ std::string name_;
+};
+
+class ELFVerneed : public ObjectList<ELFVernaux>
+{
+public:
+ ELFVerneed(ELFVerneedList *owner);
+ ELFVerneed(ELFVerneedList *owner, const ELFVerneed &src);
+ ~ELFVerneed();
+ ELFVerneed *Clone(ELFVerneedList *owner) const;
+ void ReadFromFile(ELFArchitecture &file);
+ size_t WriteToFile(ELFArchitecture &file);
+ void WriteStrings(ELFStringTable &string_table);
+ ELFVernaux *GetVernaux(uint32_t hash) const;
+ uint32_t next() const { return next_; }
+ std::string file() const { return file_; }
+private:
+ ELFVernaux *Add();
+
+ ELFVerneedList *owner_;
+ uint16_t version_;
+ uint32_t file_pos_;
+ uint32_t next_;
+ std::string file_;
+};
+
+class ELFVerneedList : public ObjectList<ELFVerneed>
+{
+public:
+ explicit ELFVerneedList();
+ explicit ELFVerneedList(const ELFVerneedList &src);
+ ELFVerneedList *Clone() const;
+ void ReadFromFile(ELFArchitecture &file);
+ void WriteToFile(ELFArchitecture &file);
+ void WriteStrings(ELFStringTable &string_table);
+ ELFVerneed *GetVerneed(const std::string &name) const;
+private:
+ ELFVerneed *Add();
+};
+
+class ELFVerdaux : public IObject
+{
+public:
+ ELFVerdaux(ELFVerdef *owner);
+ ELFVerdaux(ELFVerdef *owner, const ELFVerdaux &src);
+ ~ELFVerdaux();
+ ELFVerdaux *Clone(ELFVerdef *owner) const;
+ void ReadFromFile(ELFArchitecture &file);
+ size_t WriteToFile(ELFArchitecture &file);
+ void WriteStrings(ELFStringTable &string_table);
+ uint32_t next() const { return next_; }
+private:
+ ELFVerdef *owner_;
+ uint32_t name_pos_;
+ uint32_t next_;
+ std::string name_;
+};
+
+class ELFVerdef : public ObjectList<ELFVerdaux>
+{
+public:
+ ELFVerdef(ELFVerdefList *owner);
+ ELFVerdef(ELFVerdefList *owner, const ELFVerdef &src);
+ ~ELFVerdef();
+ ELFVerdef *Clone(ELFVerdefList *owner) const;
+ void ReadFromFile(ELFArchitecture &file);
+ size_t WriteToFile(ELFArchitecture &file);
+ void WriteStrings(ELFStringTable &string_table);
+ uint32_t next() const { return next_; }
+private:
+ ELFVerdaux *Add();
+
+ ELFVerdefList *owner_;
+ uint16_t version_;
+ uint16_t flags_;
+ uint16_t ndx_;
+ uint32_t hash_;
+ uint32_t next_;
+};
+
+class ELFVerdefList : public ObjectList<ELFVerdef>
+{
+public:
+ explicit ELFVerdefList();
+ explicit ELFVerdefList(const ELFVerdefList &src);
+ ELFVerdefList *Clone() const;
+ void ReadFromFile(ELFArchitecture &file);
+ void WriteToFile(ELFArchitecture &file);
+ void WriteStrings(ELFStringTable &string_table);
+private:
+ ELFVerdef *Add();
+};
+
+class ELFRelocation : public BaseRelocation
+{
+public:
+ explicit ELFRelocation(ELFRelocationList *owner, bool is_rela, uint64_t address, OperandSize size, uint32_t type, ELFSymbol *symbol, uint64_t addend);
+ explicit ELFRelocation(ELFRelocationList *owner, const ELFRelocation &src);
+ ELFRelocation *Clone(IRelocationList *owner) const;
+ size_t WriteToFile(ELFArchitecture &file);
+ virtual void Rebase(IArchitecture &file, uint64_t delta_base);
+ ELFSymbol *symbol() const { return symbol_; }
+ void set_symbol(ELFSymbol *symbol) { symbol_ = symbol; }
+ bool is_rela() const { return is_rela_; }
+ uint32_t type() const { return type_; }
+ void set_type(uint32_t type) { type_ = type; }
+ uint64_t addend() const { return addend_; }
+ uint64_t value() const { return value_; }
+ void set_value(uint64_t value) { value_ = value; }
+private:
+ bool is_rela_;
+ uint32_t type_;
+ uint64_t addend_;
+ ELFSymbol *symbol_;
+ uint64_t value_;
+};
+
+class ELFRelocationList : public BaseRelocationList
+{
+public:
+ explicit ELFRelocationList();
+ explicit ELFRelocationList(const ELFRelocationList &src);
+ virtual ELFRelocationList *Clone() const;
+ ELFRelocation *item(size_t index) const;
+ ELFRelocation *GetRelocationByAddress(uint64_t address) const;
+ void ReadFromFile(ELFArchitecture &file);
+ void WriteToFile(ELFArchitecture &file);
+ void Pack();
+private:
+ ELFRelocation *Add(bool is_rela, uint64_t address, OperandSize size, uint32_t type, ELFSymbol *symbol, uint64_t addend);
+
+ // no assignment op
+ ELFRelocationList &operator =(const ELFRelocationList &);
+};
+
+class ELFDirectory : public BaseLoadCommand
+{
+public:
+ explicit ELFDirectory(ELFDirectoryList *owner);
+ explicit ELFDirectory(ELFDirectoryList *owner, size_t type);
+ explicit ELFDirectory(ELFDirectoryList *owner, const ELFDirectory &src);
+ virtual ELFDirectory *Clone(ILoadCommandList *owner) const;
+ virtual uint64_t address() const { return value_; }
+ virtual uint32_t size() const { return 0; }
+ virtual uint32_t type() const { return static_cast<uint32_t>(type_); }
+ virtual std::string name() const;
+ uint64_t value() const { return value_; }
+ void set_value(uint64_t value) { value_ = value; }
+ std::string str_value() const { return str_value_; }
+ void set_str_value(const std::string &str_value) { str_value_ = str_value; }
+ void ReadFromFile(ELFArchitecture &file);
+ size_t WriteToFile(ELFArchitecture &file);
+ void ReadStrings(ELFStringTable &string_table);
+ void WriteStrings(ELFStringTable &string_table);
+ virtual void Rebase(uint64_t delta_base);
+private:
+ uint64_t type_;
+ uint64_t value_;
+ std::string str_value_;
+};
+
+class ELFDirectoryList : public BaseCommandList
+{
+public:
+ explicit ELFDirectoryList(ELFArchitecture *owner);
+ explicit ELFDirectoryList(ELFArchitecture *owner, const ELFDirectoryList &src);
+ ELFDirectory *item(size_t index) const;
+ virtual ELFDirectoryList *Clone(ELFArchitecture *owner) const;
+ void ReadFromFile(ELFArchitecture &file);
+ void WriteToFile(ELFArchitecture &file);
+ ELFDirectory *Add(size_t type);
+ ELFDirectory *GetCommandByType(uint32_t type) const;
+ void ReadStrings(ELFStringTable &string_table);
+ void WriteStrings(ELFStringTable &string_table);
+private:
+ ELFDirectory *Add();
+
+ // no assignment op
+ ELFRelocationList &operator =(const ELFRelocationList &);
+};
+
+class ELFRuntimeFunction : public BaseRuntimeFunction
+{
+public:
+ explicit ELFRuntimeFunction(ELFRuntimeFunctionList *owner, uint64_t address, uint64_t begin, uint64_t end, uint64_t unwind_address, CommonInformationEntry *cie,
+ const std::vector<uint8_t> &call_frame_instructions);
+ explicit ELFRuntimeFunction(ELFRuntimeFunctionList *owner, const ELFRuntimeFunction &src);
+ virtual ELFRuntimeFunction *Clone(IRuntimeFunctionList *owner) const;
+ virtual uint64_t address() const { return address_; }
+ virtual uint64_t begin() const { return begin_; }
+ virtual uint64_t end() const { return end_; }
+ virtual uint64_t unwind_address() const { return unwind_address_; }
+ virtual void set_begin(uint64_t begin) { begin_ = begin; }
+ virtual void set_end(uint64_t end) { end_ = end; }
+ virtual void set_unwind_address(uint64_t unwind_address) { unwind_address_ = unwind_address; }
+ void set_address(uint64_t address) { address_ = address; }
+ CommonInformationEntry *cie() const { return cie_; }
+ void set_cie(CommonInformationEntry *cie) { cie_ = cie; }
+ std::vector<uint8_t> call_frame_instructions() const { return call_frame_instructions_; }
+ virtual void Parse(IArchitecture &file, IFunction &dest);
+ void Rebase(uint64_t delta_base);
+private:
+ uint64_t address_;
+ uint64_t begin_;
+ uint64_t end_;
+ uint64_t unwind_address_;
+ CommonInformationEntry *cie_;
+ std::vector<uint8_t> call_frame_instructions_;
+};
+
+class ELFRuntimeFunctionList : public BaseRuntimeFunctionList
+{
+public:
+ explicit ELFRuntimeFunctionList();
+ explicit ELFRuntimeFunctionList(const ELFRuntimeFunctionList &src);
+ ~ELFRuntimeFunctionList();
+ virtual void clear();
+ ELFRuntimeFunctionList *Clone() const;
+ ELFRuntimeFunction *item(size_t index) const;
+ void ReadFromFile(ELFArchitecture &file);
+ void WriteToFile(ELFArchitecture &file);
+ void Rebase(uint64_t delta_base);
+ virtual ELFRuntimeFunction *Add(uint64_t address, uint64_t begin, uint64_t end, uint64_t unwind_address, IRuntimeFunction *source, const std::vector<uint8_t> &call_frame_instructions);
+ virtual ELFRuntimeFunction *GetFunctionByAddress(uint64_t address) const;
+ CommonInformationEntryList *cie_list() const { return cie_list_; }
+private:
+ ELFRuntimeFunction *Add(uint64_t address, uint64_t begin, uint64_t end, uint64_t unwind_address, CommonInformationEntry *cie, const std::vector<uint8_t> &call_frame_instructions);
+
+ CommonInformationEntryList *cie_list_;
+ uint8_t version_;
+ uint8_t eh_frame_encoding_;
+ uint8_t fde_count_encoding_;
+ uint8_t fde_table_encoding_;
+
+ // no assignment op
+ ELFRuntimeFunctionList &operator =(const ELFRuntimeFunctionList &);
+};
+
+class ELFArchitecture : public BaseArchitecture
+{
+public:
+ explicit ELFArchitecture(ELFFile *owner, uint64_t offset, uint64_t size);
+ explicit ELFArchitecture(ELFFile *owner, const ELFArchitecture &src);
+ virtual ~ELFArchitecture();
+ virtual std::string name() const;
+ virtual uint32_t type() const { return cpu_; }
+ virtual OperandSize cpu_address_size() const { return cpu_address_size_; }
+ virtual uint64_t entry_point() const { return entry_point_; }
+ virtual uint64_t image_base() const { return image_base_; }
+ uint16_t file_type() const { return file_type_; }
+ uint32_t segment_alignment() const { return segment_alignment_; }
+ uint32_t file_alignment() const { return file_alignment_; }
+ virtual ELFDirectoryList *command_list() const { return directory_list_; }
+ virtual ELFSegmentList *segment_list() const { return segment_list_; }
+ virtual ELFImportList *import_list() const { return import_list_; }
+ virtual ELFExportList *export_list() const { return export_list_; }
+ virtual ELFFixupList *fixup_list() const { return fixup_list_; }
+ virtual ELFRelocationList *relocation_list() const { return relocation_list_; }
+ virtual IResourceList *resource_list() const { return NULL; }
+ virtual ISEHandlerList *seh_handler_list() const { return NULL; }
+ virtual ELFRuntimeFunctionList *runtime_function_list() const { return runtime_function_list_; }
+ virtual IFunctionList *function_list() const { return function_list_; }
+ virtual IVirtualMachineList *virtual_machine_list() const { return virtual_machine_list_; }
+ virtual ELFSectionList *section_list() const { return section_list_; }
+ OpenStatus ReadFromFile(uint32_t mode);
+ virtual bool WriteToFile();
+ virtual IArchitecture *Clone(IFile *file) const;
+ virtual ELFArchitecture *Clone(ELFFile *file) const;
+ virtual void Save(CompileContext &ctx);
+ virtual bool is_executable() const;
+ size_t shstrndx() { return shstrndx_; }
+ virtual CallingConvention calling_convention() const { return cpu_address_size() == osDWord ? ccCdecl : ccABIx64; }
+ void Rebase(uint64_t delta_base);
+ ELFSymbolList *dynsymbol_list() const { return dynsymbol_list_; }
+ ELFSymbolList *symbol_list() const { return symbol_list_; }
+ ELFVerneedList *verneed_list() const { return verneed_list_; }
+ ELFVerdefList *verdef_list() const { return verdef_list_; }
+ ELFSegment *header_segment() const { return header_segment_; }
+ uint32_t max_header_size() const { return header_size_ + resize_header_; }
+protected:
+ virtual bool Prepare(CompileContext &ctx);
+private:
+ ELFDirectoryList *directory_list_;
+ ELFSegmentList *segment_list_;
+ ELFSectionList *section_list_;
+ ELFImportList *import_list_;
+ ELFExportList *export_list_;
+ ELFFixupList *fixup_list_;
+ ELFRelocationList *relocation_list_;
+ ELFRuntimeFunctionList *runtime_function_list_;
+ IFunctionList *function_list_;
+ IVirtualMachineList *virtual_machine_list_;
+
+ uint16_t cpu_;
+ uint16_t file_type_;
+ OperandSize cpu_address_size_;
+ uint64_t image_base_;
+ uint64_t entry_point_;
+ uint32_t segment_alignment_;
+ uint32_t file_alignment_;
+ uint16_t shstrndx_;
+ uint64_t shoff_;
+ uint32_t header_offset_;
+ uint32_t header_size_;
+ uint32_t resize_header_;
+ ELFSymbolList *dynsymbol_list_;
+ ELFSymbolList *symbol_list_;
+ ELFVerneedList *verneed_list_;
+ ELFVerdefList *verdef_list_;
+ ELFSegment *header_segment_;
+ uint64_t overlay_offset_;
+
+ // no copy ctr or assignment op
+ ELFArchitecture(const ELFArchitecture &);
+ ELFArchitecture &operator =(const ELFArchitecture &);
+};
+
+class ELFFile : public IFile
+{
+public:
+ explicit ELFFile(ILog *log);
+ explicit ELFFile(const ELFFile &src, const char *file_name);
+ virtual ~ELFFile();
+ virtual std::string format_name() const;
+ ELFArchitecture *item(size_t index) const;
+ ELFFile *Clone(const char *file_name) const;
+ virtual bool Compile(CompileOptions &options);
+ virtual bool is_executable() const;
+ virtual uint32_t disable_options() const;
+protected:
+ virtual OpenStatus ReadHeader(uint32_t open_mode);
+ virtual IFile *runtime() const { return runtime_; }
+private:
+ ELFArchitecture *Add(uint64_t offset, uint64_t size);
+
+ ELFFile *runtime_;
+
+ // no copy ctr or assignment op
+ ELFFile(const ELFFile &);
+ ELFFile &operator =(const ELFFile &);
+};
+
+#endif \ No newline at end of file