9#include "../linker/format.h"
10#include "../linker/image.h"
11#include "../linker/reader.h"
12#include "../linker/writer.h"
13#include "../dumper/dumper.h"
28 static const std::map<offset_t, std::string> record_type_names;
42 ComputedReference = 10,
54 offset_t record_offset;
57 Record(record_type type = record_type(0), offset_t record_offset = 0)
58 : record_offset(record_offset), type(type)
63 static std::shared_ptr<Record> ReadFile(
const std::shared_ptr<Linker::Reader>& rd);
64 virtual void ReadBody(
const std::shared_ptr<Linker::Reader>& rd);
65 virtual offset_t ImageSize()
const;
66 virtual offset_t WriteFile(
const std::shared_ptr<Linker::Writer>& wr)
const;
67 virtual void Dump(
Dumper::Dumper& dump, offset_t record_index)
const;
73 FirstRecord(record_type type = record_type(0), offset_t record_offset = 0)
74 :
Record(type, record_offset)
78 static constexpr uint8_t Nested = 0x01;
81 enum version_type : uint16_t
87 version_type version = version_type(0);
89 void ReadBody(
const std::shared_ptr<Linker::Reader>& rd)
override;
90 offset_t ImageSize()
const override;
91 offset_t WriteFile(
const std::shared_ptr<Linker::Writer>& wr)
const override;
92 void Dump(
Dumper::Dumper& dump, offset_t record_index)
const override;
98 CommentRecord(record_type type = record_type(0), offset_t record_offset = 0)
99 :
Record(type, record_offset)
103 std::shared_ptr<Linker::Contents> comments;
105 void ReadBody(
const std::shared_ptr<Linker::Reader>& rd)
override;
106 offset_t ImageSize()
const override;
107 offset_t WriteFile(
const std::shared_ptr<Linker::Writer>& wr)
const override;
108 void Dump(
Dumper::Dumper& dump, offset_t record_index)
const override;
114 DictionaryRecord(record_type type = record_type(0), offset_t record_offset = 0)
115 :
Record(type, record_offset)
118 static constexpr uint8_t DebugFlag = 0x80;
120 uint16_t first_id = 0;
121 std::vector<std::string> names;
123 void ReadBody(
const std::shared_ptr<Linker::Reader>& rd)
override;
124 offset_t ImageSize()
const override;
125 offset_t WriteFile(
const std::shared_ptr<Linker::Writer>& wr)
const override;
126 void Dump(
Dumper::Dumper& dump, offset_t record_index)
const override;
132 ModuleRecord(record_type type = record_type(0), offset_t record_offset = 0)
133 :
Record(type, record_offset)
136 static constexpr uint8_t DataFlag = 0x01;
137 static constexpr uint8_t ExternFlag = 0x08;
138 static constexpr uint8_t MainFlag = 0x10;
139 static constexpr uint8_t ForceActiveFlag = 0x80;
142 uint16_t module_id = 0;
149 void ReadBody(
const std::shared_ptr<Linker::Reader>& rd)
override;
150 offset_t ImageSize()
const override;
151 offset_t WriteFile(
const std::shared_ptr<Linker::Writer>& wr)
const override;
152 void Dump(
Dumper::Dumper& dump, offset_t record_index)
const override;
158 EntryPointRecord(record_type type = record_type(0), offset_t record_offset = 0)
159 :
Record(type, record_offset)
162 static constexpr uint8_t DataFlag = 0x01;
163 static constexpr uint8_t ExternFlag = 0x08;
164 static constexpr uint8_t MainFlag = 0x10;
167 uint16_t entry_id = 0;
170 void ReadBody(
const std::shared_ptr<Linker::Reader>& rd)
override;
171 offset_t ImageSize()
const override;
172 offset_t WriteFile(
const std::shared_ptr<Linker::Writer>& wr)
const override;
173 void Dump(
Dumper::Dumper& dump, offset_t record_index)
const override;
179 SizeRecord(record_type type = record_type(0), offset_t record_offset = 0)
180 :
Record(type, record_offset)
183 static constexpr uint8_t DataFlag = 0x01;
186 uint32_t module_size = 0;
188 void ReadBody(
const std::shared_ptr<Linker::Reader>& rd)
override;
189 offset_t ImageSize()
const override;
190 offset_t WriteFile(
const std::shared_ptr<Linker::Writer>& wr)
const override;
191 void Dump(
Dumper::Dumper& dump, offset_t record_index)
const override;
197 ContentsRecord(record_type type = record_type(0), offset_t record_offset = 0)
198 :
Record(type, record_offset)
201 static constexpr uint8_t DataFlag = 0x01;
202 static constexpr uint8_t PartialFlag = 0x08;
203 static constexpr uint8_t RepeatFlag = 0x10;
208 std::shared_ptr<Linker::Contents> contents;
210 void ReadBody(
const std::shared_ptr<Linker::Reader>& rd)
override;
211 offset_t ImageSize()
const override;
212 offset_t WriteFile(
const std::shared_ptr<Linker::Writer>& wr)
const override;
213 void Dump(
Dumper::Dumper& dump, offset_t record_index)
const override;
219 ReferenceRecord(record_type type = record_type(0), offset_t record_offset = 0)
220 :
Record(type, record_offset)
223 static constexpr uint8_t DataFlag = 0x01;
224 static constexpr uint8_t LongFlag = 0x08;
225 static constexpr uint8_t _16Flag = 0x10;
226 static constexpr uint8_t _8Flag = 0x20;
227 static constexpr uint8_t A5RelativeFlag = 0x80;
233 std::vector<uint32_t> offsets;
235 void ReadBody(
const std::shared_ptr<Linker::Reader>& rd)
override;
236 offset_t ImageSize()
const override;
237 offset_t WriteFile(
const std::shared_ptr<Linker::Writer>& wr)
const override;
238 void Dump(
Dumper::Dumper& dump, offset_t record_index)
const override;
244 FilenameRecord(record_type type = record_type(0), offset_t record_offset = 0)
245 :
Record(type, record_offset)
248 uint16_t file_id = 0;
249 ::Timestamp<Macintosh_clock> modification;
251 void ReadBody(
const std::shared_ptr<Linker::Reader>& rd)
override;
252 offset_t ImageSize()
const override;
253 offset_t WriteFile(
const std::shared_ptr<Linker::Writer>& wr)
const override;
254 void Dump(
Dumper::Dumper& dump, offset_t record_index)
const override;
261 :
Record(type, record_offset)
264 static constexpr uint8_t CodeOffset16Flag = 0x40;
265 static constexpr uint8_t FileOffset16Flag = 0x80;
268 uint16_t parent_id = 0;
269 uint16_t file_id = 0;
270 std::set<std::tuple<uint32_t, uint32_t>> file_code_offsets;
272 void ReadBody(
const std::shared_ptr<Linker::Reader>& rd)
override;
273 offset_t ImageSize()
const override;
274 offset_t WriteFile(
const std::shared_ptr<Linker::Writer>& wr)
const override;
275 void Dump(
Dumper::Dumper& dump, offset_t record_index)
const override;
282 :
Record(type, record_offset)
285 static constexpr uint8_t IsDeclarationFlag = 0x04;
286 static constexpr uint8_t FileOffset16Flag = 0x80;
289 uint16_t module_id = 0;
290 uint16_t parent_id = 0;
291 uint16_t file_id = 0;
292 uint32_t file_offset = 0;
293 enum module_kind_type : uint8_t
301 module_kind_type module_kind = module_kind_type(0);
303 void ReadBody(
const std::shared_ptr<Linker::Reader>& rd)
override;
304 offset_t ImageSize()
const override;
305 offset_t WriteFile(
const std::shared_ptr<Linker::Writer>& wr)
const override;
306 void Dump(
Dumper::Dumper& dump, offset_t record_index)
const override;
312 ModuleEndRecord(record_type type = record_type(0), offset_t record_offset = 0)
313 :
Record(type, record_offset)
316 static constexpr uint8_t IsDeclarationFlag = 0x04;
319 uint16_t module_id = 0;
320 uint32_t file_offset = 0;
322 void ReadBody(
const std::shared_ptr<Linker::Reader>& rd)
override;
323 offset_t ImageSize()
const override;
324 offset_t WriteFile(
const std::shared_ptr<Linker::Writer>& wr)
const override;
325 void Dump(
Dumper::Dumper& dump, offset_t record_index)
const override;
331 BlockBeginRecord(record_type type = record_type(0), offset_t record_offset = 0)
332 :
Record(type, record_offset)
335 static constexpr uint8_t CodeOffset16Flag = 0x40;
336 static constexpr uint8_t FileOffset16Flag = 0x80;
339 uint16_t block_id = 0;
340 uint16_t parent_id = 0;
341 uint16_t file_id = 0;
342 uint16_t file_offset = 0;
343 uint16_t code_offset = 0;
345 void ReadBody(
const std::shared_ptr<Linker::Reader>& rd)
override;
346 offset_t ImageSize()
const override;
347 offset_t WriteFile(
const std::shared_ptr<Linker::Writer>& wr)
const override;
348 void Dump(
Dumper::Dumper& dump, offset_t record_index)
const override;
354 BlockEndRecord(record_type type = record_type(0), offset_t record_offset = 0)
355 :
Record(type, record_offset)
358 uint16_t block_id = 0;
359 uint16_t file_offset = 0;
360 uint16_t code_offset = 0;
362 void ReadBody(
const std::shared_ptr<Linker::Reader>& rd)
override;
363 offset_t ImageSize()
const override;
364 offset_t WriteFile(
const std::shared_ptr<Linker::Writer>& wr)
const override;
365 void Dump(
Dumper::Dumper& dump, offset_t record_index)
const override;
372 :
Record(type, record_offset)
379 uint8_t file_delta = 0;
380 enum storage_class_type : uint8_t
389 storage_class_type storage_class = storage_class_type(0);
391 bool reference =
false;
392 enum offset_size_type : uint8_t
399 offset_size_type offset_size = offset_size_type(0);
400 std::vector<uint8_t> offset_data;
403 static constexpr uint8_t FileOffset16Flag = 0x80;
406 uint16_t parent_id = 0;
407 uint16_t file_id = 0;
408 uint32_t file_offset = 0;
409 std::vector<Identifier> identifiers;
411 void ReadBody(
const std::shared_ptr<Linker::Reader>& rd)
override;
412 offset_t ImageSize()
const override;
413 offset_t WriteFile(
const std::shared_ptr<Linker::Writer>& wr)
const override;
414 void Dump(
Dumper::Dumper& dump, offset_t record_index)
const override;
420 LocalLabelRecord(record_type type = record_type(0), offset_t record_offset = 0)
421 :
Record(type, record_offset)
425 static constexpr uint8_t IsEntryFlag = 0x08;
426 static constexpr uint8_t CodeOffset16Flag = 0x40;
427 static constexpr uint8_t FileOffset16Flag = 0x80;
430 uint16_t parent_id = 0;
431 uint16_t file_id = 0;
432 std::map<std::tuple<uint32_t, uint32_t>, uint16_t> label_ids;
434 void ReadBody(
const std::shared_ptr<Linker::Reader>& rd)
override;
435 offset_t ImageSize()
const override;
436 offset_t WriteFile(
const std::shared_ptr<Linker::Writer>& wr)
const override;
437 void Dump(
Dumper::Dumper& dump, offset_t record_index)
const override;
443 LocalTypeRecord(record_type type = record_type(0), offset_t record_offset = 0)
444 :
Record(type, record_offset)
450 uint8_t type : 3 = 0;
451 uint16_t data_offset : 13 = 0;
457 uint32_t file_offset = 0;
458 uint32_t physical_size = 0;
459 std::vector<uint8_t> type_data;
460 std::vector<Fixup> fixups;
463 static constexpr uint8_t FileOffset16Flag = 0x20;
464 static constexpr uint8_t _16Flag = 0x80;
467 uint16_t parent_id = 0;
468 uint16_t first_id = 0;
469 uint16_t file_id = 0;
470 std::vector<Declaration> declarations;
472 void ReadBody(
const std::shared_ptr<Linker::Reader>& rd)
override;
473 offset_t ImageSize()
const override;
474 offset_t WriteFile(
const std::shared_ptr<Linker::Writer>& wr)
const override;
475 void Dump(
Dumper::Dumper& dump, offset_t record_index)
const override;
478 std::vector<std::shared_ptr<Record>> records;
480 void ReadFile(
const std::shared_ptr<Linker::Reader>& rd)
override;
482 offset_t
WriteFile(
const std::shared_ptr<Linker::Writer>& wr)
const override;
An abstract interface that separates structure and presentation of the data inside a file.
Definition dumper.h:1009