10#include "../linker/format.h"
11#include "../linker/module.h"
12#include "../linker/options.h"
13#include "../linker/reader.h"
14#include "../linker/section.h"
15#include "../linker/segment.h"
16#include "../linker/segment_manager.h"
17#include "../linker/writer.h"
18#include "../dumper/dumper.h"
187 static Relocation FromLinear(uint32_t address);
189 uint32_t GetOffset()
const;
191 bool operator ==(
const Relocation& other)
const;
193 bool operator <(
const Relocation& other)
const;
202 static constexpr uint32_t MAGIC_BEGIN = 0x0013EDC1;
203 static constexpr uint32_t MAGIC_END = 0xEDC10013;
204 static constexpr size_t SIZE = 19;
207 uint16_t maximum_extra_paragraphs;
208 uint16_t minimum_extra_paragraphs;
210 uint8_t lowest_used_interrupt;
211 uint8_t highest_used_interrupt;
212 uint8_t com_port_usage;
213 uint8_t lpt_port_usage;
214 uint8_t screen_usage;
218 void ReadFile(
const std::shared_ptr<Linker::Reader>& rd);
220 void WriteFile(
const std::shared_ptr<Linker::Writer>& wr)
const;
229 std::shared_ptr<Linker::Contents>
image;
235 void Clear()
override;
242 void SetFileSize(uint32_t size);
244 uint32_t GetHeaderSize()
const;
246 uint32_t GetPifOffset()
const;
248 void ReadFile(
const std::shared_ptr<Linker::Reader>& rd)
override;
251 offset_t
WriteFile(
const std::shared_ptr<Linker::Writer>& wr)
const override;
268 InitializeFields(header_align, file_align, stack);
311 unsigned FormatAdditionalSectionFlags(std::string section_name)
const override;
313 static std::vector<Linker::OptionDescription<void>> MemoryModelNames;
317 void SetModel(std::string model)
override;
319 std::shared_ptr<Linker::OptionCollector>
GetOptions()
override;
321 void SetOptions(std::map<std::string, std::string>& options)
override;
323 void OnNewSegment(std::shared_ptr<Linker::Segment> segment)
override;
347 uint32_t GetDataSize()
const;
358 std::string filename;
360 std::ifstream stream;
369 bool OpenAndCheckValidFile();
371 offset_t GetStubImageSize();
373 void WriteStubImage(std::ostream& out);
375 void WriteStubImage(
const std::shared_ptr<Linker::Writer>& wr);
389 std::string filename;
391 std::ifstream stream;
398 uint32_t original_file_size = -1;
399 uint32_t stub_file_size = 0;
400 uint16_t stub_reloc_count = 0;
401 uint32_t original_header_size = 0;
402 uint32_t stub_header_size = 0;
403 uint16_t original_reloc_offset = 0;
404 uint16_t stub_reloc_offset = 0;
406 bool OpenAndCheckValidFile();
408 offset_t GetStubImageSize();
410 void WriteStubImage(std::ostream& out);
412 void WriteStubImage(
const std::shared_ptr<Linker::Writer>& wr);
423 template <
typename T,
size_t N,
typename Predicate>
424 offset_t FindActualSignature(
const std::shared_ptr<Linker::Reader>& rd, std::array<T, N>& signature, Predicate predicate,
bool search_win386_offset =
false)
426 offset_t file_offset = rd->Tell();
427 rd->ReadData(signature);
428 if(file_offset == 0 && !predicate(signature))
431 offset_t file_end = rd->GetImageEnd();
434 uint32_t mz_image_end = rd->ReadUnsigned(2, ::LittleEndian);
435 mz_image_end = (uint32_t(rd->ReadUnsigned(2, ::LittleEndian)) << 9) - (-mz_image_end & 0x1FF);
437 uint32_t win386_header_offset = 0;
438 uint32_t ne_header_offset = 0;
441 if(search_win386_offset)
444 win386_header_offset = rd->ReadUnsigned(4, ::LittleEndian);
448 ne_header_offset = rd->ReadUnsigned(4, ::LittleEndian);
451 if(ne_header_offset != 0 && ne_header_offset + N < file_end)
453 rd->Seek(ne_header_offset);
454 rd->ReadData(signature);
457 if(predicate(signature))
459 file_offset = rd->Tell() - N;
463 if(mz_image_end != 0 && mz_image_end != ne_header_offset && mz_image_end + N < file_end)
465 rd->Seek(mz_image_end);
466 rd->ReadData(signature);
469 if(predicate(signature))
471 file_offset = rd->Tell() - N;
475 if(win386_header_offset != 0 && win386_header_offset != ne_header_offset && win386_header_offset != mz_image_end && win386_header_offset + N < file_end)
477 rd->Seek(win386_header_offset);
478 rd->ReadData(signature);
481 if(predicate(signature))
483 file_offset = rd->Tell() - N;
496 template <
typename T,
size_t N>
497 offset_t FindActualSignature(
const std::shared_ptr<Linker::Reader>& rd, std::array<T, N>& signature,
const char * expected_signature,
bool search_win386_offset =
false)
499 return FindActualSignature(
502 [expected_signature](std::array<T, N>& signature) {
return memcmp(signature.data(), expected_signature, N) == 0; },
503 search_win386_offset);
506 template <
typename T,
size_t N>
507 offset_t FindActualSignature(
const std::shared_ptr<Linker::Reader>& rd, std::array<T, N>& signature,
const char * expected_signature1,
const char * expected_signature2,
bool search_win386_offset =
false)
509 return FindActualSignature(
512 [expected_signature1, expected_signature2](std::array<T, N>& signature) {
return memcmp(signature.data(), expected_signature1, N) == 0 || memcmp(signature.data(), expected_signature2, N) == 0; },
513 search_win386_offset);
516 template <
typename T,
size_t N>
517 offset_t FindActualSignature(
const std::shared_ptr<Linker::Reader>& rd, std::array<T, N>& signature,
const char * expected_signature1,
const char * expected_signature2,
const char * expected_signature3)
519 return FindActualSignature(
522 [expected_signature1, expected_signature2, expected_signature3](std::array<T, N>& signature) {
return memcmp(signature.data(), expected_signature1, N) == 0 || memcmp(signature.data(), expected_signature2, N) == 0 || memcmp(signature.data(), expected_signature3, N) == 0; },
An abstract interface that separates structure and presentation of the data inside a file.
Definition dumper.h:1009
Encodes an object module file as a collection of sections, symbols and relocations.
Definition module.h:24
Helper class that contains the options interpreted by the format.
Definition options.h:499
Documents and handles command line options.
Definition options.h:306
A helper class to collect sections into segments.
Definition segment_manager.h:32