[PATCH] lds: align u-boot-nodtb with 8 bytes boundary

Mark Kettenis mark.kettenis at xs4all.nl
Sat Dec 17 23:14:41 CET 2022


> From: Eugen Hristev <eugen.hristev at microchip.com>
> Date: Thu, 15 Dec 2022 13:58:25 +0200
> 
> Newer DTC require that the DTB start address is aligned at 8 bytes.
> In the u-boot.bin case, the u-boot-nodtb.bin is concatenated with the
> DTB, but there is no alignment/padding to the next 8byte aligned address.
> This causes the board to fail booting, because the FDT will claim
> that the DTB inside u-boot.bin is not a valid DTB, it will fail with
> -FDT_ERR_ALIGNMENT.
> To solve this, have the u-boot binary `_end` aligned with 8 bytes.
> The objcopy in the Makefile will create the u-boot-nodtb.bin and it has to
> be truncated to 8 bytes to correspond to the u-boot.map file which will
> have the `_end` aligned to 8 bytes.
> The lds files which use devicetrees have been changed to align the `_end`
> tag with 8 bytes.
> 
> This patch is also a prerequisite to have the possibility to update the
> dtc inside u-boot to newer versions (1.6.1+)
> 
> Signed-off-by: Eugen Hristev <eugen.hristev at microchip.com>
> ---
> Hi,
> 
> I could not test all affected boards, it's an impossible task.
> I tried this on at91 boards which I have, and ran the CI on denx.
> I cannot guarantee that no other boards are affected, so this patch is a bit
> of an RFC.
> If the u-boot-nodtb.bin does not have the size equal with the corresponding
> one in u-boot.map, the binary_size_check will fail at build time with
> something like this:
> 
> u-boot.map shows a binary size of 502684
> but u-boot-nodtb.bin shows 502688
> 
> Thanks,
> Eugen
> 
>  Makefile                                    | 2 ++
>  arch/arm/cpu/armv8/u-boot.lds               | 4 ++--
>  arch/arm/cpu/u-boot-spl.lds                 | 1 +
>  arch/arm/cpu/u-boot.lds                     | 1 +
>  arch/arm/lib/elf_arm_efi.lds                | 5 +++++
>  arch/arm/mach-at91/arm926ejs/u-boot-spl.lds | 2 +-
>  arch/arm/mach-at91/armv7/u-boot-spl.lds     | 2 +-
>  arch/arm/mach-zynq/u-boot-spl.lds           | 2 +-
>  arch/mips/cpu/u-boot.lds                    | 2 +-
>  arch/sandbox/cpu/u-boot.lds                 | 6 ++++++
>  arch/sh/cpu/u-boot.lds                      | 2 ++
>  board/ti/am335x/u-boot.lds                  | 1 +
>  tools/binman/test/u_boot_binman_embed.lds   | 2 +-
>  13 files changed, 25 insertions(+), 7 deletions(-)
> 
> diff --git a/Makefile b/Makefile
> index 9d84f96481..b4d387bcce 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -1317,6 +1317,8 @@ endif
>  
>  u-boot-nodtb.bin: u-boot FORCE
>  	$(call if_changed,objcopy_uboot)
> +# Make sure the size is 8 byte-aligned.
> +	@truncate -s %8 $@

$ truncate
ksh: truncate: not found

In other words: truncate(1) isn't a standard UNIX utility and not
present on OpenBSD for example.  It isn't part of POSIX and therefore
its usage is unportable.

Please find a different solution.

>  	$(BOARD_SIZE_CHECK)
>  
>  u-boot.ldr:	u-boot
> diff --git a/arch/arm/cpu/armv8/u-boot.lds b/arch/arm/cpu/armv8/u-boot.lds
> index 8fe4682dd2..e5fa4ef95c 100644
> --- a/arch/arm/cpu/armv8/u-boot.lds
> +++ b/arch/arm/cpu/armv8/u-boot.lds
> @@ -145,10 +145,10 @@ SECTIONS
>  		*(.__rel_dyn_end)
>  	}
>  
> -	_end = .;
> -
>  	. = ALIGN(8);
>  
> +	_end = .;
> +
>  	.bss_start : {
>  		KEEP(*(.__bss_start));
>  	}
> diff --git a/arch/arm/cpu/u-boot-spl.lds b/arch/arm/cpu/u-boot-spl.lds
> index fb2189d50d..732ed42db1 100644
> --- a/arch/arm/cpu/u-boot-spl.lds
> +++ b/arch/arm/cpu/u-boot-spl.lds
> @@ -55,6 +55,7 @@ SECTIONS
>  
>  	.end :
>  	{
> +		. = ALIGN(8);
>  		*(.__end)
>  	}
>  
> diff --git a/arch/arm/cpu/u-boot.lds b/arch/arm/cpu/u-boot.lds
> index f25f72b2e0..274e1a7d30 100644
> --- a/arch/arm/cpu/u-boot.lds
> +++ b/arch/arm/cpu/u-boot.lds
> @@ -193,6 +193,7 @@ SECTIONS
>  
>  	.end :
>  	{
> +		. = ALIGN(8);
>  		*(.__end)
>  	}
>  
> diff --git a/arch/arm/lib/elf_arm_efi.lds b/arch/arm/lib/elf_arm_efi.lds
> index 767ebda635..f3867021d3 100644
> --- a/arch/arm/lib/elf_arm_efi.lds
> +++ b/arch/arm/lib/elf_arm_efi.lds
> @@ -54,6 +54,11 @@ SECTIONS
>  	.rel.data : { *(.rel.data) *(.rel.data*) }
>  	_data_size = . - _etext;
>  
> +	.end : {
> +		. = ALIGN(8);
> +		*(.__end)
> +	}
> +
>  	/DISCARD/ : {
>  		*(.rel.reloc)
>  		*(.eh_frame)
> diff --git a/arch/arm/mach-at91/arm926ejs/u-boot-spl.lds b/arch/arm/mach-at91/arm926ejs/u-boot-spl.lds
> index 1a8bf94dee..d7e5d81ecc 100644
> --- a/arch/arm/mach-at91/arm926ejs/u-boot-spl.lds
> +++ b/arch/arm/mach-at91/arm926ejs/u-boot-spl.lds
> @@ -31,7 +31,7 @@ SECTIONS
>  	. = ALIGN(4);
>  	__u_boot_list : { KEEP(*(SORT(__u_boot_list*))) } > .sram
>  
> -	. = ALIGN(4);
> +	. = ALIGN(8);
>  	__image_copy_end = .;
>  
>  	.end :
> diff --git a/arch/arm/mach-at91/armv7/u-boot-spl.lds b/arch/arm/mach-at91/armv7/u-boot-spl.lds
> index 6ca725fc4c..2a0a1b4b86 100644
> --- a/arch/arm/mach-at91/armv7/u-boot-spl.lds
> +++ b/arch/arm/mach-at91/armv7/u-boot-spl.lds
> @@ -38,7 +38,7 @@ SECTIONS
>  	. = ALIGN(4);
>  	__u_boot_list : { KEEP(*(SORT(__u_boot_list*))) } > .sram
>  
> -	. = ALIGN(4);
> +	. = ALIGN(8);
>  	__image_copy_end = .;
>  
>  	.end :
> diff --git a/arch/arm/mach-zynq/u-boot-spl.lds b/arch/arm/mach-zynq/u-boot-spl.lds
> index 8c18d3f91f..c0320dbe1e 100644
> --- a/arch/arm/mach-zynq/u-boot-spl.lds
> +++ b/arch/arm/mach-zynq/u-boot-spl.lds
> @@ -41,7 +41,7 @@ SECTIONS
>  		KEEP(*(SORT(__u_boot_list*)));
>  	} > .sram
>  
> -	. = ALIGN(4);
> +	. = ALIGN(8);
>  
>  	_image_binary_end = .;
>  
> diff --git a/arch/mips/cpu/u-boot.lds b/arch/mips/cpu/u-boot.lds
> index 9a4ebcd151..182e9bc6e5 100644
> --- a/arch/mips/cpu/u-boot.lds
> +++ b/arch/mips/cpu/u-boot.lds
> @@ -56,7 +56,7 @@ SECTIONS
>  		. += CONFIG_MIPS_RELOCATION_TABLE_SIZE - 4;
>  	}
>  
> -	. = ALIGN(4);
> +	. = ALIGN(8);
>  	_end = .;
>  
>  	.bss __rel_start (OVERLAY) : {
> diff --git a/arch/sandbox/cpu/u-boot.lds b/arch/sandbox/cpu/u-boot.lds
> index ba8dee50c7..3fbca6d248 100644
> --- a/arch/sandbox/cpu/u-boot.lds
> +++ b/arch/sandbox/cpu/u-boot.lds
> @@ -51,6 +51,12 @@ SECTIONS
>  		*(.dynsym)
>  		__dyn_sym_end = .;
>  	}
> +
> +	.end :
> +	{
> +		. = ALIGN(8);
> +		*(.__end)
> +	}
>  }
>  
>  INSERT BEFORE .data;
> diff --git a/arch/sh/cpu/u-boot.lds b/arch/sh/cpu/u-boot.lds
> index d360eea7eb..226f50b19c 100644
> --- a/arch/sh/cpu/u-boot.lds
> +++ b/arch/sh/cpu/u-boot.lds
> @@ -74,6 +74,8 @@ SECTIONS
>  		KEEP(*(SORT(__u_boot_list*)));
>  	} >ram
>  
> +	. = ALIGN(8);
> +
>  	PROVIDE (__init_end = .);
>  	PROVIDE (reloc_dst_end = .);
>  	PROVIDE (_end = .);
> diff --git a/board/ti/am335x/u-boot.lds b/board/ti/am335x/u-boot.lds
> index 087dee8bb2..deb9098a90 100644
> --- a/board/ti/am335x/u-boot.lds
> +++ b/board/ti/am335x/u-boot.lds
> @@ -118,6 +118,7 @@ SECTIONS
>  
>  	.end :
>  	{
> +		. = ALIGN(8);
>  		*(.__end)
>  	}
>  
> diff --git a/tools/binman/test/u_boot_binman_embed.lds b/tools/binman/test/u_boot_binman_embed.lds
> index e213fa8a84..93c0ae6aed 100644
> --- a/tools/binman/test/u_boot_binman_embed.lds
> +++ b/tools/binman/test/u_boot_binman_embed.lds
> @@ -18,7 +18,7 @@ SECTIONS
>  		*(.text*)
>  	}
>  
> -	. = ALIGN(4);
> +	. = ALIGN(8);
>  	.data : {
>  		dtb_embed_begin = .;
>  		KEEP(*(.mydtb));
> -- 
> 2.25.1
> 
> 


More information about the U-Boot mailing list