From: Eduard Zingerman <eddyz87@gmail.com>
To: Jiri Olsa <olsajiri@gmail.com>
Cc: dwarves@vger.kernel.org, arnaldo.melo@gmail.com,
bpf@vger.kernel.org, kernel-team@fb.com, ast@kernel.org,
daniel@iogearbox.net, andrii@kernel.org,
yonghong.song@linux.dev, Alan Maguire <alan.maguire@oracle.com>,
Daniel Xu <dxu@dxuuu.xyz>,
Kumar Kartikeya Dwivedi <memxor@gmail.com>,
Vadim Fedorenko <vadfed@meta.com>
Subject: Re: [PATCH dwarves v1] btf_encoder: handle .BTF_ids section endianness when cross-compiling
Date: Fri, 22 Nov 2024 10:08:17 -0800 [thread overview]
Message-ID: <ba19c9a020f2f3d9895493930bdd3a7d7a58f1cd.camel@gmail.com> (raw)
In-Reply-To: <Z0CfBQR8zxgJv_AP@krava>
On Fri, 2024-11-22 at 16:11 +0100, Jiri Olsa wrote:
> On Thu, Nov 21, 2024 at 11:02:18PM -0800, Eduard Zingerman wrote:
> > btf_encoder__tag_kfuncs() reads .BTF_ids section to identify a set of
> > kfuncs present in the ELF being processed. This section consists of
> > records of the following shape:
> >
> > struct btf_id_and_flag {
> > uint32_t id;
> > uint32_t flags;
> > };
>
> it contains pairs like above and also just id arrays with no flags, but
> that does not matter for the patch functionality, because you swap by
> u32 values anyway
Right, I'll update the description, thank you.
[...]
> > @@ -1847,11 +1848,47 @@ static int btf_encoder__tag_kfunc(struct btf_encoder *encoder, struct gobuffer *
> > return 0;
> > }
> >
> > +/* If byte order of 'elf' differs from current byte order, convert the data->d_buf.
> > + * ELF file is opened in a readonly mode, so data->d_buf cannot be modified in place.
> > + * Instead, allocate a new buffer if modification is necessary.
> > + */
> > +static int convert_idlist_endianness(Elf *elf, Elf_Data *data, bool *copied)
> > +{
> > + int byteorder, i;
> > + char *elf_ident;
> > + uint32_t *tmp;
> > +
> > + *copied = false;
> > + elf_ident = elf_getident(elf, NULL);
> > + if (elf_ident == NULL) {
> > + fprintf(stderr, "Cannot get ELF identification from header\n");
> > + return -EINVAL;
> > + }
> > + byteorder = elf_ident[EI_DATA];
> > + if ((BYTE_ORDER == LITTLE_ENDIAN && byteorder == ELFDATA2LSB)
> > + || (BYTE_ORDER == BIG_ENDIAN && byteorder == ELFDATA2MSB))
> > + return 0;
> > + tmp = malloc(data->d_size);
> > + if (tmp == NULL) {
> > + fprintf(stderr, "Cannot allocate %lu bytes of memory\n", data->d_size);
> > + return -ENOMEM;
> > + }
> > + memcpy(tmp, data->d_buf, data->d_size);
> > + data->d_buf = tmp;
>
> will the original data->d_buf be leaked? are we allowed to assign d_buf like that? ;-)
Well, before sending I checked using address sanitizer, and it did not complain.
As far as I understand elfutils elf_getdata.c / elf_end.c [0]:
- elf_getdata() allocates memory for full section (elf_getdata.c:333),
before setting d_buf field of Elf_Data;
- elf_end() frees memory for full section (elf_end.c:174).
So I assumed that this is hacky but not that bad.
Given that current patch depends on implementation details it is
probably better to switch to one of the alternatives:
a. allocate new Elf_Data object using elf_newdata() API;
b. just allocate a fake instance of Elf_Data on stack in btf_encoder__tag_kfuncs().
(a) seems to be an Ok option, wdyt?
[0] b2f225d6bff8 ("Consolidate and add files to clean target variables")
git://sourceware.org/git/elfutils.git
[...]
> > if (fd != -1)
> > diff --git a/lib/bpf b/lib/bpf
> > index 09b9e83..caa17bd 160000
> > --- a/lib/bpf
> > +++ b/lib/bpf
> > @@ -1 +1 @@
> > -Subproject commit 09b9e83102eb8ab9e540d36b4559c55f3bcdb95d
> > +Subproject commit caa17bdcbfc58e68eaf4d017c058e6577606bf56
>
> I think this should not be part of the patch
Sorry, didn't notice this thing.
next prev parent reply other threads:[~2024-11-22 18:08 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-11-22 7:02 [PATCH dwarves v1] btf_encoder: handle .BTF_ids section endianness when cross-compiling Eduard Zingerman
2024-11-22 15:03 ` Vadim Fedorenko
2024-11-22 15:11 ` Jiri Olsa
2024-11-22 18:08 ` Eduard Zingerman [this message]
2024-11-22 18:16 ` Eduard Zingerman
2024-11-26 19:26 ` Andrii Nakryiko
2024-11-26 19:31 ` Eduard Zingerman
2024-11-26 21:51 ` Andrii Nakryiko
2024-11-27 0:30 ` Eduard Zingerman
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=ba19c9a020f2f3d9895493930bdd3a7d7a58f1cd.camel@gmail.com \
--to=eddyz87@gmail.com \
--cc=alan.maguire@oracle.com \
--cc=andrii@kernel.org \
--cc=arnaldo.melo@gmail.com \
--cc=ast@kernel.org \
--cc=bpf@vger.kernel.org \
--cc=daniel@iogearbox.net \
--cc=dwarves@vger.kernel.org \
--cc=dxu@dxuuu.xyz \
--cc=kernel-team@fb.com \
--cc=memxor@gmail.com \
--cc=olsajiri@gmail.com \
--cc=vadfed@meta.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.