|
@@ -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",
|
|
|
|
- section_name);
|
|
|
|
|
|
+ pr_warning("failed to alloc name for prog under section(%d) %s\n",
|
|
|
|
+ idx, section_name);
|
|
goto errout;
|
|
goto errout;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -742,6 +742,24 @@ bpf_object__init_maps(struct bpf_object *obj)
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static bool section_have_execinstr(struct bpf_object *obj, int idx)
|
|
|
|
+{
|
|
|
|
+ Elf_Scn *scn;
|
|
|
|
+ GElf_Shdr sh;
|
|
|
|
+
|
|
|
|
+ scn = elf_getscn(obj->efile.elf, idx);
|
|
|
|
+ if (!scn)
|
|
|
|
+ return false;
|
|
|
|
+
|
|
|
|
+ if (gelf_getshdr(scn, &sh) != &sh)
|
|
|
|
+ return false;
|
|
|
|
+
|
|
|
|
+ if (sh.sh_flags & SHF_EXECINSTR)
|
|
|
|
+ return true;
|
|
|
|
+
|
|
|
|
+ return false;
|
|
|
|
+}
|
|
|
|
+
|
|
static int bpf_object__elf_collect(struct bpf_object *obj)
|
|
static int bpf_object__elf_collect(struct bpf_object *obj)
|
|
{
|
|
{
|
|
Elf *elf = obj->efile.elf;
|
|
Elf *elf = obj->efile.elf;
|
|
@@ -763,29 +781,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",
|
|
|
|
- obj->path);
|
|
|
|
|
|
+ pr_warning("failed to get section(%d) header from %s\n",
|
|
|
|
+ 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",
|
|
|
|
- obj->path);
|
|
|
|
|
|
+ pr_warning("failed to get section(%d) name from %s\n",
|
|
|
|
+ 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",
|
|
|
|
- name, obj->path);
|
|
|
|
|
|
+ pr_warning("failed to get section(%d) data from %s(%s)\n",
|
|
|
|
+ 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",
|
|
|
|
- name, (unsigned long)data->d_size,
|
|
|
|
|
|
+ pr_debug("section(%d) %s, size %ld, link %d, flags %lx, type=%d\n",
|
|
|
|
+ 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);
|
|
|
|
|
|
@@ -825,6 +843,14 @@ static int bpf_object__elf_collect(struct bpf_object *obj)
|
|
} else if (sh.sh_type == SHT_REL) {
|
|
} else if (sh.sh_type == SHT_REL) {
|
|
void *reloc = obj->efile.reloc;
|
|
void *reloc = obj->efile.reloc;
|
|
int nr_reloc = obj->efile.nr_reloc + 1;
|
|
int nr_reloc = obj->efile.nr_reloc + 1;
|
|
|
|
+ int sec = sh.sh_info; /* points to other section */
|
|
|
|
+
|
|
|
|
+ /* Only do relo for section with exec instructions */
|
|
|
|
+ if (!section_have_execinstr(obj, sec)) {
|
|
|
|
+ pr_debug("skip relo %s(%d) for section(%d)\n",
|
|
|
|
+ name, idx, sec);
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
|
|
|
|
reloc = realloc(reloc,
|
|
reloc = realloc(reloc,
|
|
sizeof(*obj->efile.reloc) * nr_reloc);
|
|
sizeof(*obj->efile.reloc) * nr_reloc);
|
|
@@ -840,6 +866,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 +1147,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",
|
|
|
|
- idx);
|
|
|
|
|
|
+ pr_warning("relocation failed: no section(%d)\n", idx);
|
|
return -LIBBPF_ERRNO__RELOC;
|
|
return -LIBBPF_ERRNO__RELOC;
|
|
}
|
|
}
|
|
|
|
|