On Fri, Mar 15, 2024 at 01:48:52PM -0600, Daniel Xu wrote: SNIP > +static int btf_encoder__tag_kfuncs(struct btf_encoder *encoder) > +{ > + const char *filename = encoder->filename; > + struct gobuffer btf_kfunc_ranges = {}; > + struct gobuffer btf_funcs = {}; > + Elf_Data *symbols = NULL; > + Elf_Data *idlist = NULL; > + Elf_Scn *symscn = NULL; > + int symbols_shndx = -1; > + size_t idlist_addr = 0; > + int fd = -1, err = -1; > + int idlist_shndx = -1; > + size_t strtabidx = 0; > + Elf_Scn *scn = NULL; > + Elf *elf = NULL; > + GElf_Shdr shdr; > + size_t strndx; > + char *secname; > + int nr_syms; > + int i = 0; > + > + fd = open(filename, O_RDONLY); > + if (fd < 0) { > + fprintf(stderr, "Cannot open %s\n", filename); > + goto out; > + } > + > + if (elf_version(EV_CURRENT) == EV_NONE) { > + elf_error("Cannot set libelf version"); > + goto out; > + } > + > + elf = elf_begin(fd, ELF_C_READ, NULL); > + if (elf == NULL) { > + elf_error("Cannot update ELF file"); > + goto out; > + } > + > + /* Locate symbol table and .BTF_ids sections */ > + if (elf_getshdrstrndx(elf, &strndx) < 0) > + goto out; nit, missing new line > + while ((scn = elf_nextscn(elf, scn)) != NULL) { > + Elf_Data *data; Acked/Tested-by: Jiri Olsa <jolsa@xxxxxxxxxx> thanks, jirka > + > + i++; > + if (!gelf_getshdr(scn, &shdr)) { > + elf_error("Failed to get ELF section(%d) hdr", i); > + goto out; > + } > + > + secname = elf_strptr(elf, strndx, shdr.sh_name); > + if (!secname) { > + elf_error("Failed to get ELF section(%d) hdr name", i); > + goto out; > + } > + > + data = elf_getdata(scn, 0); > + if (!data) { > + elf_error("Failed to get ELF section(%d) data", i); > + goto out; > + } > + > + if (shdr.sh_type == SHT_SYMTAB) { > + symbols_shndx = i; > + symscn = scn; > + symbols = data; > + strtabidx = shdr.sh_link; > + } else if (!strcmp(secname, BTF_IDS_SECTION)) { > + idlist_shndx = i; > + idlist_addr = shdr.sh_addr; > + idlist = data; > + } > + } SNIP