[PATCH 02/10] arm: Update linker scripts to ensure appended device tree is aligned

Michal Simek michal.simek at amd.com
Fri Jan 16 11:00:09 CET 2026



On 1/15/26 23:19, Tom Rini wrote:
> With commit 0535e46d55d7 ("scripts/dtc: Update to upstream version
> v1.7.2-35-g52f07dcca47c") it is now a fatal error to U-Boot if our
> device tree is not 8-byte aligned. In commit f613a6e15ef7 ("ARM: OMAP2+:
> Pad SPL binary to 8-byte alignment before DTB") Beleswar Padhi explains
> that we must have ALIGN(x) statements inside of a section to ensure that
> padding is included and not simply that the linker address counter is
> incremented. To that end, this patch:
> - Expands some linker sections to be more readable when adding a second
>    statement to the section.
> - Aligns the final section before _end (for U-Boot) or
>    _image_binary_end or __bss_end (for xPL phases) by 8-bytes by adding
>    '. = ALIGN(8);' to the final section before the symbol.
> - Ensure that we do have alignment by adding an ASSERT so that when not
>    aligned we fail to link (and explain why).
> - Remove now-spurious  '. = ALIGN(x);' statements that were intended to
>    provide the above alignments.
> 
> Signed-off-by: Tom Rini <trini at konsulko.com>
> ---
> The only part of this I am only mostly rather than fully confident in is
> having caught all cases of having SPL_SEPARATE_BSS being false. I
> believe I have as the generic ARM SPL linker script enforces the BSS
> ending with 8-byte alignment, and the point of the ASSERTs here is to
> catch the case where the section we're adding the ALIGN to ends up being
> empty and so that ALIGN would become useless.
> 
> Cc: "NXP i.MX U-Boot Team" <uboot-imx at nxp.com>
> Cc: Adam Ford <aford173 at gmail.com>
> Cc: Andre Przywara <andre.przywara at arm.com>
> Cc: Aspeed BMC SW team <BMC-SW at aspeedtech.com>
> Cc: Chia-Wei Wang <chiawei_wang at aspeedtech.com>
> Cc: Eugen Hristev <eugen.hristev at linaro.org>
> Cc: Fabio Estevam <festevam at gmail.com>
> Cc: Ilias Apalodimas <ilias.apalodimas at linaro.org>
> Cc: Jagan Teki <jagan at amarulasolutions.com>
> Cc: Joel Stanley <joel at jms.id.au>
> Cc: Kever Yang <kever.yang at rock-chips.com>
> Cc: Marek Vasut <marek.vasut+renesas at mailbox.org>
> Cc: Michal Simek <michal.simek at amd.com>
> Cc: Philipp Tomsich <philipp.tomsich at vrull.eu>
> Cc: Richard Henderson <richard.henderson at linaro.org>
> Cc: Ryan Chen <ryan_chen at aspeedtech.com>
> Cc: Stefano Babic <sbabic at nabladev.com>
> ---
>   arch/arm/cpu/arm1136/u-boot-spl.lds            | 8 ++++++--
>   arch/arm/cpu/arm926ejs/mxs/u-boot-spl.lds      | 5 ++++-
>   arch/arm/cpu/arm926ejs/sunxi/u-boot-spl.lds    | 5 ++++-
>   arch/arm/cpu/armv7/sunxi/u-boot-spl.lds        | 5 ++++-
>   arch/arm/cpu/armv8/u-boot-spl.lds              | 4 +++-
>   arch/arm/cpu/armv8/u-boot.lds                  | 2 ++
>   arch/arm/cpu/u-boot-spl.lds                    | 5 ++++-
>   arch/arm/cpu/u-boot.lds                        | 4 ++++
>   arch/arm/mach-aspeed/ast2600/u-boot-spl.lds    | 4 ++++
>   arch/arm/mach-at91/arm926ejs/u-boot-spl.lds    | 9 +++++++--
>   arch/arm/mach-at91/armv7/u-boot-spl.lds        | 9 +++++++--
>   arch/arm/mach-omap2/u-boot-spl.lds             | 3 +++
>   arch/arm/mach-rockchip/u-boot-tpl-v8.lds       | 5 ++++-
>   arch/arm/mach-zynq/u-boot-spl.lds              | 6 ++++--
>   arch/arm/mach-zynq/u-boot.lds                  | 3 +++
>   board/davinci/da8xxevm/u-boot-spl-da850evm.lds | 4 ++++
>   board/samsung/common/exynos-uboot-spl.lds      | 5 ++++-
>   17 files changed, 71 insertions(+), 15 deletions(-)
> 
> diff --git a/arch/arm/cpu/arm1136/u-boot-spl.lds b/arch/arm/cpu/arm1136/u-boot-spl.lds
> index b7af29183a97..22a9302275ae 100644
> --- a/arch/arm/cpu/arm1136/u-boot-spl.lds
> +++ b/arch/arm/cpu/arm1136/u-boot-spl.lds
> @@ -30,8 +30,10 @@ SECTIONS
>   	.rodata : { *(SORT_BY_ALIGNMENT(.rodata*)) } >.sram
>   
>   	. = ALIGN(4);
> -	.data : { *(SORT_BY_ALIGNMENT(.data*)) } >.sram
> -	. = ALIGN(4);
> +	.data : {
> +		*(SORT_BY_ALIGNMENT(.data*))
> +		. = ALIGN(8);
> +	} >.sram
>   	__image_copy_end = .;
>   	_end = .;
>   
> @@ -44,3 +46,5 @@ SECTIONS
>   		__bss_end = .;
>   	} >.sdram
>   }
> +
> +ASSERT(_end % 8 == 0, "_end must be 8-byte aligned for device tree");
> diff --git a/arch/arm/cpu/arm926ejs/mxs/u-boot-spl.lds b/arch/arm/cpu/arm926ejs/mxs/u-boot-spl.lds
> index 7c6309246f8b..b4adae272eba 100644
> --- a/arch/arm/cpu/arm926ejs/mxs/u-boot-spl.lds
> +++ b/arch/arm/cpu/arm926ejs/mxs/u-boot-spl.lds
> @@ -45,7 +45,7 @@ SECTIONS
>   		. = ALIGN(4);
>   		__bss_start = .;
>   		*(.bss*)
> -		. = ALIGN(4);
> +		. = ALIGN(8);
>   		__bss_end = .;
>   	}
>   
> @@ -62,3 +62,6 @@ SECTIONS
>   	.gnu : { *(.gnu*) }
>   	.ARM.exidx : { *(.ARM.exidx*) }
>   }
> +
> +ASSERT(_image_binary_end % 8 == 0, \
> +       "_image_binary_end must be 8-byte aligned for device tree");
> diff --git a/arch/arm/cpu/arm926ejs/sunxi/u-boot-spl.lds b/arch/arm/cpu/arm926ejs/sunxi/u-boot-spl.lds
> index cf65e8c46281..2225985c79c0 100644
> --- a/arch/arm/cpu/arm926ejs/sunxi/u-boot-spl.lds
> +++ b/arch/arm/cpu/arm926ejs/sunxi/u-boot-spl.lds
> @@ -31,9 +31,9 @@ SECTIONS
>   	. = ALIGN(4);
>   	__u_boot_list : {
>   		KEEP(*(SORT(__u_boot_list*)));
> +		. = ALIGN(8);
>   	} > .sram
>   
> -	. = ALIGN(4);
>   	__image_copy_end = .;
>   	_end = .;
>   	_image_binary_end = .;
> @@ -47,3 +47,6 @@ SECTIONS
>   		__bss_end = .;
>   	} > .sdram
>   }
> +
> +ASSERT(_image_binary_end % 8 == 0, \
> +       "_image_binary_end must be 8-byte aligned for device tree");
> diff --git a/arch/arm/cpu/armv7/sunxi/u-boot-spl.lds b/arch/arm/cpu/armv7/sunxi/u-boot-spl.lds
> index fb7a789b28b8..e69291d8be6d 100644
> --- a/arch/arm/cpu/armv7/sunxi/u-boot-spl.lds
> +++ b/arch/arm/cpu/armv7/sunxi/u-boot-spl.lds
> @@ -40,9 +40,9 @@ SECTIONS
>   	. = ALIGN(4);
>   	__u_boot_list : {
>   		KEEP(*(SORT(__u_boot_list*)));
> +		. = ALIGN(8);
>   	} > .sram
>   
> -	. = ALIGN(4);
>   	__image_copy_end = .;
>   	_end = .;
>   	_image_binary_end = .;
> @@ -56,3 +56,6 @@ SECTIONS
>   		__bss_end = .;
>   	} > .sdram
>   }
> +
> +ASSERT(_image_binary_end % 8 == 0, \
> +       "_image_binary_end must be 8-byte aligned for device tree");
> diff --git a/arch/arm/cpu/armv8/u-boot-spl.lds b/arch/arm/cpu/armv8/u-boot-spl.lds
> index c4f83ec9cfc4..d9963846c4f4 100644
> --- a/arch/arm/cpu/armv8/u-boot-spl.lds
> +++ b/arch/arm/cpu/armv8/u-boot-spl.lds
> @@ -52,9 +52,9 @@ SECTIONS
>   	__u_boot_list : {
>   		. = ALIGN(8);
>   		KEEP(*(SORT(__u_boot_list*)));
> +		. = ALIGN(8);
>   	} >.sram
>   
> -	. = ALIGN(8);
>   	__image_copy_end = .;
>   	_end = .;
>   	_image_binary_end = .;
> @@ -89,5 +89,7 @@ SECTIONS
>   #endif
>   }
>   
> +ASSERT(_image_binary_end % 8 == 0, \
> +       "_image_binary_end must be 8-byte aligned for device tree");
>   ASSERT(ADDR(.bss) % 8 == 0, \
>          ".bss must be 8-byte aligned");
> diff --git a/arch/arm/cpu/armv8/u-boot.lds b/arch/arm/cpu/armv8/u-boot.lds
> index f4ce98c82c8d..704e0bf9468d 100644
> --- a/arch/arm/cpu/armv8/u-boot.lds
> +++ b/arch/arm/cpu/armv8/u-boot.lds
> @@ -175,3 +175,5 @@ SECTIONS
>   #include "linux-kernel-image-header-vars.h"
>   #endif
>   }
> +
> +ASSERT(_end % 8 == 0, "_end must be 8-byte aligned for device tree");
> diff --git a/arch/arm/cpu/u-boot-spl.lds b/arch/arm/cpu/u-boot-spl.lds
> index 5aecb61ce902..d780a5060774 100644
> --- a/arch/arm/cpu/u-boot-spl.lds
> +++ b/arch/arm/cpu/u-boot-spl.lds
> @@ -51,9 +51,9 @@ SECTIONS
>   		__rel_dyn_start = .;
>   		*(.rel*)
>   		__rel_dyn_end = .;
> +		. = ALIGN(8);
>   	}
>   
> -	. = ALIGN(8);
>   	_image_binary_end = .;
>   	_end = .;
>   
> @@ -80,6 +80,9 @@ ASSERT(__image_copy_end - __image_copy_start <= (IMAGE_MAX_SIZE), \
>   	"SPL image too big");
>   #endif
>   
> +ASSERT(_image_binary_end % 8 == 0, \
> +       "_image_binary_end must be 8-byte aligned for device tree");
> +
>   #if defined(CONFIG_SPL_BSS_MAX_SIZE)
>   ASSERT(__bss_end - __bss_start <= (CONFIG_SPL_BSS_MAX_SIZE), \
>   	"SPL image BSS too big");
> diff --git a/arch/arm/cpu/u-boot.lds b/arch/arm/cpu/u-boot.lds
> index 78aad093d3b2..8e2266a90fe2 100644
> --- a/arch/arm/cpu/u-boot.lds
> +++ b/arch/arm/cpu/u-boot.lds
> @@ -164,6 +164,7 @@ SECTIONS
>   		__rel_dyn_start = .;
>   		*(.rel*)
>   		__rel_dyn_end = .;
> +		. = ALIGN(8);
>   	}
>   
>   	_end = .;
> @@ -192,3 +193,6 @@ SECTIONS
>   	/DISCARD/ : { *(.ARM.exidx*) }
>   	/DISCARD/ : { *(.gnu.linkonce.armexidx.*) }
>   }
> +
> +ASSERT(_image_binary_end % 8 == 0, \
> +       "_image_binary_end must be 8-byte aligned for device tree");
> diff --git a/arch/arm/mach-aspeed/ast2600/u-boot-spl.lds b/arch/arm/mach-aspeed/ast2600/u-boot-spl.lds
> index 9502a7384b53..c9664a6ce566 100644
> --- a/arch/arm/mach-aspeed/ast2600/u-boot-spl.lds
> +++ b/arch/arm/mach-aspeed/ast2600/u-boot-spl.lds
> @@ -59,6 +59,7 @@ SECTIONS
>   		__rel_dyn_start = .;
>   		*(.rel*)
>   		__rel_dyn_end = .;
> +		. = ALIGN(8);
>   	} > .nor
>   
>   	_end = .;
> @@ -79,6 +80,9 @@ ASSERT(__image_copy_end - __image_copy_start <= (IMAGE_MAX_SIZE), \
>   	"SPL image too big");
>   #endif
>   
> +ASSERT(_image_binary_end % 8 == 0, \
> +       "_image_binary_end must be 8-byte aligned for device tree");
> +
>   #if defined(CONFIG_SPL_BSS_MAX_SIZE)
>   ASSERT(__bss_end - __bss_start <= (CONFIG_SPL_BSS_MAX_SIZE), \
>   	"SPL image BSS too big");
> diff --git a/arch/arm/mach-at91/arm926ejs/u-boot-spl.lds b/arch/arm/mach-at91/arm926ejs/u-boot-spl.lds
> index 09cf838cf96e..1af4f7b6524c 100644
> --- a/arch/arm/mach-at91/arm926ejs/u-boot-spl.lds
> +++ b/arch/arm/mach-at91/arm926ejs/u-boot-spl.lds
> @@ -29,9 +29,11 @@ SECTIONS
>   	.data : { *(SORT_BY_ALIGNMENT(.data*)) } >.sram
>   
>   	. = ALIGN(4);
> -	__u_boot_list : { KEEP(*(SORT(__u_boot_list*))) } > .sram
> +	__u_boot_list : {
> +		KEEP(*(SORT(__u_boot_list*)))
> +		. = ALIGN(8);
> +	} > .sram
>   
> -	. = ALIGN(4);
>   	__image_copy_end = .;
>   	_end = .;
>   	_image_binary_end = .;
> @@ -51,6 +53,9 @@ ASSERT(__image_copy_end - __start <= (IMAGE_MAX_SIZE), \
>   	"SPL image too big");
>   #endif
>   
> +ASSERT(_image_binary_end % 8 == 0, \
> +       "_image_binary_end must be 8-byte aligned for device tree");
> +
>   #if defined(CONFIG_SPL_BSS_MAX_SIZE)
>   ASSERT(__bss_end - __bss_start <= (CONFIG_SPL_BSS_MAX_SIZE), \
>   	"SPL image BSS too big");
> diff --git a/arch/arm/mach-at91/armv7/u-boot-spl.lds b/arch/arm/mach-at91/armv7/u-boot-spl.lds
> index 460a91d93ec4..287764df48ff 100644
> --- a/arch/arm/mach-at91/armv7/u-boot-spl.lds
> +++ b/arch/arm/mach-at91/armv7/u-boot-spl.lds
> @@ -36,9 +36,11 @@ SECTIONS
>   	.data : { *(SORT_BY_ALIGNMENT(.data*)) } >.sram
>   
>   	. = ALIGN(4);
> -	__u_boot_list : { KEEP(*(SORT(__u_boot_list*))) } > .sram
> +	__u_boot_list : {
> +		KEEP(*(SORT(__u_boot_list*)))
> +		. = ALIGN(8);
> +	} > .sram
>   
> -	. = ALIGN(4);
>   	__image_copy_end = .;
>   	_end = .;
>   	_image_binary_end = .;
> @@ -52,3 +54,6 @@ SECTIONS
>   		__bss_end = .;
>   	} >.sdram
>   }
> +
> +ASSERT(_image_binary_end % 8 == 0, \
> +       "_image_binary_end must be 8-byte aligned for device tree");
> diff --git a/arch/arm/mach-omap2/u-boot-spl.lds b/arch/arm/mach-omap2/u-boot-spl.lds
> index 5ad169a37b73..86ab692ae390 100644
> --- a/arch/arm/mach-omap2/u-boot-spl.lds
> +++ b/arch/arm/mach-omap2/u-boot-spl.lds
> @@ -55,3 +55,6 @@ SECTIONS
>   		__bss_end = .;
>   	} >.sdram
>   }
> +
> +ASSERT(_image_binary_end % 8 == 0, \
> +       "_image_binary_end must be 8-byte aligned for device tree");
> diff --git a/arch/arm/mach-rockchip/u-boot-tpl-v8.lds b/arch/arm/mach-rockchip/u-boot-tpl-v8.lds
> index 958a1b70aefe..2c0f5c3e5f32 100644
> --- a/arch/arm/mach-rockchip/u-boot-tpl-v8.lds
> +++ b/arch/arm/mach-rockchip/u-boot-tpl-v8.lds
> @@ -42,9 +42,9 @@ SECTIONS
>   	__u_boot_list : {
>   		. = ALIGN(8);
>   		KEEP(*(SORT(__u_boot_list*)));
> +		. = ALIGN(8);
>   	}
>   
> -	. = ALIGN(8);
>   	__image_copy_end = .;
>   	_end = .;
>   	_image_binary_end = .;
> @@ -69,6 +69,9 @@ ASSERT(__image_copy_end - __image_copy_start < (CONFIG_TPL_MAX_SIZE), \
>   	"TPL image too big");
>   #endif
>   
> +ASSERT(_image_binary_end % 8 == 0, \
> +       "_image_binary_end must be 8-byte aligned for device tree");
> +
>   #if defined(CONFIG_TPL_BSS_MAX_SIZE)
>   ASSERT(__bss_end - __bss_start < (CONFIG_TPL_BSS_MAX_SIZE), \
>   	"TPL image BSS too big");
> diff --git a/arch/arm/mach-zynq/u-boot-spl.lds b/arch/arm/mach-zynq/u-boot-spl.lds
> index d96a57702886..17f0d7c9b72f 100644
> --- a/arch/arm/mach-zynq/u-boot-spl.lds
> +++ b/arch/arm/mach-zynq/u-boot-spl.lds
> @@ -39,10 +39,9 @@ SECTIONS
>   	. = ALIGN(4);
>   	__u_boot_list : {
>   		KEEP(*(SORT(__u_boot_list*)));
> +		. = ALIGN(8);
>   	} > .sram
>   
> -	. = ALIGN(4);
> -
>   	_image_binary_end = .;
>   
>   	_end = .;
> @@ -62,3 +61,6 @@ SECTIONS
>   	/DISCARD/ : { *(.interp*) }
>   	/DISCARD/ : { *(.gnu*) }
>   }
> +
> +ASSERT(_image_binary_end % 8 == 0, \
> +       "_image_binary_end must be 8-byte aligned for device tree");
> diff --git a/arch/arm/mach-zynq/u-boot.lds b/arch/arm/mach-zynq/u-boot.lds
> index f52523edf490..2a8e3399e0bf 100644
> --- a/arch/arm/mach-zynq/u-boot.lds
> +++ b/arch/arm/mach-zynq/u-boot.lds
> @@ -66,6 +66,7 @@ SECTIONS
>   		__rel_dyn_start = .;
>   		*(.rel*)
>   		__rel_dyn_end = .;
> +		. = ALIGN(8);
>   	}
>   
>   	_end = .;
> @@ -98,3 +99,5 @@ SECTIONS
>   	/DISCARD/ : { *(.ARM.exidx*) }
>   	/DISCARD/ : { *(.gnu.linkonce.armexidx.*) }
>   }
> +
> +ASSERT(_end % 8 == 0, "_end must be 8-byte aligned for device tree");
> diff --git a/board/davinci/da8xxevm/u-boot-spl-da850evm.lds b/board/davinci/da8xxevm/u-boot-spl-da850evm.lds
> index 56d6f4f114b9..d1a82e118af1 100644
> --- a/board/davinci/da8xxevm/u-boot-spl-da850evm.lds
> +++ b/board/davinci/da8xxevm/u-boot-spl-da850evm.lds
> @@ -43,6 +43,7 @@ SECTIONS
>   		__rel_dyn_start = .;
>   		*(.rel*)
>   		__rel_dyn_end = .;
> +		. = ALIGN(8);
>   	} >.sram
>   
>   	__image_copy_end = .;
> @@ -58,3 +59,6 @@ SECTIONS
>   		__bss_end = .;
>   	} >.sdram
>   }
> +
> +ASSERT(_image_binary_end % 8 == 0, \
> +       "_image_binary_end must be 8-byte aligned for device tree");
> diff --git a/board/samsung/common/exynos-uboot-spl.lds b/board/samsung/common/exynos-uboot-spl.lds
> index 9d3b57e98dbb..62e150bcf335 100644
> --- a/board/samsung/common/exynos-uboot-spl.lds
> +++ b/board/samsung/common/exynos-uboot-spl.lds
> @@ -48,7 +48,10 @@ SECTIONS
>   		. = ALIGN(4);
>   		__bss_start = .;
>   		*(.bss*)
> -		. = ALIGN(4);
> +		. = ALIGN(8);
>   		__bss_end = .;
>   	} >.sram
>   }
> +
> +ASSERT(__bss_end % 8 == 0, \
> +       "__bss_end must be 8-byte aligned for device tree");


Tested-by: Michal Simek <michal.simek at amd.com> # Zynq

Thanks,
Michal



More information about the U-Boot mailing list