1 #pragma once 2 #include "ElfFile.h" 3 #include "Core/SymbolData.h" 4 5 struct ElfRelocatorCtor 6 { 7 std::wstring symbolName; 8 size_t size; 9 }; 10 11 class CAssemblerCommand; 12 class Parser; 13 14 class IElfRelocator 15 { 16 public: ~IElfRelocator()17 virtual ~IElfRelocator() {}; 18 virtual int expectedMachine() const = 0; isDummyRelocationType(int type)19 virtual bool isDummyRelocationType(int type) const { return false; } 20 virtual bool relocateOpcode(int type, RelocationData& data) = 0; 21 virtual void setSymbolAddress(RelocationData& data, int64_t symbolAddress, int symbolType) = 0; 22 generateCtorStub(std::vector<ElfRelocatorCtor> & ctors)23 virtual std::unique_ptr<CAssemblerCommand> generateCtorStub(std::vector<ElfRelocatorCtor>& ctors) { return nullptr; } 24 }; 25 26 27 class Label; 28 29 struct ElfRelocatorSection 30 { 31 ElfSection* section; 32 size_t index; 33 ElfSection* relSection; 34 std::shared_ptr<Label> label; 35 }; 36 37 struct ElfRelocatorSymbol 38 { 39 std::shared_ptr<Label> label; 40 std::wstring name; 41 int64_t relativeAddress; 42 int64_t relocatedAddress; 43 size_t section; 44 size_t size; 45 int type; 46 }; 47 48 struct ElfRelocatorFile 49 { 50 ElfFile* elf; 51 std::vector<ElfRelocatorSection> sections; 52 std::vector<ElfRelocatorSymbol> symbols; 53 std::wstring name; 54 }; 55 56 class ElfRelocator 57 { 58 public: 59 bool init(const std::wstring& inputName); 60 bool exportSymbols(); 61 void writeSymbols(SymbolData& symData) const; 62 std::unique_ptr<CAssemblerCommand> generateCtor(const std::wstring& ctorName); 63 bool relocate(int64_t& memoryAddress); hasDataChanged()64 bool hasDataChanged() { return dataChanged; }; getData()65 const ByteArray& getData() const { return outputData; }; 66 private: 67 bool relocateFile(ElfRelocatorFile& file, int64_t& relocationAddress); 68 void loadRelocation(Elf32_Rel& rel, ByteArray& data, int offset, Endianness endianness); 69 70 ByteArray outputData; 71 std::unique_ptr<IElfRelocator> relocator; 72 std::vector<ElfRelocatorFile> files; 73 std::vector<ElfRelocatorCtor> ctors; 74 bool dataChanged; 75 }; 76