| // 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 <platform/globals.h> |
| |
| 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_ |