BPF List
 help / color / mirror / Atom feed
From: Jiri Olsa <jolsa@kernel.org>
To: Alexei Starovoitov <ast@kernel.org>,
	Daniel Borkmann <daniel@iogearbox.net>,
	Andrii Nakryiko <andrii@kernel.org>
Cc: bpf@vger.kernel.org, Martin KaFai Lau <kafai@fb.com>,
	Song Liu <songliubraving@fb.com>, Yonghong Song <yhs@fb.com>,
	John Fastabend <john.fastabend@gmail.com>,
	KP Singh <kpsingh@chromium.org>,
	Stanislav Fomichev <sdf@google.com>, Hao Luo <haoluo@google.com>
Subject: [PATCHv3 bpf-next 08/26] libbpf: Add elf_open/elf_close functions
Date: Fri, 30 Jun 2023 10:33:26 +0200	[thread overview]
Message-ID: <20230630083344.984305-9-jolsa@kernel.org> (raw)
In-Reply-To: <20230630083344.984305-1-jolsa@kernel.org>

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.

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 tools/lib/bpf/elf.c        | 59 +++++++++++++++++++++++++-------------
 tools/lib/bpf/libbpf_elf.h |  8 ++++++
 tools/lib/bpf/usdt.c       | 31 ++++++--------------
 3 files changed, 56 insertions(+), 42 deletions(-)

diff --git a/tools/lib/bpf/elf.c b/tools/lib/bpf/elf.c
index 2b62b4af28ce..74e35071d22e 100644
--- a/tools/lib/bpf/elf.c
+++ b/tools/lib/bpf/elf.c
@@ -11,6 +11,40 @@
 
 #define STRERR_BUFSIZE  128
 
