mirror of
https://github.com/fail0verflow/switch-linux.git
synced 2025-05-04 02:34:21 -04:00
tools/libbpf: improve the pr_debug statements to contain section numbers
While debugging a bpf ELF loading issue, I needed to correlate the ELF section number with the failed relocation section reference. Thus, add section numbers/index to the pr_debug. In debug mode, also print section that were skipped. This helped me identify that a section (.eh_frame) was skipped, and this was the reason the relocation section (.rel.eh_frame) could not find that section number. The section numbers corresponds to the readelf tools Section Headers [Nr]. Signed-off-by: Jesper Dangaard Brouer <brouer@redhat.com> Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
This commit is contained in:
parent
8c88181ed4
commit
077c066a6c
1 changed files with 13 additions and 12 deletions
|
@ -319,8 +319,8 @@ bpf_program__init(void *data, size_t size, char *section_name, int idx,
|
||||||
|
|
||||||
prog->section_name = strdup(section_name);
|
prog->section_name = strdup(section_name);
|
||||||
if (!prog->section_name) {
|
if (!prog->section_name) {
|
||||||
pr_warning("failed to alloc name for prog under section %s\n",
|
pr_warning("failed to alloc name for prog under section(%d) %s\n",
|
||||||
section_name);
|
idx, section_name);
|
||||||
goto errout;
|
goto errout;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -763,29 +763,29 @@ static int bpf_object__elf_collect(struct bpf_object *obj)
|
||||||
|
|
||||||
idx++;
|
idx++;
|
||||||
if (gelf_getshdr(scn, &sh) != &sh) {
|
if (gelf_getshdr(scn, &sh) != &sh) {
|
||||||
pr_warning("failed to get section header from %s\n",
|
pr_warning("failed to get section(%d) header from %s\n",
|
||||||
obj->path);
|
idx, obj->path);
|
||||||
err = -LIBBPF_ERRNO__FORMAT;
|
err = -LIBBPF_ERRNO__FORMAT;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
name = elf_strptr(elf, ep->e_shstrndx, sh.sh_name);
|
name = elf_strptr(elf, ep->e_shstrndx, sh.sh_name);
|
||||||
if (!name) {
|
if (!name) {
|
||||||
pr_warning("failed to get section name from %s\n",
|
pr_warning("failed to get section(%d) name from %s\n",
|
||||||
obj->path);
|
idx, obj->path);
|
||||||
err = -LIBBPF_ERRNO__FORMAT;
|
err = -LIBBPF_ERRNO__FORMAT;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
data = elf_getdata(scn, 0);
|
data = elf_getdata(scn, 0);
|
||||||
if (!data) {
|
if (!data) {
|
||||||
pr_warning("failed to get section data from %s(%s)\n",
|
pr_warning("failed to get section(%d) data from %s(%s)\n",
|
||||||
name, obj->path);
|
idx, name, obj->path);
|
||||||
err = -LIBBPF_ERRNO__FORMAT;
|
err = -LIBBPF_ERRNO__FORMAT;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
pr_debug("section %s, size %ld, link %d, flags %lx, type=%d\n",
|
pr_debug("section(%d) %s, size %ld, link %d, flags %lx, type=%d\n",
|
||||||
name, (unsigned long)data->d_size,
|
idx, name, (unsigned long)data->d_size,
|
||||||
(int)sh.sh_link, (unsigned long)sh.sh_flags,
|
(int)sh.sh_link, (unsigned long)sh.sh_flags,
|
||||||
(int)sh.sh_type);
|
(int)sh.sh_type);
|
||||||
|
|
||||||
|
@ -840,6 +840,8 @@ static int bpf_object__elf_collect(struct bpf_object *obj)
|
||||||
obj->efile.reloc[n].shdr = sh;
|
obj->efile.reloc[n].shdr = sh;
|
||||||
obj->efile.reloc[n].data = data;
|
obj->efile.reloc[n].data = data;
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
pr_debug("skip section(%d) %s\n", idx, name);
|
||||||
}
|
}
|
||||||
if (err)
|
if (err)
|
||||||
goto out;
|
goto out;
|
||||||
|
@ -1119,8 +1121,7 @@ static int bpf_object__collect_reloc(struct bpf_object *obj)
|
||||||
|
|
||||||
prog = bpf_object__find_prog_by_idx(obj, idx);
|
prog = bpf_object__find_prog_by_idx(obj, idx);
|
||||||
if (!prog) {
|
if (!prog) {
|
||||||
pr_warning("relocation failed: no %d section\n",
|
pr_warning("relocation failed: no section(%d)\n", idx);
|
||||||
idx);
|
|
||||||
return -LIBBPF_ERRNO__RELOC;
|
return -LIBBPF_ERRNO__RELOC;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue