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