lkml.org 
[lkml]   [2015]   [Jul]   [9]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 03/39] bpf tools: Collect relocation sections from SHT_REL sections
    Date
    This patch collects relocation sections into 'struct object'.  Such
    sections are used for connecting maps to bpf programs. 'reloc' field in
    'struct bpf_object' is introduced for storing such information.

    This patch simply store the data into 'reloc' field. Following patch
    will parse them to know the exact instructions which are needed to be
    relocated.

    Note that the collected data will be invalid after ELF object file is
    closed.

    This is the second patch related to map relocation. The first one is
    'bpf tools: Collect symbol table from SHT_SYMTAB section'. The
    principle of map relocation is described in its commit message.

    Signed-off-by: Wang Nan <wangnan0@huawei.com>
    Acked-by: Alexei Starovoitov <ast@plumgrid.com>
    Cc: Brendan Gregg <brendan.d.gregg@gmail.com>
    Cc: Daniel Borkmann <daniel@iogearbox.net>
    Cc: David Ahern <dsahern@gmail.com>
    Cc: He Kuang <hekuang@huawei.com>
    Cc: Jiri Olsa <jolsa@kernel.org>
    Cc: Kaixu Xia <xiakaixu@huawei.com>
    Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
    Cc: Namhyung Kim <namhyung@kernel.org>
    Cc: Paul Mackerras <paulus@samba.org>
    Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
    Cc: Zefan Li <lizefan@huawei.com>
    Cc: pi3orama@163.com
    Link: http://lkml.kernel.org/r/1435716878-189507-14-git-send-email-wangnan0@huawei.com
    Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
    ---
    tools/lib/bpf/libbpf.c | 26 ++++++++++++++++++++++++++
    1 file changed, 26 insertions(+)

    diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c
    index 3b717de..5f12fa6 100644
    --- a/tools/lib/bpf/libbpf.c
    +++ b/tools/lib/bpf/libbpf.c
    @@ -110,6 +110,11 @@ struct bpf_object {
    Elf *elf;
    GElf_Ehdr ehdr;
    Elf_Data *symbols;
    + struct {
    + GElf_Shdr shdr;
    + Elf_Data *data;
    + } *reloc;
    + int nr_reloc;
    } efile;
    char path[];
    };
    @@ -230,6 +235,9 @@ static void bpf_object__elf_finish(struct bpf_object *obj)
    obj->efile.elf = NULL;
    }
    obj->efile.symbols = NULL;
    +
    + zfree(&obj->efile.reloc);
    + obj->efile.nr_reloc = 0;
    zclose(obj->efile.fd);
    obj->efile.obj_buf = NULL;
    obj->efile.obj_buf_sz = 0;
    @@ -450,6 +458,24 @@ static int bpf_object__elf_collect(struct bpf_object *obj)
    } else
    pr_debug("found program %s\n",
    prog->section_name);
    + } else if (sh.sh_type == SHT_REL) {
    + void *reloc = obj->efile.reloc;
    + int nr_reloc = obj->efile.nr_reloc + 1;
    +
    + reloc = realloc(reloc,
    + sizeof(*obj->efile.reloc) * nr_reloc);
    + if (!reloc) {
    + pr_warning("realloc failed\n");
    + err = -ENOMEM;
    + } else {
    + int n = nr_reloc - 1;
    +
    + obj->efile.reloc = reloc;
    + obj->efile.nr_reloc = nr_reloc;
    +
    + obj->efile.reloc[n].shdr = sh;
    + obj->efile.reloc[n].data = data;
    + }
    }
    if (err)
    goto out;
    --
    1.8.3.4


    \
     
     \ /
      Last update: 2015-07-09 15:01    [W:3.966 / U:0.024 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site