Hi Heinrich 

On Sat, Dec 31, 2022 at 12:03:45PM +0100, Heinrich Schuchardt wrote:
> 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)
> 
> Signed-off-by: Heinrich Schuchardt <heinrich.schucha...@canonical.com>
> ---
>  arch/arm/lib/crt0_aarch64_efi.S  | 35 ++++++++++++++++++++++----------
>  arch/arm/lib/elf_aarch64_efi.lds |  6 ++++--
>  2 files changed, 28 insertions(+), 13 deletions(-)
> 
> diff --git a/arch/arm/lib/crt0_aarch64_efi.S b/arch/arm/lib/crt0_aarch64_efi.S
> index b4fc263adf..52b2482efe 100644
> --- a/arch/arm/lib/crt0_aarch64_efi.S
> +++ b/arch/arm/lib/crt0_aarch64_efi.S
> @@ -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 
> */
> @@ -107,18 +107,31 @@ section_table:
>       .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 */
> +     .long   0x60000020              /* Characteristics (section flags) */

Can we replace the 0x60000020 magic here with defines from
include/asm-generic/pe.h?

>  
> -     .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 */
> +     .long   0xc0000040              /* Characteristics (section flags) */

Same here

>  
> -     .align          9
> +     .align          12
>  _start:
>       stp             x29, x30, [sp, #-32]!
>       mov             x29, sp
> diff --git a/arch/arm/lib/elf_aarch64_efi.lds 
> b/arch/arm/lib/elf_aarch64_efi.lds
> index c0604dad46..ffc6f6e604 100644
> --- a/arch/arm/lib/elf_aarch64_efi.lds
> +++ b/arch/arm/lib/elf_aarch64_efi.lds
> @@ -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) }
> -- 
> 2.37.2
> 

Regards
/Ilias

Reply via email to