From: Nicolas Schier <nicolas@fjasle.eu>
To: Nathan Chancellor <nathan@kernel.org>
Cc: masahiroy@kernel.org, ndesaulniers@google.com, morbo@google.com,
justinstitt@google.com, keescook@chromium.org,
maskray@google.com, linux-kbuild@vger.kernel.org,
bpf@vger.kernel.org, llvm@lists.linux.dev,
patches@lists.linux.dev, stable@vger.kernel.org
Subject: Re: [PATCH] kbuild: Fix changing ELF file type for output of gen_btf for big endian
Date: Thu, 8 Feb 2024 22:10:54 +0100 [thread overview]
Message-ID: <ZcVDXhFQB1tzka3C@fjasle.eu> (raw)
In-Reply-To: <20240208-fix-elf-type-btf-vmlinux-bin-o-big-endian-v1-1-cb3112491edc@kernel.org>
[-- Attachment #1: Type: text/plain, Size: 3142 bytes --]
On Thu, Feb 08, 2024 at 01:21:06PM -0700 Nathan Chancellor wrote:
> Commit 90ceddcb4950 ("bpf: Support llvm-objcopy for vmlinux BTF")
> changed the ELF type of .btf.vmlinux.bin.o from ET_EXEC to ET_REL via
> dd, which works fine for little endian platforms:
>
> 00000000 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 |.ELF............|
> -00000010 03 00 b7 00 01 00 00 00 00 00 00 80 00 80 ff ff |................|
> +00000010 01 00 b7 00 01 00 00 00 00 00 00 80 00 80 ff ff |................|
>
> However, for big endian platforms, it changes the wrong byte, resulting
> in an invalid ELF file type, which ld.lld rejects:
>
> 00000000 7f 45 4c 46 02 02 01 00 00 00 00 00 00 00 00 00 |.ELF............|
> -00000010 00 03 00 16 00 00 00 01 00 00 00 00 00 10 00 00 |................|
> +00000010 01 03 00 16 00 00 00 01 00 00 00 00 00 10 00 00 |................|
>
> Type: <unknown>: 103
>
> ld.lld: error: .btf.vmlinux.bin.o: unknown file type
>
> Fix this by using a different seek value for dd when targeting big
> endian, so that the correct byte gets changed and everything works
> correctly for all linkers.
>
> 00000000 7f 45 4c 46 02 02 01 00 00 00 00 00 00 00 00 00 |.ELF............|
> -00000010 00 03 00 16 00 00 00 01 00 00 00 00 00 10 00 00 |................|
> +00000010 00 01 00 16 00 00 00 01 00 00 00 00 00 10 00 00 |................|
>
> Type: REL (Relocatable file)
>
> Cc: stable@vger.kernel.org
> Fixes: 90ceddcb4950 ("bpf: Support llvm-objcopy for vmlinux BTF")
> Link: https://github.com/llvm/llvm-project/pull/75643
> Signed-off-by: Nathan Chancellor <nathan@kernel.org>
> ---
> scripts/link-vmlinux.sh | 11 +++++++++--
> 1 file changed, 9 insertions(+), 2 deletions(-)
>
> diff --git a/scripts/link-vmlinux.sh b/scripts/link-vmlinux.sh
> index a432b171be82..8a9f48b3cb32 100755
> --- a/scripts/link-vmlinux.sh
> +++ b/scripts/link-vmlinux.sh
> @@ -135,8 +135,15 @@ gen_btf()
> ${OBJCOPY} --only-section=.BTF --set-section-flags .BTF=alloc,readonly \
> --strip-all ${1} ${2} 2>/dev/null
> # Change e_type to ET_REL so that it can be used to link final vmlinux.
> - # Unlike GNU ld, lld does not allow an ET_EXEC input.
> - printf '\1' | dd of=${2} conv=notrunc bs=1 seek=16 status=none
> + # Unlike GNU ld, lld does not allow an ET_EXEC input. Make sure the correct
> + # byte gets changed with big endian platforms, otherwise e_type may be an
> + # invalid value.
> + if is_enabled CONFIG_CPU_BIG_ENDIAN; then
> + seek=17
> + else
> + seek=16
> + fi
> + printf '\1' | dd of=${2} conv=notrunc bs=1 seek=${seek} status=none
> }
>
> # Create ${2} .S file with all symbols from the ${1} object file
>
> ---
> base-commit: 54be6c6c5ae8e0d93a6c4641cb7528eb0b6ba478
> change-id: 20240208-fix-elf-type-btf-vmlinux-bin-o-big-endian-dbc55a1e1296
>
> Best regards,
> --
> Nathan Chancellor <nathan@kernel.org>
>
Thanks for the verbose examples!
Looks good to me.
Reviewed-by: Nicolas Schier <nicolas@fjasle.eu>
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
next prev parent reply other threads:[~2024-02-08 21:12 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-02-08 20:21 [PATCH] kbuild: Fix changing ELF file type for output of gen_btf for big endian Nathan Chancellor
2024-02-08 21:10 ` Nicolas Schier [this message]
2024-02-08 21:22 ` Fangrui Song
2024-02-08 21:50 ` Justin Stitt
2024-02-10 0:48 ` Kees Cook
2024-02-13 0:55 ` Masahiro Yamada
2024-02-13 1:43 ` Nathan Chancellor
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=ZcVDXhFQB1tzka3C@fjasle.eu \
--to=nicolas@fjasle.eu \
--cc=bpf@vger.kernel.org \
--cc=justinstitt@google.com \
--cc=keescook@chromium.org \
--cc=linux-kbuild@vger.kernel.org \
--cc=llvm@lists.linux.dev \
--cc=masahiroy@kernel.org \
--cc=maskray@google.com \
--cc=morbo@google.com \
--cc=nathan@kernel.org \
--cc=ndesaulniers@google.com \
--cc=patches@lists.linux.dev \
--cc=stable@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.