mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-08-04 08:17:46 +00:00

The kernel's EFI PE/COFF header contains a dummy .reloc section, and an explanatory comment that claims that this is required for the EFI application loader to accept the Image as a relocatable image (i.e., one that can be loaded at any offset and fixed up in place) This was inherited from the x86 implementation, which has elaborate host tooling to mangle the PE/COFF header post-link time, and which populates the .reloc section with a single dummy base relocation. On ARM, no such tooling exists, and the .reloc section remains empty, and is never even exposed via the BaseRelocationTable directory entry, which is where the PE/COFF loader looks for it. The PE/COFF spec is unclear about relocatable images that do not require any fixups, but the EDK2 implementation, which is the de facto reference for PE/COFF in the UEFI space, clearly does not care, and explicitly mentions (in a comment) that relocatable images with no base relocations are perfectly fine, as long as they don't have the RELOCS_STRIPPED attribute set (which is not the case for our PE/COFF image) So simply remove the .reloc section altogether. Acked-by: Mark Rutland <mark.rutland@arm.com> Acked-by: Peter Jones <pjones@redhat.com> Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org> Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
138 lines
4.2 KiB
ArmAsm
138 lines
4.2 KiB
ArmAsm
/*
|
|
* Copyright (C) 2013 - 2017 Linaro, Ltd.
|
|
* Copyright (C) 2013, 2014 Red Hat, Inc.
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License version 2 as
|
|
* published by the Free Software Foundation.
|
|
*/
|
|
|
|
.macro __EFI_PE_HEADER
|
|
.ascii "PE"
|
|
.short 0
|
|
coff_header:
|
|
.short 0xaa64 // AArch64
|
|
.short 1 // 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 _end - efi_header_end // SizeOfCode
|
|
.long 0 // SizeOfInitializedData
|
|
.long 0 // SizeOfUninitializedData
|
|
.long __efistub_entry - _head // AddressOfEntryPoint
|
|
.long efi_header_end - _head // BaseOfCode
|
|
|
|
extra_header_fields:
|
|
.quad 0 // ImageBase
|
|
.long 0x1000 // SectionAlignment
|
|
.long PECOFF_FILE_ALIGNMENT // FileAlignment
|
|
.short 0 // MajorOperatingSystemVersion
|
|
.short 0 // MinorOperatingSystemVersion
|
|
.short 0 // MajorImageVersion
|
|
.short 0 // MinorImageVersion
|
|
.short 0 // MajorSubsystemVersion
|
|
.short 0 // MinorSubsystemVersion
|
|
.long 0 // Win32VersionValue
|
|
|
|
.long _end - _head // SizeOfImage
|
|
|
|
// Everything before the kernel image is considered part of the header
|
|
.long efi_header_end - _head // SizeOfHeaders
|
|
.long 0 // CheckSum
|
|
.short 0xa // Subsystem (EFI application)
|
|
.short 0 // DllCharacteristics
|
|
.quad 0 // SizeOfStackReserve
|
|
.quad 0 // SizeOfStackCommit
|
|
.quad 0 // SizeOfHeapReserve
|
|
.quad 0 // SizeOfHeapCommit
|
|
.long 0 // LoaderFlags
|
|
.long (section_table - .) / 8 // NumberOfRvaAndSizes
|
|
|
|
.quad 0 // ExportTable
|
|
.quad 0 // ImportTable
|
|
.quad 0 // ResourceTable
|
|
.quad 0 // ExceptionTable
|
|
.quad 0 // CertificationTable
|
|
.quad 0 // BaseRelocationTable
|
|
|
|
#ifdef CONFIG_DEBUG_EFI
|
|
.long efi_debug_table - _head // DebugTable
|
|
.long efi_debug_table_size
|
|
#endif
|
|
|
|
// Section table
|
|
section_table:
|
|
.ascii ".text"
|
|
.byte 0
|
|
.byte 0
|
|
.byte 0 // end of 0 padding of section name
|
|
.long _end - efi_header_end // VirtualSize
|
|
.long efi_header_end - _head // VirtualAddress
|
|
.long _edata - efi_header_end // SizeOfRawData
|
|
.long efi_header_end - _head // PointerToRawData
|
|
|
|
.long 0 // PointerToRelocations
|
|
.long 0 // PointerToLineNumbers
|
|
.short 0 // NumberOfRelocations
|
|
.short 0 // NumberOfLineNumbers
|
|
.long 0xe0000020 // Characteristics
|
|
|
|
#ifdef CONFIG_DEBUG_EFI
|
|
/*
|
|
* The debug table is referenced via its Relative Virtual Address (RVA),
|
|
* which is only defined for those parts of the image that are covered
|
|
* by a section declaration. Since this header is not covered by any
|
|
* section, the debug table must be emitted elsewhere. So stick it in
|
|
* the .init.rodata section instead.
|
|
*
|
|
* Note that the EFI debug entry itself may legally have a zero RVA,
|
|
* which means we can simply put it right after the section headers.
|
|
*/
|
|
__INITRODATA
|
|
|
|
.align 2
|
|
efi_debug_table:
|
|
// EFI_IMAGE_DEBUG_DIRECTORY_ENTRY
|
|
.long 0 // Characteristics
|
|
.long 0 // TimeDateStamp
|
|
.short 0 // MajorVersion
|
|
.short 0 // MinorVersion
|
|
.long 2 // Type == EFI_IMAGE_DEBUG_TYPE_CODEVIEW
|
|
.long efi_debug_entry_size // SizeOfData
|
|
.long 0 // RVA
|
|
.long efi_debug_entry - _head // FileOffset
|
|
|
|
.set efi_debug_table_size, . - efi_debug_table
|
|
.previous
|
|
|
|
efi_debug_entry:
|
|
// EFI_IMAGE_DEBUG_CODEVIEW_NB10_ENTRY
|
|
.ascii "NB10" // Signature
|
|
.long 0 // Unknown
|
|
.long 0 // Unknown2
|
|
.long 0 // Unknown3
|
|
|
|
.asciz VMLINUX_PATH
|
|
|
|
.set efi_debug_entry_size, . - efi_debug_entry
|
|
#endif
|
|
|
|
/*
|
|
* EFI will load .text onwards at the 4k section alignment
|
|
* described in the PE/COFF header. To ensure that instruction
|
|
* sequences using an adrp and a :lo12: immediate will function
|
|
* correctly at this alignment, we must ensure that .text is
|
|
* placed at a 4k boundary in the Image to begin with.
|
|
*/
|
|
.align 12
|
|
efi_header_end:
|
|
.endm
|