// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. #ifndef RUNTIME_PLATFORM_PE_H_ #define RUNTIME_PLATFORM_PE_H_ #include namespace dart { namespace pe { #pragma pack(push, 1) static constexpr intptr_t kPEOffsetOffset = 0x3c; static const char kPEMagic[] = {'P', 'E', '\0', '\0'}; struct coff_file_header { uint16_t machine; uint16_t num_sections; uint32_t timestamp; uint32_t symbol_table_offset; uint32_t num_symbols; uint16_t optional_header_size; uint16_t characteristics; }; // Does not include the BaseOfData field for PE32 (not PE32+) files, but we // don't need that to load a snapshot out of a PE file. struct coff_optional_header { uint16_t magic; uint8_t linker_major_version; uint8_t linker_minor_version; uint32_t code_size; uint32_t initialized_data_size; uint32_t uninitialized_data_size; uint32_t entry_point_address; uint32_t code_base_address; }; static constexpr uint16_t kPE32Magic = 0x10b; static constexpr uint16_t kPE32PlusMagic = 0x20b; static constexpr intptr_t kCoffSectionNameSize = 8; struct coff_section_header { char name[kCoffSectionNameSize]; uint32_t virtual_size; uint32_t virtual_address; uint32_t file_size; uint32_t file_offset; uint32_t relocations_offset; uint32_t line_numbers_offset; uint16_t num_relocations; uint16_t num_line_numbers; uint32_t characteristics; }; #pragma pack(pop) } // namespace pe } // namespace dart #endif // RUNTIME_PLATFORM_PE_H_