mirror of
https://github.com/netdata/libbpf.git
synced 2026-03-31 05:39:06 +08:00
libbpf: Add elf_open/elf_close functions
Adding elf_open/elf_close functions and using it in elf_find_func_offset_from_file function. It will be used in following changes to save some common code. Acked-by: Andrii Nakryiko <andrii@kernel.org> Signed-off-by: Jiri Olsa <jolsa@kernel.org> Link: https://lore.kernel.org/r/20230809083440.3209381-10-jolsa@kernel.org Signed-off-by: Alexei Starovoitov <ast@kernel.org>
This commit is contained in:
committed by
Andrii Nakryiko
parent
0cd5b05f53
commit
1f8929293e
30
src/usdt.c
30
src/usdt.c
@@ -946,32 +946,22 @@ struct bpf_link *usdt_manager_attach_usdt(struct usdt_manager *man, const struct
|
||||
const char *usdt_provider, const char *usdt_name,
|
||||
__u64 usdt_cookie)
|
||||
{
|
||||
int i, fd, err, spec_map_fd, ip_map_fd;
|
||||
int i, err, spec_map_fd, ip_map_fd;
|
||||
LIBBPF_OPTS(bpf_uprobe_opts, opts);
|
||||
struct hashmap *specs_hash = NULL;
|
||||
struct bpf_link_usdt *link = NULL;
|
||||
struct usdt_target *targets = NULL;
|
||||
struct elf_fd elf_fd;
|
||||
size_t target_cnt;
|
||||
Elf *elf;
|
||||
|
||||
spec_map_fd = bpf_map__fd(man->specs_map);
|
||||
ip_map_fd = bpf_map__fd(man->ip_to_spec_id_map);
|
||||
|
||||
fd = open(path, O_RDONLY | O_CLOEXEC);
|
||||
if (fd < 0) {
|
||||
err = -errno;
|
||||
pr_warn("usdt: failed to open ELF binary '%s': %d\n", path, err);
|
||||
err = elf_open(path, &elf_fd);
|
||||
if (err)
|
||||
return libbpf_err_ptr(err);
|
||||
}
|
||||
|
||||
elf = elf_begin(fd, ELF_C_READ_MMAP, NULL);
|
||||
if (!elf) {
|
||||
err = -EBADF;
|
||||
pr_warn("usdt: failed to parse ELF binary '%s': %s\n", path, elf_errmsg(-1));
|
||||
goto err_out;
|
||||
}
|
||||
|
||||
err = sanity_check_usdt_elf(elf, path);
|
||||
err = sanity_check_usdt_elf(elf_fd.elf, path);
|
||||
if (err)
|
||||
goto err_out;
|
||||
|
||||
@@ -984,7 +974,7 @@ struct bpf_link *usdt_manager_attach_usdt(struct usdt_manager *man, const struct
|
||||
/* discover USDT in given binary, optionally limiting
|
||||
* activations to a given PID, if pid > 0
|
||||
*/
|
||||
err = collect_usdt_targets(man, elf, path, pid, usdt_provider, usdt_name,
|
||||
err = collect_usdt_targets(man, elf_fd.elf, path, pid, usdt_provider, usdt_name,
|
||||
usdt_cookie, &targets, &target_cnt);
|
||||
if (err <= 0) {
|
||||
err = (err == 0) ? -ENOENT : err;
|
||||
@@ -1069,9 +1059,7 @@ struct bpf_link *usdt_manager_attach_usdt(struct usdt_manager *man, const struct
|
||||
|
||||
free(targets);
|
||||
hashmap__free(specs_hash);
|
||||
elf_end(elf);
|
||||
close(fd);
|
||||
|
||||
elf_close(&elf_fd);
|
||||
return &link->link;
|
||||
|
||||
err_out:
|
||||
@@ -1079,9 +1067,7 @@ err_out:
|
||||
bpf_link__destroy(&link->link);
|
||||
free(targets);
|
||||
hashmap__free(specs_hash);
|
||||
if (elf)
|
||||
elf_end(elf);
|
||||
close(fd);
|
||||
elf_close(&elf_fd);
|
||||
return libbpf_err_ptr(err);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user