On Tue, Sep 29, 2026 at 11:21:33AM +0530, Shivang Upadhyay wrote:
> From: Sathvika Vasireddy <[email protected]>
> 
> When objtool writes changes back to vmlinux with --ftr-fixup --link,
> libelf recalculates the file layout and inserts padding between
> sections. This corrupts the ELF segment structure, causing kexec to
> fail with:
> 
>     ELF Note corrupted !
>     Cannot determine the file type of vmlinux
> 
> This happens because libelf's default behavior assumes it can freely
> rearrange section offsets when writing, which breaks the carefully
> constructed vmlinux layout produced by the linker.
> 
> Set ELF_F_LAYOUT after elf_begin() to instruct libelf that the
> application is responsible for the file layout. This prevents libelf
> from inserting padding or repositioning sections while still allowing
> data modifications to be written back.
> 
> Signed-off-by: Sathvika Vasireddy <[email protected]>
> Signed-off-by: Shivang Upadhyay <[email protected]>
> ---
>  tools/objtool/elf.c | 3 +++
>  1 file changed, 3 insertions(+)
> 
> diff --git a/tools/objtool/elf.c b/tools/objtool/elf.c
> index a791f4ea6ec1..55c20a993f5d 100644
> --- a/tools/objtool/elf.c
> +++ b/tools/objtool/elf.c
> @@ -1239,6 +1239,9 @@ struct elf *elf_open_read(const char *name, int flags)
>               goto err;
>       }
>  
> +     if (opts.ftr_fixup)
> +             elf_flagelf(elf->elf, ELF_C_SET, ELF_F_LAYOUT);

So per the previous email; you need this because this is a post-link
pass. As such, anything that has absolute sections would need this. So
should this be conditional on that, rather than ftr?

Reply via email to