[PATCH bpf-next 3/4] libbpf: Support relocations for bss.
From: Joe Stringer <hidden>
Date: 2019-02-12 00:47:47
Subsystem:
bpf [general] (safe dynamic programs and tools), bpf [library] (libbpf), the rest · Maintainers:
Alexei Starovoitov, Daniel Borkmann, Andrii Nakryiko, Eduard Zingerman, Kumar Kartikeya Dwivedi, Linus Torvalds
The BSS section in an ELF generated by LLVM represents constants for uninitialized variables or variables that are configured with a zero value. Support initializing zeroed static data by parsing the relocations with references to the .bss section and zeroing them. Signed-off-by: Joe Stringer <redacted> --- tools/lib/bpf/libbpf.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-)
diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c
index da35d5559b22..ff66d7e970c9 100644
--- a/tools/lib/bpf/libbpf.c
+++ b/tools/lib/bpf/libbpf.c@@ -141,6 +141,7 @@ struct bpf_program { RELO_LD64, RELO_CALL, RELO_DATA, + RELO_ZERO, } type; int insn_idx; union {
@@ -222,6 +223,7 @@ struct bpf_object { int maps_shndx; int text_shndx; int data_shndx; + int bss_shndx; } efile; /* * All loaded bpf_object is linked in a list, which is
@@ -901,6 +903,8 @@ static int bpf_object__elf_collect(struct bpf_object *obj, int flags) obj->efile.reloc[n].shdr = sh; obj->efile.reloc[n].data = data; } + } else if (sh.sh_type == SHT_NOBITS && strcmp(name, ".bss") == 0) { + obj->efile.bss_shndx = idx; } else { pr_debug("skip section(%d) %s\n", idx, name); }
@@ -971,6 +975,7 @@ bpf_program__collect_reloc(struct bpf_program *prog, GElf_Shdr *shdr, int text_shndx = obj->efile.text_shndx; int maps_shndx = obj->efile.maps_shndx; int data_shndx = obj->efile.data_shndx; + int bss_shndx = obj->efile.bss_shndx; struct bpf_map *maps = obj->maps; size_t nr_maps = obj->nr_maps; int i, nrels;
@@ -1010,7 +1015,7 @@ bpf_program__collect_reloc(struct bpf_program *prog, GElf_Shdr *shdr, (long long) sym.st_value, sym.st_name); if (sym.st_shndx != maps_shndx && sym.st_shndx != text_shndx && - sym.st_shndx != data_shndx) { + sym.st_shndx != data_shndx && sym.st_shndx != bss_shndx) { pr_warning("Program '%s' contains unrecognized relo data pointing to section %u\n", prog->section_name, sym.st_shndx); return -LIBBPF_ERRNO__RELOC;
@@ -1070,6 +1075,9 @@ bpf_program__collect_reloc(struct bpf_program *prog, GElf_Shdr *shdr, prog->reloc_desc[i].type = RELO_DATA; prog->reloc_desc[i].insn_idx = insn_idx; prog->reloc_desc[i].data = *static_data; + } else if (sym.st_shndx == bss_shndx) { + prog->reloc_desc[i].type = RELO_ZERO; + prog->reloc_desc[i].insn_idx = insn_idx; } } return 0;
@@ -1429,6 +1437,10 @@ bpf_program__relocate(struct bpf_program *prog, struct bpf_object *obj) insn_idx = prog->reloc_desc[i].insn_idx; insns[insn_idx].imm = prog->reloc_desc[i].data; + } else if (prog->reloc_desc[i].type == RELO_ZERO) { + int insn_idx = prog->reloc_desc[i].insn_idx; + + prog->insns[insn_idx].imm = 0; } }
--
2.19.1