|
@@ -16,100 +16,10 @@
|
|
|
* either version 2 of the License, or (at your option) any later version.
|
|
|
*/
|
|
|
|
|
|
- .section .text.head
|
|
|
-
|
|
|
- /*
|
|
|
- * Magic "MZ" signature for PE/COFF
|
|
|
- */
|
|
|
- .globl ImageBase
|
|
|
-ImageBase:
|
|
|
- .ascii "MZ"
|
|
|
- .skip 58 // 'MZ' + pad + offset == 64
|
|
|
- .long pe_header - ImageBase // Offset to the PE header.
|
|
|
-pe_header:
|
|
|
- .ascii "PE"
|
|
|
- .short 0
|
|
|
-coff_header:
|
|
|
- .short 0xaa64 // AArch64
|
|
|
- .short 2 // nr_sections
|
|
|
- .long 0 // TimeDateStamp
|
|
|
- .long 0 // PointerToSymbolTable
|
|
|
- .long 0 // NumberOfSymbols
|
|
|
- .short section_table - optional_header // SizeOfOptionalHeader
|
|
|
- .short 0x206 // Characteristics.
|
|
|
- // IMAGE_FILE_DEBUG_STRIPPED |
|
|
|
- // IMAGE_FILE_EXECUTABLE_IMAGE |
|
|
|
- // IMAGE_FILE_LINE_NUMS_STRIPPED
|
|
|
-optional_header:
|
|
|
- .short 0x20b // PE32+ format
|
|
|
- .byte 0x02 // MajorLinkerVersion
|
|
|
- .byte 0x14 // MinorLinkerVersion
|
|
|
- .long _data - _start // SizeOfCode
|
|
|
- .long _data_size // SizeOfInitializedData
|
|
|
- .long 0 // SizeOfUninitializedData
|
|
|
- .long _start - ImageBase // AddressOfEntryPoint
|
|
|
- .long _start - ImageBase // BaseOfCode
|
|
|
-
|
|
|
-extra_header_fields:
|
|
|
- .quad 0 // ImageBase
|
|
|
- .long 0x1000 // SectionAlignment
|
|
|
- .long 0x200 // FileAlignment
|
|
|
- .short 0 // MajorOperatingSystemVersion
|
|
|
- .short 0 // MinorOperatingSystemVersion
|
|
|
- .short 0 // MajorImageVersion
|
|
|
- .short 0 // MinorImageVersion
|
|
|
- .short 0 // MajorSubsystemVersion
|
|
|
- .short 0 // MinorSubsystemVersion
|
|
|
- .long 0 // Win32VersionValue
|
|
|
-
|
|
|
- .long _edata - ImageBase // SizeOfImage
|
|
|
-
|
|
|
- // Everything before the kernel image is considered part of the header
|
|
|
- .long _start - ImageBase // SizeOfHeaders
|
|
|
- .long 0 // CheckSum
|
|
|
- .short EFI_SUBSYSTEM // Subsystem
|
|
|
- .short 0 // DllCharacteristics
|
|
|
- .quad 0 // SizeOfStackReserve
|
|
|
- .quad 0 // SizeOfStackCommit
|
|
|
- .quad 0 // SizeOfHeapReserve
|
|
|
- .quad 0 // SizeOfHeapCommit
|
|
|
- .long 0 // LoaderFlags
|
|
|
- .long 0x6 // NumberOfRvaAndSizes
|
|
|
-
|
|
|
- .quad 0 // ExportTable
|
|
|
- .quad 0 // ImportTable
|
|
|
- .quad 0 // ResourceTable
|
|
|
- .quad 0 // ExceptionTable
|
|
|
- .quad 0 // CertificationTable
|
|
|
- .quad 0 // BaseRelocationTable
|
|
|
-
|
|
|
- // Section table
|
|
|
-section_table:
|
|
|
- .ascii ".text\0\0\0"
|
|
|
- .long _data - _start // VirtualSize
|
|
|
- .long _start - ImageBase // VirtualAddress
|
|
|
- .long _data - _start // SizeOfRawData
|
|
|
- .long _start - ImageBase // PointerToRawData
|
|
|
-
|
|
|
- .long 0 // PointerToRelocations (0 for executables)
|
|
|
- .long 0 // PointerToLineNumbers (0 for executables)
|
|
|
- .short 0 // NumberOfRelocations (0 for executables)
|
|
|
- .short 0 // NumberOfLineNumbers (0 for executables)
|
|
|
- .long 0x60000020 // Characteristics (section flags)
|
|
|
-
|
|
|
- .ascii ".data\0\0\0"
|
|
|
- .long _data_size // VirtualSize
|
|
|
- .long _data - ImageBase // VirtualAddress
|
|
|
- .long _data_size // SizeOfRawData
|
|
|
- .long _data - ImageBase // PointerToRawData
|
|
|
-
|
|
|
- .long 0 // PointerToRelocations (0 for executables)
|
|
|
- .long 0 // PointerToLineNumbers (0 for executables)
|
|
|
- .short 0 // NumberOfRelocations (0 for executables)
|
|
|
- .short 0 // NumberOfLineNumbers (0 for executables)
|
|
|
- .long 0xc0000040 // Characteristics (section flags)
|
|
|
-
|
|
|
+ .text
|
|
|
.align 12
|
|
|
+
|
|
|
+ .globl _start
|
|
|
_start:
|
|
|
stp x29, x30, [sp, #-32]!
|
|
|
mov x29, sp
|
|
@@ -129,6 +39,19 @@ _start:
|
|
|
0: ldp x29, x30, [sp], #32
|
|
|
ret
|
|
|
|
|
|
+ // hand-craft a dummy .reloc section so EFI knows it's a relocatable executable:
|
|
|
+
|
|
|
+ .data
|
|
|
+dummy: .long 0
|
|
|
+
|
|
|
+#define IMAGE_REL_ABSOLUTE 0
|
|
|
+ .section .reloc, "a"
|
|
|
+label1:
|
|
|
+ .long dummy-label1 // Page RVA
|
|
|
+ .long 12 // Block Size (2*4+2*2), must be aligned by 32 Bits
|
|
|
+ .word (IMAGE_REL_ABSOLUTE<<12) + 0 // reloc for dummy
|
|
|
+ .word (IMAGE_REL_ABSOLUTE<<12) + 0 // reloc for dummy
|
|
|
+
|
|
|
#if defined(__ELF__) && defined(__linux__)
|
|
|
.section .note.GNU-stack,"",%progbits
|
|
|
#endif
|