header.S (4479B)
1 /* PE32+ header for UEFI booting */ 2 3 #include "pe.h" 4 5 #include "voffset.h" 6 7 #define ALIGN_NEXT(v, align) (((v) + ((align) - 1)) & ~((align) - 1)) 8 9 HEADER: 10 11 MSDOS_HDR: 12 MSDOS_HDR.e_magic: .short IMAGE_DOS_SIGNATURE 13 .short 0 14 .fill 14, 4, 0x00000000 15 MSDOS_HDR.e_lfanew: .int (PE_HDR - MSDOS_HDR) 16 MSDOS_HDR_END: 17 18 MSDOS_STUB: 19 .fill 16, 4, 0x00000000 20 MSDOS_STUB_END: 21 22 PE_HDR: 23 PE_HDR.PEMagic: .int IMAGE_NT_SIGNATURE 24 25 #if defined(__KERNEL_AMD64__) 26 PE_HDR.Machine: .short IMAGE_FILE_MACHINE_AMD64 27 #elif defined(__KERNEL_ARM64__) 28 PE_HDR.Machine: .short IMAGE_FILE_MACHINE_ARM64 29 #elif defined(__KERNEL_RISCV64__) 30 PE_HDR.Machine: .short IMAGE_FILE_MACHINE_RISCV64 31 #else 32 #error "Unknown target architecture, must be one of: amd64 arm64" 33 #endif 34 35 PE_HDR.NumberOfSections: .short ((SECTION_HDRS_END - SECTION_HDRS) / 40) 36 PE_HDR.TimeDateStamp: .int 0 37 PE_HDR.PointerToSymbolTable: .int 0 38 PE_HDR.NumberOfSymbols: .int 0 39 PE_HDR.SizeOfOptionalHeader: .short PEOPT_HDR_END - PEOPT_HDR 40 PE_HDR.Characteristics: .short IMAGE_FILE_LARGE_ADDRESS_AWARE | \ 41 IMAGE_FILE_EXECUTABLE_IMAGE 42 PE_HDR_END: 43 44 PEOPT_HDR: 45 PEOPT_HDR.PEOptMagic: .short PE32_MAGIC 46 PEOPT_HDR.MajorLinkerVersion: .byte 0 47 PEOPT_HDR.MinorLinkerVersion: .byte 0 48 PEOPT_HDR.SizeOfCode: .int (__etext - __text) 49 PEOPT_HDR.SizeOfData: .int (__edata - __data) 50 PEOPT_HDR.SizeOfBss: .int 0 51 PEOPT_HDR.AddressOfEntryPoint: .int (__efi_entry - __image) 52 PEOPT_HDR.BaseOfCode: .int (__text - __image) 53 PEOPT_HDR.BaseOfData: /* missing due to 64-bit ImageBase in 64-bit PEs*/ 54 55 PEOPT_HDR.ImageBase: .quad __image 56 PEOPT_HDR.SectionAlignment: .int __sect_alignment 57 PEOPT_HDR.FileAlignment: .int __sect_alignment 58 PEOPT_HDR.MajorOSVersion: .short 0 59 PEOPT_HDR.MinorOSVersion: .short 0 60 PEOPT_HDR.MajorImageVersion: .short 0 61 PEOPT_HDR.MinorImageVersion: .short 0 62 PEOPT_HDR.MajorSubsystemVersion:.short 0 63 PEOPT_HDR.MinorSubsystemVersion:.short 0 64 PEOPT_HDR.Win32VersionValue: .int 0 65 PEOPT_HDR.SizeOfImage: .int ALIGN_NEXT(__eimage - __image, __sect_alignment) 66 PEOPT_HDR.SizeOfHeaders: .int ALIGN_NEXT(__ehead - __head, __sect_alignment) 67 PEOPT_HDR.Checksum: .int 0 68 PEOPT_HDR.Subsystem: .short IMAGE_SUBSYSTEM_EFI_APPLICATION 69 PEOPT_HDR.DllCharacteristics: .short IMAGE_DLLCHARACTERISTICS_NX_COMPAT 70 PEOPT_HDR.SizeOfStackReserve: .quad 0x100000 71 PEOPT_HDR.SizeOfStackCommit: .quad 0x1000 72 PEOPT_HDR.SizeOfHeapReserve: .quad 0x100000 73 PEOPT_HDR.SizeOfHeapCommit: .quad 0x1000 74 PEOPT_HDR.LoaderFlags: .int 0 75 76 PEOPT_HDR.NumberOfRvaAndSizes: .int ((DATA_DIRS_END - DATA_DIRS) / 8) 77 78 DATA_DIRS: 79 80 DATA_DIRS.ExportTable: .quad 0 81 DATA_DIRS.ImportTable: .quad 0 82 DATA_DIRS.ResourceTable: .quad 0 83 DATA_DIRS.ExceptionTable: .quad 0 84 DATA_DIRS.CertificateTable.Addr:.int (__sbcert - __image) 85 DATA_DIRS.CertificateTable.Size:.int (__esbcert - __sbcert) 86 DATA_DIRS.BaseRelocationTable: .quad 0 87 DATA_DIRS.Debug: .quad 0 88 DATA_DIRS.Architecture: .quad 0 89 DATA_DIRS.GlobalPointer: .quad 0 90 DATA_DIRS.TLSTable: .quad 0 91 DATA_DIRS.LoadConfiguration: .quad 0 92 DATA_DIRS.BoundImportTable: .quad 0 93 DATA_DIRS.ImportAddressTable: .quad 0 94 DATA_DIRS.DelayImportTable: .quad 0 95 DATA_DIRS.CLRRuntimeHeader: .quad 0 96 DATA_DIRS.Reserved: .quad 0 97 98 DATA_DIRS_END: 99 100 PEOPT_HDR_END: 101 102 SECTION_HDRS: 103 104 SECTION_CODE: 105 SECTION_CODE.Name: .ascii ".text" 106 .byte 0, 0, 0 107 SECTION_CODE.VirtualSize: .int (__etext - __text) 108 SECTION_CODE.VirtualAddress: .int (__text - __image) 109 SECTION_CODE.SizeOfRawData: .int (__etext - __text) 110 SECTION_CODE.PointerToRawData: .int (__text - __image) 111 SECTION_CODE.PointerToRelocs: .int 0 112 SECTION_CODE.PointerToLineNums: .int 0 113 SECTION_CODE.NumberOfRelocs: .short 0 114 SECTION_CODE.NumberOfLineNums: .short 0 115 SECTION_CODE.Characteristics: .int IMAGE_SCN_CNT_CODE | \ 116 IMAGE_SCN_MEM_EXECUTE | \ 117 IMAGE_SCN_MEM_READ 118 119 SECTION_DATA: 120 SECTION_DATA.Name: .ascii ".data" 121 .byte 0, 0, 0 122 SECTION_DATA.VirtualSize: .int (__edata - __data) 123 SECTION_DATA.VirtualAddress: .int (__data - __image) 124 SECTION_DATA.SizeOfRawData: .int (__edata - __data) 125 SECTION_DATA.PointerToRawData: .int (__data - __image) 126 SECTION_DATA.PointerToRelocs: .int 0 127 SECTION_DATA.PointerToLineNums: .int 0 128 SECTION_DATA.NumberOfRelocs: .short 0 129 SECTION_DATA.NumberOfLineNums: .short 0 130 SECTION_DATA.Characteristics: .int IMAGE_SCN_CNT_INITIALIZED_DATA | \ 131 IMAGE_SCN_MEM_READ | \ 132 IMAGE_SCN_MEM_WRITE 133 134 SECTION_HDRS_END: 135 136 HEADER_END: 137 138 .balign __sect_alignment, 0 139 140 .if ((HEADER_END - HEADER) > (__ehead - __head)) 141 .err "PE header overflows allocated area" 142 .endif