]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
efi_loader: fix building aarch64 EFI binaries
authorHeinrich Schuchardt <heinrich.schuchardt@canonical.com>
Sat, 31 Dec 2022 10:58:54 +0000 (11:58 +0100)
committerHeinrich Schuchardt <heinrich.schuchardt@canonical.com>
Wed, 4 Jan 2023 12:17:42 +0000 (13:17 +0100)
While our EFI binaries execute without problems on EDK II they crash on
a Lenovo X13s. Let our binaries look more like what EDK II produces:

* move all writable data to a .data section
* align sections to 4 KiB boundaries (matching EFI page size)
* remove IMAGE_SCN_LNK_NRELOC_OVFL from .reloc section flags

Signed-off-by: Heinrich Schuchardt <heinrich.schuchardt@canonical.com>
Reviewed-by: Ilias Apalodimas <ilias.apalodimas@linaro.org>
arch/arm/lib/crt0_aarch64_efi.S
arch/arm/lib/elf_aarch64_efi.lds

index b4fc263adfb3034c9156eeefc500cc324751a489..3c2cef6ec73cb56a918e859ac267df7376b190ea 100644 (file)
@@ -25,7 +25,7 @@ pe_header:
        .long   IMAGE_NT_SIGNATURE              /* 'PE' */
 coff_header:
        .short  IMAGE_FILE_MACHINE_ARM64        /* AArch64 */
-       .short  2                               /* nr_sections */
+       .short  3                               /* nr_sections */
        .long   0                               /* TimeDateStamp */
        .long   0                               /* PointerToSymbolTable */
        .long   0                               /* NumberOfSymbols */
@@ -40,7 +40,7 @@ optional_header:
        .short  IMAGE_NT_OPTIONAL_HDR64_MAGIC   /* PE32+ format */
        .byte   0x02                            /* MajorLinkerVersion */
        .byte   0x14                            /* MinorLinkerVersion */
-       .long   _edata - _start                 /* SizeOfCode */
+       .long   _etext - _start                 /* SizeOfCode */
        .long   0                               /* SizeOfInitializedData */
        .long   0                               /* SizeOfUninitializedData */
        .long   _start - ImageBase              /* AddressOfEntryPoint */
@@ -48,7 +48,7 @@ optional_header:
 
 extra_header_fields:
        .quad   0                               /* ImageBase */
-       .long   0x200                           /* SectionAlignment */
+       .long   0x1000                          /* SectionAlignment */
        .long   0x200                           /* FileAlignment */
        .short  0                               /* MajorOperatingSystemVersion */
        .short  0                               /* MinorOperatingSystemVersion */
@@ -100,25 +100,46 @@ section_table:
        .long   0                       /* PointerToLineNumbers */
        .short  0                       /* NumberOfRelocations */
        .short  0                       /* NumberOfLineNumbers */
-       .long   0x42100040              /* Characteristics (section flags) */
-
+       /* Characteristics (section flags) */
+       .long   (IMAGE_SCN_MEM_READ | \
+                IMAGE_SCN_MEM_DISCARDABLE | \
+                IMAGE_SCN_CNT_INITIALIZED_DATA)
 
        .ascii  ".text"
        .byte   0
        .byte   0
        .byte   0                       /* end of 0 padding of section name */
-       .long   _edata - _start         /* VirtualSize */
+       .long   _etext - _start         /* VirtualSize */
        .long   _start - ImageBase      /* VirtualAddress */
-       .long   _edata - _start         /* SizeOfRawData */
+       .long   _etext - _start         /* SizeOfRawData */
        .long   _start - ImageBase      /* PointerToRawData */
+       .long   0                       /* PointerToRelocations */
+       .long   0                       /* PointerToLineNumbers */
+       .short  0                       /* NumberOfRelocations */
+       .short  0                       /* NumberOfLineNumbers */
+       /* Characteristics (section flags) */
+       .long   (IMAGE_SCN_MEM_READ | \
+                IMAGE_SCN_MEM_EXECUTE | \
+                IMAGE_SCN_CNT_CODE)
 
-       .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   0xe0500020      /* Characteristics (section flags) */
+       .ascii  ".data"
+       .byte   0
+       .byte   0
+       .byte   0                       /* end of 0 padding of section name */
+       .long   _data_size              /* VirtualSize */
+       .long   _data - ImageBase       /* VirtualAddress */
+       .long   _data_size              /* SizeOfRawData */
+       .long   _data - ImageBase       /* PointerToRawData */
+       .long   0                       /* PointerToRelocations */
+       .long   0                       /* PointerToLineNumbers */
+       .short  0                       /* NumberOfRelocations */
+       .short  0                       /* NumberOfLineNumbers */
+       /* Characteristics (section flags) */
+       .long   (IMAGE_SCN_MEM_WRITE | \
+                IMAGE_SCN_MEM_READ | \
+                IMAGE_SCN_CNT_INITIALIZED_DATA)
 
-       .align          9
+       .align          12
 _start:
        stp             x29, x30, [sp, #-32]!
        mov             x29, sp
index c0604dad464dab789faa1529a9f126227495e724..ffc6f6e6045e7c9e55055d11a2138447048e2adf 100644 (file)
@@ -18,11 +18,13 @@ SECTIONS
                *(.gnu.linkonce.t.*)
                *(.srodata)
                *(.rodata*)
+               . = ALIGN(16);
+               *(.dynamic);
                . = ALIGN(512);
        }
        _etext = .;
        _text_size = . - _text;
-       .dynamic  : { *(.dynamic) }
+       . = ALIGN(4096);
        .data : {
                _data = .;
                *(.sdata)
@@ -48,11 +50,11 @@ SECTIONS
                _bss_end = .;
                _edata = .;
        }
+       _data_size = _edata - _data;
        .rela.dyn : { *(.rela.dyn) }
        .rela.plt : { *(.rela.plt) }
        .rela.got : { *(.rela.got) }
        .rela.data : { *(.rela.data) *(.rela.data*) }
-       _data_size = . - _etext;
 
        . = ALIGN(4096);
        .dynsym   : { *(.dynsym) }