lkml.org 
[lkml]   [2015]   [Jun]   [26]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[RFC PATCH v9 08/50] bpf tools: Iterate over ELF sections to collect information
    Date
    bpf_obj_elf_collect() is introduced to iterate over each elf sections
    to collection information in eBPF object files. This function will
    futher enhanced to collect license, kernel version, programs, configs
    and map information.

    Signed-off-by: Wang Nan <wangnan0@huawei.com>
    Acked-by: Alexei Starovoitov <ast@plumgrid.com>
    ---
    tools/lib/bpf/libbpf.c | 53 ++++++++++++++++++++++++++++++++++++++++++++++++++
    1 file changed, 53 insertions(+)

    diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c
    index 15b3e82..d8d6eb5 100644
    --- a/tools/lib/bpf/libbpf.c
    +++ b/tools/lib/bpf/libbpf.c
    @@ -220,6 +220,57 @@ mismatch:
    return -EINVAL;
    }

    +static int bpf_object__elf_collect(struct bpf_object *obj)
    +{
    + Elf *elf = obj->efile.elf;
    + GElf_Ehdr *ep = &obj->efile.ehdr;
    + Elf_Scn *scn = NULL;
    + int idx = 0, err = 0;
    +
    + /* Elf is corrupted/truncated, avoid calling elf_strptr. */
    + if (!elf_rawdata(elf_getscn(elf, ep->e_shstrndx), NULL)) {
    + pr_warning("failed to get e_shstrndx from %s\n",
    + obj->path);
    + return -EINVAL;
    + }
    +
    + while ((scn = elf_nextscn(elf, scn)) != NULL) {
    + char *name;
    + GElf_Shdr sh;
    + Elf_Data *data;
    +
    + idx++;
    + if (gelf_getshdr(scn, &sh) != &sh) {
    + pr_warning("failed to get section header from %s\n",
    + obj->path);
    + err = -EINVAL;
    + goto out;
    + }
    +
    + name = elf_strptr(elf, ep->e_shstrndx, sh.sh_name);
    + if (!name) {
    + pr_warning("failed to get section name from %s\n",
    + obj->path);
    + err = -EINVAL;
    + goto out;
    + }
    +
    + data = elf_getdata(scn, 0);
    + if (!data) {
    + pr_warning("failed to get section data from %s(%s)\n",
    + name, obj->path);
    + err = -EINVAL;
    + goto out;
    + }
    + pr_debug("section %s, size %ld, link %d, flags %lx, type=%d\n",
    + name, (unsigned long)data->d_size,
    + (int)sh.sh_link, (unsigned long)sh.sh_flags,
    + (int)sh.sh_type);
    + }
    +out:
    + return err;
    +}
    +
    static struct bpf_object *
    __bpf_object__open(const char *path, void *obj_buf, size_t obj_buf_sz)
    {
    @@ -238,6 +289,8 @@ __bpf_object__open(const char *path, void *obj_buf, size_t obj_buf_sz)
    goto out;
    if (bpf_object__check_endianness(obj))
    goto out;
    + if (bpf_object__elf_collect(obj))
    + goto out;

    bpf_object__elf_finish(obj);
    return obj;
    --
    1.8.3.4


    \
     
     \ /
      Last update: 2015-06-26 16:41    [W:8.540 / U:0.024 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site