]> git.ipfire.org Git - thirdparty/u-boot.git/commitdiff
arm: separate .data and .text sections of EFI binaries
authorHeinrich Schuchardt <heinrich.schuchardt@canonical.com>
Mon, 26 Feb 2024 21:24:08 +0000 (22:24 +0100)
committerHeinrich Schuchardt <heinrich.schuchardt@canonical.com>
Wed, 28 Feb 2024 13:39:27 +0000 (14:39 +0100)
EFI binaries should not contain sections that are both writable and
executable. Separate the RX .text section from the RW .data section.

We currently don't created relocation sections (.rel.*) for our EFI
binaries. Anyway these would have to be converted to PE/COFF relocations.
Enumerate them under DISCARD and add a comment.

Correct the characteristics of the sections.

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

index b45c034c23cb7ae62a513a37aaf165f07d77d93a..b5dfd4e381955a105fedd55b4a7e234ea4035a3e 100644 (file)
@@ -23,7 +23,7 @@ pe_header:
        .long   IMAGE_NT_SIGNATURE              /* 'PE' */
 coff_header:
        .short  IMAGE_FILE_MACHINE_THUMB        /* Mixed ARM/Thumb */
-       .short  2                               /* nr_sections */
+       .short  3                               /* nr_sections */
        .long   0                               /* TimeDateStamp */
        .long   0                               /* PointerToSymbolTable */
        .long   0                               /* NumberOfSymbols */
@@ -102,22 +102,44 @@ 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   _text_size              /* VirtualSize */
        .long   _start - image_base     /* VirtualAddress */
-       .long   _edata - _start         /* SizeOfRawData */
+       .long   _text_size              /* SizeOfRawData */
        .long   _start - image_base     /* 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 - image_base      /* VirtualAddress */
+       .long   _data_size              /* SizeOfRawData */
+       .long   _data - image_base      /* 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          12
 _start:
index 767ebda6351b5463ecb1958b8a791ccd58dc708b..41440594aa61f2e96183f9e74a2f2bae5b35cbff 100644 (file)
@@ -7,6 +7,12 @@
 
 OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
 OUTPUT_ARCH(arm)
+
+PHDRS
+{
+       data PT_LOAD FLAGS(3); /* PF_W | PF_X */
+}
+
 ENTRY(_start)
 SECTIONS
 {
@@ -18,11 +24,13 @@ SECTIONS
                *(.gnu.linkonce.t.*)
                *(.srodata)
                *(.rodata*)
+               . = ALIGN(16);
+               *(.dynamic);
                . = ALIGN(512);
        }
        _etext = .;
        _text_size = . - _text;
-       .dynamic  : { *(.dynamic) }
+       . = ALIGN(4096);
        .data : {
                _data = .;
                *(.sdata)
@@ -47,14 +55,20 @@ SECTIONS
                . = ALIGN(512);
                _bss_end = .;
                _edata = .;
-       }
-       .rel.dyn : { *(.rel.dyn) }
-       .rel.plt : { *(.rel.plt) }
-       .rel.got : { *(.rel.got) }
-       .rel.data : { *(.rel.data) *(.rel.data*) }
-       _data_size = . - _etext;
+       } :data
+       _data_size = . - _data;
 
        /DISCARD/ : {
+               /*
+                * We don't support relocations. These would have to be
+                * translated from ELF to PE format and added to the .reloc
+                * section.
+                */
+               *(.rel.dyn)
+               *(.rel.plt)
+               *(.rel.got)
+               *(.rel.data)
+               *(.rel.data*)
                *(.rel.reloc)
                *(.eh_frame)
                *(.note.GNU-stack)