+int elf_open(const char *binary_path, struct elf_fd *elf_fd)
+{
+	char errmsg[STRERR_BUFSIZE];
+	int fd, ret;
+	Elf *elf;
+
+	if (elf_version(EV_CURRENT) == EV_NONE) {
+		pr_warn("elf: failed to init libelf for %s\n", binary_path);
+		return -LIBBPF_ERRNO__LIBELF;
+	}
+	fd = open(binary_path, O_RDONLY | O_CLOEXEC);
+	if (fd < 0) {
+		ret = -errno;
+		pr_warn("elf: failed to open %s: %s\n", binary_path,
+			libbpf_strerror_r(ret, errmsg, sizeof(errmsg)));
+		return ret;
+	}
+	elf = elf_begin(fd, ELF_C_READ_MMAP, NULL);
+	if (!elf) {
+		pr_warn("elf: could not read elf from %s: %s\n", binary_path, elf_errmsg(-1));
+		close(fd);
+		return -LIBBPF_ERRNO__FORMAT;
+	}
+	elf_fd->fd = fd;
+	elf_fd->elf = elf;
+	return 0;
+}
+
+void elf_close(struct elf_fd *elf_fd)
+{
+	elf_end(elf_fd->elf);
+	close(elf_fd->fd);
+}
+
 /* Return next ELF section of sh_type after scn, or first of that type if scn is NULL. */
 static Elf_Scn *elf_find_next_scn_by_type(Elf *elf, int sh_type, Elf_Scn *scn)
 {
@@ -171,28 +205,13 @@ long elf_find_func_offset(Elf *elf, const char *binary_path, const char *name)
  */
 long elf_find_func_offset_from_file(const char *binary_path, const char *name)
 {
-	char errmsg[STRERR_BUFSIZE];
+	struct elf_fd elf_fd;
 	long ret = -ENOENT;
-	Elf *elf;
-	int fd;
 
-	fd = open(binary_path, O_RDONLY | O_CLOEXEC);
-	if (fd < 0) {
-		ret = -errno;
-		pr_warn("failed to open %s: %s\n", binary_path,
-			libbpf_strerror_r(ret, errmsg, sizeof(errmsg)));
+	ret = elf_open(binary_path, &elf_fd);
+	if (ret)
 		return ret;
-	}
-	elf = elf_begin(fd, ELF_C_READ_MMAP, NULL);
-	if (!elf) {
-		pr_warn("elf: could not read elf from %s: %s\n", binary_path, elf_errmsg(-1));
-		close(fd);
-		return -LIBBPF_ERRNO__FORMAT;
-	}
-
-	ret = elf_find_func_offset(elf, binary_path, name);
-	elf_end(elf);
-	close(fd);
+	ret = elf_find_func_offset(elf_fd.elf, binary_path, name);
+	elf_close(&elf_fd);
 	return ret;
 }
-
diff --git a/tools/lib/bpf/libbpf_elf.h b/tools/lib/bpf/libbpf_elf.h
index 1b652220fabf..c763ac35a85e 100644
--- a/tools/lib/bpf/libbpf_elf.h
+++ b/tools/lib/bpf/libbpf_elf.h
@@ -5,6 +5,14 @@
 
 #include <libelf.h>
 
+struct elf_fd {
+	Elf *elf;
+	int fd;
+};
+
+int elf_open(const char *binary_path, struct elf_fd *elf_fd);
+void elf_close(struct elf_fd *elf_fd);
+
 long elf_find_func_offset(Elf *elf, const char *binary_path, const char *name);
 long elf_find_func_offset_from_file(const char *binary_path, const char *name);
 
diff --git a/tools/lib/bpf/usdt.c b/tools/lib/bpf/usdt.c
index f1a141555f08..9fa883ebc0bd 100644
--- a/tools/lib/bpf/usdt.c
+++ b/tools/lib/bpf/usdt.c
@@ -19,6 +19,7 @@
 #include "libbpf.h"
 #include "libbpf_common.h"
 #include "libbpf_internal.h"
+#include "libbpf_elf.h"
 #include "hashmap.h"
 
 /* libbpf's USDT support consists of BPF-side state/code and user-space
@@ -943,32 +944,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;
 
@@ -981,7 +972,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;
@@ -1066,9 +1057,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:
@@ -1076,9 +1065,7 @@ struct bpf_link *usdt_manager_attach_usdt(struct usdt_manager *man, const struct
 		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);
 }
 
-- 
2.41.0


  parent reply	other threads:[~2023-06-30  8:35 UTC|newest]

Thread overview: 73+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-06-30  8:33 [PATCHv3 bpf-next 00/26] bpf: Add multi uprobe link Jiri Olsa
2023-06-30  8:33 ` [PATCHv3 bpf-next 01/26] bpf: Add attach_type checks under bpf_prog_attach_check_attach_type Jiri Olsa
2023-07-06 22:34   ` Andrii Nakryiko
2023-06-30  8:33 ` [PATCHv3 bpf-next 02/26] bpf: Add multi uprobe link Jiri Olsa
2023-07-06 22:34   ` Andrii Nakryiko
2023-07-11  9:00     ` Jiri Olsa
2023-07-07  4:22   ` Andrii Nakryiko
2023-07-11  9:01     ` Jiri Olsa
2023-06-30  8:33 ` [PATCHv3 bpf-next 03/26] bpf: Add cookies support for uprobe_multi link Jiri Olsa
2023-07-01  3:40   ` Yafang Shao
2023-07-01  8:54     ` Jiri Olsa
2023-06-30  8:33 ` [PATCHv3 bpf-next 04/26] bpf: Add pid filter " Jiri Olsa
2023-06-30  8:33 ` [PATCHv3 bpf-next 05/26] bpf: Add bpf_get_func_ip helper support for uprobe link Jiri Olsa
2023-07-06 22:29   ` Andrii Nakryiko
2023-07-10  7:24     ` Jiri Olsa
2023-07-10 17:55       ` Andrii Nakryiko
2023-07-11  8:28         ` Jiri Olsa
2023-07-11 16:57           ` Andrii Nakryiko
2023-06-30  8:33 ` [PATCHv3 bpf-next 06/26] libbpf: Add uprobe_multi attach type and link names Jiri Olsa
2023-06-30  8:33 ` [PATCHv3 bpf-next 07/26] libbpf: Move elf_find_func_offset* functions to elf object Jiri Olsa
2023-07-06 23:02   ` Andrii Nakryiko
2023-07-11  9:05     ` Jiri Olsa
2023-07-11 17:01       ` Andrii Nakryiko
2023-07-06 23:03   ` Andrii Nakryiko
2023-07-11  9:05     ` Jiri Olsa
2023-06-30  8:33 ` Jiri Olsa [this message]
2023-07-06 23:09   ` [PATCHv3 bpf-next 08/26] libbpf: Add elf_open/elf_close functions Andrii Nakryiko
2023-07-11  9:01     ` Jiri Olsa
2023-06-30  8:33 ` [PATCHv3 bpf-next 09/26] libbpf: Add elf symbol iterator Jiri Olsa
2023-07-06 23:24   ` Andrii Nakryiko
2023-07-11  9:03     ` Jiri Olsa
2023-07-11 16:59       ` Andrii Nakryiko
2023-06-30  8:33 ` [PATCHv3 bpf-next 10/26] libbpf: Add elf_resolve_syms_offsets function Jiri Olsa
2023-07-07  3:48   ` Andrii Nakryiko
2023-07-11  9:04     ` Jiri Olsa
2023-06-30  8:33 ` [PATCHv3 bpf-next 11/26] libbpf: Add elf_resolve_pattern_offsets function Jiri Olsa
2023-07-07  3:52   ` Andrii Nakryiko
2023-07-11  9:04     ` Jiri Olsa
2023-06-30  8:33 ` [PATCHv3 bpf-next 12/26] libbpf: Add bpf_link_create support for multi uprobes Jiri Olsa
2023-06-30  8:33 ` [PATCHv3 bpf-next 13/26] libbpf: Add bpf_program__attach_uprobe_multi function Jiri Olsa
2023-07-07  4:05   ` Andrii Nakryiko
2023-07-11  9:05     ` Jiri Olsa
2023-07-11 17:02       ` Andrii Nakryiko
2023-06-30  8:33 ` [PATCHv3 bpf-next 14/26] libbpf: Add support for u[ret]probe.multi[.s] program sections Jiri Olsa
2023-07-07  4:07   ` Andrii Nakryiko
2023-06-30  8:33 ` [PATCHv3 bpf-next 15/26] libbpf: Add uprobe multi link detection Jiri Olsa
2023-07-07  4:20   ` Andrii Nakryiko
2023-07-11  9:03     ` Jiri Olsa
2023-06-30  8:33 ` [PATCHv3 bpf-next 16/26] libbpf: Add uprobe multi link support to bpf_program__attach_usdt Jiri Olsa
2023-07-07  4:29   ` Andrii Nakryiko
2023-07-11  9:04     ` Jiri Olsa
2023-06-30  8:33 ` [PATCHv3 bpf-next 17/26] selftests/bpf: Add uprobe_multi skel test Jiri Olsa
2023-06-30  8:33 ` [PATCHv3 bpf-next 18/26] selftests/bpf: Add uprobe_multi api test Jiri Olsa
2023-07-07  4:32   ` Andrii Nakryiko
2023-07-11  9:06     ` Jiri Olsa
2023-06-30  8:33 ` [PATCHv3 bpf-next 19/26] selftests/bpf: Add uprobe_multi link test Jiri Olsa
2023-07-07  4:33   ` Andrii Nakryiko
2023-07-11  9:06     ` Jiri Olsa
2023-06-30  8:33 ` [PATCHv3 bpf-next 20/26] selftests/bpf: Add uprobe_multi test program Jiri Olsa
2023-07-07  4:35   ` Andrii Nakryiko
2023-06-30  8:33 ` [PATCHv3 bpf-next 21/26] selftests/bpf: Add uprobe_multi bench test Jiri Olsa
2023-07-07  4:38   ` Andrii Nakryiko
2023-07-11  9:07     ` Jiri Olsa
2023-06-30  8:33 ` [PATCHv3 bpf-next 22/26] selftests/bpf: Add usdt_multi test program Jiri Olsa
2023-07-07  4:39   ` Andrii Nakryiko
2023-06-30  8:33 ` [PATCHv3 bpf-next 23/26] selftests/bpf: Add usdt_multi bench test Jiri Olsa
2023-07-07  4:42   ` Andrii Nakryiko
2023-07-11  9:07     ` Jiri Olsa
2023-06-30  8:33 ` [PATCHv3 bpf-next 24/26] selftests/bpf: Add uprobe_multi cookie test Jiri Olsa
2023-06-30  8:33 ` [PATCHv3 bpf-next 25/26] selftests/bpf: Add uprobe_multi pid filter tests Jiri Olsa
2023-06-30  8:33 ` [PATCHv3 bpf-next 26/26] selftests/bpf: Add extra link to uprobe_multi tests Jiri Olsa
2023-07-05 12:45 ` [PATCHv3 bpf-next 00/26] bpf: Add multi uprobe link Daniel Borkmann
2023-07-05 19:10   ` Jiri Olsa

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20230630083344.984305-9-jolsa@kernel.org \
    --to=jolsa@kernel.org \
    --cc=andrii@kernel.org \
    --cc=ast@kernel.org \
    --cc=bpf@vger.kernel.org \
    --cc=daniel@iogearbox.net \
    --cc=haoluo@google.com \
    --cc=john.fastabend@gmail.com \
    --cc=kafai@fb.com \
    --cc=kpsingh@chromium.org \
    --cc=sdf@google.com \
    --cc=songliubraving@fb.com \
    --cc=yhs@fb.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox