diff options
Diffstat (limited to 'tools/lib/bpf/libbpf.c')
| -rw-r--r-- | tools/lib/bpf/libbpf.c | 34 | 
1 files changed, 22 insertions, 12 deletions
diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c index 0a06124f7999..0ad0b0491e1f 100644 --- a/tools/lib/bpf/libbpf.c +++ b/tools/lib/bpf/libbpf.c @@ -2264,7 +2264,7 @@ static int bpf_object__init_user_btf_maps(struct bpf_object *obj, bool strict,  		data = elf_getdata(scn, NULL);  	if (!scn || !data) {  		pr_warn("failed to get Elf_Data from map section %d (%s)\n", -			obj->efile.maps_shndx, MAPS_ELF_SEC); +			obj->efile.btf_maps_shndx, MAPS_ELF_SEC);  		return -EINVAL;  	} @@ -2434,6 +2434,8 @@ static int bpf_object__init_btf(struct bpf_object *obj,  				BTF_ELF_SEC, err);  			goto out;  		} +		/* enforce 8-byte pointers for BPF-targeted BTFs */ +		btf__set_pointer_size(obj->btf, 8);  		err = 0;  	}  	if (btf_ext_data) { @@ -2542,6 +2544,8 @@ static int bpf_object__sanitize_and_load_btf(struct bpf_object *obj)  		if (IS_ERR(kern_btf))  			return PTR_ERR(kern_btf); +		/* enforce 8-byte pointers for BPF-targeted BTFs */ +		btf__set_pointer_size(obj->btf, 8);  		bpf_object__sanitize_btf(obj, kern_btf);  	} @@ -3478,10 +3482,11 @@ bpf_object__probe_global_data(struct bpf_object *obj)  	map = bpf_create_map_xattr(&map_attr);  	if (map < 0) { -		cp = libbpf_strerror_r(errno, errmsg, sizeof(errmsg)); +		ret = -errno; +		cp = libbpf_strerror_r(ret, errmsg, sizeof(errmsg));  		pr_warn("Error in %s():%s(%d). Couldn't create simple array map.\n", -			__func__, cp, errno); -		return -errno; +			__func__, cp, -ret); +		return ret;  	}  	insns[0].imm = map; @@ -5194,7 +5199,8 @@ static int bpf_object__collect_st_ops_relos(struct bpf_object *obj,  static int bpf_object__collect_map_relos(struct bpf_object *obj,  					 GElf_Shdr *shdr, Elf_Data *data)  { -	int i, j, nrels, new_sz, ptr_sz = sizeof(void *); +	const int bpf_ptr_sz = 8, host_ptr_sz = sizeof(void *); +	int i, j, nrels, new_sz;  	const struct btf_var_secinfo *vi = NULL;  	const struct btf_type *sec, *var, *def;  	const struct btf_member *member; @@ -5243,7 +5249,7 @@ static int bpf_object__collect_map_relos(struct bpf_object *obj,  			vi = btf_var_secinfos(sec) + map->btf_var_idx;  			if (vi->offset <= rel.r_offset && -			    rel.r_offset + sizeof(void *) <= vi->offset + vi->size) +			    rel.r_offset + bpf_ptr_sz <= vi->offset + vi->size)  				break;  		}  		if (j == obj->nr_maps) { @@ -5279,17 +5285,20 @@ static int bpf_object__collect_map_relos(struct bpf_object *obj,  			return -EINVAL;  		moff = rel.r_offset - vi->offset - moff; -		if (moff % ptr_sz) +		/* here we use BPF pointer size, which is always 64 bit, as we +		 * are parsing ELF that was built for BPF target +		 */ +		if (moff % bpf_ptr_sz)  			return -EINVAL; -		moff /= ptr_sz; +		moff /= bpf_ptr_sz;  		if (moff >= map->init_slots_sz) {  			new_sz = moff + 1; -			tmp = realloc(map->init_slots, new_sz * ptr_sz); +			tmp = realloc(map->init_slots, new_sz * host_ptr_sz);  			if (!tmp)  				return -ENOMEM;  			map->init_slots = tmp;  			memset(map->init_slots + map->init_slots_sz, 0, -			       (new_sz - map->init_slots_sz) * ptr_sz); +			       (new_sz - map->init_slots_sz) * host_ptr_sz);  			map->init_slots_sz = new_sz;  		}  		map->init_slots[moff] = targ_map; @@ -6012,9 +6021,10 @@ int bpf_program__pin_instance(struct bpf_program *prog, const char *path,  	}  	if (bpf_obj_pin(prog->instances.fds[instance], path)) { -		cp = libbpf_strerror_r(errno, errmsg, sizeof(errmsg)); +		err = -errno; +		cp = libbpf_strerror_r(err, errmsg, sizeof(errmsg));  		pr_warn("failed to pin program: %s\n", cp); -		return -errno; +		return err;  	}  	pr_debug("pinned program '%s'\n", path);  |