cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

libbpf.c (352957B)


      1// SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause)
      2
      3/*
      4 * Common eBPF ELF object loading operations.
      5 *
      6 * Copyright (C) 2013-2015 Alexei Starovoitov <ast@kernel.org>
      7 * Copyright (C) 2015 Wang Nan <wangnan0@huawei.com>
      8 * Copyright (C) 2015 Huawei Inc.
      9 * Copyright (C) 2017 Nicira, Inc.
     10 * Copyright (C) 2019 Isovalent, Inc.
     11 */
     12
     13#ifndef _GNU_SOURCE
     14#define _GNU_SOURCE
     15#endif
     16#include <stdlib.h>
     17#include <stdio.h>
     18#include <stdarg.h>
     19#include <libgen.h>
     20#include <inttypes.h>
     21#include <limits.h>
     22#include <string.h>
     23#include <unistd.h>
     24#include <endian.h>
     25#include <fcntl.h>
     26#include <errno.h>
     27#include <ctype.h>
     28#include <asm/unistd.h>
     29#include <linux/err.h>
     30#include <linux/kernel.h>
     31#include <linux/bpf.h>
     32#include <linux/btf.h>
     33#include <linux/filter.h>
     34#include <linux/list.h>
     35#include <linux/limits.h>
     36#include <linux/perf_event.h>
     37#include <linux/ring_buffer.h>
     38#include <linux/version.h>
     39#include <sys/epoll.h>
     40#include <sys/ioctl.h>
     41#include <sys/mman.h>
     42#include <sys/stat.h>
     43#include <sys/types.h>
     44#include <sys/vfs.h>
     45#include <sys/utsname.h>
     46#include <sys/resource.h>
     47#include <libelf.h>
     48#include <gelf.h>
     49#include <zlib.h>
     50
     51#include "libbpf.h"
     52#include "bpf.h"
     53#include "btf.h"
     54#include "str_error.h"
     55#include "libbpf_internal.h"
     56#include "hashmap.h"
     57#include "bpf_gen_internal.h"
     58
     59#ifndef BPF_FS_MAGIC
     60#define BPF_FS_MAGIC		0xcafe4a11
     61#endif
     62
     63#define BPF_INSN_SZ (sizeof(struct bpf_insn))
     64
     65/* vsprintf() in __base_pr() uses nonliteral format string. It may break
     66 * compilation if user enables corresponding warning. Disable it explicitly.
     67 */
     68#pragma GCC diagnostic ignored "-Wformat-nonliteral"
     69
     70#define __printf(a, b)	__attribute__((format(printf, a, b)))
     71
     72static struct bpf_map *bpf_object__add_map(struct bpf_object *obj);
     73static bool prog_is_subprog(const struct bpf_object *obj, const struct bpf_program *prog);
     74
     75static int __base_pr(enum libbpf_print_level level, const char *format,
     76		     va_list args)
     77{
     78	if (level == LIBBPF_DEBUG)
     79		return 0;
     80
     81	return vfprintf(stderr, format, args);
     82}
     83
     84static libbpf_print_fn_t __libbpf_pr = __base_pr;
     85
     86libbpf_print_fn_t libbpf_set_print(libbpf_print_fn_t fn)
     87{
     88	libbpf_print_fn_t old_print_fn = __libbpf_pr;
     89
     90	__libbpf_pr = fn;
     91	return old_print_fn;
     92}
     93
     94__printf(2, 3)
     95void libbpf_print(enum libbpf_print_level level, const char *format, ...)
     96{
     97	va_list args;
     98
     99	if (!__libbpf_pr)
    100		return;
    101
    102	va_start(args, format);
    103	__libbpf_pr(level, format, args);
    104	va_end(args);
    105}
    106
    107static void pr_perm_msg(int err)
    108{
    109	struct rlimit limit;
    110	char buf[100];
    111
    112	if (err != -EPERM || geteuid() != 0)
    113		return;
    114
    115	err = getrlimit(RLIMIT_MEMLOCK, &limit);
    116	if (err)
    117		return;
    118
    119	if (limit.rlim_cur == RLIM_INFINITY)
    120		return;
    121
    122	if (limit.rlim_cur < 1024)
    123		snprintf(buf, sizeof(buf), "%zu bytes", (size_t)limit.rlim_cur);
    124	else if (limit.rlim_cur < 1024*1024)
    125		snprintf(buf, sizeof(buf), "%.1f KiB", (double)limit.rlim_cur / 1024);
    126	else
    127		snprintf(buf, sizeof(buf), "%.1f MiB", (double)limit.rlim_cur / (1024*1024));
    128
    129	pr_warn("permission error while running as root; try raising 'ulimit -l'? current value: %s\n",
    130		buf);
    131}
    132
    133#define STRERR_BUFSIZE  128
    134
    135/* Copied from tools/perf/util/util.h */
    136#ifndef zfree
    137# define zfree(ptr) ({ free(*ptr); *ptr = NULL; })
    138#endif
    139
    140#ifndef zclose
    141# define zclose(fd) ({			\
    142	int ___err = 0;			\
    143	if ((fd) >= 0)			\
    144		___err = close((fd));	\
    145	fd = -1;			\
    146	___err; })
    147#endif
    148
    149static inline __u64 ptr_to_u64(const void *ptr)
    150{
    151	return (__u64) (unsigned long) ptr;
    152}
    153
    154/* this goes away in libbpf 1.0 */
    155enum libbpf_strict_mode libbpf_mode = LIBBPF_STRICT_NONE;
    156
    157int libbpf_set_strict_mode(enum libbpf_strict_mode mode)
    158{
    159	libbpf_mode = mode;
    160	return 0;
    161}
    162
    163__u32 libbpf_major_version(void)
    164{
    165	return LIBBPF_MAJOR_VERSION;
    166}
    167
    168__u32 libbpf_minor_version(void)
    169{
    170	return LIBBPF_MINOR_VERSION;
    171}
    172
    173const char *libbpf_version_string(void)
    174{
    175#define __S(X) #X
    176#define _S(X) __S(X)
    177	return  "v" _S(LIBBPF_MAJOR_VERSION) "." _S(LIBBPF_MINOR_VERSION);
    178#undef _S
    179#undef __S
    180}
    181
    182enum reloc_type {
    183	RELO_LD64,
    184	RELO_CALL,
    185	RELO_DATA,
    186	RELO_EXTERN_VAR,
    187	RELO_EXTERN_FUNC,
    188	RELO_SUBPROG_ADDR,
    189	RELO_CORE,
    190};
    191
    192struct reloc_desc {
    193	enum reloc_type type;
    194	int insn_idx;
    195	union {
    196		const struct bpf_core_relo *core_relo; /* used when type == RELO_CORE */
    197		struct {
    198			int map_idx;
    199			int sym_off;
    200		};
    201	};
    202};
    203
    204/* stored as sec_def->cookie for all libbpf-supported SEC()s */
    205enum sec_def_flags {
    206	SEC_NONE = 0,
    207	/* expected_attach_type is optional, if kernel doesn't support that */
    208	SEC_EXP_ATTACH_OPT = 1,
    209	/* legacy, only used by libbpf_get_type_names() and
    210	 * libbpf_attach_type_by_name(), not used by libbpf itself at all.
    211	 * This used to be associated with cgroup (and few other) BPF programs
    212	 * that were attachable through BPF_PROG_ATTACH command. Pretty
    213	 * meaningless nowadays, though.
    214	 */
    215	SEC_ATTACHABLE = 2,
    216	SEC_ATTACHABLE_OPT = SEC_ATTACHABLE | SEC_EXP_ATTACH_OPT,
    217	/* attachment target is specified through BTF ID in either kernel or
    218	 * other BPF program's BTF object */
    219	SEC_ATTACH_BTF = 4,
    220	/* BPF program type allows sleeping/blocking in kernel */
    221	SEC_SLEEPABLE = 8,
    222	/* allow non-strict prefix matching */
    223	SEC_SLOPPY_PFX = 16,
    224	/* BPF program support non-linear XDP buffer */
    225	SEC_XDP_FRAGS = 32,
    226	/* deprecated sec definitions not supposed to be used */
    227	SEC_DEPRECATED = 64,
    228};
    229
    230struct bpf_sec_def {
    231	char *sec;
    232	enum bpf_prog_type prog_type;
    233	enum bpf_attach_type expected_attach_type;
    234	long cookie;
    235	int handler_id;
    236
    237	libbpf_prog_setup_fn_t prog_setup_fn;
    238	libbpf_prog_prepare_load_fn_t prog_prepare_load_fn;
    239	libbpf_prog_attach_fn_t prog_attach_fn;
    240};
    241
    242/*
    243 * bpf_prog should be a better name but it has been used in
    244 * linux/filter.h.
    245 */
    246struct bpf_program {
    247	const struct bpf_sec_def *sec_def;
    248	char *sec_name;
    249	size_t sec_idx;
    250	/* this program's instruction offset (in number of instructions)
    251	 * within its containing ELF section
    252	 */
    253	size_t sec_insn_off;
    254	/* number of original instructions in ELF section belonging to this
    255	 * program, not taking into account subprogram instructions possible
    256	 * appended later during relocation
    257	 */
    258	size_t sec_insn_cnt;
    259	/* Offset (in number of instructions) of the start of instruction
    260	 * belonging to this BPF program  within its containing main BPF
    261	 * program. For the entry-point (main) BPF program, this is always
    262	 * zero. For a sub-program, this gets reset before each of main BPF
    263	 * programs are processed and relocated and is used to determined
    264	 * whether sub-program was already appended to the main program, and
    265	 * if yes, at which instruction offset.
    266	 */
    267	size_t sub_insn_off;
    268
    269	char *name;
    270	/* name with / replaced by _; makes recursive pinning
    271	 * in bpf_object__pin_programs easier
    272	 */
    273	char *pin_name;
    274
    275	/* instructions that belong to BPF program; insns[0] is located at
    276	 * sec_insn_off instruction within its ELF section in ELF file, so
    277	 * when mapping ELF file instruction index to the local instruction,
    278	 * one needs to subtract sec_insn_off; and vice versa.
    279	 */
    280	struct bpf_insn *insns;
    281	/* actual number of instruction in this BPF program's image; for
    282	 * entry-point BPF programs this includes the size of main program
    283	 * itself plus all the used sub-programs, appended at the end
    284	 */
    285	size_t insns_cnt;
    286
    287	struct reloc_desc *reloc_desc;
    288	int nr_reloc;
    289
    290	/* BPF verifier log settings */
    291	char *log_buf;
    292	size_t log_size;
    293	__u32 log_level;
    294
    295	struct {
    296		int nr;
    297		int *fds;
    298	} instances;
    299	bpf_program_prep_t preprocessor;
    300
    301	struct bpf_object *obj;
    302	void *priv;
    303	bpf_program_clear_priv_t clear_priv;
    304
    305	bool autoload;
    306	bool mark_btf_static;
    307	enum bpf_prog_type type;
    308	enum bpf_attach_type expected_attach_type;
    309	int prog_ifindex;
    310	__u32 attach_btf_obj_fd;
    311	__u32 attach_btf_id;
    312	__u32 attach_prog_fd;
    313	void *func_info;
    314	__u32 func_info_rec_size;
    315	__u32 func_info_cnt;
    316
    317	void *line_info;
    318	__u32 line_info_rec_size;
    319	__u32 line_info_cnt;
    320	__u32 prog_flags;
    321};
    322
    323struct bpf_struct_ops {
    324	const char *tname;
    325	const struct btf_type *type;
    326	struct bpf_program **progs;
    327	__u32 *kern_func_off;
    328	/* e.g. struct tcp_congestion_ops in bpf_prog's btf format */
    329	void *data;
    330	/* e.g. struct bpf_struct_ops_tcp_congestion_ops in
    331	 *      btf_vmlinux's format.
    332	 * struct bpf_struct_ops_tcp_congestion_ops {
    333	 *	[... some other kernel fields ...]
    334	 *	struct tcp_congestion_ops data;
    335	 * }
    336	 * kern_vdata-size == sizeof(struct bpf_struct_ops_tcp_congestion_ops)
    337	 * bpf_map__init_kern_struct_ops() will populate the "kern_vdata"
    338	 * from "data".
    339	 */
    340	void *kern_vdata;
    341	__u32 type_id;
    342};
    343
    344#define DATA_SEC ".data"
    345#define BSS_SEC ".bss"
    346#define RODATA_SEC ".rodata"
    347#define KCONFIG_SEC ".kconfig"
    348#define KSYMS_SEC ".ksyms"
    349#define STRUCT_OPS_SEC ".struct_ops"
    350
    351enum libbpf_map_type {
    352	LIBBPF_MAP_UNSPEC,
    353	LIBBPF_MAP_DATA,
    354	LIBBPF_MAP_BSS,
    355	LIBBPF_MAP_RODATA,
    356	LIBBPF_MAP_KCONFIG,
    357};
    358
    359struct bpf_map {
    360	struct bpf_object *obj;
    361	char *name;
    362	/* real_name is defined for special internal maps (.rodata*,
    363	 * .data*, .bss, .kconfig) and preserves their original ELF section
    364	 * name. This is important to be be able to find corresponding BTF
    365	 * DATASEC information.
    366	 */
    367	char *real_name;
    368	int fd;
    369	int sec_idx;
    370	size_t sec_offset;
    371	int map_ifindex;
    372	int inner_map_fd;
    373	struct bpf_map_def def;
    374	__u32 numa_node;
    375	__u32 btf_var_idx;
    376	__u32 btf_key_type_id;
    377	__u32 btf_value_type_id;
    378	__u32 btf_vmlinux_value_type_id;
    379	void *priv;
    380	bpf_map_clear_priv_t clear_priv;
    381	enum libbpf_map_type libbpf_type;
    382	void *mmaped;
    383	struct bpf_struct_ops *st_ops;
    384	struct bpf_map *inner_map;
    385	void **init_slots;
    386	int init_slots_sz;
    387	char *pin_path;
    388	bool pinned;
    389	bool reused;
    390	bool autocreate;
    391	__u64 map_extra;
    392};
    393
    394enum extern_type {
    395	EXT_UNKNOWN,
    396	EXT_KCFG,
    397	EXT_KSYM,
    398};
    399
    400enum kcfg_type {
    401	KCFG_UNKNOWN,
    402	KCFG_CHAR,
    403	KCFG_BOOL,
    404	KCFG_INT,
    405	KCFG_TRISTATE,
    406	KCFG_CHAR_ARR,
    407};
    408
    409struct extern_desc {
    410	enum extern_type type;
    411	int sym_idx;
    412	int btf_id;
    413	int sec_btf_id;
    414	const char *name;
    415	bool is_set;
    416	bool is_weak;
    417	union {
    418		struct {
    419			enum kcfg_type type;
    420			int sz;
    421			int align;
    422			int data_off;
    423			bool is_signed;
    424		} kcfg;
    425		struct {
    426			unsigned long long addr;
    427
    428			/* target btf_id of the corresponding kernel var. */
    429			int kernel_btf_obj_fd;
    430			int kernel_btf_id;
    431
    432			/* local btf_id of the ksym extern's type. */
    433			__u32 type_id;
    434			/* BTF fd index to be patched in for insn->off, this is
    435			 * 0 for vmlinux BTF, index in obj->fd_array for module
    436			 * BTF
    437			 */
    438			__s16 btf_fd_idx;
    439		} ksym;
    440	};
    441};
    442
    443static LIST_HEAD(bpf_objects_list);
    444
    445struct module_btf {
    446	struct btf *btf;
    447	char *name;
    448	__u32 id;
    449	int fd;
    450	int fd_array_idx;
    451};
    452
    453enum sec_type {
    454	SEC_UNUSED = 0,
    455	SEC_RELO,
    456	SEC_BSS,
    457	SEC_DATA,
    458	SEC_RODATA,
    459};
    460
    461struct elf_sec_desc {
    462	enum sec_type sec_type;
    463	Elf64_Shdr *shdr;
    464	Elf_Data *data;
    465};
    466
    467struct elf_state {
    468	int fd;
    469	const void *obj_buf;
    470	size_t obj_buf_sz;
    471	Elf *elf;
    472	Elf64_Ehdr *ehdr;
    473	Elf_Data *symbols;
    474	Elf_Data *st_ops_data;
    475	size_t shstrndx; /* section index for section name strings */
    476	size_t strtabidx;
    477	struct elf_sec_desc *secs;
    478	int sec_cnt;
    479	int maps_shndx;
    480	int btf_maps_shndx;
    481	__u32 btf_maps_sec_btf_id;
    482	int text_shndx;
    483	int symbols_shndx;
    484	int st_ops_shndx;
    485};
    486
    487struct usdt_manager;
    488
    489struct bpf_object {
    490	char name[BPF_OBJ_NAME_LEN];
    491	char license[64];
    492	__u32 kern_version;
    493
    494	struct bpf_program *programs;
    495	size_t nr_programs;
    496	struct bpf_map *maps;
    497	size_t nr_maps;
    498	size_t maps_cap;
    499
    500	char *kconfig;
    501	struct extern_desc *externs;
    502	int nr_extern;
    503	int kconfig_map_idx;
    504
    505	bool loaded;
    506	bool has_subcalls;
    507	bool has_rodata;
    508
    509	struct bpf_gen *gen_loader;
    510
    511	/* Information when doing ELF related work. Only valid if efile.elf is not NULL */
    512	struct elf_state efile;
    513	/*
    514	 * All loaded bpf_object are linked in a list, which is
    515	 * hidden to caller. bpf_objects__<func> handlers deal with
    516	 * all objects.
    517	 */
    518	struct list_head list;
    519
    520	struct btf *btf;
    521	struct btf_ext *btf_ext;
    522
    523	/* Parse and load BTF vmlinux if any of the programs in the object need
    524	 * it at load time.
    525	 */
    526	struct btf *btf_vmlinux;
    527	/* Path to the custom BTF to be used for BPF CO-RE relocations as an
    528	 * override for vmlinux BTF.
    529	 */
    530	char *btf_custom_path;
    531	/* vmlinux BTF override for CO-RE relocations */
    532	struct btf *btf_vmlinux_override;
    533	/* Lazily initialized kernel module BTFs */
    534	struct module_btf *btf_modules;
    535	bool btf_modules_loaded;
    536	size_t btf_module_cnt;
    537	size_t btf_module_cap;
    538
    539	/* optional log settings passed to BPF_BTF_LOAD and BPF_PROG_LOAD commands */
    540	char *log_buf;
    541	size_t log_size;
    542	__u32 log_level;
    543
    544	void *priv;
    545	bpf_object_clear_priv_t clear_priv;
    546
    547	int *fd_array;
    548	size_t fd_array_cap;
    549	size_t fd_array_cnt;
    550
    551	struct usdt_manager *usdt_man;
    552
    553	char path[];
    554};
    555
    556static const char *elf_sym_str(const struct bpf_object *obj, size_t off);
    557static const char *elf_sec_str(const struct bpf_object *obj, size_t off);
    558static Elf_Scn *elf_sec_by_idx(const struct bpf_object *obj, size_t idx);
    559static Elf_Scn *elf_sec_by_name(const struct bpf_object *obj, const char *name);
    560static Elf64_Shdr *elf_sec_hdr(const struct bpf_object *obj, Elf_Scn *scn);
    561static const char *elf_sec_name(const struct bpf_object *obj, Elf_Scn *scn);
    562static Elf_Data *elf_sec_data(const struct bpf_object *obj, Elf_Scn *scn);
    563static Elf64_Sym *elf_sym_by_idx(const struct bpf_object *obj, size_t idx);
    564static Elf64_Rel *elf_rel_by_idx(Elf_Data *data, size_t idx);
    565
    566void bpf_program__unload(struct bpf_program *prog)
    567{
    568	int i;
    569
    570	if (!prog)
    571		return;
    572
    573	/*
    574	 * If the object is opened but the program was never loaded,
    575	 * it is possible that prog->instances.nr == -1.
    576	 */
    577	if (prog->instances.nr > 0) {
    578		for (i = 0; i < prog->instances.nr; i++)
    579			zclose(prog->instances.fds[i]);
    580	} else if (prog->instances.nr != -1) {
    581		pr_warn("Internal error: instances.nr is %d\n",
    582			prog->instances.nr);
    583	}
    584
    585	prog->instances.nr = -1;
    586	zfree(&prog->instances.fds);
    587
    588	zfree(&prog->func_info);
    589	zfree(&prog->line_info);
    590}
    591
    592static void bpf_program__exit(struct bpf_program *prog)
    593{
    594	if (!prog)
    595		return;
    596
    597	if (prog->clear_priv)
    598		prog->clear_priv(prog, prog->priv);
    599
    600	prog->priv = NULL;
    601	prog->clear_priv = NULL;
    602
    603	bpf_program__unload(prog);
    604	zfree(&prog->name);
    605	zfree(&prog->sec_name);
    606	zfree(&prog->pin_name);
    607	zfree(&prog->insns);
    608	zfree(&prog->reloc_desc);
    609
    610	prog->nr_reloc = 0;
    611	prog->insns_cnt = 0;
    612	prog->sec_idx = -1;
    613}
    614
    615static char *__bpf_program__pin_name(struct bpf_program *prog)
    616{
    617	char *name, *p;
    618
    619	if (libbpf_mode & LIBBPF_STRICT_SEC_NAME)
    620		name = strdup(prog->name);
    621	else
    622		name = strdup(prog->sec_name);
    623
    624	if (!name)
    625		return NULL;
    626
    627	p = name;
    628
    629	while ((p = strchr(p, '/')))
    630		*p = '_';
    631
    632	return name;
    633}
    634
    635static bool insn_is_subprog_call(const struct bpf_insn *insn)
    636{
    637	return BPF_CLASS(insn->code) == BPF_JMP &&
    638	       BPF_OP(insn->code) == BPF_CALL &&
    639	       BPF_SRC(insn->code) == BPF_K &&
    640	       insn->src_reg == BPF_PSEUDO_CALL &&
    641	       insn->dst_reg == 0 &&
    642	       insn->off == 0;
    643}
    644
    645static bool is_call_insn(const struct bpf_insn *insn)
    646{
    647	return insn->code == (BPF_JMP | BPF_CALL);
    648}
    649
    650static bool insn_is_pseudo_func(struct bpf_insn *insn)
    651{
    652	return is_ldimm64_insn(insn) && insn->src_reg == BPF_PSEUDO_FUNC;
    653}
    654
    655static int
    656bpf_object__init_prog(struct bpf_object *obj, struct bpf_program *prog,
    657		      const char *name, size_t sec_idx, const char *sec_name,
    658		      size_t sec_off, void *insn_data, size_t insn_data_sz)
    659{
    660	if (insn_data_sz == 0 || insn_data_sz % BPF_INSN_SZ || sec_off % BPF_INSN_SZ) {
    661		pr_warn("sec '%s': corrupted program '%s', offset %zu, size %zu\n",
    662			sec_name, name, sec_off, insn_data_sz);
    663		return -EINVAL;
    664	}
    665
    666	memset(prog, 0, sizeof(*prog));
    667	prog->obj = obj;
    668
    669	prog->sec_idx = sec_idx;
    670	prog->sec_insn_off = sec_off / BPF_INSN_SZ;
    671	prog->sec_insn_cnt = insn_data_sz / BPF_INSN_SZ;
    672	/* insns_cnt can later be increased by appending used subprograms */
    673	prog->insns_cnt = prog->sec_insn_cnt;
    674
    675	prog->type = BPF_PROG_TYPE_UNSPEC;
    676
    677	/* libbpf's convention for SEC("?abc...") is that it's just like
    678	 * SEC("abc...") but the corresponding bpf_program starts out with
    679	 * autoload set to false.
    680	 */
    681	if (sec_name[0] == '?') {
    682		prog->autoload = false;
    683		/* from now on forget there was ? in section name */
    684		sec_name++;
    685	} else {
    686		prog->autoload = true;
    687	}
    688
    689	prog->instances.fds = NULL;
    690	prog->instances.nr = -1;
    691
    692	/* inherit object's log_level */
    693	prog->log_level = obj->log_level;
    694
    695	prog->sec_name = strdup(sec_name);
    696	if (!prog->sec_name)
    697		goto errout;
    698
    699	prog->name = strdup(name);
    700	if (!prog->name)
    701		goto errout;
    702
    703	prog->pin_name = __bpf_program__pin_name(prog);
    704	if (!prog->pin_name)
    705		goto errout;
    706
    707	prog->insns = malloc(insn_data_sz);
    708	if (!prog->insns)
    709		goto errout;
    710	memcpy(prog->insns, insn_data, insn_data_sz);
    711
    712	return 0;
    713errout:
    714	pr_warn("sec '%s': failed to allocate memory for prog '%s'\n", sec_name, name);
    715	bpf_program__exit(prog);
    716	return -ENOMEM;
    717}
    718
    719static int
    720bpf_object__add_programs(struct bpf_object *obj, Elf_Data *sec_data,
    721			 const char *sec_name, int sec_idx)
    722{
    723	Elf_Data *symbols = obj->efile.symbols;
    724	struct bpf_program *prog, *progs;
    725	void *data = sec_data->d_buf;
    726	size_t sec_sz = sec_data->d_size, sec_off, prog_sz, nr_syms;
    727	int nr_progs, err, i;
    728	const char *name;
    729	Elf64_Sym *sym;
    730
    731	progs = obj->programs;
    732	nr_progs = obj->nr_programs;
    733	nr_syms = symbols->d_size / sizeof(Elf64_Sym);
    734	sec_off = 0;
    735
    736	for (i = 0; i < nr_syms; i++) {
    737		sym = elf_sym_by_idx(obj, i);
    738
    739		if (sym->st_shndx != sec_idx)
    740			continue;
    741		if (ELF64_ST_TYPE(sym->st_info) != STT_FUNC)
    742			continue;
    743
    744		prog_sz = sym->st_size;
    745		sec_off = sym->st_value;
    746
    747		name = elf_sym_str(obj, sym->st_name);
    748		if (!name) {
    749			pr_warn("sec '%s': failed to get symbol name for offset %zu\n",
    750				sec_name, sec_off);
    751			return -LIBBPF_ERRNO__FORMAT;
    752		}
    753
    754		if (sec_off + prog_sz > sec_sz) {
    755			pr_warn("sec '%s': program at offset %zu crosses section boundary\n",
    756				sec_name, sec_off);
    757			return -LIBBPF_ERRNO__FORMAT;
    758		}
    759
    760		if (sec_idx != obj->efile.text_shndx && ELF64_ST_BIND(sym->st_info) == STB_LOCAL) {
    761			pr_warn("sec '%s': program '%s' is static and not supported\n", sec_name, name);
    762			return -ENOTSUP;
    763		}
    764
    765		pr_debug("sec '%s': found program '%s' at insn offset %zu (%zu bytes), code size %zu insns (%zu bytes)\n",
    766			 sec_name, name, sec_off / BPF_INSN_SZ, sec_off, prog_sz / BPF_INSN_SZ, prog_sz);
    767
    768		progs = libbpf_reallocarray(progs, nr_progs + 1, sizeof(*progs));
    769		if (!progs) {
    770			/*
    771			 * In this case the original obj->programs
    772			 * is still valid, so don't need special treat for
    773			 * bpf_close_object().
    774			 */
    775			pr_warn("sec '%s': failed to alloc memory for new program '%s'\n",
    776				sec_name, name);
    777			return -ENOMEM;
    778		}
    779		obj->programs = progs;
    780
    781		prog = &progs[nr_progs];
    782
    783		err = bpf_object__init_prog(obj, prog, name, sec_idx, sec_name,
    784					    sec_off, data + sec_off, prog_sz);
    785		if (err)
    786			return err;
    787
    788		/* if function is a global/weak symbol, but has restricted
    789		 * (STV_HIDDEN or STV_INTERNAL) visibility, mark its BTF FUNC
    790		 * as static to enable more permissive BPF verification mode
    791		 * with more outside context available to BPF verifier
    792		 */
    793		if (ELF64_ST_BIND(sym->st_info) != STB_LOCAL
    794		    && (ELF64_ST_VISIBILITY(sym->st_other) == STV_HIDDEN
    795			|| ELF64_ST_VISIBILITY(sym->st_other) == STV_INTERNAL))
    796			prog->mark_btf_static = true;
    797
    798		nr_progs++;
    799		obj->nr_programs = nr_progs;
    800	}
    801
    802	return 0;
    803}
    804
    805__u32 get_kernel_version(void)
    806{
    807	/* On Ubuntu LINUX_VERSION_CODE doesn't correspond to info.release,
    808	 * but Ubuntu provides /proc/version_signature file, as described at
    809	 * https://ubuntu.com/kernel, with an example contents below, which we
    810	 * can use to get a proper LINUX_VERSION_CODE.
    811	 *
    812	 *   Ubuntu 5.4.0-12.15-generic 5.4.8
    813	 *
    814	 * In the above, 5.4.8 is what kernel is actually expecting, while
    815	 * uname() call will return 5.4.0 in info.release.
    816	 */
    817	const char *ubuntu_kver_file = "/proc/version_signature";
    818	__u32 major, minor, patch;
    819	struct utsname info;
    820
    821	if (access(ubuntu_kver_file, R_OK) == 0) {
    822		FILE *f;
    823
    824		f = fopen(ubuntu_kver_file, "r");
    825		if (f) {
    826			if (fscanf(f, "%*s %*s %d.%d.%d\n", &major, &minor, &patch) == 3) {
    827				fclose(f);
    828				return KERNEL_VERSION(major, minor, patch);
    829			}
    830			fclose(f);
    831		}
    832		/* something went wrong, fall back to uname() approach */
    833	}
    834
    835	uname(&info);
    836	if (sscanf(info.release, "%u.%u.%u", &major, &minor, &patch) != 3)
    837		return 0;
    838	return KERNEL_VERSION(major, minor, patch);
    839}
    840
    841static const struct btf_member *
    842find_member_by_offset(const struct btf_type *t, __u32 bit_offset)
    843{
    844	struct btf_member *m;
    845	int i;
    846
    847	for (i = 0, m = btf_members(t); i < btf_vlen(t); i++, m++) {
    848		if (btf_member_bit_offset(t, i) == bit_offset)
    849			return m;
    850	}
    851
    852	return NULL;
    853}
    854
    855static const struct btf_member *
    856find_member_by_name(const struct btf *btf, const struct btf_type *t,
    857		    const char *name)
    858{
    859	struct btf_member *m;
    860	int i;
    861
    862	for (i = 0, m = btf_members(t); i < btf_vlen(t); i++, m++) {
    863		if (!strcmp(btf__name_by_offset(btf, m->name_off), name))
    864			return m;
    865	}
    866
    867	return NULL;
    868}
    869
    870#define STRUCT_OPS_VALUE_PREFIX "bpf_struct_ops_"
    871static int find_btf_by_prefix_kind(const struct btf *btf, const char *prefix,
    872				   const char *name, __u32 kind);
    873
    874static int
    875find_struct_ops_kern_types(const struct btf *btf, const char *tname,
    876			   const struct btf_type **type, __u32 *type_id,
    877			   const struct btf_type **vtype, __u32 *vtype_id,
    878			   const struct btf_member **data_member)
    879{
    880	const struct btf_type *kern_type, *kern_vtype;
    881	const struct btf_member *kern_data_member;
    882	__s32 kern_vtype_id, kern_type_id;
    883	__u32 i;
    884
    885	kern_type_id = btf__find_by_name_kind(btf, tname, BTF_KIND_STRUCT);
    886	if (kern_type_id < 0) {
    887		pr_warn("struct_ops init_kern: struct %s is not found in kernel BTF\n",
    888			tname);
    889		return kern_type_id;
    890	}
    891	kern_type = btf__type_by_id(btf, kern_type_id);
    892
    893	/* Find the corresponding "map_value" type that will be used
    894	 * in map_update(BPF_MAP_TYPE_STRUCT_OPS).  For example,
    895	 * find "struct bpf_struct_ops_tcp_congestion_ops" from the
    896	 * btf_vmlinux.
    897	 */
    898	kern_vtype_id = find_btf_by_prefix_kind(btf, STRUCT_OPS_VALUE_PREFIX,
    899						tname, BTF_KIND_STRUCT);
    900	if (kern_vtype_id < 0) {
    901		pr_warn("struct_ops init_kern: struct %s%s is not found in kernel BTF\n",
    902			STRUCT_OPS_VALUE_PREFIX, tname);
    903		return kern_vtype_id;
    904	}
    905	kern_vtype = btf__type_by_id(btf, kern_vtype_id);
    906
    907	/* Find "struct tcp_congestion_ops" from
    908	 * struct bpf_struct_ops_tcp_congestion_ops {
    909	 *	[ ... ]
    910	 *	struct tcp_congestion_ops data;
    911	 * }
    912	 */
    913	kern_data_member = btf_members(kern_vtype);
    914	for (i = 0; i < btf_vlen(kern_vtype); i++, kern_data_member++) {
    915		if (kern_data_member->type == kern_type_id)
    916			break;
    917	}
    918	if (i == btf_vlen(kern_vtype)) {
    919		pr_warn("struct_ops init_kern: struct %s data is not found in struct %s%s\n",
    920			tname, STRUCT_OPS_VALUE_PREFIX, tname);
    921		return -EINVAL;
    922	}
    923
    924	*type = kern_type;
    925	*type_id = kern_type_id;
    926	*vtype = kern_vtype;
    927	*vtype_id = kern_vtype_id;
    928	*data_member = kern_data_member;
    929
    930	return 0;
    931}
    932
    933static bool bpf_map__is_struct_ops(const struct bpf_map *map)
    934{
    935	return map->def.type == BPF_MAP_TYPE_STRUCT_OPS;
    936}
    937
    938/* Init the map's fields that depend on kern_btf */
    939static int bpf_map__init_kern_struct_ops(struct bpf_map *map,
    940					 const struct btf *btf,
    941					 const struct btf *kern_btf)
    942{
    943	const struct btf_member *member, *kern_member, *kern_data_member;
    944	const struct btf_type *type, *kern_type, *kern_vtype;
    945	__u32 i, kern_type_id, kern_vtype_id, kern_data_off;
    946	struct bpf_struct_ops *st_ops;
    947	void *data, *kern_data;
    948	const char *tname;
    949	int err;
    950
    951	st_ops = map->st_ops;
    952	type = st_ops->type;
    953	tname = st_ops->tname;
    954	err = find_struct_ops_kern_types(kern_btf, tname,
    955					 &kern_type, &kern_type_id,
    956					 &kern_vtype, &kern_vtype_id,
    957					 &kern_data_member);
    958	if (err)
    959		return err;
    960
    961	pr_debug("struct_ops init_kern %s: type_id:%u kern_type_id:%u kern_vtype_id:%u\n",
    962		 map->name, st_ops->type_id, kern_type_id, kern_vtype_id);
    963
    964	map->def.value_size = kern_vtype->size;
    965	map->btf_vmlinux_value_type_id = kern_vtype_id;
    966
    967	st_ops->kern_vdata = calloc(1, kern_vtype->size);
    968	if (!st_ops->kern_vdata)
    969		return -ENOMEM;
    970
    971	data = st_ops->data;
    972	kern_data_off = kern_data_member->offset / 8;
    973	kern_data = st_ops->kern_vdata + kern_data_off;
    974
    975	member = btf_members(type);
    976	for (i = 0; i < btf_vlen(type); i++, member++) {
    977		const struct btf_type *mtype, *kern_mtype;
    978		__u32 mtype_id, kern_mtype_id;
    979		void *mdata, *kern_mdata;
    980		__s64 msize, kern_msize;
    981		__u32 moff, kern_moff;
    982		__u32 kern_member_idx;
    983		const char *mname;
    984
    985		mname = btf__name_by_offset(btf, member->name_off);
    986		kern_member = find_member_by_name(kern_btf, kern_type, mname);
    987		if (!kern_member) {
    988			pr_warn("struct_ops init_kern %s: Cannot find member %s in kernel BTF\n",
    989				map->name, mname);
    990			return -ENOTSUP;
    991		}
    992
    993		kern_member_idx = kern_member - btf_members(kern_type);
    994		if (btf_member_bitfield_size(type, i) ||
    995		    btf_member_bitfield_size(kern_type, kern_member_idx)) {
    996			pr_warn("struct_ops init_kern %s: bitfield %s is not supported\n",
    997				map->name, mname);
    998			return -ENOTSUP;
    999		}
   1000
   1001		moff = member->offset / 8;
   1002		kern_moff = kern_member->offset / 8;
   1003
   1004		mdata = data + moff;
   1005		kern_mdata = kern_data + kern_moff;
   1006
   1007		mtype = skip_mods_and_typedefs(btf, member->type, &mtype_id);
   1008		kern_mtype = skip_mods_and_typedefs(kern_btf, kern_member->type,
   1009						    &kern_mtype_id);
   1010		if (BTF_INFO_KIND(mtype->info) !=
   1011		    BTF_INFO_KIND(kern_mtype->info)) {
   1012			pr_warn("struct_ops init_kern %s: Unmatched member type %s %u != %u(kernel)\n",
   1013				map->name, mname, BTF_INFO_KIND(mtype->info),
   1014				BTF_INFO_KIND(kern_mtype->info));
   1015			return -ENOTSUP;
   1016		}
   1017
   1018		if (btf_is_ptr(mtype)) {
   1019			struct bpf_program *prog;
   1020
   1021			prog = st_ops->progs[i];
   1022			if (!prog)
   1023				continue;
   1024
   1025			kern_mtype = skip_mods_and_typedefs(kern_btf,
   1026							    kern_mtype->type,
   1027							    &kern_mtype_id);
   1028
   1029			/* mtype->type must be a func_proto which was
   1030			 * guaranteed in bpf_object__collect_st_ops_relos(),
   1031			 * so only check kern_mtype for func_proto here.
   1032			 */
   1033			if (!btf_is_func_proto(kern_mtype)) {
   1034				pr_warn("struct_ops init_kern %s: kernel member %s is not a func ptr\n",
   1035					map->name, mname);
   1036				return -ENOTSUP;
   1037			}
   1038
   1039			prog->attach_btf_id = kern_type_id;
   1040			prog->expected_attach_type = kern_member_idx;
   1041
   1042			st_ops->kern_func_off[i] = kern_data_off + kern_moff;
   1043
   1044			pr_debug("struct_ops init_kern %s: func ptr %s is set to prog %s from data(+%u) to kern_data(+%u)\n",
   1045				 map->name, mname, prog->name, moff,
   1046				 kern_moff);
   1047
   1048			continue;
   1049		}
   1050
   1051		msize = btf__resolve_size(btf, mtype_id);
   1052		kern_msize = btf__resolve_size(kern_btf, kern_mtype_id);
   1053		if (msize < 0 || kern_msize < 0 || msize != kern_msize) {
   1054			pr_warn("struct_ops init_kern %s: Error in size of member %s: %zd != %zd(kernel)\n",
   1055				map->name, mname, (ssize_t)msize,
   1056				(ssize_t)kern_msize);
   1057			return -ENOTSUP;
   1058		}
   1059
   1060		pr_debug("struct_ops init_kern %s: copy %s %u bytes from data(+%u) to kern_data(+%u)\n",
   1061			 map->name, mname, (unsigned int)msize,
   1062			 moff, kern_moff);
   1063		memcpy(kern_mdata, mdata, msize);
   1064	}
   1065
   1066	return 0;
   1067}
   1068
   1069static int bpf_object__init_kern_struct_ops_maps(struct bpf_object *obj)
   1070{
   1071	struct bpf_map *map;
   1072	size_t i;
   1073	int err;
   1074
   1075	for (i = 0; i < obj->nr_maps; i++) {
   1076		map = &obj->maps[i];
   1077
   1078		if (!bpf_map__is_struct_ops(map))
   1079			continue;
   1080
   1081		err = bpf_map__init_kern_struct_ops(map, obj->btf,
   1082						    obj->btf_vmlinux);
   1083		if (err)
   1084			return err;
   1085	}
   1086
   1087	return 0;
   1088}
   1089
   1090static int bpf_object__init_struct_ops_maps(struct bpf_object *obj)
   1091{
   1092	const struct btf_type *type, *datasec;
   1093	const struct btf_var_secinfo *vsi;
   1094	struct bpf_struct_ops *st_ops;
   1095	const char *tname, *var_name;
   1096	__s32 type_id, datasec_id;
   1097	const struct btf *btf;
   1098	struct bpf_map *map;
   1099	__u32 i;
   1100
   1101	if (obj->efile.st_ops_shndx == -1)
   1102		return 0;
   1103
   1104	btf = obj->btf;
   1105	datasec_id = btf__find_by_name_kind(btf, STRUCT_OPS_SEC,
   1106					    BTF_KIND_DATASEC);
   1107	if (datasec_id < 0) {
   1108		pr_warn("struct_ops init: DATASEC %s not found\n",
   1109			STRUCT_OPS_SEC);
   1110		return -EINVAL;
   1111	}
   1112
   1113	datasec = btf__type_by_id(btf, datasec_id);
   1114	vsi = btf_var_secinfos(datasec);
   1115	for (i = 0; i < btf_vlen(datasec); i++, vsi++) {
   1116		type = btf__type_by_id(obj->btf, vsi->type);
   1117		var_name = btf__name_by_offset(obj->btf, type->name_off);
   1118
   1119		type_id = btf__resolve_type(obj->btf, vsi->type);
   1120		if (type_id < 0) {
   1121			pr_warn("struct_ops init: Cannot resolve var type_id %u in DATASEC %s\n",
   1122				vsi->type, STRUCT_OPS_SEC);
   1123			return -EINVAL;
   1124		}
   1125
   1126		type = btf__type_by_id(obj->btf, type_id);
   1127		tname = btf__name_by_offset(obj->btf, type->name_off);
   1128		if (!tname[0]) {
   1129			pr_warn("struct_ops init: anonymous type is not supported\n");
   1130			return -ENOTSUP;
   1131		}
   1132		if (!btf_is_struct(type)) {
   1133			pr_warn("struct_ops init: %s is not a struct\n", tname);
   1134			return -EINVAL;
   1135		}
   1136
   1137		map = bpf_object__add_map(obj);
   1138		if (IS_ERR(map))
   1139			return PTR_ERR(map);
   1140
   1141		map->sec_idx = obj->efile.st_ops_shndx;
   1142		map->sec_offset = vsi->offset;
   1143		map->name = strdup(var_name);
   1144		if (!map->name)
   1145			return -ENOMEM;
   1146
   1147		map->def.type = BPF_MAP_TYPE_STRUCT_OPS;
   1148		map->def.key_size = sizeof(int);
   1149		map->def.value_size = type->size;
   1150		map->def.max_entries = 1;
   1151
   1152		map->st_ops = calloc(1, sizeof(*map->st_ops));
   1153		if (!map->st_ops)
   1154			return -ENOMEM;
   1155		st_ops = map->st_ops;
   1156		st_ops->data = malloc(type->size);
   1157		st_ops->progs = calloc(btf_vlen(type), sizeof(*st_ops->progs));
   1158		st_ops->kern_func_off = malloc(btf_vlen(type) *
   1159					       sizeof(*st_ops->kern_func_off));
   1160		if (!st_ops->data || !st_ops->progs || !st_ops->kern_func_off)
   1161			return -ENOMEM;
   1162
   1163		if (vsi->offset + type->size > obj->efile.st_ops_data->d_size) {
   1164			pr_warn("struct_ops init: var %s is beyond the end of DATASEC %s\n",
   1165				var_name, STRUCT_OPS_SEC);
   1166			return -EINVAL;
   1167		}
   1168
   1169		memcpy(st_ops->data,
   1170		       obj->efile.st_ops_data->d_buf + vsi->offset,
   1171		       type->size);
   1172		st_ops->tname = tname;
   1173		st_ops->type = type;
   1174		st_ops->type_id = type_id;
   1175
   1176		pr_debug("struct_ops init: struct %s(type_id=%u) %s found at offset %u\n",
   1177			 tname, type_id, var_name, vsi->offset);
   1178	}
   1179
   1180	return 0;
   1181}
   1182
   1183static struct bpf_object *bpf_object__new(const char *path,
   1184					  const void *obj_buf,
   1185					  size_t obj_buf_sz,
   1186					  const char *obj_name)
   1187{
   1188	bool strict = (libbpf_mode & LIBBPF_STRICT_NO_OBJECT_LIST);
   1189	struct bpf_object *obj;
   1190	char *end;
   1191
   1192	obj = calloc(1, sizeof(struct bpf_object) + strlen(path) + 1);
   1193	if (!obj) {
   1194		pr_warn("alloc memory failed for %s\n", path);
   1195		return ERR_PTR(-ENOMEM);
   1196	}
   1197
   1198	strcpy(obj->path, path);
   1199	if (obj_name) {
   1200		libbpf_strlcpy(obj->name, obj_name, sizeof(obj->name));
   1201	} else {
   1202		/* Using basename() GNU version which doesn't modify arg. */
   1203		libbpf_strlcpy(obj->name, basename((void *)path), sizeof(obj->name));
   1204		end = strchr(obj->name, '.');
   1205		if (end)
   1206			*end = 0;
   1207	}
   1208
   1209	obj->efile.fd = -1;
   1210	/*
   1211	 * Caller of this function should also call
   1212	 * bpf_object__elf_finish() after data collection to return
   1213	 * obj_buf to user. If not, we should duplicate the buffer to
   1214	 * avoid user freeing them before elf finish.
   1215	 */
   1216	obj->efile.obj_buf = obj_buf;
   1217	obj->efile.obj_buf_sz = obj_buf_sz;
   1218	obj->efile.maps_shndx = -1;
   1219	obj->efile.btf_maps_shndx = -1;
   1220	obj->efile.st_ops_shndx = -1;
   1221	obj->kconfig_map_idx = -1;
   1222
   1223	obj->kern_version = get_kernel_version();
   1224	obj->loaded = false;
   1225
   1226	INIT_LIST_HEAD(&obj->list);
   1227	if (!strict)
   1228		list_add(&obj->list, &bpf_objects_list);
   1229	return obj;
   1230}
   1231
   1232static void bpf_object__elf_finish(struct bpf_object *obj)
   1233{
   1234	if (!obj->efile.elf)
   1235		return;
   1236
   1237	elf_end(obj->efile.elf);
   1238	obj->efile.elf = NULL;
   1239	obj->efile.symbols = NULL;
   1240	obj->efile.st_ops_data = NULL;
   1241
   1242	zfree(&obj->efile.secs);
   1243	obj->efile.sec_cnt = 0;
   1244	zclose(obj->efile.fd);
   1245	obj->efile.obj_buf = NULL;
   1246	obj->efile.obj_buf_sz = 0;
   1247}
   1248
   1249static int bpf_object__elf_init(struct bpf_object *obj)
   1250{
   1251	Elf64_Ehdr *ehdr;
   1252	int err = 0;
   1253	Elf *elf;
   1254
   1255	if (obj->efile.elf) {
   1256		pr_warn("elf: init internal error\n");
   1257		return -LIBBPF_ERRNO__LIBELF;
   1258	}
   1259
   1260	if (obj->efile.obj_buf_sz > 0) {
   1261		/*
   1262		 * obj_buf should have been validated by
   1263		 * bpf_object__open_buffer().
   1264		 */
   1265		elf = elf_memory((char *)obj->efile.obj_buf, obj->efile.obj_buf_sz);
   1266	} else {
   1267		obj->efile.fd = open(obj->path, O_RDONLY | O_CLOEXEC);
   1268		if (obj->efile.fd < 0) {
   1269			char errmsg[STRERR_BUFSIZE], *cp;
   1270
   1271			err = -errno;
   1272			cp = libbpf_strerror_r(err, errmsg, sizeof(errmsg));
   1273			pr_warn("elf: failed to open %s: %s\n", obj->path, cp);
   1274			return err;
   1275		}
   1276
   1277		elf = elf_begin(obj->efile.fd, ELF_C_READ_MMAP, NULL);
   1278	}
   1279
   1280	if (!elf) {
   1281		pr_warn("elf: failed to open %s as ELF file: %s\n", obj->path, elf_errmsg(-1));
   1282		err = -LIBBPF_ERRNO__LIBELF;
   1283		goto errout;
   1284	}
   1285
   1286	obj->efile.elf = elf;
   1287
   1288	if (elf_kind(elf) != ELF_K_ELF) {
   1289		err = -LIBBPF_ERRNO__FORMAT;
   1290		pr_warn("elf: '%s' is not a proper ELF object\n", obj->path);
   1291		goto errout;
   1292	}
   1293
   1294	if (gelf_getclass(elf) != ELFCLASS64) {
   1295		err = -LIBBPF_ERRNO__FORMAT;
   1296		pr_warn("elf: '%s' is not a 64-bit ELF object\n", obj->path);
   1297		goto errout;
   1298	}
   1299
   1300	obj->efile.ehdr = ehdr = elf64_getehdr(elf);
   1301	if (!obj->efile.ehdr) {
   1302		pr_warn("elf: failed to get ELF header from %s: %s\n", obj->path, elf_errmsg(-1));
   1303		err = -LIBBPF_ERRNO__FORMAT;
   1304		goto errout;
   1305	}
   1306
   1307	if (elf_getshdrstrndx(elf, &obj->efile.shstrndx)) {
   1308		pr_warn("elf: failed to get section names section index for %s: %s\n",
   1309			obj->path, elf_errmsg(-1));
   1310		err = -LIBBPF_ERRNO__FORMAT;
   1311		goto errout;
   1312	}
   1313
   1314	/* Elf is corrupted/truncated, avoid calling elf_strptr. */
   1315	if (!elf_rawdata(elf_getscn(elf, obj->efile.shstrndx), NULL)) {
   1316		pr_warn("elf: failed to get section names strings from %s: %s\n",
   1317			obj->path, elf_errmsg(-1));
   1318		err = -LIBBPF_ERRNO__FORMAT;
   1319		goto errout;
   1320	}
   1321
   1322	/* Old LLVM set e_machine to EM_NONE */
   1323	if (ehdr->e_type != ET_REL || (ehdr->e_machine && ehdr->e_machine != EM_BPF)) {
   1324		pr_warn("elf: %s is not a valid eBPF object file\n", obj->path);
   1325		err = -LIBBPF_ERRNO__FORMAT;
   1326		goto errout;
   1327	}
   1328
   1329	return 0;
   1330errout:
   1331	bpf_object__elf_finish(obj);
   1332	return err;
   1333}
   1334
   1335static int bpf_object__check_endianness(struct bpf_object *obj)
   1336{
   1337#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
   1338	if (obj->efile.ehdr->e_ident[EI_DATA] == ELFDATA2LSB)
   1339		return 0;
   1340#elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
   1341	if (obj->efile.ehdr->e_ident[EI_DATA] == ELFDATA2MSB)
   1342		return 0;
   1343#else
   1344# error "Unrecognized __BYTE_ORDER__"
   1345#endif
   1346	pr_warn("elf: endianness mismatch in %s.\n", obj->path);
   1347	return -LIBBPF_ERRNO__ENDIAN;
   1348}
   1349
   1350static int
   1351bpf_object__init_license(struct bpf_object *obj, void *data, size_t size)
   1352{
   1353	/* libbpf_strlcpy() only copies first N - 1 bytes, so size + 1 won't
   1354	 * go over allowed ELF data section buffer
   1355	 */
   1356	libbpf_strlcpy(obj->license, data, min(size + 1, sizeof(obj->license)));
   1357	pr_debug("license of %s is %s\n", obj->path, obj->license);
   1358	return 0;
   1359}
   1360
   1361static int
   1362bpf_object__init_kversion(struct bpf_object *obj, void *data, size_t size)
   1363{
   1364	__u32 kver;
   1365
   1366	if (size != sizeof(kver)) {
   1367		pr_warn("invalid kver section in %s\n", obj->path);
   1368		return -LIBBPF_ERRNO__FORMAT;
   1369	}
   1370	memcpy(&kver, data, sizeof(kver));
   1371	obj->kern_version = kver;
   1372	pr_debug("kernel version of %s is %x\n", obj->path, obj->kern_version);
   1373	return 0;
   1374}
   1375
   1376static bool bpf_map_type__is_map_in_map(enum bpf_map_type type)
   1377{
   1378	if (type == BPF_MAP_TYPE_ARRAY_OF_MAPS ||
   1379	    type == BPF_MAP_TYPE_HASH_OF_MAPS)
   1380		return true;
   1381	return false;
   1382}
   1383
   1384static int find_elf_sec_sz(const struct bpf_object *obj, const char *name, __u32 *size)
   1385{
   1386	Elf_Data *data;
   1387	Elf_Scn *scn;
   1388
   1389	if (!name)
   1390		return -EINVAL;
   1391
   1392	scn = elf_sec_by_name(obj, name);
   1393	data = elf_sec_data(obj, scn);
   1394	if (data) {
   1395		*size = data->d_size;
   1396		return 0; /* found it */
   1397	}
   1398
   1399	return -ENOENT;
   1400}
   1401
   1402static int find_elf_var_offset(const struct bpf_object *obj, const char *name, __u32 *off)
   1403{
   1404	Elf_Data *symbols = obj->efile.symbols;
   1405	const char *sname;
   1406	size_t si;
   1407
   1408	if (!name || !off)
   1409		return -EINVAL;
   1410
   1411	for (si = 0; si < symbols->d_size / sizeof(Elf64_Sym); si++) {
   1412		Elf64_Sym *sym = elf_sym_by_idx(obj, si);
   1413
   1414		if (ELF64_ST_TYPE(sym->st_info) != STT_OBJECT)
   1415			continue;
   1416
   1417		if (ELF64_ST_BIND(sym->st_info) != STB_GLOBAL &&
   1418		    ELF64_ST_BIND(sym->st_info) != STB_WEAK)
   1419			continue;
   1420
   1421		sname = elf_sym_str(obj, sym->st_name);
   1422		if (!sname) {
   1423			pr_warn("failed to get sym name string for var %s\n", name);
   1424			return -EIO;
   1425		}
   1426		if (strcmp(name, sname) == 0) {
   1427			*off = sym->st_value;
   1428			return 0;
   1429		}
   1430	}
   1431
   1432	return -ENOENT;
   1433}
   1434
   1435static struct bpf_map *bpf_object__add_map(struct bpf_object *obj)
   1436{
   1437	struct bpf_map *map;
   1438	int err;
   1439
   1440	err = libbpf_ensure_mem((void **)&obj->maps, &obj->maps_cap,
   1441				sizeof(*obj->maps), obj->nr_maps + 1);
   1442	if (err)
   1443		return ERR_PTR(err);
   1444
   1445	map = &obj->maps[obj->nr_maps++];
   1446	map->obj = obj;
   1447	map->fd = -1;
   1448	map->inner_map_fd = -1;
   1449	map->autocreate = true;
   1450
   1451	return map;
   1452}
   1453
   1454static size_t bpf_map_mmap_sz(const struct bpf_map *map)
   1455{
   1456	long page_sz = sysconf(_SC_PAGE_SIZE);
   1457	size_t map_sz;
   1458
   1459	map_sz = (size_t)roundup(map->def.value_size, 8) * map->def.max_entries;
   1460	map_sz = roundup(map_sz, page_sz);
   1461	return map_sz;
   1462}
   1463
   1464static char *internal_map_name(struct bpf_object *obj, const char *real_name)
   1465{
   1466	char map_name[BPF_OBJ_NAME_LEN], *p;
   1467	int pfx_len, sfx_len = max((size_t)7, strlen(real_name));
   1468
   1469	/* This is one of the more confusing parts of libbpf for various
   1470	 * reasons, some of which are historical. The original idea for naming
   1471	 * internal names was to include as much of BPF object name prefix as
   1472	 * possible, so that it can be distinguished from similar internal
   1473	 * maps of a different BPF object.
   1474	 * As an example, let's say we have bpf_object named 'my_object_name'
   1475	 * and internal map corresponding to '.rodata' ELF section. The final
   1476	 * map name advertised to user and to the kernel will be
   1477	 * 'my_objec.rodata', taking first 8 characters of object name and
   1478	 * entire 7 characters of '.rodata'.
   1479	 * Somewhat confusingly, if internal map ELF section name is shorter
   1480	 * than 7 characters, e.g., '.bss', we still reserve 7 characters
   1481	 * for the suffix, even though we only have 4 actual characters, and
   1482	 * resulting map will be called 'my_objec.bss', not even using all 15
   1483	 * characters allowed by the kernel. Oh well, at least the truncated
   1484	 * object name is somewhat consistent in this case. But if the map
   1485	 * name is '.kconfig', we'll still have entirety of '.kconfig' added
   1486	 * (8 chars) and thus will be left with only first 7 characters of the
   1487	 * object name ('my_obje'). Happy guessing, user, that the final map
   1488	 * name will be "my_obje.kconfig".
   1489	 * Now, with libbpf starting to support arbitrarily named .rodata.*
   1490	 * and .data.* data sections, it's possible that ELF section name is
   1491	 * longer than allowed 15 chars, so we now need to be careful to take
   1492	 * only up to 15 first characters of ELF name, taking no BPF object
   1493	 * name characters at all. So '.rodata.abracadabra' will result in
   1494	 * '.rodata.abracad' kernel and user-visible name.
   1495	 * We need to keep this convoluted logic intact for .data, .bss and
   1496	 * .rodata maps, but for new custom .data.custom and .rodata.custom
   1497	 * maps we use their ELF names as is, not prepending bpf_object name
   1498	 * in front. We still need to truncate them to 15 characters for the
   1499	 * kernel. Full name can be recovered for such maps by using DATASEC
   1500	 * BTF type associated with such map's value type, though.
   1501	 */
   1502	if (sfx_len >= BPF_OBJ_NAME_LEN)
   1503		sfx_len = BPF_OBJ_NAME_LEN - 1;
   1504
   1505	/* if there are two or more dots in map name, it's a custom dot map */
   1506	if (strchr(real_name + 1, '.') != NULL)
   1507		pfx_len = 0;
   1508	else
   1509		pfx_len = min((size_t)BPF_OBJ_NAME_LEN - sfx_len - 1, strlen(obj->name));
   1510
   1511	snprintf(map_name, sizeof(map_name), "%.*s%.*s", pfx_len, obj->name,
   1512		 sfx_len, real_name);
   1513
   1514	/* sanitise map name to characters allowed by kernel */
   1515	for (p = map_name; *p && p < map_name + sizeof(map_name); p++)
   1516		if (!isalnum(*p) && *p != '_' && *p != '.')
   1517			*p = '_';
   1518
   1519	return strdup(map_name);
   1520}
   1521
   1522static int
   1523bpf_map_find_btf_info(struct bpf_object *obj, struct bpf_map *map);
   1524
   1525static int
   1526bpf_object__init_internal_map(struct bpf_object *obj, enum libbpf_map_type type,
   1527			      const char *real_name, int sec_idx, void *data, size_t data_sz)
   1528{
   1529	struct bpf_map_def *def;
   1530	struct bpf_map *map;
   1531	int err;
   1532
   1533	map = bpf_object__add_map(obj);
   1534	if (IS_ERR(map))
   1535		return PTR_ERR(map);
   1536
   1537	map->libbpf_type = type;
   1538	map->sec_idx = sec_idx;
   1539	map->sec_offset = 0;
   1540	map->real_name = strdup(real_name);
   1541	map->name = internal_map_name(obj, real_name);
   1542	if (!map->real_name || !map->name) {
   1543		zfree(&map->real_name);
   1544		zfree(&map->name);
   1545		return -ENOMEM;
   1546	}
   1547
   1548	def = &map->def;
   1549	def->type = BPF_MAP_TYPE_ARRAY;
   1550	def->key_size = sizeof(int);
   1551	def->value_size = data_sz;
   1552	def->max_entries = 1;
   1553	def->map_flags = type == LIBBPF_MAP_RODATA || type == LIBBPF_MAP_KCONFIG
   1554			 ? BPF_F_RDONLY_PROG : 0;
   1555	def->map_flags |= BPF_F_MMAPABLE;
   1556
   1557	pr_debug("map '%s' (global data): at sec_idx %d, offset %zu, flags %x.\n",
   1558		 map->name, map->sec_idx, map->sec_offset, def->map_flags);
   1559
   1560	map->mmaped = mmap(NULL, bpf_map_mmap_sz(map), PROT_READ | PROT_WRITE,
   1561			   MAP_SHARED | MAP_ANONYMOUS, -1, 0);
   1562	if (map->mmaped == MAP_FAILED) {
   1563		err = -errno;
   1564		map->mmaped = NULL;
   1565		pr_warn("failed to alloc map '%s' content buffer: %d\n",
   1566			map->name, err);
   1567		zfree(&map->real_name);
   1568		zfree(&map->name);
   1569		return err;
   1570	}
   1571
   1572	/* failures are fine because of maps like .rodata.str1.1 */
   1573	(void) bpf_map_find_btf_info(obj, map);
   1574
   1575	if (data)
   1576		memcpy(map->mmaped, data, data_sz);
   1577
   1578	pr_debug("map %td is \"%s\"\n", map - obj->maps, map->name);
   1579	return 0;
   1580}
   1581
   1582static int bpf_object__init_global_data_maps(struct bpf_object *obj)
   1583{
   1584	struct elf_sec_desc *sec_desc;
   1585	const char *sec_name;
   1586	int err = 0, sec_idx;
   1587
   1588	/*
   1589	 * Populate obj->maps with libbpf internal maps.
   1590	 */
   1591	for (sec_idx = 1; sec_idx < obj->efile.sec_cnt; sec_idx++) {
   1592		sec_desc = &obj->efile.secs[sec_idx];
   1593
   1594		switch (sec_desc->sec_type) {
   1595		case SEC_DATA:
   1596			sec_name = elf_sec_name(obj, elf_sec_by_idx(obj, sec_idx));
   1597			err = bpf_object__init_internal_map(obj, LIBBPF_MAP_DATA,
   1598							    sec_name, sec_idx,
   1599							    sec_desc->data->d_buf,
   1600							    sec_desc->data->d_size);
   1601			break;
   1602		case SEC_RODATA:
   1603			obj->has_rodata = true;
   1604			sec_name = elf_sec_name(obj, elf_sec_by_idx(obj, sec_idx));
   1605			err = bpf_object__init_internal_map(obj, LIBBPF_MAP_RODATA,
   1606							    sec_name, sec_idx,
   1607							    sec_desc->data->d_buf,
   1608							    sec_desc->data->d_size);
   1609			break;
   1610		case SEC_BSS:
   1611			sec_name = elf_sec_name(obj, elf_sec_by_idx(obj, sec_idx));
   1612			err = bpf_object__init_internal_map(obj, LIBBPF_MAP_BSS,
   1613							    sec_name, sec_idx,
   1614							    NULL,
   1615							    sec_desc->data->d_size);
   1616			break;
   1617		default:
   1618			/* skip */
   1619			break;
   1620		}
   1621		if (err)
   1622			return err;
   1623	}
   1624	return 0;
   1625}
   1626
   1627
   1628static struct extern_desc *find_extern_by_name(const struct bpf_object *obj,
   1629					       const void *name)
   1630{
   1631	int i;
   1632
   1633	for (i = 0; i < obj->nr_extern; i++) {
   1634		if (strcmp(obj->externs[i].name, name) == 0)
   1635			return &obj->externs[i];
   1636	}
   1637	return NULL;
   1638}
   1639
   1640static int set_kcfg_value_tri(struct extern_desc *ext, void *ext_val,
   1641			      char value)
   1642{
   1643	switch (ext->kcfg.type) {
   1644	case KCFG_BOOL:
   1645		if (value == 'm') {
   1646			pr_warn("extern (kcfg) %s=%c should be tristate or char\n",
   1647				ext->name, value);
   1648			return -EINVAL;
   1649		}
   1650		*(bool *)ext_val = value == 'y' ? true : false;
   1651		break;
   1652	case KCFG_TRISTATE:
   1653		if (value == 'y')
   1654			*(enum libbpf_tristate *)ext_val = TRI_YES;
   1655		else if (value == 'm')
   1656			*(enum libbpf_tristate *)ext_val = TRI_MODULE;
   1657		else /* value == 'n' */
   1658			*(enum libbpf_tristate *)ext_val = TRI_NO;
   1659		break;
   1660	case KCFG_CHAR:
   1661		*(char *)ext_val = value;
   1662		break;
   1663	case KCFG_UNKNOWN:
   1664	case KCFG_INT:
   1665	case KCFG_CHAR_ARR:
   1666	default:
   1667		pr_warn("extern (kcfg) %s=%c should be bool, tristate, or char\n",
   1668			ext->name, value);
   1669		return -EINVAL;
   1670	}
   1671	ext->is_set = true;
   1672	return 0;
   1673}
   1674
   1675static int set_kcfg_value_str(struct extern_desc *ext, char *ext_val,
   1676			      const char *value)
   1677{
   1678	size_t len;
   1679
   1680	if (ext->kcfg.type != KCFG_CHAR_ARR) {
   1681		pr_warn("extern (kcfg) %s=%s should be char array\n", ext->name, value);
   1682		return -EINVAL;
   1683	}
   1684
   1685	len = strlen(value);
   1686	if (value[len - 1] != '"') {
   1687		pr_warn("extern (kcfg) '%s': invalid string config '%s'\n",
   1688			ext->name, value);
   1689		return -EINVAL;
   1690	}
   1691
   1692	/* strip quotes */
   1693	len -= 2;
   1694	if (len >= ext->kcfg.sz) {
   1695		pr_warn("extern (kcfg) '%s': long string config %s of (%zu bytes) truncated to %d bytes\n",
   1696			ext->name, value, len, ext->kcfg.sz - 1);
   1697		len = ext->kcfg.sz - 1;
   1698	}
   1699	memcpy(ext_val, value + 1, len);
   1700	ext_val[len] = '\0';
   1701	ext->is_set = true;
   1702	return 0;
   1703}
   1704
   1705static int parse_u64(const char *value, __u64 *res)
   1706{
   1707	char *value_end;
   1708	int err;
   1709
   1710	errno = 0;
   1711	*res = strtoull(value, &value_end, 0);
   1712	if (errno) {
   1713		err = -errno;
   1714		pr_warn("failed to parse '%s' as integer: %d\n", value, err);
   1715		return err;
   1716	}
   1717	if (*value_end) {
   1718		pr_warn("failed to parse '%s' as integer completely\n", value);
   1719		return -EINVAL;
   1720	}
   1721	return 0;
   1722}
   1723
   1724static bool is_kcfg_value_in_range(const struct extern_desc *ext, __u64 v)
   1725{
   1726	int bit_sz = ext->kcfg.sz * 8;
   1727
   1728	if (ext->kcfg.sz == 8)
   1729		return true;
   1730
   1731	/* Validate that value stored in u64 fits in integer of `ext->sz`
   1732	 * bytes size without any loss of information. If the target integer
   1733	 * is signed, we rely on the following limits of integer type of
   1734	 * Y bits and subsequent transformation:
   1735	 *
   1736	 *     -2^(Y-1) <= X           <= 2^(Y-1) - 1
   1737	 *            0 <= X + 2^(Y-1) <= 2^Y - 1
   1738	 *            0 <= X + 2^(Y-1) <  2^Y
   1739	 *
   1740	 *  For unsigned target integer, check that all the (64 - Y) bits are
   1741	 *  zero.
   1742	 */
   1743	if (ext->kcfg.is_signed)
   1744		return v + (1ULL << (bit_sz - 1)) < (1ULL << bit_sz);
   1745	else
   1746		return (v >> bit_sz) == 0;
   1747}
   1748
   1749static int set_kcfg_value_num(struct extern_desc *ext, void *ext_val,
   1750			      __u64 value)
   1751{
   1752	if (ext->kcfg.type != KCFG_INT && ext->kcfg.type != KCFG_CHAR) {
   1753		pr_warn("extern (kcfg) %s=%llu should be integer\n",
   1754			ext->name, (unsigned long long)value);
   1755		return -EINVAL;
   1756	}
   1757	if (!is_kcfg_value_in_range(ext, value)) {
   1758		pr_warn("extern (kcfg) %s=%llu value doesn't fit in %d bytes\n",
   1759			ext->name, (unsigned long long)value, ext->kcfg.sz);
   1760		return -ERANGE;
   1761	}
   1762	switch (ext->kcfg.sz) {
   1763		case 1: *(__u8 *)ext_val = value; break;
   1764		case 2: *(__u16 *)ext_val = value; break;
   1765		case 4: *(__u32 *)ext_val = value; break;
   1766		case 8: *(__u64 *)ext_val = value; break;
   1767		default:
   1768			return -EINVAL;
   1769	}
   1770	ext->is_set = true;
   1771	return 0;
   1772}
   1773
   1774static int bpf_object__process_kconfig_line(struct bpf_object *obj,
   1775					    char *buf, void *data)
   1776{
   1777	struct extern_desc *ext;
   1778	char *sep, *value;
   1779	int len, err = 0;
   1780	void *ext_val;
   1781	__u64 num;
   1782
   1783	if (!str_has_pfx(buf, "CONFIG_"))
   1784		return 0;
   1785
   1786	sep = strchr(buf, '=');
   1787	if (!sep) {
   1788		pr_warn("failed to parse '%s': no separator\n", buf);
   1789		return -EINVAL;
   1790	}
   1791
   1792	/* Trim ending '\n' */
   1793	len = strlen(buf);
   1794	if (buf[len - 1] == '\n')
   1795		buf[len - 1] = '\0';
   1796	/* Split on '=' and ensure that a value is present. */
   1797	*sep = '\0';
   1798	if (!sep[1]) {
   1799		*sep = '=';
   1800		pr_warn("failed to parse '%s': no value\n", buf);
   1801		return -EINVAL;
   1802	}
   1803
   1804	ext = find_extern_by_name(obj, buf);
   1805	if (!ext || ext->is_set)
   1806		return 0;
   1807
   1808	ext_val = data + ext->kcfg.data_off;
   1809	value = sep + 1;
   1810
   1811	switch (*value) {
   1812	case 'y': case 'n': case 'm':
   1813		err = set_kcfg_value_tri(ext, ext_val, *value);
   1814		break;
   1815	case '"':
   1816		err = set_kcfg_value_str(ext, ext_val, value);
   1817		break;
   1818	default:
   1819		/* assume integer */
   1820		err = parse_u64(value, &num);
   1821		if (err) {
   1822			pr_warn("extern (kcfg) %s=%s should be integer\n",
   1823				ext->name, value);
   1824			return err;
   1825		}
   1826		err = set_kcfg_value_num(ext, ext_val, num);
   1827		break;
   1828	}
   1829	if (err)
   1830		return err;
   1831	pr_debug("extern (kcfg) %s=%s\n", ext->name, value);
   1832	return 0;
   1833}
   1834
   1835static int bpf_object__read_kconfig_file(struct bpf_object *obj, void *data)
   1836{
   1837	char buf[PATH_MAX];
   1838	struct utsname uts;
   1839	int len, err = 0;
   1840	gzFile file;
   1841
   1842	uname(&uts);
   1843	len = snprintf(buf, PATH_MAX, "/boot/config-%s", uts.release);
   1844	if (len < 0)
   1845		return -EINVAL;
   1846	else if (len >= PATH_MAX)
   1847		return -ENAMETOOLONG;
   1848
   1849	/* gzopen also accepts uncompressed files. */
   1850	file = gzopen(buf, "r");
   1851	if (!file)
   1852		file = gzopen("/proc/config.gz", "r");
   1853
   1854	if (!file) {
   1855		pr_warn("failed to open system Kconfig\n");
   1856		return -ENOENT;
   1857	}
   1858
   1859	while (gzgets(file, buf, sizeof(buf))) {
   1860		err = bpf_object__process_kconfig_line(obj, buf, data);
   1861		if (err) {
   1862			pr_warn("error parsing system Kconfig line '%s': %d\n",
   1863				buf, err);
   1864			goto out;
   1865		}
   1866	}
   1867
   1868out:
   1869	gzclose(file);
   1870	return err;
   1871}
   1872
   1873static int bpf_object__read_kconfig_mem(struct bpf_object *obj,
   1874					const char *config, void *data)
   1875{
   1876	char buf[PATH_MAX];
   1877	int err = 0;
   1878	FILE *file;
   1879
   1880	file = fmemopen((void *)config, strlen(config), "r");
   1881	if (!file) {
   1882		err = -errno;
   1883		pr_warn("failed to open in-memory Kconfig: %d\n", err);
   1884		return err;
   1885	}
   1886
   1887	while (fgets(buf, sizeof(buf), file)) {
   1888		err = bpf_object__process_kconfig_line(obj, buf, data);
   1889		if (err) {
   1890			pr_warn("error parsing in-memory Kconfig line '%s': %d\n",
   1891				buf, err);
   1892			break;
   1893		}
   1894	}
   1895
   1896	fclose(file);
   1897	return err;
   1898}
   1899
   1900static int bpf_object__init_kconfig_map(struct bpf_object *obj)
   1901{
   1902	struct extern_desc *last_ext = NULL, *ext;
   1903	size_t map_sz;
   1904	int i, err;
   1905
   1906	for (i = 0; i < obj->nr_extern; i++) {
   1907		ext = &obj->externs[i];
   1908		if (ext->type == EXT_KCFG)
   1909			last_ext = ext;
   1910	}
   1911
   1912	if (!last_ext)
   1913		return 0;
   1914
   1915	map_sz = last_ext->kcfg.data_off + last_ext->kcfg.sz;
   1916	err = bpf_object__init_internal_map(obj, LIBBPF_MAP_KCONFIG,
   1917					    ".kconfig", obj->efile.symbols_shndx,
   1918					    NULL, map_sz);
   1919	if (err)
   1920		return err;
   1921
   1922	obj->kconfig_map_idx = obj->nr_maps - 1;
   1923
   1924	return 0;
   1925}
   1926
   1927static int bpf_object__init_user_maps(struct bpf_object *obj, bool strict)
   1928{
   1929	Elf_Data *symbols = obj->efile.symbols;
   1930	int i, map_def_sz = 0, nr_maps = 0, nr_syms;
   1931	Elf_Data *data = NULL;
   1932	Elf_Scn *scn;
   1933
   1934	if (obj->efile.maps_shndx < 0)
   1935		return 0;
   1936
   1937	if (libbpf_mode & LIBBPF_STRICT_MAP_DEFINITIONS) {
   1938		pr_warn("legacy map definitions in SEC(\"maps\") are not supported\n");
   1939		return -EOPNOTSUPP;
   1940	}
   1941
   1942	if (!symbols)
   1943		return -EINVAL;
   1944
   1945	scn = elf_sec_by_idx(obj, obj->efile.maps_shndx);
   1946	data = elf_sec_data(obj, scn);
   1947	if (!scn || !data) {
   1948		pr_warn("elf: failed to get legacy map definitions for %s\n",
   1949			obj->path);
   1950		return -EINVAL;
   1951	}
   1952
   1953	/*
   1954	 * Count number of maps. Each map has a name.
   1955	 * Array of maps is not supported: only the first element is
   1956	 * considered.
   1957	 *
   1958	 * TODO: Detect array of map and report error.
   1959	 */
   1960	nr_syms = symbols->d_size / sizeof(Elf64_Sym);
   1961	for (i = 0; i < nr_syms; i++) {
   1962		Elf64_Sym *sym = elf_sym_by_idx(obj, i);
   1963
   1964		if (sym->st_shndx != obj->efile.maps_shndx)
   1965			continue;
   1966		if (ELF64_ST_TYPE(sym->st_info) == STT_SECTION)
   1967			continue;
   1968		nr_maps++;
   1969	}
   1970	/* Assume equally sized map definitions */
   1971	pr_debug("elf: found %d legacy map definitions (%zd bytes) in %s\n",
   1972		 nr_maps, data->d_size, obj->path);
   1973
   1974	if (!data->d_size || nr_maps == 0 || (data->d_size % nr_maps) != 0) {
   1975		pr_warn("elf: unable to determine legacy map definition size in %s\n",
   1976			obj->path);
   1977		return -EINVAL;
   1978	}
   1979	map_def_sz = data->d_size / nr_maps;
   1980
   1981	/* Fill obj->maps using data in "maps" section.  */
   1982	for (i = 0; i < nr_syms; i++) {
   1983		Elf64_Sym *sym = elf_sym_by_idx(obj, i);
   1984		const char *map_name;
   1985		struct bpf_map_def *def;
   1986		struct bpf_map *map;
   1987
   1988		if (sym->st_shndx != obj->efile.maps_shndx)
   1989			continue;
   1990		if (ELF64_ST_TYPE(sym->st_info) == STT_SECTION)
   1991			continue;
   1992
   1993		map = bpf_object__add_map(obj);
   1994		if (IS_ERR(map))
   1995			return PTR_ERR(map);
   1996
   1997		map_name = elf_sym_str(obj, sym->st_name);
   1998		if (!map_name) {
   1999			pr_warn("failed to get map #%d name sym string for obj %s\n",
   2000				i, obj->path);
   2001			return -LIBBPF_ERRNO__FORMAT;
   2002		}
   2003
   2004		pr_warn("map '%s' (legacy): legacy map definitions are deprecated, use BTF-defined maps instead\n", map_name);
   2005
   2006		if (ELF64_ST_BIND(sym->st_info) == STB_LOCAL) {
   2007			pr_warn("map '%s' (legacy): static maps are not supported\n", map_name);
   2008			return -ENOTSUP;
   2009		}
   2010
   2011		map->libbpf_type = LIBBPF_MAP_UNSPEC;
   2012		map->sec_idx = sym->st_shndx;
   2013		map->sec_offset = sym->st_value;
   2014		pr_debug("map '%s' (legacy): at sec_idx %d, offset %zu.\n",
   2015			 map_name, map->sec_idx, map->sec_offset);
   2016		if (sym->st_value + map_def_sz > data->d_size) {
   2017			pr_warn("corrupted maps section in %s: last map \"%s\" too small\n",
   2018				obj->path, map_name);
   2019			return -EINVAL;
   2020		}
   2021
   2022		map->name = strdup(map_name);
   2023		if (!map->name) {
   2024			pr_warn("map '%s': failed to alloc map name\n", map_name);
   2025			return -ENOMEM;
   2026		}
   2027		pr_debug("map %d is \"%s\"\n", i, map->name);
   2028		def = (struct bpf_map_def *)(data->d_buf + sym->st_value);
   2029		/*
   2030		 * If the definition of the map in the object file fits in
   2031		 * bpf_map_def, copy it.  Any extra fields in our version
   2032		 * of bpf_map_def will default to zero as a result of the
   2033		 * calloc above.
   2034		 */
   2035		if (map_def_sz <= sizeof(struct bpf_map_def)) {
   2036			memcpy(&map->def, def, map_def_sz);
   2037		} else {
   2038			/*
   2039			 * Here the map structure being read is bigger than what
   2040			 * we expect, truncate if the excess bits are all zero.
   2041			 * If they are not zero, reject this map as
   2042			 * incompatible.
   2043			 */
   2044			char *b;
   2045
   2046			for (b = ((char *)def) + sizeof(struct bpf_map_def);
   2047			     b < ((char *)def) + map_def_sz; b++) {
   2048				if (*b != 0) {
   2049					pr_warn("maps section in %s: \"%s\" has unrecognized, non-zero options\n",
   2050						obj->path, map_name);
   2051					if (strict)
   2052						return -EINVAL;
   2053				}
   2054			}
   2055			memcpy(&map->def, def, sizeof(struct bpf_map_def));
   2056		}
   2057
   2058		/* btf info may not exist but fill it in if it does exist */
   2059		(void) bpf_map_find_btf_info(obj, map);
   2060	}
   2061	return 0;
   2062}
   2063
   2064const struct btf_type *
   2065skip_mods_and_typedefs(const struct btf *btf, __u32 id, __u32 *res_id)
   2066{
   2067	const struct btf_type *t = btf__type_by_id(btf, id);
   2068
   2069	if (res_id)
   2070		*res_id = id;
   2071
   2072	while (btf_is_mod(t) || btf_is_typedef(t)) {
   2073		if (res_id)
   2074			*res_id = t->type;
   2075		t = btf__type_by_id(btf, t->type);
   2076	}
   2077
   2078	return t;
   2079}
   2080
   2081static const struct btf_type *
   2082resolve_func_ptr(const struct btf *btf, __u32 id, __u32 *res_id)
   2083{
   2084	const struct btf_type *t;
   2085
   2086	t = skip_mods_and_typedefs(btf, id, NULL);
   2087	if (!btf_is_ptr(t))
   2088		return NULL;
   2089
   2090	t = skip_mods_and_typedefs(btf, t->type, res_id);
   2091
   2092	return btf_is_func_proto(t) ? t : NULL;
   2093}
   2094
   2095static const char *__btf_kind_str(__u16 kind)
   2096{
   2097	switch (kind) {
   2098	case BTF_KIND_UNKN: return "void";
   2099	case BTF_KIND_INT: return "int";
   2100	case BTF_KIND_PTR: return "ptr";
   2101	case BTF_KIND_ARRAY: return "array";
   2102	case BTF_KIND_STRUCT: return "struct";
   2103	case BTF_KIND_UNION: return "union";
   2104	case BTF_KIND_ENUM: return "enum";
   2105	case BTF_KIND_FWD: return "fwd";
   2106	case BTF_KIND_TYPEDEF: return "typedef";
   2107	case BTF_KIND_VOLATILE: return "volatile";
   2108	case BTF_KIND_CONST: return "const";
   2109	case BTF_KIND_RESTRICT: return "restrict";
   2110	case BTF_KIND_FUNC: return "func";
   2111	case BTF_KIND_FUNC_PROTO: return "func_proto";
   2112	case BTF_KIND_VAR: return "var";
   2113	case BTF_KIND_DATASEC: return "datasec";
   2114	case BTF_KIND_FLOAT: return "float";
   2115	case BTF_KIND_DECL_TAG: return "decl_tag";
   2116	case BTF_KIND_TYPE_TAG: return "type_tag";
   2117	default: return "unknown";
   2118	}
   2119}
   2120
   2121const char *btf_kind_str(const struct btf_type *t)
   2122{
   2123	return __btf_kind_str(btf_kind(t));
   2124}
   2125
   2126/*
   2127 * Fetch integer attribute of BTF map definition. Such attributes are
   2128 * represented using a pointer to an array, in which dimensionality of array
   2129 * encodes specified integer value. E.g., int (*type)[BPF_MAP_TYPE_ARRAY];
   2130 * encodes `type => BPF_MAP_TYPE_ARRAY` key/value pair completely using BTF
   2131 * type definition, while using only sizeof(void *) space in ELF data section.
   2132 */
   2133static bool get_map_field_int(const char *map_name, const struct btf *btf,
   2134			      const struct btf_member *m, __u32 *res)
   2135{
   2136	const struct btf_type *t = skip_mods_and_typedefs(btf, m->type, NULL);
   2137	const char *name = btf__name_by_offset(btf, m->name_off);
   2138	const struct btf_array *arr_info;
   2139	const struct btf_type *arr_t;
   2140
   2141	if (!btf_is_ptr(t)) {
   2142		pr_warn("map '%s': attr '%s': expected PTR, got %s.\n",
   2143			map_name, name, btf_kind_str(t));
   2144		return false;
   2145	}
   2146
   2147	arr_t = btf__type_by_id(btf, t->type);
   2148	if (!arr_t) {
   2149		pr_warn("map '%s': attr '%s': type [%u] not found.\n",
   2150			map_name, name, t->type);
   2151		return false;
   2152	}
   2153	if (!btf_is_array(arr_t)) {
   2154		pr_warn("map '%s': attr '%s': expected ARRAY, got %s.\n",
   2155			map_name, name, btf_kind_str(arr_t));
   2156		return false;
   2157	}
   2158	arr_info = btf_array(arr_t);
   2159	*res = arr_info->nelems;
   2160	return true;
   2161}
   2162
   2163static int build_map_pin_path(struct bpf_map *map, const char *path)
   2164{
   2165	char buf[PATH_MAX];
   2166	int len;
   2167
   2168	if (!path)
   2169		path = "/sys/fs/bpf";
   2170
   2171	len = snprintf(buf, PATH_MAX, "%s/%s", path, bpf_map__name(map));
   2172	if (len < 0)
   2173		return -EINVAL;
   2174	else if (len >= PATH_MAX)
   2175		return -ENAMETOOLONG;
   2176
   2177	return bpf_map__set_pin_path(map, buf);
   2178}
   2179
   2180int parse_btf_map_def(const char *map_name, struct btf *btf,
   2181		      const struct btf_type *def_t, bool strict,
   2182		      struct btf_map_def *map_def, struct btf_map_def *inner_def)
   2183{
   2184	const struct btf_type *t;
   2185	const struct btf_member *m;
   2186	bool is_inner = inner_def == NULL;
   2187	int vlen, i;
   2188
   2189	vlen = btf_vlen(def_t);
   2190	m = btf_members(def_t);
   2191	for (i = 0; i < vlen; i++, m++) {
   2192		const char *name = btf__name_by_offset(btf, m->name_off);
   2193
   2194		if (!name) {
   2195			pr_warn("map '%s': invalid field #%d.\n", map_name, i);
   2196			return -EINVAL;
   2197		}
   2198		if (strcmp(name, "type") == 0) {
   2199			if (!get_map_field_int(map_name, btf, m, &map_def->map_type))
   2200				return -EINVAL;
   2201			map_def->parts |= MAP_DEF_MAP_TYPE;
   2202		} else if (strcmp(name, "max_entries") == 0) {
   2203			if (!get_map_field_int(map_name, btf, m, &map_def->max_entries))
   2204				return -EINVAL;
   2205			map_def->parts |= MAP_DEF_MAX_ENTRIES;
   2206		} else if (strcmp(name, "map_flags") == 0) {
   2207			if (!get_map_field_int(map_name, btf, m, &map_def->map_flags))
   2208				return -EINVAL;
   2209			map_def->parts |= MAP_DEF_MAP_FLAGS;
   2210		} else if (strcmp(name, "numa_node") == 0) {
   2211			if (!get_map_field_int(map_name, btf, m, &map_def->numa_node))
   2212				return -EINVAL;
   2213			map_def->parts |= MAP_DEF_NUMA_NODE;
   2214		} else if (strcmp(name, "key_size") == 0) {
   2215			__u32 sz;
   2216
   2217			if (!get_map_field_int(map_name, btf, m, &sz))
   2218				return -EINVAL;
   2219			if (map_def->key_size && map_def->key_size != sz) {
   2220				pr_warn("map '%s': conflicting key size %u != %u.\n",
   2221					map_name, map_def->key_size, sz);
   2222				return -EINVAL;
   2223			}
   2224			map_def->key_size = sz;
   2225			map_def->parts |= MAP_DEF_KEY_SIZE;
   2226		} else if (strcmp(name, "key") == 0) {
   2227			__s64 sz;
   2228
   2229			t = btf__type_by_id(btf, m->type);
   2230			if (!t) {
   2231				pr_warn("map '%s': key type [%d] not found.\n",
   2232					map_name, m->type);
   2233				return -EINVAL;
   2234			}
   2235			if (!btf_is_ptr(t)) {
   2236				pr_warn("map '%s': key spec is not PTR: %s.\n",
   2237					map_name, btf_kind_str(t));
   2238				return -EINVAL;
   2239			}
   2240			sz = btf__resolve_size(btf, t->type);
   2241			if (sz < 0) {
   2242				pr_warn("map '%s': can't determine key size for type [%u]: %zd.\n",
   2243					map_name, t->type, (ssize_t)sz);
   2244				return sz;
   2245			}
   2246			if (map_def->key_size && map_def->key_size != sz) {
   2247				pr_warn("map '%s': conflicting key size %u != %zd.\n",
   2248					map_name, map_def->key_size, (ssize_t)sz);
   2249				return -EINVAL;
   2250			}
   2251			map_def->key_size = sz;
   2252			map_def->key_type_id = t->type;
   2253			map_def->parts |= MAP_DEF_KEY_SIZE | MAP_DEF_KEY_TYPE;
   2254		} else if (strcmp(name, "value_size") == 0) {
   2255			__u32 sz;
   2256
   2257			if (!get_map_field_int(map_name, btf, m, &sz))
   2258				return -EINVAL;
   2259			if (map_def->value_size && map_def->value_size != sz) {
   2260				pr_warn("map '%s': conflicting value size %u != %u.\n",
   2261					map_name, map_def->value_size, sz);
   2262				return -EINVAL;
   2263			}
   2264			map_def->value_size = sz;
   2265			map_def->parts |= MAP_DEF_VALUE_SIZE;
   2266		} else if (strcmp(name, "value") == 0) {
   2267			__s64 sz;
   2268
   2269			t = btf__type_by_id(btf, m->type);
   2270			if (!t) {
   2271				pr_warn("map '%s': value type [%d] not found.\n",
   2272					map_name, m->type);
   2273				return -EINVAL;
   2274			}
   2275			if (!btf_is_ptr(t)) {
   2276				pr_warn("map '%s': value spec is not PTR: %s.\n",
   2277					map_name, btf_kind_str(t));
   2278				return -EINVAL;
   2279			}
   2280			sz = btf__resolve_size(btf, t->type);
   2281			if (sz < 0) {
   2282				pr_warn("map '%s': can't determine value size for type [%u]: %zd.\n",
   2283					map_name, t->type, (ssize_t)sz);
   2284				return sz;
   2285			}
   2286			if (map_def->value_size && map_def->value_size != sz) {
   2287				pr_warn("map '%s': conflicting value size %u != %zd.\n",
   2288					map_name, map_def->value_size, (ssize_t)sz);
   2289				return -EINVAL;
   2290			}
   2291			map_def->value_size = sz;
   2292			map_def->value_type_id = t->type;
   2293			map_def->parts |= MAP_DEF_VALUE_SIZE | MAP_DEF_VALUE_TYPE;
   2294		}
   2295		else if (strcmp(name, "values") == 0) {
   2296			bool is_map_in_map = bpf_map_type__is_map_in_map(map_def->map_type);
   2297			bool is_prog_array = map_def->map_type == BPF_MAP_TYPE_PROG_ARRAY;
   2298			const char *desc = is_map_in_map ? "map-in-map inner" : "prog-array value";
   2299			char inner_map_name[128];
   2300			int err;
   2301
   2302			if (is_inner) {
   2303				pr_warn("map '%s': multi-level inner maps not supported.\n",
   2304					map_name);
   2305				return -ENOTSUP;
   2306			}
   2307			if (i != vlen - 1) {
   2308				pr_warn("map '%s': '%s' member should be last.\n",
   2309					map_name, name);
   2310				return -EINVAL;
   2311			}
   2312			if (!is_map_in_map && !is_prog_array) {
   2313				pr_warn("map '%s': should be map-in-map or prog-array.\n",
   2314					map_name);
   2315				return -ENOTSUP;
   2316			}
   2317			if (map_def->value_size && map_def->value_size != 4) {
   2318				pr_warn("map '%s': conflicting value size %u != 4.\n",
   2319					map_name, map_def->value_size);
   2320				return -EINVAL;
   2321			}
   2322			map_def->value_size = 4;
   2323			t = btf__type_by_id(btf, m->type);
   2324			if (!t) {
   2325				pr_warn("map '%s': %s type [%d] not found.\n",
   2326					map_name, desc, m->type);
   2327				return -EINVAL;
   2328			}
   2329			if (!btf_is_array(t) || btf_array(t)->nelems) {
   2330				pr_warn("map '%s': %s spec is not a zero-sized array.\n",
   2331					map_name, desc);
   2332				return -EINVAL;
   2333			}
   2334			t = skip_mods_and_typedefs(btf, btf_array(t)->type, NULL);
   2335			if (!btf_is_ptr(t)) {
   2336				pr_warn("map '%s': %s def is of unexpected kind %s.\n",
   2337					map_name, desc, btf_kind_str(t));
   2338				return -EINVAL;
   2339			}
   2340			t = skip_mods_and_typedefs(btf, t->type, NULL);
   2341			if (is_prog_array) {
   2342				if (!btf_is_func_proto(t)) {
   2343					pr_warn("map '%s': prog-array value def is of unexpected kind %s.\n",
   2344						map_name, btf_kind_str(t));
   2345					return -EINVAL;
   2346				}
   2347				continue;
   2348			}
   2349			if (!btf_is_struct(t)) {
   2350				pr_warn("map '%s': map-in-map inner def is of unexpected kind %s.\n",
   2351					map_name, btf_kind_str(t));
   2352				return -EINVAL;
   2353			}
   2354
   2355			snprintf(inner_map_name, sizeof(inner_map_name), "%s.inner", map_name);
   2356			err = parse_btf_map_def(inner_map_name, btf, t, strict, inner_def, NULL);
   2357			if (err)
   2358				return err;
   2359
   2360			map_def->parts |= MAP_DEF_INNER_MAP;
   2361		} else if (strcmp(name, "pinning") == 0) {
   2362			__u32 val;
   2363
   2364			if (is_inner) {
   2365				pr_warn("map '%s': inner def can't be pinned.\n", map_name);
   2366				return -EINVAL;
   2367			}
   2368			if (!get_map_field_int(map_name, btf, m, &val))
   2369				return -EINVAL;
   2370			if (val != LIBBPF_PIN_NONE && val != LIBBPF_PIN_BY_NAME) {
   2371				pr_warn("map '%s': invalid pinning value %u.\n",
   2372					map_name, val);
   2373				return -EINVAL;
   2374			}
   2375			map_def->pinning = val;
   2376			map_def->parts |= MAP_DEF_PINNING;
   2377		} else if (strcmp(name, "map_extra") == 0) {
   2378			__u32 map_extra;
   2379
   2380			if (!get_map_field_int(map_name, btf, m, &map_extra))
   2381				return -EINVAL;
   2382			map_def->map_extra = map_extra;
   2383			map_def->parts |= MAP_DEF_MAP_EXTRA;
   2384		} else {
   2385			if (strict) {
   2386				pr_warn("map '%s': unknown field '%s'.\n", map_name, name);
   2387				return -ENOTSUP;
   2388			}
   2389			pr_debug("map '%s': ignoring unknown field '%s'.\n", map_name, name);
   2390		}
   2391	}
   2392
   2393	if (map_def->map_type == BPF_MAP_TYPE_UNSPEC) {
   2394		pr_warn("map '%s': map type isn't specified.\n", map_name);
   2395		return -EINVAL;
   2396	}
   2397
   2398	return 0;
   2399}
   2400
   2401static void fill_map_from_def(struct bpf_map *map, const struct btf_map_def *def)
   2402{
   2403	map->def.type = def->map_type;
   2404	map->def.key_size = def->key_size;
   2405	map->def.value_size = def->value_size;
   2406	map->def.max_entries = def->max_entries;
   2407	map->def.map_flags = def->map_flags;
   2408	map->map_extra = def->map_extra;
   2409
   2410	map->numa_node = def->numa_node;
   2411	map->btf_key_type_id = def->key_type_id;
   2412	map->btf_value_type_id = def->value_type_id;
   2413
   2414	if (def->parts & MAP_DEF_MAP_TYPE)
   2415		pr_debug("map '%s': found type = %u.\n", map->name, def->map_type);
   2416
   2417	if (def->parts & MAP_DEF_KEY_TYPE)
   2418		pr_debug("map '%s': found key [%u], sz = %u.\n",
   2419			 map->name, def->key_type_id, def->key_size);
   2420	else if (def->parts & MAP_DEF_KEY_SIZE)
   2421		pr_debug("map '%s': found key_size = %u.\n", map->name, def->key_size);
   2422
   2423	if (def->parts & MAP_DEF_VALUE_TYPE)
   2424		pr_debug("map '%s': found value [%u], sz = %u.\n",
   2425			 map->name, def->value_type_id, def->value_size);
   2426	else if (def->parts & MAP_DEF_VALUE_SIZE)
   2427		pr_debug("map '%s': found value_size = %u.\n", map->name, def->value_size);
   2428
   2429	if (def->parts & MAP_DEF_MAX_ENTRIES)
   2430		pr_debug("map '%s': found max_entries = %u.\n", map->name, def->max_entries);
   2431	if (def->parts & MAP_DEF_MAP_FLAGS)
   2432		pr_debug("map '%s': found map_flags = 0x%x.\n", map->name, def->map_flags);
   2433	if (def->parts & MAP_DEF_MAP_EXTRA)
   2434		pr_debug("map '%s': found map_extra = 0x%llx.\n", map->name,
   2435			 (unsigned long long)def->map_extra);
   2436	if (def->parts & MAP_DEF_PINNING)
   2437		pr_debug("map '%s': found pinning = %u.\n", map->name, def->pinning);
   2438	if (def->parts & MAP_DEF_NUMA_NODE)
   2439		pr_debug("map '%s': found numa_node = %u.\n", map->name, def->numa_node);
   2440
   2441	if (def->parts & MAP_DEF_INNER_MAP)
   2442		pr_debug("map '%s': found inner map definition.\n", map->name);
   2443}
   2444
   2445static const char *btf_var_linkage_str(__u32 linkage)
   2446{
   2447	switch (linkage) {
   2448	case BTF_VAR_STATIC: return "static";
   2449	case BTF_VAR_GLOBAL_ALLOCATED: return "global";
   2450	case BTF_VAR_GLOBAL_EXTERN: return "extern";
   2451	default: return "unknown";
   2452	}
   2453}
   2454
   2455static int bpf_object__init_user_btf_map(struct bpf_object *obj,
   2456					 const struct btf_type *sec,
   2457					 int var_idx, int sec_idx,
   2458					 const Elf_Data *data, bool strict,
   2459					 const char *pin_root_path)
   2460{
   2461	struct btf_map_def map_def = {}, inner_def = {};
   2462	const struct btf_type *var, *def;
   2463	const struct btf_var_secinfo *vi;
   2464	const struct btf_var *var_extra;
   2465	const char *map_name;
   2466	struct bpf_map *map;
   2467	int err;
   2468
   2469	vi = btf_var_secinfos(sec) + var_idx;
   2470	var = btf__type_by_id(obj->btf, vi->type);
   2471	var_extra = btf_var(var);
   2472	map_name = btf__name_by_offset(obj->btf, var->name_off);
   2473
   2474	if (map_name == NULL || map_name[0] == '\0') {
   2475		pr_warn("map #%d: empty name.\n", var_idx);
   2476		return -EINVAL;
   2477	}
   2478	if ((__u64)vi->offset + vi->size > data->d_size) {
   2479		pr_warn("map '%s' BTF data is corrupted.\n", map_name);
   2480		return -EINVAL;
   2481	}
   2482	if (!btf_is_var(var)) {
   2483		pr_warn("map '%s': unexpected var kind %s.\n",
   2484			map_name, btf_kind_str(var));
   2485		return -EINVAL;
   2486	}
   2487	if (var_extra->linkage != BTF_VAR_GLOBAL_ALLOCATED) {
   2488		pr_warn("map '%s': unsupported map linkage %s.\n",
   2489			map_name, btf_var_linkage_str(var_extra->linkage));
   2490		return -EOPNOTSUPP;
   2491	}
   2492
   2493	def = skip_mods_and_typedefs(obj->btf, var->type, NULL);
   2494	if (!btf_is_struct(def)) {
   2495		pr_warn("map '%s': unexpected def kind %s.\n",
   2496			map_name, btf_kind_str(var));
   2497		return -EINVAL;
   2498	}
   2499	if (def->size > vi->size) {
   2500		pr_warn("map '%s': invalid def size.\n", map_name);
   2501		return -EINVAL;
   2502	}
   2503
   2504	map = bpf_object__add_map(obj);
   2505	if (IS_ERR(map))
   2506		return PTR_ERR(map);
   2507	map->name = strdup(map_name);
   2508	if (!map->name) {
   2509		pr_warn("map '%s': failed to alloc map name.\n", map_name);
   2510		return -ENOMEM;
   2511	}
   2512	map->libbpf_type = LIBBPF_MAP_UNSPEC;
   2513	map->def.type = BPF_MAP_TYPE_UNSPEC;
   2514	map->sec_idx = sec_idx;
   2515	map->sec_offset = vi->offset;
   2516	map->btf_var_idx = var_idx;
   2517	pr_debug("map '%s': at sec_idx %d, offset %zu.\n",
   2518		 map_name, map->sec_idx, map->sec_offset);
   2519
   2520	err = parse_btf_map_def(map->name, obj->btf, def, strict, &map_def, &inner_def);
   2521	if (err)
   2522		return err;
   2523
   2524	fill_map_from_def(map, &map_def);
   2525
   2526	if (map_def.pinning == LIBBPF_PIN_BY_NAME) {
   2527		err = build_map_pin_path(map, pin_root_path);
   2528		if (err) {
   2529			pr_warn("map '%s': couldn't build pin path.\n", map->name);
   2530			return err;
   2531		}
   2532	}
   2533
   2534	if (map_def.parts & MAP_DEF_INNER_MAP) {
   2535		map->inner_map = calloc(1, sizeof(*map->inner_map));
   2536		if (!map->inner_map)
   2537			return -ENOMEM;
   2538		map->inner_map->fd = -1;
   2539		map->inner_map->sec_idx = sec_idx;
   2540		map->inner_map->name = malloc(strlen(map_name) + sizeof(".inner") + 1);
   2541		if (!map->inner_map->name)
   2542			return -ENOMEM;
   2543		sprintf(map->inner_map->name, "%s.inner", map_name);
   2544
   2545		fill_map_from_def(map->inner_map, &inner_def);
   2546	}
   2547
   2548	err = bpf_map_find_btf_info(obj, map);
   2549	if (err)
   2550		return err;
   2551
   2552	return 0;
   2553}
   2554
   2555static int bpf_object__init_user_btf_maps(struct bpf_object *obj, bool strict,
   2556					  const char *pin_root_path)
   2557{
   2558	const struct btf_type *sec = NULL;
   2559	int nr_types, i, vlen, err;
   2560	const struct btf_type *t;
   2561	const char *name;
   2562	Elf_Data *data;
   2563	Elf_Scn *scn;
   2564
   2565	if (obj->efile.btf_maps_shndx < 0)
   2566		return 0;
   2567
   2568	scn = elf_sec_by_idx(obj, obj->efile.btf_maps_shndx);
   2569	data = elf_sec_data(obj, scn);
   2570	if (!scn || !data) {
   2571		pr_warn("elf: failed to get %s map definitions for %s\n",
   2572			MAPS_ELF_SEC, obj->path);
   2573		return -EINVAL;
   2574	}
   2575
   2576	nr_types = btf__type_cnt(obj->btf);
   2577	for (i = 1; i < nr_types; i++) {
   2578		t = btf__type_by_id(obj->btf, i);
   2579		if (!btf_is_datasec(t))
   2580			continue;
   2581		name = btf__name_by_offset(obj->btf, t->name_off);
   2582		if (strcmp(name, MAPS_ELF_SEC) == 0) {
   2583			sec = t;
   2584			obj->efile.btf_maps_sec_btf_id = i;
   2585			break;
   2586		}
   2587	}
   2588
   2589	if (!sec) {
   2590		pr_warn("DATASEC '%s' not found.\n", MAPS_ELF_SEC);
   2591		return -ENOENT;
   2592	}
   2593
   2594	vlen = btf_vlen(sec);
   2595	for (i = 0; i < vlen; i++) {
   2596		err = bpf_object__init_user_btf_map(obj, sec, i,
   2597						    obj->efile.btf_maps_shndx,
   2598						    data, strict,
   2599						    pin_root_path);
   2600		if (err)
   2601			return err;
   2602	}
   2603
   2604	return 0;
   2605}
   2606
   2607static int bpf_object__init_maps(struct bpf_object *obj,
   2608				 const struct bpf_object_open_opts *opts)
   2609{
   2610	const char *pin_root_path;
   2611	bool strict;
   2612	int err;
   2613
   2614	strict = !OPTS_GET(opts, relaxed_maps, false);
   2615	pin_root_path = OPTS_GET(opts, pin_root_path, NULL);
   2616
   2617	err = bpf_object__init_user_maps(obj, strict);
   2618	err = err ?: bpf_object__init_user_btf_maps(obj, strict, pin_root_path);
   2619	err = err ?: bpf_object__init_global_data_maps(obj);
   2620	err = err ?: bpf_object__init_kconfig_map(obj);
   2621	err = err ?: bpf_object__init_struct_ops_maps(obj);
   2622
   2623	return err;
   2624}
   2625
   2626static bool section_have_execinstr(struct bpf_object *obj, int idx)
   2627{
   2628	Elf64_Shdr *sh;
   2629
   2630	sh = elf_sec_hdr(obj, elf_sec_by_idx(obj, idx));
   2631	if (!sh)
   2632		return false;
   2633
   2634	return sh->sh_flags & SHF_EXECINSTR;
   2635}
   2636
   2637static bool btf_needs_sanitization(struct bpf_object *obj)
   2638{
   2639	bool has_func_global = kernel_supports(obj, FEAT_BTF_GLOBAL_FUNC);
   2640	bool has_datasec = kernel_supports(obj, FEAT_BTF_DATASEC);
   2641	bool has_float = kernel_supports(obj, FEAT_BTF_FLOAT);
   2642	bool has_func = kernel_supports(obj, FEAT_BTF_FUNC);
   2643	bool has_decl_tag = kernel_supports(obj, FEAT_BTF_DECL_TAG);
   2644	bool has_type_tag = kernel_supports(obj, FEAT_BTF_TYPE_TAG);
   2645
   2646	return !has_func || !has_datasec || !has_func_global || !has_float ||
   2647	       !has_decl_tag || !has_type_tag;
   2648}
   2649
   2650static void bpf_object__sanitize_btf(struct bpf_object *obj, struct btf *btf)
   2651{
   2652	bool has_func_global = kernel_supports(obj, FEAT_BTF_GLOBAL_FUNC);
   2653	bool has_datasec = kernel_supports(obj, FEAT_BTF_DATASEC);
   2654	bool has_float = kernel_supports(obj, FEAT_BTF_FLOAT);
   2655	bool has_func = kernel_supports(obj, FEAT_BTF_FUNC);
   2656	bool has_decl_tag = kernel_supports(obj, FEAT_BTF_DECL_TAG);
   2657	bool has_type_tag = kernel_supports(obj, FEAT_BTF_TYPE_TAG);
   2658	struct btf_type *t;
   2659	int i, j, vlen;
   2660
   2661	for (i = 1; i < btf__type_cnt(btf); i++) {
   2662		t = (struct btf_type *)btf__type_by_id(btf, i);
   2663
   2664		if ((!has_datasec && btf_is_var(t)) || (!has_decl_tag && btf_is_decl_tag(t))) {
   2665			/* replace VAR/DECL_TAG with INT */
   2666			t->info = BTF_INFO_ENC(BTF_KIND_INT, 0, 0);
   2667			/*
   2668			 * using size = 1 is the safest choice, 4 will be too
   2669			 * big and cause kernel BTF validation failure if
   2670			 * original variable took less than 4 bytes
   2671			 */
   2672			t->size = 1;
   2673			*(int *)(t + 1) = BTF_INT_ENC(0, 0, 8);
   2674		} else if (!has_datasec && btf_is_datasec(t)) {
   2675			/* replace DATASEC with STRUCT */
   2676			const struct btf_var_secinfo *v = btf_var_secinfos(t);
   2677			struct btf_member *m = btf_members(t);
   2678			struct btf_type *vt;
   2679			char *name;
   2680
   2681			name = (char *)btf__name_by_offset(btf, t->name_off);
   2682			while (*name) {
   2683				if (*name == '.')
   2684					*name = '_';
   2685				name++;
   2686			}
   2687
   2688			vlen = btf_vlen(t);
   2689			t->info = BTF_INFO_ENC(BTF_KIND_STRUCT, 0, vlen);
   2690			for (j = 0; j < vlen; j++, v++, m++) {
   2691				/* order of field assignments is important */
   2692				m->offset = v->offset * 8;
   2693				m->type = v->type;
   2694				/* preserve variable name as member name */
   2695				vt = (void *)btf__type_by_id(btf, v->type);
   2696				m->name_off = vt->name_off;
   2697			}
   2698		} else if (!has_func && btf_is_func_proto(t)) {
   2699			/* replace FUNC_PROTO with ENUM */
   2700			vlen = btf_vlen(t);
   2701			t->info = BTF_INFO_ENC(BTF_KIND_ENUM, 0, vlen);
   2702			t->size = sizeof(__u32); /* kernel enforced */
   2703		} else if (!has_func && btf_is_func(t)) {
   2704			/* replace FUNC with TYPEDEF */
   2705			t->info = BTF_INFO_ENC(BTF_KIND_TYPEDEF, 0, 0);
   2706		} else if (!has_func_global && btf_is_func(t)) {
   2707			/* replace BTF_FUNC_GLOBAL with BTF_FUNC_STATIC */
   2708			t->info = BTF_INFO_ENC(BTF_KIND_FUNC, 0, 0);
   2709		} else if (!has_float && btf_is_float(t)) {
   2710			/* replace FLOAT with an equally-sized empty STRUCT;
   2711			 * since C compilers do not accept e.g. "float" as a
   2712			 * valid struct name, make it anonymous
   2713			 */
   2714			t->name_off = 0;
   2715			t->info = BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 0);
   2716		} else if (!has_type_tag && btf_is_type_tag(t)) {
   2717			/* replace TYPE_TAG with a CONST */
   2718			t->name_off = 0;
   2719			t->info = BTF_INFO_ENC(BTF_KIND_CONST, 0, 0);
   2720		}
   2721	}
   2722}
   2723
   2724static bool libbpf_needs_btf(const struct bpf_object *obj)
   2725{
   2726	return obj->efile.btf_maps_shndx >= 0 ||
   2727	       obj->efile.st_ops_shndx >= 0 ||
   2728	       obj->nr_extern > 0;
   2729}
   2730
   2731static bool kernel_needs_btf(const struct bpf_object *obj)
   2732{
   2733	return obj->efile.st_ops_shndx >= 0;
   2734}
   2735
   2736static int bpf_object__init_btf(struct bpf_object *obj,
   2737				Elf_Data *btf_data,
   2738				Elf_Data *btf_ext_data)
   2739{
   2740	int err = -ENOENT;
   2741
   2742	if (btf_data) {
   2743		obj->btf = btf__new(btf_data->d_buf, btf_data->d_size);
   2744		err = libbpf_get_error(obj->btf);
   2745		if (err) {
   2746			obj->btf = NULL;
   2747			pr_warn("Error loading ELF section %s: %d.\n", BTF_ELF_SEC, err);
   2748			goto out;
   2749		}
   2750		/* enforce 8-byte pointers for BPF-targeted BTFs */
   2751		btf__set_pointer_size(obj->btf, 8);
   2752	}
   2753	if (btf_ext_data) {
   2754		struct btf_ext_info *ext_segs[3];
   2755		int seg_num, sec_num;
   2756
   2757		if (!obj->btf) {
   2758			pr_debug("Ignore ELF section %s because its depending ELF section %s is not found.\n",
   2759				 BTF_EXT_ELF_SEC, BTF_ELF_SEC);
   2760			goto out;
   2761		}
   2762		obj->btf_ext = btf_ext__new(btf_ext_data->d_buf, btf_ext_data->d_size);
   2763		err = libbpf_get_error(obj->btf_ext);
   2764		if (err) {
   2765			pr_warn("Error loading ELF section %s: %d. Ignored and continue.\n",
   2766				BTF_EXT_ELF_SEC, err);
   2767			obj->btf_ext = NULL;
   2768			goto out;
   2769		}
   2770
   2771		/* setup .BTF.ext to ELF section mapping */
   2772		ext_segs[0] = &obj->btf_ext->func_info;
   2773		ext_segs[1] = &obj->btf_ext->line_info;
   2774		ext_segs[2] = &obj->btf_ext->core_relo_info;
   2775		for (seg_num = 0; seg_num < ARRAY_SIZE(ext_segs); seg_num++) {
   2776			struct btf_ext_info *seg = ext_segs[seg_num];
   2777			const struct btf_ext_info_sec *sec;
   2778			const char *sec_name;
   2779			Elf_Scn *scn;
   2780
   2781			if (seg->sec_cnt == 0)
   2782				continue;
   2783
   2784			seg->sec_idxs = calloc(seg->sec_cnt, sizeof(*seg->sec_idxs));
   2785			if (!seg->sec_idxs) {
   2786				err = -ENOMEM;
   2787				goto out;
   2788			}
   2789
   2790			sec_num = 0;
   2791			for_each_btf_ext_sec(seg, sec) {
   2792				/* preventively increment index to avoid doing
   2793				 * this before every continue below
   2794				 */
   2795				sec_num++;
   2796
   2797				sec_name = btf__name_by_offset(obj->btf, sec->sec_name_off);
   2798				if (str_is_empty(sec_name))
   2799					continue;
   2800				scn = elf_sec_by_name(obj, sec_name);
   2801				if (!scn)
   2802					continue;
   2803
   2804				seg->sec_idxs[sec_num - 1] = elf_ndxscn(scn);
   2805			}
   2806		}
   2807	}
   2808out:
   2809	if (err && libbpf_needs_btf(obj)) {
   2810		pr_warn("BTF is required, but is missing or corrupted.\n");
   2811		return err;
   2812	}
   2813	return 0;
   2814}
   2815
   2816static int compare_vsi_off(const void *_a, const void *_b)
   2817{
   2818	const struct btf_var_secinfo *a = _a;
   2819	const struct btf_var_secinfo *b = _b;
   2820
   2821	return a->offset - b->offset;
   2822}
   2823
   2824static int btf_fixup_datasec(struct bpf_object *obj, struct btf *btf,
   2825			     struct btf_type *t)
   2826{
   2827	__u32 size = 0, off = 0, i, vars = btf_vlen(t);
   2828	const char *name = btf__name_by_offset(btf, t->name_off);
   2829	const struct btf_type *t_var;
   2830	struct btf_var_secinfo *vsi;
   2831	const struct btf_var *var;
   2832	int ret;
   2833
   2834	if (!name) {
   2835		pr_debug("No name found in string section for DATASEC kind.\n");
   2836		return -ENOENT;
   2837	}
   2838
   2839	/* .extern datasec size and var offsets were set correctly during
   2840	 * extern collection step, so just skip straight to sorting variables
   2841	 */
   2842	if (t->size)
   2843		goto sort_vars;
   2844
   2845	ret = find_elf_sec_sz(obj, name, &size);
   2846	if (ret || !size) {
   2847		pr_debug("Invalid size for section %s: %u bytes\n", name, size);
   2848		return -ENOENT;
   2849	}
   2850
   2851	t->size = size;
   2852
   2853	for (i = 0, vsi = btf_var_secinfos(t); i < vars; i++, vsi++) {
   2854		t_var = btf__type_by_id(btf, vsi->type);
   2855		if (!t_var || !btf_is_var(t_var)) {
   2856			pr_debug("Non-VAR type seen in section %s\n", name);
   2857			return -EINVAL;
   2858		}
   2859
   2860		var = btf_var(t_var);
   2861		if (var->linkage == BTF_VAR_STATIC)
   2862			continue;
   2863
   2864		name = btf__name_by_offset(btf, t_var->name_off);
   2865		if (!name) {
   2866			pr_debug("No name found in string section for VAR kind\n");
   2867			return -ENOENT;
   2868		}
   2869
   2870		ret = find_elf_var_offset(obj, name, &off);
   2871		if (ret) {
   2872			pr_debug("No offset found in symbol table for VAR %s\n",
   2873				 name);
   2874			return -ENOENT;
   2875		}
   2876
   2877		vsi->offset = off;
   2878	}
   2879
   2880sort_vars:
   2881	qsort(btf_var_secinfos(t), vars, sizeof(*vsi), compare_vsi_off);
   2882	return 0;
   2883}
   2884
   2885static int btf_finalize_data(struct bpf_object *obj, struct btf *btf)
   2886{
   2887	int err = 0;
   2888	__u32 i, n = btf__type_cnt(btf);
   2889
   2890	for (i = 1; i < n; i++) {
   2891		struct btf_type *t = btf_type_by_id(btf, i);
   2892
   2893		/* Loader needs to fix up some of the things compiler
   2894		 * couldn't get its hands on while emitting BTF. This
   2895		 * is section size and global variable offset. We use
   2896		 * the info from the ELF itself for this purpose.
   2897		 */
   2898		if (btf_is_datasec(t)) {
   2899			err = btf_fixup_datasec(obj, btf, t);
   2900			if (err)
   2901				break;
   2902		}
   2903	}
   2904
   2905	return libbpf_err(err);
   2906}
   2907
   2908int btf__finalize_data(struct bpf_object *obj, struct btf *btf)
   2909{
   2910	return btf_finalize_data(obj, btf);
   2911}
   2912
   2913static int bpf_object__finalize_btf(struct bpf_object *obj)
   2914{
   2915	int err;
   2916
   2917	if (!obj->btf)
   2918		return 0;
   2919
   2920	err = btf_finalize_data(obj, obj->btf);
   2921	if (err) {
   2922		pr_warn("Error finalizing %s: %d.\n", BTF_ELF_SEC, err);
   2923		return err;
   2924	}
   2925
   2926	return 0;
   2927}
   2928
   2929static bool prog_needs_vmlinux_btf(struct bpf_program *prog)
   2930{
   2931	if (prog->type == BPF_PROG_TYPE_STRUCT_OPS ||
   2932	    prog->type == BPF_PROG_TYPE_LSM)
   2933		return true;
   2934
   2935	/* BPF_PROG_TYPE_TRACING programs which do not attach to other programs
   2936	 * also need vmlinux BTF
   2937	 */
   2938	if (prog->type == BPF_PROG_TYPE_TRACING && !prog->attach_prog_fd)
   2939		return true;
   2940
   2941	return false;
   2942}
   2943
   2944static bool obj_needs_vmlinux_btf(const struct bpf_object *obj)
   2945{
   2946	struct bpf_program *prog;
   2947	int i;
   2948
   2949	/* CO-RE relocations need kernel BTF, only when btf_custom_path
   2950	 * is not specified
   2951	 */
   2952	if (obj->btf_ext && obj->btf_ext->core_relo_info.len && !obj->btf_custom_path)
   2953		return true;
   2954
   2955	/* Support for typed ksyms needs kernel BTF */
   2956	for (i = 0; i < obj->nr_extern; i++) {
   2957		const struct extern_desc *ext;
   2958
   2959		ext = &obj->externs[i];
   2960		if (ext->type == EXT_KSYM && ext->ksym.type_id)
   2961			return true;
   2962	}
   2963
   2964	bpf_object__for_each_program(prog, obj) {
   2965		if (!prog->autoload)
   2966			continue;
   2967		if (prog_needs_vmlinux_btf(prog))
   2968			return true;
   2969	}
   2970
   2971	return false;
   2972}
   2973
   2974static int bpf_object__load_vmlinux_btf(struct bpf_object *obj, bool force)
   2975{
   2976	int err;
   2977
   2978	/* btf_vmlinux could be loaded earlier */
   2979	if (obj->btf_vmlinux || obj->gen_loader)
   2980		return 0;
   2981
   2982	if (!force && !obj_needs_vmlinux_btf(obj))
   2983		return 0;
   2984
   2985	obj->btf_vmlinux = btf__load_vmlinux_btf();
   2986	err = libbpf_get_error(obj->btf_vmlinux);
   2987	if (err) {
   2988		pr_warn("Error loading vmlinux BTF: %d\n", err);
   2989		obj->btf_vmlinux = NULL;
   2990		return err;
   2991	}
   2992	return 0;
   2993}
   2994
   2995static int bpf_object__sanitize_and_load_btf(struct bpf_object *obj)
   2996{
   2997	struct btf *kern_btf = obj->btf;
   2998	bool btf_mandatory, sanitize;
   2999	int i, err = 0;
   3000
   3001	if (!obj->btf)
   3002		return 0;
   3003
   3004	if (!kernel_supports(obj, FEAT_BTF)) {
   3005		if (kernel_needs_btf(obj)) {
   3006			err = -EOPNOTSUPP;
   3007			goto report;
   3008		}
   3009		pr_debug("Kernel doesn't support BTF, skipping uploading it.\n");
   3010		return 0;
   3011	}
   3012
   3013	/* Even though some subprogs are global/weak, user might prefer more
   3014	 * permissive BPF verification process that BPF verifier performs for
   3015	 * static functions, taking into account more context from the caller
   3016	 * functions. In such case, they need to mark such subprogs with
   3017	 * __attribute__((visibility("hidden"))) and libbpf will adjust
   3018	 * corresponding FUNC BTF type to be marked as static and trigger more
   3019	 * involved BPF verification process.
   3020	 */
   3021	for (i = 0; i < obj->nr_programs; i++) {
   3022		struct bpf_program *prog = &obj->programs[i];
   3023		struct btf_type *t;
   3024		const char *name;
   3025		int j, n;
   3026
   3027		if (!prog->mark_btf_static || !prog_is_subprog(obj, prog))
   3028			continue;
   3029
   3030		n = btf__type_cnt(obj->btf);
   3031		for (j = 1; j < n; j++) {
   3032			t = btf_type_by_id(obj->btf, j);
   3033			if (!btf_is_func(t) || btf_func_linkage(t) != BTF_FUNC_GLOBAL)
   3034				continue;
   3035
   3036			name = btf__str_by_offset(obj->btf, t->name_off);
   3037			if (strcmp(name, prog->name) != 0)
   3038				continue;
   3039
   3040			t->info = btf_type_info(BTF_KIND_FUNC, BTF_FUNC_STATIC, 0);
   3041			break;
   3042		}
   3043	}
   3044
   3045	sanitize = btf_needs_sanitization(obj);
   3046	if (sanitize) {
   3047		const void *raw_data;
   3048		__u32 sz;
   3049
   3050		/* clone BTF to sanitize a copy and leave the original intact */
   3051		raw_data = btf__raw_data(obj->btf, &sz);
   3052		kern_btf = btf__new(raw_data, sz);
   3053		err = libbpf_get_error(kern_btf);
   3054		if (err)
   3055			return err;
   3056
   3057		/* enforce 8-byte pointers for BPF-targeted BTFs */
   3058		btf__set_pointer_size(obj->btf, 8);
   3059		bpf_object__sanitize_btf(obj, kern_btf);
   3060	}
   3061
   3062	if (obj->gen_loader) {
   3063		__u32 raw_size = 0;
   3064		const void *raw_data = btf__raw_data(kern_btf, &raw_size);
   3065
   3066		if (!raw_data)
   3067			return -ENOMEM;
   3068		bpf_gen__load_btf(obj->gen_loader, raw_data, raw_size);
   3069		/* Pretend to have valid FD to pass various fd >= 0 checks.
   3070		 * This fd == 0 will not be used with any syscall and will be reset to -1 eventually.
   3071		 */
   3072		btf__set_fd(kern_btf, 0);
   3073	} else {
   3074		/* currently BPF_BTF_LOAD only supports log_level 1 */
   3075		err = btf_load_into_kernel(kern_btf, obj->log_buf, obj->log_size,
   3076					   obj->log_level ? 1 : 0);
   3077	}
   3078	if (sanitize) {
   3079		if (!err) {
   3080			/* move fd to libbpf's BTF */
   3081			btf__set_fd(obj->btf, btf__fd(kern_btf));
   3082			btf__set_fd(kern_btf, -1);
   3083		}
   3084		btf__free(kern_btf);
   3085	}
   3086report:
   3087	if (err) {
   3088		btf_mandatory = kernel_needs_btf(obj);
   3089		pr_warn("Error loading .BTF into kernel: %d. %s\n", err,
   3090			btf_mandatory ? "BTF is mandatory, can't proceed."
   3091				      : "BTF is optional, ignoring.");
   3092		if (!btf_mandatory)
   3093			err = 0;
   3094	}
   3095	return err;
   3096}
   3097
   3098static const char *elf_sym_str(const struct bpf_object *obj, size_t off)
   3099{
   3100	const char *name;
   3101
   3102	name = elf_strptr(obj->efile.elf, obj->efile.strtabidx, off);
   3103	if (!name) {
   3104		pr_warn("elf: failed to get section name string at offset %zu from %s: %s\n",
   3105			off, obj->path, elf_errmsg(-1));
   3106		return NULL;
   3107	}
   3108
   3109	return name;
   3110}
   3111
   3112static const char *elf_sec_str(const struct bpf_object *obj, size_t off)
   3113{
   3114	const char *name;
   3115
   3116	name = elf_strptr(obj->efile.elf, obj->efile.shstrndx, off);
   3117	if (!name) {
   3118		pr_warn("elf: failed to get section name string at offset %zu from %s: %s\n",
   3119			off, obj->path, elf_errmsg(-1));
   3120		return NULL;
   3121	}
   3122
   3123	return name;
   3124}
   3125
   3126static Elf_Scn *elf_sec_by_idx(const struct bpf_object *obj, size_t idx)
   3127{
   3128	Elf_Scn *scn;
   3129
   3130	scn = elf_getscn(obj->efile.elf, idx);
   3131	if (!scn) {
   3132		pr_warn("elf: failed to get section(%zu) from %s: %s\n",
   3133			idx, obj->path, elf_errmsg(-1));
   3134		return NULL;
   3135	}
   3136	return scn;
   3137}
   3138
   3139static Elf_Scn *elf_sec_by_name(const struct bpf_object *obj, const char *name)
   3140{
   3141	Elf_Scn *scn = NULL;
   3142	Elf *elf = obj->efile.elf;
   3143	const char *sec_name;
   3144
   3145	while ((scn = elf_nextscn(elf, scn)) != NULL) {
   3146		sec_name = elf_sec_name(obj, scn);
   3147		if (!sec_name)
   3148			return NULL;
   3149
   3150		if (strcmp(sec_name, name) != 0)
   3151			continue;
   3152
   3153		return scn;
   3154	}
   3155	return NULL;
   3156}
   3157
   3158static Elf64_Shdr *elf_sec_hdr(const struct bpf_object *obj, Elf_Scn *scn)
   3159{
   3160	Elf64_Shdr *shdr;
   3161
   3162	if (!scn)
   3163		return NULL;
   3164
   3165	shdr = elf64_getshdr(scn);
   3166	if (!shdr) {
   3167		pr_warn("elf: failed to get section(%zu) header from %s: %s\n",
   3168			elf_ndxscn(scn), obj->path, elf_errmsg(-1));
   3169		return NULL;
   3170	}
   3171
   3172	return shdr;
   3173}
   3174
   3175static const char *elf_sec_name(const struct bpf_object *obj, Elf_Scn *scn)
   3176{
   3177	const char *name;
   3178	Elf64_Shdr *sh;
   3179
   3180	if (!scn)
   3181		return NULL;
   3182
   3183	sh = elf_sec_hdr(obj, scn);
   3184	if (!sh)
   3185		return NULL;
   3186
   3187	name = elf_sec_str(obj, sh->sh_name);
   3188	if (!name) {
   3189		pr_warn("elf: failed to get section(%zu) name from %s: %s\n",
   3190			elf_ndxscn(scn), obj->path, elf_errmsg(-1));
   3191		return NULL;
   3192	}
   3193
   3194	return name;
   3195}
   3196
   3197static Elf_Data *elf_sec_data(const struct bpf_object *obj, Elf_Scn *scn)
   3198{
   3199	Elf_Data *data;
   3200
   3201	if (!scn)
   3202		return NULL;
   3203
   3204	data = elf_getdata(scn, 0);
   3205	if (!data) {
   3206		pr_warn("elf: failed to get section(%zu) %s data from %s: %s\n",
   3207			elf_ndxscn(scn), elf_sec_name(obj, scn) ?: "<?>",
   3208			obj->path, elf_errmsg(-1));
   3209		return NULL;
   3210	}
   3211
   3212	return data;
   3213}
   3214
   3215static Elf64_Sym *elf_sym_by_idx(const struct bpf_object *obj, size_t idx)
   3216{
   3217	if (idx >= obj->efile.symbols->d_size / sizeof(Elf64_Sym))
   3218		return NULL;
   3219
   3220	return (Elf64_Sym *)obj->efile.symbols->d_buf + idx;
   3221}
   3222
   3223static Elf64_Rel *elf_rel_by_idx(Elf_Data *data, size_t idx)
   3224{
   3225	if (idx >= data->d_size / sizeof(Elf64_Rel))
   3226		return NULL;
   3227
   3228	return (Elf64_Rel *)data->d_buf + idx;
   3229}
   3230
   3231static bool is_sec_name_dwarf(const char *name)
   3232{
   3233	/* approximation, but the actual list is too long */
   3234	return str_has_pfx(name, ".debug_");
   3235}
   3236
   3237static bool ignore_elf_section(Elf64_Shdr *hdr, const char *name)
   3238{
   3239	/* no special handling of .strtab */
   3240	if (hdr->sh_type == SHT_STRTAB)
   3241		return true;
   3242
   3243	/* ignore .llvm_addrsig section as well */
   3244	if (hdr->sh_type == SHT_LLVM_ADDRSIG)
   3245		return true;
   3246
   3247	/* no subprograms will lead to an empty .text section, ignore it */
   3248	if (hdr->sh_type == SHT_PROGBITS && hdr->sh_size == 0 &&
   3249	    strcmp(name, ".text") == 0)
   3250		return true;
   3251
   3252	/* DWARF sections */
   3253	if (is_sec_name_dwarf(name))
   3254		return true;
   3255
   3256	if (str_has_pfx(name, ".rel")) {
   3257		name += sizeof(".rel") - 1;
   3258		/* DWARF section relocations */
   3259		if (is_sec_name_dwarf(name))
   3260			return true;
   3261
   3262		/* .BTF and .BTF.ext don't need relocations */
   3263		if (strcmp(name, BTF_ELF_SEC) == 0 ||
   3264		    strcmp(name, BTF_EXT_ELF_SEC) == 0)
   3265			return true;
   3266	}
   3267
   3268	return false;
   3269}
   3270
   3271static int cmp_progs(const void *_a, const void *_b)
   3272{
   3273	const struct bpf_program *a = _a;
   3274	const struct bpf_program *b = _b;
   3275
   3276	if (a->sec_idx != b->sec_idx)
   3277		return a->sec_idx < b->sec_idx ? -1 : 1;
   3278
   3279	/* sec_insn_off can't be the same within the section */
   3280	return a->sec_insn_off < b->sec_insn_off ? -1 : 1;
   3281}
   3282
   3283static int bpf_object__elf_collect(struct bpf_object *obj)
   3284{
   3285	struct elf_sec_desc *sec_desc;
   3286	Elf *elf = obj->efile.elf;
   3287	Elf_Data *btf_ext_data = NULL;
   3288	Elf_Data *btf_data = NULL;
   3289	int idx = 0, err = 0;
   3290	const char *name;
   3291	Elf_Data *data;
   3292	Elf_Scn *scn;
   3293	Elf64_Shdr *sh;
   3294
   3295	/* ELF section indices are 0-based, but sec #0 is special "invalid"
   3296	 * section. e_shnum does include sec #0, so e_shnum is the necessary
   3297	 * size of an array to keep all the sections.
   3298	 */
   3299	obj->efile.sec_cnt = obj->efile.ehdr->e_shnum;
   3300	obj->efile.secs = calloc(obj->efile.sec_cnt, sizeof(*obj->efile.secs));
   3301	if (!obj->efile.secs)
   3302		return -ENOMEM;
   3303
   3304	/* a bunch of ELF parsing functionality depends on processing symbols,
   3305	 * so do the first pass and find the symbol table
   3306	 */
   3307	scn = NULL;
   3308	while ((scn = elf_nextscn(elf, scn)) != NULL) {
   3309		sh = elf_sec_hdr(obj, scn);
   3310		if (!sh)
   3311			return -LIBBPF_ERRNO__FORMAT;
   3312
   3313		if (sh->sh_type == SHT_SYMTAB) {
   3314			if (obj->efile.symbols) {
   3315				pr_warn("elf: multiple symbol tables in %s\n", obj->path);
   3316				return -LIBBPF_ERRNO__FORMAT;
   3317			}
   3318
   3319			data = elf_sec_data(obj, scn);
   3320			if (!data)
   3321				return -LIBBPF_ERRNO__FORMAT;
   3322
   3323			idx = elf_ndxscn(scn);
   3324
   3325			obj->efile.symbols = data;
   3326			obj->efile.symbols_shndx = idx;
   3327			obj->efile.strtabidx = sh->sh_link;
   3328		}
   3329	}
   3330
   3331	if (!obj->efile.symbols) {
   3332		pr_warn("elf: couldn't find symbol table in %s, stripped object file?\n",
   3333			obj->path);
   3334		return -ENOENT;
   3335	}
   3336
   3337	scn = NULL;
   3338	while ((scn = elf_nextscn(elf, scn)) != NULL) {
   3339		idx = elf_ndxscn(scn);
   3340		sec_desc = &obj->efile.secs[idx];
   3341
   3342		sh = elf_sec_hdr(obj, scn);
   3343		if (!sh)
   3344			return -LIBBPF_ERRNO__FORMAT;
   3345
   3346		name = elf_sec_str(obj, sh->sh_name);
   3347		if (!name)
   3348			return -LIBBPF_ERRNO__FORMAT;
   3349
   3350		if (ignore_elf_section(sh, name))
   3351			continue;
   3352
   3353		data = elf_sec_data(obj, scn);
   3354		if (!data)
   3355			return -LIBBPF_ERRNO__FORMAT;
   3356
   3357		pr_debug("elf: section(%d) %s, size %ld, link %d, flags %lx, type=%d\n",
   3358			 idx, name, (unsigned long)data->d_size,
   3359			 (int)sh->sh_link, (unsigned long)sh->sh_flags,
   3360			 (int)sh->sh_type);
   3361
   3362		if (strcmp(name, "license") == 0) {
   3363			err = bpf_object__init_license(obj, data->d_buf, data->d_size);
   3364			if (err)
   3365				return err;
   3366		} else if (strcmp(name, "version") == 0) {
   3367			err = bpf_object__init_kversion(obj, data->d_buf, data->d_size);
   3368			if (err)
   3369				return err;
   3370		} else if (strcmp(name, "maps") == 0) {
   3371			obj->efile.maps_shndx = idx;
   3372		} else if (strcmp(name, MAPS_ELF_SEC) == 0) {
   3373			obj->efile.btf_maps_shndx = idx;
   3374		} else if (strcmp(name, BTF_ELF_SEC) == 0) {
   3375			if (sh->sh_type != SHT_PROGBITS)
   3376				return -LIBBPF_ERRNO__FORMAT;
   3377			btf_data = data;
   3378		} else if (strcmp(name, BTF_EXT_ELF_SEC) == 0) {
   3379			if (sh->sh_type != SHT_PROGBITS)
   3380				return -LIBBPF_ERRNO__FORMAT;
   3381			btf_ext_data = data;
   3382		} else if (sh->sh_type == SHT_SYMTAB) {
   3383			/* already processed during the first pass above */
   3384		} else if (sh->sh_type == SHT_PROGBITS && data->d_size > 0) {
   3385			if (sh->sh_flags & SHF_EXECINSTR) {
   3386				if (strcmp(name, ".text") == 0)
   3387					obj->efile.text_shndx = idx;
   3388				err = bpf_object__add_programs(obj, data, name, idx);
   3389				if (err)
   3390					return err;
   3391			} else if (strcmp(name, DATA_SEC) == 0 ||
   3392				   str_has_pfx(name, DATA_SEC ".")) {
   3393				sec_desc->sec_type = SEC_DATA;
   3394				sec_desc->shdr = sh;
   3395				sec_desc->data = data;
   3396			} else if (strcmp(name, RODATA_SEC) == 0 ||
   3397				   str_has_pfx(name, RODATA_SEC ".")) {
   3398				sec_desc->sec_type = SEC_RODATA;
   3399				sec_desc->shdr = sh;
   3400				sec_desc->data = data;
   3401			} else if (strcmp(name, STRUCT_OPS_SEC) == 0) {
   3402				obj->efile.st_ops_data = data;
   3403				obj->efile.st_ops_shndx = idx;
   3404			} else {
   3405				pr_info("elf: skipping unrecognized data section(%d) %s\n",
   3406					idx, name);
   3407			}
   3408		} else if (sh->sh_type == SHT_REL) {
   3409			int targ_sec_idx = sh->sh_info; /* points to other section */
   3410
   3411			if (sh->sh_entsize != sizeof(Elf64_Rel) ||
   3412			    targ_sec_idx >= obj->efile.sec_cnt)
   3413				return -LIBBPF_ERRNO__FORMAT;
   3414
   3415			/* Only do relo for section with exec instructions */
   3416			if (!section_have_execinstr(obj, targ_sec_idx) &&
   3417			    strcmp(name, ".rel" STRUCT_OPS_SEC) &&
   3418			    strcmp(name, ".rel" MAPS_ELF_SEC)) {
   3419				pr_info("elf: skipping relo section(%d) %s for section(%d) %s\n",
   3420					idx, name, targ_sec_idx,
   3421					elf_sec_name(obj, elf_sec_by_idx(obj, targ_sec_idx)) ?: "<?>");
   3422				continue;
   3423			}
   3424
   3425			sec_desc->sec_type = SEC_RELO;
   3426			sec_desc->shdr = sh;
   3427			sec_desc->data = data;
   3428		} else if (sh->sh_type == SHT_NOBITS && strcmp(name, BSS_SEC) == 0) {
   3429			sec_desc->sec_type = SEC_BSS;
   3430			sec_desc->shdr = sh;
   3431			sec_desc->data = data;
   3432		} else {
   3433			pr_info("elf: skipping section(%d) %s (size %zu)\n", idx, name,
   3434				(size_t)sh->sh_size);
   3435		}
   3436	}
   3437
   3438	if (!obj->efile.strtabidx || obj->efile.strtabidx > idx) {
   3439		pr_warn("elf: symbol strings section missing or invalid in %s\n", obj->path);
   3440		return -LIBBPF_ERRNO__FORMAT;
   3441	}
   3442
   3443	/* sort BPF programs by section name and in-section instruction offset
   3444	 * for faster search */
   3445	if (obj->nr_programs)
   3446		qsort(obj->programs, obj->nr_programs, sizeof(*obj->programs), cmp_progs);
   3447
   3448	return bpf_object__init_btf(obj, btf_data, btf_ext_data);
   3449}
   3450
   3451static bool sym_is_extern(const Elf64_Sym *sym)
   3452{
   3453	int bind = ELF64_ST_BIND(sym->st_info);
   3454	/* externs are symbols w/ type=NOTYPE, bind=GLOBAL|WEAK, section=UND */
   3455	return sym->st_shndx == SHN_UNDEF &&
   3456	       (bind == STB_GLOBAL || bind == STB_WEAK) &&
   3457	       ELF64_ST_TYPE(sym->st_info) == STT_NOTYPE;
   3458}
   3459
   3460static bool sym_is_subprog(const Elf64_Sym *sym, int text_shndx)
   3461{
   3462	int bind = ELF64_ST_BIND(sym->st_info);
   3463	int type = ELF64_ST_TYPE(sym->st_info);
   3464
   3465	/* in .text section */
   3466	if (sym->st_shndx != text_shndx)
   3467		return false;
   3468
   3469	/* local function */
   3470	if (bind == STB_LOCAL && type == STT_SECTION)
   3471		return true;
   3472
   3473	/* global function */
   3474	return bind == STB_GLOBAL && type == STT_FUNC;
   3475}
   3476
   3477static int find_extern_btf_id(const struct btf *btf, const char *ext_name)
   3478{
   3479	const struct btf_type *t;
   3480	const char *tname;
   3481	int i, n;
   3482
   3483	if (!btf)
   3484		return -ESRCH;
   3485
   3486	n = btf__type_cnt(btf);
   3487	for (i = 1; i < n; i++) {
   3488		t = btf__type_by_id(btf, i);
   3489
   3490		if (!btf_is_var(t) && !btf_is_func(t))
   3491			continue;
   3492
   3493		tname = btf__name_by_offset(btf, t->name_off);
   3494		if (strcmp(tname, ext_name))
   3495			continue;
   3496
   3497		if (btf_is_var(t) &&
   3498		    btf_var(t)->linkage != BTF_VAR_GLOBAL_EXTERN)
   3499			return -EINVAL;
   3500
   3501		if (btf_is_func(t) && btf_func_linkage(t) != BTF_FUNC_EXTERN)
   3502			return -EINVAL;
   3503
   3504		return i;
   3505	}
   3506
   3507	return -ENOENT;
   3508}
   3509
   3510static int find_extern_sec_btf_id(struct btf *btf, int ext_btf_id) {
   3511	const struct btf_var_secinfo *vs;
   3512	const struct btf_type *t;
   3513	int i, j, n;
   3514
   3515	if (!btf)
   3516		return -ESRCH;
   3517
   3518	n = btf__type_cnt(btf);
   3519	for (i = 1; i < n; i++) {
   3520		t = btf__type_by_id(btf, i);
   3521
   3522		if (!btf_is_datasec(t))
   3523			continue;
   3524
   3525		vs = btf_var_secinfos(t);
   3526		for (j = 0; j < btf_vlen(t); j++, vs++) {
   3527			if (vs->type == ext_btf_id)
   3528				return i;
   3529		}
   3530	}
   3531
   3532	return -ENOENT;
   3533}
   3534
   3535static enum kcfg_type find_kcfg_type(const struct btf *btf, int id,
   3536				     bool *is_signed)
   3537{
   3538	const struct btf_type *t;
   3539	const char *name;
   3540
   3541	t = skip_mods_and_typedefs(btf, id, NULL);
   3542	name = btf__name_by_offset(btf, t->name_off);
   3543
   3544	if (is_signed)
   3545		*is_signed = false;
   3546	switch (btf_kind(t)) {
   3547	case BTF_KIND_INT: {
   3548		int enc = btf_int_encoding(t);
   3549
   3550		if (enc & BTF_INT_BOOL)
   3551			return t->size == 1 ? KCFG_BOOL : KCFG_UNKNOWN;
   3552		if (is_signed)
   3553			*is_signed = enc & BTF_INT_SIGNED;
   3554		if (t->size == 1)
   3555			return KCFG_CHAR;
   3556		if (t->size < 1 || t->size > 8 || (t->size & (t->size - 1)))
   3557			return KCFG_UNKNOWN;
   3558		return KCFG_INT;
   3559	}
   3560	case BTF_KIND_ENUM:
   3561		if (t->size != 4)
   3562			return KCFG_UNKNOWN;
   3563		if (strcmp(name, "libbpf_tristate"))
   3564			return KCFG_UNKNOWN;
   3565		return KCFG_TRISTATE;
   3566	case BTF_KIND_ARRAY:
   3567		if (btf_array(t)->nelems == 0)
   3568			return KCFG_UNKNOWN;
   3569		if (find_kcfg_type(btf, btf_array(t)->type, NULL) != KCFG_CHAR)
   3570			return KCFG_UNKNOWN;
   3571		return KCFG_CHAR_ARR;
   3572	default:
   3573		return KCFG_UNKNOWN;
   3574	}
   3575}
   3576
   3577static int cmp_externs(const void *_a, const void *_b)
   3578{
   3579	const struct extern_desc *a = _a;
   3580	const struct extern_desc *b = _b;
   3581
   3582	if (a->type != b->type)
   3583		return a->type < b->type ? -1 : 1;
   3584
   3585	if (a->type == EXT_KCFG) {
   3586		/* descending order by alignment requirements */
   3587		if (a->kcfg.align != b->kcfg.align)
   3588			return a->kcfg.align > b->kcfg.align ? -1 : 1;
   3589		/* ascending order by size, within same alignment class */
   3590		if (a->kcfg.sz != b->kcfg.sz)
   3591			return a->kcfg.sz < b->kcfg.sz ? -1 : 1;
   3592	}
   3593
   3594	/* resolve ties by name */
   3595	return strcmp(a->name, b->name);
   3596}
   3597
   3598static int find_int_btf_id(const struct btf *btf)
   3599{
   3600	const struct btf_type *t;
   3601	int i, n;
   3602
   3603	n = btf__type_cnt(btf);
   3604	for (i = 1; i < n; i++) {
   3605		t = btf__type_by_id(btf, i);
   3606
   3607		if (btf_is_int(t) && btf_int_bits(t) == 32)
   3608			return i;
   3609	}
   3610
   3611	return 0;
   3612}
   3613
   3614static int add_dummy_ksym_var(struct btf *btf)
   3615{
   3616	int i, int_btf_id, sec_btf_id, dummy_var_btf_id;
   3617	const struct btf_var_secinfo *vs;
   3618	const struct btf_type *sec;
   3619
   3620	if (!btf)
   3621		return 0;
   3622
   3623	sec_btf_id = btf__find_by_name_kind(btf, KSYMS_SEC,
   3624					    BTF_KIND_DATASEC);
   3625	if (sec_btf_id < 0)
   3626		return 0;
   3627
   3628	sec = btf__type_by_id(btf, sec_btf_id);
   3629	vs = btf_var_secinfos(sec);
   3630	for (i = 0; i < btf_vlen(sec); i++, vs++) {
   3631		const struct btf_type *vt;
   3632
   3633		vt = btf__type_by_id(btf, vs->type);
   3634		if (btf_is_func(vt))
   3635			break;
   3636	}
   3637
   3638	/* No func in ksyms sec.  No need to add dummy var. */
   3639	if (i == btf_vlen(sec))
   3640		return 0;
   3641
   3642	int_btf_id = find_int_btf_id(btf);
   3643	dummy_var_btf_id = btf__add_var(btf,
   3644					"dummy_ksym",
   3645					BTF_VAR_GLOBAL_ALLOCATED,
   3646					int_btf_id);
   3647	if (dummy_var_btf_id < 0)
   3648		pr_warn("cannot create a dummy_ksym var\n");
   3649
   3650	return dummy_var_btf_id;
   3651}
   3652
   3653static int bpf_object__collect_externs(struct bpf_object *obj)
   3654{
   3655	struct btf_type *sec, *kcfg_sec = NULL, *ksym_sec = NULL;
   3656	const struct btf_type *t;
   3657	struct extern_desc *ext;
   3658	int i, n, off, dummy_var_btf_id;
   3659	const char *ext_name, *sec_name;
   3660	Elf_Scn *scn;
   3661	Elf64_Shdr *sh;
   3662
   3663	if (!obj->efile.symbols)
   3664		return 0;
   3665
   3666	scn = elf_sec_by_idx(obj, obj->efile.symbols_shndx);
   3667	sh = elf_sec_hdr(obj, scn);
   3668	if (!sh || sh->sh_entsize != sizeof(Elf64_Sym))
   3669		return -LIBBPF_ERRNO__FORMAT;
   3670
   3671	dummy_var_btf_id = add_dummy_ksym_var(obj->btf);
   3672	if (dummy_var_btf_id < 0)
   3673		return dummy_var_btf_id;
   3674
   3675	n = sh->sh_size / sh->sh_entsize;
   3676	pr_debug("looking for externs among %d symbols...\n", n);
   3677
   3678	for (i = 0; i < n; i++) {
   3679		Elf64_Sym *sym = elf_sym_by_idx(obj, i);
   3680
   3681		if (!sym)
   3682			return -LIBBPF_ERRNO__FORMAT;
   3683		if (!sym_is_extern(sym))
   3684			continue;
   3685		ext_name = elf_sym_str(obj, sym->st_name);
   3686		if (!ext_name || !ext_name[0])
   3687			continue;
   3688
   3689		ext = obj->externs;
   3690		ext = libbpf_reallocarray(ext, obj->nr_extern + 1, sizeof(*ext));
   3691		if (!ext)
   3692			return -ENOMEM;
   3693		obj->externs = ext;
   3694		ext = &ext[obj->nr_extern];
   3695		memset(ext, 0, sizeof(*ext));
   3696		obj->nr_extern++;
   3697
   3698		ext->btf_id = find_extern_btf_id(obj->btf, ext_name);
   3699		if (ext->btf_id <= 0) {
   3700			pr_warn("failed to find BTF for extern '%s': %d\n",
   3701				ext_name, ext->btf_id);
   3702			return ext->btf_id;
   3703		}
   3704		t = btf__type_by_id(obj->btf, ext->btf_id);
   3705		ext->name = btf__name_by_offset(obj->btf, t->name_off);
   3706		ext->sym_idx = i;
   3707		ext->is_weak = ELF64_ST_BIND(sym->st_info) == STB_WEAK;
   3708
   3709		ext->sec_btf_id = find_extern_sec_btf_id(obj->btf, ext->btf_id);
   3710		if (ext->sec_btf_id <= 0) {
   3711			pr_warn("failed to find BTF for extern '%s' [%d] section: %d\n",
   3712				ext_name, ext->btf_id, ext->sec_btf_id);
   3713			return ext->sec_btf_id;
   3714		}
   3715		sec = (void *)btf__type_by_id(obj->btf, ext->sec_btf_id);
   3716		sec_name = btf__name_by_offset(obj->btf, sec->name_off);
   3717
   3718		if (strcmp(sec_name, KCONFIG_SEC) == 0) {
   3719			if (btf_is_func(t)) {
   3720				pr_warn("extern function %s is unsupported under %s section\n",
   3721					ext->name, KCONFIG_SEC);
   3722				return -ENOTSUP;
   3723			}
   3724			kcfg_sec = sec;
   3725			ext->type = EXT_KCFG;
   3726			ext->kcfg.sz = btf__resolve_size(obj->btf, t->type);
   3727			if (ext->kcfg.sz <= 0) {
   3728				pr_warn("failed to resolve size of extern (kcfg) '%s': %d\n",
   3729					ext_name, ext->kcfg.sz);
   3730				return ext->kcfg.sz;
   3731			}
   3732			ext->kcfg.align = btf__align_of(obj->btf, t->type);
   3733			if (ext->kcfg.align <= 0) {
   3734				pr_warn("failed to determine alignment of extern (kcfg) '%s': %d\n",
   3735					ext_name, ext->kcfg.align);
   3736				return -EINVAL;
   3737			}
   3738			ext->kcfg.type = find_kcfg_type(obj->btf, t->type,
   3739						        &ext->kcfg.is_signed);
   3740			if (ext->kcfg.type == KCFG_UNKNOWN) {
   3741				pr_warn("extern (kcfg) '%s' type is unsupported\n", ext_name);
   3742				return -ENOTSUP;
   3743			}
   3744		} else if (strcmp(sec_name, KSYMS_SEC) == 0) {
   3745			ksym_sec = sec;
   3746			ext->type = EXT_KSYM;
   3747			skip_mods_and_typedefs(obj->btf, t->type,
   3748					       &ext->ksym.type_id);
   3749		} else {
   3750			pr_warn("unrecognized extern section '%s'\n", sec_name);
   3751			return -ENOTSUP;
   3752		}
   3753	}
   3754	pr_debug("collected %d externs total\n", obj->nr_extern);
   3755
   3756	if (!obj->nr_extern)
   3757		return 0;
   3758
   3759	/* sort externs by type, for kcfg ones also by (align, size, name) */
   3760	qsort(obj->externs, obj->nr_extern, sizeof(*ext), cmp_externs);
   3761
   3762	/* for .ksyms section, we need to turn all externs into allocated
   3763	 * variables in BTF to pass kernel verification; we do this by
   3764	 * pretending that each extern is a 8-byte variable
   3765	 */
   3766	if (ksym_sec) {
   3767		/* find existing 4-byte integer type in BTF to use for fake
   3768		 * extern variables in DATASEC
   3769		 */
   3770		int int_btf_id = find_int_btf_id(obj->btf);
   3771		/* For extern function, a dummy_var added earlier
   3772		 * will be used to replace the vs->type and
   3773		 * its name string will be used to refill
   3774		 * the missing param's name.
   3775		 */
   3776		const struct btf_type *dummy_var;
   3777
   3778		dummy_var = btf__type_by_id(obj->btf, dummy_var_btf_id);
   3779		for (i = 0; i < obj->nr_extern; i++) {
   3780			ext = &obj->externs[i];
   3781			if (ext->type != EXT_KSYM)
   3782				continue;
   3783			pr_debug("extern (ksym) #%d: symbol %d, name %s\n",
   3784				 i, ext->sym_idx, ext->name);
   3785		}
   3786
   3787		sec = ksym_sec;
   3788		n = btf_vlen(sec);
   3789		for (i = 0, off = 0; i < n; i++, off += sizeof(int)) {
   3790			struct btf_var_secinfo *vs = btf_var_secinfos(sec) + i;
   3791			struct btf_type *vt;
   3792
   3793			vt = (void *)btf__type_by_id(obj->btf, vs->type);
   3794			ext_name = btf__name_by_offset(obj->btf, vt->name_off);
   3795			ext = find_extern_by_name(obj, ext_name);
   3796			if (!ext) {
   3797				pr_warn("failed to find extern definition for BTF %s '%s'\n",
   3798					btf_kind_str(vt), ext_name);
   3799				return -ESRCH;
   3800			}
   3801			if (btf_is_func(vt)) {
   3802				const struct btf_type *func_proto;
   3803				struct btf_param *param;
   3804				int j;
   3805
   3806				func_proto = btf__type_by_id(obj->btf,
   3807							     vt->type);
   3808				param = btf_params(func_proto);
   3809				/* Reuse the dummy_var string if the
   3810				 * func proto does not have param name.
   3811				 */
   3812				for (j = 0; j < btf_vlen(func_proto); j++)
   3813					if (param[j].type && !param[j].name_off)
   3814						param[j].name_off =
   3815							dummy_var->name_off;
   3816				vs->type = dummy_var_btf_id;
   3817				vt->info &= ~0xffff;
   3818				vt->info |= BTF_FUNC_GLOBAL;
   3819			} else {
   3820				btf_var(vt)->linkage = BTF_VAR_GLOBAL_ALLOCATED;
   3821				vt->type = int_btf_id;
   3822			}
   3823			vs->offset = off;
   3824			vs->size = sizeof(int);
   3825		}
   3826		sec->size = off;
   3827	}
   3828
   3829	if (kcfg_sec) {
   3830		sec = kcfg_sec;
   3831		/* for kcfg externs calculate their offsets within a .kconfig map */
   3832		off = 0;
   3833		for (i = 0; i < obj->nr_extern; i++) {
   3834			ext = &obj->externs[i];
   3835			if (ext->type != EXT_KCFG)
   3836				continue;
   3837
   3838			ext->kcfg.data_off = roundup(off, ext->kcfg.align);
   3839			off = ext->kcfg.data_off + ext->kcfg.sz;
   3840			pr_debug("extern (kcfg) #%d: symbol %d, off %u, name %s\n",
   3841				 i, ext->sym_idx, ext->kcfg.data_off, ext->name);
   3842		}
   3843		sec->size = off;
   3844		n = btf_vlen(sec);
   3845		for (i = 0; i < n; i++) {
   3846			struct btf_var_secinfo *vs = btf_var_secinfos(sec) + i;
   3847
   3848			t = btf__type_by_id(obj->btf, vs->type);
   3849			ext_name = btf__name_by_offset(obj->btf, t->name_off);
   3850			ext = find_extern_by_name(obj, ext_name);
   3851			if (!ext) {
   3852				pr_warn("failed to find extern definition for BTF var '%s'\n",
   3853					ext_name);
   3854				return -ESRCH;
   3855			}
   3856			btf_var(t)->linkage = BTF_VAR_GLOBAL_ALLOCATED;
   3857			vs->offset = ext->kcfg.data_off;
   3858		}
   3859	}
   3860	return 0;
   3861}
   3862
   3863struct bpf_program *
   3864bpf_object__find_program_by_title(const struct bpf_object *obj,
   3865				  const char *title)
   3866{
   3867	struct bpf_program *pos;
   3868
   3869	bpf_object__for_each_program(pos, obj) {
   3870		if (pos->sec_name && !strcmp(pos->sec_name, title))
   3871			return pos;
   3872	}
   3873	return errno = ENOENT, NULL;
   3874}
   3875
   3876static bool prog_is_subprog(const struct bpf_object *obj,
   3877			    const struct bpf_program *prog)
   3878{
   3879	/* For legacy reasons, libbpf supports an entry-point BPF programs
   3880	 * without SEC() attribute, i.e., those in the .text section. But if
   3881	 * there are 2 or more such programs in the .text section, they all
   3882	 * must be subprograms called from entry-point BPF programs in
   3883	 * designated SEC()'tions, otherwise there is no way to distinguish
   3884	 * which of those programs should be loaded vs which are a subprogram.
   3885	 * Similarly, if there is a function/program in .text and at least one
   3886	 * other BPF program with custom SEC() attribute, then we just assume
   3887	 * .text programs are subprograms (even if they are not called from
   3888	 * other programs), because libbpf never explicitly supported mixing
   3889	 * SEC()-designated BPF programs and .text entry-point BPF programs.
   3890	 *
   3891	 * In libbpf 1.0 strict mode, we always consider .text
   3892	 * programs to be subprograms.
   3893	 */
   3894
   3895	if (libbpf_mode & LIBBPF_STRICT_SEC_NAME)
   3896		return prog->sec_idx == obj->efile.text_shndx;
   3897
   3898	return prog->sec_idx == obj->efile.text_shndx && obj->nr_programs > 1;
   3899}
   3900
   3901struct bpf_program *
   3902bpf_object__find_program_by_name(const struct bpf_object *obj,
   3903				 const char *name)
   3904{
   3905	struct bpf_program *prog;
   3906
   3907	bpf_object__for_each_program(prog, obj) {
   3908		if (prog_is_subprog(obj, prog))
   3909			continue;
   3910		if (!strcmp(prog->name, name))
   3911			return prog;
   3912	}
   3913	return errno = ENOENT, NULL;
   3914}
   3915
   3916static bool bpf_object__shndx_is_data(const struct bpf_object *obj,
   3917				      int shndx)
   3918{
   3919	switch (obj->efile.secs[shndx].sec_type) {
   3920	case SEC_BSS:
   3921	case SEC_DATA:
   3922	case SEC_RODATA:
   3923		return true;
   3924	default:
   3925		return false;
   3926	}
   3927}
   3928
   3929static bool bpf_object__shndx_is_maps(const struct bpf_object *obj,
   3930				      int shndx)
   3931{
   3932	return shndx == obj->efile.maps_shndx ||
   3933	       shndx == obj->efile.btf_maps_shndx;
   3934}
   3935
   3936static enum libbpf_map_type
   3937bpf_object__section_to_libbpf_map_type(const struct bpf_object *obj, int shndx)
   3938{
   3939	if (shndx == obj->efile.symbols_shndx)
   3940		return LIBBPF_MAP_KCONFIG;
   3941
   3942	switch (obj->efile.secs[shndx].sec_type) {
   3943	case SEC_BSS:
   3944		return LIBBPF_MAP_BSS;
   3945	case SEC_DATA:
   3946		return LIBBPF_MAP_DATA;
   3947	case SEC_RODATA:
   3948		return LIBBPF_MAP_RODATA;
   3949	default:
   3950		return LIBBPF_MAP_UNSPEC;
   3951	}
   3952}
   3953
   3954static int bpf_program__record_reloc(struct bpf_program *prog,
   3955				     struct reloc_desc *reloc_desc,
   3956				     __u32 insn_idx, const char *sym_name,
   3957				     const Elf64_Sym *sym, const Elf64_Rel *rel)
   3958{
   3959	struct bpf_insn *insn = &prog->insns[insn_idx];
   3960	size_t map_idx, nr_maps = prog->obj->nr_maps;
   3961	struct bpf_object *obj = prog->obj;
   3962	__u32 shdr_idx = sym->st_shndx;
   3963	enum libbpf_map_type type;
   3964	const char *sym_sec_name;
   3965	struct bpf_map *map;
   3966
   3967	if (!is_call_insn(insn) && !is_ldimm64_insn(insn)) {
   3968		pr_warn("prog '%s': invalid relo against '%s' for insns[%d].code 0x%x\n",
   3969			prog->name, sym_name, insn_idx, insn->code);
   3970		return -LIBBPF_ERRNO__RELOC;
   3971	}
   3972
   3973	if (sym_is_extern(sym)) {
   3974		int sym_idx = ELF64_R_SYM(rel->r_info);
   3975		int i, n = obj->nr_extern;
   3976		struct extern_desc *ext;
   3977
   3978		for (i = 0; i < n; i++) {
   3979			ext = &obj->externs[i];
   3980			if (ext->sym_idx == sym_idx)
   3981				break;
   3982		}
   3983		if (i >= n) {
   3984			pr_warn("prog '%s': extern relo failed to find extern for '%s' (%d)\n",
   3985				prog->name, sym_name, sym_idx);
   3986			return -LIBBPF_ERRNO__RELOC;
   3987		}
   3988		pr_debug("prog '%s': found extern #%d '%s' (sym %d) for insn #%u\n",
   3989			 prog->name, i, ext->name, ext->sym_idx, insn_idx);
   3990		if (insn->code == (BPF_JMP | BPF_CALL))
   3991			reloc_desc->type = RELO_EXTERN_FUNC;
   3992		else
   3993			reloc_desc->type = RELO_EXTERN_VAR;
   3994		reloc_desc->insn_idx = insn_idx;
   3995		reloc_desc->sym_off = i; /* sym_off stores extern index */
   3996		return 0;
   3997	}
   3998
   3999	/* sub-program call relocation */
   4000	if (is_call_insn(insn)) {
   4001		if (insn->src_reg != BPF_PSEUDO_CALL) {
   4002			pr_warn("prog '%s': incorrect bpf_call opcode\n", prog->name);
   4003			return -LIBBPF_ERRNO__RELOC;
   4004		}
   4005		/* text_shndx can be 0, if no default "main" program exists */
   4006		if (!shdr_idx || shdr_idx != obj->efile.text_shndx) {
   4007			sym_sec_name = elf_sec_name(obj, elf_sec_by_idx(obj, shdr_idx));
   4008			pr_warn("prog '%s': bad call relo against '%s' in section '%s'\n",
   4009				prog->name, sym_name, sym_sec_name);
   4010			return -LIBBPF_ERRNO__RELOC;
   4011		}
   4012		if (sym->st_value % BPF_INSN_SZ) {
   4013			pr_warn("prog '%s': bad call relo against '%s' at offset %zu\n",
   4014				prog->name, sym_name, (size_t)sym->st_value);
   4015			return -LIBBPF_ERRNO__RELOC;
   4016		}
   4017		reloc_desc->type = RELO_CALL;
   4018		reloc_desc->insn_idx = insn_idx;
   4019		reloc_desc->sym_off = sym->st_value;
   4020		return 0;
   4021	}
   4022
   4023	if (!shdr_idx || shdr_idx >= SHN_LORESERVE) {
   4024		pr_warn("prog '%s': invalid relo against '%s' in special section 0x%x; forgot to initialize global var?..\n",
   4025			prog->name, sym_name, shdr_idx);
   4026		return -LIBBPF_ERRNO__RELOC;
   4027	}
   4028
   4029	/* loading subprog addresses */
   4030	if (sym_is_subprog(sym, obj->efile.text_shndx)) {
   4031		/* global_func: sym->st_value = offset in the section, insn->imm = 0.
   4032		 * local_func: sym->st_value = 0, insn->imm = offset in the section.
   4033		 */
   4034		if ((sym->st_value % BPF_INSN_SZ) || (insn->imm % BPF_INSN_SZ)) {
   4035			pr_warn("prog '%s': bad subprog addr relo against '%s' at offset %zu+%d\n",
   4036				prog->name, sym_name, (size_t)sym->st_value, insn->imm);
   4037			return -LIBBPF_ERRNO__RELOC;
   4038		}
   4039
   4040		reloc_desc->type = RELO_SUBPROG_ADDR;
   4041		reloc_desc->insn_idx = insn_idx;
   4042		reloc_desc->sym_off = sym->st_value;
   4043		return 0;
   4044	}
   4045
   4046	type = bpf_object__section_to_libbpf_map_type(obj, shdr_idx);
   4047	sym_sec_name = elf_sec_name(obj, elf_sec_by_idx(obj, shdr_idx));
   4048
   4049	/* generic map reference relocation */
   4050	if (type == LIBBPF_MAP_UNSPEC) {
   4051		if (!bpf_object__shndx_is_maps(obj, shdr_idx)) {
   4052			pr_warn("prog '%s': bad map relo against '%s' in section '%s'\n",
   4053				prog->name, sym_name, sym_sec_name);
   4054			return -LIBBPF_ERRNO__RELOC;
   4055		}
   4056		for (map_idx = 0; map_idx < nr_maps; map_idx++) {
   4057			map = &obj->maps[map_idx];
   4058			if (map->libbpf_type != type ||
   4059			    map->sec_idx != sym->st_shndx ||
   4060			    map->sec_offset != sym->st_value)
   4061				continue;
   4062			pr_debug("prog '%s': found map %zd (%s, sec %d, off %zu) for insn #%u\n",
   4063				 prog->name, map_idx, map->name, map->sec_idx,
   4064				 map->sec_offset, insn_idx);
   4065			break;
   4066		}
   4067		if (map_idx >= nr_maps) {
   4068			pr_warn("prog '%s': map relo failed to find map for section '%s', off %zu\n",
   4069				prog->name, sym_sec_name, (size_t)sym->st_value);
   4070			return -LIBBPF_ERRNO__RELOC;
   4071		}
   4072		reloc_desc->type = RELO_LD64;
   4073		reloc_desc->insn_idx = insn_idx;
   4074		reloc_desc->map_idx = map_idx;
   4075		reloc_desc->sym_off = 0; /* sym->st_value determines map_idx */
   4076		return 0;
   4077	}
   4078
   4079	/* global data map relocation */
   4080	if (!bpf_object__shndx_is_data(obj, shdr_idx)) {
   4081		pr_warn("prog '%s': bad data relo against section '%s'\n",
   4082			prog->name, sym_sec_name);
   4083		return -LIBBPF_ERRNO__RELOC;
   4084	}
   4085	for (map_idx = 0; map_idx < nr_maps; map_idx++) {
   4086		map = &obj->maps[map_idx];
   4087		if (map->libbpf_type != type || map->sec_idx != sym->st_shndx)
   4088			continue;
   4089		pr_debug("prog '%s': found data map %zd (%s, sec %d, off %zu) for insn %u\n",
   4090			 prog->name, map_idx, map->name, map->sec_idx,
   4091			 map->sec_offset, insn_idx);
   4092		break;
   4093	}
   4094	if (map_idx >= nr_maps) {
   4095		pr_warn("prog '%s': data relo failed to find map for section '%s'\n",
   4096			prog->name, sym_sec_name);
   4097		return -LIBBPF_ERRNO__RELOC;
   4098	}
   4099
   4100	reloc_desc->type = RELO_DATA;
   4101	reloc_desc->insn_idx = insn_idx;
   4102	reloc_desc->map_idx = map_idx;
   4103	reloc_desc->sym_off = sym->st_value;
   4104	return 0;
   4105}
   4106
   4107static bool prog_contains_insn(const struct bpf_program *prog, size_t insn_idx)
   4108{
   4109	return insn_idx >= prog->sec_insn_off &&
   4110	       insn_idx < prog->sec_insn_off + prog->sec_insn_cnt;
   4111}
   4112
   4113static struct bpf_program *find_prog_by_sec_insn(const struct bpf_object *obj,
   4114						 size_t sec_idx, size_t insn_idx)
   4115{
   4116	int l = 0, r = obj->nr_programs - 1, m;
   4117	struct bpf_program *prog;
   4118
   4119	while (l < r) {
   4120		m = l + (r - l + 1) / 2;
   4121		prog = &obj->programs[m];
   4122
   4123		if (prog->sec_idx < sec_idx ||
   4124		    (prog->sec_idx == sec_idx && prog->sec_insn_off <= insn_idx))
   4125			l = m;
   4126		else
   4127			r = m - 1;
   4128	}
   4129	/* matching program could be at index l, but it still might be the
   4130	 * wrong one, so we need to double check conditions for the last time
   4131	 */
   4132	prog = &obj->programs[l];
   4133	if (prog->sec_idx == sec_idx && prog_contains_insn(prog, insn_idx))
   4134		return prog;
   4135	return NULL;
   4136}
   4137
   4138static int
   4139bpf_object__collect_prog_relos(struct bpf_object *obj, Elf64_Shdr *shdr, Elf_Data *data)
   4140{
   4141	const char *relo_sec_name, *sec_name;
   4142	size_t sec_idx = shdr->sh_info, sym_idx;
   4143	struct bpf_program *prog;
   4144	struct reloc_desc *relos;
   4145	int err, i, nrels;
   4146	const char *sym_name;
   4147	__u32 insn_idx;
   4148	Elf_Scn *scn;
   4149	Elf_Data *scn_data;
   4150	Elf64_Sym *sym;
   4151	Elf64_Rel *rel;
   4152
   4153	if (sec_idx >= obj->efile.sec_cnt)
   4154		return -EINVAL;
   4155
   4156	scn = elf_sec_by_idx(obj, sec_idx);
   4157	scn_data = elf_sec_data(obj, scn);
   4158
   4159	relo_sec_name = elf_sec_str(obj, shdr->sh_name);
   4160	sec_name = elf_sec_name(obj, scn);
   4161	if (!relo_sec_name || !sec_name)
   4162		return -EINVAL;
   4163
   4164	pr_debug("sec '%s': collecting relocation for section(%zu) '%s'\n",
   4165		 relo_sec_name, sec_idx, sec_name);
   4166	nrels = shdr->sh_size / shdr->sh_entsize;
   4167
   4168	for (i = 0; i < nrels; i++) {
   4169		rel = elf_rel_by_idx(data, i);
   4170		if (!rel) {
   4171			pr_warn("sec '%s': failed to get relo #%d\n", relo_sec_name, i);
   4172			return -LIBBPF_ERRNO__FORMAT;
   4173		}
   4174
   4175		sym_idx = ELF64_R_SYM(rel->r_info);
   4176		sym = elf_sym_by_idx(obj, sym_idx);
   4177		if (!sym) {
   4178			pr_warn("sec '%s': symbol #%zu not found for relo #%d\n",
   4179				relo_sec_name, sym_idx, i);
   4180			return -LIBBPF_ERRNO__FORMAT;
   4181		}
   4182
   4183		if (sym->st_shndx >= obj->efile.sec_cnt) {
   4184			pr_warn("sec '%s': corrupted symbol #%zu pointing to invalid section #%zu for relo #%d\n",
   4185				relo_sec_name, sym_idx, (size_t)sym->st_shndx, i);
   4186			return -LIBBPF_ERRNO__FORMAT;
   4187		}
   4188
   4189		if (rel->r_offset % BPF_INSN_SZ || rel->r_offset >= scn_data->d_size) {
   4190			pr_warn("sec '%s': invalid offset 0x%zx for relo #%d\n",
   4191				relo_sec_name, (size_t)rel->r_offset, i);
   4192			return -LIBBPF_ERRNO__FORMAT;
   4193		}
   4194
   4195		insn_idx = rel->r_offset / BPF_INSN_SZ;
   4196		/* relocations against static functions are recorded as
   4197		 * relocations against the section that contains a function;
   4198		 * in such case, symbol will be STT_SECTION and sym.st_name
   4199		 * will point to empty string (0), so fetch section name
   4200		 * instead
   4201		 */
   4202		if (ELF64_ST_TYPE(sym->st_info) == STT_SECTION && sym->st_name == 0)
   4203			sym_name = elf_sec_name(obj, elf_sec_by_idx(obj, sym->st_shndx));
   4204		else
   4205			sym_name = elf_sym_str(obj, sym->st_name);
   4206		sym_name = sym_name ?: "<?";
   4207
   4208		pr_debug("sec '%s': relo #%d: insn #%u against '%s'\n",
   4209			 relo_sec_name, i, insn_idx, sym_name);
   4210
   4211		prog = find_prog_by_sec_insn(obj, sec_idx, insn_idx);
   4212		if (!prog) {
   4213			pr_debug("sec '%s': relo #%d: couldn't find program in section '%s' for insn #%u, probably overridden weak function, skipping...\n",
   4214				relo_sec_name, i, sec_name, insn_idx);
   4215			continue;
   4216		}
   4217
   4218		relos = libbpf_reallocarray(prog->reloc_desc,
   4219					    prog->nr_reloc + 1, sizeof(*relos));
   4220		if (!relos)
   4221			return -ENOMEM;
   4222		prog->reloc_desc = relos;
   4223
   4224		/* adjust insn_idx to local BPF program frame of reference */
   4225		insn_idx -= prog->sec_insn_off;
   4226		err = bpf_program__record_reloc(prog, &relos[prog->nr_reloc],
   4227						insn_idx, sym_name, sym, rel);
   4228		if (err)
   4229			return err;
   4230
   4231		prog->nr_reloc++;
   4232	}
   4233	return 0;
   4234}
   4235
   4236static int bpf_map_find_btf_info(struct bpf_object *obj, struct bpf_map *map)
   4237{
   4238	struct bpf_map_def *def = &map->def;
   4239	__u32 key_type_id = 0, value_type_id = 0;
   4240	int ret;
   4241
   4242	if (!obj->btf)
   4243		return -ENOENT;
   4244
   4245	/* if it's BTF-defined map, we don't need to search for type IDs.
   4246	 * For struct_ops map, it does not need btf_key_type_id and
   4247	 * btf_value_type_id.
   4248	 */
   4249	if (map->sec_idx == obj->efile.btf_maps_shndx ||
   4250	    bpf_map__is_struct_ops(map))
   4251		return 0;
   4252
   4253	if (!bpf_map__is_internal(map)) {
   4254		pr_warn("Use of BPF_ANNOTATE_KV_PAIR is deprecated, use BTF-defined maps in .maps section instead\n");
   4255#pragma GCC diagnostic push
   4256#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
   4257		ret = btf__get_map_kv_tids(obj->btf, map->name, def->key_size,
   4258					   def->value_size, &key_type_id,
   4259					   &value_type_id);
   4260#pragma GCC diagnostic pop
   4261	} else {
   4262		/*
   4263		 * LLVM annotates global data differently in BTF, that is,
   4264		 * only as '.data', '.bss' or '.rodata'.
   4265		 */
   4266		ret = btf__find_by_name(obj->btf, map->real_name);
   4267	}
   4268	if (ret < 0)
   4269		return ret;
   4270
   4271	map->btf_key_type_id = key_type_id;
   4272	map->btf_value_type_id = bpf_map__is_internal(map) ?
   4273				 ret : value_type_id;
   4274	return 0;
   4275}
   4276
   4277static int bpf_get_map_info_from_fdinfo(int fd, struct bpf_map_info *info)
   4278{
   4279	char file[PATH_MAX], buff[4096];
   4280	FILE *fp;
   4281	__u32 val;
   4282	int err;
   4283
   4284	snprintf(file, sizeof(file), "/proc/%d/fdinfo/%d", getpid(), fd);
   4285	memset(info, 0, sizeof(*info));
   4286
   4287	fp = fopen(file, "r");
   4288	if (!fp) {
   4289		err = -errno;
   4290		pr_warn("failed to open %s: %d. No procfs support?\n", file,
   4291			err);
   4292		return err;
   4293	}
   4294
   4295	while (fgets(buff, sizeof(buff), fp)) {
   4296		if (sscanf(buff, "map_type:\t%u", &val) == 1)
   4297			info->type = val;
   4298		else if (sscanf(buff, "key_size:\t%u", &val) == 1)
   4299			info->key_size = val;
   4300		else if (sscanf(buff, "value_size:\t%u", &val) == 1)
   4301			info->value_size = val;
   4302		else if (sscanf(buff, "max_entries:\t%u", &val) == 1)
   4303			info->max_entries = val;
   4304		else if (sscanf(buff, "map_flags:\t%i", &val) == 1)
   4305			info->map_flags = val;
   4306	}
   4307
   4308	fclose(fp);
   4309
   4310	return 0;
   4311}
   4312
   4313bool bpf_map__autocreate(const struct bpf_map *map)
   4314{
   4315	return map->autocreate;
   4316}
   4317
   4318int bpf_map__set_autocreate(struct bpf_map *map, bool autocreate)
   4319{
   4320	if (map->obj->loaded)
   4321		return libbpf_err(-EBUSY);
   4322
   4323	map->autocreate = autocreate;
   4324	return 0;
   4325}
   4326
   4327int bpf_map__reuse_fd(struct bpf_map *map, int fd)
   4328{
   4329	struct bpf_map_info info = {};
   4330	__u32 len = sizeof(info);
   4331	int new_fd, err;
   4332	char *new_name;
   4333
   4334	err = bpf_obj_get_info_by_fd(fd, &info, &len);
   4335	if (err && errno == EINVAL)
   4336		err = bpf_get_map_info_from_fdinfo(fd, &info);
   4337	if (err)
   4338		return libbpf_err(err);
   4339
   4340	new_name = strdup(info.name);
   4341	if (!new_name)
   4342		return libbpf_err(-errno);
   4343
   4344	new_fd = open("/", O_RDONLY | O_CLOEXEC);
   4345	if (new_fd < 0) {
   4346		err = -errno;
   4347		goto err_free_new_name;
   4348	}
   4349
   4350	new_fd = dup3(fd, new_fd, O_CLOEXEC);
   4351	if (new_fd < 0) {
   4352		err = -errno;
   4353		goto err_close_new_fd;
   4354	}
   4355
   4356	err = zclose(map->fd);
   4357	if (err) {
   4358		err = -errno;
   4359		goto err_close_new_fd;
   4360	}
   4361	free(map->name);
   4362
   4363	map->fd = new_fd;
   4364	map->name = new_name;
   4365	map->def.type = info.type;
   4366	map->def.key_size = info.key_size;
   4367	map->def.value_size = info.value_size;
   4368	map->def.max_entries = info.max_entries;
   4369	map->def.map_flags = info.map_flags;
   4370	map->btf_key_type_id = info.btf_key_type_id;
   4371	map->btf_value_type_id = info.btf_value_type_id;
   4372	map->reused = true;
   4373	map->map_extra = info.map_extra;
   4374
   4375	return 0;
   4376
   4377err_close_new_fd:
   4378	close(new_fd);
   4379err_free_new_name:
   4380	free(new_name);
   4381	return libbpf_err(err);
   4382}
   4383
   4384__u32 bpf_map__max_entries(const struct bpf_map *map)
   4385{
   4386	return map->def.max_entries;
   4387}
   4388
   4389struct bpf_map *bpf_map__inner_map(struct bpf_map *map)
   4390{
   4391	if (!bpf_map_type__is_map_in_map(map->def.type))
   4392		return errno = EINVAL, NULL;
   4393
   4394	return map->inner_map;
   4395}
   4396
   4397int bpf_map__set_max_entries(struct bpf_map *map, __u32 max_entries)
   4398{
   4399	if (map->fd >= 0)
   4400		return libbpf_err(-EBUSY);
   4401	map->def.max_entries = max_entries;
   4402	return 0;
   4403}
   4404
   4405int bpf_map__resize(struct bpf_map *map, __u32 max_entries)
   4406{
   4407	if (!map || !max_entries)
   4408		return libbpf_err(-EINVAL);
   4409
   4410	return bpf_map__set_max_entries(map, max_entries);
   4411}
   4412
   4413static int
   4414bpf_object__probe_loading(struct bpf_object *obj)
   4415{
   4416	char *cp, errmsg[STRERR_BUFSIZE];
   4417	struct bpf_insn insns[] = {
   4418		BPF_MOV64_IMM(BPF_REG_0, 0),
   4419		BPF_EXIT_INSN(),
   4420	};
   4421	int ret, insn_cnt = ARRAY_SIZE(insns);
   4422
   4423	if (obj->gen_loader)
   4424		return 0;
   4425
   4426	ret = bump_rlimit_memlock();
   4427	if (ret)
   4428		pr_warn("Failed to bump RLIMIT_MEMLOCK (err = %d), you might need to do it explicitly!\n", ret);
   4429
   4430	/* make sure basic loading works */
   4431	ret = bpf_prog_load(BPF_PROG_TYPE_SOCKET_FILTER, NULL, "GPL", insns, insn_cnt, NULL);
   4432	if (ret < 0)
   4433		ret = bpf_prog_load(BPF_PROG_TYPE_TRACEPOINT, NULL, "GPL", insns, insn_cnt, NULL);
   4434	if (ret < 0) {
   4435		ret = errno;
   4436		cp = libbpf_strerror_r(ret, errmsg, sizeof(errmsg));
   4437		pr_warn("Error in %s():%s(%d). Couldn't load trivial BPF "
   4438			"program. Make sure your kernel supports BPF "
   4439			"(CONFIG_BPF_SYSCALL=y) and/or that RLIMIT_MEMLOCK is "
   4440			"set to big enough value.\n", __func__, cp, ret);
   4441		return -ret;
   4442	}
   4443	close(ret);
   4444
   4445	return 0;
   4446}
   4447
   4448static int probe_fd(int fd)
   4449{
   4450	if (fd >= 0)
   4451		close(fd);
   4452	return fd >= 0;
   4453}
   4454
   4455static int probe_kern_prog_name(void)
   4456{
   4457	struct bpf_insn insns[] = {
   4458		BPF_MOV64_IMM(BPF_REG_0, 0),
   4459		BPF_EXIT_INSN(),
   4460	};
   4461	int ret, insn_cnt = ARRAY_SIZE(insns);
   4462
   4463	/* make sure loading with name works */
   4464	ret = bpf_prog_load(BPF_PROG_TYPE_SOCKET_FILTER, "test", "GPL", insns, insn_cnt, NULL);
   4465	return probe_fd(ret);
   4466}
   4467
   4468static int probe_kern_global_data(void)
   4469{
   4470	char *cp, errmsg[STRERR_BUFSIZE];
   4471	struct bpf_insn insns[] = {
   4472		BPF_LD_MAP_VALUE(BPF_REG_1, 0, 16),
   4473		BPF_ST_MEM(BPF_DW, BPF_REG_1, 0, 42),
   4474		BPF_MOV64_IMM(BPF_REG_0, 0),
   4475		BPF_EXIT_INSN(),
   4476	};
   4477	int ret, map, insn_cnt = ARRAY_SIZE(insns);
   4478
   4479	map = bpf_map_create(BPF_MAP_TYPE_ARRAY, NULL, sizeof(int), 32, 1, NULL);
   4480	if (map < 0) {
   4481		ret = -errno;
   4482		cp = libbpf_strerror_r(ret, errmsg, sizeof(errmsg));
   4483		pr_warn("Error in %s():%s(%d). Couldn't create simple array map.\n",
   4484			__func__, cp, -ret);
   4485		return ret;
   4486	}
   4487
   4488	insns[0].imm = map;
   4489
   4490	ret = bpf_prog_load(BPF_PROG_TYPE_SOCKET_FILTER, NULL, "GPL", insns, insn_cnt, NULL);
   4491	close(map);
   4492	return probe_fd(ret);
   4493}
   4494
   4495static int probe_kern_btf(void)
   4496{
   4497	static const char strs[] = "\0int";
   4498	__u32 types[] = {
   4499		/* int */
   4500		BTF_TYPE_INT_ENC(1, BTF_INT_SIGNED, 0, 32, 4),
   4501	};
   4502
   4503	return probe_fd(libbpf__load_raw_btf((char *)types, sizeof(types),
   4504					     strs, sizeof(strs)));
   4505}
   4506
   4507static int probe_kern_btf_func(void)
   4508{
   4509	static const char strs[] = "\0int\0x\0a";
   4510	/* void x(int a) {} */
   4511	__u32 types[] = {
   4512		/* int */
   4513		BTF_TYPE_INT_ENC(1, BTF_INT_SIGNED, 0, 32, 4),  /* [1] */
   4514		/* FUNC_PROTO */                                /* [2] */
   4515		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_FUNC_PROTO, 0, 1), 0),
   4516		BTF_PARAM_ENC(7, 1),
   4517		/* FUNC x */                                    /* [3] */
   4518		BTF_TYPE_ENC(5, BTF_INFO_ENC(BTF_KIND_FUNC, 0, 0), 2),
   4519	};
   4520
   4521	return probe_fd(libbpf__load_raw_btf((char *)types, sizeof(types),
   4522					     strs, sizeof(strs)));
   4523}
   4524
   4525static int probe_kern_btf_func_global(void)
   4526{
   4527	static const char strs[] = "\0int\0x\0a";
   4528	/* static void x(int a) {} */
   4529	__u32 types[] = {
   4530		/* int */
   4531		BTF_TYPE_INT_ENC(1, BTF_INT_SIGNED, 0, 32, 4),  /* [1] */
   4532		/* FUNC_PROTO */                                /* [2] */
   4533		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_FUNC_PROTO, 0, 1), 0),
   4534		BTF_PARAM_ENC(7, 1),
   4535		/* FUNC x BTF_FUNC_GLOBAL */                    /* [3] */
   4536		BTF_TYPE_ENC(5, BTF_INFO_ENC(BTF_KIND_FUNC, 0, BTF_FUNC_GLOBAL), 2),
   4537	};
   4538
   4539	return probe_fd(libbpf__load_raw_btf((char *)types, sizeof(types),
   4540					     strs, sizeof(strs)));
   4541}
   4542
   4543static int probe_kern_btf_datasec(void)
   4544{
   4545	static const char strs[] = "\0x\0.data";
   4546	/* static int a; */
   4547	__u32 types[] = {
   4548		/* int */
   4549		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),  /* [1] */
   4550		/* VAR x */                                     /* [2] */
   4551		BTF_TYPE_ENC(1, BTF_INFO_ENC(BTF_KIND_VAR, 0, 0), 1),
   4552		BTF_VAR_STATIC,
   4553		/* DATASEC val */                               /* [3] */
   4554		BTF_TYPE_ENC(3, BTF_INFO_ENC(BTF_KIND_DATASEC, 0, 1), 4),
   4555		BTF_VAR_SECINFO_ENC(2, 0, 4),
   4556	};
   4557
   4558	return probe_fd(libbpf__load_raw_btf((char *)types, sizeof(types),
   4559					     strs, sizeof(strs)));
   4560}
   4561
   4562static int probe_kern_btf_float(void)
   4563{
   4564	static const char strs[] = "\0float";
   4565	__u32 types[] = {
   4566		/* float */
   4567		BTF_TYPE_FLOAT_ENC(1, 4),
   4568	};
   4569
   4570	return probe_fd(libbpf__load_raw_btf((char *)types, sizeof(types),
   4571					     strs, sizeof(strs)));
   4572}
   4573
   4574static int probe_kern_btf_decl_tag(void)
   4575{
   4576	static const char strs[] = "\0tag";
   4577	__u32 types[] = {
   4578		/* int */
   4579		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),  /* [1] */
   4580		/* VAR x */                                     /* [2] */
   4581		BTF_TYPE_ENC(1, BTF_INFO_ENC(BTF_KIND_VAR, 0, 0), 1),
   4582		BTF_VAR_STATIC,
   4583		/* attr */
   4584		BTF_TYPE_DECL_TAG_ENC(1, 2, -1),
   4585	};
   4586
   4587	return probe_fd(libbpf__load_raw_btf((char *)types, sizeof(types),
   4588					     strs, sizeof(strs)));
   4589}
   4590
   4591static int probe_kern_btf_type_tag(void)
   4592{
   4593	static const char strs[] = "\0tag";
   4594	__u32 types[] = {
   4595		/* int */
   4596		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),		/* [1] */
   4597		/* attr */
   4598		BTF_TYPE_TYPE_TAG_ENC(1, 1),				/* [2] */
   4599		/* ptr */
   4600		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_PTR, 0, 0), 2),	/* [3] */
   4601	};
   4602
   4603	return probe_fd(libbpf__load_raw_btf((char *)types, sizeof(types),
   4604					     strs, sizeof(strs)));
   4605}
   4606
   4607static int probe_kern_array_mmap(void)
   4608{
   4609	LIBBPF_OPTS(bpf_map_create_opts, opts, .map_flags = BPF_F_MMAPABLE);
   4610	int fd;
   4611
   4612	fd = bpf_map_create(BPF_MAP_TYPE_ARRAY, NULL, sizeof(int), sizeof(int), 1, &opts);
   4613	return probe_fd(fd);
   4614}
   4615
   4616static int probe_kern_exp_attach_type(void)
   4617{
   4618	LIBBPF_OPTS(bpf_prog_load_opts, opts, .expected_attach_type = BPF_CGROUP_INET_SOCK_CREATE);
   4619	struct bpf_insn insns[] = {
   4620		BPF_MOV64_IMM(BPF_REG_0, 0),
   4621		BPF_EXIT_INSN(),
   4622	};
   4623	int fd, insn_cnt = ARRAY_SIZE(insns);
   4624
   4625	/* use any valid combination of program type and (optional)
   4626	 * non-zero expected attach type (i.e., not a BPF_CGROUP_INET_INGRESS)
   4627	 * to see if kernel supports expected_attach_type field for
   4628	 * BPF_PROG_LOAD command
   4629	 */
   4630	fd = bpf_prog_load(BPF_PROG_TYPE_CGROUP_SOCK, NULL, "GPL", insns, insn_cnt, &opts);
   4631	return probe_fd(fd);
   4632}
   4633
   4634static int probe_kern_probe_read_kernel(void)
   4635{
   4636	struct bpf_insn insns[] = {
   4637		BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),	/* r1 = r10 (fp) */
   4638		BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8),	/* r1 += -8 */
   4639		BPF_MOV64_IMM(BPF_REG_2, 8),		/* r2 = 8 */
   4640		BPF_MOV64_IMM(BPF_REG_3, 0),		/* r3 = 0 */
   4641		BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_probe_read_kernel),
   4642		BPF_EXIT_INSN(),
   4643	};
   4644	int fd, insn_cnt = ARRAY_SIZE(insns);
   4645
   4646	fd = bpf_prog_load(BPF_PROG_TYPE_TRACEPOINT, NULL, "GPL", insns, insn_cnt, NULL);
   4647	return probe_fd(fd);
   4648}
   4649
   4650static int probe_prog_bind_map(void)
   4651{
   4652	char *cp, errmsg[STRERR_BUFSIZE];
   4653	struct bpf_insn insns[] = {
   4654		BPF_MOV64_IMM(BPF_REG_0, 0),
   4655		BPF_EXIT_INSN(),
   4656	};
   4657	int ret, map, prog, insn_cnt = ARRAY_SIZE(insns);
   4658
   4659	map = bpf_map_create(BPF_MAP_TYPE_ARRAY, NULL, sizeof(int), 32, 1, NULL);
   4660	if (map < 0) {
   4661		ret = -errno;
   4662		cp = libbpf_strerror_r(ret, errmsg, sizeof(errmsg));
   4663		pr_warn("Error in %s():%s(%d). Couldn't create simple array map.\n",
   4664			__func__, cp, -ret);
   4665		return ret;
   4666	}
   4667
   4668	prog = bpf_prog_load(BPF_PROG_TYPE_SOCKET_FILTER, NULL, "GPL", insns, insn_cnt, NULL);
   4669	if (prog < 0) {
   4670		close(map);
   4671		return 0;
   4672	}
   4673
   4674	ret = bpf_prog_bind_map(prog, map, NULL);
   4675
   4676	close(map);
   4677	close(prog);
   4678
   4679	return ret >= 0;
   4680}
   4681
   4682static int probe_module_btf(void)
   4683{
   4684	static const char strs[] = "\0int";
   4685	__u32 types[] = {
   4686		/* int */
   4687		BTF_TYPE_INT_ENC(1, BTF_INT_SIGNED, 0, 32, 4),
   4688	};
   4689	struct bpf_btf_info info;
   4690	__u32 len = sizeof(info);
   4691	char name[16];
   4692	int fd, err;
   4693
   4694	fd = libbpf__load_raw_btf((char *)types, sizeof(types), strs, sizeof(strs));
   4695	if (fd < 0)
   4696		return 0; /* BTF not supported at all */
   4697
   4698	memset(&info, 0, sizeof(info));
   4699	info.name = ptr_to_u64(name);
   4700	info.name_len = sizeof(name);
   4701
   4702	/* check that BPF_OBJ_GET_INFO_BY_FD supports specifying name pointer;
   4703	 * kernel's module BTF support coincides with support for
   4704	 * name/name_len fields in struct bpf_btf_info.
   4705	 */
   4706	err = bpf_obj_get_info_by_fd(fd, &info, &len);
   4707	close(fd);
   4708	return !err;
   4709}
   4710
   4711static int probe_perf_link(void)
   4712{
   4713	struct bpf_insn insns[] = {
   4714		BPF_MOV64_IMM(BPF_REG_0, 0),
   4715		BPF_EXIT_INSN(),
   4716	};
   4717	int prog_fd, link_fd, err;
   4718
   4719	prog_fd = bpf_prog_load(BPF_PROG_TYPE_TRACEPOINT, NULL, "GPL",
   4720				insns, ARRAY_SIZE(insns), NULL);
   4721	if (prog_fd < 0)
   4722		return -errno;
   4723
   4724	/* use invalid perf_event FD to get EBADF, if link is supported;
   4725	 * otherwise EINVAL should be returned
   4726	 */
   4727	link_fd = bpf_link_create(prog_fd, -1, BPF_PERF_EVENT, NULL);
   4728	err = -errno; /* close() can clobber errno */
   4729
   4730	if (link_fd >= 0)
   4731		close(link_fd);
   4732	close(prog_fd);
   4733
   4734	return link_fd < 0 && err == -EBADF;
   4735}
   4736
   4737static int probe_kern_bpf_cookie(void)
   4738{
   4739	struct bpf_insn insns[] = {
   4740		BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_attach_cookie),
   4741		BPF_EXIT_INSN(),
   4742	};
   4743	int ret, insn_cnt = ARRAY_SIZE(insns);
   4744
   4745	ret = bpf_prog_load(BPF_PROG_TYPE_KPROBE, NULL, "GPL", insns, insn_cnt, NULL);
   4746	return probe_fd(ret);
   4747}
   4748
   4749enum kern_feature_result {
   4750	FEAT_UNKNOWN = 0,
   4751	FEAT_SUPPORTED = 1,
   4752	FEAT_MISSING = 2,
   4753};
   4754
   4755typedef int (*feature_probe_fn)(void);
   4756
   4757static struct kern_feature_desc {
   4758	const char *desc;
   4759	feature_probe_fn probe;
   4760	enum kern_feature_result res;
   4761} feature_probes[__FEAT_CNT] = {
   4762	[FEAT_PROG_NAME] = {
   4763		"BPF program name", probe_kern_prog_name,
   4764	},
   4765	[FEAT_GLOBAL_DATA] = {
   4766		"global variables", probe_kern_global_data,
   4767	},
   4768	[FEAT_BTF] = {
   4769		"minimal BTF", probe_kern_btf,
   4770	},
   4771	[FEAT_BTF_FUNC] = {
   4772		"BTF functions", probe_kern_btf_func,
   4773	},
   4774	[FEAT_BTF_GLOBAL_FUNC] = {
   4775		"BTF global function", probe_kern_btf_func_global,
   4776	},
   4777	[FEAT_BTF_DATASEC] = {
   4778		"BTF data section and variable", probe_kern_btf_datasec,
   4779	},
   4780	[FEAT_ARRAY_MMAP] = {
   4781		"ARRAY map mmap()", probe_kern_array_mmap,
   4782	},
   4783	[FEAT_EXP_ATTACH_TYPE] = {
   4784		"BPF_PROG_LOAD expected_attach_type attribute",
   4785		probe_kern_exp_attach_type,
   4786	},
   4787	[FEAT_PROBE_READ_KERN] = {
   4788		"bpf_probe_read_kernel() helper", probe_kern_probe_read_kernel,
   4789	},
   4790	[FEAT_PROG_BIND_MAP] = {
   4791		"BPF_PROG_BIND_MAP support", probe_prog_bind_map,
   4792	},
   4793	[FEAT_MODULE_BTF] = {
   4794		"module BTF support", probe_module_btf,
   4795	},
   4796	[FEAT_BTF_FLOAT] = {
   4797		"BTF_KIND_FLOAT support", probe_kern_btf_float,
   4798	},
   4799	[FEAT_PERF_LINK] = {
   4800		"BPF perf link support", probe_perf_link,
   4801	},
   4802	[FEAT_BTF_DECL_TAG] = {
   4803		"BTF_KIND_DECL_TAG support", probe_kern_btf_decl_tag,
   4804	},
   4805	[FEAT_BTF_TYPE_TAG] = {
   4806		"BTF_KIND_TYPE_TAG support", probe_kern_btf_type_tag,
   4807	},
   4808	[FEAT_MEMCG_ACCOUNT] = {
   4809		"memcg-based memory accounting", probe_memcg_account,
   4810	},
   4811	[FEAT_BPF_COOKIE] = {
   4812		"BPF cookie support", probe_kern_bpf_cookie,
   4813	},
   4814};
   4815
   4816bool kernel_supports(const struct bpf_object *obj, enum kern_feature_id feat_id)
   4817{
   4818	struct kern_feature_desc *feat = &feature_probes[feat_id];
   4819	int ret;
   4820
   4821	if (obj && obj->gen_loader)
   4822		/* To generate loader program assume the latest kernel
   4823		 * to avoid doing extra prog_load, map_create syscalls.
   4824		 */
   4825		return true;
   4826
   4827	if (READ_ONCE(feat->res) == FEAT_UNKNOWN) {
   4828		ret = feat->probe();
   4829		if (ret > 0) {
   4830			WRITE_ONCE(feat->res, FEAT_SUPPORTED);
   4831		} else if (ret == 0) {
   4832			WRITE_ONCE(feat->res, FEAT_MISSING);
   4833		} else {
   4834			pr_warn("Detection of kernel %s support failed: %d\n", feat->desc, ret);
   4835			WRITE_ONCE(feat->res, FEAT_MISSING);
   4836		}
   4837	}
   4838
   4839	return READ_ONCE(feat->res) == FEAT_SUPPORTED;
   4840}
   4841
   4842static bool map_is_reuse_compat(const struct bpf_map *map, int map_fd)
   4843{
   4844	struct bpf_map_info map_info = {};
   4845	char msg[STRERR_BUFSIZE];
   4846	__u32 map_info_len;
   4847	int err;
   4848
   4849	map_info_len = sizeof(map_info);
   4850
   4851	err = bpf_obj_get_info_by_fd(map_fd, &map_info, &map_info_len);
   4852	if (err && errno == EINVAL)
   4853		err = bpf_get_map_info_from_fdinfo(map_fd, &map_info);
   4854	if (err) {
   4855		pr_warn("failed to get map info for map FD %d: %s\n", map_fd,
   4856			libbpf_strerror_r(errno, msg, sizeof(msg)));
   4857		return false;
   4858	}
   4859
   4860	return (map_info.type == map->def.type &&
   4861		map_info.key_size == map->def.key_size &&
   4862		map_info.value_size == map->def.value_size &&
   4863		map_info.max_entries == map->def.max_entries &&
   4864		map_info.map_flags == map->def.map_flags &&
   4865		map_info.map_extra == map->map_extra);
   4866}
   4867
   4868static int
   4869bpf_object__reuse_map(struct bpf_map *map)
   4870{
   4871	char *cp, errmsg[STRERR_BUFSIZE];
   4872	int err, pin_fd;
   4873
   4874	pin_fd = bpf_obj_get(map->pin_path);
   4875	if (pin_fd < 0) {
   4876		err = -errno;
   4877		if (err == -ENOENT) {
   4878			pr_debug("found no pinned map to reuse at '%s'\n",
   4879				 map->pin_path);
   4880			return 0;
   4881		}
   4882
   4883		cp = libbpf_strerror_r(-err, errmsg, sizeof(errmsg));
   4884		pr_warn("couldn't retrieve pinned map '%s': %s\n",
   4885			map->pin_path, cp);
   4886		return err;
   4887	}
   4888
   4889	if (!map_is_reuse_compat(map, pin_fd)) {
   4890		pr_warn("couldn't reuse pinned map at '%s': parameter mismatch\n",
   4891			map->pin_path);
   4892		close(pin_fd);
   4893		return -EINVAL;
   4894	}
   4895
   4896	err = bpf_map__reuse_fd(map, pin_fd);
   4897	close(pin_fd);
   4898	if (err) {
   4899		return err;
   4900	}
   4901	map->pinned = true;
   4902	pr_debug("reused pinned map at '%s'\n", map->pin_path);
   4903
   4904	return 0;
   4905}
   4906
   4907static int
   4908bpf_object__populate_internal_map(struct bpf_object *obj, struct bpf_map *map)
   4909{
   4910	enum libbpf_map_type map_type = map->libbpf_type;
   4911	char *cp, errmsg[STRERR_BUFSIZE];
   4912	int err, zero = 0;
   4913
   4914	if (obj->gen_loader) {
   4915		bpf_gen__map_update_elem(obj->gen_loader, map - obj->maps,
   4916					 map->mmaped, map->def.value_size);
   4917		if (map_type == LIBBPF_MAP_RODATA || map_type == LIBBPF_MAP_KCONFIG)
   4918			bpf_gen__map_freeze(obj->gen_loader, map - obj->maps);
   4919		return 0;
   4920	}
   4921	err = bpf_map_update_elem(map->fd, &zero, map->mmaped, 0);
   4922	if (err) {
   4923		err = -errno;
   4924		cp = libbpf_strerror_r(err, errmsg, sizeof(errmsg));
   4925		pr_warn("Error setting initial map(%s) contents: %s\n",
   4926			map->name, cp);
   4927		return err;
   4928	}
   4929
   4930	/* Freeze .rodata and .kconfig map as read-only from syscall side. */
   4931	if (map_type == LIBBPF_MAP_RODATA || map_type == LIBBPF_MAP_KCONFIG) {
   4932		err = bpf_map_freeze(map->fd);
   4933		if (err) {
   4934			err = -errno;
   4935			cp = libbpf_strerror_r(err, errmsg, sizeof(errmsg));
   4936			pr_warn("Error freezing map(%s) as read-only: %s\n",
   4937				map->name, cp);
   4938			return err;
   4939		}
   4940	}
   4941	return 0;
   4942}
   4943
   4944static void bpf_map__destroy(struct bpf_map *map);
   4945
   4946static bool is_pow_of_2(size_t x)
   4947{
   4948	return x && (x & (x - 1));
   4949}
   4950
   4951static size_t adjust_ringbuf_sz(size_t sz)
   4952{
   4953	__u32 page_sz = sysconf(_SC_PAGE_SIZE);
   4954	__u32 mul;
   4955
   4956	/* if user forgot to set any size, make sure they see error */
   4957	if (sz == 0)
   4958		return 0;
   4959	/* Kernel expects BPF_MAP_TYPE_RINGBUF's max_entries to be
   4960	 * a power-of-2 multiple of kernel's page size. If user diligently
   4961	 * satisified these conditions, pass the size through.
   4962	 */
   4963	if ((sz % page_sz) == 0 && is_pow_of_2(sz / page_sz))
   4964		return sz;
   4965
   4966	/* Otherwise find closest (page_sz * power_of_2) product bigger than
   4967	 * user-set size to satisfy both user size request and kernel
   4968	 * requirements and substitute correct max_entries for map creation.
   4969	 */
   4970	for (mul = 1; mul <= UINT_MAX / page_sz; mul <<= 1) {
   4971		if (mul * page_sz > sz)
   4972			return mul * page_sz;
   4973	}
   4974
   4975	/* if it's impossible to satisfy the conditions (i.e., user size is
   4976	 * very close to UINT_MAX but is not a power-of-2 multiple of
   4977	 * page_size) then just return original size and let kernel reject it
   4978	 */
   4979	return sz;
   4980}
   4981
   4982static int bpf_object__create_map(struct bpf_object *obj, struct bpf_map *map, bool is_inner)
   4983{
   4984	LIBBPF_OPTS(bpf_map_create_opts, create_attr);
   4985	struct bpf_map_def *def = &map->def;
   4986	const char *map_name = NULL;
   4987	int err = 0;
   4988
   4989	if (kernel_supports(obj, FEAT_PROG_NAME))
   4990		map_name = map->name;
   4991	create_attr.map_ifindex = map->map_ifindex;
   4992	create_attr.map_flags = def->map_flags;
   4993	create_attr.numa_node = map->numa_node;
   4994	create_attr.map_extra = map->map_extra;
   4995
   4996	if (bpf_map__is_struct_ops(map))
   4997		create_attr.btf_vmlinux_value_type_id = map->btf_vmlinux_value_type_id;
   4998
   4999	if (obj->btf && btf__fd(obj->btf) >= 0) {
   5000		create_attr.btf_fd = btf__fd(obj->btf);
   5001		create_attr.btf_key_type_id = map->btf_key_type_id;
   5002		create_attr.btf_value_type_id = map->btf_value_type_id;
   5003	}
   5004
   5005	if (bpf_map_type__is_map_in_map(def->type)) {
   5006		if (map->inner_map) {
   5007			err = bpf_object__create_map(obj, map->inner_map, true);
   5008			if (err) {
   5009				pr_warn("map '%s': failed to create inner map: %d\n",
   5010					map->name, err);
   5011				return err;
   5012			}
   5013			map->inner_map_fd = bpf_map__fd(map->inner_map);
   5014		}
   5015		if (map->inner_map_fd >= 0)
   5016			create_attr.inner_map_fd = map->inner_map_fd;
   5017	}
   5018
   5019	switch (def->type) {
   5020	case BPF_MAP_TYPE_RINGBUF:
   5021		map->def.max_entries = adjust_ringbuf_sz(map->def.max_entries);
   5022		/* fallthrough */
   5023	case BPF_MAP_TYPE_PERF_EVENT_ARRAY:
   5024	case BPF_MAP_TYPE_CGROUP_ARRAY:
   5025	case BPF_MAP_TYPE_STACK_TRACE:
   5026	case BPF_MAP_TYPE_ARRAY_OF_MAPS:
   5027	case BPF_MAP_TYPE_HASH_OF_MAPS:
   5028	case BPF_MAP_TYPE_DEVMAP:
   5029	case BPF_MAP_TYPE_DEVMAP_HASH:
   5030	case BPF_MAP_TYPE_CPUMAP:
   5031	case BPF_MAP_TYPE_XSKMAP:
   5032	case BPF_MAP_TYPE_SOCKMAP:
   5033	case BPF_MAP_TYPE_SOCKHASH:
   5034	case BPF_MAP_TYPE_QUEUE:
   5035	case BPF_MAP_TYPE_STACK:
   5036		create_attr.btf_fd = 0;
   5037		create_attr.btf_key_type_id = 0;
   5038		create_attr.btf_value_type_id = 0;
   5039		map->btf_key_type_id = 0;
   5040		map->btf_value_type_id = 0;
   5041	default:
   5042		break;
   5043	}
   5044
   5045	if (obj->gen_loader) {
   5046		bpf_gen__map_create(obj->gen_loader, def->type, map_name,
   5047				    def->key_size, def->value_size, def->max_entries,
   5048				    &create_attr, is_inner ? -1 : map - obj->maps);
   5049		/* Pretend to have valid FD to pass various fd >= 0 checks.
   5050		 * This fd == 0 will not be used with any syscall and will be reset to -1 eventually.
   5051		 */
   5052		map->fd = 0;
   5053	} else {
   5054		map->fd = bpf_map_create(def->type, map_name,
   5055					 def->key_size, def->value_size,
   5056					 def->max_entries, &create_attr);
   5057	}
   5058	if (map->fd < 0 && (create_attr.btf_key_type_id ||
   5059			    create_attr.btf_value_type_id)) {
   5060		char *cp, errmsg[STRERR_BUFSIZE];
   5061
   5062		err = -errno;
   5063		cp = libbpf_strerror_r(err, errmsg, sizeof(errmsg));
   5064		pr_warn("Error in bpf_create_map_xattr(%s):%s(%d). Retrying without BTF.\n",
   5065			map->name, cp, err);
   5066		create_attr.btf_fd = 0;
   5067		create_attr.btf_key_type_id = 0;
   5068		create_attr.btf_value_type_id = 0;
   5069		map->btf_key_type_id = 0;
   5070		map->btf_value_type_id = 0;
   5071		map->fd = bpf_map_create(def->type, map_name,
   5072					 def->key_size, def->value_size,
   5073					 def->max_entries, &create_attr);
   5074	}
   5075
   5076	err = map->fd < 0 ? -errno : 0;
   5077
   5078	if (bpf_map_type__is_map_in_map(def->type) && map->inner_map) {
   5079		if (obj->gen_loader)
   5080			map->inner_map->fd = -1;
   5081		bpf_map__destroy(map->inner_map);
   5082		zfree(&map->inner_map);
   5083	}
   5084
   5085	return err;
   5086}
   5087
   5088static int init_map_in_map_slots(struct bpf_object *obj, struct bpf_map *map)
   5089{
   5090	const struct bpf_map *targ_map;
   5091	unsigned int i;
   5092	int fd, err = 0;
   5093
   5094	for (i = 0; i < map->init_slots_sz; i++) {
   5095		if (!map->init_slots[i])
   5096			continue;
   5097
   5098		targ_map = map->init_slots[i];
   5099		fd = bpf_map__fd(targ_map);
   5100
   5101		if (obj->gen_loader) {
   5102			bpf_gen__populate_outer_map(obj->gen_loader,
   5103						    map - obj->maps, i,
   5104						    targ_map - obj->maps);
   5105		} else {
   5106			err = bpf_map_update_elem(map->fd, &i, &fd, 0);
   5107		}
   5108		if (err) {
   5109			err = -errno;
   5110			pr_warn("map '%s': failed to initialize slot [%d] to map '%s' fd=%d: %d\n",
   5111				map->name, i, targ_map->name, fd, err);
   5112			return err;
   5113		}
   5114		pr_debug("map '%s': slot [%d] set to map '%s' fd=%d\n",
   5115			 map->name, i, targ_map->name, fd);
   5116	}
   5117
   5118	zfree(&map->init_slots);
   5119	map->init_slots_sz = 0;
   5120
   5121	return 0;
   5122}
   5123
   5124static int init_prog_array_slots(struct bpf_object *obj, struct bpf_map *map)
   5125{
   5126	const struct bpf_program *targ_prog;
   5127	unsigned int i;
   5128	int fd, err;
   5129
   5130	if (obj->gen_loader)
   5131		return -ENOTSUP;
   5132
   5133	for (i = 0; i < map->init_slots_sz; i++) {
   5134		if (!map->init_slots[i])
   5135			continue;
   5136
   5137		targ_prog = map->init_slots[i];
   5138		fd = bpf_program__fd(targ_prog);
   5139
   5140		err = bpf_map_update_elem(map->fd, &i, &fd, 0);
   5141		if (err) {
   5142			err = -errno;
   5143			pr_warn("map '%s': failed to initialize slot [%d] to prog '%s' fd=%d: %d\n",
   5144				map->name, i, targ_prog->name, fd, err);
   5145			return err;
   5146		}
   5147		pr_debug("map '%s': slot [%d] set to prog '%s' fd=%d\n",
   5148			 map->name, i, targ_prog->name, fd);
   5149	}
   5150
   5151	zfree(&map->init_slots);
   5152	map->init_slots_sz = 0;
   5153
   5154	return 0;
   5155}
   5156
   5157static int bpf_object_init_prog_arrays(struct bpf_object *obj)
   5158{
   5159	struct bpf_map *map;
   5160	int i, err;
   5161
   5162	for (i = 0; i < obj->nr_maps; i++) {
   5163		map = &obj->maps[i];
   5164
   5165		if (!map->init_slots_sz || map->def.type != BPF_MAP_TYPE_PROG_ARRAY)
   5166			continue;
   5167
   5168		err = init_prog_array_slots(obj, map);
   5169		if (err < 0) {
   5170			zclose(map->fd);
   5171			return err;
   5172		}
   5173	}
   5174	return 0;
   5175}
   5176
   5177static int map_set_def_max_entries(struct bpf_map *map)
   5178{
   5179	if (map->def.type == BPF_MAP_TYPE_PERF_EVENT_ARRAY && !map->def.max_entries) {
   5180		int nr_cpus;
   5181
   5182		nr_cpus = libbpf_num_possible_cpus();
   5183		if (nr_cpus < 0) {
   5184			pr_warn("map '%s': failed to determine number of system CPUs: %d\n",
   5185				map->name, nr_cpus);
   5186			return nr_cpus;
   5187		}
   5188		pr_debug("map '%s': setting size to %d\n", map->name, nr_cpus);
   5189		map->def.max_entries = nr_cpus;
   5190	}
   5191
   5192	return 0;
   5193}
   5194
   5195static int
   5196bpf_object__create_maps(struct bpf_object *obj)
   5197{
   5198	struct bpf_map *map;
   5199	char *cp, errmsg[STRERR_BUFSIZE];
   5200	unsigned int i, j;
   5201	int err;
   5202	bool retried;
   5203
   5204	for (i = 0; i < obj->nr_maps; i++) {
   5205		map = &obj->maps[i];
   5206
   5207		/* To support old kernels, we skip creating global data maps
   5208		 * (.rodata, .data, .kconfig, etc); later on, during program
   5209		 * loading, if we detect that at least one of the to-be-loaded
   5210		 * programs is referencing any global data map, we'll error
   5211		 * out with program name and relocation index logged.
   5212		 * This approach allows to accommodate Clang emitting
   5213		 * unnecessary .rodata.str1.1 sections for string literals,
   5214		 * but also it allows to have CO-RE applications that use
   5215		 * global variables in some of BPF programs, but not others.
   5216		 * If those global variable-using programs are not loaded at
   5217		 * runtime due to bpf_program__set_autoload(prog, false),
   5218		 * bpf_object loading will succeed just fine even on old
   5219		 * kernels.
   5220		 */
   5221		if (bpf_map__is_internal(map) && !kernel_supports(obj, FEAT_GLOBAL_DATA))
   5222			map->autocreate = false;
   5223
   5224		if (!map->autocreate) {
   5225			pr_debug("map '%s': skipped auto-creating...\n", map->name);
   5226			continue;
   5227		}
   5228
   5229		err = map_set_def_max_entries(map);
   5230		if (err)
   5231			goto err_out;
   5232
   5233		retried = false;
   5234retry:
   5235		if (map->pin_path) {
   5236			err = bpf_object__reuse_map(map);
   5237			if (err) {
   5238				pr_warn("map '%s': error reusing pinned map\n",
   5239					map->name);
   5240				goto err_out;
   5241			}
   5242			if (retried && map->fd < 0) {
   5243				pr_warn("map '%s': cannot find pinned map\n",
   5244					map->name);
   5245				err = -ENOENT;
   5246				goto err_out;
   5247			}
   5248		}
   5249
   5250		if (map->fd >= 0) {
   5251			pr_debug("map '%s': skipping creation (preset fd=%d)\n",
   5252				 map->name, map->fd);
   5253		} else {
   5254			err = bpf_object__create_map(obj, map, false);
   5255			if (err)
   5256				goto err_out;
   5257
   5258			pr_debug("map '%s': created successfully, fd=%d\n",
   5259				 map->name, map->fd);
   5260
   5261			if (bpf_map__is_internal(map)) {
   5262				err = bpf_object__populate_internal_map(obj, map);
   5263				if (err < 0) {
   5264					zclose(map->fd);
   5265					goto err_out;
   5266				}
   5267			}
   5268
   5269			if (map->init_slots_sz && map->def.type != BPF_MAP_TYPE_PROG_ARRAY) {
   5270				err = init_map_in_map_slots(obj, map);
   5271				if (err < 0) {
   5272					zclose(map->fd);
   5273					goto err_out;
   5274				}
   5275			}
   5276		}
   5277
   5278		if (map->pin_path && !map->pinned) {
   5279			err = bpf_map__pin(map, NULL);
   5280			if (err) {
   5281				zclose(map->fd);
   5282				if (!retried && err == -EEXIST) {
   5283					retried = true;
   5284					goto retry;
   5285				}
   5286				pr_warn("map '%s': failed to auto-pin at '%s': %d\n",
   5287					map->name, map->pin_path, err);
   5288				goto err_out;
   5289			}
   5290		}
   5291	}
   5292
   5293	return 0;
   5294
   5295err_out:
   5296	cp = libbpf_strerror_r(err, errmsg, sizeof(errmsg));
   5297	pr_warn("map '%s': failed to create: %s(%d)\n", map->name, cp, err);
   5298	pr_perm_msg(err);
   5299	for (j = 0; j < i; j++)
   5300		zclose(obj->maps[j].fd);
   5301	return err;
   5302}
   5303
   5304static bool bpf_core_is_flavor_sep(const char *s)
   5305{
   5306	/* check X___Y name pattern, where X and Y are not underscores */
   5307	return s[0] != '_' &&				      /* X */
   5308	       s[1] == '_' && s[2] == '_' && s[3] == '_' &&   /* ___ */
   5309	       s[4] != '_';				      /* Y */
   5310}
   5311
   5312/* Given 'some_struct_name___with_flavor' return the length of a name prefix
   5313 * before last triple underscore. Struct name part after last triple
   5314 * underscore is ignored by BPF CO-RE relocation during relocation matching.
   5315 */
   5316size_t bpf_core_essential_name_len(const char *name)
   5317{
   5318	size_t n = strlen(name);
   5319	int i;
   5320
   5321	for (i = n - 5; i >= 0; i--) {
   5322		if (bpf_core_is_flavor_sep(name + i))
   5323			return i + 1;
   5324	}
   5325	return n;
   5326}
   5327
   5328void bpf_core_free_cands(struct bpf_core_cand_list *cands)
   5329{
   5330	if (!cands)
   5331		return;
   5332
   5333	free(cands->cands);
   5334	free(cands);
   5335}
   5336
   5337int bpf_core_add_cands(struct bpf_core_cand *local_cand,
   5338		       size_t local_essent_len,
   5339		       const struct btf *targ_btf,
   5340		       const char *targ_btf_name,
   5341		       int targ_start_id,
   5342		       struct bpf_core_cand_list *cands)
   5343{
   5344	struct bpf_core_cand *new_cands, *cand;
   5345	const struct btf_type *t, *local_t;
   5346	const char *targ_name, *local_name;
   5347	size_t targ_essent_len;
   5348	int n, i;
   5349
   5350	local_t = btf__type_by_id(local_cand->btf, local_cand->id);
   5351	local_name = btf__str_by_offset(local_cand->btf, local_t->name_off);
   5352
   5353	n = btf__type_cnt(targ_btf);
   5354	for (i = targ_start_id; i < n; i++) {
   5355		t = btf__type_by_id(targ_btf, i);
   5356		if (btf_kind(t) != btf_kind(local_t))
   5357			continue;
   5358
   5359		targ_name = btf__name_by_offset(targ_btf, t->name_off);
   5360		if (str_is_empty(targ_name))
   5361			continue;
   5362
   5363		targ_essent_len = bpf_core_essential_name_len(targ_name);
   5364		if (targ_essent_len != local_essent_len)
   5365			continue;
   5366
   5367		if (strncmp(local_name, targ_name, local_essent_len) != 0)
   5368			continue;
   5369
   5370		pr_debug("CO-RE relocating [%d] %s %s: found target candidate [%d] %s %s in [%s]\n",
   5371			 local_cand->id, btf_kind_str(local_t),
   5372			 local_name, i, btf_kind_str(t), targ_name,
   5373			 targ_btf_name);
   5374		new_cands = libbpf_reallocarray(cands->cands, cands->len + 1,
   5375					      sizeof(*cands->cands));
   5376		if (!new_cands)
   5377			return -ENOMEM;
   5378
   5379		cand = &new_cands[cands->len];
   5380		cand->btf = targ_btf;
   5381		cand->id = i;
   5382
   5383		cands->cands = new_cands;
   5384		cands->len++;
   5385	}
   5386	return 0;
   5387}
   5388
   5389static int load_module_btfs(struct bpf_object *obj)
   5390{
   5391	struct bpf_btf_info info;
   5392	struct module_btf *mod_btf;
   5393	struct btf *btf;
   5394	char name[64];
   5395	__u32 id = 0, len;
   5396	int err, fd;
   5397
   5398	if (obj->btf_modules_loaded)
   5399		return 0;
   5400
   5401	if (obj->gen_loader)
   5402		return 0;
   5403
   5404	/* don't do this again, even if we find no module BTFs */
   5405	obj->btf_modules_loaded = true;
   5406
   5407	/* kernel too old to support module BTFs */
   5408	if (!kernel_supports(obj, FEAT_MODULE_BTF))
   5409		return 0;
   5410
   5411	while (true) {
   5412		err = bpf_btf_get_next_id(id, &id);
   5413		if (err && errno == ENOENT)
   5414			return 0;
   5415		if (err) {
   5416			err = -errno;
   5417			pr_warn("failed to iterate BTF objects: %d\n", err);
   5418			return err;
   5419		}
   5420
   5421		fd = bpf_btf_get_fd_by_id(id);
   5422		if (fd < 0) {
   5423			if (errno == ENOENT)
   5424				continue; /* expected race: BTF was unloaded */
   5425			err = -errno;
   5426			pr_warn("failed to get BTF object #%d FD: %d\n", id, err);
   5427			return err;
   5428		}
   5429
   5430		len = sizeof(info);
   5431		memset(&info, 0, sizeof(info));
   5432		info.name = ptr_to_u64(name);
   5433		info.name_len = sizeof(name);
   5434
   5435		err = bpf_obj_get_info_by_fd(fd, &info, &len);
   5436		if (err) {
   5437			err = -errno;
   5438			pr_warn("failed to get BTF object #%d info: %d\n", id, err);
   5439			goto err_out;
   5440		}
   5441
   5442		/* ignore non-module BTFs */
   5443		if (!info.kernel_btf || strcmp(name, "vmlinux") == 0) {
   5444			close(fd);
   5445			continue;
   5446		}
   5447
   5448		btf = btf_get_from_fd(fd, obj->btf_vmlinux);
   5449		err = libbpf_get_error(btf);
   5450		if (err) {
   5451			pr_warn("failed to load module [%s]'s BTF object #%d: %d\n",
   5452				name, id, err);
   5453			goto err_out;
   5454		}
   5455
   5456		err = libbpf_ensure_mem((void **)&obj->btf_modules, &obj->btf_module_cap,
   5457				        sizeof(*obj->btf_modules), obj->btf_module_cnt + 1);
   5458		if (err)
   5459			goto err_out;
   5460
   5461		mod_btf = &obj->btf_modules[obj->btf_module_cnt++];
   5462
   5463		mod_btf->btf = btf;
   5464		mod_btf->id = id;
   5465		mod_btf->fd = fd;
   5466		mod_btf->name = strdup(name);
   5467		if (!mod_btf->name) {
   5468			err = -ENOMEM;
   5469			goto err_out;
   5470		}
   5471		continue;
   5472
   5473err_out:
   5474		close(fd);
   5475		return err;
   5476	}
   5477
   5478	return 0;
   5479}
   5480
   5481static struct bpf_core_cand_list *
   5482bpf_core_find_cands(struct bpf_object *obj, const struct btf *local_btf, __u32 local_type_id)
   5483{
   5484	struct bpf_core_cand local_cand = {};
   5485	struct bpf_core_cand_list *cands;
   5486	const struct btf *main_btf;
   5487	const struct btf_type *local_t;
   5488	const char *local_name;
   5489	size_t local_essent_len;
   5490	int err, i;
   5491
   5492	local_cand.btf = local_btf;
   5493	local_cand.id = local_type_id;
   5494	local_t = btf__type_by_id(local_btf, local_type_id);
   5495	if (!local_t)
   5496		return ERR_PTR(-EINVAL);
   5497
   5498	local_name = btf__name_by_offset(local_btf, local_t->name_off);
   5499	if (str_is_empty(local_name))
   5500		return ERR_PTR(-EINVAL);
   5501	local_essent_len = bpf_core_essential_name_len(local_name);
   5502
   5503	cands = calloc(1, sizeof(*cands));
   5504	if (!cands)
   5505		return ERR_PTR(-ENOMEM);
   5506
   5507	/* Attempt to find target candidates in vmlinux BTF first */
   5508	main_btf = obj->btf_vmlinux_override ?: obj->btf_vmlinux;
   5509	err = bpf_core_add_cands(&local_cand, local_essent_len, main_btf, "vmlinux", 1, cands);
   5510	if (err)
   5511		goto err_out;
   5512
   5513	/* if vmlinux BTF has any candidate, don't got for module BTFs */
   5514	if (cands->len)
   5515		return cands;
   5516
   5517	/* if vmlinux BTF was overridden, don't attempt to load module BTFs */
   5518	if (obj->btf_vmlinux_override)
   5519		return cands;
   5520
   5521	/* now look through module BTFs, trying to still find candidates */
   5522	err = load_module_btfs(obj);
   5523	if (err)
   5524		goto err_out;
   5525
   5526	for (i = 0; i < obj->btf_module_cnt; i++) {
   5527		err = bpf_core_add_cands(&local_cand, local_essent_len,
   5528					 obj->btf_modules[i].btf,
   5529					 obj->btf_modules[i].name,
   5530					 btf__type_cnt(obj->btf_vmlinux),
   5531					 cands);
   5532		if (err)
   5533			goto err_out;
   5534	}
   5535
   5536	return cands;
   5537err_out:
   5538	bpf_core_free_cands(cands);
   5539	return ERR_PTR(err);
   5540}
   5541
   5542/* Check local and target types for compatibility. This check is used for
   5543 * type-based CO-RE relocations and follow slightly different rules than
   5544 * field-based relocations. This function assumes that root types were already
   5545 * checked for name match. Beyond that initial root-level name check, names
   5546 * are completely ignored. Compatibility rules are as follows:
   5547 *   - any two STRUCTs/UNIONs/FWDs/ENUMs/INTs are considered compatible, but
   5548 *     kind should match for local and target types (i.e., STRUCT is not
   5549 *     compatible with UNION);
   5550 *   - for ENUMs, the size is ignored;
   5551 *   - for INT, size and signedness are ignored;
   5552 *   - for ARRAY, dimensionality is ignored, element types are checked for
   5553 *     compatibility recursively;
   5554 *   - CONST/VOLATILE/RESTRICT modifiers are ignored;
   5555 *   - TYPEDEFs/PTRs are compatible if types they pointing to are compatible;
   5556 *   - FUNC_PROTOs are compatible if they have compatible signature: same
   5557 *     number of input args and compatible return and argument types.
   5558 * These rules are not set in stone and probably will be adjusted as we get
   5559 * more experience with using BPF CO-RE relocations.
   5560 */
   5561int bpf_core_types_are_compat(const struct btf *local_btf, __u32 local_id,
   5562			      const struct btf *targ_btf, __u32 targ_id)
   5563{
   5564	const struct btf_type *local_type, *targ_type;
   5565	int depth = 32; /* max recursion depth */
   5566
   5567	/* caller made sure that names match (ignoring flavor suffix) */
   5568	local_type = btf__type_by_id(local_btf, local_id);
   5569	targ_type = btf__type_by_id(targ_btf, targ_id);
   5570	if (btf_kind(local_type) != btf_kind(targ_type))
   5571		return 0;
   5572
   5573recur:
   5574	depth--;
   5575	if (depth < 0)
   5576		return -EINVAL;
   5577
   5578	local_type = skip_mods_and_typedefs(local_btf, local_id, &local_id);
   5579	targ_type = skip_mods_and_typedefs(targ_btf, targ_id, &targ_id);
   5580	if (!local_type || !targ_type)
   5581		return -EINVAL;
   5582
   5583	if (btf_kind(local_type) != btf_kind(targ_type))
   5584		return 0;
   5585
   5586	switch (btf_kind(local_type)) {
   5587	case BTF_KIND_UNKN:
   5588	case BTF_KIND_STRUCT:
   5589	case BTF_KIND_UNION:
   5590	case BTF_KIND_ENUM:
   5591	case BTF_KIND_FWD:
   5592		return 1;
   5593	case BTF_KIND_INT:
   5594		/* just reject deprecated bitfield-like integers; all other
   5595		 * integers are by default compatible between each other
   5596		 */
   5597		return btf_int_offset(local_type) == 0 && btf_int_offset(targ_type) == 0;
   5598	case BTF_KIND_PTR:
   5599		local_id = local_type->type;
   5600		targ_id = targ_type->type;
   5601		goto recur;
   5602	case BTF_KIND_ARRAY:
   5603		local_id = btf_array(local_type)->type;
   5604		targ_id = btf_array(targ_type)->type;
   5605		goto recur;
   5606	case BTF_KIND_FUNC_PROTO: {
   5607		struct btf_param *local_p = btf_params(local_type);
   5608		struct btf_param *targ_p = btf_params(targ_type);
   5609		__u16 local_vlen = btf_vlen(local_type);
   5610		__u16 targ_vlen = btf_vlen(targ_type);
   5611		int i, err;
   5612
   5613		if (local_vlen != targ_vlen)
   5614			return 0;
   5615
   5616		for (i = 0; i < local_vlen; i++, local_p++, targ_p++) {
   5617			skip_mods_and_typedefs(local_btf, local_p->type, &local_id);
   5618			skip_mods_and_typedefs(targ_btf, targ_p->type, &targ_id);
   5619			err = bpf_core_types_are_compat(local_btf, local_id, targ_btf, targ_id);
   5620			if (err <= 0)
   5621				return err;
   5622		}
   5623
   5624		/* tail recurse for return type check */
   5625		skip_mods_and_typedefs(local_btf, local_type->type, &local_id);
   5626		skip_mods_and_typedefs(targ_btf, targ_type->type, &targ_id);
   5627		goto recur;
   5628	}
   5629	default:
   5630		pr_warn("unexpected kind %s relocated, local [%d], target [%d]\n",
   5631			btf_kind_str(local_type), local_id, targ_id);
   5632		return 0;
   5633	}
   5634}
   5635
   5636static size_t bpf_core_hash_fn(const void *key, void *ctx)
   5637{
   5638	return (size_t)key;
   5639}
   5640
   5641static bool bpf_core_equal_fn(const void *k1, const void *k2, void *ctx)
   5642{
   5643	return k1 == k2;
   5644}
   5645
   5646static void *u32_as_hash_key(__u32 x)
   5647{
   5648	return (void *)(uintptr_t)x;
   5649}
   5650
   5651static int record_relo_core(struct bpf_program *prog,
   5652			    const struct bpf_core_relo *core_relo, int insn_idx)
   5653{
   5654	struct reloc_desc *relos, *relo;
   5655
   5656	relos = libbpf_reallocarray(prog->reloc_desc,
   5657				    prog->nr_reloc + 1, sizeof(*relos));
   5658	if (!relos)
   5659		return -ENOMEM;
   5660	relo = &relos[prog->nr_reloc];
   5661	relo->type = RELO_CORE;
   5662	relo->insn_idx = insn_idx;
   5663	relo->core_relo = core_relo;
   5664	prog->reloc_desc = relos;
   5665	prog->nr_reloc++;
   5666	return 0;
   5667}
   5668
   5669static const struct bpf_core_relo *find_relo_core(struct bpf_program *prog, int insn_idx)
   5670{
   5671	struct reloc_desc *relo;
   5672	int i;
   5673
   5674	for (i = 0; i < prog->nr_reloc; i++) {
   5675		relo = &prog->reloc_desc[i];
   5676		if (relo->type != RELO_CORE || relo->insn_idx != insn_idx)
   5677			continue;
   5678
   5679		return relo->core_relo;
   5680	}
   5681
   5682	return NULL;
   5683}
   5684
   5685static int bpf_core_resolve_relo(struct bpf_program *prog,
   5686				 const struct bpf_core_relo *relo,
   5687				 int relo_idx,
   5688				 const struct btf *local_btf,
   5689				 struct hashmap *cand_cache,
   5690				 struct bpf_core_relo_res *targ_res)
   5691{
   5692	struct bpf_core_spec specs_scratch[3] = {};
   5693	const void *type_key = u32_as_hash_key(relo->type_id);
   5694	struct bpf_core_cand_list *cands = NULL;
   5695	const char *prog_name = prog->name;
   5696	const struct btf_type *local_type;
   5697	const char *local_name;
   5698	__u32 local_id = relo->type_id;
   5699	int err;
   5700
   5701	local_type = btf__type_by_id(local_btf, local_id);
   5702	if (!local_type)
   5703		return -EINVAL;
   5704
   5705	local_name = btf__name_by_offset(local_btf, local_type->name_off);
   5706	if (!local_name)
   5707		return -EINVAL;
   5708
   5709	if (relo->kind != BPF_CORE_TYPE_ID_LOCAL &&
   5710	    !hashmap__find(cand_cache, type_key, (void **)&cands)) {
   5711		cands = bpf_core_find_cands(prog->obj, local_btf, local_id);
   5712		if (IS_ERR(cands)) {
   5713			pr_warn("prog '%s': relo #%d: target candidate search failed for [%d] %s %s: %ld\n",
   5714				prog_name, relo_idx, local_id, btf_kind_str(local_type),
   5715				local_name, PTR_ERR(cands));
   5716			return PTR_ERR(cands);
   5717		}
   5718		err = hashmap__set(cand_cache, type_key, cands, NULL, NULL);
   5719		if (err) {
   5720			bpf_core_free_cands(cands);
   5721			return err;
   5722		}
   5723	}
   5724
   5725	return bpf_core_calc_relo_insn(prog_name, relo, relo_idx, local_btf, cands, specs_scratch,
   5726				       targ_res);
   5727}
   5728
   5729static int
   5730bpf_object__relocate_core(struct bpf_object *obj, const char *targ_btf_path)
   5731{
   5732	const struct btf_ext_info_sec *sec;
   5733	struct bpf_core_relo_res targ_res;
   5734	const struct bpf_core_relo *rec;
   5735	const struct btf_ext_info *seg;
   5736	struct hashmap_entry *entry;
   5737	struct hashmap *cand_cache = NULL;
   5738	struct bpf_program *prog;
   5739	struct bpf_insn *insn;
   5740	const char *sec_name;
   5741	int i, err = 0, insn_idx, sec_idx, sec_num;
   5742
   5743	if (obj->btf_ext->core_relo_info.len == 0)
   5744		return 0;
   5745
   5746	if (targ_btf_path) {
   5747		obj->btf_vmlinux_override = btf__parse(targ_btf_path, NULL);
   5748		err = libbpf_get_error(obj->btf_vmlinux_override);
   5749		if (err) {
   5750			pr_warn("failed to parse target BTF: %d\n", err);
   5751			return err;
   5752		}
   5753	}
   5754
   5755	cand_cache = hashmap__new(bpf_core_hash_fn, bpf_core_equal_fn, NULL);
   5756	if (IS_ERR(cand_cache)) {
   5757		err = PTR_ERR(cand_cache);
   5758		goto out;
   5759	}
   5760
   5761	seg = &obj->btf_ext->core_relo_info;
   5762	sec_num = 0;
   5763	for_each_btf_ext_sec(seg, sec) {
   5764		sec_idx = seg->sec_idxs[sec_num];
   5765		sec_num++;
   5766
   5767		sec_name = btf__name_by_offset(obj->btf, sec->sec_name_off);
   5768		if (str_is_empty(sec_name)) {
   5769			err = -EINVAL;
   5770			goto out;
   5771		}
   5772
   5773		pr_debug("sec '%s': found %d CO-RE relocations\n", sec_name, sec->num_info);
   5774
   5775		for_each_btf_ext_rec(seg, sec, i, rec) {
   5776			if (rec->insn_off % BPF_INSN_SZ)
   5777				return -EINVAL;
   5778			insn_idx = rec->insn_off / BPF_INSN_SZ;
   5779			prog = find_prog_by_sec_insn(obj, sec_idx, insn_idx);
   5780			if (!prog) {
   5781				/* When __weak subprog is "overridden" by another instance
   5782				 * of the subprog from a different object file, linker still
   5783				 * appends all the .BTF.ext info that used to belong to that
   5784				 * eliminated subprogram.
   5785				 * This is similar to what x86-64 linker does for relocations.
   5786				 * So just ignore such relocations just like we ignore
   5787				 * subprog instructions when discovering subprograms.
   5788				 */
   5789				pr_debug("sec '%s': skipping CO-RE relocation #%d for insn #%d belonging to eliminated weak subprogram\n",
   5790					 sec_name, i, insn_idx);
   5791				continue;
   5792			}
   5793			/* no need to apply CO-RE relocation if the program is
   5794			 * not going to be loaded
   5795			 */
   5796			if (!prog->autoload)
   5797				continue;
   5798
   5799			/* adjust insn_idx from section frame of reference to the local
   5800			 * program's frame of reference; (sub-)program code is not yet
   5801			 * relocated, so it's enough to just subtract in-section offset
   5802			 */
   5803			insn_idx = insn_idx - prog->sec_insn_off;
   5804			if (insn_idx >= prog->insns_cnt)
   5805				return -EINVAL;
   5806			insn = &prog->insns[insn_idx];
   5807
   5808			err = record_relo_core(prog, rec, insn_idx);
   5809			if (err) {
   5810				pr_warn("prog '%s': relo #%d: failed to record relocation: %d\n",
   5811					prog->name, i, err);
   5812				goto out;
   5813			}
   5814
   5815			if (prog->obj->gen_loader)
   5816				continue;
   5817
   5818			err = bpf_core_resolve_relo(prog, rec, i, obj->btf, cand_cache, &targ_res);
   5819			if (err) {
   5820				pr_warn("prog '%s': relo #%d: failed to relocate: %d\n",
   5821					prog->name, i, err);
   5822				goto out;
   5823			}
   5824
   5825			err = bpf_core_patch_insn(prog->name, insn, insn_idx, rec, i, &targ_res);
   5826			if (err) {
   5827				pr_warn("prog '%s': relo #%d: failed to patch insn #%u: %d\n",
   5828					prog->name, i, insn_idx, err);
   5829				goto out;
   5830			}
   5831		}
   5832	}
   5833
   5834out:
   5835	/* obj->btf_vmlinux and module BTFs are freed after object load */
   5836	btf__free(obj->btf_vmlinux_override);
   5837	obj->btf_vmlinux_override = NULL;
   5838
   5839	if (!IS_ERR_OR_NULL(cand_cache)) {
   5840		hashmap__for_each_entry(cand_cache, entry, i) {
   5841			bpf_core_free_cands(entry->value);
   5842		}
   5843		hashmap__free(cand_cache);
   5844	}
   5845	return err;
   5846}
   5847
   5848/* base map load ldimm64 special constant, used also for log fixup logic */
   5849#define MAP_LDIMM64_POISON_BASE 2001000000
   5850#define MAP_LDIMM64_POISON_PFX "200100"
   5851
   5852static void poison_map_ldimm64(struct bpf_program *prog, int relo_idx,
   5853			       int insn_idx, struct bpf_insn *insn,
   5854			       int map_idx, const struct bpf_map *map)
   5855{
   5856	int i;
   5857
   5858	pr_debug("prog '%s': relo #%d: poisoning insn #%d that loads map #%d '%s'\n",
   5859		 prog->name, relo_idx, insn_idx, map_idx, map->name);
   5860
   5861	/* we turn single ldimm64 into two identical invalid calls */
   5862	for (i = 0; i < 2; i++) {
   5863		insn->code = BPF_JMP | BPF_CALL;
   5864		insn->dst_reg = 0;
   5865		insn->src_reg = 0;
   5866		insn->off = 0;
   5867		/* if this instruction is reachable (not a dead code),
   5868		 * verifier will complain with something like:
   5869		 * invalid func unknown#2001000123
   5870		 * where lower 123 is map index into obj->maps[] array
   5871		 */
   5872		insn->imm = MAP_LDIMM64_POISON_BASE + map_idx;
   5873
   5874		insn++;
   5875	}
   5876}
   5877
   5878/* Relocate data references within program code:
   5879 *  - map references;
   5880 *  - global variable references;
   5881 *  - extern references.
   5882 */
   5883static int
   5884bpf_object__relocate_data(struct bpf_object *obj, struct bpf_program *prog)
   5885{
   5886	int i;
   5887
   5888	for (i = 0; i < prog->nr_reloc; i++) {
   5889		struct reloc_desc *relo = &prog->reloc_desc[i];
   5890		struct bpf_insn *insn = &prog->insns[relo->insn_idx];
   5891		const struct bpf_map *map;
   5892		struct extern_desc *ext;
   5893
   5894		switch (relo->type) {
   5895		case RELO_LD64:
   5896			map = &obj->maps[relo->map_idx];
   5897			if (obj->gen_loader) {
   5898				insn[0].src_reg = BPF_PSEUDO_MAP_IDX;
   5899				insn[0].imm = relo->map_idx;
   5900			} else if (map->autocreate) {
   5901				insn[0].src_reg = BPF_PSEUDO_MAP_FD;
   5902				insn[0].imm = map->fd;
   5903			} else {
   5904				poison_map_ldimm64(prog, i, relo->insn_idx, insn,
   5905						   relo->map_idx, map);
   5906			}
   5907			break;
   5908		case RELO_DATA:
   5909			map = &obj->maps[relo->map_idx];
   5910			insn[1].imm = insn[0].imm + relo->sym_off;
   5911			if (obj->gen_loader) {
   5912				insn[0].src_reg = BPF_PSEUDO_MAP_IDX_VALUE;
   5913				insn[0].imm = relo->map_idx;
   5914			} else if (map->autocreate) {
   5915				insn[0].src_reg = BPF_PSEUDO_MAP_VALUE;
   5916				insn[0].imm = map->fd;
   5917			} else {
   5918				poison_map_ldimm64(prog, i, relo->insn_idx, insn,
   5919						   relo->map_idx, map);
   5920			}
   5921			break;
   5922		case RELO_EXTERN_VAR:
   5923			ext = &obj->externs[relo->sym_off];
   5924			if (ext->type == EXT_KCFG) {
   5925				if (obj->gen_loader) {
   5926					insn[0].src_reg = BPF_PSEUDO_MAP_IDX_VALUE;
   5927					insn[0].imm = obj->kconfig_map_idx;
   5928				} else {
   5929					insn[0].src_reg = BPF_PSEUDO_MAP_VALUE;
   5930					insn[0].imm = obj->maps[obj->kconfig_map_idx].fd;
   5931				}
   5932				insn[1].imm = ext->kcfg.data_off;
   5933			} else /* EXT_KSYM */ {
   5934				if (ext->ksym.type_id && ext->is_set) { /* typed ksyms */
   5935					insn[0].src_reg = BPF_PSEUDO_BTF_ID;
   5936					insn[0].imm = ext->ksym.kernel_btf_id;
   5937					insn[1].imm = ext->ksym.kernel_btf_obj_fd;
   5938				} else { /* typeless ksyms or unresolved typed ksyms */
   5939					insn[0].imm = (__u32)ext->ksym.addr;
   5940					insn[1].imm = ext->ksym.addr >> 32;
   5941				}
   5942			}
   5943			break;
   5944		case RELO_EXTERN_FUNC:
   5945			ext = &obj->externs[relo->sym_off];
   5946			insn[0].src_reg = BPF_PSEUDO_KFUNC_CALL;
   5947			if (ext->is_set) {
   5948				insn[0].imm = ext->ksym.kernel_btf_id;
   5949				insn[0].off = ext->ksym.btf_fd_idx;
   5950			} else { /* unresolved weak kfunc */
   5951				insn[0].imm = 0;
   5952				insn[0].off = 0;
   5953			}
   5954			break;
   5955		case RELO_SUBPROG_ADDR:
   5956			if (insn[0].src_reg != BPF_PSEUDO_FUNC) {
   5957				pr_warn("prog '%s': relo #%d: bad insn\n",
   5958					prog->name, i);
   5959				return -EINVAL;
   5960			}
   5961			/* handled already */
   5962			break;
   5963		case RELO_CALL:
   5964			/* handled already */
   5965			break;
   5966		case RELO_CORE:
   5967			/* will be handled by bpf_program_record_relos() */
   5968			break;
   5969		default:
   5970			pr_warn("prog '%s': relo #%d: bad relo type %d\n",
   5971				prog->name, i, relo->type);
   5972			return -EINVAL;
   5973		}
   5974	}
   5975
   5976	return 0;
   5977}
   5978
   5979static int adjust_prog_btf_ext_info(const struct bpf_object *obj,
   5980				    const struct bpf_program *prog,
   5981				    const struct btf_ext_info *ext_info,
   5982				    void **prog_info, __u32 *prog_rec_cnt,
   5983				    __u32 *prog_rec_sz)
   5984{
   5985	void *copy_start = NULL, *copy_end = NULL;
   5986	void *rec, *rec_end, *new_prog_info;
   5987	const struct btf_ext_info_sec *sec;
   5988	size_t old_sz, new_sz;
   5989	int i, sec_num, sec_idx, off_adj;
   5990
   5991	sec_num = 0;
   5992	for_each_btf_ext_sec(ext_info, sec) {
   5993		sec_idx = ext_info->sec_idxs[sec_num];
   5994		sec_num++;
   5995		if (prog->sec_idx != sec_idx)
   5996			continue;
   5997
   5998		for_each_btf_ext_rec(ext_info, sec, i, rec) {
   5999			__u32 insn_off = *(__u32 *)rec / BPF_INSN_SZ;
   6000
   6001			if (insn_off < prog->sec_insn_off)
   6002				continue;
   6003			if (insn_off >= prog->sec_insn_off + prog->sec_insn_cnt)
   6004				break;
   6005
   6006			if (!copy_start)
   6007				copy_start = rec;
   6008			copy_end = rec + ext_info->rec_size;
   6009		}
   6010
   6011		if (!copy_start)
   6012			return -ENOENT;
   6013
   6014		/* append func/line info of a given (sub-)program to the main
   6015		 * program func/line info
   6016		 */
   6017		old_sz = (size_t)(*prog_rec_cnt) * ext_info->rec_size;
   6018		new_sz = old_sz + (copy_end - copy_start);
   6019		new_prog_info = realloc(*prog_info, new_sz);
   6020		if (!new_prog_info)
   6021			return -ENOMEM;
   6022		*prog_info = new_prog_info;
   6023		*prog_rec_cnt = new_sz / ext_info->rec_size;
   6024		memcpy(new_prog_info + old_sz, copy_start, copy_end - copy_start);
   6025
   6026		/* Kernel instruction offsets are in units of 8-byte
   6027		 * instructions, while .BTF.ext instruction offsets generated
   6028		 * by Clang are in units of bytes. So convert Clang offsets
   6029		 * into kernel offsets and adjust offset according to program
   6030		 * relocated position.
   6031		 */
   6032		off_adj = prog->sub_insn_off - prog->sec_insn_off;
   6033		rec = new_prog_info + old_sz;
   6034		rec_end = new_prog_info + new_sz;
   6035		for (; rec < rec_end; rec += ext_info->rec_size) {
   6036			__u32 *insn_off = rec;
   6037
   6038			*insn_off = *insn_off / BPF_INSN_SZ + off_adj;
   6039		}
   6040		*prog_rec_sz = ext_info->rec_size;
   6041		return 0;
   6042	}
   6043
   6044	return -ENOENT;
   6045}
   6046
   6047static int
   6048reloc_prog_func_and_line_info(const struct bpf_object *obj,
   6049			      struct bpf_program *main_prog,
   6050			      const struct bpf_program *prog)
   6051{
   6052	int err;
   6053
   6054	/* no .BTF.ext relocation if .BTF.ext is missing or kernel doesn't
   6055	 * supprot func/line info
   6056	 */
   6057	if (!obj->btf_ext || !kernel_supports(obj, FEAT_BTF_FUNC))
   6058		return 0;
   6059
   6060	/* only attempt func info relocation if main program's func_info
   6061	 * relocation was successful
   6062	 */
   6063	if (main_prog != prog && !main_prog->func_info)
   6064		goto line_info;
   6065
   6066	err = adjust_prog_btf_ext_info(obj, prog, &obj->btf_ext->func_info,
   6067				       &main_prog->func_info,
   6068				       &main_prog->func_info_cnt,
   6069				       &main_prog->func_info_rec_size);
   6070	if (err) {
   6071		if (err != -ENOENT) {
   6072			pr_warn("prog '%s': error relocating .BTF.ext function info: %d\n",
   6073				prog->name, err);
   6074			return err;
   6075		}
   6076		if (main_prog->func_info) {
   6077			/*
   6078			 * Some info has already been found but has problem
   6079			 * in the last btf_ext reloc. Must have to error out.
   6080			 */
   6081			pr_warn("prog '%s': missing .BTF.ext function info.\n", prog->name);
   6082			return err;
   6083		}
   6084		/* Have problem loading the very first info. Ignore the rest. */
   6085		pr_warn("prog '%s': missing .BTF.ext function info for the main program, skipping all of .BTF.ext func info.\n",
   6086			prog->name);
   6087	}
   6088
   6089line_info:
   6090	/* don't relocate line info if main program's relocation failed */
   6091	if (main_prog != prog && !main_prog->line_info)
   6092		return 0;
   6093
   6094	err = adjust_prog_btf_ext_info(obj, prog, &obj->btf_ext->line_info,
   6095				       &main_prog->line_info,
   6096				       &main_prog->line_info_cnt,
   6097				       &main_prog->line_info_rec_size);
   6098	if (err) {
   6099		if (err != -ENOENT) {
   6100			pr_warn("prog '%s': error relocating .BTF.ext line info: %d\n",
   6101				prog->name, err);
   6102			return err;
   6103		}
   6104		if (main_prog->line_info) {
   6105			/*
   6106			 * Some info has already been found but has problem
   6107			 * in the last btf_ext reloc. Must have to error out.
   6108			 */
   6109			pr_warn("prog '%s': missing .BTF.ext line info.\n", prog->name);
   6110			return err;
   6111		}
   6112		/* Have problem loading the very first info. Ignore the rest. */
   6113		pr_warn("prog '%s': missing .BTF.ext line info for the main program, skipping all of .BTF.ext line info.\n",
   6114			prog->name);
   6115	}
   6116	return 0;
   6117}
   6118
   6119static int cmp_relo_by_insn_idx(const void *key, const void *elem)
   6120{
   6121	size_t insn_idx = *(const size_t *)key;
   6122	const struct reloc_desc *relo = elem;
   6123
   6124	if (insn_idx == relo->insn_idx)
   6125		return 0;
   6126	return insn_idx < relo->insn_idx ? -1 : 1;
   6127}
   6128
   6129static struct reloc_desc *find_prog_insn_relo(const struct bpf_program *prog, size_t insn_idx)
   6130{
   6131	if (!prog->nr_reloc)
   6132		return NULL;
   6133	return bsearch(&insn_idx, prog->reloc_desc, prog->nr_reloc,
   6134		       sizeof(*prog->reloc_desc), cmp_relo_by_insn_idx);
   6135}
   6136
   6137static int append_subprog_relos(struct bpf_program *main_prog, struct bpf_program *subprog)
   6138{
   6139	int new_cnt = main_prog->nr_reloc + subprog->nr_reloc;
   6140	struct reloc_desc *relos;
   6141	int i;
   6142
   6143	if (main_prog == subprog)
   6144		return 0;
   6145	relos = libbpf_reallocarray(main_prog->reloc_desc, new_cnt, sizeof(*relos));
   6146	if (!relos)
   6147		return -ENOMEM;
   6148	if (subprog->nr_reloc)
   6149		memcpy(relos + main_prog->nr_reloc, subprog->reloc_desc,
   6150		       sizeof(*relos) * subprog->nr_reloc);
   6151
   6152	for (i = main_prog->nr_reloc; i < new_cnt; i++)
   6153		relos[i].insn_idx += subprog->sub_insn_off;
   6154	/* After insn_idx adjustment the 'relos' array is still sorted
   6155	 * by insn_idx and doesn't break bsearch.
   6156	 */
   6157	main_prog->reloc_desc = relos;
   6158	main_prog->nr_reloc = new_cnt;
   6159	return 0;
   6160}
   6161
   6162static int
   6163bpf_object__reloc_code(struct bpf_object *obj, struct bpf_program *main_prog,
   6164		       struct bpf_program *prog)
   6165{
   6166	size_t sub_insn_idx, insn_idx, new_cnt;
   6167	struct bpf_program *subprog;
   6168	struct bpf_insn *insns, *insn;
   6169	struct reloc_desc *relo;
   6170	int err;
   6171
   6172	err = reloc_prog_func_and_line_info(obj, main_prog, prog);
   6173	if (err)
   6174		return err;
   6175
   6176	for (insn_idx = 0; insn_idx < prog->sec_insn_cnt; insn_idx++) {
   6177		insn = &main_prog->insns[prog->sub_insn_off + insn_idx];
   6178		if (!insn_is_subprog_call(insn) && !insn_is_pseudo_func(insn))
   6179			continue;
   6180
   6181		relo = find_prog_insn_relo(prog, insn_idx);
   6182		if (relo && relo->type == RELO_EXTERN_FUNC)
   6183			/* kfunc relocations will be handled later
   6184			 * in bpf_object__relocate_data()
   6185			 */
   6186			continue;
   6187		if (relo && relo->type != RELO_CALL && relo->type != RELO_SUBPROG_ADDR) {
   6188			pr_warn("prog '%s': unexpected relo for insn #%zu, type %d\n",
   6189				prog->name, insn_idx, relo->type);
   6190			return -LIBBPF_ERRNO__RELOC;
   6191		}
   6192		if (relo) {
   6193			/* sub-program instruction index is a combination of
   6194			 * an offset of a symbol pointed to by relocation and
   6195			 * call instruction's imm field; for global functions,
   6196			 * call always has imm = -1, but for static functions
   6197			 * relocation is against STT_SECTION and insn->imm
   6198			 * points to a start of a static function
   6199			 *
   6200			 * for subprog addr relocation, the relo->sym_off + insn->imm is
   6201			 * the byte offset in the corresponding section.
   6202			 */
   6203			if (relo->type == RELO_CALL)
   6204				sub_insn_idx = relo->sym_off / BPF_INSN_SZ + insn->imm + 1;
   6205			else
   6206				sub_insn_idx = (relo->sym_off + insn->imm) / BPF_INSN_SZ;
   6207		} else if (insn_is_pseudo_func(insn)) {
   6208			/*
   6209			 * RELO_SUBPROG_ADDR relo is always emitted even if both
   6210			 * functions are in the same section, so it shouldn't reach here.
   6211			 */
   6212			pr_warn("prog '%s': missing subprog addr relo for insn #%zu\n",
   6213				prog->name, insn_idx);
   6214			return -LIBBPF_ERRNO__RELOC;
   6215		} else {
   6216			/* if subprogram call is to a static function within
   6217			 * the same ELF section, there won't be any relocation
   6218			 * emitted, but it also means there is no additional
   6219			 * offset necessary, insns->imm is relative to
   6220			 * instruction's original position within the section
   6221			 */
   6222			sub_insn_idx = prog->sec_insn_off + insn_idx + insn->imm + 1;
   6223		}
   6224
   6225		/* we enforce that sub-programs should be in .text section */
   6226		subprog = find_prog_by_sec_insn(obj, obj->efile.text_shndx, sub_insn_idx);
   6227		if (!subprog) {
   6228			pr_warn("prog '%s': no .text section found yet sub-program call exists\n",
   6229				prog->name);
   6230			return -LIBBPF_ERRNO__RELOC;
   6231		}
   6232
   6233		/* if it's the first call instruction calling into this
   6234		 * subprogram (meaning this subprog hasn't been processed
   6235		 * yet) within the context of current main program:
   6236		 *   - append it at the end of main program's instructions blog;
   6237		 *   - process is recursively, while current program is put on hold;
   6238		 *   - if that subprogram calls some other not yet processes
   6239		 *   subprogram, same thing will happen recursively until
   6240		 *   there are no more unprocesses subprograms left to append
   6241		 *   and relocate.
   6242		 */
   6243		if (subprog->sub_insn_off == 0) {
   6244			subprog->sub_insn_off = main_prog->insns_cnt;
   6245
   6246			new_cnt = main_prog->insns_cnt + subprog->insns_cnt;
   6247			insns = libbpf_reallocarray(main_prog->insns, new_cnt, sizeof(*insns));
   6248			if (!insns) {
   6249				pr_warn("prog '%s': failed to realloc prog code\n", main_prog->name);
   6250				return -ENOMEM;
   6251			}
   6252			main_prog->insns = insns;
   6253			main_prog->insns_cnt = new_cnt;
   6254
   6255			memcpy(main_prog->insns + subprog->sub_insn_off, subprog->insns,
   6256			       subprog->insns_cnt * sizeof(*insns));
   6257
   6258			pr_debug("prog '%s': added %zu insns from sub-prog '%s'\n",
   6259				 main_prog->name, subprog->insns_cnt, subprog->name);
   6260
   6261			/* The subprog insns are now appended. Append its relos too. */
   6262			err = append_subprog_relos(main_prog, subprog);
   6263			if (err)
   6264				return err;
   6265			err = bpf_object__reloc_code(obj, main_prog, subprog);
   6266			if (err)
   6267				return err;
   6268		}
   6269
   6270		/* main_prog->insns memory could have been re-allocated, so
   6271		 * calculate pointer again
   6272		 */
   6273		insn = &main_prog->insns[prog->sub_insn_off + insn_idx];
   6274		/* calculate correct instruction position within current main
   6275		 * prog; each main prog can have a different set of
   6276		 * subprograms appended (potentially in different order as
   6277		 * well), so position of any subprog can be different for
   6278		 * different main programs */
   6279		insn->imm = subprog->sub_insn_off - (prog->sub_insn_off + insn_idx) - 1;
   6280
   6281		pr_debug("prog '%s': insn #%zu relocated, imm %d points to subprog '%s' (now at %zu offset)\n",
   6282			 prog->name, insn_idx, insn->imm, subprog->name, subprog->sub_insn_off);
   6283	}
   6284
   6285	return 0;
   6286}
   6287
   6288/*
   6289 * Relocate sub-program calls.
   6290 *
   6291 * Algorithm operates as follows. Each entry-point BPF program (referred to as
   6292 * main prog) is processed separately. For each subprog (non-entry functions,
   6293 * that can be called from either entry progs or other subprogs) gets their
   6294 * sub_insn_off reset to zero. This serves as indicator that this subprogram
   6295 * hasn't been yet appended and relocated within current main prog. Once its
   6296 * relocated, sub_insn_off will point at the position within current main prog
   6297 * where given subprog was appended. This will further be used to relocate all
   6298 * the call instructions jumping into this subprog.
   6299 *
   6300 * We start with main program and process all call instructions. If the call
   6301 * is into a subprog that hasn't been processed (i.e., subprog->sub_insn_off
   6302 * is zero), subprog instructions are appended at the end of main program's
   6303 * instruction array. Then main program is "put on hold" while we recursively
   6304 * process newly appended subprogram. If that subprogram calls into another
   6305 * subprogram that hasn't been appended, new subprogram is appended again to
   6306 * the *main* prog's instructions (subprog's instructions are always left
   6307 * untouched, as they need to be in unmodified state for subsequent main progs
   6308 * and subprog instructions are always sent only as part of a main prog) and
   6309 * the process continues recursively. Once all the subprogs called from a main
   6310 * prog or any of its subprogs are appended (and relocated), all their
   6311 * positions within finalized instructions array are known, so it's easy to
   6312 * rewrite call instructions with correct relative offsets, corresponding to
   6313 * desired target subprog.
   6314 *
   6315 * Its important to realize that some subprogs might not be called from some
   6316 * main prog and any of its called/used subprogs. Those will keep their
   6317 * subprog->sub_insn_off as zero at all times and won't be appended to current
   6318 * main prog and won't be relocated within the context of current main prog.
   6319 * They might still be used from other main progs later.
   6320 *
   6321 * Visually this process can be shown as below. Suppose we have two main
   6322 * programs mainA and mainB and BPF object contains three subprogs: subA,
   6323 * subB, and subC. mainA calls only subA, mainB calls only subC, but subA and
   6324 * subC both call subB:
   6325 *
   6326 *        +--------+ +-------+
   6327 *        |        v v       |
   6328 *     +--+---+ +--+-+-+ +---+--+
   6329 *     | subA | | subB | | subC |
   6330 *     +--+---+ +------+ +---+--+
   6331 *        ^                  ^
   6332 *        |                  |
   6333 *    +---+-------+   +------+----+
   6334 *    |   mainA   |   |   mainB   |
   6335 *    +-----------+   +-----------+
   6336 *
   6337 * We'll start relocating mainA, will find subA, append it and start
   6338 * processing sub A recursively:
   6339 *
   6340 *    +-----------+------+
   6341 *    |   mainA   | subA |
   6342 *    +-----------+------+
   6343 *
   6344 * At this point we notice that subB is used from subA, so we append it and
   6345 * relocate (there are no further subcalls from subB):
   6346 *
   6347 *    +-----------+------+------+
   6348 *    |   mainA   | subA | subB |
   6349 *    +-----------+------+------+
   6350 *
   6351 * At this point, we relocate subA calls, then go one level up and finish with
   6352 * relocatin mainA calls. mainA is done.
   6353 *
   6354 * For mainB process is similar but results in different order. We start with
   6355 * mainB and skip subA and subB, as mainB never calls them (at least
   6356 * directly), but we see subC is needed, so we append and start processing it:
   6357 *
   6358 *    +-----------+------+
   6359 *    |   mainB   | subC |
   6360 *    +-----------+------+
   6361 * Now we see subC needs subB, so we go back to it, append and relocate it:
   6362 *
   6363 *    +-----------+------+------+
   6364 *    |   mainB   | subC | subB |
   6365 *    +-----------+------+------+
   6366 *
   6367 * At this point we unwind recursion, relocate calls in subC, then in mainB.
   6368 */
   6369static int
   6370bpf_object__relocate_calls(struct bpf_object *obj, struct bpf_program *prog)
   6371{
   6372	struct bpf_program *subprog;
   6373	int i, err;
   6374
   6375	/* mark all subprogs as not relocated (yet) within the context of
   6376	 * current main program
   6377	 */
   6378	for (i = 0; i < obj->nr_programs; i++) {
   6379		subprog = &obj->programs[i];
   6380		if (!prog_is_subprog(obj, subprog))
   6381			continue;
   6382
   6383		subprog->sub_insn_off = 0;
   6384	}
   6385
   6386	err = bpf_object__reloc_code(obj, prog, prog);
   6387	if (err)
   6388		return err;
   6389
   6390	return 0;
   6391}
   6392
   6393static void
   6394bpf_object__free_relocs(struct bpf_object *obj)
   6395{
   6396	struct bpf_program *prog;
   6397	int i;
   6398
   6399	/* free up relocation descriptors */
   6400	for (i = 0; i < obj->nr_programs; i++) {
   6401		prog = &obj->programs[i];
   6402		zfree(&prog->reloc_desc);
   6403		prog->nr_reloc = 0;
   6404	}
   6405}
   6406
   6407static int cmp_relocs(const void *_a, const void *_b)
   6408{
   6409	const struct reloc_desc *a = _a;
   6410	const struct reloc_desc *b = _b;
   6411
   6412	if (a->insn_idx != b->insn_idx)
   6413		return a->insn_idx < b->insn_idx ? -1 : 1;
   6414
   6415	/* no two relocations should have the same insn_idx, but ... */
   6416	if (a->type != b->type)
   6417		return a->type < b->type ? -1 : 1;
   6418
   6419	return 0;
   6420}
   6421
   6422static void bpf_object__sort_relos(struct bpf_object *obj)
   6423{
   6424	int i;
   6425
   6426	for (i = 0; i < obj->nr_programs; i++) {
   6427		struct bpf_program *p = &obj->programs[i];
   6428
   6429		if (!p->nr_reloc)
   6430			continue;
   6431
   6432		qsort(p->reloc_desc, p->nr_reloc, sizeof(*p->reloc_desc), cmp_relocs);
   6433	}
   6434}
   6435
   6436static int
   6437bpf_object__relocate(struct bpf_object *obj, const char *targ_btf_path)
   6438{
   6439	struct bpf_program *prog;
   6440	size_t i, j;
   6441	int err;
   6442
   6443	if (obj->btf_ext) {
   6444		err = bpf_object__relocate_core(obj, targ_btf_path);
   6445		if (err) {
   6446			pr_warn("failed to perform CO-RE relocations: %d\n",
   6447				err);
   6448			return err;
   6449		}
   6450		bpf_object__sort_relos(obj);
   6451	}
   6452
   6453	/* Before relocating calls pre-process relocations and mark
   6454	 * few ld_imm64 instructions that points to subprogs.
   6455	 * Otherwise bpf_object__reloc_code() later would have to consider
   6456	 * all ld_imm64 insns as relocation candidates. That would
   6457	 * reduce relocation speed, since amount of find_prog_insn_relo()
   6458	 * would increase and most of them will fail to find a relo.
   6459	 */
   6460	for (i = 0; i < obj->nr_programs; i++) {
   6461		prog = &obj->programs[i];
   6462		for (j = 0; j < prog->nr_reloc; j++) {
   6463			struct reloc_desc *relo = &prog->reloc_desc[j];
   6464			struct bpf_insn *insn = &prog->insns[relo->insn_idx];
   6465
   6466			/* mark the insn, so it's recognized by insn_is_pseudo_func() */
   6467			if (relo->type == RELO_SUBPROG_ADDR)
   6468				insn[0].src_reg = BPF_PSEUDO_FUNC;
   6469		}
   6470	}
   6471
   6472	/* relocate subprogram calls and append used subprograms to main
   6473	 * programs; each copy of subprogram code needs to be relocated
   6474	 * differently for each main program, because its code location might
   6475	 * have changed.
   6476	 * Append subprog relos to main programs to allow data relos to be
   6477	 * processed after text is completely relocated.
   6478	 */
   6479	for (i = 0; i < obj->nr_programs; i++) {
   6480		prog = &obj->programs[i];
   6481		/* sub-program's sub-calls are relocated within the context of
   6482		 * its main program only
   6483		 */
   6484		if (prog_is_subprog(obj, prog))
   6485			continue;
   6486		if (!prog->autoload)
   6487			continue;
   6488
   6489		err = bpf_object__relocate_calls(obj, prog);
   6490		if (err) {
   6491			pr_warn("prog '%s': failed to relocate calls: %d\n",
   6492				prog->name, err);
   6493			return err;
   6494		}
   6495	}
   6496	/* Process data relos for main programs */
   6497	for (i = 0; i < obj->nr_programs; i++) {
   6498		prog = &obj->programs[i];
   6499		if (prog_is_subprog(obj, prog))
   6500			continue;
   6501		if (!prog->autoload)
   6502			continue;
   6503		err = bpf_object__relocate_data(obj, prog);
   6504		if (err) {
   6505			pr_warn("prog '%s': failed to relocate data references: %d\n",
   6506				prog->name, err);
   6507			return err;
   6508		}
   6509	}
   6510
   6511	return 0;
   6512}
   6513
   6514static int bpf_object__collect_st_ops_relos(struct bpf_object *obj,
   6515					    Elf64_Shdr *shdr, Elf_Data *data);
   6516
   6517static int bpf_object__collect_map_relos(struct bpf_object *obj,
   6518					 Elf64_Shdr *shdr, Elf_Data *data)
   6519{
   6520	const int bpf_ptr_sz = 8, host_ptr_sz = sizeof(void *);
   6521	int i, j, nrels, new_sz;
   6522	const struct btf_var_secinfo *vi = NULL;
   6523	const struct btf_type *sec, *var, *def;
   6524	struct bpf_map *map = NULL, *targ_map = NULL;
   6525	struct bpf_program *targ_prog = NULL;
   6526	bool is_prog_array, is_map_in_map;
   6527	const struct btf_member *member;
   6528	const char *name, *mname, *type;
   6529	unsigned int moff;
   6530	Elf64_Sym *sym;
   6531	Elf64_Rel *rel;
   6532	void *tmp;
   6533
   6534	if (!obj->efile.btf_maps_sec_btf_id || !obj->btf)
   6535		return -EINVAL;
   6536	sec = btf__type_by_id(obj->btf, obj->efile.btf_maps_sec_btf_id);
   6537	if (!sec)
   6538		return -EINVAL;
   6539
   6540	nrels = shdr->sh_size / shdr->sh_entsize;
   6541	for (i = 0; i < nrels; i++) {
   6542		rel = elf_rel_by_idx(data, i);
   6543		if (!rel) {
   6544			pr_warn(".maps relo #%d: failed to get ELF relo\n", i);
   6545			return -LIBBPF_ERRNO__FORMAT;
   6546		}
   6547
   6548		sym = elf_sym_by_idx(obj, ELF64_R_SYM(rel->r_info));
   6549		if (!sym) {
   6550			pr_warn(".maps relo #%d: symbol %zx not found\n",
   6551				i, (size_t)ELF64_R_SYM(rel->r_info));
   6552			return -LIBBPF_ERRNO__FORMAT;
   6553		}
   6554		name = elf_sym_str(obj, sym->st_name) ?: "<?>";
   6555
   6556		pr_debug(".maps relo #%d: for %zd value %zd rel->r_offset %zu name %d ('%s')\n",
   6557			 i, (ssize_t)(rel->r_info >> 32), (size_t)sym->st_value,
   6558			 (size_t)rel->r_offset, sym->st_name, name);
   6559
   6560		for (j = 0; j < obj->nr_maps; j++) {
   6561			map = &obj->maps[j];
   6562			if (map->sec_idx != obj->efile.btf_maps_shndx)
   6563				continue;
   6564
   6565			vi = btf_var_secinfos(sec) + map->btf_var_idx;
   6566			if (vi->offset <= rel->r_offset &&
   6567			    rel->r_offset + bpf_ptr_sz <= vi->offset + vi->size)
   6568				break;
   6569		}
   6570		if (j == obj->nr_maps) {
   6571			pr_warn(".maps relo #%d: cannot find map '%s' at rel->r_offset %zu\n",
   6572				i, name, (size_t)rel->r_offset);
   6573			return -EINVAL;
   6574		}
   6575
   6576		is_map_in_map = bpf_map_type__is_map_in_map(map->def.type);
   6577		is_prog_array = map->def.type == BPF_MAP_TYPE_PROG_ARRAY;
   6578		type = is_map_in_map ? "map" : "prog";
   6579		if (is_map_in_map) {
   6580			if (sym->st_shndx != obj->efile.btf_maps_shndx) {
   6581				pr_warn(".maps relo #%d: '%s' isn't a BTF-defined map\n",
   6582					i, name);
   6583				return -LIBBPF_ERRNO__RELOC;
   6584			}
   6585			if (map->def.type == BPF_MAP_TYPE_HASH_OF_MAPS &&
   6586			    map->def.key_size != sizeof(int)) {
   6587				pr_warn(".maps relo #%d: hash-of-maps '%s' should have key size %zu.\n",
   6588					i, map->name, sizeof(int));
   6589				return -EINVAL;
   6590			}
   6591			targ_map = bpf_object__find_map_by_name(obj, name);
   6592			if (!targ_map) {
   6593				pr_warn(".maps relo #%d: '%s' isn't a valid map reference\n",
   6594					i, name);
   6595				return -ESRCH;
   6596			}
   6597		} else if (is_prog_array) {
   6598			targ_prog = bpf_object__find_program_by_name(obj, name);
   6599			if (!targ_prog) {
   6600				pr_warn(".maps relo #%d: '%s' isn't a valid program reference\n",
   6601					i, name);
   6602				return -ESRCH;
   6603			}
   6604			if (targ_prog->sec_idx != sym->st_shndx ||
   6605			    targ_prog->sec_insn_off * 8 != sym->st_value ||
   6606			    prog_is_subprog(obj, targ_prog)) {
   6607				pr_warn(".maps relo #%d: '%s' isn't an entry-point program\n",
   6608					i, name);
   6609				return -LIBBPF_ERRNO__RELOC;
   6610			}
   6611		} else {
   6612			return -EINVAL;
   6613		}
   6614
   6615		var = btf__type_by_id(obj->btf, vi->type);
   6616		def = skip_mods_and_typedefs(obj->btf, var->type, NULL);
   6617		if (btf_vlen(def) == 0)
   6618			return -EINVAL;
   6619		member = btf_members(def) + btf_vlen(def) - 1;
   6620		mname = btf__name_by_offset(obj->btf, member->name_off);
   6621		if (strcmp(mname, "values"))
   6622			return -EINVAL;
   6623
   6624		moff = btf_member_bit_offset(def, btf_vlen(def) - 1) / 8;
   6625		if (rel->r_offset - vi->offset < moff)
   6626			return -EINVAL;
   6627
   6628		moff = rel->r_offset - vi->offset - moff;
   6629		/* here we use BPF pointer size, which is always 64 bit, as we
   6630		 * are parsing ELF that was built for BPF target
   6631		 */
   6632		if (moff % bpf_ptr_sz)
   6633			return -EINVAL;
   6634		moff /= bpf_ptr_sz;
   6635		if (moff >= map->init_slots_sz) {
   6636			new_sz = moff + 1;
   6637			tmp = libbpf_reallocarray(map->init_slots, new_sz, host_ptr_sz);
   6638			if (!tmp)
   6639				return -ENOMEM;
   6640			map->init_slots = tmp;
   6641			memset(map->init_slots + map->init_slots_sz, 0,
   6642			       (new_sz - map->init_slots_sz) * host_ptr_sz);
   6643			map->init_slots_sz = new_sz;
   6644		}
   6645		map->init_slots[moff] = is_map_in_map ? (void *)targ_map : (void *)targ_prog;
   6646
   6647		pr_debug(".maps relo #%d: map '%s' slot [%d] points to %s '%s'\n",
   6648			 i, map->name, moff, type, name);
   6649	}
   6650
   6651	return 0;
   6652}
   6653
   6654static int bpf_object__collect_relos(struct bpf_object *obj)
   6655{
   6656	int i, err;
   6657
   6658	for (i = 0; i < obj->efile.sec_cnt; i++) {
   6659		struct elf_sec_desc *sec_desc = &obj->efile.secs[i];
   6660		Elf64_Shdr *shdr;
   6661		Elf_Data *data;
   6662		int idx;
   6663
   6664		if (sec_desc->sec_type != SEC_RELO)
   6665			continue;
   6666
   6667		shdr = sec_desc->shdr;
   6668		data = sec_desc->data;
   6669		idx = shdr->sh_info;
   6670
   6671		if (shdr->sh_type != SHT_REL) {
   6672			pr_warn("internal error at %d\n", __LINE__);
   6673			return -LIBBPF_ERRNO__INTERNAL;
   6674		}
   6675
   6676		if (idx == obj->efile.st_ops_shndx)
   6677			err = bpf_object__collect_st_ops_relos(obj, shdr, data);
   6678		else if (idx == obj->efile.btf_maps_shndx)
   6679			err = bpf_object__collect_map_relos(obj, shdr, data);
   6680		else
   6681			err = bpf_object__collect_prog_relos(obj, shdr, data);
   6682		if (err)
   6683			return err;
   6684	}
   6685
   6686	bpf_object__sort_relos(obj);
   6687	return 0;
   6688}
   6689
   6690static bool insn_is_helper_call(struct bpf_insn *insn, enum bpf_func_id *func_id)
   6691{
   6692	if (BPF_CLASS(insn->code) == BPF_JMP &&
   6693	    BPF_OP(insn->code) == BPF_CALL &&
   6694	    BPF_SRC(insn->code) == BPF_K &&
   6695	    insn->src_reg == 0 &&
   6696	    insn->dst_reg == 0) {
   6697		    *func_id = insn->imm;
   6698		    return true;
   6699	}
   6700	return false;
   6701}
   6702
   6703static int bpf_object__sanitize_prog(struct bpf_object *obj, struct bpf_program *prog)
   6704{
   6705	struct bpf_insn *insn = prog->insns;
   6706	enum bpf_func_id func_id;
   6707	int i;
   6708
   6709	if (obj->gen_loader)
   6710		return 0;
   6711
   6712	for (i = 0; i < prog->insns_cnt; i++, insn++) {
   6713		if (!insn_is_helper_call(insn, &func_id))
   6714			continue;
   6715
   6716		/* on kernels that don't yet support
   6717		 * bpf_probe_read_{kernel,user}[_str] helpers, fall back
   6718		 * to bpf_probe_read() which works well for old kernels
   6719		 */
   6720		switch (func_id) {
   6721		case BPF_FUNC_probe_read_kernel:
   6722		case BPF_FUNC_probe_read_user:
   6723			if (!kernel_supports(obj, FEAT_PROBE_READ_KERN))
   6724				insn->imm = BPF_FUNC_probe_read;
   6725			break;
   6726		case BPF_FUNC_probe_read_kernel_str:
   6727		case BPF_FUNC_probe_read_user_str:
   6728			if (!kernel_supports(obj, FEAT_PROBE_READ_KERN))
   6729				insn->imm = BPF_FUNC_probe_read_str;
   6730			break;
   6731		default:
   6732			break;
   6733		}
   6734	}
   6735	return 0;
   6736}
   6737
   6738static int libbpf_find_attach_btf_id(struct bpf_program *prog, const char *attach_name,
   6739				     int *btf_obj_fd, int *btf_type_id);
   6740
   6741/* this is called as prog->sec_def->prog_prepare_load_fn for libbpf-supported sec_defs */
   6742static int libbpf_prepare_prog_load(struct bpf_program *prog,
   6743				    struct bpf_prog_load_opts *opts, long cookie)
   6744{
   6745	enum sec_def_flags def = cookie;
   6746
   6747	/* old kernels might not support specifying expected_attach_type */
   6748	if ((def & SEC_EXP_ATTACH_OPT) && !kernel_supports(prog->obj, FEAT_EXP_ATTACH_TYPE))
   6749		opts->expected_attach_type = 0;
   6750
   6751	if (def & SEC_SLEEPABLE)
   6752		opts->prog_flags |= BPF_F_SLEEPABLE;
   6753
   6754	if (prog->type == BPF_PROG_TYPE_XDP && (def & SEC_XDP_FRAGS))
   6755		opts->prog_flags |= BPF_F_XDP_HAS_FRAGS;
   6756
   6757	if (def & SEC_DEPRECATED) {
   6758		pr_warn("SEC(\"%s\") is deprecated, please see https://github.com/libbpf/libbpf/wiki/Libbpf-1.0-migration-guide#bpf-program-sec-annotation-deprecations for details\n",
   6759			prog->sec_name);
   6760	}
   6761
   6762	if ((def & SEC_ATTACH_BTF) && !prog->attach_btf_id) {
   6763		int btf_obj_fd = 0, btf_type_id = 0, err;
   6764		const char *attach_name;
   6765
   6766		attach_name = strchr(prog->sec_name, '/');
   6767		if (!attach_name) {
   6768			/* if BPF program is annotated with just SEC("fentry")
   6769			 * (or similar) without declaratively specifying
   6770			 * target, then it is expected that target will be
   6771			 * specified with bpf_program__set_attach_target() at
   6772			 * runtime before BPF object load step. If not, then
   6773			 * there is nothing to load into the kernel as BPF
   6774			 * verifier won't be able to validate BPF program
   6775			 * correctness anyways.
   6776			 */
   6777			pr_warn("prog '%s': no BTF-based attach target is specified, use bpf_program__set_attach_target()\n",
   6778				prog->name);
   6779			return -EINVAL;
   6780		}
   6781		attach_name++; /* skip over / */
   6782
   6783		err = libbpf_find_attach_btf_id(prog, attach_name, &btf_obj_fd, &btf_type_id);
   6784		if (err)
   6785			return err;
   6786
   6787		/* cache resolved BTF FD and BTF type ID in the prog */
   6788		prog->attach_btf_obj_fd = btf_obj_fd;
   6789		prog->attach_btf_id = btf_type_id;
   6790
   6791		/* but by now libbpf common logic is not utilizing
   6792		 * prog->atach_btf_obj_fd/prog->attach_btf_id anymore because
   6793		 * this callback is called after opts were populated by
   6794		 * libbpf, so this callback has to update opts explicitly here
   6795		 */
   6796		opts->attach_btf_obj_fd = btf_obj_fd;
   6797		opts->attach_btf_id = btf_type_id;
   6798	}
   6799	return 0;
   6800}
   6801
   6802static void fixup_verifier_log(struct bpf_program *prog, char *buf, size_t buf_sz);
   6803
   6804static int bpf_object_load_prog_instance(struct bpf_object *obj, struct bpf_program *prog,
   6805					 struct bpf_insn *insns, int insns_cnt,
   6806					 const char *license, __u32 kern_version,
   6807					 int *prog_fd)
   6808{
   6809	LIBBPF_OPTS(bpf_prog_load_opts, load_attr);
   6810	const char *prog_name = NULL;
   6811	char *cp, errmsg[STRERR_BUFSIZE];
   6812	size_t log_buf_size = 0;
   6813	char *log_buf = NULL, *tmp;
   6814	int btf_fd, ret, err;
   6815	bool own_log_buf = true;
   6816	__u32 log_level = prog->log_level;
   6817
   6818	if (prog->type == BPF_PROG_TYPE_UNSPEC) {
   6819		/*
   6820		 * The program type must be set.  Most likely we couldn't find a proper
   6821		 * section definition at load time, and thus we didn't infer the type.
   6822		 */
   6823		pr_warn("prog '%s': missing BPF prog type, check ELF section name '%s'\n",
   6824			prog->name, prog->sec_name);
   6825		return -EINVAL;
   6826	}
   6827
   6828	if (!insns || !insns_cnt)
   6829		return -EINVAL;
   6830
   6831	load_attr.expected_attach_type = prog->expected_attach_type;
   6832	if (kernel_supports(obj, FEAT_PROG_NAME))
   6833		prog_name = prog->name;
   6834	load_attr.attach_prog_fd = prog->attach_prog_fd;
   6835	load_attr.attach_btf_obj_fd = prog->attach_btf_obj_fd;
   6836	load_attr.attach_btf_id = prog->attach_btf_id;
   6837	load_attr.kern_version = kern_version;
   6838	load_attr.prog_ifindex = prog->prog_ifindex;
   6839
   6840	/* specify func_info/line_info only if kernel supports them */
   6841	btf_fd = bpf_object__btf_fd(obj);
   6842	if (btf_fd >= 0 && kernel_supports(obj, FEAT_BTF_FUNC)) {
   6843		load_attr.prog_btf_fd = btf_fd;
   6844		load_attr.func_info = prog->func_info;
   6845		load_attr.func_info_rec_size = prog->func_info_rec_size;
   6846		load_attr.func_info_cnt = prog->func_info_cnt;
   6847		load_attr.line_info = prog->line_info;
   6848		load_attr.line_info_rec_size = prog->line_info_rec_size;
   6849		load_attr.line_info_cnt = prog->line_info_cnt;
   6850	}
   6851	load_attr.log_level = log_level;
   6852	load_attr.prog_flags = prog->prog_flags;
   6853	load_attr.fd_array = obj->fd_array;
   6854
   6855	/* adjust load_attr if sec_def provides custom preload callback */
   6856	if (prog->sec_def && prog->sec_def->prog_prepare_load_fn) {
   6857		err = prog->sec_def->prog_prepare_load_fn(prog, &load_attr, prog->sec_def->cookie);
   6858		if (err < 0) {
   6859			pr_warn("prog '%s': failed to prepare load attributes: %d\n",
   6860				prog->name, err);
   6861			return err;
   6862		}
   6863		insns = prog->insns;
   6864		insns_cnt = prog->insns_cnt;
   6865	}
   6866
   6867	if (obj->gen_loader) {
   6868		bpf_gen__prog_load(obj->gen_loader, prog->type, prog->name,
   6869				   license, insns, insns_cnt, &load_attr,
   6870				   prog - obj->programs);
   6871		*prog_fd = -1;
   6872		return 0;
   6873	}
   6874
   6875retry_load:
   6876	/* if log_level is zero, we don't request logs initially even if
   6877	 * custom log_buf is specified; if the program load fails, then we'll
   6878	 * bump log_level to 1 and use either custom log_buf or we'll allocate
   6879	 * our own and retry the load to get details on what failed
   6880	 */
   6881	if (log_level) {
   6882		if (prog->log_buf) {
   6883			log_buf = prog->log_buf;
   6884			log_buf_size = prog->log_size;
   6885			own_log_buf = false;
   6886		} else if (obj->log_buf) {
   6887			log_buf = obj->log_buf;
   6888			log_buf_size = obj->log_size;
   6889			own_log_buf = false;
   6890		} else {
   6891			log_buf_size = max((size_t)BPF_LOG_BUF_SIZE, log_buf_size * 2);
   6892			tmp = realloc(log_buf, log_buf_size);
   6893			if (!tmp) {
   6894				ret = -ENOMEM;
   6895				goto out;
   6896			}
   6897			log_buf = tmp;
   6898			log_buf[0] = '\0';
   6899			own_log_buf = true;
   6900		}
   6901	}
   6902
   6903	load_attr.log_buf = log_buf;
   6904	load_attr.log_size = log_buf_size;
   6905	load_attr.log_level = log_level;
   6906
   6907	ret = bpf_prog_load(prog->type, prog_name, license, insns, insns_cnt, &load_attr);
   6908	if (ret >= 0) {
   6909		if (log_level && own_log_buf) {
   6910			pr_debug("prog '%s': -- BEGIN PROG LOAD LOG --\n%s-- END PROG LOAD LOG --\n",
   6911				 prog->name, log_buf);
   6912		}
   6913
   6914		if (obj->has_rodata && kernel_supports(obj, FEAT_PROG_BIND_MAP)) {
   6915			struct bpf_map *map;
   6916			int i;
   6917
   6918			for (i = 0; i < obj->nr_maps; i++) {
   6919				map = &prog->obj->maps[i];
   6920				if (map->libbpf_type != LIBBPF_MAP_RODATA)
   6921					continue;
   6922
   6923				if (bpf_prog_bind_map(ret, bpf_map__fd(map), NULL)) {
   6924					cp = libbpf_strerror_r(errno, errmsg, sizeof(errmsg));
   6925					pr_warn("prog '%s': failed to bind map '%s': %s\n",
   6926						prog->name, map->real_name, cp);
   6927					/* Don't fail hard if can't bind rodata. */
   6928				}
   6929			}
   6930		}
   6931
   6932		*prog_fd = ret;
   6933		ret = 0;
   6934		goto out;
   6935	}
   6936
   6937	if (log_level == 0) {
   6938		log_level = 1;
   6939		goto retry_load;
   6940	}
   6941	/* On ENOSPC, increase log buffer size and retry, unless custom
   6942	 * log_buf is specified.
   6943	 * Be careful to not overflow u32, though. Kernel's log buf size limit
   6944	 * isn't part of UAPI so it can always be bumped to full 4GB. So don't
   6945	 * multiply by 2 unless we are sure we'll fit within 32 bits.
   6946	 * Currently, we'll get -EINVAL when we reach (UINT_MAX >> 2).
   6947	 */
   6948	if (own_log_buf && errno == ENOSPC && log_buf_size <= UINT_MAX / 2)
   6949		goto retry_load;
   6950
   6951	ret = -errno;
   6952
   6953	/* post-process verifier log to improve error descriptions */
   6954	fixup_verifier_log(prog, log_buf, log_buf_size);
   6955
   6956	cp = libbpf_strerror_r(errno, errmsg, sizeof(errmsg));
   6957	pr_warn("prog '%s': BPF program load failed: %s\n", prog->name, cp);
   6958	pr_perm_msg(ret);
   6959
   6960	if (own_log_buf && log_buf && log_buf[0] != '\0') {
   6961		pr_warn("prog '%s': -- BEGIN PROG LOAD LOG --\n%s-- END PROG LOAD LOG --\n",
   6962			prog->name, log_buf);
   6963	}
   6964
   6965out:
   6966	if (own_log_buf)
   6967		free(log_buf);
   6968	return ret;
   6969}
   6970
   6971static char *find_prev_line(char *buf, char *cur)
   6972{
   6973	char *p;
   6974
   6975	if (cur == buf) /* end of a log buf */
   6976		return NULL;
   6977
   6978	p = cur - 1;
   6979	while (p - 1 >= buf && *(p - 1) != '\n')
   6980		p--;
   6981
   6982	return p;
   6983}
   6984
   6985static void patch_log(char *buf, size_t buf_sz, size_t log_sz,
   6986		      char *orig, size_t orig_sz, const char *patch)
   6987{
   6988	/* size of the remaining log content to the right from the to-be-replaced part */
   6989	size_t rem_sz = (buf + log_sz) - (orig + orig_sz);
   6990	size_t patch_sz = strlen(patch);
   6991
   6992	if (patch_sz != orig_sz) {
   6993		/* If patch line(s) are longer than original piece of verifier log,
   6994		 * shift log contents by (patch_sz - orig_sz) bytes to the right
   6995		 * starting from after to-be-replaced part of the log.
   6996		 *
   6997		 * If patch line(s) are shorter than original piece of verifier log,
   6998		 * shift log contents by (orig_sz - patch_sz) bytes to the left
   6999		 * starting from after to-be-replaced part of the log
   7000		 *
   7001		 * We need to be careful about not overflowing available
   7002		 * buf_sz capacity. If that's the case, we'll truncate the end
   7003		 * of the original log, as necessary.
   7004		 */
   7005		if (patch_sz > orig_sz) {
   7006			if (orig + patch_sz >= buf + buf_sz) {
   7007				/* patch is big enough to cover remaining space completely */
   7008				patch_sz -= (orig + patch_sz) - (buf + buf_sz) + 1;
   7009				rem_sz = 0;
   7010			} else if (patch_sz - orig_sz > buf_sz - log_sz) {
   7011				/* patch causes part of remaining log to be truncated */
   7012				rem_sz -= (patch_sz - orig_sz) - (buf_sz - log_sz);
   7013			}
   7014		}
   7015		/* shift remaining log to the right by calculated amount */
   7016		memmove(orig + patch_sz, orig + orig_sz, rem_sz);
   7017	}
   7018
   7019	memcpy(orig, patch, patch_sz);
   7020}
   7021
   7022static void fixup_log_failed_core_relo(struct bpf_program *prog,
   7023				       char *buf, size_t buf_sz, size_t log_sz,
   7024				       char *line1, char *line2, char *line3)
   7025{
   7026	/* Expected log for failed and not properly guarded CO-RE relocation:
   7027	 * line1 -> 123: (85) call unknown#195896080
   7028	 * line2 -> invalid func unknown#195896080
   7029	 * line3 -> <anything else or end of buffer>
   7030	 *
   7031	 * "123" is the index of the instruction that was poisoned. We extract
   7032	 * instruction index to find corresponding CO-RE relocation and
   7033	 * replace this part of the log with more relevant information about
   7034	 * failed CO-RE relocation.
   7035	 */
   7036	const struct bpf_core_relo *relo;
   7037	struct bpf_core_spec spec;
   7038	char patch[512], spec_buf[256];
   7039	int insn_idx, err, spec_len;
   7040
   7041	if (sscanf(line1, "%d: (%*d) call unknown#195896080\n", &insn_idx) != 1)
   7042		return;
   7043
   7044	relo = find_relo_core(prog, insn_idx);
   7045	if (!relo)
   7046		return;
   7047
   7048	err = bpf_core_parse_spec(prog->name, prog->obj->btf, relo, &spec);
   7049	if (err)
   7050		return;
   7051
   7052	spec_len = bpf_core_format_spec(spec_buf, sizeof(spec_buf), &spec);
   7053	snprintf(patch, sizeof(patch),
   7054		 "%d: <invalid CO-RE relocation>\n"
   7055		 "failed to resolve CO-RE relocation %s%s\n",
   7056		 insn_idx, spec_buf, spec_len >= sizeof(spec_buf) ? "..." : "");
   7057
   7058	patch_log(buf, buf_sz, log_sz, line1, line3 - line1, patch);
   7059}
   7060
   7061static void fixup_log_missing_map_load(struct bpf_program *prog,
   7062				       char *buf, size_t buf_sz, size_t log_sz,
   7063				       char *line1, char *line2, char *line3)
   7064{
   7065	/* Expected log for failed and not properly guarded CO-RE relocation:
   7066	 * line1 -> 123: (85) call unknown#2001000345
   7067	 * line2 -> invalid func unknown#2001000345
   7068	 * line3 -> <anything else or end of buffer>
   7069	 *
   7070	 * "123" is the index of the instruction that was poisoned.
   7071	 * "345" in "2001000345" are map index in obj->maps to fetch map name.
   7072	 */
   7073	struct bpf_object *obj = prog->obj;
   7074	const struct bpf_map *map;
   7075	int insn_idx, map_idx;
   7076	char patch[128];
   7077
   7078	if (sscanf(line1, "%d: (%*d) call unknown#%d\n", &insn_idx, &map_idx) != 2)
   7079		return;
   7080
   7081	map_idx -= MAP_LDIMM64_POISON_BASE;
   7082	if (map_idx < 0 || map_idx >= obj->nr_maps)
   7083		return;
   7084	map = &obj->maps[map_idx];
   7085
   7086	snprintf(patch, sizeof(patch),
   7087		 "%d: <invalid BPF map reference>\n"
   7088		 "BPF map '%s' is referenced but wasn't created\n",
   7089		 insn_idx, map->name);
   7090
   7091	patch_log(buf, buf_sz, log_sz, line1, line3 - line1, patch);
   7092}
   7093
   7094static void fixup_verifier_log(struct bpf_program *prog, char *buf, size_t buf_sz)
   7095{
   7096	/* look for familiar error patterns in last N lines of the log */
   7097	const size_t max_last_line_cnt = 10;
   7098	char *prev_line, *cur_line, *next_line;
   7099	size_t log_sz;
   7100	int i;
   7101
   7102	if (!buf)
   7103		return;
   7104
   7105	log_sz = strlen(buf) + 1;
   7106	next_line = buf + log_sz - 1;
   7107
   7108	for (i = 0; i < max_last_line_cnt; i++, next_line = cur_line) {
   7109		cur_line = find_prev_line(buf, next_line);
   7110		if (!cur_line)
   7111			return;
   7112
   7113		/* failed CO-RE relocation case */
   7114		if (str_has_pfx(cur_line, "invalid func unknown#195896080\n")) {
   7115			prev_line = find_prev_line(buf, cur_line);
   7116			if (!prev_line)
   7117				continue;
   7118
   7119			fixup_log_failed_core_relo(prog, buf, buf_sz, log_sz,
   7120						   prev_line, cur_line, next_line);
   7121			return;
   7122		} else if (str_has_pfx(cur_line, "invalid func unknown#"MAP_LDIMM64_POISON_PFX)) {
   7123			prev_line = find_prev_line(buf, cur_line);
   7124			if (!prev_line)
   7125				continue;
   7126
   7127			fixup_log_missing_map_load(prog, buf, buf_sz, log_sz,
   7128						   prev_line, cur_line, next_line);
   7129			return;
   7130		}
   7131	}
   7132}
   7133
   7134static int bpf_program_record_relos(struct bpf_program *prog)
   7135{
   7136	struct bpf_object *obj = prog->obj;
   7137	int i;
   7138
   7139	for (i = 0; i < prog->nr_reloc; i++) {
   7140		struct reloc_desc *relo = &prog->reloc_desc[i];
   7141		struct extern_desc *ext = &obj->externs[relo->sym_off];
   7142
   7143		switch (relo->type) {
   7144		case RELO_EXTERN_VAR:
   7145			if (ext->type != EXT_KSYM)
   7146				continue;
   7147			bpf_gen__record_extern(obj->gen_loader, ext->name,
   7148					       ext->is_weak, !ext->ksym.type_id,
   7149					       BTF_KIND_VAR, relo->insn_idx);
   7150			break;
   7151		case RELO_EXTERN_FUNC:
   7152			bpf_gen__record_extern(obj->gen_loader, ext->name,
   7153					       ext->is_weak, false, BTF_KIND_FUNC,
   7154					       relo->insn_idx);
   7155			break;
   7156		case RELO_CORE: {
   7157			struct bpf_core_relo cr = {
   7158				.insn_off = relo->insn_idx * 8,
   7159				.type_id = relo->core_relo->type_id,
   7160				.access_str_off = relo->core_relo->access_str_off,
   7161				.kind = relo->core_relo->kind,
   7162			};
   7163
   7164			bpf_gen__record_relo_core(obj->gen_loader, &cr);
   7165			break;
   7166		}
   7167		default:
   7168			continue;
   7169		}
   7170	}
   7171	return 0;
   7172}
   7173
   7174static int bpf_object_load_prog(struct bpf_object *obj, struct bpf_program *prog,
   7175				const char *license, __u32 kern_ver)
   7176{
   7177	int err = 0, fd, i;
   7178
   7179	if (obj->loaded) {
   7180		pr_warn("prog '%s': can't load after object was loaded\n", prog->name);
   7181		return libbpf_err(-EINVAL);
   7182	}
   7183
   7184	if (prog->instances.nr < 0 || !prog->instances.fds) {
   7185		if (prog->preprocessor) {
   7186			pr_warn("Internal error: can't load program '%s'\n",
   7187				prog->name);
   7188			return libbpf_err(-LIBBPF_ERRNO__INTERNAL);
   7189		}
   7190
   7191		prog->instances.fds = malloc(sizeof(int));
   7192		if (!prog->instances.fds) {
   7193			pr_warn("Not enough memory for BPF fds\n");
   7194			return libbpf_err(-ENOMEM);
   7195		}
   7196		prog->instances.nr = 1;
   7197		prog->instances.fds[0] = -1;
   7198	}
   7199
   7200	if (!prog->preprocessor) {
   7201		if (prog->instances.nr != 1) {
   7202			pr_warn("prog '%s': inconsistent nr(%d) != 1\n",
   7203				prog->name, prog->instances.nr);
   7204		}
   7205		if (obj->gen_loader)
   7206			bpf_program_record_relos(prog);
   7207		err = bpf_object_load_prog_instance(obj, prog,
   7208						    prog->insns, prog->insns_cnt,
   7209						    license, kern_ver, &fd);
   7210		if (!err)
   7211			prog->instances.fds[0] = fd;
   7212		goto out;
   7213	}
   7214
   7215	for (i = 0; i < prog->instances.nr; i++) {
   7216		struct bpf_prog_prep_result result;
   7217		bpf_program_prep_t preprocessor = prog->preprocessor;
   7218
   7219		memset(&result, 0, sizeof(result));
   7220		err = preprocessor(prog, i, prog->insns,
   7221				   prog->insns_cnt, &result);
   7222		if (err) {
   7223			pr_warn("Preprocessing the %dth instance of program '%s' failed\n",
   7224				i, prog->name);
   7225			goto out;
   7226		}
   7227
   7228		if (!result.new_insn_ptr || !result.new_insn_cnt) {
   7229			pr_debug("Skip loading the %dth instance of program '%s'\n",
   7230				 i, prog->name);
   7231			prog->instances.fds[i] = -1;
   7232			if (result.pfd)
   7233				*result.pfd = -1;
   7234			continue;
   7235		}
   7236
   7237		err = bpf_object_load_prog_instance(obj, prog,
   7238						    result.new_insn_ptr, result.new_insn_cnt,
   7239						    license, kern_ver, &fd);
   7240		if (err) {
   7241			pr_warn("Loading the %dth instance of program '%s' failed\n",
   7242				i, prog->name);
   7243			goto out;
   7244		}
   7245
   7246		if (result.pfd)
   7247			*result.pfd = fd;
   7248		prog->instances.fds[i] = fd;
   7249	}
   7250out:
   7251	if (err)
   7252		pr_warn("failed to load program '%s'\n", prog->name);
   7253	return libbpf_err(err);
   7254}
   7255
   7256int bpf_program__load(struct bpf_program *prog, const char *license, __u32 kern_ver)
   7257{
   7258	return bpf_object_load_prog(prog->obj, prog, license, kern_ver);
   7259}
   7260
   7261static int
   7262bpf_object__load_progs(struct bpf_object *obj, int log_level)
   7263{
   7264	struct bpf_program *prog;
   7265	size_t i;
   7266	int err;
   7267
   7268	for (i = 0; i < obj->nr_programs; i++) {
   7269		prog = &obj->programs[i];
   7270		err = bpf_object__sanitize_prog(obj, prog);
   7271		if (err)
   7272			return err;
   7273	}
   7274
   7275	for (i = 0; i < obj->nr_programs; i++) {
   7276		prog = &obj->programs[i];
   7277		if (prog_is_subprog(obj, prog))
   7278			continue;
   7279		if (!prog->autoload) {
   7280			pr_debug("prog '%s': skipped loading\n", prog->name);
   7281			continue;
   7282		}
   7283		prog->log_level |= log_level;
   7284		err = bpf_object_load_prog(obj, prog, obj->license, obj->kern_version);
   7285		if (err)
   7286			return err;
   7287	}
   7288
   7289	bpf_object__free_relocs(obj);
   7290	return 0;
   7291}
   7292
   7293static const struct bpf_sec_def *find_sec_def(const char *sec_name);
   7294
   7295static int bpf_object_init_progs(struct bpf_object *obj, const struct bpf_object_open_opts *opts)
   7296{
   7297	struct bpf_program *prog;
   7298	int err;
   7299
   7300	bpf_object__for_each_program(prog, obj) {
   7301		prog->sec_def = find_sec_def(prog->sec_name);
   7302		if (!prog->sec_def) {
   7303			/* couldn't guess, but user might manually specify */
   7304			pr_debug("prog '%s': unrecognized ELF section name '%s'\n",
   7305				prog->name, prog->sec_name);
   7306			continue;
   7307		}
   7308
   7309		prog->type = prog->sec_def->prog_type;
   7310		prog->expected_attach_type = prog->sec_def->expected_attach_type;
   7311
   7312#pragma GCC diagnostic push
   7313#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
   7314		if (prog->sec_def->prog_type == BPF_PROG_TYPE_TRACING ||
   7315		    prog->sec_def->prog_type == BPF_PROG_TYPE_EXT)
   7316			prog->attach_prog_fd = OPTS_GET(opts, attach_prog_fd, 0);
   7317#pragma GCC diagnostic pop
   7318
   7319		/* sec_def can have custom callback which should be called
   7320		 * after bpf_program is initialized to adjust its properties
   7321		 */
   7322		if (prog->sec_def->prog_setup_fn) {
   7323			err = prog->sec_def->prog_setup_fn(prog, prog->sec_def->cookie);
   7324			if (err < 0) {
   7325				pr_warn("prog '%s': failed to initialize: %d\n",
   7326					prog->name, err);
   7327				return err;
   7328			}
   7329		}
   7330	}
   7331
   7332	return 0;
   7333}
   7334
   7335static struct bpf_object *bpf_object_open(const char *path, const void *obj_buf, size_t obj_buf_sz,
   7336					  const struct bpf_object_open_opts *opts)
   7337{
   7338	const char *obj_name, *kconfig, *btf_tmp_path;
   7339	struct bpf_object *obj;
   7340	char tmp_name[64];
   7341	int err;
   7342	char *log_buf;
   7343	size_t log_size;
   7344	__u32 log_level;
   7345
   7346	if (elf_version(EV_CURRENT) == EV_NONE) {
   7347		pr_warn("failed to init libelf for %s\n",
   7348			path ? : "(mem buf)");
   7349		return ERR_PTR(-LIBBPF_ERRNO__LIBELF);
   7350	}
   7351
   7352	if (!OPTS_VALID(opts, bpf_object_open_opts))
   7353		return ERR_PTR(-EINVAL);
   7354
   7355	obj_name = OPTS_GET(opts, object_name, NULL);
   7356	if (obj_buf) {
   7357		if (!obj_name) {
   7358			snprintf(tmp_name, sizeof(tmp_name), "%lx-%lx",
   7359				 (unsigned long)obj_buf,
   7360				 (unsigned long)obj_buf_sz);
   7361			obj_name = tmp_name;
   7362		}
   7363		path = obj_name;
   7364		pr_debug("loading object '%s' from buffer\n", obj_name);
   7365	}
   7366
   7367	log_buf = OPTS_GET(opts, kernel_log_buf, NULL);
   7368	log_size = OPTS_GET(opts, kernel_log_size, 0);
   7369	log_level = OPTS_GET(opts, kernel_log_level, 0);
   7370	if (log_size > UINT_MAX)
   7371		return ERR_PTR(-EINVAL);
   7372	if (log_size && !log_buf)
   7373		return ERR_PTR(-EINVAL);
   7374
   7375	obj = bpf_object__new(path, obj_buf, obj_buf_sz, obj_name);
   7376	if (IS_ERR(obj))
   7377		return obj;
   7378
   7379	obj->log_buf = log_buf;
   7380	obj->log_size = log_size;
   7381	obj->log_level = log_level;
   7382
   7383	btf_tmp_path = OPTS_GET(opts, btf_custom_path, NULL);
   7384	if (btf_tmp_path) {
   7385		if (strlen(btf_tmp_path) >= PATH_MAX) {
   7386			err = -ENAMETOOLONG;
   7387			goto out;
   7388		}
   7389		obj->btf_custom_path = strdup(btf_tmp_path);
   7390		if (!obj->btf_custom_path) {
   7391			err = -ENOMEM;
   7392			goto out;
   7393		}
   7394	}
   7395
   7396	kconfig = OPTS_GET(opts, kconfig, NULL);
   7397	if (kconfig) {
   7398		obj->kconfig = strdup(kconfig);
   7399		if (!obj->kconfig) {
   7400			err = -ENOMEM;
   7401			goto out;
   7402		}
   7403	}
   7404
   7405	err = bpf_object__elf_init(obj);
   7406	err = err ? : bpf_object__check_endianness(obj);
   7407	err = err ? : bpf_object__elf_collect(obj);
   7408	err = err ? : bpf_object__collect_externs(obj);
   7409	err = err ? : bpf_object__finalize_btf(obj);
   7410	err = err ? : bpf_object__init_maps(obj, opts);
   7411	err = err ? : bpf_object_init_progs(obj, opts);
   7412	err = err ? : bpf_object__collect_relos(obj);
   7413	if (err)
   7414		goto out;
   7415
   7416	bpf_object__elf_finish(obj);
   7417
   7418	return obj;
   7419out:
   7420	bpf_object__close(obj);
   7421	return ERR_PTR(err);
   7422}
   7423
   7424static struct bpf_object *
   7425__bpf_object__open_xattr(struct bpf_object_open_attr *attr, int flags)
   7426{
   7427	DECLARE_LIBBPF_OPTS(bpf_object_open_opts, opts,
   7428		.relaxed_maps = flags & MAPS_RELAX_COMPAT,
   7429	);
   7430
   7431	/* param validation */
   7432	if (!attr->file)
   7433		return NULL;
   7434
   7435	pr_debug("loading %s\n", attr->file);
   7436	return bpf_object_open(attr->file, NULL, 0, &opts);
   7437}
   7438
   7439struct bpf_object *bpf_object__open_xattr(struct bpf_object_open_attr *attr)
   7440{
   7441	return libbpf_ptr(__bpf_object__open_xattr(attr, 0));
   7442}
   7443
   7444struct bpf_object *bpf_object__open(const char *path)
   7445{
   7446	struct bpf_object_open_attr attr = {
   7447		.file		= path,
   7448		.prog_type	= BPF_PROG_TYPE_UNSPEC,
   7449	};
   7450
   7451	return libbpf_ptr(__bpf_object__open_xattr(&attr, 0));
   7452}
   7453
   7454struct bpf_object *
   7455bpf_object__open_file(const char *path, const struct bpf_object_open_opts *opts)
   7456{
   7457	if (!path)
   7458		return libbpf_err_ptr(-EINVAL);
   7459
   7460	pr_debug("loading %s\n", path);
   7461
   7462	return libbpf_ptr(bpf_object_open(path, NULL, 0, opts));
   7463}
   7464
   7465struct bpf_object *
   7466bpf_object__open_mem(const void *obj_buf, size_t obj_buf_sz,
   7467		     const struct bpf_object_open_opts *opts)
   7468{
   7469	if (!obj_buf || obj_buf_sz == 0)
   7470		return libbpf_err_ptr(-EINVAL);
   7471
   7472	return libbpf_ptr(bpf_object_open(NULL, obj_buf, obj_buf_sz, opts));
   7473}
   7474
   7475struct bpf_object *
   7476bpf_object__open_buffer(const void *obj_buf, size_t obj_buf_sz,
   7477			const char *name)
   7478{
   7479	DECLARE_LIBBPF_OPTS(bpf_object_open_opts, opts,
   7480		.object_name = name,
   7481		/* wrong default, but backwards-compatible */
   7482		.relaxed_maps = true,
   7483	);
   7484
   7485	/* returning NULL is wrong, but backwards-compatible */
   7486	if (!obj_buf || obj_buf_sz == 0)
   7487		return errno = EINVAL, NULL;
   7488
   7489	return libbpf_ptr(bpf_object_open(NULL, obj_buf, obj_buf_sz, &opts));
   7490}
   7491
   7492static int bpf_object_unload(struct bpf_object *obj)
   7493{
   7494	size_t i;
   7495
   7496	if (!obj)
   7497		return libbpf_err(-EINVAL);
   7498
   7499	for (i = 0; i < obj->nr_maps; i++) {
   7500		zclose(obj->maps[i].fd);
   7501		if (obj->maps[i].st_ops)
   7502			zfree(&obj->maps[i].st_ops->kern_vdata);
   7503	}
   7504
   7505	for (i = 0; i < obj->nr_programs; i++)
   7506		bpf_program__unload(&obj->programs[i]);
   7507
   7508	return 0;
   7509}
   7510
   7511int bpf_object__unload(struct bpf_object *obj) __attribute__((alias("bpf_object_unload")));
   7512
   7513static int bpf_object__sanitize_maps(struct bpf_object *obj)
   7514{
   7515	struct bpf_map *m;
   7516
   7517	bpf_object__for_each_map(m, obj) {
   7518		if (!bpf_map__is_internal(m))
   7519			continue;
   7520		if (!kernel_supports(obj, FEAT_ARRAY_MMAP))
   7521			m->def.map_flags ^= BPF_F_MMAPABLE;
   7522	}
   7523
   7524	return 0;
   7525}
   7526
   7527int libbpf_kallsyms_parse(kallsyms_cb_t cb, void *ctx)
   7528{
   7529	char sym_type, sym_name[500];
   7530	unsigned long long sym_addr;
   7531	int ret, err = 0;
   7532	FILE *f;
   7533
   7534	f = fopen("/proc/kallsyms", "r");
   7535	if (!f) {
   7536		err = -errno;
   7537		pr_warn("failed to open /proc/kallsyms: %d\n", err);
   7538		return err;
   7539	}
   7540
   7541	while (true) {
   7542		ret = fscanf(f, "%llx %c %499s%*[^\n]\n",
   7543			     &sym_addr, &sym_type, sym_name);
   7544		if (ret == EOF && feof(f))
   7545			break;
   7546		if (ret != 3) {
   7547			pr_warn("failed to read kallsyms entry: %d\n", ret);
   7548			err = -EINVAL;
   7549			break;
   7550		}
   7551
   7552		err = cb(sym_addr, sym_type, sym_name, ctx);
   7553		if (err)
   7554			break;
   7555	}
   7556
   7557	fclose(f);
   7558	return err;
   7559}
   7560
   7561static int kallsyms_cb(unsigned long long sym_addr, char sym_type,
   7562		       const char *sym_name, void *ctx)
   7563{
   7564	struct bpf_object *obj = ctx;
   7565	const struct btf_type *t;
   7566	struct extern_desc *ext;
   7567
   7568	ext = find_extern_by_name(obj, sym_name);
   7569	if (!ext || ext->type != EXT_KSYM)
   7570		return 0;
   7571
   7572	t = btf__type_by_id(obj->btf, ext->btf_id);
   7573	if (!btf_is_var(t))
   7574		return 0;
   7575
   7576	if (ext->is_set && ext->ksym.addr != sym_addr) {
   7577		pr_warn("extern (ksym) '%s' resolution is ambiguous: 0x%llx or 0x%llx\n",
   7578			sym_name, ext->ksym.addr, sym_addr);
   7579		return -EINVAL;
   7580	}
   7581	if (!ext->is_set) {
   7582		ext->is_set = true;
   7583		ext->ksym.addr = sym_addr;
   7584		pr_debug("extern (ksym) %s=0x%llx\n", sym_name, sym_addr);
   7585	}
   7586	return 0;
   7587}
   7588
   7589static int bpf_object__read_kallsyms_file(struct bpf_object *obj)
   7590{
   7591	return libbpf_kallsyms_parse(kallsyms_cb, obj);
   7592}
   7593
   7594static int find_ksym_btf_id(struct bpf_object *obj, const char *ksym_name,
   7595			    __u16 kind, struct btf **res_btf,
   7596			    struct module_btf **res_mod_btf)
   7597{
   7598	struct module_btf *mod_btf;
   7599	struct btf *btf;
   7600	int i, id, err;
   7601
   7602	btf = obj->btf_vmlinux;
   7603	mod_btf = NULL;
   7604	id = btf__find_by_name_kind(btf, ksym_name, kind);
   7605
   7606	if (id == -ENOENT) {
   7607		err = load_module_btfs(obj);
   7608		if (err)
   7609			return err;
   7610
   7611		for (i = 0; i < obj->btf_module_cnt; i++) {
   7612			/* we assume module_btf's BTF FD is always >0 */
   7613			mod_btf = &obj->btf_modules[i];
   7614			btf = mod_btf->btf;
   7615			id = btf__find_by_name_kind_own(btf, ksym_name, kind);
   7616			if (id != -ENOENT)
   7617				break;
   7618		}
   7619	}
   7620	if (id <= 0)
   7621		return -ESRCH;
   7622
   7623	*res_btf = btf;
   7624	*res_mod_btf = mod_btf;
   7625	return id;
   7626}
   7627
   7628static int bpf_object__resolve_ksym_var_btf_id(struct bpf_object *obj,
   7629					       struct extern_desc *ext)
   7630{
   7631	const struct btf_type *targ_var, *targ_type;
   7632	__u32 targ_type_id, local_type_id;
   7633	struct module_btf *mod_btf = NULL;
   7634	const char *targ_var_name;
   7635	struct btf *btf = NULL;
   7636	int id, err;
   7637
   7638	id = find_ksym_btf_id(obj, ext->name, BTF_KIND_VAR, &btf, &mod_btf);
   7639	if (id < 0) {
   7640		if (id == -ESRCH && ext->is_weak)
   7641			return 0;
   7642		pr_warn("extern (var ksym) '%s': not found in kernel BTF\n",
   7643			ext->name);
   7644		return id;
   7645	}
   7646
   7647	/* find local type_id */
   7648	local_type_id = ext->ksym.type_id;
   7649
   7650	/* find target type_id */
   7651	targ_var = btf__type_by_id(btf, id);
   7652	targ_var_name = btf__name_by_offset(btf, targ_var->name_off);
   7653	targ_type = skip_mods_and_typedefs(btf, targ_var->type, &targ_type_id);
   7654
   7655	err = bpf_core_types_are_compat(obj->btf, local_type_id,
   7656					btf, targ_type_id);
   7657	if (err <= 0) {
   7658		const struct btf_type *local_type;
   7659		const char *targ_name, *local_name;
   7660
   7661		local_type = btf__type_by_id(obj->btf, local_type_id);
   7662		local_name = btf__name_by_offset(obj->btf, local_type->name_off);
   7663		targ_name = btf__name_by_offset(btf, targ_type->name_off);
   7664
   7665		pr_warn("extern (var ksym) '%s': incompatible types, expected [%d] %s %s, but kernel has [%d] %s %s\n",
   7666			ext->name, local_type_id,
   7667			btf_kind_str(local_type), local_name, targ_type_id,
   7668			btf_kind_str(targ_type), targ_name);
   7669		return -EINVAL;
   7670	}
   7671
   7672	ext->is_set = true;
   7673	ext->ksym.kernel_btf_obj_fd = mod_btf ? mod_btf->fd : 0;
   7674	ext->ksym.kernel_btf_id = id;
   7675	pr_debug("extern (var ksym) '%s': resolved to [%d] %s %s\n",
   7676		 ext->name, id, btf_kind_str(targ_var), targ_var_name);
   7677
   7678	return 0;
   7679}
   7680
   7681static int bpf_object__resolve_ksym_func_btf_id(struct bpf_object *obj,
   7682						struct extern_desc *ext)
   7683{
   7684	int local_func_proto_id, kfunc_proto_id, kfunc_id;
   7685	struct module_btf *mod_btf = NULL;
   7686	const struct btf_type *kern_func;
   7687	struct btf *kern_btf = NULL;
   7688	int ret;
   7689
   7690	local_func_proto_id = ext->ksym.type_id;
   7691
   7692	kfunc_id = find_ksym_btf_id(obj, ext->name, BTF_KIND_FUNC, &kern_btf, &mod_btf);
   7693	if (kfunc_id < 0) {
   7694		if (kfunc_id == -ESRCH && ext->is_weak)
   7695			return 0;
   7696		pr_warn("extern (func ksym) '%s': not found in kernel or module BTFs\n",
   7697			ext->name);
   7698		return kfunc_id;
   7699	}
   7700
   7701	kern_func = btf__type_by_id(kern_btf, kfunc_id);
   7702	kfunc_proto_id = kern_func->type;
   7703
   7704	ret = bpf_core_types_are_compat(obj->btf, local_func_proto_id,
   7705					kern_btf, kfunc_proto_id);
   7706	if (ret <= 0) {
   7707		pr_warn("extern (func ksym) '%s': func_proto [%d] incompatible with kernel [%d]\n",
   7708			ext->name, local_func_proto_id, kfunc_proto_id);
   7709		return -EINVAL;
   7710	}
   7711
   7712	/* set index for module BTF fd in fd_array, if unset */
   7713	if (mod_btf && !mod_btf->fd_array_idx) {
   7714		/* insn->off is s16 */
   7715		if (obj->fd_array_cnt == INT16_MAX) {
   7716			pr_warn("extern (func ksym) '%s': module BTF fd index %d too big to fit in bpf_insn offset\n",
   7717				ext->name, mod_btf->fd_array_idx);
   7718			return -E2BIG;
   7719		}
   7720		/* Cannot use index 0 for module BTF fd */
   7721		if (!obj->fd_array_cnt)
   7722			obj->fd_array_cnt = 1;
   7723
   7724		ret = libbpf_ensure_mem((void **)&obj->fd_array, &obj->fd_array_cap, sizeof(int),
   7725					obj->fd_array_cnt + 1);
   7726		if (ret)
   7727			return ret;
   7728		mod_btf->fd_array_idx = obj->fd_array_cnt;
   7729		/* we assume module BTF FD is always >0 */
   7730		obj->fd_array[obj->fd_array_cnt++] = mod_btf->fd;
   7731	}
   7732
   7733	ext->is_set = true;
   7734	ext->ksym.kernel_btf_id = kfunc_id;
   7735	ext->ksym.btf_fd_idx = mod_btf ? mod_btf->fd_array_idx : 0;
   7736	pr_debug("extern (func ksym) '%s': resolved to kernel [%d]\n",
   7737		 ext->name, kfunc_id);
   7738
   7739	return 0;
   7740}
   7741
   7742static int bpf_object__resolve_ksyms_btf_id(struct bpf_object *obj)
   7743{
   7744	const struct btf_type *t;
   7745	struct extern_desc *ext;
   7746	int i, err;
   7747
   7748	for (i = 0; i < obj->nr_extern; i++) {
   7749		ext = &obj->externs[i];
   7750		if (ext->type != EXT_KSYM || !ext->ksym.type_id)
   7751			continue;
   7752
   7753		if (obj->gen_loader) {
   7754			ext->is_set = true;
   7755			ext->ksym.kernel_btf_obj_fd = 0;
   7756			ext->ksym.kernel_btf_id = 0;
   7757			continue;
   7758		}
   7759		t = btf__type_by_id(obj->btf, ext->btf_id);
   7760		if (btf_is_var(t))
   7761			err = bpf_object__resolve_ksym_var_btf_id(obj, ext);
   7762		else
   7763			err = bpf_object__resolve_ksym_func_btf_id(obj, ext);
   7764		if (err)
   7765			return err;
   7766	}
   7767	return 0;
   7768}
   7769
   7770static int bpf_object__resolve_externs(struct bpf_object *obj,
   7771				       const char *extra_kconfig)
   7772{
   7773	bool need_config = false, need_kallsyms = false;
   7774	bool need_vmlinux_btf = false;
   7775	struct extern_desc *ext;
   7776	void *kcfg_data = NULL;
   7777	int err, i;
   7778
   7779	if (obj->nr_extern == 0)
   7780		return 0;
   7781
   7782	if (obj->kconfig_map_idx >= 0)
   7783		kcfg_data = obj->maps[obj->kconfig_map_idx].mmaped;
   7784
   7785	for (i = 0; i < obj->nr_extern; i++) {
   7786		ext = &obj->externs[i];
   7787
   7788		if (ext->type == EXT_KCFG &&
   7789		    strcmp(ext->name, "LINUX_KERNEL_VERSION") == 0) {
   7790			void *ext_val = kcfg_data + ext->kcfg.data_off;
   7791			__u32 kver = get_kernel_version();
   7792
   7793			if (!kver) {
   7794				pr_warn("failed to get kernel version\n");
   7795				return -EINVAL;
   7796			}
   7797			err = set_kcfg_value_num(ext, ext_val, kver);
   7798			if (err)
   7799				return err;
   7800			pr_debug("extern (kcfg) %s=0x%x\n", ext->name, kver);
   7801		} else if (ext->type == EXT_KCFG && str_has_pfx(ext->name, "CONFIG_")) {
   7802			need_config = true;
   7803		} else if (ext->type == EXT_KSYM) {
   7804			if (ext->ksym.type_id)
   7805				need_vmlinux_btf = true;
   7806			else
   7807				need_kallsyms = true;
   7808		} else {
   7809			pr_warn("unrecognized extern '%s'\n", ext->name);
   7810			return -EINVAL;
   7811		}
   7812	}
   7813	if (need_config && extra_kconfig) {
   7814		err = bpf_object__read_kconfig_mem(obj, extra_kconfig, kcfg_data);
   7815		if (err)
   7816			return -EINVAL;
   7817		need_config = false;
   7818		for (i = 0; i < obj->nr_extern; i++) {
   7819			ext = &obj->externs[i];
   7820			if (ext->type == EXT_KCFG && !ext->is_set) {
   7821				need_config = true;
   7822				break;
   7823			}
   7824		}
   7825	}
   7826	if (need_config) {
   7827		err = bpf_object__read_kconfig_file(obj, kcfg_data);
   7828		if (err)
   7829			return -EINVAL;
   7830	}
   7831	if (need_kallsyms) {
   7832		err = bpf_object__read_kallsyms_file(obj);
   7833		if (err)
   7834			return -EINVAL;
   7835	}
   7836	if (need_vmlinux_btf) {
   7837		err = bpf_object__resolve_ksyms_btf_id(obj);
   7838		if (err)
   7839			return -EINVAL;
   7840	}
   7841	for (i = 0; i < obj->nr_extern; i++) {
   7842		ext = &obj->externs[i];
   7843
   7844		if (!ext->is_set && !ext->is_weak) {
   7845			pr_warn("extern %s (strong) not resolved\n", ext->name);
   7846			return -ESRCH;
   7847		} else if (!ext->is_set) {
   7848			pr_debug("extern %s (weak) not resolved, defaulting to zero\n",
   7849				 ext->name);
   7850		}
   7851	}
   7852
   7853	return 0;
   7854}
   7855
   7856static int bpf_object_load(struct bpf_object *obj, int extra_log_level, const char *target_btf_path)
   7857{
   7858	int err, i;
   7859
   7860	if (!obj)
   7861		return libbpf_err(-EINVAL);
   7862
   7863	if (obj->loaded) {
   7864		pr_warn("object '%s': load can't be attempted twice\n", obj->name);
   7865		return libbpf_err(-EINVAL);
   7866	}
   7867
   7868	if (obj->gen_loader)
   7869		bpf_gen__init(obj->gen_loader, extra_log_level, obj->nr_programs, obj->nr_maps);
   7870
   7871	err = bpf_object__probe_loading(obj);
   7872	err = err ? : bpf_object__load_vmlinux_btf(obj, false);
   7873	err = err ? : bpf_object__resolve_externs(obj, obj->kconfig);
   7874	err = err ? : bpf_object__sanitize_and_load_btf(obj);
   7875	err = err ? : bpf_object__sanitize_maps(obj);
   7876	err = err ? : bpf_object__init_kern_struct_ops_maps(obj);
   7877	err = err ? : bpf_object__create_maps(obj);
   7878	err = err ? : bpf_object__relocate(obj, obj->btf_custom_path ? : target_btf_path);
   7879	err = err ? : bpf_object__load_progs(obj, extra_log_level);
   7880	err = err ? : bpf_object_init_prog_arrays(obj);
   7881
   7882	if (obj->gen_loader) {
   7883		/* reset FDs */
   7884		if (obj->btf)
   7885			btf__set_fd(obj->btf, -1);
   7886		for (i = 0; i < obj->nr_maps; i++)
   7887			obj->maps[i].fd = -1;
   7888		if (!err)
   7889			err = bpf_gen__finish(obj->gen_loader, obj->nr_programs, obj->nr_maps);
   7890	}
   7891
   7892	/* clean up fd_array */
   7893	zfree(&obj->fd_array);
   7894
   7895	/* clean up module BTFs */
   7896	for (i = 0; i < obj->btf_module_cnt; i++) {
   7897		close(obj->btf_modules[i].fd);
   7898		btf__free(obj->btf_modules[i].btf);
   7899		free(obj->btf_modules[i].name);
   7900	}
   7901	free(obj->btf_modules);
   7902
   7903	/* clean up vmlinux BTF */
   7904	btf__free(obj->btf_vmlinux);
   7905	obj->btf_vmlinux = NULL;
   7906
   7907	obj->loaded = true; /* doesn't matter if successfully or not */
   7908
   7909	if (err)
   7910		goto out;
   7911
   7912	return 0;
   7913out:
   7914	/* unpin any maps that were auto-pinned during load */
   7915	for (i = 0; i < obj->nr_maps; i++)
   7916		if (obj->maps[i].pinned && !obj->maps[i].reused)
   7917			bpf_map__unpin(&obj->maps[i], NULL);
   7918
   7919	bpf_object_unload(obj);
   7920	pr_warn("failed to load object '%s'\n", obj->path);
   7921	return libbpf_err(err);
   7922}
   7923
   7924int bpf_object__load_xattr(struct bpf_object_load_attr *attr)
   7925{
   7926	return bpf_object_load(attr->obj, attr->log_level, attr->target_btf_path);
   7927}
   7928
   7929int bpf_object__load(struct bpf_object *obj)
   7930{
   7931	return bpf_object_load(obj, 0, NULL);
   7932}
   7933
   7934static int make_parent_dir(const char *path)
   7935{
   7936	char *cp, errmsg[STRERR_BUFSIZE];
   7937	char *dname, *dir;
   7938	int err = 0;
   7939
   7940	dname = strdup(path);
   7941	if (dname == NULL)
   7942		return -ENOMEM;
   7943
   7944	dir = dirname(dname);
   7945	if (mkdir(dir, 0700) && errno != EEXIST)
   7946		err = -errno;
   7947
   7948	free(dname);
   7949	if (err) {
   7950		cp = libbpf_strerror_r(-err, errmsg, sizeof(errmsg));
   7951		pr_warn("failed to mkdir %s: %s\n", path, cp);
   7952	}
   7953	return err;
   7954}
   7955
   7956static int check_path(const char *path)
   7957{
   7958	char *cp, errmsg[STRERR_BUFSIZE];
   7959	struct statfs st_fs;
   7960	char *dname, *dir;
   7961	int err = 0;
   7962
   7963	if (path == NULL)
   7964		return -EINVAL;
   7965
   7966	dname = strdup(path);
   7967	if (dname == NULL)
   7968		return -ENOMEM;
   7969
   7970	dir = dirname(dname);
   7971	if (statfs(dir, &st_fs)) {
   7972		cp = libbpf_strerror_r(errno, errmsg, sizeof(errmsg));
   7973		pr_warn("failed to statfs %s: %s\n", dir, cp);
   7974		err = -errno;
   7975	}
   7976	free(dname);
   7977
   7978	if (!err && st_fs.f_type != BPF_FS_MAGIC) {
   7979		pr_warn("specified path %s is not on BPF FS\n", path);
   7980		err = -EINVAL;
   7981	}
   7982
   7983	return err;
   7984}
   7985
   7986static int bpf_program_pin_instance(struct bpf_program *prog, const char *path, int instance)
   7987{
   7988	char *cp, errmsg[STRERR_BUFSIZE];
   7989	int err;
   7990
   7991	err = make_parent_dir(path);
   7992	if (err)
   7993		return libbpf_err(err);
   7994
   7995	err = check_path(path);
   7996	if (err)
   7997		return libbpf_err(err);
   7998
   7999	if (prog == NULL) {
   8000		pr_warn("invalid program pointer\n");
   8001		return libbpf_err(-EINVAL);
   8002	}
   8003
   8004	if (instance < 0 || instance >= prog->instances.nr) {
   8005		pr_warn("invalid prog instance %d of prog %s (max %d)\n",
   8006			instance, prog->name, prog->instances.nr);
   8007		return libbpf_err(-EINVAL);
   8008	}
   8009
   8010	if (bpf_obj_pin(prog->instances.fds[instance], path)) {
   8011		err = -errno;
   8012		cp = libbpf_strerror_r(err, errmsg, sizeof(errmsg));
   8013		pr_warn("failed to pin program: %s\n", cp);
   8014		return libbpf_err(err);
   8015	}
   8016	pr_debug("pinned program '%s'\n", path);
   8017
   8018	return 0;
   8019}
   8020
   8021static int bpf_program_unpin_instance(struct bpf_program *prog, const char *path, int instance)
   8022{
   8023	int err;
   8024
   8025	err = check_path(path);
   8026	if (err)
   8027		return libbpf_err(err);
   8028
   8029	if (prog == NULL) {
   8030		pr_warn("invalid program pointer\n");
   8031		return libbpf_err(-EINVAL);
   8032	}
   8033
   8034	if (instance < 0 || instance >= prog->instances.nr) {
   8035		pr_warn("invalid prog instance %d of prog %s (max %d)\n",
   8036			instance, prog->name, prog->instances.nr);
   8037		return libbpf_err(-EINVAL);
   8038	}
   8039
   8040	err = unlink(path);
   8041	if (err != 0)
   8042		return libbpf_err(-errno);
   8043
   8044	pr_debug("unpinned program '%s'\n", path);
   8045
   8046	return 0;
   8047}
   8048
   8049__attribute__((alias("bpf_program_pin_instance")))
   8050int bpf_object__pin_instance(struct bpf_program *prog, const char *path, int instance);
   8051
   8052__attribute__((alias("bpf_program_unpin_instance")))
   8053int bpf_program__unpin_instance(struct bpf_program *prog, const char *path, int instance);
   8054
   8055int bpf_program__pin(struct bpf_program *prog, const char *path)
   8056{
   8057	int i, err;
   8058
   8059	err = make_parent_dir(path);
   8060	if (err)
   8061		return libbpf_err(err);
   8062
   8063	err = check_path(path);
   8064	if (err)
   8065		return libbpf_err(err);
   8066
   8067	if (prog == NULL) {
   8068		pr_warn("invalid program pointer\n");
   8069		return libbpf_err(-EINVAL);
   8070	}
   8071
   8072	if (prog->instances.nr <= 0) {
   8073		pr_warn("no instances of prog %s to pin\n", prog->name);
   8074		return libbpf_err(-EINVAL);
   8075	}
   8076
   8077	if (prog->instances.nr == 1) {
   8078		/* don't create subdirs when pinning single instance */
   8079		return bpf_program_pin_instance(prog, path, 0);
   8080	}
   8081
   8082	for (i = 0; i < prog->instances.nr; i++) {
   8083		char buf[PATH_MAX];
   8084		int len;
   8085
   8086		len = snprintf(buf, PATH_MAX, "%s/%d", path, i);
   8087		if (len < 0) {
   8088			err = -EINVAL;
   8089			goto err_unpin;
   8090		} else if (len >= PATH_MAX) {
   8091			err = -ENAMETOOLONG;
   8092			goto err_unpin;
   8093		}
   8094
   8095		err = bpf_program_pin_instance(prog, buf, i);
   8096		if (err)
   8097			goto err_unpin;
   8098	}
   8099
   8100	return 0;
   8101
   8102err_unpin:
   8103	for (i = i - 1; i >= 0; i--) {
   8104		char buf[PATH_MAX];
   8105		int len;
   8106
   8107		len = snprintf(buf, PATH_MAX, "%s/%d", path, i);
   8108		if (len < 0)
   8109			continue;
   8110		else if (len >= PATH_MAX)
   8111			continue;
   8112
   8113		bpf_program_unpin_instance(prog, buf, i);
   8114	}
   8115
   8116	rmdir(path);
   8117
   8118	return libbpf_err(err);
   8119}
   8120
   8121int bpf_program__unpin(struct bpf_program *prog, const char *path)
   8122{
   8123	int i, err;
   8124
   8125	err = check_path(path);
   8126	if (err)
   8127		return libbpf_err(err);
   8128
   8129	if (prog == NULL) {
   8130		pr_warn("invalid program pointer\n");
   8131		return libbpf_err(-EINVAL);
   8132	}
   8133
   8134	if (prog->instances.nr <= 0) {
   8135		pr_warn("no instances of prog %s to pin\n", prog->name);
   8136		return libbpf_err(-EINVAL);
   8137	}
   8138
   8139	if (prog->instances.nr == 1) {
   8140		/* don't create subdirs when pinning single instance */
   8141		return bpf_program_unpin_instance(prog, path, 0);
   8142	}
   8143
   8144	for (i = 0; i < prog->instances.nr; i++) {
   8145		char buf[PATH_MAX];
   8146		int len;
   8147
   8148		len = snprintf(buf, PATH_MAX, "%s/%d", path, i);
   8149		if (len < 0)
   8150			return libbpf_err(-EINVAL);
   8151		else if (len >= PATH_MAX)
   8152			return libbpf_err(-ENAMETOOLONG);
   8153
   8154		err = bpf_program_unpin_instance(prog, buf, i);
   8155		if (err)
   8156			return err;
   8157	}
   8158
   8159	err = rmdir(path);
   8160	if (err)
   8161		return libbpf_err(-errno);
   8162
   8163	return 0;
   8164}
   8165
   8166int bpf_map__pin(struct bpf_map *map, const char *path)
   8167{
   8168	char *cp, errmsg[STRERR_BUFSIZE];
   8169	int err;
   8170
   8171	if (map == NULL) {
   8172		pr_warn("invalid map pointer\n");
   8173		return libbpf_err(-EINVAL);
   8174	}
   8175
   8176	if (map->pin_path) {
   8177		if (path && strcmp(path, map->pin_path)) {
   8178			pr_warn("map '%s' already has pin path '%s' different from '%s'\n",
   8179				bpf_map__name(map), map->pin_path, path);
   8180			return libbpf_err(-EINVAL);
   8181		} else if (map->pinned) {
   8182			pr_debug("map '%s' already pinned at '%s'; not re-pinning\n",
   8183				 bpf_map__name(map), map->pin_path);
   8184			return 0;
   8185		}
   8186	} else {
   8187		if (!path) {
   8188			pr_warn("missing a path to pin map '%s' at\n",
   8189				bpf_map__name(map));
   8190			return libbpf_err(-EINVAL);
   8191		} else if (map->pinned) {
   8192			pr_warn("map '%s' already pinned\n", bpf_map__name(map));
   8193			return libbpf_err(-EEXIST);
   8194		}
   8195
   8196		map->pin_path = strdup(path);
   8197		if (!map->pin_path) {
   8198			err = -errno;
   8199			goto out_err;
   8200		}
   8201	}
   8202
   8203	err = make_parent_dir(map->pin_path);
   8204	if (err)
   8205		return libbpf_err(err);
   8206
   8207	err = check_path(map->pin_path);
   8208	if (err)
   8209		return libbpf_err(err);
   8210
   8211	if (bpf_obj_pin(map->fd, map->pin_path)) {
   8212		err = -errno;
   8213		goto out_err;
   8214	}
   8215
   8216	map->pinned = true;
   8217	pr_debug("pinned map '%s'\n", map->pin_path);
   8218
   8219	return 0;
   8220
   8221out_err:
   8222	cp = libbpf_strerror_r(-err, errmsg, sizeof(errmsg));
   8223	pr_warn("failed to pin map: %s\n", cp);
   8224	return libbpf_err(err);
   8225}
   8226
   8227int bpf_map__unpin(struct bpf_map *map, const char *path)
   8228{
   8229	int err;
   8230
   8231	if (map == NULL) {
   8232		pr_warn("invalid map pointer\n");
   8233		return libbpf_err(-EINVAL);
   8234	}
   8235
   8236	if (map->pin_path) {
   8237		if (path && strcmp(path, map->pin_path)) {
   8238			pr_warn("map '%s' already has pin path '%s' different from '%s'\n",
   8239				bpf_map__name(map), map->pin_path, path);
   8240			return libbpf_err(-EINVAL);
   8241		}
   8242		path = map->pin_path;
   8243	} else if (!path) {
   8244		pr_warn("no path to unpin map '%s' from\n",
   8245			bpf_map__name(map));
   8246		return libbpf_err(-EINVAL);
   8247	}
   8248
   8249	err = check_path(path);
   8250	if (err)
   8251		return libbpf_err(err);
   8252
   8253	err = unlink(path);
   8254	if (err != 0)
   8255		return libbpf_err(-errno);
   8256
   8257	map->pinned = false;
   8258	pr_debug("unpinned map '%s' from '%s'\n", bpf_map__name(map), path);
   8259
   8260	return 0;
   8261}
   8262
   8263int bpf_map__set_pin_path(struct bpf_map *map, const char *path)
   8264{
   8265	char *new = NULL;
   8266
   8267	if (path) {
   8268		new = strdup(path);
   8269		if (!new)
   8270			return libbpf_err(-errno);
   8271	}
   8272
   8273	free(map->pin_path);
   8274	map->pin_path = new;
   8275	return 0;
   8276}
   8277
   8278__alias(bpf_map__pin_path)
   8279const char *bpf_map__get_pin_path(const struct bpf_map *map);
   8280
   8281const char *bpf_map__pin_path(const struct bpf_map *map)
   8282{
   8283	return map->pin_path;
   8284}
   8285
   8286bool bpf_map__is_pinned(const struct bpf_map *map)
   8287{
   8288	return map->pinned;
   8289}
   8290
   8291static void sanitize_pin_path(char *s)
   8292{
   8293	/* bpffs disallows periods in path names */
   8294	while (*s) {
   8295		if (*s == '.')
   8296			*s = '_';
   8297		s++;
   8298	}
   8299}
   8300
   8301int bpf_object__pin_maps(struct bpf_object *obj, const char *path)
   8302{
   8303	struct bpf_map *map;
   8304	int err;
   8305
   8306	if (!obj)
   8307		return libbpf_err(-ENOENT);
   8308
   8309	if (!obj->loaded) {
   8310		pr_warn("object not yet loaded; load it first\n");
   8311		return libbpf_err(-ENOENT);
   8312	}
   8313
   8314	bpf_object__for_each_map(map, obj) {
   8315		char *pin_path = NULL;
   8316		char buf[PATH_MAX];
   8317
   8318		if (!map->autocreate)
   8319			continue;
   8320
   8321		if (path) {
   8322			int len;
   8323
   8324			len = snprintf(buf, PATH_MAX, "%s/%s", path,
   8325				       bpf_map__name(map));
   8326			if (len < 0) {
   8327				err = -EINVAL;
   8328				goto err_unpin_maps;
   8329			} else if (len >= PATH_MAX) {
   8330				err = -ENAMETOOLONG;
   8331				goto err_unpin_maps;
   8332			}
   8333			sanitize_pin_path(buf);
   8334			pin_path = buf;
   8335		} else if (!map->pin_path) {
   8336			continue;
   8337		}
   8338
   8339		err = bpf_map__pin(map, pin_path);
   8340		if (err)
   8341			goto err_unpin_maps;
   8342	}
   8343
   8344	return 0;
   8345
   8346err_unpin_maps:
   8347	while ((map = bpf_object__prev_map(obj, map))) {
   8348		if (!map->pin_path)
   8349			continue;
   8350
   8351		bpf_map__unpin(map, NULL);
   8352	}
   8353
   8354	return libbpf_err(err);
   8355}
   8356
   8357int bpf_object__unpin_maps(struct bpf_object *obj, const char *path)
   8358{
   8359	struct bpf_map *map;
   8360	int err;
   8361
   8362	if (!obj)
   8363		return libbpf_err(-ENOENT);
   8364
   8365	bpf_object__for_each_map(map, obj) {
   8366		char *pin_path = NULL;
   8367		char buf[PATH_MAX];
   8368
   8369		if (path) {
   8370			int len;
   8371
   8372			len = snprintf(buf, PATH_MAX, "%s/%s", path,
   8373				       bpf_map__name(map));
   8374			if (len < 0)
   8375				return libbpf_err(-EINVAL);
   8376			else if (len >= PATH_MAX)
   8377				return libbpf_err(-ENAMETOOLONG);
   8378			sanitize_pin_path(buf);
   8379			pin_path = buf;
   8380		} else if (!map->pin_path) {
   8381			continue;
   8382		}
   8383
   8384		err = bpf_map__unpin(map, pin_path);
   8385		if (err)
   8386			return libbpf_err(err);
   8387	}
   8388
   8389	return 0;
   8390}
   8391
   8392int bpf_object__pin_programs(struct bpf_object *obj, const char *path)
   8393{
   8394	struct bpf_program *prog;
   8395	int err;
   8396
   8397	if (!obj)
   8398		return libbpf_err(-ENOENT);
   8399
   8400	if (!obj->loaded) {
   8401		pr_warn("object not yet loaded; load it first\n");
   8402		return libbpf_err(-ENOENT);
   8403	}
   8404
   8405	bpf_object__for_each_program(prog, obj) {
   8406		char buf[PATH_MAX];
   8407		int len;
   8408
   8409		len = snprintf(buf, PATH_MAX, "%s/%s", path,
   8410			       prog->pin_name);
   8411		if (len < 0) {
   8412			err = -EINVAL;
   8413			goto err_unpin_programs;
   8414		} else if (len >= PATH_MAX) {
   8415			err = -ENAMETOOLONG;
   8416			goto err_unpin_programs;
   8417		}
   8418
   8419		err = bpf_program__pin(prog, buf);
   8420		if (err)
   8421			goto err_unpin_programs;
   8422	}
   8423
   8424	return 0;
   8425
   8426err_unpin_programs:
   8427	while ((prog = bpf_object__prev_program(obj, prog))) {
   8428		char buf[PATH_MAX];
   8429		int len;
   8430
   8431		len = snprintf(buf, PATH_MAX, "%s/%s", path,
   8432			       prog->pin_name);
   8433		if (len < 0)
   8434			continue;
   8435		else if (len >= PATH_MAX)
   8436			continue;
   8437
   8438		bpf_program__unpin(prog, buf);
   8439	}
   8440
   8441	return libbpf_err(err);
   8442}
   8443
   8444int bpf_object__unpin_programs(struct bpf_object *obj, const char *path)
   8445{
   8446	struct bpf_program *prog;
   8447	int err;
   8448
   8449	if (!obj)
   8450		return libbpf_err(-ENOENT);
   8451
   8452	bpf_object__for_each_program(prog, obj) {
   8453		char buf[PATH_MAX];
   8454		int len;
   8455
   8456		len = snprintf(buf, PATH_MAX, "%s/%s", path,
   8457			       prog->pin_name);
   8458		if (len < 0)
   8459			return libbpf_err(-EINVAL);
   8460		else if (len >= PATH_MAX)
   8461			return libbpf_err(-ENAMETOOLONG);
   8462
   8463		err = bpf_program__unpin(prog, buf);
   8464		if (err)
   8465			return libbpf_err(err);
   8466	}
   8467
   8468	return 0;
   8469}
   8470
   8471int bpf_object__pin(struct bpf_object *obj, const char *path)
   8472{
   8473	int err;
   8474
   8475	err = bpf_object__pin_maps(obj, path);
   8476	if (err)
   8477		return libbpf_err(err);
   8478
   8479	err = bpf_object__pin_programs(obj, path);
   8480	if (err) {
   8481		bpf_object__unpin_maps(obj, path);
   8482		return libbpf_err(err);
   8483	}
   8484
   8485	return 0;
   8486}
   8487
   8488static void bpf_map__destroy(struct bpf_map *map)
   8489{
   8490	if (map->clear_priv)
   8491		map->clear_priv(map, map->priv);
   8492	map->priv = NULL;
   8493	map->clear_priv = NULL;
   8494
   8495	if (map->inner_map) {
   8496		bpf_map__destroy(map->inner_map);
   8497		zfree(&map->inner_map);
   8498	}
   8499
   8500	zfree(&map->init_slots);
   8501	map->init_slots_sz = 0;
   8502
   8503	if (map->mmaped) {
   8504		munmap(map->mmaped, bpf_map_mmap_sz(map));
   8505		map->mmaped = NULL;
   8506	}
   8507
   8508	if (map->st_ops) {
   8509		zfree(&map->st_ops->data);
   8510		zfree(&map->st_ops->progs);
   8511		zfree(&map->st_ops->kern_func_off);
   8512		zfree(&map->st_ops);
   8513	}
   8514
   8515	zfree(&map->name);
   8516	zfree(&map->real_name);
   8517	zfree(&map->pin_path);
   8518
   8519	if (map->fd >= 0)
   8520		zclose(map->fd);
   8521}
   8522
   8523void bpf_object__close(struct bpf_object *obj)
   8524{
   8525	size_t i;
   8526
   8527	if (IS_ERR_OR_NULL(obj))
   8528		return;
   8529
   8530	if (obj->clear_priv)
   8531		obj->clear_priv(obj, obj->priv);
   8532
   8533	usdt_manager_free(obj->usdt_man);
   8534	obj->usdt_man = NULL;
   8535
   8536	bpf_gen__free(obj->gen_loader);
   8537	bpf_object__elf_finish(obj);
   8538	bpf_object_unload(obj);
   8539	btf__free(obj->btf);
   8540	btf_ext__free(obj->btf_ext);
   8541
   8542	for (i = 0; i < obj->nr_maps; i++)
   8543		bpf_map__destroy(&obj->maps[i]);
   8544
   8545	zfree(&obj->btf_custom_path);
   8546	zfree(&obj->kconfig);
   8547	zfree(&obj->externs);
   8548	obj->nr_extern = 0;
   8549
   8550	zfree(&obj->maps);
   8551	obj->nr_maps = 0;
   8552
   8553	if (obj->programs && obj->nr_programs) {
   8554		for (i = 0; i < obj->nr_programs; i++)
   8555			bpf_program__exit(&obj->programs[i]);
   8556	}
   8557	zfree(&obj->programs);
   8558
   8559	list_del(&obj->list);
   8560	free(obj);
   8561}
   8562
   8563struct bpf_object *
   8564bpf_object__next(struct bpf_object *prev)
   8565{
   8566	struct bpf_object *next;
   8567	bool strict = (libbpf_mode & LIBBPF_STRICT_NO_OBJECT_LIST);
   8568
   8569	if (strict)
   8570		return NULL;
   8571
   8572	if (!prev)
   8573		next = list_first_entry(&bpf_objects_list,
   8574					struct bpf_object,
   8575					list);
   8576	else
   8577		next = list_next_entry(prev, list);
   8578
   8579	/* Empty list is noticed here so don't need checking on entry. */
   8580	if (&next->list == &bpf_objects_list)
   8581		return NULL;
   8582
   8583	return next;
   8584}
   8585
   8586const char *bpf_object__name(const struct bpf_object *obj)
   8587{
   8588	return obj ? obj->name : libbpf_err_ptr(-EINVAL);
   8589}
   8590
   8591unsigned int bpf_object__kversion(const struct bpf_object *obj)
   8592{
   8593	return obj ? obj->kern_version : 0;
   8594}
   8595
   8596struct btf *bpf_object__btf(const struct bpf_object *obj)
   8597{
   8598	return obj ? obj->btf : NULL;
   8599}
   8600
   8601int bpf_object__btf_fd(const struct bpf_object *obj)
   8602{
   8603	return obj->btf ? btf__fd(obj->btf) : -1;
   8604}
   8605
   8606int bpf_object__set_kversion(struct bpf_object *obj, __u32 kern_version)
   8607{
   8608	if (obj->loaded)
   8609		return libbpf_err(-EINVAL);
   8610
   8611	obj->kern_version = kern_version;
   8612
   8613	return 0;
   8614}
   8615
   8616int bpf_object__set_priv(struct bpf_object *obj, void *priv,
   8617			 bpf_object_clear_priv_t clear_priv)
   8618{
   8619	if (obj->priv && obj->clear_priv)
   8620		obj->clear_priv(obj, obj->priv);
   8621
   8622	obj->priv = priv;
   8623	obj->clear_priv = clear_priv;
   8624	return 0;
   8625}
   8626
   8627void *bpf_object__priv(const struct bpf_object *obj)
   8628{
   8629	return obj ? obj->priv : libbpf_err_ptr(-EINVAL);
   8630}
   8631
   8632int bpf_object__gen_loader(struct bpf_object *obj, struct gen_loader_opts *opts)
   8633{
   8634	struct bpf_gen *gen;
   8635
   8636	if (!opts)
   8637		return -EFAULT;
   8638	if (!OPTS_VALID(opts, gen_loader_opts))
   8639		return -EINVAL;
   8640	gen = calloc(sizeof(*gen), 1);
   8641	if (!gen)
   8642		return -ENOMEM;
   8643	gen->opts = opts;
   8644	obj->gen_loader = gen;
   8645	return 0;
   8646}
   8647
   8648static struct bpf_program *
   8649__bpf_program__iter(const struct bpf_program *p, const struct bpf_object *obj,
   8650		    bool forward)
   8651{
   8652	size_t nr_programs = obj->nr_programs;
   8653	ssize_t idx;
   8654
   8655	if (!nr_programs)
   8656		return NULL;
   8657
   8658	if (!p)
   8659		/* Iter from the beginning */
   8660		return forward ? &obj->programs[0] :
   8661			&obj->programs[nr_programs - 1];
   8662
   8663	if (p->obj != obj) {
   8664		pr_warn("error: program handler doesn't match object\n");
   8665		return errno = EINVAL, NULL;
   8666	}
   8667
   8668	idx = (p - obj->programs) + (forward ? 1 : -1);
   8669	if (idx >= obj->nr_programs || idx < 0)
   8670		return NULL;
   8671	return &obj->programs[idx];
   8672}
   8673
   8674struct bpf_program *
   8675bpf_program__next(struct bpf_program *prev, const struct bpf_object *obj)
   8676{
   8677	return bpf_object__next_program(obj, prev);
   8678}
   8679
   8680struct bpf_program *
   8681bpf_object__next_program(const struct bpf_object *obj, struct bpf_program *prev)
   8682{
   8683	struct bpf_program *prog = prev;
   8684
   8685	do {
   8686		prog = __bpf_program__iter(prog, obj, true);
   8687	} while (prog && prog_is_subprog(obj, prog));
   8688
   8689	return prog;
   8690}
   8691
   8692struct bpf_program *
   8693bpf_program__prev(struct bpf_program *next, const struct bpf_object *obj)
   8694{
   8695	return bpf_object__prev_program(obj, next);
   8696}
   8697
   8698struct bpf_program *
   8699bpf_object__prev_program(const struct bpf_object *obj, struct bpf_program *next)
   8700{
   8701	struct bpf_program *prog = next;
   8702
   8703	do {
   8704		prog = __bpf_program__iter(prog, obj, false);
   8705	} while (prog && prog_is_subprog(obj, prog));
   8706
   8707	return prog;
   8708}
   8709
   8710int bpf_program__set_priv(struct bpf_program *prog, void *priv,
   8711			  bpf_program_clear_priv_t clear_priv)
   8712{
   8713	if (prog->priv && prog->clear_priv)
   8714		prog->clear_priv(prog, prog->priv);
   8715
   8716	prog->priv = priv;
   8717	prog->clear_priv = clear_priv;
   8718	return 0;
   8719}
   8720
   8721void *bpf_program__priv(const struct bpf_program *prog)
   8722{
   8723	return prog ? prog->priv : libbpf_err_ptr(-EINVAL);
   8724}
   8725
   8726void bpf_program__set_ifindex(struct bpf_program *prog, __u32 ifindex)
   8727{
   8728	prog->prog_ifindex = ifindex;
   8729}
   8730
   8731const char *bpf_program__name(const struct bpf_program *prog)
   8732{
   8733	return prog->name;
   8734}
   8735
   8736const char *bpf_program__section_name(const struct bpf_program *prog)
   8737{
   8738	return prog->sec_name;
   8739}
   8740
   8741const char *bpf_program__title(const struct bpf_program *prog, bool needs_copy)
   8742{
   8743	const char *title;
   8744
   8745	title = prog->sec_name;
   8746	if (needs_copy) {
   8747		title = strdup(title);
   8748		if (!title) {
   8749			pr_warn("failed to strdup program title\n");
   8750			return libbpf_err_ptr(-ENOMEM);
   8751		}
   8752	}
   8753
   8754	return title;
   8755}
   8756
   8757bool bpf_program__autoload(const struct bpf_program *prog)
   8758{
   8759	return prog->autoload;
   8760}
   8761
   8762int bpf_program__set_autoload(struct bpf_program *prog, bool autoload)
   8763{
   8764	if (prog->obj->loaded)
   8765		return libbpf_err(-EINVAL);
   8766
   8767	prog->autoload = autoload;
   8768	return 0;
   8769}
   8770
   8771static int bpf_program_nth_fd(const struct bpf_program *prog, int n);
   8772
   8773int bpf_program__fd(const struct bpf_program *prog)
   8774{
   8775	return bpf_program_nth_fd(prog, 0);
   8776}
   8777
   8778size_t bpf_program__size(const struct bpf_program *prog)
   8779{
   8780	return prog->insns_cnt * BPF_INSN_SZ;
   8781}
   8782
   8783const struct bpf_insn *bpf_program__insns(const struct bpf_program *prog)
   8784{
   8785	return prog->insns;
   8786}
   8787
   8788size_t bpf_program__insn_cnt(const struct bpf_program *prog)
   8789{
   8790	return prog->insns_cnt;
   8791}
   8792
   8793int bpf_program__set_insns(struct bpf_program *prog,
   8794			   struct bpf_insn *new_insns, size_t new_insn_cnt)
   8795{
   8796	struct bpf_insn *insns;
   8797
   8798	if (prog->obj->loaded)
   8799		return -EBUSY;
   8800
   8801	insns = libbpf_reallocarray(prog->insns, new_insn_cnt, sizeof(*insns));
   8802	if (!insns) {
   8803		pr_warn("prog '%s': failed to realloc prog code\n", prog->name);
   8804		return -ENOMEM;
   8805	}
   8806	memcpy(insns, new_insns, new_insn_cnt * sizeof(*insns));
   8807
   8808	prog->insns = insns;
   8809	prog->insns_cnt = new_insn_cnt;
   8810	return 0;
   8811}
   8812
   8813int bpf_program__set_prep(struct bpf_program *prog, int nr_instances,
   8814			  bpf_program_prep_t prep)
   8815{
   8816	int *instances_fds;
   8817
   8818	if (nr_instances <= 0 || !prep)
   8819		return libbpf_err(-EINVAL);
   8820
   8821	if (prog->instances.nr > 0 || prog->instances.fds) {
   8822		pr_warn("Can't set pre-processor after loading\n");
   8823		return libbpf_err(-EINVAL);
   8824	}
   8825
   8826	instances_fds = malloc(sizeof(int) * nr_instances);
   8827	if (!instances_fds) {
   8828		pr_warn("alloc memory failed for fds\n");
   8829		return libbpf_err(-ENOMEM);
   8830	}
   8831
   8832	/* fill all fd with -1 */
   8833	memset(instances_fds, -1, sizeof(int) * nr_instances);
   8834
   8835	prog->instances.nr = nr_instances;
   8836	prog->instances.fds = instances_fds;
   8837	prog->preprocessor = prep;
   8838	return 0;
   8839}
   8840
   8841__attribute__((alias("bpf_program_nth_fd")))
   8842int bpf_program__nth_fd(const struct bpf_program *prog, int n);
   8843
   8844static int bpf_program_nth_fd(const struct bpf_program *prog, int n)
   8845{
   8846	int fd;
   8847
   8848	if (!prog)
   8849		return libbpf_err(-EINVAL);
   8850
   8851	if (n >= prog->instances.nr || n < 0) {
   8852		pr_warn("Can't get the %dth fd from program %s: only %d instances\n",
   8853			n, prog->name, prog->instances.nr);
   8854		return libbpf_err(-EINVAL);
   8855	}
   8856
   8857	fd = prog->instances.fds[n];
   8858	if (fd < 0) {
   8859		pr_warn("%dth instance of program '%s' is invalid\n",
   8860			n, prog->name);
   8861		return libbpf_err(-ENOENT);
   8862	}
   8863
   8864	return fd;
   8865}
   8866
   8867__alias(bpf_program__type)
   8868enum bpf_prog_type bpf_program__get_type(const struct bpf_program *prog);
   8869
   8870enum bpf_prog_type bpf_program__type(const struct bpf_program *prog)
   8871{
   8872	return prog->type;
   8873}
   8874
   8875int bpf_program__set_type(struct bpf_program *prog, enum bpf_prog_type type)
   8876{
   8877	if (prog->obj->loaded)
   8878		return libbpf_err(-EBUSY);
   8879
   8880	prog->type = type;
   8881	return 0;
   8882}
   8883
   8884static bool bpf_program__is_type(const struct bpf_program *prog,
   8885				 enum bpf_prog_type type)
   8886{
   8887	return prog ? (prog->type == type) : false;
   8888}
   8889
   8890#define BPF_PROG_TYPE_FNS(NAME, TYPE)				\
   8891int bpf_program__set_##NAME(struct bpf_program *prog)		\
   8892{								\
   8893	if (!prog)						\
   8894		return libbpf_err(-EINVAL);			\
   8895	return bpf_program__set_type(prog, TYPE);			\
   8896}								\
   8897								\
   8898bool bpf_program__is_##NAME(const struct bpf_program *prog)	\
   8899{								\
   8900	return bpf_program__is_type(prog, TYPE);		\
   8901}								\
   8902
   8903BPF_PROG_TYPE_FNS(socket_filter, BPF_PROG_TYPE_SOCKET_FILTER);
   8904BPF_PROG_TYPE_FNS(lsm, BPF_PROG_TYPE_LSM);
   8905BPF_PROG_TYPE_FNS(kprobe, BPF_PROG_TYPE_KPROBE);
   8906BPF_PROG_TYPE_FNS(sched_cls, BPF_PROG_TYPE_SCHED_CLS);
   8907BPF_PROG_TYPE_FNS(sched_act, BPF_PROG_TYPE_SCHED_ACT);
   8908BPF_PROG_TYPE_FNS(tracepoint, BPF_PROG_TYPE_TRACEPOINT);
   8909BPF_PROG_TYPE_FNS(raw_tracepoint, BPF_PROG_TYPE_RAW_TRACEPOINT);
   8910BPF_PROG_TYPE_FNS(xdp, BPF_PROG_TYPE_XDP);
   8911BPF_PROG_TYPE_FNS(perf_event, BPF_PROG_TYPE_PERF_EVENT);
   8912BPF_PROG_TYPE_FNS(tracing, BPF_PROG_TYPE_TRACING);
   8913BPF_PROG_TYPE_FNS(struct_ops, BPF_PROG_TYPE_STRUCT_OPS);
   8914BPF_PROG_TYPE_FNS(extension, BPF_PROG_TYPE_EXT);
   8915BPF_PROG_TYPE_FNS(sk_lookup, BPF_PROG_TYPE_SK_LOOKUP);
   8916
   8917__alias(bpf_program__expected_attach_type)
   8918enum bpf_attach_type bpf_program__get_expected_attach_type(const struct bpf_program *prog);
   8919
   8920enum bpf_attach_type bpf_program__expected_attach_type(const struct bpf_program *prog)
   8921{
   8922	return prog->expected_attach_type;
   8923}
   8924
   8925int bpf_program__set_expected_attach_type(struct bpf_program *prog,
   8926					   enum bpf_attach_type type)
   8927{
   8928	if (prog->obj->loaded)
   8929		return libbpf_err(-EBUSY);
   8930
   8931	prog->expected_attach_type = type;
   8932	return 0;
   8933}
   8934
   8935__u32 bpf_program__flags(const struct bpf_program *prog)
   8936{
   8937	return prog->prog_flags;
   8938}
   8939
   8940int bpf_program__set_flags(struct bpf_program *prog, __u32 flags)
   8941{
   8942	if (prog->obj->loaded)
   8943		return libbpf_err(-EBUSY);
   8944
   8945	prog->prog_flags = flags;
   8946	return 0;
   8947}
   8948
   8949__u32 bpf_program__log_level(const struct bpf_program *prog)
   8950{
   8951	return prog->log_level;
   8952}
   8953
   8954int bpf_program__set_log_level(struct bpf_program *prog, __u32 log_level)
   8955{
   8956	if (prog->obj->loaded)
   8957		return libbpf_err(-EBUSY);
   8958
   8959	prog->log_level = log_level;
   8960	return 0;
   8961}
   8962
   8963const char *bpf_program__log_buf(const struct bpf_program *prog, size_t *log_size)
   8964{
   8965	*log_size = prog->log_size;
   8966	return prog->log_buf;
   8967}
   8968
   8969int bpf_program__set_log_buf(struct bpf_program *prog, char *log_buf, size_t log_size)
   8970{
   8971	if (log_size && !log_buf)
   8972		return -EINVAL;
   8973	if (prog->log_size > UINT_MAX)
   8974		return -EINVAL;
   8975	if (prog->obj->loaded)
   8976		return -EBUSY;
   8977
   8978	prog->log_buf = log_buf;
   8979	prog->log_size = log_size;
   8980	return 0;
   8981}
   8982
   8983#define SEC_DEF(sec_pfx, ptype, atype, flags, ...) {			    \
   8984	.sec = (char *)sec_pfx,						    \
   8985	.prog_type = BPF_PROG_TYPE_##ptype,				    \
   8986	.expected_attach_type = atype,					    \
   8987	.cookie = (long)(flags),					    \
   8988	.prog_prepare_load_fn = libbpf_prepare_prog_load,		    \
   8989	__VA_ARGS__							    \
   8990}
   8991
   8992static int attach_kprobe(const struct bpf_program *prog, long cookie, struct bpf_link **link);
   8993static int attach_uprobe(const struct bpf_program *prog, long cookie, struct bpf_link **link);
   8994static int attach_usdt(const struct bpf_program *prog, long cookie, struct bpf_link **link);
   8995static int attach_tp(const struct bpf_program *prog, long cookie, struct bpf_link **link);
   8996static int attach_raw_tp(const struct bpf_program *prog, long cookie, struct bpf_link **link);
   8997static int attach_trace(const struct bpf_program *prog, long cookie, struct bpf_link **link);
   8998static int attach_kprobe_multi(const struct bpf_program *prog, long cookie, struct bpf_link **link);
   8999static int attach_lsm(const struct bpf_program *prog, long cookie, struct bpf_link **link);
   9000static int attach_iter(const struct bpf_program *prog, long cookie, struct bpf_link **link);
   9001
   9002static const struct bpf_sec_def section_defs[] = {
   9003	SEC_DEF("socket",		SOCKET_FILTER, 0, SEC_NONE | SEC_SLOPPY_PFX),
   9004	SEC_DEF("sk_reuseport/migrate",	SK_REUSEPORT, BPF_SK_REUSEPORT_SELECT_OR_MIGRATE, SEC_ATTACHABLE | SEC_SLOPPY_PFX),
   9005	SEC_DEF("sk_reuseport",		SK_REUSEPORT, BPF_SK_REUSEPORT_SELECT, SEC_ATTACHABLE | SEC_SLOPPY_PFX),
   9006	SEC_DEF("kprobe+",		KPROBE,	0, SEC_NONE, attach_kprobe),
   9007	SEC_DEF("uprobe+",		KPROBE,	0, SEC_NONE, attach_uprobe),
   9008	SEC_DEF("kretprobe+",		KPROBE, 0, SEC_NONE, attach_kprobe),
   9009	SEC_DEF("uretprobe+",		KPROBE, 0, SEC_NONE, attach_uprobe),
   9010	SEC_DEF("kprobe.multi+",	KPROBE,	BPF_TRACE_KPROBE_MULTI, SEC_NONE, attach_kprobe_multi),
   9011	SEC_DEF("kretprobe.multi+",	KPROBE,	BPF_TRACE_KPROBE_MULTI, SEC_NONE, attach_kprobe_multi),
   9012	SEC_DEF("usdt+",		KPROBE,	0, SEC_NONE, attach_usdt),
   9013	SEC_DEF("tc",			SCHED_CLS, 0, SEC_NONE),
   9014	SEC_DEF("classifier",		SCHED_CLS, 0, SEC_NONE | SEC_SLOPPY_PFX | SEC_DEPRECATED),
   9015	SEC_DEF("action",		SCHED_ACT, 0, SEC_NONE | SEC_SLOPPY_PFX),
   9016	SEC_DEF("tracepoint+",		TRACEPOINT, 0, SEC_NONE, attach_tp),
   9017	SEC_DEF("tp+",			TRACEPOINT, 0, SEC_NONE, attach_tp),
   9018	SEC_DEF("raw_tracepoint+",	RAW_TRACEPOINT, 0, SEC_NONE, attach_raw_tp),
   9019	SEC_DEF("raw_tp+",		RAW_TRACEPOINT, 0, SEC_NONE, attach_raw_tp),
   9020	SEC_DEF("raw_tracepoint.w+",	RAW_TRACEPOINT_WRITABLE, 0, SEC_NONE, attach_raw_tp),
   9021	SEC_DEF("raw_tp.w+",		RAW_TRACEPOINT_WRITABLE, 0, SEC_NONE, attach_raw_tp),
   9022	SEC_DEF("tp_btf+",		TRACING, BPF_TRACE_RAW_TP, SEC_ATTACH_BTF, attach_trace),
   9023	SEC_DEF("fentry+",		TRACING, BPF_TRACE_FENTRY, SEC_ATTACH_BTF, attach_trace),
   9024	SEC_DEF("fmod_ret+",		TRACING, BPF_MODIFY_RETURN, SEC_ATTACH_BTF, attach_trace),
   9025	SEC_DEF("fexit+",		TRACING, BPF_TRACE_FEXIT, SEC_ATTACH_BTF, attach_trace),
   9026	SEC_DEF("fentry.s+",		TRACING, BPF_TRACE_FENTRY, SEC_ATTACH_BTF | SEC_SLEEPABLE, attach_trace),
   9027	SEC_DEF("fmod_ret.s+",		TRACING, BPF_MODIFY_RETURN, SEC_ATTACH_BTF | SEC_SLEEPABLE, attach_trace),
   9028	SEC_DEF("fexit.s+",		TRACING, BPF_TRACE_FEXIT, SEC_ATTACH_BTF | SEC_SLEEPABLE, attach_trace),
   9029	SEC_DEF("freplace+",		EXT, 0, SEC_ATTACH_BTF, attach_trace),
   9030	SEC_DEF("lsm+",			LSM, BPF_LSM_MAC, SEC_ATTACH_BTF, attach_lsm),
   9031	SEC_DEF("lsm.s+",		LSM, BPF_LSM_MAC, SEC_ATTACH_BTF | SEC_SLEEPABLE, attach_lsm),
   9032	SEC_DEF("iter+",		TRACING, BPF_TRACE_ITER, SEC_ATTACH_BTF, attach_iter),
   9033	SEC_DEF("iter.s+",		TRACING, BPF_TRACE_ITER, SEC_ATTACH_BTF | SEC_SLEEPABLE, attach_iter),
   9034	SEC_DEF("syscall",		SYSCALL, 0, SEC_SLEEPABLE),
   9035	SEC_DEF("xdp.frags/devmap",	XDP, BPF_XDP_DEVMAP, SEC_XDP_FRAGS),
   9036	SEC_DEF("xdp/devmap",		XDP, BPF_XDP_DEVMAP, SEC_ATTACHABLE),
   9037	SEC_DEF("xdp_devmap/",		XDP, BPF_XDP_DEVMAP, SEC_ATTACHABLE | SEC_DEPRECATED),
   9038	SEC_DEF("xdp.frags/cpumap",	XDP, BPF_XDP_CPUMAP, SEC_XDP_FRAGS),
   9039	SEC_DEF("xdp/cpumap",		XDP, BPF_XDP_CPUMAP, SEC_ATTACHABLE),
   9040	SEC_DEF("xdp_cpumap/",		XDP, BPF_XDP_CPUMAP, SEC_ATTACHABLE | SEC_DEPRECATED),
   9041	SEC_DEF("xdp.frags",		XDP, BPF_XDP, SEC_XDP_FRAGS),
   9042	SEC_DEF("xdp",			XDP, BPF_XDP, SEC_ATTACHABLE_OPT | SEC_SLOPPY_PFX),
   9043	SEC_DEF("perf_event",		PERF_EVENT, 0, SEC_NONE | SEC_SLOPPY_PFX),
   9044	SEC_DEF("lwt_in",		LWT_IN, 0, SEC_NONE | SEC_SLOPPY_PFX),
   9045	SEC_DEF("lwt_out",		LWT_OUT, 0, SEC_NONE | SEC_SLOPPY_PFX),
   9046	SEC_DEF("lwt_xmit",		LWT_XMIT, 0, SEC_NONE | SEC_SLOPPY_PFX),
   9047	SEC_DEF("lwt_seg6local",	LWT_SEG6LOCAL, 0, SEC_NONE | SEC_SLOPPY_PFX),
   9048	SEC_DEF("cgroup_skb/ingress",	CGROUP_SKB, BPF_CGROUP_INET_INGRESS, SEC_ATTACHABLE_OPT | SEC_SLOPPY_PFX),
   9049	SEC_DEF("cgroup_skb/egress",	CGROUP_SKB, BPF_CGROUP_INET_EGRESS, SEC_ATTACHABLE_OPT | SEC_SLOPPY_PFX),
   9050	SEC_DEF("cgroup/skb",		CGROUP_SKB, 0, SEC_NONE | SEC_SLOPPY_PFX),
   9051	SEC_DEF("cgroup/sock_create",	CGROUP_SOCK, BPF_CGROUP_INET_SOCK_CREATE, SEC_ATTACHABLE | SEC_SLOPPY_PFX),
   9052	SEC_DEF("cgroup/sock_release",	CGROUP_SOCK, BPF_CGROUP_INET_SOCK_RELEASE, SEC_ATTACHABLE | SEC_SLOPPY_PFX),
   9053	SEC_DEF("cgroup/sock",		CGROUP_SOCK, BPF_CGROUP_INET_SOCK_CREATE, SEC_ATTACHABLE_OPT | SEC_SLOPPY_PFX),
   9054	SEC_DEF("cgroup/post_bind4",	CGROUP_SOCK, BPF_CGROUP_INET4_POST_BIND, SEC_ATTACHABLE | SEC_SLOPPY_PFX),
   9055	SEC_DEF("cgroup/post_bind6",	CGROUP_SOCK, BPF_CGROUP_INET6_POST_BIND, SEC_ATTACHABLE | SEC_SLOPPY_PFX),
   9056	SEC_DEF("cgroup/dev",		CGROUP_DEVICE, BPF_CGROUP_DEVICE, SEC_ATTACHABLE_OPT | SEC_SLOPPY_PFX),
   9057	SEC_DEF("sockops",		SOCK_OPS, BPF_CGROUP_SOCK_OPS, SEC_ATTACHABLE_OPT | SEC_SLOPPY_PFX),
   9058	SEC_DEF("sk_skb/stream_parser",	SK_SKB, BPF_SK_SKB_STREAM_PARSER, SEC_ATTACHABLE_OPT | SEC_SLOPPY_PFX),
   9059	SEC_DEF("sk_skb/stream_verdict",SK_SKB, BPF_SK_SKB_STREAM_VERDICT, SEC_ATTACHABLE_OPT | SEC_SLOPPY_PFX),
   9060	SEC_DEF("sk_skb",		SK_SKB, 0, SEC_NONE | SEC_SLOPPY_PFX),
   9061	SEC_DEF("sk_msg",		SK_MSG, BPF_SK_MSG_VERDICT, SEC_ATTACHABLE_OPT | SEC_SLOPPY_PFX),
   9062	SEC_DEF("lirc_mode2",		LIRC_MODE2, BPF_LIRC_MODE2, SEC_ATTACHABLE_OPT | SEC_SLOPPY_PFX),
   9063	SEC_DEF("flow_dissector",	FLOW_DISSECTOR, BPF_FLOW_DISSECTOR, SEC_ATTACHABLE_OPT | SEC_SLOPPY_PFX),
   9064	SEC_DEF("cgroup/bind4",		CGROUP_SOCK_ADDR, BPF_CGROUP_INET4_BIND, SEC_ATTACHABLE | SEC_SLOPPY_PFX),
   9065	SEC_DEF("cgroup/bind6",		CGROUP_SOCK_ADDR, BPF_CGROUP_INET6_BIND, SEC_ATTACHABLE | SEC_SLOPPY_PFX),
   9066	SEC_DEF("cgroup/connect4",	CGROUP_SOCK_ADDR, BPF_CGROUP_INET4_CONNECT, SEC_ATTACHABLE | SEC_SLOPPY_PFX),
   9067	SEC_DEF("cgroup/connect6",	CGROUP_SOCK_ADDR, BPF_CGROUP_INET6_CONNECT, SEC_ATTACHABLE | SEC_SLOPPY_PFX),
   9068	SEC_DEF("cgroup/sendmsg4",	CGROUP_SOCK_ADDR, BPF_CGROUP_UDP4_SENDMSG, SEC_ATTACHABLE | SEC_SLOPPY_PFX),
   9069	SEC_DEF("cgroup/sendmsg6",	CGROUP_SOCK_ADDR, BPF_CGROUP_UDP6_SENDMSG, SEC_ATTACHABLE | SEC_SLOPPY_PFX),
   9070	SEC_DEF("cgroup/recvmsg4",	CGROUP_SOCK_ADDR, BPF_CGROUP_UDP4_RECVMSG, SEC_ATTACHABLE | SEC_SLOPPY_PFX),
   9071	SEC_DEF("cgroup/recvmsg6",	CGROUP_SOCK_ADDR, BPF_CGROUP_UDP6_RECVMSG, SEC_ATTACHABLE | SEC_SLOPPY_PFX),
   9072	SEC_DEF("cgroup/getpeername4",	CGROUP_SOCK_ADDR, BPF_CGROUP_INET4_GETPEERNAME, SEC_ATTACHABLE | SEC_SLOPPY_PFX),
   9073	SEC_DEF("cgroup/getpeername6",	CGROUP_SOCK_ADDR, BPF_CGROUP_INET6_GETPEERNAME, SEC_ATTACHABLE | SEC_SLOPPY_PFX),
   9074	SEC_DEF("cgroup/getsockname4",	CGROUP_SOCK_ADDR, BPF_CGROUP_INET4_GETSOCKNAME, SEC_ATTACHABLE | SEC_SLOPPY_PFX),
   9075	SEC_DEF("cgroup/getsockname6",	CGROUP_SOCK_ADDR, BPF_CGROUP_INET6_GETSOCKNAME, SEC_ATTACHABLE | SEC_SLOPPY_PFX),
   9076	SEC_DEF("cgroup/sysctl",	CGROUP_SYSCTL, BPF_CGROUP_SYSCTL, SEC_ATTACHABLE | SEC_SLOPPY_PFX),
   9077	SEC_DEF("cgroup/getsockopt",	CGROUP_SOCKOPT, BPF_CGROUP_GETSOCKOPT, SEC_ATTACHABLE | SEC_SLOPPY_PFX),
   9078	SEC_DEF("cgroup/setsockopt",	CGROUP_SOCKOPT, BPF_CGROUP_SETSOCKOPT, SEC_ATTACHABLE | SEC_SLOPPY_PFX),
   9079	SEC_DEF("struct_ops+",		STRUCT_OPS, 0, SEC_NONE),
   9080	SEC_DEF("sk_lookup",		SK_LOOKUP, BPF_SK_LOOKUP, SEC_ATTACHABLE | SEC_SLOPPY_PFX),
   9081};
   9082
   9083static size_t custom_sec_def_cnt;
   9084static struct bpf_sec_def *custom_sec_defs;
   9085static struct bpf_sec_def custom_fallback_def;
   9086static bool has_custom_fallback_def;
   9087
   9088static int last_custom_sec_def_handler_id;
   9089
   9090int libbpf_register_prog_handler(const char *sec,
   9091				 enum bpf_prog_type prog_type,
   9092				 enum bpf_attach_type exp_attach_type,
   9093				 const struct libbpf_prog_handler_opts *opts)
   9094{
   9095	struct bpf_sec_def *sec_def;
   9096
   9097	if (!OPTS_VALID(opts, libbpf_prog_handler_opts))
   9098		return libbpf_err(-EINVAL);
   9099
   9100	if (last_custom_sec_def_handler_id == INT_MAX) /* prevent overflow */
   9101		return libbpf_err(-E2BIG);
   9102
   9103	if (sec) {
   9104		sec_def = libbpf_reallocarray(custom_sec_defs, custom_sec_def_cnt + 1,
   9105					      sizeof(*sec_def));
   9106		if (!sec_def)
   9107			return libbpf_err(-ENOMEM);
   9108
   9109		custom_sec_defs = sec_def;
   9110		sec_def = &custom_sec_defs[custom_sec_def_cnt];
   9111	} else {
   9112		if (has_custom_fallback_def)
   9113			return libbpf_err(-EBUSY);
   9114
   9115		sec_def = &custom_fallback_def;
   9116	}
   9117
   9118	sec_def->sec = sec ? strdup(sec) : NULL;
   9119	if (sec && !sec_def->sec)
   9120		return libbpf_err(-ENOMEM);
   9121
   9122	sec_def->prog_type = prog_type;
   9123	sec_def->expected_attach_type = exp_attach_type;
   9124	sec_def->cookie = OPTS_GET(opts, cookie, 0);
   9125
   9126	sec_def->prog_setup_fn = OPTS_GET(opts, prog_setup_fn, NULL);
   9127	sec_def->prog_prepare_load_fn = OPTS_GET(opts, prog_prepare_load_fn, NULL);
   9128	sec_def->prog_attach_fn = OPTS_GET(opts, prog_attach_fn, NULL);
   9129
   9130	sec_def->handler_id = ++last_custom_sec_def_handler_id;
   9131
   9132	if (sec)
   9133		custom_sec_def_cnt++;
   9134	else
   9135		has_custom_fallback_def = true;
   9136
   9137	return sec_def->handler_id;
   9138}
   9139
   9140int libbpf_unregister_prog_handler(int handler_id)
   9141{
   9142	struct bpf_sec_def *sec_defs;
   9143	int i;
   9144
   9145	if (handler_id <= 0)
   9146		return libbpf_err(-EINVAL);
   9147
   9148	if (has_custom_fallback_def && custom_fallback_def.handler_id == handler_id) {
   9149		memset(&custom_fallback_def, 0, sizeof(custom_fallback_def));
   9150		has_custom_fallback_def = false;
   9151		return 0;
   9152	}
   9153
   9154	for (i = 0; i < custom_sec_def_cnt; i++) {
   9155		if (custom_sec_defs[i].handler_id == handler_id)
   9156			break;
   9157	}
   9158
   9159	if (i == custom_sec_def_cnt)
   9160		return libbpf_err(-ENOENT);
   9161
   9162	free(custom_sec_defs[i].sec);
   9163	for (i = i + 1; i < custom_sec_def_cnt; i++)
   9164		custom_sec_defs[i - 1] = custom_sec_defs[i];
   9165	custom_sec_def_cnt--;
   9166
   9167	/* try to shrink the array, but it's ok if we couldn't */
   9168	sec_defs = libbpf_reallocarray(custom_sec_defs, custom_sec_def_cnt, sizeof(*sec_defs));
   9169	if (sec_defs)
   9170		custom_sec_defs = sec_defs;
   9171
   9172	return 0;
   9173}
   9174
   9175static bool sec_def_matches(const struct bpf_sec_def *sec_def, const char *sec_name,
   9176			    bool allow_sloppy)
   9177{
   9178	size_t len = strlen(sec_def->sec);
   9179
   9180	/* "type/" always has to have proper SEC("type/extras") form */
   9181	if (sec_def->sec[len - 1] == '/') {
   9182		if (str_has_pfx(sec_name, sec_def->sec))
   9183			return true;
   9184		return false;
   9185	}
   9186
   9187	/* "type+" means it can be either exact SEC("type") or
   9188	 * well-formed SEC("type/extras") with proper '/' separator
   9189	 */
   9190	if (sec_def->sec[len - 1] == '+') {
   9191		len--;
   9192		/* not even a prefix */
   9193		if (strncmp(sec_name, sec_def->sec, len) != 0)
   9194			return false;
   9195		/* exact match or has '/' separator */
   9196		if (sec_name[len] == '\0' || sec_name[len] == '/')
   9197			return true;
   9198		return false;
   9199	}
   9200
   9201	/* SEC_SLOPPY_PFX definitions are allowed to be just prefix
   9202	 * matches, unless strict section name mode
   9203	 * (LIBBPF_STRICT_SEC_NAME) is enabled, in which case the
   9204	 * match has to be exact.
   9205	 */
   9206	if (allow_sloppy && str_has_pfx(sec_name, sec_def->sec))
   9207		return true;
   9208
   9209	/* Definitions not marked SEC_SLOPPY_PFX (e.g.,
   9210	 * SEC("syscall")) are exact matches in both modes.
   9211	 */
   9212	return strcmp(sec_name, sec_def->sec) == 0;
   9213}
   9214
   9215static const struct bpf_sec_def *find_sec_def(const char *sec_name)
   9216{
   9217	const struct bpf_sec_def *sec_def;
   9218	int i, n;
   9219	bool strict = libbpf_mode & LIBBPF_STRICT_SEC_NAME, allow_sloppy;
   9220
   9221	n = custom_sec_def_cnt;
   9222	for (i = 0; i < n; i++) {
   9223		sec_def = &custom_sec_defs[i];
   9224		if (sec_def_matches(sec_def, sec_name, false))
   9225			return sec_def;
   9226	}
   9227
   9228	n = ARRAY_SIZE(section_defs);
   9229	for (i = 0; i < n; i++) {
   9230		sec_def = &section_defs[i];
   9231		allow_sloppy = (sec_def->cookie & SEC_SLOPPY_PFX) && !strict;
   9232		if (sec_def_matches(sec_def, sec_name, allow_sloppy))
   9233			return sec_def;
   9234	}
   9235
   9236	if (has_custom_fallback_def)
   9237		return &custom_fallback_def;
   9238
   9239	return NULL;
   9240}
   9241
   9242#define MAX_TYPE_NAME_SIZE 32
   9243
   9244static char *libbpf_get_type_names(bool attach_type)
   9245{
   9246	int i, len = ARRAY_SIZE(section_defs) * MAX_TYPE_NAME_SIZE;
   9247	char *buf;
   9248
   9249	buf = malloc(len);
   9250	if (!buf)
   9251		return NULL;
   9252
   9253	buf[0] = '\0';
   9254	/* Forge string buf with all available names */
   9255	for (i = 0; i < ARRAY_SIZE(section_defs); i++) {
   9256		const struct bpf_sec_def *sec_def = &section_defs[i];
   9257
   9258		if (attach_type) {
   9259			if (sec_def->prog_prepare_load_fn != libbpf_prepare_prog_load)
   9260				continue;
   9261
   9262			if (!(sec_def->cookie & SEC_ATTACHABLE))
   9263				continue;
   9264		}
   9265
   9266		if (strlen(buf) + strlen(section_defs[i].sec) + 2 > len) {
   9267			free(buf);
   9268			return NULL;
   9269		}
   9270		strcat(buf, " ");
   9271		strcat(buf, section_defs[i].sec);
   9272	}
   9273
   9274	return buf;
   9275}
   9276
   9277int libbpf_prog_type_by_name(const char *name, enum bpf_prog_type *prog_type,
   9278			     enum bpf_attach_type *expected_attach_type)
   9279{
   9280	const struct bpf_sec_def *sec_def;
   9281	char *type_names;
   9282
   9283	if (!name)
   9284		return libbpf_err(-EINVAL);
   9285
   9286	sec_def = find_sec_def(name);
   9287	if (sec_def) {
   9288		*prog_type = sec_def->prog_type;
   9289		*expected_attach_type = sec_def->expected_attach_type;
   9290		return 0;
   9291	}
   9292
   9293	pr_debug("failed to guess program type from ELF section '%s'\n", name);
   9294	type_names = libbpf_get_type_names(false);
   9295	if (type_names != NULL) {
   9296		pr_debug("supported section(type) names are:%s\n", type_names);
   9297		free(type_names);
   9298	}
   9299
   9300	return libbpf_err(-ESRCH);
   9301}
   9302
   9303static struct bpf_map *find_struct_ops_map_by_offset(struct bpf_object *obj,
   9304						     size_t offset)
   9305{
   9306	struct bpf_map *map;
   9307	size_t i;
   9308
   9309	for (i = 0; i < obj->nr_maps; i++) {
   9310		map = &obj->maps[i];
   9311		if (!bpf_map__is_struct_ops(map))
   9312			continue;
   9313		if (map->sec_offset <= offset &&
   9314		    offset - map->sec_offset < map->def.value_size)
   9315			return map;
   9316	}
   9317
   9318	return NULL;
   9319}
   9320
   9321/* Collect the reloc from ELF and populate the st_ops->progs[] */
   9322static int bpf_object__collect_st_ops_relos(struct bpf_object *obj,
   9323					    Elf64_Shdr *shdr, Elf_Data *data)
   9324{
   9325	const struct btf_member *member;
   9326	struct bpf_struct_ops *st_ops;
   9327	struct bpf_program *prog;
   9328	unsigned int shdr_idx;
   9329	const struct btf *btf;
   9330	struct bpf_map *map;
   9331	unsigned int moff, insn_idx;
   9332	const char *name;
   9333	__u32 member_idx;
   9334	Elf64_Sym *sym;
   9335	Elf64_Rel *rel;
   9336	int i, nrels;
   9337
   9338	btf = obj->btf;
   9339	nrels = shdr->sh_size / shdr->sh_entsize;
   9340	for (i = 0; i < nrels; i++) {
   9341		rel = elf_rel_by_idx(data, i);
   9342		if (!rel) {
   9343			pr_warn("struct_ops reloc: failed to get %d reloc\n", i);
   9344			return -LIBBPF_ERRNO__FORMAT;
   9345		}
   9346
   9347		sym = elf_sym_by_idx(obj, ELF64_R_SYM(rel->r_info));
   9348		if (!sym) {
   9349			pr_warn("struct_ops reloc: symbol %zx not found\n",
   9350				(size_t)ELF64_R_SYM(rel->r_info));
   9351			return -LIBBPF_ERRNO__FORMAT;
   9352		}
   9353
   9354		name = elf_sym_str(obj, sym->st_name) ?: "<?>";
   9355		map = find_struct_ops_map_by_offset(obj, rel->r_offset);
   9356		if (!map) {
   9357			pr_warn("struct_ops reloc: cannot find map at rel->r_offset %zu\n",
   9358				(size_t)rel->r_offset);
   9359			return -EINVAL;
   9360		}
   9361
   9362		moff = rel->r_offset - map->sec_offset;
   9363		shdr_idx = sym->st_shndx;
   9364		st_ops = map->st_ops;
   9365		pr_debug("struct_ops reloc %s: for %lld value %lld shdr_idx %u rel->r_offset %zu map->sec_offset %zu name %d (\'%s\')\n",
   9366			 map->name,
   9367			 (long long)(rel->r_info >> 32),
   9368			 (long long)sym->st_value,
   9369			 shdr_idx, (size_t)rel->r_offset,
   9370			 map->sec_offset, sym->st_name, name);
   9371
   9372		if (shdr_idx >= SHN_LORESERVE) {
   9373			pr_warn("struct_ops reloc %s: rel->r_offset %zu shdr_idx %u unsupported non-static function\n",
   9374				map->name, (size_t)rel->r_offset, shdr_idx);
   9375			return -LIBBPF_ERRNO__RELOC;
   9376		}
   9377		if (sym->st_value % BPF_INSN_SZ) {
   9378			pr_warn("struct_ops reloc %s: invalid target program offset %llu\n",
   9379				map->name, (unsigned long long)sym->st_value);
   9380			return -LIBBPF_ERRNO__FORMAT;
   9381		}
   9382		insn_idx = sym->st_value / BPF_INSN_SZ;
   9383
   9384		member = find_member_by_offset(st_ops->type, moff * 8);
   9385		if (!member) {
   9386			pr_warn("struct_ops reloc %s: cannot find member at moff %u\n",
   9387				map->name, moff);
   9388			return -EINVAL;
   9389		}
   9390		member_idx = member - btf_members(st_ops->type);
   9391		name = btf__name_by_offset(btf, member->name_off);
   9392
   9393		if (!resolve_func_ptr(btf, member->type, NULL)) {
   9394			pr_warn("struct_ops reloc %s: cannot relocate non func ptr %s\n",
   9395				map->name, name);
   9396			return -EINVAL;
   9397		}
   9398
   9399		prog = find_prog_by_sec_insn(obj, shdr_idx, insn_idx);
   9400		if (!prog) {
   9401			pr_warn("struct_ops reloc %s: cannot find prog at shdr_idx %u to relocate func ptr %s\n",
   9402				map->name, shdr_idx, name);
   9403			return -EINVAL;
   9404		}
   9405
   9406		/* prevent the use of BPF prog with invalid type */
   9407		if (prog->type != BPF_PROG_TYPE_STRUCT_OPS) {
   9408			pr_warn("struct_ops reloc %s: prog %s is not struct_ops BPF program\n",
   9409				map->name, prog->name);
   9410			return -EINVAL;
   9411		}
   9412
   9413		/* if we haven't yet processed this BPF program, record proper
   9414		 * attach_btf_id and member_idx
   9415		 */
   9416		if (!prog->attach_btf_id) {
   9417			prog->attach_btf_id = st_ops->type_id;
   9418			prog->expected_attach_type = member_idx;
   9419		}
   9420
   9421		/* struct_ops BPF prog can be re-used between multiple
   9422		 * .struct_ops as long as it's the same struct_ops struct
   9423		 * definition and the same function pointer field
   9424		 */
   9425		if (prog->attach_btf_id != st_ops->type_id ||
   9426		    prog->expected_attach_type != member_idx) {
   9427			pr_warn("struct_ops reloc %s: cannot use prog %s in sec %s with type %u attach_btf_id %u expected_attach_type %u for func ptr %s\n",
   9428				map->name, prog->name, prog->sec_name, prog->type,
   9429				prog->attach_btf_id, prog->expected_attach_type, name);
   9430			return -EINVAL;
   9431		}
   9432
   9433		st_ops->progs[member_idx] = prog;
   9434	}
   9435
   9436	return 0;
   9437}
   9438
   9439#define BTF_TRACE_PREFIX "btf_trace_"
   9440#define BTF_LSM_PREFIX "bpf_lsm_"
   9441#define BTF_ITER_PREFIX "bpf_iter_"
   9442#define BTF_MAX_NAME_SIZE 128
   9443
   9444void btf_get_kernel_prefix_kind(enum bpf_attach_type attach_type,
   9445				const char **prefix, int *kind)
   9446{
   9447	switch (attach_type) {
   9448	case BPF_TRACE_RAW_TP:
   9449		*prefix = BTF_TRACE_PREFIX;
   9450		*kind = BTF_KIND_TYPEDEF;
   9451		break;
   9452	case BPF_LSM_MAC:
   9453		*prefix = BTF_LSM_PREFIX;
   9454		*kind = BTF_KIND_FUNC;
   9455		break;
   9456	case BPF_TRACE_ITER:
   9457		*prefix = BTF_ITER_PREFIX;
   9458		*kind = BTF_KIND_FUNC;
   9459		break;
   9460	default:
   9461		*prefix = "";
   9462		*kind = BTF_KIND_FUNC;
   9463	}
   9464}
   9465
   9466static int find_btf_by_prefix_kind(const struct btf *btf, const char *prefix,
   9467				   const char *name, __u32 kind)
   9468{
   9469	char btf_type_name[BTF_MAX_NAME_SIZE];
   9470	int ret;
   9471
   9472	ret = snprintf(btf_type_name, sizeof(btf_type_name),
   9473		       "%s%s", prefix, name);
   9474	/* snprintf returns the number of characters written excluding the
   9475	 * terminating null. So, if >= BTF_MAX_NAME_SIZE are written, it
   9476	 * indicates truncation.
   9477	 */
   9478	if (ret < 0 || ret >= sizeof(btf_type_name))
   9479		return -ENAMETOOLONG;
   9480	return btf__find_by_name_kind(btf, btf_type_name, kind);
   9481}
   9482
   9483static inline int find_attach_btf_id(struct btf *btf, const char *name,
   9484				     enum bpf_attach_type attach_type)
   9485{
   9486	const char *prefix;
   9487	int kind;
   9488
   9489	btf_get_kernel_prefix_kind(attach_type, &prefix, &kind);
   9490	return find_btf_by_prefix_kind(btf, prefix, name, kind);
   9491}
   9492
   9493int libbpf_find_vmlinux_btf_id(const char *name,
   9494			       enum bpf_attach_type attach_type)
   9495{
   9496	struct btf *btf;
   9497	int err;
   9498
   9499	btf = btf__load_vmlinux_btf();
   9500	err = libbpf_get_error(btf);
   9501	if (err) {
   9502		pr_warn("vmlinux BTF is not found\n");
   9503		return libbpf_err(err);
   9504	}
   9505
   9506	err = find_attach_btf_id(btf, name, attach_type);
   9507	if (err <= 0)
   9508		pr_warn("%s is not found in vmlinux BTF\n", name);
   9509
   9510	btf__free(btf);
   9511	return libbpf_err(err);
   9512}
   9513
   9514static int libbpf_find_prog_btf_id(const char *name, __u32 attach_prog_fd)
   9515{
   9516	struct bpf_prog_info info = {};
   9517	__u32 info_len = sizeof(info);
   9518	struct btf *btf;
   9519	int err;
   9520
   9521	err = bpf_obj_get_info_by_fd(attach_prog_fd, &info, &info_len);
   9522	if (err) {
   9523		pr_warn("failed bpf_obj_get_info_by_fd for FD %d: %d\n",
   9524			attach_prog_fd, err);
   9525		return err;
   9526	}
   9527
   9528	err = -EINVAL;
   9529	if (!info.btf_id) {
   9530		pr_warn("The target program doesn't have BTF\n");
   9531		goto out;
   9532	}
   9533	btf = btf__load_from_kernel_by_id(info.btf_id);
   9534	err = libbpf_get_error(btf);
   9535	if (err) {
   9536		pr_warn("Failed to get BTF %d of the program: %d\n", info.btf_id, err);
   9537		goto out;
   9538	}
   9539	err = btf__find_by_name_kind(btf, name, BTF_KIND_FUNC);
   9540	btf__free(btf);
   9541	if (err <= 0) {
   9542		pr_warn("%s is not found in prog's BTF\n", name);
   9543		goto out;
   9544	}
   9545out:
   9546	return err;
   9547}
   9548
   9549static int find_kernel_btf_id(struct bpf_object *obj, const char *attach_name,
   9550			      enum bpf_attach_type attach_type,
   9551			      int *btf_obj_fd, int *btf_type_id)
   9552{
   9553	int ret, i;
   9554
   9555	ret = find_attach_btf_id(obj->btf_vmlinux, attach_name, attach_type);
   9556	if (ret > 0) {
   9557		*btf_obj_fd = 0; /* vmlinux BTF */
   9558		*btf_type_id = ret;
   9559		return 0;
   9560	}
   9561	if (ret != -ENOENT)
   9562		return ret;
   9563
   9564	ret = load_module_btfs(obj);
   9565	if (ret)
   9566		return ret;
   9567
   9568	for (i = 0; i < obj->btf_module_cnt; i++) {
   9569		const struct module_btf *mod = &obj->btf_modules[i];
   9570
   9571		ret = find_attach_btf_id(mod->btf, attach_name, attach_type);
   9572		if (ret > 0) {
   9573			*btf_obj_fd = mod->fd;
   9574			*btf_type_id = ret;
   9575			return 0;
   9576		}
   9577		if (ret == -ENOENT)
   9578			continue;
   9579
   9580		return ret;
   9581	}
   9582
   9583	return -ESRCH;
   9584}
   9585
   9586static int libbpf_find_attach_btf_id(struct bpf_program *prog, const char *attach_name,
   9587				     int *btf_obj_fd, int *btf_type_id)
   9588{
   9589	enum bpf_attach_type attach_type = prog->expected_attach_type;
   9590	__u32 attach_prog_fd = prog->attach_prog_fd;
   9591	int err = 0;
   9592
   9593	/* BPF program's BTF ID */
   9594	if (attach_prog_fd) {
   9595		err = libbpf_find_prog_btf_id(attach_name, attach_prog_fd);
   9596		if (err < 0) {
   9597			pr_warn("failed to find BPF program (FD %d) BTF ID for '%s': %d\n",
   9598				 attach_prog_fd, attach_name, err);
   9599			return err;
   9600		}
   9601		*btf_obj_fd = 0;
   9602		*btf_type_id = err;
   9603		return 0;
   9604	}
   9605
   9606	/* kernel/module BTF ID */
   9607	if (prog->obj->gen_loader) {
   9608		bpf_gen__record_attach_target(prog->obj->gen_loader, attach_name, attach_type);
   9609		*btf_obj_fd = 0;
   9610		*btf_type_id = 1;
   9611	} else {
   9612		err = find_kernel_btf_id(prog->obj, attach_name, attach_type, btf_obj_fd, btf_type_id);
   9613	}
   9614	if (err) {
   9615		pr_warn("failed to find kernel BTF type ID of '%s': %d\n", attach_name, err);
   9616		return err;
   9617	}
   9618	return 0;
   9619}
   9620
   9621int libbpf_attach_type_by_name(const char *name,
   9622			       enum bpf_attach_type *attach_type)
   9623{
   9624	char *type_names;
   9625	const struct bpf_sec_def *sec_def;
   9626
   9627	if (!name)
   9628		return libbpf_err(-EINVAL);
   9629
   9630	sec_def = find_sec_def(name);
   9631	if (!sec_def) {
   9632		pr_debug("failed to guess attach type based on ELF section name '%s'\n", name);
   9633		type_names = libbpf_get_type_names(true);
   9634		if (type_names != NULL) {
   9635			pr_debug("attachable section(type) names are:%s\n", type_names);
   9636			free(type_names);
   9637		}
   9638
   9639		return libbpf_err(-EINVAL);
   9640	}
   9641
   9642	if (sec_def->prog_prepare_load_fn != libbpf_prepare_prog_load)
   9643		return libbpf_err(-EINVAL);
   9644	if (!(sec_def->cookie & SEC_ATTACHABLE))
   9645		return libbpf_err(-EINVAL);
   9646
   9647	*attach_type = sec_def->expected_attach_type;
   9648	return 0;
   9649}
   9650
   9651int bpf_map__fd(const struct bpf_map *map)
   9652{
   9653	return map ? map->fd : libbpf_err(-EINVAL);
   9654}
   9655
   9656const struct bpf_map_def *bpf_map__def(const struct bpf_map *map)
   9657{
   9658	return map ? &map->def : libbpf_err_ptr(-EINVAL);
   9659}
   9660
   9661static bool map_uses_real_name(const struct bpf_map *map)
   9662{
   9663	/* Since libbpf started to support custom .data.* and .rodata.* maps,
   9664	 * their user-visible name differs from kernel-visible name. Users see
   9665	 * such map's corresponding ELF section name as a map name.
   9666	 * This check distinguishes .data/.rodata from .data.* and .rodata.*
   9667	 * maps to know which name has to be returned to the user.
   9668	 */
   9669	if (map->libbpf_type == LIBBPF_MAP_DATA && strcmp(map->real_name, DATA_SEC) != 0)
   9670		return true;
   9671	if (map->libbpf_type == LIBBPF_MAP_RODATA && strcmp(map->real_name, RODATA_SEC) != 0)
   9672		return true;
   9673	return false;
   9674}
   9675
   9676const char *bpf_map__name(const struct bpf_map *map)
   9677{
   9678	if (!map)
   9679		return NULL;
   9680
   9681	if (map_uses_real_name(map))
   9682		return map->real_name;
   9683
   9684	return map->name;
   9685}
   9686
   9687enum bpf_map_type bpf_map__type(const struct bpf_map *map)
   9688{
   9689	return map->def.type;
   9690}
   9691
   9692int bpf_map__set_type(struct bpf_map *map, enum bpf_map_type type)
   9693{
   9694	if (map->fd >= 0)
   9695		return libbpf_err(-EBUSY);
   9696	map->def.type = type;
   9697	return 0;
   9698}
   9699
   9700__u32 bpf_map__map_flags(const struct bpf_map *map)
   9701{
   9702	return map->def.map_flags;
   9703}
   9704
   9705int bpf_map__set_map_flags(struct bpf_map *map, __u32 flags)
   9706{
   9707	if (map->fd >= 0)
   9708		return libbpf_err(-EBUSY);
   9709	map->def.map_flags = flags;
   9710	return 0;
   9711}
   9712
   9713__u64 bpf_map__map_extra(const struct bpf_map *map)
   9714{
   9715	return map->map_extra;
   9716}
   9717
   9718int bpf_map__set_map_extra(struct bpf_map *map, __u64 map_extra)
   9719{
   9720	if (map->fd >= 0)
   9721		return libbpf_err(-EBUSY);
   9722	map->map_extra = map_extra;
   9723	return 0;
   9724}
   9725
   9726__u32 bpf_map__numa_node(const struct bpf_map *map)
   9727{
   9728	return map->numa_node;
   9729}
   9730
   9731int bpf_map__set_numa_node(struct bpf_map *map, __u32 numa_node)
   9732{
   9733	if (map->fd >= 0)
   9734		return libbpf_err(-EBUSY);
   9735	map->numa_node = numa_node;
   9736	return 0;
   9737}
   9738
   9739__u32 bpf_map__key_size(const struct bpf_map *map)
   9740{
   9741	return map->def.key_size;
   9742}
   9743
   9744int bpf_map__set_key_size(struct bpf_map *map, __u32 size)
   9745{
   9746	if (map->fd >= 0)
   9747		return libbpf_err(-EBUSY);
   9748	map->def.key_size = size;
   9749	return 0;
   9750}
   9751
   9752__u32 bpf_map__value_size(const struct bpf_map *map)
   9753{
   9754	return map->def.value_size;
   9755}
   9756
   9757int bpf_map__set_value_size(struct bpf_map *map, __u32 size)
   9758{
   9759	if (map->fd >= 0)
   9760		return libbpf_err(-EBUSY);
   9761	map->def.value_size = size;
   9762	return 0;
   9763}
   9764
   9765__u32 bpf_map__btf_key_type_id(const struct bpf_map *map)
   9766{
   9767	return map ? map->btf_key_type_id : 0;
   9768}
   9769
   9770__u32 bpf_map__btf_value_type_id(const struct bpf_map *map)
   9771{
   9772	return map ? map->btf_value_type_id : 0;
   9773}
   9774
   9775int bpf_map__set_priv(struct bpf_map *map, void *priv,
   9776		     bpf_map_clear_priv_t clear_priv)
   9777{
   9778	if (!map)
   9779		return libbpf_err(-EINVAL);
   9780
   9781	if (map->priv) {
   9782		if (map->clear_priv)
   9783			map->clear_priv(map, map->priv);
   9784	}
   9785
   9786	map->priv = priv;
   9787	map->clear_priv = clear_priv;
   9788	return 0;
   9789}
   9790
   9791void *bpf_map__priv(const struct bpf_map *map)
   9792{
   9793	return map ? map->priv : libbpf_err_ptr(-EINVAL);
   9794}
   9795
   9796int bpf_map__set_initial_value(struct bpf_map *map,
   9797			       const void *data, size_t size)
   9798{
   9799	if (!map->mmaped || map->libbpf_type == LIBBPF_MAP_KCONFIG ||
   9800	    size != map->def.value_size || map->fd >= 0)
   9801		return libbpf_err(-EINVAL);
   9802
   9803	memcpy(map->mmaped, data, size);
   9804	return 0;
   9805}
   9806
   9807const void *bpf_map__initial_value(struct bpf_map *map, size_t *psize)
   9808{
   9809	if (!map->mmaped)
   9810		return NULL;
   9811	*psize = map->def.value_size;
   9812	return map->mmaped;
   9813}
   9814
   9815bool bpf_map__is_offload_neutral(const struct bpf_map *map)
   9816{
   9817	return map->def.type == BPF_MAP_TYPE_PERF_EVENT_ARRAY;
   9818}
   9819
   9820bool bpf_map__is_internal(const struct bpf_map *map)
   9821{
   9822	return map->libbpf_type != LIBBPF_MAP_UNSPEC;
   9823}
   9824
   9825__u32 bpf_map__ifindex(const struct bpf_map *map)
   9826{
   9827	return map->map_ifindex;
   9828}
   9829
   9830int bpf_map__set_ifindex(struct bpf_map *map, __u32 ifindex)
   9831{
   9832	if (map->fd >= 0)
   9833		return libbpf_err(-EBUSY);
   9834	map->map_ifindex = ifindex;
   9835	return 0;
   9836}
   9837
   9838int bpf_map__set_inner_map_fd(struct bpf_map *map, int fd)
   9839{
   9840	if (!bpf_map_type__is_map_in_map(map->def.type)) {
   9841		pr_warn("error: unsupported map type\n");
   9842		return libbpf_err(-EINVAL);
   9843	}
   9844	if (map->inner_map_fd != -1) {
   9845		pr_warn("error: inner_map_fd already specified\n");
   9846		return libbpf_err(-EINVAL);
   9847	}
   9848	if (map->inner_map) {
   9849		bpf_map__destroy(map->inner_map);
   9850		zfree(&map->inner_map);
   9851	}
   9852	map->inner_map_fd = fd;
   9853	return 0;
   9854}
   9855
   9856static struct bpf_map *
   9857__bpf_map__iter(const struct bpf_map *m, const struct bpf_object *obj, int i)
   9858{
   9859	ssize_t idx;
   9860	struct bpf_map *s, *e;
   9861
   9862	if (!obj || !obj->maps)
   9863		return errno = EINVAL, NULL;
   9864
   9865	s = obj->maps;
   9866	e = obj->maps + obj->nr_maps;
   9867
   9868	if ((m < s) || (m >= e)) {
   9869		pr_warn("error in %s: map handler doesn't belong to object\n",
   9870			 __func__);
   9871		return errno = EINVAL, NULL;
   9872	}
   9873
   9874	idx = (m - obj->maps) + i;
   9875	if (idx >= obj->nr_maps || idx < 0)
   9876		return NULL;
   9877	return &obj->maps[idx];
   9878}
   9879
   9880struct bpf_map *
   9881bpf_map__next(const struct bpf_map *prev, const struct bpf_object *obj)
   9882{
   9883	return bpf_object__next_map(obj, prev);
   9884}
   9885
   9886struct bpf_map *
   9887bpf_object__next_map(const struct bpf_object *obj, const struct bpf_map *prev)
   9888{
   9889	if (prev == NULL)
   9890		return obj->maps;
   9891
   9892	return __bpf_map__iter(prev, obj, 1);
   9893}
   9894
   9895struct bpf_map *
   9896bpf_map__prev(const struct bpf_map *next, const struct bpf_object *obj)
   9897{
   9898	return bpf_object__prev_map(obj, next);
   9899}
   9900
   9901struct bpf_map *
   9902bpf_object__prev_map(const struct bpf_object *obj, const struct bpf_map *next)
   9903{
   9904	if (next == NULL) {
   9905		if (!obj->nr_maps)
   9906			return NULL;
   9907		return obj->maps + obj->nr_maps - 1;
   9908	}
   9909
   9910	return __bpf_map__iter(next, obj, -1);
   9911}
   9912
   9913struct bpf_map *
   9914bpf_object__find_map_by_name(const struct bpf_object *obj, const char *name)
   9915{
   9916	struct bpf_map *pos;
   9917
   9918	bpf_object__for_each_map(pos, obj) {
   9919		/* if it's a special internal map name (which always starts
   9920		 * with dot) then check if that special name matches the
   9921		 * real map name (ELF section name)
   9922		 */
   9923		if (name[0] == '.') {
   9924			if (pos->real_name && strcmp(pos->real_name, name) == 0)
   9925				return pos;
   9926			continue;
   9927		}
   9928		/* otherwise map name has to be an exact match */
   9929		if (map_uses_real_name(pos)) {
   9930			if (strcmp(pos->real_name, name) == 0)
   9931				return pos;
   9932			continue;
   9933		}
   9934		if (strcmp(pos->name, name) == 0)
   9935			return pos;
   9936	}
   9937	return errno = ENOENT, NULL;
   9938}
   9939
   9940int
   9941bpf_object__find_map_fd_by_name(const struct bpf_object *obj, const char *name)
   9942{
   9943	return bpf_map__fd(bpf_object__find_map_by_name(obj, name));
   9944}
   9945
   9946struct bpf_map *
   9947bpf_object__find_map_by_offset(struct bpf_object *obj, size_t offset)
   9948{
   9949	return libbpf_err_ptr(-ENOTSUP);
   9950}
   9951
   9952static int validate_map_op(const struct bpf_map *map, size_t key_sz,
   9953			   size_t value_sz, bool check_value_sz)
   9954{
   9955	if (map->fd <= 0)
   9956		return -ENOENT;
   9957
   9958	if (map->def.key_size != key_sz) {
   9959		pr_warn("map '%s': unexpected key size %zu provided, expected %u\n",
   9960			map->name, key_sz, map->def.key_size);
   9961		return -EINVAL;
   9962	}
   9963
   9964	if (!check_value_sz)
   9965		return 0;
   9966
   9967	switch (map->def.type) {
   9968	case BPF_MAP_TYPE_PERCPU_ARRAY:
   9969	case BPF_MAP_TYPE_PERCPU_HASH:
   9970	case BPF_MAP_TYPE_LRU_PERCPU_HASH:
   9971	case BPF_MAP_TYPE_PERCPU_CGROUP_STORAGE: {
   9972		int num_cpu = libbpf_num_possible_cpus();
   9973		size_t elem_sz = roundup(map->def.value_size, 8);
   9974
   9975		if (value_sz != num_cpu * elem_sz) {
   9976			pr_warn("map '%s': unexpected value size %zu provided for per-CPU map, expected %d * %zu = %zd\n",
   9977				map->name, value_sz, num_cpu, elem_sz, num_cpu * elem_sz);
   9978			return -EINVAL;
   9979		}
   9980		break;
   9981	}
   9982	default:
   9983		if (map->def.value_size != value_sz) {
   9984			pr_warn("map '%s': unexpected value size %zu provided, expected %u\n",
   9985				map->name, value_sz, map->def.value_size);
   9986			return -EINVAL;
   9987		}
   9988		break;
   9989	}
   9990	return 0;
   9991}
   9992
   9993int bpf_map__lookup_elem(const struct bpf_map *map,
   9994			 const void *key, size_t key_sz,
   9995			 void *value, size_t value_sz, __u64 flags)
   9996{
   9997	int err;
   9998
   9999	err = validate_map_op(map, key_sz, value_sz, true);
  10000	if (err)
  10001		return libbpf_err(err);
  10002
  10003	return bpf_map_lookup_elem_flags(map->fd, key, value, flags);
  10004}
  10005
  10006int bpf_map__update_elem(const struct bpf_map *map,
  10007			 const void *key, size_t key_sz,
  10008			 const void *value, size_t value_sz, __u64 flags)
  10009{
  10010	int err;
  10011
  10012	err = validate_map_op(map, key_sz, value_sz, true);
  10013	if (err)
  10014		return libbpf_err(err);
  10015
  10016	return bpf_map_update_elem(map->fd, key, value, flags);
  10017}
  10018
  10019int bpf_map__delete_elem(const struct bpf_map *map,
  10020			 const void *key, size_t key_sz, __u64 flags)
  10021{
  10022	int err;
  10023
  10024	err = validate_map_op(map, key_sz, 0, false /* check_value_sz */);
  10025	if (err)
  10026		return libbpf_err(err);
  10027
  10028	return bpf_map_delete_elem_flags(map->fd, key, flags);
  10029}
  10030
  10031int bpf_map__lookup_and_delete_elem(const struct bpf_map *map,
  10032				    const void *key, size_t key_sz,
  10033				    void *value, size_t value_sz, __u64 flags)
  10034{
  10035	int err;
  10036
  10037	err = validate_map_op(map, key_sz, value_sz, true);
  10038	if (err)
  10039		return libbpf_err(err);
  10040
  10041	return bpf_map_lookup_and_delete_elem_flags(map->fd, key, value, flags);
  10042}
  10043
  10044int bpf_map__get_next_key(const struct bpf_map *map,
  10045			  const void *cur_key, void *next_key, size_t key_sz)
  10046{
  10047	int err;
  10048
  10049	err = validate_map_op(map, key_sz, 0, false /* check_value_sz */);
  10050	if (err)
  10051		return libbpf_err(err);
  10052
  10053	return bpf_map_get_next_key(map->fd, cur_key, next_key);
  10054}
  10055
  10056long libbpf_get_error(const void *ptr)
  10057{
  10058	if (!IS_ERR_OR_NULL(ptr))
  10059		return 0;
  10060
  10061	if (IS_ERR(ptr))
  10062		errno = -PTR_ERR(ptr);
  10063
  10064	/* If ptr == NULL, then errno should be already set by the failing
  10065	 * API, because libbpf never returns NULL on success and it now always
  10066	 * sets errno on error. So no extra errno handling for ptr == NULL
  10067	 * case.
  10068	 */
  10069	return -errno;
  10070}
  10071
  10072__attribute__((alias("bpf_prog_load_xattr2")))
  10073int bpf_prog_load_xattr(const struct bpf_prog_load_attr *attr,
  10074			struct bpf_object **pobj, int *prog_fd);
  10075
  10076static int bpf_prog_load_xattr2(const struct bpf_prog_load_attr *attr,
  10077				struct bpf_object **pobj, int *prog_fd)
  10078{
  10079	struct bpf_object_open_attr open_attr = {};
  10080	struct bpf_program *prog, *first_prog = NULL;
  10081	struct bpf_object *obj;
  10082	struct bpf_map *map;
  10083	int err;
  10084
  10085	if (!attr)
  10086		return libbpf_err(-EINVAL);
  10087	if (!attr->file)
  10088		return libbpf_err(-EINVAL);
  10089
  10090	open_attr.file = attr->file;
  10091	open_attr.prog_type = attr->prog_type;
  10092
  10093	obj = __bpf_object__open_xattr(&open_attr, 0);
  10094	err = libbpf_get_error(obj);
  10095	if (err)
  10096		return libbpf_err(-ENOENT);
  10097
  10098	bpf_object__for_each_program(prog, obj) {
  10099		enum bpf_attach_type attach_type = attr->expected_attach_type;
  10100		/*
  10101		 * to preserve backwards compatibility, bpf_prog_load treats
  10102		 * attr->prog_type, if specified, as an override to whatever
  10103		 * bpf_object__open guessed
  10104		 */
  10105		if (attr->prog_type != BPF_PROG_TYPE_UNSPEC) {
  10106			prog->type = attr->prog_type;
  10107			prog->expected_attach_type = attach_type;
  10108		}
  10109		if (bpf_program__type(prog) == BPF_PROG_TYPE_UNSPEC) {
  10110			/*
  10111			 * we haven't guessed from section name and user
  10112			 * didn't provide a fallback type, too bad...
  10113			 */
  10114			bpf_object__close(obj);
  10115			return libbpf_err(-EINVAL);
  10116		}
  10117
  10118		prog->prog_ifindex = attr->ifindex;
  10119		prog->log_level = attr->log_level;
  10120		prog->prog_flags |= attr->prog_flags;
  10121		if (!first_prog)
  10122			first_prog = prog;
  10123	}
  10124
  10125	bpf_object__for_each_map(map, obj) {
  10126		if (map->def.type != BPF_MAP_TYPE_PERF_EVENT_ARRAY)
  10127			map->map_ifindex = attr->ifindex;
  10128	}
  10129
  10130	if (!first_prog) {
  10131		pr_warn("object file doesn't contain bpf program\n");
  10132		bpf_object__close(obj);
  10133		return libbpf_err(-ENOENT);
  10134	}
  10135
  10136	err = bpf_object__load(obj);
  10137	if (err) {
  10138		bpf_object__close(obj);
  10139		return libbpf_err(err);
  10140	}
  10141
  10142	*pobj = obj;
  10143	*prog_fd = bpf_program__fd(first_prog);
  10144	return 0;
  10145}
  10146
  10147COMPAT_VERSION(bpf_prog_load_deprecated, bpf_prog_load, LIBBPF_0.0.1)
  10148int bpf_prog_load_deprecated(const char *file, enum bpf_prog_type type,
  10149			     struct bpf_object **pobj, int *prog_fd)
  10150{
  10151	struct bpf_prog_load_attr attr;
  10152
  10153	memset(&attr, 0, sizeof(struct bpf_prog_load_attr));
  10154	attr.file = file;
  10155	attr.prog_type = type;
  10156	attr.expected_attach_type = 0;
  10157
  10158	return bpf_prog_load_xattr2(&attr, pobj, prog_fd);
  10159}
  10160
  10161/* Replace link's underlying BPF program with the new one */
  10162int bpf_link__update_program(struct bpf_link *link, struct bpf_program *prog)
  10163{
  10164	int ret;
  10165
  10166	ret = bpf_link_update(bpf_link__fd(link), bpf_program__fd(prog), NULL);
  10167	return libbpf_err_errno(ret);
  10168}
  10169
  10170/* Release "ownership" of underlying BPF resource (typically, BPF program
  10171 * attached to some BPF hook, e.g., tracepoint, kprobe, etc). Disconnected
  10172 * link, when destructed through bpf_link__destroy() call won't attempt to
  10173 * detach/unregisted that BPF resource. This is useful in situations where,
  10174 * say, attached BPF program has to outlive userspace program that attached it
  10175 * in the system. Depending on type of BPF program, though, there might be
  10176 * additional steps (like pinning BPF program in BPF FS) necessary to ensure
  10177 * exit of userspace program doesn't trigger automatic detachment and clean up
  10178 * inside the kernel.
  10179 */
  10180void bpf_link__disconnect(struct bpf_link *link)
  10181{
  10182	link->disconnected = true;
  10183}
  10184
  10185int bpf_link__destroy(struct bpf_link *link)
  10186{
  10187	int err = 0;
  10188
  10189	if (IS_ERR_OR_NULL(link))
  10190		return 0;
  10191
  10192	if (!link->disconnected && link->detach)
  10193		err = link->detach(link);
  10194	if (link->pin_path)
  10195		free(link->pin_path);
  10196	if (link->dealloc)
  10197		link->dealloc(link);
  10198	else
  10199		free(link);
  10200
  10201	return libbpf_err(err);
  10202}
  10203
  10204int bpf_link__fd(const struct bpf_link *link)
  10205{
  10206	return link->fd;
  10207}
  10208
  10209const char *bpf_link__pin_path(const struct bpf_link *link)
  10210{
  10211	return link->pin_path;
  10212}
  10213
  10214static int bpf_link__detach_fd(struct bpf_link *link)
  10215{
  10216	return libbpf_err_errno(close(link->fd));
  10217}
  10218
  10219struct bpf_link *bpf_link__open(const char *path)
  10220{
  10221	struct bpf_link *link;
  10222	int fd;
  10223
  10224	fd = bpf_obj_get(path);
  10225	if (fd < 0) {
  10226		fd = -errno;
  10227		pr_warn("failed to open link at %s: %d\n", path, fd);
  10228		return libbpf_err_ptr(fd);
  10229	}
  10230
  10231	link = calloc(1, sizeof(*link));
  10232	if (!link) {
  10233		close(fd);
  10234		return libbpf_err_ptr(-ENOMEM);
  10235	}
  10236	link->detach = &bpf_link__detach_fd;
  10237	link->fd = fd;
  10238
  10239	link->pin_path = strdup(path);
  10240	if (!link->pin_path) {
  10241		bpf_link__destroy(link);
  10242		return libbpf_err_ptr(-ENOMEM);
  10243	}
  10244
  10245	return link;
  10246}
  10247
  10248int bpf_link__detach(struct bpf_link *link)
  10249{
  10250	return bpf_link_detach(link->fd) ? -errno : 0;
  10251}
  10252
  10253int bpf_link__pin(struct bpf_link *link, const char *path)
  10254{
  10255	int err;
  10256
  10257	if (link->pin_path)
  10258		return libbpf_err(-EBUSY);
  10259	err = make_parent_dir(path);
  10260	if (err)
  10261		return libbpf_err(err);
  10262	err = check_path(path);
  10263	if (err)
  10264		return libbpf_err(err);
  10265
  10266	link->pin_path = strdup(path);
  10267	if (!link->pin_path)
  10268		return libbpf_err(-ENOMEM);
  10269
  10270	if (bpf_obj_pin(link->fd, link->pin_path)) {
  10271		err = -errno;
  10272		zfree(&link->pin_path);
  10273		return libbpf_err(err);
  10274	}
  10275
  10276	pr_debug("link fd=%d: pinned at %s\n", link->fd, link->pin_path);
  10277	return 0;
  10278}
  10279
  10280int bpf_link__unpin(struct bpf_link *link)
  10281{
  10282	int err;
  10283
  10284	if (!link->pin_path)
  10285		return libbpf_err(-EINVAL);
  10286
  10287	err = unlink(link->pin_path);
  10288	if (err != 0)
  10289		return -errno;
  10290
  10291	pr_debug("link fd=%d: unpinned from %s\n", link->fd, link->pin_path);
  10292	zfree(&link->pin_path);
  10293	return 0;
  10294}
  10295
  10296struct bpf_link_perf {
  10297	struct bpf_link link;
  10298	int perf_event_fd;
  10299	/* legacy kprobe support: keep track of probe identifier and type */
  10300	char *legacy_probe_name;
  10301	bool legacy_is_kprobe;
  10302	bool legacy_is_retprobe;
  10303};
  10304
  10305static int remove_kprobe_event_legacy(const char *probe_name, bool retprobe);
  10306static int remove_uprobe_event_legacy(const char *probe_name, bool retprobe);
  10307
  10308static int bpf_link_perf_detach(struct bpf_link *link)
  10309{
  10310	struct bpf_link_perf *perf_link = container_of(link, struct bpf_link_perf, link);
  10311	int err = 0;
  10312
  10313	if (ioctl(perf_link->perf_event_fd, PERF_EVENT_IOC_DISABLE, 0) < 0)
  10314		err = -errno;
  10315
  10316	if (perf_link->perf_event_fd != link->fd)
  10317		close(perf_link->perf_event_fd);
  10318	close(link->fd);
  10319
  10320	/* legacy uprobe/kprobe needs to be removed after perf event fd closure */
  10321	if (perf_link->legacy_probe_name) {
  10322		if (perf_link->legacy_is_kprobe) {
  10323			err = remove_kprobe_event_legacy(perf_link->legacy_probe_name,
  10324							 perf_link->legacy_is_retprobe);
  10325		} else {
  10326			err = remove_uprobe_event_legacy(perf_link->legacy_probe_name,
  10327							 perf_link->legacy_is_retprobe);
  10328		}
  10329	}
  10330
  10331	return err;
  10332}
  10333
  10334static void bpf_link_perf_dealloc(struct bpf_link *link)
  10335{
  10336	struct bpf_link_perf *perf_link = container_of(link, struct bpf_link_perf, link);
  10337
  10338	free(perf_link->legacy_probe_name);
  10339	free(perf_link);
  10340}
  10341
  10342struct bpf_link *bpf_program__attach_perf_event_opts(const struct bpf_program *prog, int pfd,
  10343						     const struct bpf_perf_event_opts *opts)
  10344{
  10345	char errmsg[STRERR_BUFSIZE];
  10346	struct bpf_link_perf *link;
  10347	int prog_fd, link_fd = -1, err;
  10348
  10349	if (!OPTS_VALID(opts, bpf_perf_event_opts))
  10350		return libbpf_err_ptr(-EINVAL);
  10351
  10352	if (pfd < 0) {
  10353		pr_warn("prog '%s': invalid perf event FD %d\n",
  10354			prog->name, pfd);
  10355		return libbpf_err_ptr(-EINVAL);
  10356	}
  10357	prog_fd = bpf_program__fd(prog);
  10358	if (prog_fd < 0) {
  10359		pr_warn("prog '%s': can't attach BPF program w/o FD (did you load it?)\n",
  10360			prog->name);
  10361		return libbpf_err_ptr(-EINVAL);
  10362	}
  10363
  10364	link = calloc(1, sizeof(*link));
  10365	if (!link)
  10366		return libbpf_err_ptr(-ENOMEM);
  10367	link->link.detach = &bpf_link_perf_detach;
  10368	link->link.dealloc = &bpf_link_perf_dealloc;
  10369	link->perf_event_fd = pfd;
  10370
  10371	if (kernel_supports(prog->obj, FEAT_PERF_LINK)) {
  10372		DECLARE_LIBBPF_OPTS(bpf_link_create_opts, link_opts,
  10373			.perf_event.bpf_cookie = OPTS_GET(opts, bpf_cookie, 0));
  10374
  10375		link_fd = bpf_link_create(prog_fd, pfd, BPF_PERF_EVENT, &link_opts);
  10376		if (link_fd < 0) {
  10377			err = -errno;
  10378			pr_warn("prog '%s': failed to create BPF link for perf_event FD %d: %d (%s)\n",
  10379				prog->name, pfd,
  10380				err, libbpf_strerror_r(err, errmsg, sizeof(errmsg)));
  10381			goto err_out;
  10382		}
  10383		link->link.fd = link_fd;
  10384	} else {
  10385		if (OPTS_GET(opts, bpf_cookie, 0)) {
  10386			pr_warn("prog '%s': user context value is not supported\n", prog->name);
  10387			err = -EOPNOTSUPP;
  10388			goto err_out;
  10389		}
  10390
  10391		if (ioctl(pfd, PERF_EVENT_IOC_SET_BPF, prog_fd) < 0) {
  10392			err = -errno;
  10393			pr_warn("prog '%s': failed to attach to perf_event FD %d: %s\n",
  10394				prog->name, pfd, libbpf_strerror_r(err, errmsg, sizeof(errmsg)));
  10395			if (err == -EPROTO)
  10396				pr_warn("prog '%s': try add PERF_SAMPLE_CALLCHAIN to or remove exclude_callchain_[kernel|user] from pfd %d\n",
  10397					prog->name, pfd);
  10398			goto err_out;
  10399		}
  10400		link->link.fd = pfd;
  10401	}
  10402	if (ioctl(pfd, PERF_EVENT_IOC_ENABLE, 0) < 0) {
  10403		err = -errno;
  10404		pr_warn("prog '%s': failed to enable perf_event FD %d: %s\n",
  10405			prog->name, pfd, libbpf_strerror_r(err, errmsg, sizeof(errmsg)));
  10406		goto err_out;
  10407	}
  10408
  10409	return &link->link;
  10410err_out:
  10411	if (link_fd >= 0)
  10412		close(link_fd);
  10413	free(link);
  10414	return libbpf_err_ptr(err);
  10415}
  10416
  10417struct bpf_link *bpf_program__attach_perf_event(const struct bpf_program *prog, int pfd)
  10418{
  10419	return bpf_program__attach_perf_event_opts(prog, pfd, NULL);
  10420}
  10421
  10422/*
  10423 * this function is expected to parse integer in the range of [0, 2^31-1] from
  10424 * given file using scanf format string fmt. If actual parsed value is
  10425 * negative, the result might be indistinguishable from error
  10426 */
  10427static int parse_uint_from_file(const char *file, const char *fmt)
  10428{
  10429	char buf[STRERR_BUFSIZE];
  10430	int err, ret;
  10431	FILE *f;
  10432
  10433	f = fopen(file, "r");
  10434	if (!f) {
  10435		err = -errno;
  10436		pr_debug("failed to open '%s': %s\n", file,
  10437			 libbpf_strerror_r(err, buf, sizeof(buf)));
  10438		return err;
  10439	}
  10440	err = fscanf(f, fmt, &ret);
  10441	if (err != 1) {
  10442		err = err == EOF ? -EIO : -errno;
  10443		pr_debug("failed to parse '%s': %s\n", file,
  10444			libbpf_strerror_r(err, buf, sizeof(buf)));
  10445		fclose(f);
  10446		return err;
  10447	}
  10448	fclose(f);
  10449	return ret;
  10450}
  10451
  10452static int determine_kprobe_perf_type(void)
  10453{
  10454	const char *file = "/sys/bus/event_source/devices/kprobe/type";
  10455
  10456	return parse_uint_from_file(file, "%d\n");
  10457}
  10458
  10459static int determine_uprobe_perf_type(void)
  10460{
  10461	const char *file = "/sys/bus/event_source/devices/uprobe/type";
  10462
  10463	return parse_uint_from_file(file, "%d\n");
  10464}
  10465
  10466static int determine_kprobe_retprobe_bit(void)
  10467{
  10468	const char *file = "/sys/bus/event_source/devices/kprobe/format/retprobe";
  10469
  10470	return parse_uint_from_file(file, "config:%d\n");
  10471}
  10472
  10473static int determine_uprobe_retprobe_bit(void)
  10474{
  10475	const char *file = "/sys/bus/event_source/devices/uprobe/format/retprobe";
  10476
  10477	return parse_uint_from_file(file, "config:%d\n");
  10478}
  10479
  10480#define PERF_UPROBE_REF_CTR_OFFSET_BITS 32
  10481#define PERF_UPROBE_REF_CTR_OFFSET_SHIFT 32
  10482
  10483static int perf_event_open_probe(bool uprobe, bool retprobe, const char *name,
  10484				 uint64_t offset, int pid, size_t ref_ctr_off)
  10485{
  10486	struct perf_event_attr attr = {};
  10487	char errmsg[STRERR_BUFSIZE];
  10488	int type, pfd, err;
  10489
  10490	if (ref_ctr_off >= (1ULL << PERF_UPROBE_REF_CTR_OFFSET_BITS))
  10491		return -EINVAL;
  10492
  10493	type = uprobe ? determine_uprobe_perf_type()
  10494		      : determine_kprobe_perf_type();
  10495	if (type < 0) {
  10496		pr_warn("failed to determine %s perf type: %s\n",
  10497			uprobe ? "uprobe" : "kprobe",
  10498			libbpf_strerror_r(type, errmsg, sizeof(errmsg)));
  10499		return type;
  10500	}
  10501	if (retprobe) {
  10502		int bit = uprobe ? determine_uprobe_retprobe_bit()
  10503				 : determine_kprobe_retprobe_bit();
  10504
  10505		if (bit < 0) {
  10506			pr_warn("failed to determine %s retprobe bit: %s\n",
  10507				uprobe ? "uprobe" : "kprobe",
  10508				libbpf_strerror_r(bit, errmsg, sizeof(errmsg)));
  10509			return bit;
  10510		}
  10511		attr.config |= 1 << bit;
  10512	}
  10513	attr.size = sizeof(attr);
  10514	attr.type = type;
  10515	attr.config |= (__u64)ref_ctr_off << PERF_UPROBE_REF_CTR_OFFSET_SHIFT;
  10516	attr.config1 = ptr_to_u64(name); /* kprobe_func or uprobe_path */
  10517	attr.config2 = offset;		 /* kprobe_addr or probe_offset */
  10518
  10519	/* pid filter is meaningful only for uprobes */
  10520	pfd = syscall(__NR_perf_event_open, &attr,
  10521		      pid < 0 ? -1 : pid /* pid */,
  10522		      pid == -1 ? 0 : -1 /* cpu */,
  10523		      -1 /* group_fd */, PERF_FLAG_FD_CLOEXEC);
  10524	if (pfd < 0) {
  10525		err = -errno;
  10526		pr_warn("%s perf_event_open() failed: %s\n",
  10527			uprobe ? "uprobe" : "kprobe",
  10528			libbpf_strerror_r(err, errmsg, sizeof(errmsg)));
  10529		return err;
  10530	}
  10531	return pfd;
  10532}
  10533
  10534static int append_to_file(const char *file, const char *fmt, ...)
  10535{
  10536	int fd, n, err = 0;
  10537	va_list ap;
  10538
  10539	fd = open(file, O_WRONLY | O_APPEND | O_CLOEXEC, 0);
  10540	if (fd < 0)
  10541		return -errno;
  10542
  10543	va_start(ap, fmt);
  10544	n = vdprintf(fd, fmt, ap);
  10545	va_end(ap);
  10546
  10547	if (n < 0)
  10548		err = -errno;
  10549
  10550	close(fd);
  10551	return err;
  10552}
  10553
  10554static void gen_kprobe_legacy_event_name(char *buf, size_t buf_sz,
  10555					 const char *kfunc_name, size_t offset)
  10556{
  10557	static int index = 0;
  10558
  10559	snprintf(buf, buf_sz, "libbpf_%u_%s_0x%zx_%d", getpid(), kfunc_name, offset,
  10560		 __sync_fetch_and_add(&index, 1));
  10561}
  10562
  10563static int add_kprobe_event_legacy(const char *probe_name, bool retprobe,
  10564				   const char *kfunc_name, size_t offset)
  10565{
  10566	const char *file = "/sys/kernel/debug/tracing/kprobe_events";
  10567
  10568	return append_to_file(file, "%c:%s/%s %s+0x%zx",
  10569			      retprobe ? 'r' : 'p',
  10570			      retprobe ? "kretprobes" : "kprobes",
  10571			      probe_name, kfunc_name, offset);
  10572}
  10573
  10574static int remove_kprobe_event_legacy(const char *probe_name, bool retprobe)
  10575{
  10576	const char *file = "/sys/kernel/debug/tracing/kprobe_events";
  10577
  10578	return append_to_file(file, "-:%s/%s", retprobe ? "kretprobes" : "kprobes", probe_name);
  10579}
  10580
  10581static int determine_kprobe_perf_type_legacy(const char *probe_name, bool retprobe)
  10582{
  10583	char file[256];
  10584
  10585	snprintf(file, sizeof(file),
  10586		 "/sys/kernel/debug/tracing/events/%s/%s/id",
  10587		 retprobe ? "kretprobes" : "kprobes", probe_name);
  10588
  10589	return parse_uint_from_file(file, "%d\n");
  10590}
  10591
  10592static int perf_event_kprobe_open_legacy(const char *probe_name, bool retprobe,
  10593					 const char *kfunc_name, size_t offset, int pid)
  10594{
  10595	struct perf_event_attr attr = {};
  10596	char errmsg[STRERR_BUFSIZE];
  10597	int type, pfd, err;
  10598
  10599	err = add_kprobe_event_legacy(probe_name, retprobe, kfunc_name, offset);
  10600	if (err < 0) {
  10601		pr_warn("failed to add legacy kprobe event for '%s+0x%zx': %s\n",
  10602			kfunc_name, offset,
  10603			libbpf_strerror_r(err, errmsg, sizeof(errmsg)));
  10604		return err;
  10605	}
  10606	type = determine_kprobe_perf_type_legacy(probe_name, retprobe);
  10607	if (type < 0) {
  10608		pr_warn("failed to determine legacy kprobe event id for '%s+0x%zx': %s\n",
  10609			kfunc_name, offset,
  10610			libbpf_strerror_r(type, errmsg, sizeof(errmsg)));
  10611		return type;
  10612	}
  10613	attr.size = sizeof(attr);
  10614	attr.config = type;
  10615	attr.type = PERF_TYPE_TRACEPOINT;
  10616
  10617	pfd = syscall(__NR_perf_event_open, &attr,
  10618		      pid < 0 ? -1 : pid, /* pid */
  10619		      pid == -1 ? 0 : -1, /* cpu */
  10620		      -1 /* group_fd */,  PERF_FLAG_FD_CLOEXEC);
  10621	if (pfd < 0) {
  10622		err = -errno;
  10623		pr_warn("legacy kprobe perf_event_open() failed: %s\n",
  10624			libbpf_strerror_r(err, errmsg, sizeof(errmsg)));
  10625		return err;
  10626	}
  10627	return pfd;
  10628}
  10629
  10630struct bpf_link *
  10631bpf_program__attach_kprobe_opts(const struct bpf_program *prog,
  10632				const char *func_name,
  10633				const struct bpf_kprobe_opts *opts)
  10634{
  10635	DECLARE_LIBBPF_OPTS(bpf_perf_event_opts, pe_opts);
  10636	char errmsg[STRERR_BUFSIZE];
  10637	char *legacy_probe = NULL;
  10638	struct bpf_link *link;
  10639	size_t offset;
  10640	bool retprobe, legacy;
  10641	int pfd, err;
  10642
  10643	if (!OPTS_VALID(opts, bpf_kprobe_opts))
  10644		return libbpf_err_ptr(-EINVAL);
  10645
  10646	retprobe = OPTS_GET(opts, retprobe, false);
  10647	offset = OPTS_GET(opts, offset, 0);
  10648	pe_opts.bpf_cookie = OPTS_GET(opts, bpf_cookie, 0);
  10649
  10650	legacy = determine_kprobe_perf_type() < 0;
  10651	if (!legacy) {
  10652		pfd = perf_event_open_probe(false /* uprobe */, retprobe,
  10653					    func_name, offset,
  10654					    -1 /* pid */, 0 /* ref_ctr_off */);
  10655	} else {
  10656		char probe_name[256];
  10657
  10658		gen_kprobe_legacy_event_name(probe_name, sizeof(probe_name),
  10659					     func_name, offset);
  10660
  10661		legacy_probe = strdup(probe_name);
  10662		if (!legacy_probe)
  10663			return libbpf_err_ptr(-ENOMEM);
  10664
  10665		pfd = perf_event_kprobe_open_legacy(legacy_probe, retprobe, func_name,
  10666						    offset, -1 /* pid */);
  10667	}
  10668	if (pfd < 0) {
  10669		err = -errno;
  10670		pr_warn("prog '%s': failed to create %s '%s+0x%zx' perf event: %s\n",
  10671			prog->name, retprobe ? "kretprobe" : "kprobe",
  10672			func_name, offset,
  10673			libbpf_strerror_r(err, errmsg, sizeof(errmsg)));
  10674		goto err_out;
  10675	}
  10676	link = bpf_program__attach_perf_event_opts(prog, pfd, &pe_opts);
  10677	err = libbpf_get_error(link);
  10678	if (err) {
  10679		close(pfd);
  10680		pr_warn("prog '%s': failed to attach to %s '%s+0x%zx': %s\n",
  10681			prog->name, retprobe ? "kretprobe" : "kprobe",
  10682			func_name, offset,
  10683			libbpf_strerror_r(err, errmsg, sizeof(errmsg)));
  10684		goto err_out;
  10685	}
  10686	if (legacy) {
  10687		struct bpf_link_perf *perf_link = container_of(link, struct bpf_link_perf, link);
  10688
  10689		perf_link->legacy_probe_name = legacy_probe;
  10690		perf_link->legacy_is_kprobe = true;
  10691		perf_link->legacy_is_retprobe = retprobe;
  10692	}
  10693
  10694	return link;
  10695err_out:
  10696	free(legacy_probe);
  10697	return libbpf_err_ptr(err);
  10698}
  10699
  10700struct bpf_link *bpf_program__attach_kprobe(const struct bpf_program *prog,
  10701					    bool retprobe,
  10702					    const char *func_name)
  10703{
  10704	DECLARE_LIBBPF_OPTS(bpf_kprobe_opts, opts,
  10705		.retprobe = retprobe,
  10706	);
  10707
  10708	return bpf_program__attach_kprobe_opts(prog, func_name, &opts);
  10709}
  10710
  10711/* Adapted from perf/util/string.c */
  10712static bool glob_match(const char *str, const char *pat)
  10713{
  10714	while (*str && *pat && *pat != '*') {
  10715		if (*pat == '?') {      /* Matches any single character */
  10716			str++;
  10717			pat++;
  10718			continue;
  10719		}
  10720		if (*str != *pat)
  10721			return false;
  10722		str++;
  10723		pat++;
  10724	}
  10725	/* Check wild card */
  10726	if (*pat == '*') {
  10727		while (*pat == '*')
  10728			pat++;
  10729		if (!*pat) /* Tail wild card matches all */
  10730			return true;
  10731		while (*str)
  10732			if (glob_match(str++, pat))
  10733				return true;
  10734	}
  10735	return !*str && !*pat;
  10736}
  10737
  10738struct kprobe_multi_resolve {
  10739	const char *pattern;
  10740	unsigned long *addrs;
  10741	size_t cap;
  10742	size_t cnt;
  10743};
  10744
  10745static int
  10746resolve_kprobe_multi_cb(unsigned long long sym_addr, char sym_type,
  10747			const char *sym_name, void *ctx)
  10748{
  10749	struct kprobe_multi_resolve *res = ctx;
  10750	int err;
  10751
  10752	if (!glob_match(sym_name, res->pattern))
  10753		return 0;
  10754
  10755	err = libbpf_ensure_mem((void **) &res->addrs, &res->cap, sizeof(unsigned long),
  10756				res->cnt + 1);
  10757	if (err)
  10758		return err;
  10759
  10760	res->addrs[res->cnt++] = (unsigned long) sym_addr;
  10761	return 0;
  10762}
  10763
  10764struct bpf_link *
  10765bpf_program__attach_kprobe_multi_opts(const struct bpf_program *prog,
  10766				      const char *pattern,
  10767				      const struct bpf_kprobe_multi_opts *opts)
  10768{
  10769	LIBBPF_OPTS(bpf_link_create_opts, lopts);
  10770	struct kprobe_multi_resolve res = {
  10771		.pattern = pattern,
  10772	};
  10773	struct bpf_link *link = NULL;
  10774	char errmsg[STRERR_BUFSIZE];
  10775	const unsigned long *addrs;
  10776	int err, link_fd, prog_fd;
  10777	const __u64 *cookies;
  10778	const char **syms;
  10779	bool retprobe;
  10780	size_t cnt;
  10781
  10782	if (!OPTS_VALID(opts, bpf_kprobe_multi_opts))
  10783		return libbpf_err_ptr(-EINVAL);
  10784
  10785	syms    = OPTS_GET(opts, syms, false);
  10786	addrs   = OPTS_GET(opts, addrs, false);
  10787	cnt     = OPTS_GET(opts, cnt, false);
  10788	cookies = OPTS_GET(opts, cookies, false);
  10789
  10790	if (!pattern && !addrs && !syms)
  10791		return libbpf_err_ptr(-EINVAL);
  10792	if (pattern && (addrs || syms || cookies || cnt))
  10793		return libbpf_err_ptr(-EINVAL);
  10794	if (!pattern && !cnt)
  10795		return libbpf_err_ptr(-EINVAL);
  10796	if (addrs && syms)
  10797		return libbpf_err_ptr(-EINVAL);
  10798
  10799	if (pattern) {
  10800		err = libbpf_kallsyms_parse(resolve_kprobe_multi_cb, &res);
  10801		if (err)
  10802			goto error;
  10803		if (!res.cnt) {
  10804			err = -ENOENT;
  10805			goto error;
  10806		}
  10807		addrs = res.addrs;
  10808		cnt = res.cnt;
  10809	}
  10810
  10811	retprobe = OPTS_GET(opts, retprobe, false);
  10812
  10813	lopts.kprobe_multi.syms = syms;
  10814	lopts.kprobe_multi.addrs = addrs;
  10815	lopts.kprobe_multi.cookies = cookies;
  10816	lopts.kprobe_multi.cnt = cnt;
  10817	lopts.kprobe_multi.flags = retprobe ? BPF_F_KPROBE_MULTI_RETURN : 0;
  10818
  10819	link = calloc(1, sizeof(*link));
  10820	if (!link) {
  10821		err = -ENOMEM;
  10822		goto error;
  10823	}
  10824	link->detach = &bpf_link__detach_fd;
  10825
  10826	prog_fd = bpf_program__fd(prog);
  10827	link_fd = bpf_link_create(prog_fd, 0, BPF_TRACE_KPROBE_MULTI, &lopts);
  10828	if (link_fd < 0) {
  10829		err = -errno;
  10830		pr_warn("prog '%s': failed to attach: %s\n",
  10831			prog->name, libbpf_strerror_r(err, errmsg, sizeof(errmsg)));
  10832		goto error;
  10833	}
  10834	link->fd = link_fd;
  10835	free(res.addrs);
  10836	return link;
  10837
  10838error:
  10839	free(link);
  10840	free(res.addrs);
  10841	return libbpf_err_ptr(err);
  10842}
  10843
  10844static int attach_kprobe(const struct bpf_program *prog, long cookie, struct bpf_link **link)
  10845{
  10846	DECLARE_LIBBPF_OPTS(bpf_kprobe_opts, opts);
  10847	unsigned long offset = 0;
  10848	const char *func_name;
  10849	char *func;
  10850	int n;
  10851
  10852	*link = NULL;
  10853
  10854	/* no auto-attach for SEC("kprobe") and SEC("kretprobe") */
  10855	if (strcmp(prog->sec_name, "kprobe") == 0 || strcmp(prog->sec_name, "kretprobe") == 0)
  10856		return 0;
  10857
  10858	opts.retprobe = str_has_pfx(prog->sec_name, "kretprobe/");
  10859	if (opts.retprobe)
  10860		func_name = prog->sec_name + sizeof("kretprobe/") - 1;
  10861	else
  10862		func_name = prog->sec_name + sizeof("kprobe/") - 1;
  10863
  10864	n = sscanf(func_name, "%m[a-zA-Z0-9_.]+%li", &func, &offset);
  10865	if (n < 1) {
  10866		pr_warn("kprobe name is invalid: %s\n", func_name);
  10867		return -EINVAL;
  10868	}
  10869	if (opts.retprobe && offset != 0) {
  10870		free(func);
  10871		pr_warn("kretprobes do not support offset specification\n");
  10872		return -EINVAL;
  10873	}
  10874
  10875	opts.offset = offset;
  10876	*link = bpf_program__attach_kprobe_opts(prog, func, &opts);
  10877	free(func);
  10878	return libbpf_get_error(*link);
  10879}
  10880
  10881static int attach_kprobe_multi(const struct bpf_program *prog, long cookie, struct bpf_link **link)
  10882{
  10883	LIBBPF_OPTS(bpf_kprobe_multi_opts, opts);
  10884	const char *spec;
  10885	char *pattern;
  10886	int n;
  10887
  10888	*link = NULL;
  10889
  10890	/* no auto-attach for SEC("kprobe.multi") and SEC("kretprobe.multi") */
  10891	if (strcmp(prog->sec_name, "kprobe.multi") == 0 ||
  10892	    strcmp(prog->sec_name, "kretprobe.multi") == 0)
  10893		return 0;
  10894
  10895	opts.retprobe = str_has_pfx(prog->sec_name, "kretprobe.multi/");
  10896	if (opts.retprobe)
  10897		spec = prog->sec_name + sizeof("kretprobe.multi/") - 1;
  10898	else
  10899		spec = prog->sec_name + sizeof("kprobe.multi/") - 1;
  10900
  10901	n = sscanf(spec, "%m[a-zA-Z0-9_.*?]", &pattern);
  10902	if (n < 1) {
  10903		pr_warn("kprobe multi pattern is invalid: %s\n", pattern);
  10904		return -EINVAL;
  10905	}
  10906
  10907	*link = bpf_program__attach_kprobe_multi_opts(prog, pattern, &opts);
  10908	free(pattern);
  10909	return libbpf_get_error(*link);
  10910}
  10911
  10912static void gen_uprobe_legacy_event_name(char *buf, size_t buf_sz,
  10913					 const char *binary_path, uint64_t offset)
  10914{
  10915	int i;
  10916
  10917	snprintf(buf, buf_sz, "libbpf_%u_%s_0x%zx", getpid(), binary_path, (size_t)offset);
  10918
  10919	/* sanitize binary_path in the probe name */
  10920	for (i = 0; buf[i]; i++) {
  10921		if (!isalnum(buf[i]))
  10922			buf[i] = '_';
  10923	}
  10924}
  10925
  10926static inline int add_uprobe_event_legacy(const char *probe_name, bool retprobe,
  10927					  const char *binary_path, size_t offset)
  10928{
  10929	const char *file = "/sys/kernel/debug/tracing/uprobe_events";
  10930
  10931	return append_to_file(file, "%c:%s/%s %s:0x%zx",
  10932			      retprobe ? 'r' : 'p',
  10933			      retprobe ? "uretprobes" : "uprobes",
  10934			      probe_name, binary_path, offset);
  10935}
  10936
  10937static inline int remove_uprobe_event_legacy(const char *probe_name, bool retprobe)
  10938{
  10939	const char *file = "/sys/kernel/debug/tracing/uprobe_events";
  10940
  10941	return append_to_file(file, "-:%s/%s", retprobe ? "uretprobes" : "uprobes", probe_name);
  10942}
  10943
  10944static int determine_uprobe_perf_type_legacy(const char *probe_name, bool retprobe)
  10945{
  10946	char file[512];
  10947
  10948	snprintf(file, sizeof(file),
  10949		 "/sys/kernel/debug/tracing/events/%s/%s/id",
  10950		 retprobe ? "uretprobes" : "uprobes", probe_name);
  10951
  10952	return parse_uint_from_file(file, "%d\n");
  10953}
  10954
  10955static int perf_event_uprobe_open_legacy(const char *probe_name, bool retprobe,
  10956					 const char *binary_path, size_t offset, int pid)
  10957{
  10958	struct perf_event_attr attr;
  10959	int type, pfd, err;
  10960
  10961	err = add_uprobe_event_legacy(probe_name, retprobe, binary_path, offset);
  10962	if (err < 0) {
  10963		pr_warn("failed to add legacy uprobe event for %s:0x%zx: %d\n",
  10964			binary_path, (size_t)offset, err);
  10965		return err;
  10966	}
  10967	type = determine_uprobe_perf_type_legacy(probe_name, retprobe);
  10968	if (type < 0) {
  10969		pr_warn("failed to determine legacy uprobe event id for %s:0x%zx: %d\n",
  10970			binary_path, offset, err);
  10971		return type;
  10972	}
  10973
  10974	memset(&attr, 0, sizeof(attr));
  10975	attr.size = sizeof(attr);
  10976	attr.config = type;
  10977	attr.type = PERF_TYPE_TRACEPOINT;
  10978
  10979	pfd = syscall(__NR_perf_event_open, &attr,
  10980		      pid < 0 ? -1 : pid, /* pid */
  10981		      pid == -1 ? 0 : -1, /* cpu */
  10982		      -1 /* group_fd */,  PERF_FLAG_FD_CLOEXEC);
  10983	if (pfd < 0) {
  10984		err = -errno;
  10985		pr_warn("legacy uprobe perf_event_open() failed: %d\n", err);
  10986		return err;
  10987	}
  10988	return pfd;
  10989}
  10990
  10991/* uprobes deal in relative offsets; subtract the base address associated with
  10992 * the mapped binary.  See Documentation/trace/uprobetracer.rst for more
  10993 * details.
  10994 */
  10995static long elf_find_relative_offset(const char *filename, Elf *elf, long addr)
  10996{
  10997	size_t n;
  10998	int i;
  10999
  11000	if (elf_getphdrnum(elf, &n)) {
  11001		pr_warn("elf: failed to find program headers for '%s': %s\n", filename,
  11002			elf_errmsg(-1));
  11003		return -ENOENT;
  11004	}
  11005
  11006	for (i = 0; i < n; i++) {
  11007		int seg_start, seg_end, seg_offset;
  11008		GElf_Phdr phdr;
  11009
  11010		if (!gelf_getphdr(elf, i, &phdr)) {
  11011			pr_warn("elf: failed to get program header %d from '%s': %s\n", i, filename,
  11012				elf_errmsg(-1));
  11013			return -ENOENT;
  11014		}
  11015		if (phdr.p_type != PT_LOAD || !(phdr.p_flags & PF_X))
  11016			continue;
  11017
  11018		seg_start = phdr.p_vaddr;
  11019		seg_end = seg_start + phdr.p_memsz;
  11020		seg_offset = phdr.p_offset;
  11021		if (addr >= seg_start && addr < seg_end)
  11022			return addr - seg_start + seg_offset;
  11023	}
  11024	pr_warn("elf: failed to find prog header containing 0x%lx in '%s'\n", addr, filename);
  11025	return -ENOENT;
  11026}
  11027
  11028/* Return next ELF section of sh_type after scn, or first of that type if scn is NULL. */
  11029static Elf_Scn *elf_find_next_scn_by_type(Elf *elf, int sh_type, Elf_Scn *scn)
  11030{
  11031	while ((scn = elf_nextscn(elf, scn)) != NULL) {
  11032		GElf_Shdr sh;
  11033
  11034		if (!gelf_getshdr(scn, &sh))
  11035			continue;
  11036		if (sh.sh_type == sh_type)
  11037			return scn;
  11038	}
  11039	return NULL;
  11040}
  11041
  11042/* Find offset of function name in object specified by path.  "name" matches
  11043 * symbol name or name@@LIB for library functions.
  11044 */
  11045static long elf_find_func_offset(const char *binary_path, const char *name)
  11046{
  11047	int fd, i, sh_types[2] = { SHT_DYNSYM, SHT_SYMTAB };
  11048	bool is_shared_lib, is_name_qualified;
  11049	char errmsg[STRERR_BUFSIZE];
  11050	long ret = -ENOENT;
  11051	size_t name_len;
  11052	GElf_Ehdr ehdr;
  11053	Elf *elf;
  11054
  11055	fd = open(binary_path, O_RDONLY | O_CLOEXEC);
  11056	if (fd < 0) {
  11057		ret = -errno;
  11058		pr_warn("failed to open %s: %s\n", binary_path,
  11059			libbpf_strerror_r(ret, errmsg, sizeof(errmsg)));
  11060		return ret;
  11061	}
  11062	elf = elf_begin(fd, ELF_C_READ_MMAP, NULL);
  11063	if (!elf) {
  11064		pr_warn("elf: could not read elf from %s: %s\n", binary_path, elf_errmsg(-1));
  11065		close(fd);
  11066		return -LIBBPF_ERRNO__FORMAT;
  11067	}
  11068	if (!gelf_getehdr(elf, &ehdr)) {
  11069		pr_warn("elf: failed to get ehdr from %s: %s\n", binary_path, elf_errmsg(-1));
  11070		ret = -LIBBPF_ERRNO__FORMAT;
  11071		goto out;
  11072	}
  11073	/* for shared lib case, we do not need to calculate relative offset */
  11074	is_shared_lib = ehdr.e_type == ET_DYN;
  11075
  11076	name_len = strlen(name);
  11077	/* Does name specify "@@LIB"? */
  11078	is_name_qualified = strstr(name, "@@") != NULL;
  11079
  11080	/* Search SHT_DYNSYM, SHT_SYMTAB for symbol.  This search order is used because if
  11081	 * a binary is stripped, it may only have SHT_DYNSYM, and a fully-statically
  11082	 * linked binary may not have SHT_DYMSYM, so absence of a section should not be
  11083	 * reported as a warning/error.
  11084	 */
  11085	for (i = 0; i < ARRAY_SIZE(sh_types); i++) {
  11086		size_t nr_syms, strtabidx, idx;
  11087		Elf_Data *symbols = NULL;
  11088		Elf_Scn *scn = NULL;
  11089		int last_bind = -1;
  11090		const char *sname;
  11091		GElf_Shdr sh;
  11092
  11093		scn = elf_find_next_scn_by_type(elf, sh_types[i], NULL);
  11094		if (!scn) {
  11095			pr_debug("elf: failed to find symbol table ELF sections in '%s'\n",
  11096				 binary_path);
  11097			continue;
  11098		}
  11099		if (!gelf_getshdr(scn, &sh))
  11100			continue;
  11101		strtabidx = sh.sh_link;
  11102		symbols = elf_getdata(scn, 0);
  11103		if (!symbols) {
  11104			pr_warn("elf: failed to get symbols for symtab section in '%s': %s\n",
  11105				binary_path, elf_errmsg(-1));
  11106			ret = -LIBBPF_ERRNO__FORMAT;
  11107			goto out;
  11108		}
  11109		nr_syms = symbols->d_size / sh.sh_entsize;
  11110
  11111		for (idx = 0; idx < nr_syms; idx++) {
  11112			int curr_bind;
  11113			GElf_Sym sym;
  11114
  11115			if (!gelf_getsym(symbols, idx, &sym))
  11116				continue;
  11117
  11118			if (GELF_ST_TYPE(sym.st_info) != STT_FUNC)
  11119				continue;
  11120
  11121			sname = elf_strptr(elf, strtabidx, sym.st_name);
  11122			if (!sname)
  11123				continue;
  11124
  11125			curr_bind = GELF_ST_BIND(sym.st_info);
  11126
  11127			/* User can specify func, func@@LIB or func@@LIB_VERSION. */
  11128			if (strncmp(sname, name, name_len) != 0)
  11129				continue;
  11130			/* ...but we don't want a search for "foo" to match 'foo2" also, so any
  11131			 * additional characters in sname should be of the form "@@LIB".
  11132			 */
  11133			if (!is_name_qualified && sname[name_len] != '\0' && sname[name_len] != '@')
  11134				continue;
  11135
  11136			if (ret >= 0) {
  11137				/* handle multiple matches */
  11138				if (last_bind != STB_WEAK && curr_bind != STB_WEAK) {
  11139					/* Only accept one non-weak bind. */
  11140					pr_warn("elf: ambiguous match for '%s', '%s' in '%s'\n",
  11141						sname, name, binary_path);
  11142					ret = -LIBBPF_ERRNO__FORMAT;
  11143					goto out;
  11144				} else if (curr_bind == STB_WEAK) {
  11145					/* already have a non-weak bind, and
  11146					 * this is a weak bind, so ignore.
  11147					 */
  11148					continue;
  11149				}
  11150			}
  11151			ret = sym.st_value;
  11152			last_bind = curr_bind;
  11153		}
  11154		/* For binaries that are not shared libraries, we need relative offset */
  11155		if (ret > 0 && !is_shared_lib)
  11156			ret = elf_find_relative_offset(binary_path, elf, ret);
  11157		if (ret > 0)
  11158			break;
  11159	}
  11160
  11161	if (ret > 0) {
  11162		pr_debug("elf: symbol address match for '%s' in '%s': 0x%lx\n", name, binary_path,
  11163			 ret);
  11164	} else {
  11165		if (ret == 0) {
  11166			pr_warn("elf: '%s' is 0 in symtab for '%s': %s\n", name, binary_path,
  11167				is_shared_lib ? "should not be 0 in a shared library" :
  11168						"try using shared library path instead");
  11169			ret = -ENOENT;
  11170		} else {
  11171			pr_warn("elf: failed to find symbol '%s' in '%s'\n", name, binary_path);
  11172		}
  11173	}
  11174out:
  11175	elf_end(elf);
  11176	close(fd);
  11177	return ret;
  11178}
  11179
  11180static const char *arch_specific_lib_paths(void)
  11181{
  11182	/*
  11183	 * Based on https://packages.debian.org/sid/libc6.
  11184	 *
  11185	 * Assume that the traced program is built for the same architecture
  11186	 * as libbpf, which should cover the vast majority of cases.
  11187	 */
  11188#if defined(__x86_64__)
  11189	return "/lib/x86_64-linux-gnu";
  11190#elif defined(__i386__)
  11191	return "/lib/i386-linux-gnu";
  11192#elif defined(__s390x__)
  11193	return "/lib/s390x-linux-gnu";
  11194#elif defined(__s390__)
  11195	return "/lib/s390-linux-gnu";
  11196#elif defined(__arm__) && defined(__SOFTFP__)
  11197	return "/lib/arm-linux-gnueabi";
  11198#elif defined(__arm__) && !defined(__SOFTFP__)
  11199	return "/lib/arm-linux-gnueabihf";
  11200#elif defined(__aarch64__)
  11201	return "/lib/aarch64-linux-gnu";
  11202#elif defined(__mips__) && defined(__MIPSEL__) && _MIPS_SZLONG == 64
  11203	return "/lib/mips64el-linux-gnuabi64";
  11204#elif defined(__mips__) && defined(__MIPSEL__) && _MIPS_SZLONG == 32
  11205	return "/lib/mipsel-linux-gnu";
  11206#elif defined(__powerpc64__) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
  11207	return "/lib/powerpc64le-linux-gnu";
  11208#elif defined(__sparc__) && defined(__arch64__)
  11209	return "/lib/sparc64-linux-gnu";
  11210#elif defined(__riscv) && __riscv_xlen == 64
  11211	return "/lib/riscv64-linux-gnu";
  11212#else
  11213	return NULL;
  11214#endif
  11215}
  11216
  11217/* Get full path to program/shared library. */
  11218static int resolve_full_path(const char *file, char *result, size_t result_sz)
  11219{
  11220	const char *search_paths[3] = {};
  11221	int i;
  11222
  11223	if (str_has_sfx(file, ".so") || strstr(file, ".so.")) {
  11224		search_paths[0] = getenv("LD_LIBRARY_PATH");
  11225		search_paths[1] = "/usr/lib64:/usr/lib";
  11226		search_paths[2] = arch_specific_lib_paths();
  11227	} else {
  11228		search_paths[0] = getenv("PATH");
  11229		search_paths[1] = "/usr/bin:/usr/sbin";
  11230	}
  11231
  11232	for (i = 0; i < ARRAY_SIZE(search_paths); i++) {
  11233		const char *s;
  11234
  11235		if (!search_paths[i])
  11236			continue;
  11237		for (s = search_paths[i]; s != NULL; s = strchr(s, ':')) {
  11238			char *next_path;
  11239			int seg_len;
  11240
  11241			if (s[0] == ':')
  11242				s++;
  11243			next_path = strchr(s, ':');
  11244			seg_len = next_path ? next_path - s : strlen(s);
  11245			if (!seg_len)
  11246				continue;
  11247			snprintf(result, result_sz, "%.*s/%s", seg_len, s, file);
  11248			/* ensure it is an executable file/link */
  11249			if (access(result, R_OK | X_OK) < 0)
  11250				continue;
  11251			pr_debug("resolved '%s' to '%s'\n", file, result);
  11252			return 0;
  11253		}
  11254	}
  11255	return -ENOENT;
  11256}
  11257
  11258LIBBPF_API struct bpf_link *
  11259bpf_program__attach_uprobe_opts(const struct bpf_program *prog, pid_t pid,
  11260				const char *binary_path, size_t func_offset,
  11261				const struct bpf_uprobe_opts *opts)
  11262{
  11263	DECLARE_LIBBPF_OPTS(bpf_perf_event_opts, pe_opts);
  11264	char errmsg[STRERR_BUFSIZE], *legacy_probe = NULL;
  11265	char full_binary_path[PATH_MAX];
  11266	struct bpf_link *link;
  11267	size_t ref_ctr_off;
  11268	int pfd, err;
  11269	bool retprobe, legacy;
  11270	const char *func_name;
  11271
  11272	if (!OPTS_VALID(opts, bpf_uprobe_opts))
  11273		return libbpf_err_ptr(-EINVAL);
  11274
  11275	retprobe = OPTS_GET(opts, retprobe, false);
  11276	ref_ctr_off = OPTS_GET(opts, ref_ctr_offset, 0);
  11277	pe_opts.bpf_cookie = OPTS_GET(opts, bpf_cookie, 0);
  11278
  11279	if (binary_path && !strchr(binary_path, '/')) {
  11280		err = resolve_full_path(binary_path, full_binary_path,
  11281					sizeof(full_binary_path));
  11282		if (err) {
  11283			pr_warn("prog '%s': failed to resolve full path for '%s': %d\n",
  11284				prog->name, binary_path, err);
  11285			return libbpf_err_ptr(err);
  11286		}
  11287		binary_path = full_binary_path;
  11288	}
  11289	func_name = OPTS_GET(opts, func_name, NULL);
  11290	if (func_name) {
  11291		long sym_off;
  11292
  11293		if (!binary_path) {
  11294			pr_warn("prog '%s': name-based attach requires binary_path\n",
  11295				prog->name);
  11296			return libbpf_err_ptr(-EINVAL);
  11297		}
  11298		sym_off = elf_find_func_offset(binary_path, func_name);
  11299		if (sym_off < 0)
  11300			return libbpf_err_ptr(sym_off);
  11301		func_offset += sym_off;
  11302	}
  11303
  11304	legacy = determine_uprobe_perf_type() < 0;
  11305	if (!legacy) {
  11306		pfd = perf_event_open_probe(true /* uprobe */, retprobe, binary_path,
  11307					    func_offset, pid, ref_ctr_off);
  11308	} else {
  11309		char probe_name[PATH_MAX + 64];
  11310
  11311		if (ref_ctr_off)
  11312			return libbpf_err_ptr(-EINVAL);
  11313
  11314		gen_uprobe_legacy_event_name(probe_name, sizeof(probe_name),
  11315					     binary_path, func_offset);
  11316
  11317		legacy_probe = strdup(probe_name);
  11318		if (!legacy_probe)
  11319			return libbpf_err_ptr(-ENOMEM);
  11320
  11321		pfd = perf_event_uprobe_open_legacy(legacy_probe, retprobe,
  11322						    binary_path, func_offset, pid);
  11323	}
  11324	if (pfd < 0) {
  11325		err = -errno;
  11326		pr_warn("prog '%s': failed to create %s '%s:0x%zx' perf event: %s\n",
  11327			prog->name, retprobe ? "uretprobe" : "uprobe",
  11328			binary_path, func_offset,
  11329			libbpf_strerror_r(err, errmsg, sizeof(errmsg)));
  11330		goto err_out;
  11331	}
  11332
  11333	link = bpf_program__attach_perf_event_opts(prog, pfd, &pe_opts);
  11334	err = libbpf_get_error(link);
  11335	if (err) {
  11336		close(pfd);
  11337		pr_warn("prog '%s': failed to attach to %s '%s:0x%zx': %s\n",
  11338			prog->name, retprobe ? "uretprobe" : "uprobe",
  11339			binary_path, func_offset,
  11340			libbpf_strerror_r(err, errmsg, sizeof(errmsg)));
  11341		goto err_out;
  11342	}
  11343	if (legacy) {
  11344		struct bpf_link_perf *perf_link = container_of(link, struct bpf_link_perf, link);
  11345
  11346		perf_link->legacy_probe_name = legacy_probe;
  11347		perf_link->legacy_is_kprobe = false;
  11348		perf_link->legacy_is_retprobe = retprobe;
  11349	}
  11350	return link;
  11351err_out:
  11352	free(legacy_probe);
  11353	return libbpf_err_ptr(err);
  11354
  11355}
  11356
  11357/* Format of u[ret]probe section definition supporting auto-attach:
  11358 * u[ret]probe/binary:function[+offset]
  11359 *
  11360 * binary can be an absolute/relative path or a filename; the latter is resolved to a
  11361 * full binary path via bpf_program__attach_uprobe_opts.
  11362 *
  11363 * Specifying uprobe+ ensures we carry out strict matching; either "uprobe" must be
  11364 * specified (and auto-attach is not possible) or the above format is specified for
  11365 * auto-attach.
  11366 */
  11367static int attach_uprobe(const struct bpf_program *prog, long cookie, struct bpf_link **link)
  11368{
  11369	DECLARE_LIBBPF_OPTS(bpf_uprobe_opts, opts);
  11370	char *probe_type = NULL, *binary_path = NULL, *func_name = NULL;
  11371	int n, ret = -EINVAL;
  11372	long offset = 0;
  11373
  11374	*link = NULL;
  11375
  11376	n = sscanf(prog->sec_name, "%m[^/]/%m[^:]:%m[a-zA-Z0-9_.]+%li",
  11377		   &probe_type, &binary_path, &func_name, &offset);
  11378	switch (n) {
  11379	case 1:
  11380		/* handle SEC("u[ret]probe") - format is valid, but auto-attach is impossible. */
  11381		ret = 0;
  11382		break;
  11383	case 2:
  11384		pr_warn("prog '%s': section '%s' missing ':function[+offset]' specification\n",
  11385			prog->name, prog->sec_name);
  11386		break;
  11387	case 3:
  11388	case 4:
  11389		opts.retprobe = strcmp(probe_type, "uretprobe") == 0;
  11390		if (opts.retprobe && offset != 0) {
  11391			pr_warn("prog '%s': uretprobes do not support offset specification\n",
  11392				prog->name);
  11393			break;
  11394		}
  11395		opts.func_name = func_name;
  11396		*link = bpf_program__attach_uprobe_opts(prog, -1, binary_path, offset, &opts);
  11397		ret = libbpf_get_error(*link);
  11398		break;
  11399	default:
  11400		pr_warn("prog '%s': invalid format of section definition '%s'\n", prog->name,
  11401			prog->sec_name);
  11402		break;
  11403	}
  11404	free(probe_type);
  11405	free(binary_path);
  11406	free(func_name);
  11407
  11408	return ret;
  11409}
  11410
  11411struct bpf_link *bpf_program__attach_uprobe(const struct bpf_program *prog,
  11412					    bool retprobe, pid_t pid,
  11413					    const char *binary_path,
  11414					    size_t func_offset)
  11415{
  11416	DECLARE_LIBBPF_OPTS(bpf_uprobe_opts, opts, .retprobe = retprobe);
  11417
  11418	return bpf_program__attach_uprobe_opts(prog, pid, binary_path, func_offset, &opts);
  11419}
  11420
  11421struct bpf_link *bpf_program__attach_usdt(const struct bpf_program *prog,
  11422					  pid_t pid, const char *binary_path,
  11423					  const char *usdt_provider, const char *usdt_name,
  11424					  const struct bpf_usdt_opts *opts)
  11425{
  11426	char resolved_path[512];
  11427	struct bpf_object *obj = prog->obj;
  11428	struct bpf_link *link;
  11429	__u64 usdt_cookie;
  11430	int err;
  11431
  11432	if (!OPTS_VALID(opts, bpf_uprobe_opts))
  11433		return libbpf_err_ptr(-EINVAL);
  11434
  11435	if (bpf_program__fd(prog) < 0) {
  11436		pr_warn("prog '%s': can't attach BPF program w/o FD (did you load it?)\n",
  11437			prog->name);
  11438		return libbpf_err_ptr(-EINVAL);
  11439	}
  11440
  11441	if (!strchr(binary_path, '/')) {
  11442		err = resolve_full_path(binary_path, resolved_path, sizeof(resolved_path));
  11443		if (err) {
  11444			pr_warn("prog '%s': failed to resolve full path for '%s': %d\n",
  11445				prog->name, binary_path, err);
  11446			return libbpf_err_ptr(err);
  11447		}
  11448		binary_path = resolved_path;
  11449	}
  11450
  11451	/* USDT manager is instantiated lazily on first USDT attach. It will
  11452	 * be destroyed together with BPF object in bpf_object__close().
  11453	 */
  11454	if (IS_ERR(obj->usdt_man))
  11455		return libbpf_ptr(obj->usdt_man);
  11456	if (!obj->usdt_man) {
  11457		obj->usdt_man = usdt_manager_new(obj);
  11458		if (IS_ERR(obj->usdt_man))
  11459			return libbpf_ptr(obj->usdt_man);
  11460	}
  11461
  11462	usdt_cookie = OPTS_GET(opts, usdt_cookie, 0);
  11463	link = usdt_manager_attach_usdt(obj->usdt_man, prog, pid, binary_path,
  11464				        usdt_provider, usdt_name, usdt_cookie);
  11465	err = libbpf_get_error(link);
  11466	if (err)
  11467		return libbpf_err_ptr(err);
  11468	return link;
  11469}
  11470
  11471static int attach_usdt(const struct bpf_program *prog, long cookie, struct bpf_link **link)
  11472{
  11473	char *path = NULL, *provider = NULL, *name = NULL;
  11474	const char *sec_name;
  11475	int n, err;
  11476
  11477	sec_name = bpf_program__section_name(prog);
  11478	if (strcmp(sec_name, "usdt") == 0) {
  11479		/* no auto-attach for just SEC("usdt") */
  11480		*link = NULL;
  11481		return 0;
  11482	}
  11483
  11484	n = sscanf(sec_name, "usdt/%m[^:]:%m[^:]:%m[^:]", &path, &provider, &name);
  11485	if (n != 3) {
  11486		pr_warn("invalid section '%s', expected SEC(\"usdt/<path>:<provider>:<name>\")\n",
  11487			sec_name);
  11488		err = -EINVAL;
  11489	} else {
  11490		*link = bpf_program__attach_usdt(prog, -1 /* any process */, path,
  11491						 provider, name, NULL);
  11492		err = libbpf_get_error(*link);
  11493	}
  11494	free(path);
  11495	free(provider);
  11496	free(name);
  11497	return err;
  11498}
  11499
  11500static int determine_tracepoint_id(const char *tp_category,
  11501				   const char *tp_name)
  11502{
  11503	char file[PATH_MAX];
  11504	int ret;
  11505
  11506	ret = snprintf(file, sizeof(file),
  11507		       "/sys/kernel/debug/tracing/events/%s/%s/id",
  11508		       tp_category, tp_name);
  11509	if (ret < 0)
  11510		return -errno;
  11511	if (ret >= sizeof(file)) {
  11512		pr_debug("tracepoint %s/%s path is too long\n",
  11513			 tp_category, tp_name);
  11514		return -E2BIG;
  11515	}
  11516	return parse_uint_from_file(file, "%d\n");
  11517}
  11518
  11519static int perf_event_open_tracepoint(const char *tp_category,
  11520				      const char *tp_name)
  11521{
  11522	struct perf_event_attr attr = {};
  11523	char errmsg[STRERR_BUFSIZE];
  11524	int tp_id, pfd, err;
  11525
  11526	tp_id = determine_tracepoint_id(tp_category, tp_name);
  11527	if (tp_id < 0) {
  11528		pr_warn("failed to determine tracepoint '%s/%s' perf event ID: %s\n",
  11529			tp_category, tp_name,
  11530			libbpf_strerror_r(tp_id, errmsg, sizeof(errmsg)));
  11531		return tp_id;
  11532	}
  11533
  11534	attr.type = PERF_TYPE_TRACEPOINT;
  11535	attr.size = sizeof(attr);
  11536	attr.config = tp_id;
  11537
  11538	pfd = syscall(__NR_perf_event_open, &attr, -1 /* pid */, 0 /* cpu */,
  11539		      -1 /* group_fd */, PERF_FLAG_FD_CLOEXEC);
  11540	if (pfd < 0) {
  11541		err = -errno;
  11542		pr_warn("tracepoint '%s/%s' perf_event_open() failed: %s\n",
  11543			tp_category, tp_name,
  11544			libbpf_strerror_r(err, errmsg, sizeof(errmsg)));
  11545		return err;
  11546	}
  11547	return pfd;
  11548}
  11549
  11550struct bpf_link *bpf_program__attach_tracepoint_opts(const struct bpf_program *prog,
  11551						     const char *tp_category,
  11552						     const char *tp_name,
  11553						     const struct bpf_tracepoint_opts *opts)
  11554{
  11555	DECLARE_LIBBPF_OPTS(bpf_perf_event_opts, pe_opts);
  11556	char errmsg[STRERR_BUFSIZE];
  11557	struct bpf_link *link;
  11558	int pfd, err;
  11559
  11560	if (!OPTS_VALID(opts, bpf_tracepoint_opts))
  11561		return libbpf_err_ptr(-EINVAL);
  11562
  11563	pe_opts.bpf_cookie = OPTS_GET(opts, bpf_cookie, 0);
  11564
  11565	pfd = perf_event_open_tracepoint(tp_category, tp_name);
  11566	if (pfd < 0) {
  11567		pr_warn("prog '%s': failed to create tracepoint '%s/%s' perf event: %s\n",
  11568			prog->name, tp_category, tp_name,
  11569			libbpf_strerror_r(pfd, errmsg, sizeof(errmsg)));
  11570		return libbpf_err_ptr(pfd);
  11571	}
  11572	link = bpf_program__attach_perf_event_opts(prog, pfd, &pe_opts);
  11573	err = libbpf_get_error(link);
  11574	if (err) {
  11575		close(pfd);
  11576		pr_warn("prog '%s': failed to attach to tracepoint '%s/%s': %s\n",
  11577			prog->name, tp_category, tp_name,
  11578			libbpf_strerror_r(err, errmsg, sizeof(errmsg)));
  11579		return libbpf_err_ptr(err);
  11580	}
  11581	return link;
  11582}
  11583
  11584struct bpf_link *bpf_program__attach_tracepoint(const struct bpf_program *prog,
  11585						const char *tp_category,
  11586						const char *tp_name)
  11587{
  11588	return bpf_program__attach_tracepoint_opts(prog, tp_category, tp_name, NULL);
  11589}
  11590
  11591static int attach_tp(const struct bpf_program *prog, long cookie, struct bpf_link **link)
  11592{
  11593	char *sec_name, *tp_cat, *tp_name;
  11594
  11595	*link = NULL;
  11596
  11597	/* no auto-attach for SEC("tp") or SEC("tracepoint") */
  11598	if (strcmp(prog->sec_name, "tp") == 0 || strcmp(prog->sec_name, "tracepoint") == 0)
  11599		return 0;
  11600
  11601	sec_name = strdup(prog->sec_name);
  11602	if (!sec_name)
  11603		return -ENOMEM;
  11604
  11605	/* extract "tp/<category>/<name>" or "tracepoint/<category>/<name>" */
  11606	if (str_has_pfx(prog->sec_name, "tp/"))
  11607		tp_cat = sec_name + sizeof("tp/") - 1;
  11608	else
  11609		tp_cat = sec_name + sizeof("tracepoint/") - 1;
  11610	tp_name = strchr(tp_cat, '/');
  11611	if (!tp_name) {
  11612		free(sec_name);
  11613		return -EINVAL;
  11614	}
  11615	*tp_name = '\0';
  11616	tp_name++;
  11617
  11618	*link = bpf_program__attach_tracepoint(prog, tp_cat, tp_name);
  11619	free(sec_name);
  11620	return libbpf_get_error(*link);
  11621}
  11622
  11623struct bpf_link *bpf_program__attach_raw_tracepoint(const struct bpf_program *prog,
  11624						    const char *tp_name)
  11625{
  11626	char errmsg[STRERR_BUFSIZE];
  11627	struct bpf_link *link;
  11628	int prog_fd, pfd;
  11629
  11630	prog_fd = bpf_program__fd(prog);
  11631	if (prog_fd < 0) {
  11632		pr_warn("prog '%s': can't attach before loaded\n", prog->name);
  11633		return libbpf_err_ptr(-EINVAL);
  11634	}
  11635
  11636	link = calloc(1, sizeof(*link));
  11637	if (!link)
  11638		return libbpf_err_ptr(-ENOMEM);
  11639	link->detach = &bpf_link__detach_fd;
  11640
  11641	pfd = bpf_raw_tracepoint_open(tp_name, prog_fd);
  11642	if (pfd < 0) {
  11643		pfd = -errno;
  11644		free(link);
  11645		pr_warn("prog '%s': failed to attach to raw tracepoint '%s': %s\n",
  11646			prog->name, tp_name, libbpf_strerror_r(pfd, errmsg, sizeof(errmsg)));
  11647		return libbpf_err_ptr(pfd);
  11648	}
  11649	link->fd = pfd;
  11650	return link;
  11651}
  11652
  11653static int attach_raw_tp(const struct bpf_program *prog, long cookie, struct bpf_link **link)
  11654{
  11655	static const char *const prefixes[] = {
  11656		"raw_tp",
  11657		"raw_tracepoint",
  11658		"raw_tp.w",
  11659		"raw_tracepoint.w",
  11660	};
  11661	size_t i;
  11662	const char *tp_name = NULL;
  11663
  11664	*link = NULL;
  11665
  11666	for (i = 0; i < ARRAY_SIZE(prefixes); i++) {
  11667		size_t pfx_len;
  11668
  11669		if (!str_has_pfx(prog->sec_name, prefixes[i]))
  11670			continue;
  11671
  11672		pfx_len = strlen(prefixes[i]);
  11673		/* no auto-attach case of, e.g., SEC("raw_tp") */
  11674		if (prog->sec_name[pfx_len] == '\0')
  11675			return 0;
  11676
  11677		if (prog->sec_name[pfx_len] != '/')
  11678			continue;
  11679
  11680		tp_name = prog->sec_name + pfx_len + 1;
  11681		break;
  11682	}
  11683
  11684	if (!tp_name) {
  11685		pr_warn("prog '%s': invalid section name '%s'\n",
  11686			prog->name, prog->sec_name);
  11687		return -EINVAL;
  11688	}
  11689
  11690	*link = bpf_program__attach_raw_tracepoint(prog, tp_name);
  11691	return libbpf_get_error(link);
  11692}
  11693
  11694/* Common logic for all BPF program types that attach to a btf_id */
  11695static struct bpf_link *bpf_program__attach_btf_id(const struct bpf_program *prog,
  11696						   const struct bpf_trace_opts *opts)
  11697{
  11698	LIBBPF_OPTS(bpf_link_create_opts, link_opts);
  11699	char errmsg[STRERR_BUFSIZE];
  11700	struct bpf_link *link;
  11701	int prog_fd, pfd;
  11702
  11703	if (!OPTS_VALID(opts, bpf_trace_opts))
  11704		return libbpf_err_ptr(-EINVAL);
  11705
  11706	prog_fd = bpf_program__fd(prog);
  11707	if (prog_fd < 0) {
  11708		pr_warn("prog '%s': can't attach before loaded\n", prog->name);
  11709		return libbpf_err_ptr(-EINVAL);
  11710	}
  11711
  11712	link = calloc(1, sizeof(*link));
  11713	if (!link)
  11714		return libbpf_err_ptr(-ENOMEM);
  11715	link->detach = &bpf_link__detach_fd;
  11716
  11717	/* libbpf is smart enough to redirect to BPF_RAW_TRACEPOINT_OPEN on old kernels */
  11718	link_opts.tracing.cookie = OPTS_GET(opts, cookie, 0);
  11719	pfd = bpf_link_create(prog_fd, 0, bpf_program__expected_attach_type(prog), &link_opts);
  11720	if (pfd < 0) {
  11721		pfd = -errno;
  11722		free(link);
  11723		pr_warn("prog '%s': failed to attach: %s\n",
  11724			prog->name, libbpf_strerror_r(pfd, errmsg, sizeof(errmsg)));
  11725		return libbpf_err_ptr(pfd);
  11726	}
  11727	link->fd = pfd;
  11728	return link;
  11729}
  11730
  11731struct bpf_link *bpf_program__attach_trace(const struct bpf_program *prog)
  11732{
  11733	return bpf_program__attach_btf_id(prog, NULL);
  11734}
  11735
  11736struct bpf_link *bpf_program__attach_trace_opts(const struct bpf_program *prog,
  11737						const struct bpf_trace_opts *opts)
  11738{
  11739	return bpf_program__attach_btf_id(prog, opts);
  11740}
  11741
  11742struct bpf_link *bpf_program__attach_lsm(const struct bpf_program *prog)
  11743{
  11744	return bpf_program__attach_btf_id(prog, NULL);
  11745}
  11746
  11747static int attach_trace(const struct bpf_program *prog, long cookie, struct bpf_link **link)
  11748{
  11749	*link = bpf_program__attach_trace(prog);
  11750	return libbpf_get_error(*link);
  11751}
  11752
  11753static int attach_lsm(const struct bpf_program *prog, long cookie, struct bpf_link **link)
  11754{
  11755	*link = bpf_program__attach_lsm(prog);
  11756	return libbpf_get_error(*link);
  11757}
  11758
  11759static struct bpf_link *
  11760bpf_program__attach_fd(const struct bpf_program *prog, int target_fd, int btf_id,
  11761		       const char *target_name)
  11762{
  11763	DECLARE_LIBBPF_OPTS(bpf_link_create_opts, opts,
  11764			    .target_btf_id = btf_id);
  11765	enum bpf_attach_type attach_type;
  11766	char errmsg[STRERR_BUFSIZE];
  11767	struct bpf_link *link;
  11768	int prog_fd, link_fd;
  11769
  11770	prog_fd = bpf_program__fd(prog);
  11771	if (prog_fd < 0) {
  11772		pr_warn("prog '%s': can't attach before loaded\n", prog->name);
  11773		return libbpf_err_ptr(-EINVAL);
  11774	}
  11775
  11776	link = calloc(1, sizeof(*link));
  11777	if (!link)
  11778		return libbpf_err_ptr(-ENOMEM);
  11779	link->detach = &bpf_link__detach_fd;
  11780
  11781	attach_type = bpf_program__expected_attach_type(prog);
  11782	link_fd = bpf_link_create(prog_fd, target_fd, attach_type, &opts);
  11783	if (link_fd < 0) {
  11784		link_fd = -errno;
  11785		free(link);
  11786		pr_warn("prog '%s': failed to attach to %s: %s\n",
  11787			prog->name, target_name,
  11788			libbpf_strerror_r(link_fd, errmsg, sizeof(errmsg)));
  11789		return libbpf_err_ptr(link_fd);
  11790	}
  11791	link->fd = link_fd;
  11792	return link;
  11793}
  11794
  11795struct bpf_link *
  11796bpf_program__attach_cgroup(const struct bpf_program *prog, int cgroup_fd)
  11797{
  11798	return bpf_program__attach_fd(prog, cgroup_fd, 0, "cgroup");
  11799}
  11800
  11801struct bpf_link *
  11802bpf_program__attach_netns(const struct bpf_program *prog, int netns_fd)
  11803{
  11804	return bpf_program__attach_fd(prog, netns_fd, 0, "netns");
  11805}
  11806
  11807struct bpf_link *bpf_program__attach_xdp(const struct bpf_program *prog, int ifindex)
  11808{
  11809	/* target_fd/target_ifindex use the same field in LINK_CREATE */
  11810	return bpf_program__attach_fd(prog, ifindex, 0, "xdp");
  11811}
  11812
  11813struct bpf_link *bpf_program__attach_freplace(const struct bpf_program *prog,
  11814					      int target_fd,
  11815					      const char *attach_func_name)
  11816{
  11817	int btf_id;
  11818
  11819	if (!!target_fd != !!attach_func_name) {
  11820		pr_warn("prog '%s': supply none or both of target_fd and attach_func_name\n",
  11821			prog->name);
  11822		return libbpf_err_ptr(-EINVAL);
  11823	}
  11824
  11825	if (prog->type != BPF_PROG_TYPE_EXT) {
  11826		pr_warn("prog '%s': only BPF_PROG_TYPE_EXT can attach as freplace",
  11827			prog->name);
  11828		return libbpf_err_ptr(-EINVAL);
  11829	}
  11830
  11831	if (target_fd) {
  11832		btf_id = libbpf_find_prog_btf_id(attach_func_name, target_fd);
  11833		if (btf_id < 0)
  11834			return libbpf_err_ptr(btf_id);
  11835
  11836		return bpf_program__attach_fd(prog, target_fd, btf_id, "freplace");
  11837	} else {
  11838		/* no target, so use raw_tracepoint_open for compatibility
  11839		 * with old kernels
  11840		 */
  11841		return bpf_program__attach_trace(prog);
  11842	}
  11843}
  11844
  11845struct bpf_link *
  11846bpf_program__attach_iter(const struct bpf_program *prog,
  11847			 const struct bpf_iter_attach_opts *opts)
  11848{
  11849	DECLARE_LIBBPF_OPTS(bpf_link_create_opts, link_create_opts);
  11850	char errmsg[STRERR_BUFSIZE];
  11851	struct bpf_link *link;
  11852	int prog_fd, link_fd;
  11853	__u32 target_fd = 0;
  11854
  11855	if (!OPTS_VALID(opts, bpf_iter_attach_opts))
  11856		return libbpf_err_ptr(-EINVAL);
  11857
  11858	link_create_opts.iter_info = OPTS_GET(opts, link_info, (void *)0);
  11859	link_create_opts.iter_info_len = OPTS_GET(opts, link_info_len, 0);
  11860
  11861	prog_fd = bpf_program__fd(prog);
  11862	if (prog_fd < 0) {
  11863		pr_warn("prog '%s': can't attach before loaded\n", prog->name);
  11864		return libbpf_err_ptr(-EINVAL);
  11865	}
  11866
  11867	link = calloc(1, sizeof(*link));
  11868	if (!link)
  11869		return libbpf_err_ptr(-ENOMEM);
  11870	link->detach = &bpf_link__detach_fd;
  11871
  11872	link_fd = bpf_link_create(prog_fd, target_fd, BPF_TRACE_ITER,
  11873				  &link_create_opts);
  11874	if (link_fd < 0) {
  11875		link_fd = -errno;
  11876		free(link);
  11877		pr_warn("prog '%s': failed to attach to iterator: %s\n",
  11878			prog->name, libbpf_strerror_r(link_fd, errmsg, sizeof(errmsg)));
  11879		return libbpf_err_ptr(link_fd);
  11880	}
  11881	link->fd = link_fd;
  11882	return link;
  11883}
  11884
  11885static int attach_iter(const struct bpf_program *prog, long cookie, struct bpf_link **link)
  11886{
  11887	*link = bpf_program__attach_iter(prog, NULL);
  11888	return libbpf_get_error(*link);
  11889}
  11890
  11891struct bpf_link *bpf_program__attach(const struct bpf_program *prog)
  11892{
  11893	struct bpf_link *link = NULL;
  11894	int err;
  11895
  11896	if (!prog->sec_def || !prog->sec_def->prog_attach_fn)
  11897		return libbpf_err_ptr(-EOPNOTSUPP);
  11898
  11899	err = prog->sec_def->prog_attach_fn(prog, prog->sec_def->cookie, &link);
  11900	if (err)
  11901		return libbpf_err_ptr(err);
  11902
  11903	/* When calling bpf_program__attach() explicitly, auto-attach support
  11904	 * is expected to work, so NULL returned link is considered an error.
  11905	 * This is different for skeleton's attach, see comment in
  11906	 * bpf_object__attach_skeleton().
  11907	 */
  11908	if (!link)
  11909		return libbpf_err_ptr(-EOPNOTSUPP);
  11910
  11911	return link;
  11912}
  11913
  11914static int bpf_link__detach_struct_ops(struct bpf_link *link)
  11915{
  11916	__u32 zero = 0;
  11917
  11918	if (bpf_map_delete_elem(link->fd, &zero))
  11919		return -errno;
  11920
  11921	return 0;
  11922}
  11923
  11924struct bpf_link *bpf_map__attach_struct_ops(const struct bpf_map *map)
  11925{
  11926	struct bpf_struct_ops *st_ops;
  11927	struct bpf_link *link;
  11928	__u32 i, zero = 0;
  11929	int err;
  11930
  11931	if (!bpf_map__is_struct_ops(map) || map->fd == -1)
  11932		return libbpf_err_ptr(-EINVAL);
  11933
  11934	link = calloc(1, sizeof(*link));
  11935	if (!link)
  11936		return libbpf_err_ptr(-EINVAL);
  11937
  11938	st_ops = map->st_ops;
  11939	for (i = 0; i < btf_vlen(st_ops->type); i++) {
  11940		struct bpf_program *prog = st_ops->progs[i];
  11941		void *kern_data;
  11942		int prog_fd;
  11943
  11944		if (!prog)
  11945			continue;
  11946
  11947		prog_fd = bpf_program__fd(prog);
  11948		kern_data = st_ops->kern_vdata + st_ops->kern_func_off[i];
  11949		*(unsigned long *)kern_data = prog_fd;
  11950	}
  11951
  11952	err = bpf_map_update_elem(map->fd, &zero, st_ops->kern_vdata, 0);
  11953	if (err) {
  11954		err = -errno;
  11955		free(link);
  11956		return libbpf_err_ptr(err);
  11957	}
  11958
  11959	link->detach = bpf_link__detach_struct_ops;
  11960	link->fd = map->fd;
  11961
  11962	return link;
  11963}
  11964
  11965static enum bpf_perf_event_ret
  11966perf_event_read_simple(void *mmap_mem, size_t mmap_size, size_t page_size,
  11967		       void **copy_mem, size_t *copy_size,
  11968		       bpf_perf_event_print_t fn, void *private_data)
  11969{
  11970	struct perf_event_mmap_page *header = mmap_mem;
  11971	__u64 data_head = ring_buffer_read_head(header);
  11972	__u64 data_tail = header->data_tail;
  11973	void *base = ((__u8 *)header) + page_size;
  11974	int ret = LIBBPF_PERF_EVENT_CONT;
  11975	struct perf_event_header *ehdr;
  11976	size_t ehdr_size;
  11977
  11978	while (data_head != data_tail) {
  11979		ehdr = base + (data_tail & (mmap_size - 1));
  11980		ehdr_size = ehdr->size;
  11981
  11982		if (((void *)ehdr) + ehdr_size > base + mmap_size) {
  11983			void *copy_start = ehdr;
  11984			size_t len_first = base + mmap_size - copy_start;
  11985			size_t len_secnd = ehdr_size - len_first;
  11986
  11987			if (*copy_size < ehdr_size) {
  11988				free(*copy_mem);
  11989				*copy_mem = malloc(ehdr_size);
  11990				if (!*copy_mem) {
  11991					*copy_size = 0;
  11992					ret = LIBBPF_PERF_EVENT_ERROR;
  11993					break;
  11994				}
  11995				*copy_size = ehdr_size;
  11996			}
  11997
  11998			memcpy(*copy_mem, copy_start, len_first);
  11999			memcpy(*copy_mem + len_first, base, len_secnd);
  12000			ehdr = *copy_mem;
  12001		}
  12002
  12003		ret = fn(ehdr, private_data);
  12004		data_tail += ehdr_size;
  12005		if (ret != LIBBPF_PERF_EVENT_CONT)
  12006			break;
  12007	}
  12008
  12009	ring_buffer_write_tail(header, data_tail);
  12010	return libbpf_err(ret);
  12011}
  12012
  12013__attribute__((alias("perf_event_read_simple")))
  12014enum bpf_perf_event_ret
  12015bpf_perf_event_read_simple(void *mmap_mem, size_t mmap_size, size_t page_size,
  12016			   void **copy_mem, size_t *copy_size,
  12017			   bpf_perf_event_print_t fn, void *private_data);
  12018
  12019struct perf_buffer;
  12020
  12021struct perf_buffer_params {
  12022	struct perf_event_attr *attr;
  12023	/* if event_cb is specified, it takes precendence */
  12024	perf_buffer_event_fn event_cb;
  12025	/* sample_cb and lost_cb are higher-level common-case callbacks */
  12026	perf_buffer_sample_fn sample_cb;
  12027	perf_buffer_lost_fn lost_cb;
  12028	void *ctx;
  12029	int cpu_cnt;
  12030	int *cpus;
  12031	int *map_keys;
  12032};
  12033
  12034struct perf_cpu_buf {
  12035	struct perf_buffer *pb;
  12036	void *base; /* mmap()'ed memory */
  12037	void *buf; /* for reconstructing segmented data */
  12038	size_t buf_size;
  12039	int fd;
  12040	int cpu;
  12041	int map_key;
  12042};
  12043
  12044struct perf_buffer {
  12045	perf_buffer_event_fn event_cb;
  12046	perf_buffer_sample_fn sample_cb;
  12047	perf_buffer_lost_fn lost_cb;
  12048	void *ctx; /* passed into callbacks */
  12049
  12050	size_t page_size;
  12051	size_t mmap_size;
  12052	struct perf_cpu_buf **cpu_bufs;
  12053	struct epoll_event *events;
  12054	int cpu_cnt; /* number of allocated CPU buffers */
  12055	int epoll_fd; /* perf event FD */
  12056	int map_fd; /* BPF_MAP_TYPE_PERF_EVENT_ARRAY BPF map FD */
  12057};
  12058
  12059static void perf_buffer__free_cpu_buf(struct perf_buffer *pb,
  12060				      struct perf_cpu_buf *cpu_buf)
  12061{
  12062	if (!cpu_buf)
  12063		return;
  12064	if (cpu_buf->base &&
  12065	    munmap(cpu_buf->base, pb->mmap_size + pb->page_size))
  12066		pr_warn("failed to munmap cpu_buf #%d\n", cpu_buf->cpu);
  12067	if (cpu_buf->fd >= 0) {
  12068		ioctl(cpu_buf->fd, PERF_EVENT_IOC_DISABLE, 0);
  12069		close(cpu_buf->fd);
  12070	}
  12071	free(cpu_buf->buf);
  12072	free(cpu_buf);
  12073}
  12074
  12075void perf_buffer__free(struct perf_buffer *pb)
  12076{
  12077	int i;
  12078
  12079	if (IS_ERR_OR_NULL(pb))
  12080		return;
  12081	if (pb->cpu_bufs) {
  12082		for (i = 0; i < pb->cpu_cnt; i++) {
  12083			struct perf_cpu_buf *cpu_buf = pb->cpu_bufs[i];
  12084
  12085			if (!cpu_buf)
  12086				continue;
  12087
  12088			bpf_map_delete_elem(pb->map_fd, &cpu_buf->map_key);
  12089			perf_buffer__free_cpu_buf(pb, cpu_buf);
  12090		}
  12091		free(pb->cpu_bufs);
  12092	}
  12093	if (pb->epoll_fd >= 0)
  12094		close(pb->epoll_fd);
  12095	free(pb->events);
  12096	free(pb);
  12097}
  12098
  12099static struct perf_cpu_buf *
  12100perf_buffer__open_cpu_buf(struct perf_buffer *pb, struct perf_event_attr *attr,
  12101			  int cpu, int map_key)
  12102{
  12103	struct perf_cpu_buf *cpu_buf;
  12104	char msg[STRERR_BUFSIZE];
  12105	int err;
  12106
  12107	cpu_buf = calloc(1, sizeof(*cpu_buf));
  12108	if (!cpu_buf)
  12109		return ERR_PTR(-ENOMEM);
  12110
  12111	cpu_buf->pb = pb;
  12112	cpu_buf->cpu = cpu;
  12113	cpu_buf->map_key = map_key;
  12114
  12115	cpu_buf->fd = syscall(__NR_perf_event_open, attr, -1 /* pid */, cpu,
  12116			      -1, PERF_FLAG_FD_CLOEXEC);
  12117	if (cpu_buf->fd < 0) {
  12118		err = -errno;
  12119		pr_warn("failed to open perf buffer event on cpu #%d: %s\n",
  12120			cpu, libbpf_strerror_r(err, msg, sizeof(msg)));
  12121		goto error;
  12122	}
  12123
  12124	cpu_buf->base = mmap(NULL, pb->mmap_size + pb->page_size,
  12125			     PROT_READ | PROT_WRITE, MAP_SHARED,
  12126			     cpu_buf->fd, 0);
  12127	if (cpu_buf->base == MAP_FAILED) {
  12128		cpu_buf->base = NULL;
  12129		err = -errno;
  12130		pr_warn("failed to mmap perf buffer on cpu #%d: %s\n",
  12131			cpu, libbpf_strerror_r(err, msg, sizeof(msg)));
  12132		goto error;
  12133	}
  12134
  12135	if (ioctl(cpu_buf->fd, PERF_EVENT_IOC_ENABLE, 0) < 0) {
  12136		err = -errno;
  12137		pr_warn("failed to enable perf buffer event on cpu #%d: %s\n",
  12138			cpu, libbpf_strerror_r(err, msg, sizeof(msg)));
  12139		goto error;
  12140	}
  12141
  12142	return cpu_buf;
  12143
  12144error:
  12145	perf_buffer__free_cpu_buf(pb, cpu_buf);
  12146	return (struct perf_cpu_buf *)ERR_PTR(err);
  12147}
  12148
  12149static struct perf_buffer *__perf_buffer__new(int map_fd, size_t page_cnt,
  12150					      struct perf_buffer_params *p);
  12151
  12152DEFAULT_VERSION(perf_buffer__new_v0_6_0, perf_buffer__new, LIBBPF_0.6.0)
  12153struct perf_buffer *perf_buffer__new_v0_6_0(int map_fd, size_t page_cnt,
  12154					    perf_buffer_sample_fn sample_cb,
  12155					    perf_buffer_lost_fn lost_cb,
  12156					    void *ctx,
  12157					    const struct perf_buffer_opts *opts)
  12158{
  12159	struct perf_buffer_params p = {};
  12160	struct perf_event_attr attr = {};
  12161
  12162	if (!OPTS_VALID(opts, perf_buffer_opts))
  12163		return libbpf_err_ptr(-EINVAL);
  12164
  12165	attr.config = PERF_COUNT_SW_BPF_OUTPUT;
  12166	attr.type = PERF_TYPE_SOFTWARE;
  12167	attr.sample_type = PERF_SAMPLE_RAW;
  12168	attr.sample_period = 1;
  12169	attr.wakeup_events = 1;
  12170
  12171	p.attr = &attr;
  12172	p.sample_cb = sample_cb;
  12173	p.lost_cb = lost_cb;
  12174	p.ctx = ctx;
  12175
  12176	return libbpf_ptr(__perf_buffer__new(map_fd, page_cnt, &p));
  12177}
  12178
  12179COMPAT_VERSION(perf_buffer__new_deprecated, perf_buffer__new, LIBBPF_0.0.4)
  12180struct perf_buffer *perf_buffer__new_deprecated(int map_fd, size_t page_cnt,
  12181						const struct perf_buffer_opts *opts)
  12182{
  12183	return perf_buffer__new_v0_6_0(map_fd, page_cnt,
  12184				       opts ? opts->sample_cb : NULL,
  12185				       opts ? opts->lost_cb : NULL,
  12186				       opts ? opts->ctx : NULL,
  12187				       NULL);
  12188}
  12189
  12190DEFAULT_VERSION(perf_buffer__new_raw_v0_6_0, perf_buffer__new_raw, LIBBPF_0.6.0)
  12191struct perf_buffer *perf_buffer__new_raw_v0_6_0(int map_fd, size_t page_cnt,
  12192						struct perf_event_attr *attr,
  12193						perf_buffer_event_fn event_cb, void *ctx,
  12194						const struct perf_buffer_raw_opts *opts)
  12195{
  12196	struct perf_buffer_params p = {};
  12197
  12198	if (!attr)
  12199		return libbpf_err_ptr(-EINVAL);
  12200
  12201	if (!OPTS_VALID(opts, perf_buffer_raw_opts))
  12202		return libbpf_err_ptr(-EINVAL);
  12203
  12204	p.attr = attr;
  12205	p.event_cb = event_cb;
  12206	p.ctx = ctx;
  12207	p.cpu_cnt = OPTS_GET(opts, cpu_cnt, 0);
  12208	p.cpus = OPTS_GET(opts, cpus, NULL);
  12209	p.map_keys = OPTS_GET(opts, map_keys, NULL);
  12210
  12211	return libbpf_ptr(__perf_buffer__new(map_fd, page_cnt, &p));
  12212}
  12213
  12214COMPAT_VERSION(perf_buffer__new_raw_deprecated, perf_buffer__new_raw, LIBBPF_0.0.4)
  12215struct perf_buffer *perf_buffer__new_raw_deprecated(int map_fd, size_t page_cnt,
  12216						    const struct perf_buffer_raw_opts *opts)
  12217{
  12218	LIBBPF_OPTS(perf_buffer_raw_opts, inner_opts,
  12219		.cpu_cnt = opts->cpu_cnt,
  12220		.cpus = opts->cpus,
  12221		.map_keys = opts->map_keys,
  12222	);
  12223
  12224	return perf_buffer__new_raw_v0_6_0(map_fd, page_cnt, opts->attr,
  12225					   opts->event_cb, opts->ctx, &inner_opts);
  12226}
  12227
  12228static struct perf_buffer *__perf_buffer__new(int map_fd, size_t page_cnt,
  12229					      struct perf_buffer_params *p)
  12230{
  12231	const char *online_cpus_file = "/sys/devices/system/cpu/online";
  12232	struct bpf_map_info map;
  12233	char msg[STRERR_BUFSIZE];
  12234	struct perf_buffer *pb;
  12235	bool *online = NULL;
  12236	__u32 map_info_len;
  12237	int err, i, j, n;
  12238
  12239	if (page_cnt == 0 || (page_cnt & (page_cnt - 1))) {
  12240		pr_warn("page count should be power of two, but is %zu\n",
  12241			page_cnt);
  12242		return ERR_PTR(-EINVAL);
  12243	}
  12244
  12245	/* best-effort sanity checks */
  12246	memset(&map, 0, sizeof(map));
  12247	map_info_len = sizeof(map);
  12248	err = bpf_obj_get_info_by_fd(map_fd, &map, &map_info_len);
  12249	if (err) {
  12250		err = -errno;
  12251		/* if BPF_OBJ_GET_INFO_BY_FD is supported, will return
  12252		 * -EBADFD, -EFAULT, or -E2BIG on real error
  12253		 */
  12254		if (err != -EINVAL) {
  12255			pr_warn("failed to get map info for map FD %d: %s\n",
  12256				map_fd, libbpf_strerror_r(err, msg, sizeof(msg)));
  12257			return ERR_PTR(err);
  12258		}
  12259		pr_debug("failed to get map info for FD %d; API not supported? Ignoring...\n",
  12260			 map_fd);
  12261	} else {
  12262		if (map.type != BPF_MAP_TYPE_PERF_EVENT_ARRAY) {
  12263			pr_warn("map '%s' should be BPF_MAP_TYPE_PERF_EVENT_ARRAY\n",
  12264				map.name);
  12265			return ERR_PTR(-EINVAL);
  12266		}
  12267	}
  12268
  12269	pb = calloc(1, sizeof(*pb));
  12270	if (!pb)
  12271		return ERR_PTR(-ENOMEM);
  12272
  12273	pb->event_cb = p->event_cb;
  12274	pb->sample_cb = p->sample_cb;
  12275	pb->lost_cb = p->lost_cb;
  12276	pb->ctx = p->ctx;
  12277
  12278	pb->page_size = getpagesize();
  12279	pb->mmap_size = pb->page_size * page_cnt;
  12280	pb->map_fd = map_fd;
  12281
  12282	pb->epoll_fd = epoll_create1(EPOLL_CLOEXEC);
  12283	if (pb->epoll_fd < 0) {
  12284		err = -errno;
  12285		pr_warn("failed to create epoll instance: %s\n",
  12286			libbpf_strerror_r(err, msg, sizeof(msg)));
  12287		goto error;
  12288	}
  12289
  12290	if (p->cpu_cnt > 0) {
  12291		pb->cpu_cnt = p->cpu_cnt;
  12292	} else {
  12293		pb->cpu_cnt = libbpf_num_possible_cpus();
  12294		if (pb->cpu_cnt < 0) {
  12295			err = pb->cpu_cnt;
  12296			goto error;
  12297		}
  12298		if (map.max_entries && map.max_entries < pb->cpu_cnt)
  12299			pb->cpu_cnt = map.max_entries;
  12300	}
  12301
  12302	pb->events = calloc(pb->cpu_cnt, sizeof(*pb->events));
  12303	if (!pb->events) {
  12304		err = -ENOMEM;
  12305		pr_warn("failed to allocate events: out of memory\n");
  12306		goto error;
  12307	}
  12308	pb->cpu_bufs = calloc(pb->cpu_cnt, sizeof(*pb->cpu_bufs));
  12309	if (!pb->cpu_bufs) {
  12310		err = -ENOMEM;
  12311		pr_warn("failed to allocate buffers: out of memory\n");
  12312		goto error;
  12313	}
  12314
  12315	err = parse_cpu_mask_file(online_cpus_file, &online, &n);
  12316	if (err) {
  12317		pr_warn("failed to get online CPU mask: %d\n", err);
  12318		goto error;
  12319	}
  12320
  12321	for (i = 0, j = 0; i < pb->cpu_cnt; i++) {
  12322		struct perf_cpu_buf *cpu_buf;
  12323		int cpu, map_key;
  12324
  12325		cpu = p->cpu_cnt > 0 ? p->cpus[i] : i;
  12326		map_key = p->cpu_cnt > 0 ? p->map_keys[i] : i;
  12327
  12328		/* in case user didn't explicitly requested particular CPUs to
  12329		 * be attached to, skip offline/not present CPUs
  12330		 */
  12331		if (p->cpu_cnt <= 0 && (cpu >= n || !online[cpu]))
  12332			continue;
  12333
  12334		cpu_buf = perf_buffer__open_cpu_buf(pb, p->attr, cpu, map_key);
  12335		if (IS_ERR(cpu_buf)) {
  12336			err = PTR_ERR(cpu_buf);
  12337			goto error;
  12338		}
  12339
  12340		pb->cpu_bufs[j] = cpu_buf;
  12341
  12342		err = bpf_map_update_elem(pb->map_fd, &map_key,
  12343					  &cpu_buf->fd, 0);
  12344		if (err) {
  12345			err = -errno;
  12346			pr_warn("failed to set cpu #%d, key %d -> perf FD %d: %s\n",
  12347				cpu, map_key, cpu_buf->fd,
  12348				libbpf_strerror_r(err, msg, sizeof(msg)));
  12349			goto error;
  12350		}
  12351
  12352		pb->events[j].events = EPOLLIN;
  12353		pb->events[j].data.ptr = cpu_buf;
  12354		if (epoll_ctl(pb->epoll_fd, EPOLL_CTL_ADD, cpu_buf->fd,
  12355			      &pb->events[j]) < 0) {
  12356			err = -errno;
  12357			pr_warn("failed to epoll_ctl cpu #%d perf FD %d: %s\n",
  12358				cpu, cpu_buf->fd,
  12359				libbpf_strerror_r(err, msg, sizeof(msg)));
  12360			goto error;
  12361		}
  12362		j++;
  12363	}
  12364	pb->cpu_cnt = j;
  12365	free(online);
  12366
  12367	return pb;
  12368
  12369error:
  12370	free(online);
  12371	if (pb)
  12372		perf_buffer__free(pb);
  12373	return ERR_PTR(err);
  12374}
  12375
  12376struct perf_sample_raw {
  12377	struct perf_event_header header;
  12378	uint32_t size;
  12379	char data[];
  12380};
  12381
  12382struct perf_sample_lost {
  12383	struct perf_event_header header;
  12384	uint64_t id;
  12385	uint64_t lost;
  12386	uint64_t sample_id;
  12387};
  12388
  12389static enum bpf_perf_event_ret
  12390perf_buffer__process_record(struct perf_event_header *e, void *ctx)
  12391{
  12392	struct perf_cpu_buf *cpu_buf = ctx;
  12393	struct perf_buffer *pb = cpu_buf->pb;
  12394	void *data = e;
  12395
  12396	/* user wants full control over parsing perf event */
  12397	if (pb->event_cb)
  12398		return pb->event_cb(pb->ctx, cpu_buf->cpu, e);
  12399
  12400	switch (e->type) {
  12401	case PERF_RECORD_SAMPLE: {
  12402		struct perf_sample_raw *s = data;
  12403
  12404		if (pb->sample_cb)
  12405			pb->sample_cb(pb->ctx, cpu_buf->cpu, s->data, s->size);
  12406		break;
  12407	}
  12408	case PERF_RECORD_LOST: {
  12409		struct perf_sample_lost *s = data;
  12410
  12411		if (pb->lost_cb)
  12412			pb->lost_cb(pb->ctx, cpu_buf->cpu, s->lost);
  12413		break;
  12414	}
  12415	default:
  12416		pr_warn("unknown perf sample type %d\n", e->type);
  12417		return LIBBPF_PERF_EVENT_ERROR;
  12418	}
  12419	return LIBBPF_PERF_EVENT_CONT;
  12420}
  12421
  12422static int perf_buffer__process_records(struct perf_buffer *pb,
  12423					struct perf_cpu_buf *cpu_buf)
  12424{
  12425	enum bpf_perf_event_ret ret;
  12426
  12427	ret = perf_event_read_simple(cpu_buf->base, pb->mmap_size,
  12428				     pb->page_size, &cpu_buf->buf,
  12429				     &cpu_buf->buf_size,
  12430				     perf_buffer__process_record, cpu_buf);
  12431	if (ret != LIBBPF_PERF_EVENT_CONT)
  12432		return ret;
  12433	return 0;
  12434}
  12435
  12436int perf_buffer__epoll_fd(const struct perf_buffer *pb)
  12437{
  12438	return pb->epoll_fd;
  12439}
  12440
  12441int perf_buffer__poll(struct perf_buffer *pb, int timeout_ms)
  12442{
  12443	int i, cnt, err;
  12444
  12445	cnt = epoll_wait(pb->epoll_fd, pb->events, pb->cpu_cnt, timeout_ms);
  12446	if (cnt < 0)
  12447		return -errno;
  12448
  12449	for (i = 0; i < cnt; i++) {
  12450		struct perf_cpu_buf *cpu_buf = pb->events[i].data.ptr;
  12451
  12452		err = perf_buffer__process_records(pb, cpu_buf);
  12453		if (err) {
  12454			pr_warn("error while processing records: %d\n", err);
  12455			return libbpf_err(err);
  12456		}
  12457	}
  12458	return cnt;
  12459}
  12460
  12461/* Return number of PERF_EVENT_ARRAY map slots set up by this perf_buffer
  12462 * manager.
  12463 */
  12464size_t perf_buffer__buffer_cnt(const struct perf_buffer *pb)
  12465{
  12466	return pb->cpu_cnt;
  12467}
  12468
  12469/*
  12470 * Return perf_event FD of a ring buffer in *buf_idx* slot of
  12471 * PERF_EVENT_ARRAY BPF map. This FD can be polled for new data using
  12472 * select()/poll()/epoll() Linux syscalls.
  12473 */
  12474int perf_buffer__buffer_fd(const struct perf_buffer *pb, size_t buf_idx)
  12475{
  12476	struct perf_cpu_buf *cpu_buf;
  12477
  12478	if (buf_idx >= pb->cpu_cnt)
  12479		return libbpf_err(-EINVAL);
  12480
  12481	cpu_buf = pb->cpu_bufs[buf_idx];
  12482	if (!cpu_buf)
  12483		return libbpf_err(-ENOENT);
  12484
  12485	return cpu_buf->fd;
  12486}
  12487
  12488/*
  12489 * Consume data from perf ring buffer corresponding to slot *buf_idx* in
  12490 * PERF_EVENT_ARRAY BPF map without waiting/polling. If there is no data to
  12491 * consume, do nothing and return success.
  12492 * Returns:
  12493 *   - 0 on success;
  12494 *   - <0 on failure.
  12495 */
  12496int perf_buffer__consume_buffer(struct perf_buffer *pb, size_t buf_idx)
  12497{
  12498	struct perf_cpu_buf *cpu_buf;
  12499
  12500	if (buf_idx >= pb->cpu_cnt)
  12501		return libbpf_err(-EINVAL);
  12502
  12503	cpu_buf = pb->cpu_bufs[buf_idx];
  12504	if (!cpu_buf)
  12505		return libbpf_err(-ENOENT);
  12506
  12507	return perf_buffer__process_records(pb, cpu_buf);
  12508}
  12509
  12510int perf_buffer__consume(struct perf_buffer *pb)
  12511{
  12512	int i, err;
  12513
  12514	for (i = 0; i < pb->cpu_cnt; i++) {
  12515		struct perf_cpu_buf *cpu_buf = pb->cpu_bufs[i];
  12516
  12517		if (!cpu_buf)
  12518			continue;
  12519
  12520		err = perf_buffer__process_records(pb, cpu_buf);
  12521		if (err) {
  12522			pr_warn("perf_buffer: failed to process records in buffer #%d: %d\n", i, err);
  12523			return libbpf_err(err);
  12524		}
  12525	}
  12526	return 0;
  12527}
  12528
  12529struct bpf_prog_info_array_desc {
  12530	int	array_offset;	/* e.g. offset of jited_prog_insns */
  12531	int	count_offset;	/* e.g. offset of jited_prog_len */
  12532	int	size_offset;	/* > 0: offset of rec size,
  12533				 * < 0: fix size of -size_offset
  12534				 */
  12535};
  12536
  12537static struct bpf_prog_info_array_desc bpf_prog_info_array_desc[] = {
  12538	[BPF_PROG_INFO_JITED_INSNS] = {
  12539		offsetof(struct bpf_prog_info, jited_prog_insns),
  12540		offsetof(struct bpf_prog_info, jited_prog_len),
  12541		-1,
  12542	},
  12543	[BPF_PROG_INFO_XLATED_INSNS] = {
  12544		offsetof(struct bpf_prog_info, xlated_prog_insns),
  12545		offsetof(struct bpf_prog_info, xlated_prog_len),
  12546		-1,
  12547	},
  12548	[BPF_PROG_INFO_MAP_IDS] = {
  12549		offsetof(struct bpf_prog_info, map_ids),
  12550		offsetof(struct bpf_prog_info, nr_map_ids),
  12551		-(int)sizeof(__u32),
  12552	},
  12553	[BPF_PROG_INFO_JITED_KSYMS] = {
  12554		offsetof(struct bpf_prog_info, jited_ksyms),
  12555		offsetof(struct bpf_prog_info, nr_jited_ksyms),
  12556		-(int)sizeof(__u64),
  12557	},
  12558	[BPF_PROG_INFO_JITED_FUNC_LENS] = {
  12559		offsetof(struct bpf_prog_info, jited_func_lens),
  12560		offsetof(struct bpf_prog_info, nr_jited_func_lens),
  12561		-(int)sizeof(__u32),
  12562	},
  12563	[BPF_PROG_INFO_FUNC_INFO] = {
  12564		offsetof(struct bpf_prog_info, func_info),
  12565		offsetof(struct bpf_prog_info, nr_func_info),
  12566		offsetof(struct bpf_prog_info, func_info_rec_size),
  12567	},
  12568	[BPF_PROG_INFO_LINE_INFO] = {
  12569		offsetof(struct bpf_prog_info, line_info),
  12570		offsetof(struct bpf_prog_info, nr_line_info),
  12571		offsetof(struct bpf_prog_info, line_info_rec_size),
  12572	},
  12573	[BPF_PROG_INFO_JITED_LINE_INFO] = {
  12574		offsetof(struct bpf_prog_info, jited_line_info),
  12575		offsetof(struct bpf_prog_info, nr_jited_line_info),
  12576		offsetof(struct bpf_prog_info, jited_line_info_rec_size),
  12577	},
  12578	[BPF_PROG_INFO_PROG_TAGS] = {
  12579		offsetof(struct bpf_prog_info, prog_tags),
  12580		offsetof(struct bpf_prog_info, nr_prog_tags),
  12581		-(int)sizeof(__u8) * BPF_TAG_SIZE,
  12582	},
  12583
  12584};
  12585
  12586static __u32 bpf_prog_info_read_offset_u32(struct bpf_prog_info *info,
  12587					   int offset)
  12588{
  12589	__u32 *array = (__u32 *)info;
  12590
  12591	if (offset >= 0)
  12592		return array[offset / sizeof(__u32)];
  12593	return -(int)offset;
  12594}
  12595
  12596static __u64 bpf_prog_info_read_offset_u64(struct bpf_prog_info *info,
  12597					   int offset)
  12598{
  12599	__u64 *array = (__u64 *)info;
  12600
  12601	if (offset >= 0)
  12602		return array[offset / sizeof(__u64)];
  12603	return -(int)offset;
  12604}
  12605
  12606static void bpf_prog_info_set_offset_u32(struct bpf_prog_info *info, int offset,
  12607					 __u32 val)
  12608{
  12609	__u32 *array = (__u32 *)info;
  12610
  12611	if (offset >= 0)
  12612		array[offset / sizeof(__u32)] = val;
  12613}
  12614
  12615static void bpf_prog_info_set_offset_u64(struct bpf_prog_info *info, int offset,
  12616					 __u64 val)
  12617{
  12618	__u64 *array = (__u64 *)info;
  12619
  12620	if (offset >= 0)
  12621		array[offset / sizeof(__u64)] = val;
  12622}
  12623
  12624struct bpf_prog_info_linear *
  12625bpf_program__get_prog_info_linear(int fd, __u64 arrays)
  12626{
  12627	struct bpf_prog_info_linear *info_linear;
  12628	struct bpf_prog_info info = {};
  12629	__u32 info_len = sizeof(info);
  12630	__u32 data_len = 0;
  12631	int i, err;
  12632	void *ptr;
  12633
  12634	if (arrays >> BPF_PROG_INFO_LAST_ARRAY)
  12635		return libbpf_err_ptr(-EINVAL);
  12636
  12637	/* step 1: get array dimensions */
  12638	err = bpf_obj_get_info_by_fd(fd, &info, &info_len);
  12639	if (err) {
  12640		pr_debug("can't get prog info: %s", strerror(errno));
  12641		return libbpf_err_ptr(-EFAULT);
  12642	}
  12643
  12644	/* step 2: calculate total size of all arrays */
  12645	for (i = BPF_PROG_INFO_FIRST_ARRAY; i < BPF_PROG_INFO_LAST_ARRAY; ++i) {
  12646		bool include_array = (arrays & (1UL << i)) > 0;
  12647		struct bpf_prog_info_array_desc *desc;
  12648		__u32 count, size;
  12649
  12650		desc = bpf_prog_info_array_desc + i;
  12651
  12652		/* kernel is too old to support this field */
  12653		if (info_len < desc->array_offset + sizeof(__u32) ||
  12654		    info_len < desc->count_offset + sizeof(__u32) ||
  12655		    (desc->size_offset > 0 && info_len < desc->size_offset))
  12656			include_array = false;
  12657
  12658		if (!include_array) {
  12659			arrays &= ~(1UL << i);	/* clear the bit */
  12660			continue;
  12661		}
  12662
  12663		count = bpf_prog_info_read_offset_u32(&info, desc->count_offset);
  12664		size  = bpf_prog_info_read_offset_u32(&info, desc->size_offset);
  12665
  12666		data_len += count * size;
  12667	}
  12668
  12669	/* step 3: allocate continuous memory */
  12670	data_len = roundup(data_len, sizeof(__u64));
  12671	info_linear = malloc(sizeof(struct bpf_prog_info_linear) + data_len);
  12672	if (!info_linear)
  12673		return libbpf_err_ptr(-ENOMEM);
  12674
  12675	/* step 4: fill data to info_linear->info */
  12676	info_linear->arrays = arrays;
  12677	memset(&info_linear->info, 0, sizeof(info));
  12678	ptr = info_linear->data;
  12679
  12680	for (i = BPF_PROG_INFO_FIRST_ARRAY; i < BPF_PROG_INFO_LAST_ARRAY; ++i) {
  12681		struct bpf_prog_info_array_desc *desc;
  12682		__u32 count, size;
  12683
  12684		if ((arrays & (1UL << i)) == 0)
  12685			continue;
  12686
  12687		desc  = bpf_prog_info_array_desc + i;
  12688		count = bpf_prog_info_read_offset_u32(&info, desc->count_offset);
  12689		size  = bpf_prog_info_read_offset_u32(&info, desc->size_offset);
  12690		bpf_prog_info_set_offset_u32(&info_linear->info,
  12691					     desc->count_offset, count);
  12692		bpf_prog_info_set_offset_u32(&info_linear->info,
  12693					     desc->size_offset, size);
  12694		bpf_prog_info_set_offset_u64(&info_linear->info,
  12695					     desc->array_offset,
  12696					     ptr_to_u64(ptr));
  12697		ptr += count * size;
  12698	}
  12699
  12700	/* step 5: call syscall again to get required arrays */
  12701	err = bpf_obj_get_info_by_fd(fd, &info_linear->info, &info_len);
  12702	if (err) {
  12703		pr_debug("can't get prog info: %s", strerror(errno));
  12704		free(info_linear);
  12705		return libbpf_err_ptr(-EFAULT);
  12706	}
  12707
  12708	/* step 6: verify the data */
  12709	for (i = BPF_PROG_INFO_FIRST_ARRAY; i < BPF_PROG_INFO_LAST_ARRAY; ++i) {
  12710		struct bpf_prog_info_array_desc *desc;
  12711		__u32 v1, v2;
  12712
  12713		if ((arrays & (1UL << i)) == 0)
  12714			continue;
  12715
  12716		desc = bpf_prog_info_array_desc + i;
  12717		v1 = bpf_prog_info_read_offset_u32(&info, desc->count_offset);
  12718		v2 = bpf_prog_info_read_offset_u32(&info_linear->info,
  12719						   desc->count_offset);
  12720		if (v1 != v2)
  12721			pr_warn("%s: mismatch in element count\n", __func__);
  12722
  12723		v1 = bpf_prog_info_read_offset_u32(&info, desc->size_offset);
  12724		v2 = bpf_prog_info_read_offset_u32(&info_linear->info,
  12725						   desc->size_offset);
  12726		if (v1 != v2)
  12727			pr_warn("%s: mismatch in rec size\n", __func__);
  12728	}
  12729
  12730	/* step 7: update info_len and data_len */
  12731	info_linear->info_len = sizeof(struct bpf_prog_info);
  12732	info_linear->data_len = data_len;
  12733
  12734	return info_linear;
  12735}
  12736
  12737void bpf_program__bpil_addr_to_offs(struct bpf_prog_info_linear *info_linear)
  12738{
  12739	int i;
  12740
  12741	for (i = BPF_PROG_INFO_FIRST_ARRAY; i < BPF_PROG_INFO_LAST_ARRAY; ++i) {
  12742		struct bpf_prog_info_array_desc *desc;
  12743		__u64 addr, offs;
  12744
  12745		if ((info_linear->arrays & (1UL << i)) == 0)
  12746			continue;
  12747
  12748		desc = bpf_prog_info_array_desc + i;
  12749		addr = bpf_prog_info_read_offset_u64(&info_linear->info,
  12750						     desc->array_offset);
  12751		offs = addr - ptr_to_u64(info_linear->data);
  12752		bpf_prog_info_set_offset_u64(&info_linear->info,
  12753					     desc->array_offset, offs);
  12754	}
  12755}
  12756
  12757void bpf_program__bpil_offs_to_addr(struct bpf_prog_info_linear *info_linear)
  12758{
  12759	int i;
  12760
  12761	for (i = BPF_PROG_INFO_FIRST_ARRAY; i < BPF_PROG_INFO_LAST_ARRAY; ++i) {
  12762		struct bpf_prog_info_array_desc *desc;
  12763		__u64 addr, offs;
  12764
  12765		if ((info_linear->arrays & (1UL << i)) == 0)
  12766			continue;
  12767
  12768		desc = bpf_prog_info_array_desc + i;
  12769		offs = bpf_prog_info_read_offset_u64(&info_linear->info,
  12770						     desc->array_offset);
  12771		addr = offs + ptr_to_u64(info_linear->data);
  12772		bpf_prog_info_set_offset_u64(&info_linear->info,
  12773					     desc->array_offset, addr);
  12774	}
  12775}
  12776
  12777int bpf_program__set_attach_target(struct bpf_program *prog,
  12778				   int attach_prog_fd,
  12779				   const char *attach_func_name)
  12780{
  12781	int btf_obj_fd = 0, btf_id = 0, err;
  12782
  12783	if (!prog || attach_prog_fd < 0)
  12784		return libbpf_err(-EINVAL);
  12785
  12786	if (prog->obj->loaded)
  12787		return libbpf_err(-EINVAL);
  12788
  12789	if (attach_prog_fd && !attach_func_name) {
  12790		/* remember attach_prog_fd and let bpf_program__load() find
  12791		 * BTF ID during the program load
  12792		 */
  12793		prog->attach_prog_fd = attach_prog_fd;
  12794		return 0;
  12795	}
  12796
  12797	if (attach_prog_fd) {
  12798		btf_id = libbpf_find_prog_btf_id(attach_func_name,
  12799						 attach_prog_fd);
  12800		if (btf_id < 0)
  12801			return libbpf_err(btf_id);
  12802	} else {
  12803		if (!attach_func_name)
  12804			return libbpf_err(-EINVAL);
  12805
  12806		/* load btf_vmlinux, if not yet */
  12807		err = bpf_object__load_vmlinux_btf(prog->obj, true);
  12808		if (err)
  12809			return libbpf_err(err);
  12810		err = find_kernel_btf_id(prog->obj, attach_func_name,
  12811					 prog->expected_attach_type,
  12812					 &btf_obj_fd, &btf_id);
  12813		if (err)
  12814			return libbpf_err(err);
  12815	}
  12816
  12817	prog->attach_btf_id = btf_id;
  12818	prog->attach_btf_obj_fd = btf_obj_fd;
  12819	prog->attach_prog_fd = attach_prog_fd;
  12820	return 0;
  12821}
  12822
  12823int parse_cpu_mask_str(const char *s, bool **mask, int *mask_sz)
  12824{
  12825	int err = 0, n, len, start, end = -1;
  12826	bool *tmp;
  12827
  12828	*mask = NULL;
  12829	*mask_sz = 0;
  12830
  12831	/* Each sub string separated by ',' has format \d+-\d+ or \d+ */
  12832	while (*s) {
  12833		if (*s == ',' || *s == '\n') {
  12834			s++;
  12835			continue;
  12836		}
  12837		n = sscanf(s, "%d%n-%d%n", &start, &len, &end, &len);
  12838		if (n <= 0 || n > 2) {
  12839			pr_warn("Failed to get CPU range %s: %d\n", s, n);
  12840			err = -EINVAL;
  12841			goto cleanup;
  12842		} else if (n == 1) {
  12843			end = start;
  12844		}
  12845		if (start < 0 || start > end) {
  12846			pr_warn("Invalid CPU range [%d,%d] in %s\n",
  12847				start, end, s);
  12848			err = -EINVAL;
  12849			goto cleanup;
  12850		}
  12851		tmp = realloc(*mask, end + 1);
  12852		if (!tmp) {
  12853			err = -ENOMEM;
  12854			goto cleanup;
  12855		}
  12856		*mask = tmp;
  12857		memset(tmp + *mask_sz, 0, start - *mask_sz);
  12858		memset(tmp + start, 1, end - start + 1);
  12859		*mask_sz = end + 1;
  12860		s += len;
  12861	}
  12862	if (!*mask_sz) {
  12863		pr_warn("Empty CPU range\n");
  12864		return -EINVAL;
  12865	}
  12866	return 0;
  12867cleanup:
  12868	free(*mask);
  12869	*mask = NULL;
  12870	return err;
  12871}
  12872
  12873int parse_cpu_mask_file(const char *fcpu, bool **mask, int *mask_sz)
  12874{
  12875	int fd, err = 0, len;
  12876	char buf[128];
  12877
  12878	fd = open(fcpu, O_RDONLY | O_CLOEXEC);
  12879	if (fd < 0) {
  12880		err = -errno;
  12881		pr_warn("Failed to open cpu mask file %s: %d\n", fcpu, err);
  12882		return err;
  12883	}
  12884	len = read(fd, buf, sizeof(buf));
  12885	close(fd);
  12886	if (len <= 0) {
  12887		err = len ? -errno : -EINVAL;
  12888		pr_warn("Failed to read cpu mask from %s: %d\n", fcpu, err);
  12889		return err;
  12890	}
  12891	if (len >= sizeof(buf)) {
  12892		pr_warn("CPU mask is too big in file %s\n", fcpu);
  12893		return -E2BIG;
  12894	}
  12895	buf[len] = '\0';
  12896
  12897	return parse_cpu_mask_str(buf, mask, mask_sz);
  12898}
  12899
  12900int libbpf_num_possible_cpus(void)
  12901{
  12902	static const char *fcpu = "/sys/devices/system/cpu/possible";
  12903	static int cpus;
  12904	int err, n, i, tmp_cpus;
  12905	bool *mask;
  12906
  12907	tmp_cpus = READ_ONCE(cpus);
  12908	if (tmp_cpus > 0)
  12909		return tmp_cpus;
  12910
  12911	err = parse_cpu_mask_file(fcpu, &mask, &n);
  12912	if (err)
  12913		return libbpf_err(err);
  12914
  12915	tmp_cpus = 0;
  12916	for (i = 0; i < n; i++) {
  12917		if (mask[i])
  12918			tmp_cpus++;
  12919	}
  12920	free(mask);
  12921
  12922	WRITE_ONCE(cpus, tmp_cpus);
  12923	return tmp_cpus;
  12924}
  12925
  12926static int populate_skeleton_maps(const struct bpf_object *obj,
  12927				  struct bpf_map_skeleton *maps,
  12928				  size_t map_cnt)
  12929{
  12930	int i;
  12931
  12932	for (i = 0; i < map_cnt; i++) {
  12933		struct bpf_map **map = maps[i].map;
  12934		const char *name = maps[i].name;
  12935		void **mmaped = maps[i].mmaped;
  12936
  12937		*map = bpf_object__find_map_by_name(obj, name);
  12938		if (!*map) {
  12939			pr_warn("failed to find skeleton map '%s'\n", name);
  12940			return -ESRCH;
  12941		}
  12942
  12943		/* externs shouldn't be pre-setup from user code */
  12944		if (mmaped && (*map)->libbpf_type != LIBBPF_MAP_KCONFIG)
  12945			*mmaped = (*map)->mmaped;
  12946	}
  12947	return 0;
  12948}
  12949
  12950static int populate_skeleton_progs(const struct bpf_object *obj,
  12951				   struct bpf_prog_skeleton *progs,
  12952				   size_t prog_cnt)
  12953{
  12954	int i;
  12955
  12956	for (i = 0; i < prog_cnt; i++) {
  12957		struct bpf_program **prog = progs[i].prog;
  12958		const char *name = progs[i].name;
  12959
  12960		*prog = bpf_object__find_program_by_name(obj, name);
  12961		if (!*prog) {
  12962			pr_warn("failed to find skeleton program '%s'\n", name);
  12963			return -ESRCH;
  12964		}
  12965	}
  12966	return 0;
  12967}
  12968
  12969int bpf_object__open_skeleton(struct bpf_object_skeleton *s,
  12970			      const struct bpf_object_open_opts *opts)
  12971{
  12972	DECLARE_LIBBPF_OPTS(bpf_object_open_opts, skel_opts,
  12973		.object_name = s->name,
  12974	);
  12975	struct bpf_object *obj;
  12976	int err;
  12977
  12978	/* Attempt to preserve opts->object_name, unless overriden by user
  12979	 * explicitly. Overwriting object name for skeletons is discouraged,
  12980	 * as it breaks global data maps, because they contain object name
  12981	 * prefix as their own map name prefix. When skeleton is generated,
  12982	 * bpftool is making an assumption that this name will stay the same.
  12983	 */
  12984	if (opts) {
  12985		memcpy(&skel_opts, opts, sizeof(*opts));
  12986		if (!opts->object_name)
  12987			skel_opts.object_name = s->name;
  12988	}
  12989
  12990	obj = bpf_object__open_mem(s->data, s->data_sz, &skel_opts);
  12991	err = libbpf_get_error(obj);
  12992	if (err) {
  12993		pr_warn("failed to initialize skeleton BPF object '%s': %d\n",
  12994			s->name, err);
  12995		return libbpf_err(err);
  12996	}
  12997
  12998	*s->obj = obj;
  12999	err = populate_skeleton_maps(obj, s->maps, s->map_cnt);
  13000	if (err) {
  13001		pr_warn("failed to populate skeleton maps for '%s': %d\n", s->name, err);
  13002		return libbpf_err(err);
  13003	}
  13004
  13005	err = populate_skeleton_progs(obj, s->progs, s->prog_cnt);
  13006	if (err) {
  13007		pr_warn("failed to populate skeleton progs for '%s': %d\n", s->name, err);
  13008		return libbpf_err(err);
  13009	}
  13010
  13011	return 0;
  13012}
  13013
  13014int bpf_object__open_subskeleton(struct bpf_object_subskeleton *s)
  13015{
  13016	int err, len, var_idx, i;
  13017	const char *var_name;
  13018	const struct bpf_map *map;
  13019	struct btf *btf;
  13020	__u32 map_type_id;
  13021	const struct btf_type *map_type, *var_type;
  13022	const struct bpf_var_skeleton *var_skel;
  13023	struct btf_var_secinfo *var;
  13024
  13025	if (!s->obj)
  13026		return libbpf_err(-EINVAL);
  13027
  13028	btf = bpf_object__btf(s->obj);
  13029	if (!btf) {
  13030		pr_warn("subskeletons require BTF at runtime (object %s)\n",
  13031		        bpf_object__name(s->obj));
  13032		return libbpf_err(-errno);
  13033	}
  13034
  13035	err = populate_skeleton_maps(s->obj, s->maps, s->map_cnt);
  13036	if (err) {
  13037		pr_warn("failed to populate subskeleton maps: %d\n", err);
  13038		return libbpf_err(err);
  13039	}
  13040
  13041	err = populate_skeleton_progs(s->obj, s->progs, s->prog_cnt);
  13042	if (err) {
  13043		pr_warn("failed to populate subskeleton maps: %d\n", err);
  13044		return libbpf_err(err);
  13045	}
  13046
  13047	for (var_idx = 0; var_idx < s->var_cnt; var_idx++) {
  13048		var_skel = &s->vars[var_idx];
  13049		map = *var_skel->map;
  13050		map_type_id = bpf_map__btf_value_type_id(map);
  13051		map_type = btf__type_by_id(btf, map_type_id);
  13052
  13053		if (!btf_is_datasec(map_type)) {
  13054			pr_warn("type for map '%1$s' is not a datasec: %2$s",
  13055				bpf_map__name(map),
  13056				__btf_kind_str(btf_kind(map_type)));
  13057			return libbpf_err(-EINVAL);
  13058		}
  13059
  13060		len = btf_vlen(map_type);
  13061		var = btf_var_secinfos(map_type);
  13062		for (i = 0; i < len; i++, var++) {
  13063			var_type = btf__type_by_id(btf, var->type);
  13064			var_name = btf__name_by_offset(btf, var_type->name_off);
  13065			if (strcmp(var_name, var_skel->name) == 0) {
  13066				*var_skel->addr = map->mmaped + var->offset;
  13067				break;
  13068			}
  13069		}
  13070	}
  13071	return 0;
  13072}
  13073
  13074void bpf_object__destroy_subskeleton(struct bpf_object_subskeleton *s)
  13075{
  13076	if (!s)
  13077		return;
  13078	free(s->maps);
  13079	free(s->progs);
  13080	free(s->vars);
  13081	free(s);
  13082}
  13083
  13084int bpf_object__load_skeleton(struct bpf_object_skeleton *s)
  13085{
  13086	int i, err;
  13087
  13088	err = bpf_object__load(*s->obj);
  13089	if (err) {
  13090		pr_warn("failed to load BPF skeleton '%s': %d\n", s->name, err);
  13091		return libbpf_err(err);
  13092	}
  13093
  13094	for (i = 0; i < s->map_cnt; i++) {
  13095		struct bpf_map *map = *s->maps[i].map;
  13096		size_t mmap_sz = bpf_map_mmap_sz(map);
  13097		int prot, map_fd = bpf_map__fd(map);
  13098		void **mmaped = s->maps[i].mmaped;
  13099
  13100		if (!mmaped)
  13101			continue;
  13102
  13103		if (!(map->def.map_flags & BPF_F_MMAPABLE)) {
  13104			*mmaped = NULL;
  13105			continue;
  13106		}
  13107
  13108		if (map->def.map_flags & BPF_F_RDONLY_PROG)
  13109			prot = PROT_READ;
  13110		else
  13111			prot = PROT_READ | PROT_WRITE;
  13112
  13113		/* Remap anonymous mmap()-ed "map initialization image" as
  13114		 * a BPF map-backed mmap()-ed memory, but preserving the same
  13115		 * memory address. This will cause kernel to change process'
  13116		 * page table to point to a different piece of kernel memory,
  13117		 * but from userspace point of view memory address (and its
  13118		 * contents, being identical at this point) will stay the
  13119		 * same. This mapping will be released by bpf_object__close()
  13120		 * as per normal clean up procedure, so we don't need to worry
  13121		 * about it from skeleton's clean up perspective.
  13122		 */
  13123		*mmaped = mmap(map->mmaped, mmap_sz, prot,
  13124				MAP_SHARED | MAP_FIXED, map_fd, 0);
  13125		if (*mmaped == MAP_FAILED) {
  13126			err = -errno;
  13127			*mmaped = NULL;
  13128			pr_warn("failed to re-mmap() map '%s': %d\n",
  13129				 bpf_map__name(map), err);
  13130			return libbpf_err(err);
  13131		}
  13132	}
  13133
  13134	return 0;
  13135}
  13136
  13137int bpf_object__attach_skeleton(struct bpf_object_skeleton *s)
  13138{
  13139	int i, err;
  13140
  13141	for (i = 0; i < s->prog_cnt; i++) {
  13142		struct bpf_program *prog = *s->progs[i].prog;
  13143		struct bpf_link **link = s->progs[i].link;
  13144
  13145		if (!prog->autoload)
  13146			continue;
  13147
  13148		/* auto-attaching not supported for this program */
  13149		if (!prog->sec_def || !prog->sec_def->prog_attach_fn)
  13150			continue;
  13151
  13152		/* if user already set the link manually, don't attempt auto-attach */
  13153		if (*link)
  13154			continue;
  13155
  13156		err = prog->sec_def->prog_attach_fn(prog, prog->sec_def->cookie, link);
  13157		if (err) {
  13158			pr_warn("prog '%s': failed to auto-attach: %d\n",
  13159				bpf_program__name(prog), err);
  13160			return libbpf_err(err);
  13161		}
  13162
  13163		/* It's possible that for some SEC() definitions auto-attach
  13164		 * is supported in some cases (e.g., if definition completely
  13165		 * specifies target information), but is not in other cases.
  13166		 * SEC("uprobe") is one such case. If user specified target
  13167		 * binary and function name, such BPF program can be
  13168		 * auto-attached. But if not, it shouldn't trigger skeleton's
  13169		 * attach to fail. It should just be skipped.
  13170		 * attach_fn signals such case with returning 0 (no error) and
  13171		 * setting link to NULL.
  13172		 */
  13173	}
  13174
  13175	return 0;
  13176}
  13177
  13178void bpf_object__detach_skeleton(struct bpf_object_skeleton *s)
  13179{
  13180	int i;
  13181
  13182	for (i = 0; i < s->prog_cnt; i++) {
  13183		struct bpf_link **link = s->progs[i].link;
  13184
  13185		bpf_link__destroy(*link);
  13186		*link = NULL;
  13187	}
  13188}
  13189
  13190void bpf_object__destroy_skeleton(struct bpf_object_skeleton *s)
  13191{
  13192	if (!s)
  13193		return;
  13194
  13195	if (s->progs)
  13196		bpf_object__detach_skeleton(s);
  13197	if (s->obj)
  13198		bpf_object__close(*s->obj);
  13199	free(s->maps);
  13200	free(s->progs);
  13201	free(s);
  13202}