retdec
elf_format.h
Go to the documentation of this file.
1 
7 #ifndef RETDEC_FILEFORMAT_FILE_FORMAT_ELF_ELF_FORMAT_H
8 #define RETDEC_FILEFORMAT_FILE_FORMAT_ELF_ELF_FORMAT_H
9 
10 #include <unordered_map>
11 
12 #include <elfio/elfio.hpp>
13 
16 
17 namespace retdec {
18 namespace fileformat {
19 
23 class ElfFormat : public FileFormat
24 {
25  private:
30  {
32  unsigned long long address = 0;
34  unsigned long long size = 0;
36  unsigned long long entrySize = 0;
38  unsigned long long type = SHT_NULL;
40  bool plt = false;
41  };
42 
45  void initStructures();
47 
50  virtual std::size_t initSectionTableHashOffsets() override;
52 
55  ELFIO::section* addStringTable(ELFIO::section *dynamicSection, const DynamicTable &table);
56  ELFIO::section* addSymbolTable(ELFIO::section *dynamicSection, const DynamicTable &table, ELFIO::section *stringTable);
57  ELFIO::section* addRelocationTable(ELFIO::section *dynamicSection, const RelocationTableInfo &info, ELFIO::section *symbolTable);
58  ELFIO::section* addRelRelocationTable(ELFIO::section *dynamicSection, const DynamicTable &table, ELFIO::section *symbolTable);
59  ELFIO::section* addRelaRelocationTable(ELFIO::section *dynamicSection, const DynamicTable &table, ELFIO::section *symbolTable);
60  ELFIO::section* addPltRelocationTable(ELFIO::section *dynamicSection, const DynamicTable &table, ELFIO::section *symbolTable);
61  ELFIO::section* addGlobalOffsetTable(ELFIO::section *dynamicSection, const DynamicTable &table);
62  ELFIO::Elf_Half fixSymbolLink(ELFIO::Elf_Half symbolLink, ELFIO::Elf64_Addr symbolValue);
63  bool getRelocationMask(unsigned relType, std::vector<std::uint8_t> &mask);
64  void loadRelocations(const ELFIO::elfio *file, const ELFIO::section *symbolTable, std::unordered_multimap<std::string, unsigned long long> &nameAddressMap);
65  void loadSymbols(const ELFIO::elfio *file, const ELFIO::symbol_section_accessor *elfSymbolTable, const ELFIO::section *elfSection);
66  void loadSymbols(const SymbolTable &oldTab, const DynamicTable &dynTab, ELFIO::section &got);
67  void loadDynamicTable(DynamicTable &table, const ELFIO::dynamic_section_accessor *elfDynamicTable);
69  const ELFIO::dynamic_section_accessor *elfDynamicTable,
70  const ELFIO::section *sec);
71  void loadSections();
72  void loadSegments();
74  void loadInfoFromDynamicTables(DynamicTable &dynTab, ELFIO::section *sec);
77  void loadNotes();
78  void loadCoreFileMap(std::size_t offset, std::size_t size);
79  void loadCorePrStat(std::size_t offset, std::size_t size);
80  void loadCorePrPsInfo(std::size_t offset, std::size_t size);
81  void loadCoreAuxvInfo(std::size_t offset, std::size_t size);
82  void loadCoreInfo();
84  protected:
85  int elfClass;
86  ELFIO::elfio reader;
87  ELFIO::elfio writer;
88 
90  std::set<ELFIO::Elf64_Off> symtabOffsets;
92  std::set<ELFIO::Elf64_Addr> symtabAddresses;
93  public:
94  ElfFormat(std::string pathToFile, LoadFlags loadFlags = LoadFlags::NONE);
95  ElfFormat(std::istream &inputStream, LoadFlags loadFlags = LoadFlags::NONE);
96  ElfFormat(const std::uint8_t *data, std::size_t size, LoadFlags loadFlags = LoadFlags::NONE);
97 
100  virtual retdec::utils::Endianness getEndianness() const override;
101  virtual std::size_t getBytesPerWord() const override;
102  virtual bool hasMixedEndianForDouble() const override;
104 
107  virtual std::size_t getDeclaredFileLength() const override;
108  virtual bool areSectionsValid() const override;
109  virtual bool isObjectFile() const override;
110  virtual bool isDll() const override;
111  virtual bool isExecutable() const override;
112  virtual bool getMachineCode(unsigned long long &result) const override;
113  virtual bool getAbiVersion(unsigned long long &result) const override;
114  virtual bool getImageBaseAddress(unsigned long long &imageBase) const override;
115  virtual bool getEpAddress(unsigned long long &result) const override;
116  virtual bool getEpOffset(unsigned long long &epOffset) const override;
117  virtual Architecture getTargetArchitecture() const override;
118  virtual std::size_t getDeclaredNumberOfSections() const override;
119  virtual std::size_t getDeclaredNumberOfSegments() const override;
120  virtual std::size_t getSectionTableOffset() const override;
121  virtual std::size_t getSectionTableEntrySize() const override;
122  virtual std::size_t getSegmentTableOffset() const override;
123  virtual std::size_t getSegmentTableEntrySize() const override;
125 
128  std::size_t getTypeOfFile() const;
129  std::size_t getFileVersion() const;
130  std::size_t getFileHeaderVersion() const;
131  std::size_t getFileHeaderSize() const;
132  std::size_t getFileFlags() const;
133  std::size_t getOsOrAbi() const;
134  std::size_t getOsOrAbiVersion() const;
135  std::size_t getSectionTableSize() const;
136  std::size_t getSegmentTableSize() const;
137  int getElfClass() const;
138  bool isWiiPowerPc() const;
140 
143  unsigned long long getBaseOffset() const;
145 };
146 
147 } // namespace fileformat
148 } // namespace retdec
149 
150 #endif
Definition: dynamic_table.h:21
Definition: elf_format.h:24
virtual bool areSectionsValid() const override
Definition: elf_format.cpp:2622
virtual bool isObjectFile() const override
Definition: elf_format.cpp:2627
void loadNotes()
Definition: elf_format.cpp:2274
virtual bool getEpOffset(unsigned long long &epOffset) const override
Definition: elf_format.cpp:2703
ELFIO::elfio reader
parser of input ELF file
Definition: elf_format.h:86
virtual bool getAbiVersion(unsigned long long &result) const override
Definition: elf_format.cpp:2648
std::size_t getTypeOfFile() const
Definition: elf_format.cpp:2810
ELFIO::Elf_Half fixSymbolLink(ELFIO::Elf_Half symbolLink, ELFIO::Elf64_Addr symbolValue)
Definition: elf_format.cpp:1531
virtual bool hasMixedEndianForDouble() const override
Definition: elf_format.cpp:2605
ELFIO::section * addStringTable(ELFIO::section *dynamicSection, const DynamicTable &table)
Definition: elf_format.cpp:1163
std::set< ELFIO::Elf64_Addr > symtabAddresses
Addresses of already read symbol tables.
Definition: elf_format.h:92
virtual std::size_t getDeclaredFileLength() const override
Definition: elf_format.cpp:2616
void initStructures()
Definition: elf_format.cpp:1119
ELFIO::section * addSymbolTable(ELFIO::section *dynamicSection, const DynamicTable &table, ELFIO::section *stringTable)
Definition: elf_format.cpp:1228
std::size_t getSectionTableSize() const
Definition: elf_format.cpp:2875
std::size_t getSegmentTableSize() const
Definition: elf_format.cpp:2884
virtual std::size_t getDeclaredNumberOfSegments() const override
Definition: elf_format.cpp:2781
ElfFormat(std::string pathToFile, LoadFlags loadFlags=LoadFlags::NONE)
Definition: elf_format.cpp:1087
virtual bool getEpAddress(unsigned long long &result) const override
Definition: elf_format.cpp:2672
virtual std::size_t getSectionTableEntrySize() const override
Definition: elf_format.cpp:2791
bool isWiiPowerPc() const
Definition: elf_format.cpp:2902
virtual std::size_t getDeclaredNumberOfSections() const override
Definition: elf_format.cpp:2776
virtual std::size_t initSectionTableHashOffsets() override
Definition: elf_format.cpp:1138
void loadCoreFileMap(std::size_t offset, std::size_t size)
Definition: elf_format.cpp:2324
int getElfClass() const
Definition: elf_format.cpp:2894
void loadInfoFromDynamicSegment()
Definition: elf_format.cpp:2042
ELFIO::section * addRelRelocationTable(ELFIO::section *dynamicSection, const DynamicTable &table, ELFIO::section *symbolTable)
Definition: elf_format.cpp:1351
std::size_t getFileVersion() const
Definition: elf_format.cpp:2819
void loadNoteSecSeg(ElfNoteSecSeg &noteSecSegs) const
Definition: elf_format.cpp:2191
void loadInfoFromDynamicTables(DynamicTable &dynTab, ELFIO::section *sec)
Definition: elf_format.cpp:2142
void loadDynamicSegmentSection()
Definition: elf_format.cpp:1999
std::size_t getOsOrAbi() const
Definition: elf_format.cpp:2855
virtual std::size_t getSegmentTableOffset() const override
Definition: elf_format.cpp:2796
std::size_t getFileHeaderVersion() const
Definition: elf_format.cpp:2828
ELFIO::elfio writer
parser of auxiliary ELF object which is needed for fixing representation of input file
Definition: elf_format.h:87
std::set< ELFIO::Elf64_Off > symtabOffsets
Offsets of already read symbol tables.
Definition: elf_format.h:90
std::size_t getFileHeaderSize() const
Definition: elf_format.cpp:2837
ELFIO::section * addRelaRelocationTable(ELFIO::section *dynamicSection, const DynamicTable &table, ELFIO::section *symbolTable)
Definition: elf_format.cpp:1382
void loadDynamicTable(DynamicTable &table, const ELFIO::dynamic_section_accessor *elfDynamicTable)
Definition: elf_format.cpp:2113
virtual bool getImageBaseAddress(unsigned long long &imageBase) const override
Definition: elf_format.cpp:2665
virtual std::size_t getSegmentTableEntrySize() const override
Definition: elf_format.cpp:2801
virtual retdec::utils::Endianness getEndianness() const override
Definition: elf_format.cpp:2553
void loadSegments()
Definition: elf_format.cpp:1973
ELFIO::section * addPltRelocationTable(ELFIO::section *dynamicSection, const DynamicTable &table, ELFIO::section *symbolTable)
Definition: elf_format.cpp:1413
ELFIO::section * addGlobalOffsetTable(ELFIO::section *dynamicSection, const DynamicTable &table)
Definition: elf_format.cpp:1470
void loadCorePrStat(std::size_t offset, std::size_t size)
Definition: elf_format.cpp:2382
unsigned long long getBaseOffset() const
Definition: elf_format.cpp:2920
std::size_t getOsOrAbiVersion() const
Definition: elf_format.cpp:2866
void loadSections()
Definition: elf_format.cpp:1909
virtual bool getMachineCode(unsigned long long &result) const override
Definition: elf_format.cpp:2642
void loadRelocations(const ELFIO::elfio *file, const ELFIO::section *symbolTable, std::unordered_multimap< std::string, unsigned long long > &nameAddressMap)
Definition: elf_format.cpp:1630
void loadCoreInfo()
Definition: elf_format.cpp:2506
ELFIO::section * addRelocationTable(ELFIO::section *dynamicSection, const RelocationTableInfo &info, ELFIO::section *symbolTable)
Definition: elf_format.cpp:1293
int elfClass
class of input ELF file
Definition: elf_format.h:85
void loadCoreAuxvInfo(std::size_t offset, std::size_t size)
Definition: elf_format.cpp:2485
virtual std::size_t getSectionTableOffset() const override
Definition: elf_format.cpp:2786
virtual bool isExecutable() const override
Definition: elf_format.cpp:2637
bool getRelocationMask(unsigned relType, std::vector< std::uint8_t > &mask)
Definition: elf_format.cpp:1556
virtual std::size_t getBytesPerWord() const override
Definition: elf_format.cpp:2566
void loadCorePrPsInfo(std::size_t offset, std::size_t size)
Definition: elf_format.cpp:2461
void loadSymbols(const ELFIO::elfio *file, const ELFIO::symbol_section_accessor *elfSymbolTable, const ELFIO::section *elfSection)
Definition: elf_format.cpp:1715
virtual Architecture getTargetArchitecture() const override
Definition: elf_format.cpp:2750
std::size_t getFileFlags() const
Definition: elf_format.cpp:2846
virtual bool isDll() const override
Definition: elf_format.cpp:2632
Definition: elf_notes.h:42
Definition: file_format.h:45
std::vector< ElfNoteSecSeg > noteSecSegs
note sections or segemnts found in ELF file
Definition: file_format.h:79
LoadFlags loadFlags
load flags for configurable file loading
Definition: file_format.h:51
Definition: symbol_table.h:22
Definition of FileFormat class.
Class for ELF note section (segment).
LoadFlags
Definition: fftypes.h:69
@ NONE
Definition: fftypes.h:70
Architecture
Definition: fftypes.h:59
Endianness
Definition: byte_value_storage.h:21
Definition: archive_wrapper.h:19
unsigned long long type
type of relocations (SHT_REL or SHT_RELA)
Definition: elf_format.h:38
unsigned long long address
start address of relocation table
Definition: elf_format.h:32
unsigned long long size
size of table
Definition: elf_format.h:34
unsigned long long entrySize
size of one entry in table
Definition: elf_format.h:36
bool plt
associated with Procedure Linkage Table.
Definition: elf_format.h:40