6#include "../dumper/dumper.h"
7#include "../linker/buffer.h"
8#include "../linker/format.h"
9#include "../linker/reader.h"
10#include "../linker/writer.h"
22 static inline constexpr int GetSize(
int size) {
return size < 3 ? size : 4; }
27 static constexpr uint16_t Absolute = 0x0010;
28 static constexpr uint16_t Relative = 0x0020;
29 static constexpr uint16_t Imported = 0x0040;
30 static constexpr uint16_t Exported = 0x0080;
31 static constexpr uint16_t Entry = 0x0100;
32 static constexpr uint16_t Common = 0x2000;
34 uint16_t name_offset = 0;
36 uint16_t symbol_type = 0;
40 offset_t symbol_definition_offset = 0;
47 virtual offset_t GetLength()
const;
48 virtual offset_t GetMemorySize()
const = 0;
49 virtual void Dump(
Dumper::Dumper& dump,
unsigned index, offset_t& file_offset, offset_t& memory_offset)
const = 0;
50 virtual void Generate(
Linker::Module& module,
int& current_segment, std::array<std::shared_ptr<Linker::Section>, 16>& segments)
const;
51 static std::unique_ptr<ByteCode> ReadFile(
Linker::Reader& rd,
int& relocation_size);
59 : size(GetSize(size > 3 ? 3 : size))
63 offset_t GetMemorySize()
const override;
64 void Dump(
Dumper::Dumper& dump,
unsigned index, offset_t& file_offset, offset_t& memory_offset)
const override;
76 offset_t GetMemorySize()
const override;
77 void Dump(
Dumper::Dumper& dump,
unsigned index, offset_t& file_offset, offset_t& memory_offset)
const override;
78 void Generate(
Linker::Module& module,
int& current_segment, std::array<std::shared_ptr<Linker::Section>, 16>& segments)
const override;
90 offset_t GetMemorySize()
const override;
91 void Dump(
Dumper::Dumper& dump,
unsigned index, offset_t& file_offset, offset_t& memory_offset)
const override;
92 void Generate(
Linker::Module& module,
int& current_segment, std::array<std::shared_ptr<Linker::Section>, 16>& segments)
const override;
98 std::shared_ptr<Linker::Buffer> buffer;
100 offset_t GetLength()
const override;
101 offset_t GetMemorySize()
const override;
102 void Dump(
Dumper::Dumper& dump,
unsigned index, offset_t& file_offset, offset_t& memory_offset)
const override;
103 void Generate(
Linker::Module& module,
int& current_segment, std::array<std::shared_ptr<Linker::Section>, 16>& segments)
const override;
114 : offset(offset), segment(type & 0xF), ip_relative((type & 0x20) != 0), relocation_size(GetSize(relocation_size))
118 offset_t GetLength()
const override;
119 offset_t GetMemorySize()
const override;
120 void Dump(
Dumper::Dumper& dump,
unsigned index, offset_t& file_offset, offset_t& memory_offset)
const override;
121 void Generate(
Linker::Module& module,
int& current_segment, std::array<std::shared_ptr<Linker::Section>, 16>& segments)
const override;
128 uint16_t symbol_index;
129 std::string symbol_name;
134 SymbolRelocator(uint8_t type, uint32_t offset, uint16_t symbol_index,
int relocation_size,
int offset_size,
int index_size)
135 : offset(offset), symbol_index(symbol_index), ip_relative((type & 0x20) != 0), relocation_size(GetSize(relocation_size)), offset_size(GetSize(offset_size)), index_size(GetSize(index_size))
139 offset_t GetLength()
const override;
140 offset_t GetMemorySize()
const override;
141 void Dump(
Dumper::Dumper& dump,
unsigned index, offset_t& file_offset, offset_t& memory_offset)
const override;
142 void Generate(
Linker::Module& module,
int& current_segment, std::array<std::shared_ptr<Linker::Section>, 16>& segments)
const override;
153 operator int()
const;
154 offset& operator =(
int value);
156 int operator[](
int index)
const;
157 offset operator[](
int index);
164 offset_t file_offset = 0;
165 offset_t module_size = 0;
166 uint32_t code_offset = 0;
167 uint32_t image_size = 0;
168 uint16_t string_table_size = 0;
171 uint8_t major, minor;
174 uint32_t maximum_segment_size = 0;
176 std::array<uint32_t, 16> segment_sizes = { };
177 std::vector<Symbol> symbols;
178 offset_t string_table_offset = 0;
179 std::string module_name;
180 std::vector<std::unique_ptr<ByteCode>> data;
185 offset_t file_size = offset_t(-1);
194 cpu_type cpu = cpu_type(0);
196 std::vector<Module> modules;
208 static std::string GetDefaultSectionName(
unsigned index);
209 static std::shared_ptr<Linker::Section> GetDefaultSection(
unsigned index);
An abstract interface that separates structure and presentation of the data inside a file.
Definition dumper.h:586
Encodes an object module file as a collection of sections, symbols and relocations.
Definition module.h:24
A helper class, encapsulating functionality needed to import binary data.
Definition reader.h:16
A helper class, encapsulating functionality needed to export binary data.
Definition writer.h:15