From: Jiri Olsa <olsajiri@gmail.com>
To: Tony Ambardar <tony.ambardar@gmail.com>
Cc: bpf@vger.kernel.org, linux-kselftest@vger.kernel.org,
Andrii Nakryiko <andrii@kernel.org>,
Eduard Zingerman <eddyz87@gmail.com>,
Alexei Starovoitov <ast@kernel.org>,
Daniel Borkmann <daniel@iogearbox.net>,
Martin KaFai Lau <martin.lau@linux.dev>,
Song Liu <song@kernel.org>,
Yonghong Song <yonghong.song@linux.dev>,
John Fastabend <john.fastabend@gmail.com>,
KP Singh <kpsingh@kernel.org>,
Stanislav Fomichev <sdf@fomichev.me>, Hao Luo <haoluo@google.com>,
Mykola Lysenko <mykolal@fb.com>, Shuah Khan <shuah@kernel.org>,
Jean-Philippe Brucker <jean-philippe@linaro.org>,
Viktor Malik <vmalik@redhat.com>
Subject: Re: [PATCH bpf-next v1 1/3] tools/resolve_btfids: Simplify handling cross-endian compilation
Date: Mon, 23 Sep 2024 12:55:18 +0200 [thread overview]
Message-ID: <ZvFJFknBkGvaA024@krava> (raw)
In-Reply-To: <609abfededc3664da891514fcd687990547b8be4.1726806756.git.tony.ambardar@gmail.com>
On Fri, Sep 20, 2024 at 12:49:11AM -0700, Tony Ambardar wrote:
SNIP
> +static int btfids_endian_fix(struct object *obj)
> +{
> + Elf_Data *btfids = obj->efile.idlist;
> + Elf *elf = obj->efile.elf;
> + int file_byteorder;
> +
> + /* This should always succeed due to prior ELF checks */
> + file_byteorder = elf_getident(elf, NULL)[EI_DATA];
> +
> + /* Set type to ensure endian translation occurs, and manually invoke
> + * translation on input since .BTF_ids section as created disables it.
> + */
> + btfids->d_type = ELF_T_WORD;
> + if (gelf_xlatetom(elf, btfids, btfids, file_byteorder) == NULL) {
> + pr_err("FAILED xlatetom .BTF_ids data: %s\n", elf_errmsg(-1));
> + return -1;
> + }
> + return 0;
> +}
> +
> static int elf_collect(struct object *obj)
> {
> Elf_Scn *scn = NULL;
> size_t shdrstrndx;
> - GElf_Ehdr ehdr;
> int idx = 0;
> Elf *elf;
> int fd;
> @@ -361,13 +371,6 @@ static int elf_collect(struct object *obj)
> return -1;
> }
>
> - if (gelf_getehdr(obj->efile.elf, &ehdr) == NULL) {
> - pr_err("FAILED cannot get ELF header: %s\n",
> - elf_errmsg(-1));
> - return -1;
> - }
> - obj->efile.encoding = ehdr.e_ident[EI_DATA];
> -
> /*
> * Scan all the elf sections and look for save data
> * from .BTF_ids section and symbols.
> @@ -409,6 +412,8 @@ static int elf_collect(struct object *obj)
> obj->efile.idlist = data;
> obj->efile.idlist_shndx = idx;
> obj->efile.idlist_addr = sh.sh_addr;
> + if (btfids_endian_fix(obj))
> + return -1;
nit, it'd be bit more clear to me without using the btfids_endian_fix
function and just unwind it in here.. but anyway lgtm
Acked-by: Jiri Olsa <jolsa@kernel.org>
jirka
> } else if (!strcmp(name, BTF_BASE_ELF_SEC)) {
> /* If a .BTF.base section is found, do not resolve
> * BTF ids relative to vmlinux; resolve relative
> @@ -706,24 +711,6 @@ static int sets_patch(struct object *obj)
> */
> BUILD_BUG_ON((u32 *)set8->pairs != &set8->pairs[0].id);
> qsort(set8->pairs, set8->cnt, sizeof(set8->pairs[0]), cmp_id);
> -
> - /*
> - * When ELF endianness does not match endianness of the
> - * host, libelf will do the translation when updating
> - * the ELF. This, however, corrupts SET8 flags which are
> - * already in the target endianness. So, let's bswap
> - * them to the host endianness and libelf will then
> - * correctly translate everything.
> - */
> - if (obj->efile.encoding != ELFDATANATIVE) {
> - int i;
> -
> - set8->flags = bswap_32(set8->flags);
> - for (i = 0; i < set8->cnt; i++) {
> - set8->pairs[i].flags =
> - bswap_32(set8->pairs[i].flags);
> - }
> - }
> }
>
> pr_debug("sorting addr %5lu: cnt %6d [%s]\n",
> @@ -748,9 +735,6 @@ static int symbols_patch(struct object *obj)
> if (sets_patch(obj))
> return -1;
>
> - /* Set type to ensure endian translation occurs. */
> - obj->efile.idlist->d_type = ELF_T_WORD;
> -
> elf_flagdata(obj->efile.idlist, ELF_C_SET, ELF_F_DIRTY);
>
> err = elf_update(obj->efile.elf, ELF_C_WRITE);
> --
> 2.34.1
>
next prev parent reply other threads:[~2024-09-23 10:55 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-09-20 7:49 [PATCH bpf-next v1 0/3] Improve .BTF_ids patching and alignment Tony Ambardar
2024-09-20 7:49 ` [PATCH bpf-next v1 1/3] tools/resolve_btfids: Simplify handling cross-endian compilation Tony Ambardar
2024-09-21 9:38 ` Eduard Zingerman
2024-09-23 10:55 ` Jiri Olsa [this message]
2024-10-14 12:56 ` Viktor Malik
2024-09-20 7:49 ` [PATCH bpf-next v1 2/3] bpf: btf: Ensure natural alignment of .BTF_ids section Tony Ambardar
2024-09-21 9:46 ` Eduard Zingerman
2024-09-23 10:54 ` Jiri Olsa
2024-09-23 11:39 ` Eduard Zingerman
2024-09-20 7:49 ` [PATCH bpf-next v1 3/3] tools/bpf, selftests/bpf : Sync btf_ids.h to tools Tony Ambardar
2024-09-23 11:07 ` [PATCH bpf-next v1 0/3] Improve .BTF_ids patching and alignment Jiri Olsa
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=ZvFJFknBkGvaA024@krava \
--to=olsajiri@gmail.com \
--cc=andrii@kernel.org \
--cc=ast@kernel.org \
--cc=bpf@vger.kernel.org \
--cc=daniel@iogearbox.net \
--cc=eddyz87@gmail.com \
--cc=haoluo@google.com \
--cc=jean-philippe@linaro.org \
--cc=john.fastabend@gmail.com \
--cc=kpsingh@kernel.org \
--cc=linux-kselftest@vger.kernel.org \
--cc=martin.lau@linux.dev \
--cc=mykolal@fb.com \
--cc=sdf@fomichev.me \
--cc=shuah@kernel.org \
--cc=song@kernel.org \
--cc=tony.ambardar@gmail.com \
--cc=vmalik@redhat.com \
--cc=yonghong.song@linux.dev \
/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.