Commit 077c066a authored by Jesper Dangaard Brouer's avatar Jesper Dangaard Brouer Committed by Daniel Borkmann

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: default avatarJesper Dangaard Brouer <brouer@redhat.com>
Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
parent 8c88181e
...@@ -319,8 +319,8 @@ bpf_program__init(void *data, size_t size, char *section_name, int idx, ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment