[PATCH 15/19] ARM: link ELF image into PBL

Ahmad Fatoum a.fatoum at pengutronix.de
Mon Jan 5 04:27:51 PST 2026


Hi,

On 1/5/26 12:26 PM, Sascha Hauer wrote:
> Instead of linking the raw binary barebox proper image into the PBL link
> the ELF image into the PBL. With this barebox proper starts with a properly
> linked and fully initialized C environment, so the calls to
> relocate_to_adr() and setup_c() can be removed from barebox proper.
> 
> Signed-off-by: Sascha Hauer <s.hauer at pengutronix.de>
> ---
>  arch/arm/Kconfig          |  2 ++
>  arch/arm/cpu/start.c      |  4 ----
>  arch/arm/cpu/uncompress.c | 32 ++++++++++++++++++++++++++------
>  3 files changed, 28 insertions(+), 10 deletions(-)
> 
> diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
> index afa6de3cd0b145e42755e3ca2d7a13c8a69ff1d3..60975083b32f3127f982c526c6cf30ffe3e45924 100644
> --- a/arch/arm/Kconfig
> +++ b/arch/arm/Kconfig
> @@ -17,6 +17,8 @@ config ARM
>  	select HAVE_ARCH_BOOTM_OFTREE
>  	select HW_HAS_PCI
>  	select ARCH_HAS_DMA_WRITE_COMBINE
> +	select ELF
> +	select PBL_IMAGE_ELF
>  	default y
>  
>  config ARCH_LINUX_NAME
> diff --git a/arch/arm/cpu/start.c b/arch/arm/cpu/start.c
> index f7d4507e71588ba5e241b24b952d55e2a4b0f794..71a12abdd0941889617e6b63063304d0e4522c81 100644
> --- a/arch/arm/cpu/start.c
> +++ b/arch/arm/cpu/start.c
> @@ -139,10 +139,6 @@ __noreturn __prereloc void barebox_non_pbl_start(unsigned long membase,

void NAKED __prereloc __section(.text_entry) start should no longer be
needed as well as the .text_entry section itself.

>  	if (IS_ENABLED(CONFIG_CPU_V7))
>  		armv7_hyp_install();
>  
> -	relocate_to_adr(barebox_base);
> -
> -	setup_c();
> -
>  	barrier();

You can also drop the barrier while at it.

> +	struct elf_image elf;
> +	int ret;

Move to start of function?

> +
> +	ret = elf_open_binary_into(&elf, (void *)barebox_base);
> +	if (ret) {
> +		pr_err("Failed to open ELF binary: %d\n", ret);
> +		hang();

panic?

> +	}
> +
> +	ret = elf_load_inplace(&elf);
> +	if (ret) {
> +		pr_err("Failed to relocate ELF: %d\n", ret);
> +		hang();

panic?

> +	}
> +
> +	pr_debug("ELF entry point: 0x%llx\n", elf.entry);
>  
>  	if (IS_ENABLED(CONFIG_THUMB2_BAREBOX))
> -		barebox = (void *)(barebox_base + 1);
> +		barebox = (void *)(unsigned long)(elf.entry | 1);

In my testing the ELF file already had an odd address. Was it different
for you?

>  	else
> -		barebox = (void *)barebox_base;
> +		barebox = (void *)(unsigned long)elf.entry;

I have patches that I can submit afterwards that share some of the ELF
info with barebox proper. This allows us to avoid recomputing addresses
relative to endmem again and just use the info extract from the ELF.

Cheers,
Ahmad

-- 
Pengutronix e.K.                  |                             |
Steuerwalder Str. 21              | http://www.pengutronix.de/  |
31137 Hildesheim, Germany         | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686  | Fax:   +49-5121-206917-5555 |




More information about the barebox mailing list