[RFC PATCH 2/4] arm: Prepare linker scripts for memory permissions

Ilias Apalodimas ilias.apalodimas at linaro.org
Thu Jan 30 11:30:21 CET 2025


Hi Heinrich

On Thu, 30 Jan 2025 at 12:08, Heinrich Schuchardt <xypron.glpk at gmx.de> wrote:
>
> On 1/30/25 07:20, Ilias Apalodimas wrote:
> > Upcoming patches are switching the memory mappings to RW, RO, RW^X page
>
> RWX, RO, RW?

RW, RX, RO :)

>
> > permissions after the U-Boot binary and its data are relocated. Add
> > annotations in the linker scripts to and mark text, data, rodata etc
> > sections and align them to a page boundary
> >
> > Signed-off-by: Ilias Apalodimas <ilias.apalodimas at linaro.org>
> > ---
> >   Makefile                       | 15 +++++++++------
> >   arch/arm/cpu/armv8/u-boot.lds  | 32 +++++++++++++++++++-------------
> >   include/asm-generic/sections.h |  2 ++
> >   lib/efi_loader/efi_runtime.c   |  2 ++
> >   4 files changed, 32 insertions(+), 19 deletions(-)
> >
> > diff --git a/Makefile b/Makefile
> > index 33bb86343c5b..8d7c062ec830 100644
> > --- a/Makefile
> > +++ b/Makefile
> > @@ -2176,13 +2176,16 @@ System.map:   u-boot
> >   # ARM relocations should all be R_ARM_RELATIVE (32-bit) or
> >   # R_AARCH64_RELATIVE (64-bit).
> >   checkarmreloc: u-boot
> > -     @RELOC="`$(CROSS_COMPILE)readelf -r -W $< | cut -d ' ' -f 4 | \
> > +     @RELOCS="`$(CROSS_COMPILE)readelf -r -W $< | cut -d ' ' -f 4 | \
> >               grep R_A | sort -u`"; \
> > -     if test "$$RELOC" != "R_ARM_RELATIVE" -a \
> > -              "$$RELOC" != "R_AARCH64_RELATIVE"; then \
> > -             echo "$< contains unexpected relocations: $$RELOC"; \
> > -             false; \
> > -     fi
> > +     for reloc in $$RELOCS; do \
> > +             if [ "$$reloc" != "R_ARM_RELATIVE" -a \
> > +                  "$$reloc" != "R_AARCH64_RELATIVE" -a \
> > +             "$$reloc" != "R_AARCH64_NONE" ]; then \
> > +                     echo "$< contains unexpected relocations: $$reloc"; \
> > +                     false; \
> > +             fi; \
> > +     done
>
> This seems to be an unrelated change that should go into a separate patch.

It's not, R_AARCH64_NONE relocation are emitted now due to the section
alignments.

>
> >
> >   tools/version.h: include/version.h
> >       $(Q)mkdir -p $(dir $@)
> > diff --git a/arch/arm/cpu/armv8/u-boot.lds b/arch/arm/cpu/armv8/u-boot.lds
> > index 857f44412e07..18e168e27135 100644
> > --- a/arch/arm/cpu/armv8/u-boot.lds
> > +++ b/arch/arm/cpu/armv8/u-boot.lds
> > @@ -22,7 +22,7 @@ SECTIONS
> >
> >       . = ALIGN(8);
> >       __image_copy_start = ADDR(.text);
> > -     .text :
> > +     .text ALIGN(4096):
> >       {
> >               CPUDIR/start.o (.text*)
> >       }
> > @@ -36,9 +36,12 @@ SECTIONS
> >                   __efi_runtime_stop = .;
> >       }
> >
> > -     .text_rest :
> > +     .text_rest ALIGN(4096) :
> >       {
> > +             __text_start = .;
> >               *(.text*)
> > +             . = ALIGN(4096);
> > +             __text_end = .;
> >       }
> >
> >   #ifdef CONFIG_ARMV8_PSCI
> > @@ -98,27 +101,30 @@ SECTIONS
> >       }
> >   #endif
> >
> > -     . = ALIGN(8);
> > -     .rodata : { *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*))) }
> > +     .rodata ALIGN(4096): {
> > +         __start_rodata = .;
> > +         *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*)))
> > +         . = ALIGN(4096);
> > +         __end_rodata = .;
> > +     }
> >
> > -     . = ALIGN(8);
> > -     .data : {
> > +     .data ALIGN(4096) : {
> > +         __start_data = .;
> >               *(.data*)
> > +         . = ALIGN(4096);
> > +         __end_data = .;
> >       }
> >
> > -     . = ALIGN(8);
> > -
> > -     . = .;
> > -
> >       . = ALIGN(8);
> >       __u_boot_list : {
> >               KEEP(*(SORT(__u_boot_list*)));
> >       }
> >
> > -     .efi_runtime_rel : {
> > +     .efi_runtime_rel ALIGN(4096) : {
> >                   __efi_runtime_rel_start = .;
> >               *(.rel*.efi_runtime)
> >               *(.rel*.efi_runtime.*)
> > +             . = ALIGN(4096);
> >                   __efi_runtime_rel_stop = .;
> >       }
> >
> > @@ -136,10 +142,10 @@ SECTIONS
> >       /*
> >        * arch/arm/lib/crt0_64.S assumes __bss_start - __bss_end % 8 == 0
> >        */
> > -     .bss ALIGN(8) : {
> > +     .bss ALIGN(4096) : {
> >               __bss_start = .;
> >               *(.bss*)
> > -             . = ALIGN(8);
> > +             . = ALIGN(4096);
> >               __bss_end = .;
> >       }
> >
> > diff --git a/include/asm-generic/sections.h b/include/asm-generic/sections.h
> > index b6bca53db10d..5626df796f33 100644
> > --- a/include/asm-generic/sections.h
> > +++ b/include/asm-generic/sections.h
> > @@ -23,6 +23,7 @@ extern char __kprobes_text_start[], __kprobes_text_end[];
> >   extern char __entry_text_start[], __entry_text_end[];
> >   extern char __initdata_begin[], __initdata_end[];
> >   extern char __start_rodata[], __end_rodata[];
> > +extern char __start_data[], __end_data[];
> >   extern char __efi_helloworld_begin[];
> >   extern char __efi_helloworld_end[];
> >   extern char __efi_var_file_begin[];
> > @@ -63,6 +64,7 @@ static inline int arch_is_kernel_data(unsigned long addr)
> >
> >   /* Start of U-Boot text region */
> >   extern char __text_start[];
> > +extern char __text_end[];
> >
> >   /* This marks the text region which must be relocated */
> >   extern char __image_copy_start[], __image_copy_end[];
> > diff --git a/lib/efi_loader/efi_runtime.c b/lib/efi_loader/efi_runtime.c
> > index 35eb6a777665..c10a79301a92 100644
> > --- a/lib/efi_loader/efi_runtime.c
> > +++ b/lib/efi_loader/efi_runtime.c
> > @@ -742,6 +742,8 @@ void efi_runtime_relocate(ulong offset, struct efi_mem_desc *map)
> >                     rel->info, *p, rel->offset);
> >
> >               switch (rel->info & R_MASK) {
> > +             case 0:
> > +                     break;
>
> This seems to be an unrelated patch that should be in a separate patch.

Same as above

Cheers
/Ilias
>
> Best regards
>
> Heinrich
>
> >               case R_RELATIVE:
> >   #ifdef IS_RELA
> >               newaddr = rel->addend + offset - CONFIG_TEXT_BASE;
>


More information about the U-Boot mailing list