linux/tools/lib/bpf/libbpf.c
<<
>>
Prefs
   1/*
   2 * Common eBPF ELF object loading operations.
   3 *
   4 * Copyright (C) 2013-2015 Alexei Starovoitov <ast@kernel.org>
   5 * Copyright (C) 2015 Wang Nan <wangnan0@huawei.com>
   6 * Copyright (C) 2015 Huawei Inc.
   7 */
   8
   9#include <stdlib.h>
  10#include <stdio.h>
  11#include <stdarg.h>
  12#include <inttypes.h>
  13#include <string.h>
  14#include <unistd.h>
  15#include <fcntl.h>
  16#include <errno.h>
  17#include <asm/unistd.h>
  18#include <linux/kernel.h>
  19#include <linux/bpf.h>
  20#include <linux/list.h>
  21#include <libelf.h>
  22#include <gelf.h>
  23
  24#include "libbpf.h"
  25#include "bpf.h"
  26
  27#define __printf(a, b)  __attribute__((format(printf, a, b)))
  28
  29__printf(1, 2)
  30static int __base_pr(const char *format, ...)
  31{
  32        va_list args;
  33        int err;
  34
  35        va_start(args, format);
  36        err = vfprintf(stderr, format, args);
  37        va_end(args);
  38        return err;
  39}
  40
  41static __printf(1, 2) libbpf_print_fn_t __pr_warning = __base_pr;
  42static __printf(1, 2) libbpf_print_fn_t __pr_info = __base_pr;
  43static __printf(1, 2) libbpf_print_fn_t __pr_debug;
  44
  45#define __pr(func, fmt, ...)    \
  46do {                            \
  47        if ((func))             \
  48                (func)("libbpf: " fmt, ##__VA_ARGS__); \
  49} while (0)
  50
  51#define pr_warning(fmt, ...)    __pr(__pr_warning, fmt, ##__VA_ARGS__)
  52#define pr_info(fmt, ...)       __pr(__pr_info, fmt, ##__VA_ARGS__)
  53#define pr_debug(fmt, ...)      __pr(__pr_debug, fmt, ##__VA_ARGS__)
  54
  55void libbpf_set_print(libbpf_print_fn_t warn,
  56                      libbpf_print_fn_t info,
  57                      libbpf_print_fn_t debug)
  58{
  59        __pr_warning = warn;
  60        __pr_info = info;
  61        __pr_debug = debug;
  62}
  63
  64#define STRERR_BUFSIZE  128
  65
  66#define ERRNO_OFFSET(e)         ((e) - __LIBBPF_ERRNO__START)
  67#define ERRCODE_OFFSET(c)       ERRNO_OFFSET(LIBBPF_ERRNO__##c)
  68#define NR_ERRNO        (__LIBBPF_ERRNO__END - __LIBBPF_ERRNO__START)
  69
  70static const char *libbpf_strerror_table[NR_ERRNO] = {
  71        [ERRCODE_OFFSET(LIBELF)]        = "Something wrong in libelf",
  72        [ERRCODE_OFFSET(FORMAT)]        = "BPF object format invalid",
  73        [ERRCODE_OFFSET(KVERSION)]      = "'version' section incorrect or lost",
  74        [ERRCODE_OFFSET(ENDIAN)]        = "Endian missmatch",
  75        [ERRCODE_OFFSET(INTERNAL)]      = "Internal error in libbpf",
  76        [ERRCODE_OFFSET(RELOC)]         = "Relocation failed",
  77        [ERRCODE_OFFSET(VERIFY)]        = "Kernel verifier blocks program loading",
  78        [ERRCODE_OFFSET(PROG2BIG)]      = "Program too big",
  79        [ERRCODE_OFFSET(KVER)]          = "Incorrect kernel version",
  80};
  81
  82int libbpf_strerror(int err, char *buf, size_t size)
  83{
  84        if (!buf || !size)
  85                return -1;
  86
  87        err = err > 0 ? err : -err;
  88
  89        if (err < __LIBBPF_ERRNO__START) {
  90                int ret;
  91
  92                ret = strerror_r(err, buf, size);
  93                buf[size - 1] = '\0';
  94                return ret;
  95        }
  96
  97        if (err < __LIBBPF_ERRNO__END) {
  98                const char *msg;
  99
 100                msg = libbpf_strerror_table[ERRNO_OFFSET(err)];
 101                snprintf(buf, size, "%s", msg);
 102                buf[size - 1] = '\0';
 103                return 0;
 104        }
 105
 106        snprintf(buf, size, "Unknown libbpf error %d", err);
 107        buf[size - 1] = '\0';
 108        return -1;
 109}
 110
 111#define CHECK_ERR(action, err, out) do {        \
 112        err = action;                   \
 113        if (err)                        \
 114                goto out;               \
 115} while(0)
 116
 117
 118/* Copied from tools/perf/util/util.h */
 119#ifndef zfree
 120# define zfree(ptr) ({ free(*ptr); *ptr = NULL; })
 121#endif
 122
 123#ifndef zclose
 124# define zclose(fd) ({                  \
 125        int ___err = 0;                 \
 126        if ((fd) >= 0)                  \
 127                ___err = close((fd));   \
 128        fd = -1;                        \
 129        ___err; })
 130#endif
 131
 132#ifdef HAVE_LIBELF_MMAP_SUPPORT
 133# define LIBBPF_ELF_C_READ_MMAP ELF_C_READ_MMAP
 134#else
 135# define LIBBPF_ELF_C_READ_MMAP ELF_C_READ
 136#endif
 137
 138/*
 139 * bpf_prog should be a better name but it has been used in
 140 * linux/filter.h.
 141 */
 142struct bpf_program {
 143        /* Index in elf obj file, for relocation use. */
 144        int idx;
 145        char *section_name;
 146        struct bpf_insn *insns;
 147        size_t insns_cnt;
 148
 149        struct {
 150                int insn_idx;
 151                int map_idx;
 152        } *reloc_desc;
 153        int nr_reloc;
 154
 155        struct {
 156                int nr;
 157                int *fds;
 158        } instances;
 159        bpf_program_prep_t preprocessor;
 160
 161        struct bpf_object *obj;
 162        void *priv;
 163        bpf_program_clear_priv_t clear_priv;
 164};
 165
 166struct bpf_map {
 167        int fd;
 168        char *name;
 169        struct bpf_map_def def;
 170        void *priv;
 171        bpf_map_clear_priv_t clear_priv;
 172};
 173
 174static LIST_HEAD(bpf_objects_list);
 175
 176struct bpf_object {
 177        char license[64];
 178        u32 kern_version;
 179
 180        struct bpf_program *programs;
 181        size_t nr_programs;
 182        struct bpf_map *maps;
 183        size_t nr_maps;
 184
 185        bool loaded;
 186
 187        /*
 188         * Information when doing elf related work. Only valid if fd
 189         * is valid.
 190         */
 191        struct {
 192                int fd;
 193                void *obj_buf;
 194                size_t obj_buf_sz;
 195                Elf *elf;
 196                GElf_Ehdr ehdr;
 197                Elf_Data *symbols;
 198                size_t strtabidx;
 199                struct {
 200                        GElf_Shdr shdr;
 201                        Elf_Data *data;
 202                } *reloc;
 203                int nr_reloc;
 204                int maps_shndx;
 205        } efile;
 206        /*
 207         * All loaded bpf_object is linked in a list, which is
 208         * hidden to caller. bpf_objects__<func> handlers deal with
 209         * all objects.
 210         */
 211        struct list_head list;
 212        char path[];
 213};
 214#define obj_elf_valid(o)        ((o)->efile.elf)
 215
 216static void bpf_program__unload(struct bpf_program *prog)
 217{
 218        int i;
 219
 220        if (!prog)
 221                return;
 222
 223        /*
 224         * If the object is opened but the program was never loaded,
 225         * it is possible that prog->instances.nr == -1.
 226         */
 227        if (prog->instances.nr > 0) {
 228                for (i = 0; i < prog->instances.nr; i++)
 229                        zclose(prog->instances.fds[i]);
 230        } else if (prog->instances.nr != -1) {
 231                pr_warning("Internal error: instances.nr is %d\n",
 232                           prog->instances.nr);
 233        }
 234
 235        prog->instances.nr = -1;
 236        zfree(&prog->instances.fds);
 237}
 238
 239static void bpf_program__exit(struct bpf_program *prog)
 240{
 241        if (!prog)
 242                return;
 243
 244        if (prog->clear_priv)
 245                prog->clear_priv(prog, prog->priv);
 246
 247        prog->priv = NULL;
 248        prog->clear_priv = NULL;
 249
 250        bpf_program__unload(prog);
 251        zfree(&prog->section_name);
 252        zfree(&prog->insns);
 253        zfree(&prog->reloc_desc);
 254
 255        prog->nr_reloc = 0;
 256        prog->insns_cnt = 0;
 257        prog->idx = -1;
 258}
 259
 260static int
 261bpf_program__init(void *data, size_t size, char *name, int idx,
 262                    struct bpf_program *prog)
 263{
 264        if (size < sizeof(struct bpf_insn)) {
 265                pr_warning("corrupted section '%s'\n", name);
 266                return -EINVAL;
 267        }
 268
 269        bzero(prog, sizeof(*prog));
 270
 271        prog->section_name = strdup(name);
 272        if (!prog->section_name) {
 273                pr_warning("failed to alloc name for prog %s\n",
 274                           name);
 275                goto errout;
 276        }
 277
 278        prog->insns = malloc(size);
 279        if (!prog->insns) {
 280                pr_warning("failed to alloc insns for %s\n", name);
 281                goto errout;
 282        }
 283        prog->insns_cnt = size / sizeof(struct bpf_insn);
 284        memcpy(prog->insns, data,
 285               prog->insns_cnt * sizeof(struct bpf_insn));
 286        prog->idx = idx;
 287        prog->instances.fds = NULL;
 288        prog->instances.nr = -1;
 289
 290        return 0;
 291errout:
 292        bpf_program__exit(prog);
 293        return -ENOMEM;
 294}
 295
 296static int
 297bpf_object__add_program(struct bpf_object *obj, void *data, size_t size,
 298                        char *name, int idx)
 299{
 300        struct bpf_program prog, *progs;
 301        int nr_progs, err;
 302
 303        err = bpf_program__init(data, size, name, idx, &prog);
 304        if (err)
 305                return err;
 306
 307        progs = obj->programs;
 308        nr_progs = obj->nr_programs;
 309
 310        progs = realloc(progs, sizeof(progs[0]) * (nr_progs + 1));
 311        if (!progs) {
 312                /*
 313                 * In this case the original obj->programs
 314                 * is still valid, so don't need special treat for
 315                 * bpf_close_object().
 316                 */
 317                pr_warning("failed to alloc a new program '%s'\n",
 318                           name);
 319                bpf_program__exit(&prog);
 320                return -ENOMEM;
 321        }
 322
 323        pr_debug("found program %s\n", prog.section_name);
 324        obj->programs = progs;
 325        obj->nr_programs = nr_progs + 1;
 326        prog.obj = obj;
 327        progs[nr_progs] = prog;
 328        return 0;
 329}
 330
 331static struct bpf_object *bpf_object__new(const char *path,
 332                                          void *obj_buf,
 333                                          size_t obj_buf_sz)
 334{
 335        struct bpf_object *obj;
 336
 337        obj = calloc(1, sizeof(struct bpf_object) + strlen(path) + 1);
 338        if (!obj) {
 339                pr_warning("alloc memory failed for %s\n", path);
 340                return ERR_PTR(-ENOMEM);
 341        }
 342
 343        strcpy(obj->path, path);
 344        obj->efile.fd = -1;
 345
 346        /*
 347         * Caller of this function should also calls
 348         * bpf_object__elf_finish() after data collection to return
 349         * obj_buf to user. If not, we should duplicate the buffer to
 350         * avoid user freeing them before elf finish.
 351         */
 352        obj->efile.obj_buf = obj_buf;
 353        obj->efile.obj_buf_sz = obj_buf_sz;
 354        obj->efile.maps_shndx = -1;
 355
 356        obj->loaded = false;
 357
 358        INIT_LIST_HEAD(&obj->list);
 359        list_add(&obj->list, &bpf_objects_list);
 360        return obj;
 361}
 362
 363static void bpf_object__elf_finish(struct bpf_object *obj)
 364{
 365        if (!obj_elf_valid(obj))
 366                return;
 367
 368        if (obj->efile.elf) {
 369                elf_end(obj->efile.elf);
 370                obj->efile.elf = NULL;
 371        }
 372        obj->efile.symbols = NULL;
 373
 374        zfree(&obj->efile.reloc);
 375        obj->efile.nr_reloc = 0;
 376        zclose(obj->efile.fd);
 377        obj->efile.obj_buf = NULL;
 378        obj->efile.obj_buf_sz = 0;
 379}
 380
 381static int bpf_object__elf_init(struct bpf_object *obj)
 382{
 383        int err = 0;
 384        GElf_Ehdr *ep;
 385
 386        if (obj_elf_valid(obj)) {
 387                pr_warning("elf init: internal error\n");
 388                return -LIBBPF_ERRNO__LIBELF;
 389        }
 390
 391        if (obj->efile.obj_buf_sz > 0) {
 392                /*
 393                 * obj_buf should have been validated by
 394                 * bpf_object__open_buffer().
 395                 */
 396                obj->efile.elf = elf_memory(obj->efile.obj_buf,
 397                                            obj->efile.obj_buf_sz);
 398        } else {
 399                obj->efile.fd = open(obj->path, O_RDONLY);
 400                if (obj->efile.fd < 0) {
 401                        pr_warning("failed to open %s: %s\n", obj->path,
 402                                        strerror(errno));
 403                        return -errno;
 404                }
 405
 406                obj->efile.elf = elf_begin(obj->efile.fd,
 407                                LIBBPF_ELF_C_READ_MMAP,
 408                                NULL);
 409        }
 410
 411        if (!obj->efile.elf) {
 412                pr_warning("failed to open %s as ELF file\n",
 413                                obj->path);
 414                err = -LIBBPF_ERRNO__LIBELF;
 415                goto errout;
 416        }
 417
 418        if (!gelf_getehdr(obj->efile.elf, &obj->efile.ehdr)) {
 419                pr_warning("failed to get EHDR from %s\n",
 420                                obj->path);
 421                err = -LIBBPF_ERRNO__FORMAT;
 422                goto errout;
 423        }
 424        ep = &obj->efile.ehdr;
 425
 426        if ((ep->e_type != ET_REL) || (ep->e_machine != 0)) {
 427                pr_warning("%s is not an eBPF object file\n",
 428                        obj->path);
 429                err = -LIBBPF_ERRNO__FORMAT;
 430                goto errout;
 431        }
 432
 433        return 0;
 434errout:
 435        bpf_object__elf_finish(obj);
 436        return err;
 437}
 438
 439static int
 440bpf_object__check_endianness(struct bpf_object *obj)
 441{
 442        static unsigned int const endian = 1;
 443
 444        switch (obj->efile.ehdr.e_ident[EI_DATA]) {
 445        case ELFDATA2LSB:
 446                /* We are big endian, BPF obj is little endian. */
 447                if (*(unsigned char const *)&endian != 1)
 448                        goto mismatch;
 449                break;
 450
 451        case ELFDATA2MSB:
 452                /* We are little endian, BPF obj is big endian. */
 453                if (*(unsigned char const *)&endian != 0)
 454                        goto mismatch;
 455                break;
 456        default:
 457                return -LIBBPF_ERRNO__ENDIAN;
 458        }
 459
 460        return 0;
 461
 462mismatch:
 463        pr_warning("Error: endianness mismatch.\n");
 464        return -LIBBPF_ERRNO__ENDIAN;
 465}
 466
 467static int
 468bpf_object__init_license(struct bpf_object *obj,
 469                         void *data, size_t size)
 470{
 471        memcpy(obj->license, data,
 472               min(size, sizeof(obj->license) - 1));
 473        pr_debug("license of %s is %s\n", obj->path, obj->license);
 474        return 0;
 475}
 476
 477static int
 478bpf_object__init_kversion(struct bpf_object *obj,
 479                          void *data, size_t size)
 480{
 481        u32 kver;
 482
 483        if (size != sizeof(kver)) {
 484                pr_warning("invalid kver section in %s\n", obj->path);
 485                return -LIBBPF_ERRNO__FORMAT;
 486        }
 487        memcpy(&kver, data, sizeof(kver));
 488        obj->kern_version = kver;
 489        pr_debug("kernel version of %s is %x\n", obj->path,
 490                 obj->kern_version);
 491        return 0;
 492}
 493
 494static int
 495bpf_object__init_maps(struct bpf_object *obj, void *data,
 496                      size_t size)
 497{
 498        size_t nr_maps;
 499        int i;
 500
 501        nr_maps = size / sizeof(struct bpf_map_def);
 502        if (!data || !nr_maps) {
 503                pr_debug("%s doesn't need map definition\n",
 504                         obj->path);
 505                return 0;
 506        }
 507
 508        pr_debug("maps in %s: %zd bytes\n", obj->path, size);
 509
 510        obj->maps = calloc(nr_maps, sizeof(obj->maps[0]));
 511        if (!obj->maps) {
 512                pr_warning("alloc maps for object failed\n");
 513                return -ENOMEM;
 514        }
 515        obj->nr_maps = nr_maps;
 516
 517        for (i = 0; i < nr_maps; i++) {
 518                struct bpf_map_def *def = &obj->maps[i].def;
 519
 520                /*
 521                 * fill all fd with -1 so won't close incorrect
 522                 * fd (fd=0 is stdin) when failure (zclose won't close
 523                 * negative fd)).
 524                 */
 525                obj->maps[i].fd = -1;
 526
 527                /* Save map definition into obj->maps */
 528                *def = ((struct bpf_map_def *)data)[i];
 529        }
 530        return 0;
 531}
 532
 533static int
 534bpf_object__init_maps_name(struct bpf_object *obj)
 535{
 536        int i;
 537        Elf_Data *symbols = obj->efile.symbols;
 538
 539        if (!symbols || obj->efile.maps_shndx < 0)
 540                return -EINVAL;
 541
 542        for (i = 0; i < symbols->d_size / sizeof(GElf_Sym); i++) {
 543                GElf_Sym sym;
 544                size_t map_idx;
 545                const char *map_name;
 546
 547                if (!gelf_getsym(symbols, i, &sym))
 548                        continue;
 549                if (sym.st_shndx != obj->efile.maps_shndx)
 550                        continue;
 551
 552                map_name = elf_strptr(obj->efile.elf,
 553                                      obj->efile.strtabidx,
 554                                      sym.st_name);
 555                map_idx = sym.st_value / sizeof(struct bpf_map_def);
 556                if (map_idx >= obj->nr_maps) {
 557                        pr_warning("index of map \"%s\" is buggy: %zu > %zu\n",
 558                                   map_name, map_idx, obj->nr_maps);
 559                        continue;
 560                }
 561                obj->maps[map_idx].name = strdup(map_name);
 562                if (!obj->maps[map_idx].name) {
 563                        pr_warning("failed to alloc map name\n");
 564                        return -ENOMEM;
 565                }
 566                pr_debug("map %zu is \"%s\"\n", map_idx,
 567                         obj->maps[map_idx].name);
 568        }
 569        return 0;
 570}
 571
 572static int bpf_object__elf_collect(struct bpf_object *obj)
 573{
 574        Elf *elf = obj->efile.elf;
 575        GElf_Ehdr *ep = &obj->efile.ehdr;
 576        Elf_Scn *scn = NULL;
 577        int idx = 0, err = 0;
 578
 579        /* Elf is corrupted/truncated, avoid calling elf_strptr. */
 580        if (!elf_rawdata(elf_getscn(elf, ep->e_shstrndx), NULL)) {
 581                pr_warning("failed to get e_shstrndx from %s\n",
 582                           obj->path);
 583                return -LIBBPF_ERRNO__FORMAT;
 584        }
 585
 586        while ((scn = elf_nextscn(elf, scn)) != NULL) {
 587                char *name;
 588                GElf_Shdr sh;
 589                Elf_Data *data;
 590
 591                idx++;
 592                if (gelf_getshdr(scn, &sh) != &sh) {
 593                        pr_warning("failed to get section header from %s\n",
 594                                   obj->path);
 595                        err = -LIBBPF_ERRNO__FORMAT;
 596                        goto out;
 597                }
 598
 599                name = elf_strptr(elf, ep->e_shstrndx, sh.sh_name);
 600                if (!name) {
 601                        pr_warning("failed to get section name from %s\n",
 602                                   obj->path);
 603                        err = -LIBBPF_ERRNO__FORMAT;
 604                        goto out;
 605                }
 606
 607                data = elf_getdata(scn, 0);
 608                if (!data) {
 609                        pr_warning("failed to get section data from %s(%s)\n",
 610                                   name, obj->path);
 611                        err = -LIBBPF_ERRNO__FORMAT;
 612                        goto out;
 613                }
 614                pr_debug("section %s, size %ld, link %d, flags %lx, type=%d\n",
 615                         name, (unsigned long)data->d_size,
 616                         (int)sh.sh_link, (unsigned long)sh.sh_flags,
 617                         (int)sh.sh_type);
 618
 619                if (strcmp(name, "license") == 0)
 620                        err = bpf_object__init_license(obj,
 621                                                       data->d_buf,
 622                                                       data->d_size);
 623                else if (strcmp(name, "version") == 0)
 624                        err = bpf_object__init_kversion(obj,
 625                                                        data->d_buf,
 626                                                        data->d_size);
 627                else if (strcmp(name, "maps") == 0) {
 628                        err = bpf_object__init_maps(obj, data->d_buf,
 629                                                    data->d_size);
 630                        obj->efile.maps_shndx = idx;
 631                } else if (sh.sh_type == SHT_SYMTAB) {
 632                        if (obj->efile.symbols) {
 633                                pr_warning("bpf: multiple SYMTAB in %s\n",
 634                                           obj->path);
 635                                err = -LIBBPF_ERRNO__FORMAT;
 636                        } else {
 637                                obj->efile.symbols = data;
 638                                obj->efile.strtabidx = sh.sh_link;
 639                        }
 640                } else if ((sh.sh_type == SHT_PROGBITS) &&
 641                           (sh.sh_flags & SHF_EXECINSTR) &&
 642                           (data->d_size > 0)) {
 643                        err = bpf_object__add_program(obj, data->d_buf,
 644                                                      data->d_size, name, idx);
 645                        if (err) {
 646                                char errmsg[STRERR_BUFSIZE];
 647
 648                                strerror_r(-err, errmsg, sizeof(errmsg));
 649                                pr_warning("failed to alloc program %s (%s): %s",
 650                                           name, obj->path, errmsg);
 651                        }
 652                } else if (sh.sh_type == SHT_REL) {
 653                        void *reloc = obj->efile.reloc;
 654                        int nr_reloc = obj->efile.nr_reloc + 1;
 655
 656                        reloc = realloc(reloc,
 657                                        sizeof(*obj->efile.reloc) * nr_reloc);
 658                        if (!reloc) {
 659                                pr_warning("realloc failed\n");
 660                                err = -ENOMEM;
 661                        } else {
 662                                int n = nr_reloc - 1;
 663
 664                                obj->efile.reloc = reloc;
 665                                obj->efile.nr_reloc = nr_reloc;
 666
 667                                obj->efile.reloc[n].shdr = sh;
 668                                obj->efile.reloc[n].data = data;
 669                        }
 670                }
 671                if (err)
 672                        goto out;
 673        }
 674
 675        if (!obj->efile.strtabidx || obj->efile.strtabidx >= idx) {
 676                pr_warning("Corrupted ELF file: index of strtab invalid\n");
 677                return LIBBPF_ERRNO__FORMAT;
 678        }
 679        if (obj->efile.maps_shndx >= 0)
 680                err = bpf_object__init_maps_name(obj);
 681out:
 682        return err;
 683}
 684
 685static struct bpf_program *
 686bpf_object__find_prog_by_idx(struct bpf_object *obj, int idx)
 687{
 688        struct bpf_program *prog;
 689        size_t i;
 690
 691        for (i = 0; i < obj->nr_programs; i++) {
 692                prog = &obj->programs[i];
 693                if (prog->idx == idx)
 694                        return prog;
 695        }
 696        return NULL;
 697}
 698
 699static int
 700bpf_program__collect_reloc(struct bpf_program *prog,
 701                           size_t nr_maps, GElf_Shdr *shdr,
 702                           Elf_Data *data, Elf_Data *symbols,
 703                           int maps_shndx)
 704{
 705        int i, nrels;
 706
 707        pr_debug("collecting relocating info for: '%s'\n",
 708                 prog->section_name);
 709        nrels = shdr->sh_size / shdr->sh_entsize;
 710
 711        prog->reloc_desc = malloc(sizeof(*prog->reloc_desc) * nrels);
 712        if (!prog->reloc_desc) {
 713                pr_warning("failed to alloc memory in relocation\n");
 714                return -ENOMEM;
 715        }
 716        prog->nr_reloc = nrels;
 717
 718        for (i = 0; i < nrels; i++) {
 719                GElf_Sym sym;
 720                GElf_Rel rel;
 721                unsigned int insn_idx;
 722                struct bpf_insn *insns = prog->insns;
 723                size_t map_idx;
 724
 725                if (!gelf_getrel(data, i, &rel)) {
 726                        pr_warning("relocation: failed to get %d reloc\n", i);
 727                        return -LIBBPF_ERRNO__FORMAT;
 728                }
 729
 730                if (!gelf_getsym(symbols,
 731                                 GELF_R_SYM(rel.r_info),
 732                                 &sym)) {
 733                        pr_warning("relocation: symbol %"PRIx64" not found\n",
 734                                   GELF_R_SYM(rel.r_info));
 735                        return -LIBBPF_ERRNO__FORMAT;
 736                }
 737
 738                if (sym.st_shndx != maps_shndx) {
 739                        pr_warning("Program '%s' contains non-map related relo data pointing to section %u\n",
 740                                   prog->section_name, sym.st_shndx);
 741                        return -LIBBPF_ERRNO__RELOC;
 742                }
 743
 744                insn_idx = rel.r_offset / sizeof(struct bpf_insn);
 745                pr_debug("relocation: insn_idx=%u\n", insn_idx);
 746
 747                if (insns[insn_idx].code != (BPF_LD | BPF_IMM | BPF_DW)) {
 748                        pr_warning("bpf: relocation: invalid relo for insns[%d].code 0x%x\n",
 749                                   insn_idx, insns[insn_idx].code);
 750                        return -LIBBPF_ERRNO__RELOC;
 751                }
 752
 753                map_idx = sym.st_value / sizeof(struct bpf_map_def);
 754                if (map_idx >= nr_maps) {
 755                        pr_warning("bpf relocation: map_idx %d large than %d\n",
 756                                   (int)map_idx, (int)nr_maps - 1);
 757                        return -LIBBPF_ERRNO__RELOC;
 758                }
 759
 760                prog->reloc_desc[i].insn_idx = insn_idx;
 761                prog->reloc_desc[i].map_idx = map_idx;
 762        }
 763        return 0;
 764}
 765
 766static int
 767bpf_object__create_maps(struct bpf_object *obj)
 768{
 769        unsigned int i;
 770
 771        for (i = 0; i < obj->nr_maps; i++) {
 772                struct bpf_map_def *def = &obj->maps[i].def;
 773                int *pfd = &obj->maps[i].fd;
 774
 775                *pfd = bpf_create_map(def->type,
 776                                      def->key_size,
 777                                      def->value_size,
 778                                      def->max_entries);
 779                if (*pfd < 0) {
 780                        size_t j;
 781                        int err = *pfd;
 782
 783                        pr_warning("failed to create map: %s\n",
 784                                   strerror(errno));
 785                        for (j = 0; j < i; j++)
 786                                zclose(obj->maps[j].fd);
 787                        return err;
 788                }
 789                pr_debug("create map: fd=%d\n", *pfd);
 790        }
 791
 792        return 0;
 793}
 794
 795static int
 796bpf_program__relocate(struct bpf_program *prog, struct bpf_object *obj)
 797{
 798        int i;
 799
 800        if (!prog || !prog->reloc_desc)
 801                return 0;
 802
 803        for (i = 0; i < prog->nr_reloc; i++) {
 804                int insn_idx, map_idx;
 805                struct bpf_insn *insns = prog->insns;
 806
 807                insn_idx = prog->reloc_desc[i].insn_idx;
 808                map_idx = prog->reloc_desc[i].map_idx;
 809
 810                if (insn_idx >= (int)prog->insns_cnt) {
 811                        pr_warning("relocation out of range: '%s'\n",
 812                                   prog->section_name);
 813                        return -LIBBPF_ERRNO__RELOC;
 814                }
 815                insns[insn_idx].src_reg = BPF_PSEUDO_MAP_FD;
 816                insns[insn_idx].imm = obj->maps[map_idx].fd;
 817        }
 818
 819        zfree(&prog->reloc_desc);
 820        prog->nr_reloc = 0;
 821        return 0;
 822}
 823
 824
 825static int
 826bpf_object__relocate(struct bpf_object *obj)
 827{
 828        struct bpf_program *prog;
 829        size_t i;
 830        int err;
 831
 832        for (i = 0; i < obj->nr_programs; i++) {
 833                prog = &obj->programs[i];
 834
 835                err = bpf_program__relocate(prog, obj);
 836                if (err) {
 837                        pr_warning("failed to relocate '%s'\n",
 838                                   prog->section_name);
 839                        return err;
 840                }
 841        }
 842        return 0;
 843}
 844
 845static int bpf_object__collect_reloc(struct bpf_object *obj)
 846{
 847        int i, err;
 848
 849        if (!obj_elf_valid(obj)) {
 850                pr_warning("Internal error: elf object is closed\n");
 851                return -LIBBPF_ERRNO__INTERNAL;
 852        }
 853
 854        for (i = 0; i < obj->efile.nr_reloc; i++) {
 855                GElf_Shdr *shdr = &obj->efile.reloc[i].shdr;
 856                Elf_Data *data = obj->efile.reloc[i].data;
 857                int idx = shdr->sh_info;
 858                struct bpf_program *prog;
 859                size_t nr_maps = obj->nr_maps;
 860
 861                if (shdr->sh_type != SHT_REL) {
 862                        pr_warning("internal error at %d\n", __LINE__);
 863                        return -LIBBPF_ERRNO__INTERNAL;
 864                }
 865
 866                prog = bpf_object__find_prog_by_idx(obj, idx);
 867                if (!prog) {
 868                        pr_warning("relocation failed: no %d section\n",
 869                                   idx);
 870                        return -LIBBPF_ERRNO__RELOC;
 871                }
 872
 873                err = bpf_program__collect_reloc(prog, nr_maps,
 874                                                 shdr, data,
 875                                                 obj->efile.symbols,
 876                                                 obj->efile.maps_shndx);
 877                if (err)
 878                        return err;
 879        }
 880        return 0;
 881}
 882
 883static int
 884load_program(struct bpf_insn *insns, int insns_cnt,
 885             char *license, u32 kern_version, int *pfd)
 886{
 887        int ret;
 888        char *log_buf;
 889
 890        if (!insns || !insns_cnt)
 891                return -EINVAL;
 892
 893        log_buf = malloc(BPF_LOG_BUF_SIZE);
 894        if (!log_buf)
 895                pr_warning("Alloc log buffer for bpf loader error, continue without log\n");
 896
 897        ret = bpf_load_program(BPF_PROG_TYPE_KPROBE, insns,
 898                               insns_cnt, license, kern_version,
 899                               log_buf, BPF_LOG_BUF_SIZE);
 900
 901        if (ret >= 0) {
 902                *pfd = ret;
 903                ret = 0;
 904                goto out;
 905        }
 906
 907        ret = -LIBBPF_ERRNO__LOAD;
 908        pr_warning("load bpf program failed: %s\n", strerror(errno));
 909
 910        if (log_buf && log_buf[0] != '\0') {
 911                ret = -LIBBPF_ERRNO__VERIFY;
 912                pr_warning("-- BEGIN DUMP LOG ---\n");
 913                pr_warning("\n%s\n", log_buf);
 914                pr_warning("-- END LOG --\n");
 915        } else {
 916                if (insns_cnt >= BPF_MAXINSNS) {
 917                        pr_warning("Program too large (%d insns), at most %d insns\n",
 918                                   insns_cnt, BPF_MAXINSNS);
 919                        ret = -LIBBPF_ERRNO__PROG2BIG;
 920                } else if (log_buf) {
 921                        pr_warning("log buffer is empty\n");
 922                        ret = -LIBBPF_ERRNO__KVER;
 923                }
 924        }
 925
 926out:
 927        free(log_buf);
 928        return ret;
 929}
 930
 931static int
 932bpf_program__load(struct bpf_program *prog,
 933                  char *license, u32 kern_version)
 934{
 935        int err = 0, fd, i;
 936
 937        if (prog->instances.nr < 0 || !prog->instances.fds) {
 938                if (prog->preprocessor) {
 939                        pr_warning("Internal error: can't load program '%s'\n",
 940                                   prog->section_name);
 941                        return -LIBBPF_ERRNO__INTERNAL;
 942                }
 943
 944                prog->instances.fds = malloc(sizeof(int));
 945                if (!prog->instances.fds) {
 946                        pr_warning("Not enough memory for BPF fds\n");
 947                        return -ENOMEM;
 948                }
 949                prog->instances.nr = 1;
 950                prog->instances.fds[0] = -1;
 951        }
 952
 953        if (!prog->preprocessor) {
 954                if (prog->instances.nr != 1) {
 955                        pr_warning("Program '%s' is inconsistent: nr(%d) != 1\n",
 956                                   prog->section_name, prog->instances.nr);
 957                }
 958                err = load_program(prog->insns, prog->insns_cnt,
 959                                   license, kern_version, &fd);
 960                if (!err)
 961                        prog->instances.fds[0] = fd;
 962                goto out;
 963        }
 964
 965        for (i = 0; i < prog->instances.nr; i++) {
 966                struct bpf_prog_prep_result result;
 967                bpf_program_prep_t preprocessor = prog->preprocessor;
 968
 969                bzero(&result, sizeof(result));
 970                err = preprocessor(prog, i, prog->insns,
 971                                   prog->insns_cnt, &result);
 972                if (err) {
 973                        pr_warning("Preprocessing the %dth instance of program '%s' failed\n",
 974                                   i, prog->section_name);
 975                        goto out;
 976                }
 977
 978                if (!result.new_insn_ptr || !result.new_insn_cnt) {
 979                        pr_debug("Skip loading the %dth instance of program '%s'\n",
 980                                 i, prog->section_name);
 981                        prog->instances.fds[i] = -1;
 982                        if (result.pfd)
 983                                *result.pfd = -1;
 984                        continue;
 985                }
 986
 987                err = load_program(result.new_insn_ptr,
 988                                   result.new_insn_cnt,
 989                                   license, kern_version, &fd);
 990
 991                if (err) {
 992                        pr_warning("Loading the %dth instance of program '%s' failed\n",
 993                                        i, prog->section_name);
 994                        goto out;
 995                }
 996
 997                if (result.pfd)
 998                        *result.pfd = fd;
 999                prog->instances.fds[i] = fd;
1000        }
1001out:
1002        if (err)
1003                pr_warning("failed to load program '%s'\n",
1004                           prog->section_name);
1005        zfree(&prog->insns);
1006        prog->insns_cnt = 0;
1007        return err;
1008}
1009
1010static int
1011bpf_object__load_progs(struct bpf_object *obj)
1012{
1013        size_t i;
1014        int err;
1015
1016        for (i = 0; i < obj->nr_programs; i++) {
1017                err = bpf_program__load(&obj->programs[i],
1018                                        obj->license,
1019                                        obj->kern_version);
1020                if (err)
1021                        return err;
1022        }
1023        return 0;
1024}
1025
1026static int bpf_object__validate(struct bpf_object *obj)
1027{
1028        if (obj->kern_version == 0) {
1029                pr_warning("%s doesn't provide kernel version\n",
1030                           obj->path);
1031                return -LIBBPF_ERRNO__KVERSION;
1032        }
1033        return 0;
1034}
1035
1036static struct bpf_object *
1037__bpf_object__open(const char *path, void *obj_buf, size_t obj_buf_sz)
1038{
1039        struct bpf_object *obj;
1040        int err;
1041
1042        if (elf_version(EV_CURRENT) == EV_NONE) {
1043                pr_warning("failed to init libelf for %s\n", path);
1044                return ERR_PTR(-LIBBPF_ERRNO__LIBELF);
1045        }
1046
1047        obj = bpf_object__new(path, obj_buf, obj_buf_sz);
1048        if (IS_ERR(obj))
1049                return obj;
1050
1051        CHECK_ERR(bpf_object__elf_init(obj), err, out);
1052        CHECK_ERR(bpf_object__check_endianness(obj), err, out);
1053        CHECK_ERR(bpf_object__elf_collect(obj), err, out);
1054        CHECK_ERR(bpf_object__collect_reloc(obj), err, out);
1055        CHECK_ERR(bpf_object__validate(obj), err, out);
1056
1057        bpf_object__elf_finish(obj);
1058        return obj;
1059out:
1060        bpf_object__close(obj);
1061        return ERR_PTR(err);
1062}
1063
1064struct bpf_object *bpf_object__open(const char *path)
1065{
1066        /* param validation */
1067        if (!path)
1068                return NULL;
1069
1070        pr_debug("loading %s\n", path);
1071
1072        return __bpf_object__open(path, NULL, 0);
1073}
1074
1075struct bpf_object *bpf_object__open_buffer(void *obj_buf,
1076                                           size_t obj_buf_sz,
1077                                           const char *name)
1078{
1079        char tmp_name[64];
1080
1081        /* param validation */
1082        if (!obj_buf || obj_buf_sz <= 0)
1083                return NULL;
1084
1085        if (!name) {
1086                snprintf(tmp_name, sizeof(tmp_name), "%lx-%lx",
1087                         (unsigned long)obj_buf,
1088                         (unsigned long)obj_buf_sz);
1089                tmp_name[sizeof(tmp_name) - 1] = '\0';
1090                name = tmp_name;
1091        }
1092        pr_debug("loading object '%s' from buffer\n",
1093                 name);
1094
1095        return __bpf_object__open(name, obj_buf, obj_buf_sz);
1096}
1097
1098int bpf_object__unload(struct bpf_object *obj)
1099{
1100        size_t i;
1101
1102        if (!obj)
1103                return -EINVAL;
1104
1105        for (i = 0; i < obj->nr_maps; i++)
1106                zclose(obj->maps[i].fd);
1107
1108        for (i = 0; i < obj->nr_programs; i++)
1109                bpf_program__unload(&obj->programs[i]);
1110
1111        return 0;
1112}
1113
1114int bpf_object__load(struct bpf_object *obj)
1115{
1116        int err;
1117
1118        if (!obj)
1119                return -EINVAL;
1120
1121        if (obj->loaded) {
1122                pr_warning("object should not be loaded twice\n");
1123                return -EINVAL;
1124        }
1125
1126        obj->loaded = true;
1127
1128        CHECK_ERR(bpf_object__create_maps(obj), err, out);
1129        CHECK_ERR(bpf_object__relocate(obj), err, out);
1130        CHECK_ERR(bpf_object__load_progs(obj), err, out);
1131
1132        return 0;
1133out:
1134        bpf_object__unload(obj);
1135        pr_warning("failed to load object '%s'\n", obj->path);
1136        return err;
1137}
1138
1139void bpf_object__close(struct bpf_object *obj)
1140{
1141        size_t i;
1142
1143        if (!obj)
1144                return;
1145
1146        bpf_object__elf_finish(obj);
1147        bpf_object__unload(obj);
1148
1149        for (i = 0; i < obj->nr_maps; i++) {
1150                zfree(&obj->maps[i].name);
1151                if (obj->maps[i].clear_priv)
1152                        obj->maps[i].clear_priv(&obj->maps[i],
1153                                                obj->maps[i].priv);
1154                obj->maps[i].priv = NULL;
1155                obj->maps[i].clear_priv = NULL;
1156        }
1157        zfree(&obj->maps);
1158        obj->nr_maps = 0;
1159
1160        if (obj->programs && obj->nr_programs) {
1161                for (i = 0; i < obj->nr_programs; i++)
1162                        bpf_program__exit(&obj->programs[i]);
1163        }
1164        zfree(&obj->programs);
1165
1166        list_del(&obj->list);
1167        free(obj);
1168}
1169
1170struct bpf_object *
1171bpf_object__next(struct bpf_object *prev)
1172{
1173        struct bpf_object *next;
1174
1175        if (!prev)
1176                next = list_first_entry(&bpf_objects_list,
1177                                        struct bpf_object,
1178                                        list);
1179        else
1180                next = list_next_entry(prev, list);
1181
1182        /* Empty list is noticed here so don't need checking on entry. */
1183        if (&next->list == &bpf_objects_list)
1184                return NULL;
1185
1186        return next;
1187}
1188
1189const char *
1190bpf_object__get_name(struct bpf_object *obj)
1191{
1192        if (!obj)
1193                return ERR_PTR(-EINVAL);
1194        return obj->path;
1195}
1196
1197unsigned int
1198bpf_object__get_kversion(struct bpf_object *obj)
1199{
1200        if (!obj)
1201                return 0;
1202        return obj->kern_version;
1203}
1204
1205struct bpf_program *
1206bpf_program__next(struct bpf_program *prev, struct bpf_object *obj)
1207{
1208        size_t idx;
1209
1210        if (!obj->programs)
1211                return NULL;
1212        /* First handler */
1213        if (prev == NULL)
1214                return &obj->programs[0];
1215
1216        if (prev->obj != obj) {
1217                pr_warning("error: program handler doesn't match object\n");
1218                return NULL;
1219        }
1220
1221        idx = (prev - obj->programs) + 1;
1222        if (idx >= obj->nr_programs)
1223                return NULL;
1224        return &obj->programs[idx];
1225}
1226
1227int bpf_program__set_private(struct bpf_program *prog,
1228                             void *priv,
1229                             bpf_program_clear_priv_t clear_priv)
1230{
1231        if (prog->priv && prog->clear_priv)
1232                prog->clear_priv(prog, prog->priv);
1233
1234        prog->priv = priv;
1235        prog->clear_priv = clear_priv;
1236        return 0;
1237}
1238
1239int bpf_program__get_private(struct bpf_program *prog, void **ppriv)
1240{
1241        *ppriv = prog->priv;
1242        return 0;
1243}
1244
1245const char *bpf_program__title(struct bpf_program *prog, bool needs_copy)
1246{
1247        const char *title;
1248
1249        title = prog->section_name;
1250        if (needs_copy) {
1251                title = strdup(title);
1252                if (!title) {
1253                        pr_warning("failed to strdup program title\n");
1254                        return ERR_PTR(-ENOMEM);
1255                }
1256        }
1257
1258        return title;
1259}
1260
1261int bpf_program__fd(struct bpf_program *prog)
1262{
1263        return bpf_program__nth_fd(prog, 0);
1264}
1265
1266int bpf_program__set_prep(struct bpf_program *prog, int nr_instances,
1267                          bpf_program_prep_t prep)
1268{
1269        int *instances_fds;
1270
1271        if (nr_instances <= 0 || !prep)
1272                return -EINVAL;
1273
1274        if (prog->instances.nr > 0 || prog->instances.fds) {
1275                pr_warning("Can't set pre-processor after loading\n");
1276                return -EINVAL;
1277        }
1278
1279        instances_fds = malloc(sizeof(int) * nr_instances);
1280        if (!instances_fds) {
1281                pr_warning("alloc memory failed for fds\n");
1282                return -ENOMEM;
1283        }
1284
1285        /* fill all fd with -1 */
1286        memset(instances_fds, -1, sizeof(int) * nr_instances);
1287
1288        prog->instances.nr = nr_instances;
1289        prog->instances.fds = instances_fds;
1290        prog->preprocessor = prep;
1291        return 0;
1292}
1293
1294int bpf_program__nth_fd(struct bpf_program *prog, int n)
1295{
1296        int fd;
1297
1298        if (n >= prog->instances.nr || n < 0) {
1299                pr_warning("Can't get the %dth fd from program %s: only %d instances\n",
1300                           n, prog->section_name, prog->instances.nr);
1301                return -EINVAL;
1302        }
1303
1304        fd = prog->instances.fds[n];
1305        if (fd < 0) {
1306                pr_warning("%dth instance of program '%s' is invalid\n",
1307                           n, prog->section_name);
1308                return -ENOENT;
1309        }
1310
1311        return fd;
1312}
1313
1314int bpf_map__get_fd(struct bpf_map *map)
1315{
1316        if (!map)
1317                return -EINVAL;
1318
1319        return map->fd;
1320}
1321
1322int bpf_map__get_def(struct bpf_map *map, struct bpf_map_def *pdef)
1323{
1324        if (!map || !pdef)
1325                return -EINVAL;
1326
1327        *pdef = map->def;
1328        return 0;
1329}
1330
1331const char *bpf_map__get_name(struct bpf_map *map)
1332{
1333        if (!map)
1334                return NULL;
1335        return map->name;
1336}
1337
1338int bpf_map__set_private(struct bpf_map *map, void *priv,
1339                         bpf_map_clear_priv_t clear_priv)
1340{
1341        if (!map)
1342                return -EINVAL;
1343
1344        if (map->priv) {
1345                if (map->clear_priv)
1346                        map->clear_priv(map, map->priv);
1347        }
1348
1349        map->priv = priv;
1350        map->clear_priv = clear_priv;
1351        return 0;
1352}
1353
1354int bpf_map__get_private(struct bpf_map *map, void **ppriv)
1355{
1356        if (!map)
1357                return -EINVAL;
1358
1359        if (ppriv)
1360                *ppriv = map->priv;
1361        return 0;
1362}
1363
1364struct bpf_map *
1365bpf_map__next(struct bpf_map *prev, struct bpf_object *obj)
1366{
1367        size_t idx;
1368        struct bpf_map *s, *e;
1369
1370        if (!obj || !obj->maps)
1371                return NULL;
1372
1373        s = obj->maps;
1374        e = obj->maps + obj->nr_maps;
1375
1376        if (prev == NULL)
1377                return s;
1378
1379        if ((prev < s) || (prev >= e)) {
1380                pr_warning("error in %s: map handler doesn't belong to object\n",
1381                           __func__);
1382                return NULL;
1383        }
1384
1385        idx = (prev - obj->maps) + 1;
1386        if (idx >= obj->nr_maps)
1387                return NULL;
1388        return &obj->maps[idx];
1389}
1390
1391struct bpf_map *
1392bpf_object__get_map_by_name(struct bpf_object *obj, const char *name)
1393{
1394        struct bpf_map *pos;
1395
1396        bpf_map__for_each(pos, obj) {
1397                if (pos->name && !strcmp(pos->name, name))
1398                        return pos;
1399        }
1400        return NULL;
1401}
1402