summaryrefslogtreecommitdiff
path: root/gnuefi
diff options
context:
space:
mode:
authorCallum Farmer <gmbr3@opensuse.org>2022-12-31 13:40:54 +0000
committerCallum Farmer <gmbr3@opensuse.org>2023-01-19 17:22:19 +0000
commit593e13937c340944ec91e7c8962e8baaaeff7d57 (patch)
tree17bad06bb530ba4ab26f11592b2a234676759095 /gnuefi
parent231c7632c0dc4dba2d8b36e9c226d992ec90720e (diff)
downloadgnu-efi-593e13937c340944ec91e7c8962e8baaaeff7d57.tar.gz
Make aarch64 crt0/lds more like x86_64
Binutils 2.38 now supports efi-app-aarch64 so to use this we must add a dummy reloc section and remove the PE header definition from crt0 as this will conflict with the version added by objcopy Signed-off-by: Callum Farmer <gmbr3@opensuse.org>
Diffstat (limited to 'gnuefi')
-rw-r--r--gnuefi/crt0-efi-aarch64.S109
-rw-r--r--gnuefi/elf_aarch64_efi.lds23
2 files changed, 35 insertions, 97 deletions
diff --git a/gnuefi/crt0-efi-aarch64.S b/gnuefi/crt0-efi-aarch64.S
index a0687b1..a9eda65 100644
--- a/gnuefi/crt0-efi-aarch64.S
+++ b/gnuefi/crt0-efi-aarch64.S
@@ -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
diff --git a/gnuefi/elf_aarch64_efi.lds b/gnuefi/elf_aarch64_efi.lds
index 6bfede3..1774d76 100644
--- a/gnuefi/elf_aarch64_efi.lds
+++ b/gnuefi/elf_aarch64_efi.lds
@@ -3,9 +3,18 @@ OUTPUT_ARCH(aarch64)
ENTRY(_start)
SECTIONS
{
- .text 0x0 : {
+ . = 0;
+ ImageBase = .;
+ /* .hash and/or .gnu.hash MUST come first! */
+ .hash : { *(.hash) }
+ .gnu.hash : { *(.gnu.hash) }
+ . = ALIGN(4096);
+ .eh_frame :
+ {
+ *(.eh_frame)
+ }
+ .text : {
_text = .;
- *(.text.head)
*(.text)
*(.text.*)
*(.gnu.linkonce.t.*)
@@ -15,6 +24,11 @@ SECTIONS
}
_etext = .;
_text_size = . - _text;
+ . = ALIGN(4096);
+ .reloc :
+ {
+ *(.reloc)
+ }
. = DATA_SEGMENT_ALIGN (CONSTANT (MAXPAGESIZE), CONSTANT (COMMONPAGESIZE));
.dynamic : { *(.dynamic) }
.data :
@@ -36,6 +50,7 @@ SECTIONS
*(.dynbss)
*(.bss)
*(COMMON)
+ *(.rel.local)
. = ALIGN(16);
_bss_end = .;
}
@@ -55,9 +70,9 @@ SECTIONS
. = ALIGN(4096);
.note.gnu.build-id : { *(.note.gnu.build-id) }
. = DATA_SEGMENT_END (.);
- /DISCARD/ :
+ .ignored.reloc :
{
- *(.rel.reloc)
+ *(.rela.reloc)
*(.eh_frame)
*(.note.GNU-stack)
}