From: Stephen Brennan <stephen.s.brennan@oracle.com>
To: Arnaldo Carvalho de Melo <acme@kernel.org>
Cc: bpf@vger.kernel.org, dwarves@vger.kernel.org,
linux-debuggers@vger.kernel.org,
Stephen Brennan <stephen.s.brennan@oracle.com>,
Alan Maguire <alan.maguire@oracle.com>
Subject: [PATCH dwarves v2 3/4] btf_encoder: cache all ELF section info
Date: Fri, 20 Sep 2024 01:19:00 -0700 [thread overview]
Message-ID: <20240920081903.13473-4-stephen.s.brennan@oracle.com> (raw)
In-Reply-To: <20240920081903.13473-1-stephen.s.brennan@oracle.com>
To handle outputting all variables generally, we'll need to store more
section data. Create a table of ELF sections so we can refer to all the
cached data, not just the percpu section.
Signed-off-by: Stephen Brennan <stephen.s.brennan@oracle.com>
---
btf_encoder.c | 50 ++++++++++++++++++++++++++++++++++++--------------
1 file changed, 36 insertions(+), 14 deletions(-)
diff --git a/btf_encoder.c b/btf_encoder.c
index 8a2d92e..97d35e0 100644
--- a/btf_encoder.c
+++ b/btf_encoder.c
@@ -71,6 +71,12 @@ struct var_info {
uint32_t sz;
};
+struct elf_secinfo {
+ uint64_t addr;
+ const char *name;
+ uint64_t sz;
+};
+
/*
* cu: cu being processed.
*/
@@ -95,13 +101,13 @@ struct btf_encoder {
is_rel,
gen_distilled_base;
uint32_t array_index_id;
+ struct elf_secinfo *secinfo;
+ size_t seccnt;
struct {
struct var_info *vars;
int var_cnt;
int allocated;
uint32_t shndx;
- uint64_t base_addr;
- uint64_t sec_sz;
} percpu;
struct {
struct elf_function *entries;
@@ -1849,7 +1855,7 @@ static int btf_encoder__collect_percpu_var(struct btf_encoder *encoder, GElf_Sym
* ET_EXEC file) we need to subtract the section address.
*/
if (!encoder->is_rel)
- addr -= encoder->percpu.base_addr;
+ addr -= encoder->secinfo[encoder->percpu.shndx].addr;
if (encoder->percpu.var_cnt == encoder->percpu.allocated) {
struct var_info *new;
@@ -1923,6 +1929,7 @@ static int btf_encoder__encode_cu_variables(struct btf_encoder *encoder)
uint32_t core_id;
struct tag *pos;
int err = -1;
+ struct elf_secinfo *pcpu_scn = &encoder->secinfo[encoder->percpu.shndx];
if (encoder->percpu.shndx == 0 || !encoder->symtab)
return 0;
@@ -1954,9 +1961,9 @@ static int btf_encoder__encode_cu_variables(struct btf_encoder *encoder)
* always contains virtual symbol addresses, so subtract
* the section address unconditionally.
*/
- if (addr < encoder->percpu.base_addr || addr >= encoder->percpu.base_addr + encoder->percpu.sec_sz)
+ if (addr < pcpu_scn->addr || addr >= pcpu_scn->addr + pcpu_scn->sz)
continue;
- addr -= encoder->percpu.base_addr;
+ addr -= pcpu_scn->addr;
if (!btf_encoder__percpu_var_exists(encoder, addr, &size, &name))
continue; /* not a per-CPU variable */
@@ -2099,20 +2106,35 @@ struct btf_encoder *btf_encoder__new(struct cu *cu, const char *detached_filenam
goto out;
}
- /* find percpu section's shndx */
+ /* index the ELF sections for later lookup */
GElf_Shdr shdr;
- Elf_Scn *sec = elf_section_by_name(cu->elf, &shdr, PERCPU_SECTION, NULL);
+ size_t shndx;
+ if (elf_getshdrnum(cu->elf, &encoder->seccnt))
+ goto out_delete;
+ encoder->secinfo = calloc(encoder->seccnt, sizeof(*encoder->secinfo));
+ if (!encoder->secinfo) {
+ fprintf(stderr, "%s: error allocating memory for %zu ELF sections\n",
+ __func__, encoder->seccnt);
+ goto out_delete;
+ }
- if (!sec) {
- if (encoder->verbose)
- printf("%s: '%s' doesn't have '%s' section\n", __func__, cu->filename, PERCPU_SECTION);
- } else {
- encoder->percpu.shndx = elf_ndxscn(sec);
- encoder->percpu.base_addr = shdr.sh_addr;
- encoder->percpu.sec_sz = shdr.sh_size;
+ for (shndx = 0; shndx < encoder->seccnt; shndx++) {
+ const char *secname = NULL;
+ Elf_Scn *sec = elf_section_by_idx(cu->elf, &shdr, shndx, &secname);
+ if (!sec)
+ goto out_delete;
+ encoder->secinfo[shndx].addr = shdr.sh_addr;
+ encoder->secinfo[shndx].sz = shdr.sh_size;
+ encoder->secinfo[shndx].name = secname;
+
+ if (strcmp(secname, PERCPU_SECTION) == 0)
+ encoder->percpu.shndx = shndx;
}
+ if (!encoder->percpu.shndx && encoder->verbose)
+ printf("%s: '%s' doesn't have '%s' section\n", __func__, cu->filename, PERCPU_SECTION);
+
if (btf_encoder__collect_symbols(encoder, !encoder->skip_encoding_vars))
goto out_delete;
--
2.43.5
next prev parent reply other threads:[~2024-09-20 8:19 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-09-20 8:18 [PATCH dwarves v2 0/4] Emit global variables in BTF Stephen Brennan
2024-09-20 8:18 ` [PATCH dwarves v2 1/4] dutil: return ELF section name when looked up by index Stephen Brennan
2024-09-20 8:18 ` [PATCH dwarves v2 2/4] dwarf_loader: add "artificial" and "top_level" variable flags Stephen Brennan
2024-09-20 8:19 ` Stephen Brennan [this message]
2024-09-20 8:19 ` [PATCH dwarves v2 4/4] btf_encoder: add global_var feature to encode globals Stephen Brennan
2024-10-01 15:07 ` Arnaldo Carvalho de Melo
2024-10-01 17:13 ` Andrii Nakryiko
2024-10-01 18:52 ` Arnaldo Carvalho de Melo
2024-10-01 22:35 ` Stephen Brennan
2024-10-02 14:14 ` Jiri Olsa
2024-10-02 15:11 ` Alan Maguire
2024-10-03 13:10 ` 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=20240920081903.13473-4-stephen.s.brennan@oracle.com \
--to=stephen.s.brennan@oracle.com \
--cc=acme@kernel.org \
--cc=alan.maguire@oracle.com \
--cc=bpf@vger.kernel.org \
--cc=dwarves@vger.kernel.org \
--cc=linux-debuggers@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox