public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Jiri Olsa <jolsa@kernel.org>
To: Arnaldo Carvalho de Melo <acme@kernel.org>
Cc: Alexei Starovoitov <ast@kernel.org>,
	Song Liu <songliubraving@fb.com>,
	lkml <linux-kernel@vger.kernel.org>,
	Peter Zijlstra <a.p.zijlstra@chello.nl>,
	Ingo Molnar <mingo@kernel.org>,
	Mark Rutland <mark.rutland@arm.com>,
	Namhyung Kim <namhyung@kernel.org>,
	Alexander Shishkin <alexander.shishkin@linux.intel.com>,
	Michael Petlan <mpetlan@redhat.com>,
	Ian Rogers <irogers@google.com>,
	Stephane Eranian <eranian@google.com>,
	Alexey Budankov <alexey.budankov@linux.intel.com>,
	Andi Kleen <ak@linux.intel.com>,
	Adrian Hunter <adrian.hunter@intel.com>
Subject: [PATCH 02/24] bpf: Add build_id_parse_size function
Date: Mon,  9 Nov 2020 22:53:53 +0100	[thread overview]
Message-ID: <20201109215415.400153-3-jolsa@kernel.org> (raw)
In-Reply-To: <20201109215415.400153-1-jolsa@kernel.org>

It's possible to have other build id types (other than default
SHA1). Currently there's also ld support for MD5 build id.

Adding build_id_parse_size function, that returns also size of
the parsed build id, so we can recognize the build id type.

Cc: Alexei Starovoitov <ast@kernel.org>
Cc: Song Liu <songliubraving@fb.com>
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 include/linux/buildid.h |  2 ++
 lib/buildid.c           | 31 ++++++++++++++++++++++++-------
 2 files changed, 26 insertions(+), 7 deletions(-)

diff --git a/include/linux/buildid.h b/include/linux/buildid.h
index 3be5b49719f1..edba89834b4c 100644
--- a/include/linux/buildid.h
+++ b/include/linux/buildid.h
@@ -7,5 +7,7 @@
 #define BUILD_ID_SIZE 20
 
 int build_id_parse(struct vm_area_struct *vma, unsigned char *build_id);
+int build_id_parse_size(struct vm_area_struct *vma, unsigned char *build_id,
+			__u32 *size);
 
 #endif
diff --git a/lib/buildid.c b/lib/buildid.c
index e8d5feb7ef20..c52f86110635 100644
--- a/lib/buildid.c
+++ b/lib/buildid.c
@@ -12,6 +12,7 @@
  */
 static inline int parse_build_id(void *page_addr,
 				 unsigned char *build_id,
+				 __u32 *size,
 				 void *note_start,
 				 Elf32_Word note_size)
 {
@@ -38,6 +39,8 @@ static inline int parse_build_id(void *page_addr,
 			       nhdr->n_descsz);
 			memset(build_id + nhdr->n_descsz, 0,
 			       BUILD_ID_SIZE - nhdr->n_descsz);
+			if (size)
+				*size = nhdr->n_descsz;
 			return 0;
 		}
 		new_offs = note_offs + sizeof(Elf32_Nhdr) +
@@ -50,7 +53,8 @@ static inline int parse_build_id(void *page_addr,
 }
 
 /* Parse build ID from 32-bit ELF */
-static int get_build_id_32(void *page_addr, unsigned char *build_id)
+static int get_build_id_32(void *page_addr, unsigned char *build_id,
+			   __u32 *size)
 {
 	Elf32_Ehdr *ehdr = (Elf32_Ehdr *)page_addr;
 	Elf32_Phdr *phdr;
@@ -65,7 +69,7 @@ static int get_build_id_32(void *page_addr, unsigned char *build_id)
 
 	for (i = 0; i < ehdr->e_phnum; ++i) {
 		if (phdr[i].p_type == PT_NOTE &&
-		    !parse_build_id(page_addr, build_id,
+		    !parse_build_id(page_addr, build_id, size,
 				    page_addr + phdr[i].p_offset,
 				    phdr[i].p_filesz))
 			return 0;
@@ -74,7 +78,8 @@ static int get_build_id_32(void *page_addr, unsigned char *build_id)
 }
 
 /* Parse build ID from 64-bit ELF */
-static int get_build_id_64(void *page_addr, unsigned char *build_id)
+static int get_build_id_64(void *page_addr, unsigned char *build_id,
+			   __u32 *size)
 {
 	Elf64_Ehdr *ehdr = (Elf64_Ehdr *)page_addr;
 	Elf64_Phdr *phdr;
@@ -89,7 +94,7 @@ static int get_build_id_64(void *page_addr, unsigned char *build_id)
 
 	for (i = 0; i < ehdr->e_phnum; ++i) {
 		if (phdr[i].p_type == PT_NOTE &&
-		    !parse_build_id(page_addr, build_id,
+		    !parse_build_id(page_addr, build_id, size,
 				    page_addr + phdr[i].p_offset,
 				    phdr[i].p_filesz))
 			return 0;
@@ -98,7 +103,8 @@ static int get_build_id_64(void *page_addr, unsigned char *build_id)
 }
 
 /* Parse build ID of ELF file mapped to vma */
-int build_id_parse(struct vm_area_struct *vma, unsigned char *build_id)
+static int __build_id_parse(struct vm_area_struct *vma, unsigned char *build_id,
+			    __u32 *size)
 {
 	Elf32_Ehdr *ehdr;
 	struct page *page;
@@ -126,11 +132,22 @@ int build_id_parse(struct vm_area_struct *vma, unsigned char *build_id)
 		goto out;
 
 	if (ehdr->e_ident[EI_CLASS] == ELFCLASS32)
-		ret = get_build_id_32(page_addr, build_id);
+		ret = get_build_id_32(page_addr, build_id, size);
 	else if (ehdr->e_ident[EI_CLASS] == ELFCLASS64)
-		ret = get_build_id_64(page_addr, build_id);
+		ret = get_build_id_64(page_addr, build_id, size);
 out:
 	kunmap_atomic(page_addr);
 	put_page(page);
 	return ret;
 }
+
+int build_id_parse(struct vm_area_struct *vma, unsigned char *build_id)
+{
+	return __build_id_parse(vma, build_id, NULL);
+}
+
+int build_id_parse_size(struct vm_area_struct *vma, unsigned char *build_id,
+			__u32 *size)
+{
+	return __build_id_parse(vma, build_id, size);
+}
-- 
2.26.2


  parent reply	other threads:[~2020-11-09 21:54 UTC|newest]

Thread overview: 50+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-11-09 21:53 [PATCH 00/24] perf: Add mmap2 build id support Jiri Olsa
2020-11-09 21:53 ` [PATCH 01/24] bpf: Move stack_map_get_build_id into lib Jiri Olsa
2020-11-09 21:53 ` Jiri Olsa [this message]
2020-11-10  0:15   ` [PATCH 02/24] bpf: Add build_id_parse_size function Alexei Starovoitov
2020-11-10 10:01     ` Jiri Olsa
2020-11-09 21:53 ` [PATCH 03/24] perf: Add build id data in mmap2 event Jiri Olsa
2020-11-10  8:07   ` Peter Zijlstra
2020-11-10 10:08     ` Jiri Olsa
2020-11-10 11:54     ` Arnaldo Carvalho de Melo
2020-11-10 12:22       ` Peter Zijlstra
2020-11-10 15:25         ` Arnaldo Carvalho de Melo
2020-11-10  8:28   ` Peter Zijlstra
2020-11-10 10:10     ` Jiri Olsa
2020-11-10 18:23       ` Jiri Olsa
2020-11-10 18:55         ` Arnaldo Carvalho de Melo
2020-11-11 15:54           ` Jiri Olsa
2020-11-13  4:29   ` Namhyung Kim
2020-11-13 11:01     ` Jiri Olsa
2020-11-09 21:53 ` [PATCH 04/24] tools headers uapi: Sync tools/include/uapi/linux/perf_event.h Jiri Olsa
2020-11-09 21:53 ` [PATCH 05/24] perf tools: Do not swap mmap2 fields in case it contains build id Jiri Olsa
2020-11-09 21:53 ` [PATCH 06/24] perf tools: Add build_id__is_defined function Jiri Olsa
2020-11-09 21:53 ` [PATCH 07/24] perf tools: Add filename__decompress function Jiri Olsa
2020-11-09 21:53 ` [PATCH 08/24] perf tools: Add support to read build id from compressed elf Jiri Olsa
2020-11-09 21:54 ` [PATCH 09/24] perf tools: Add check for existing link in buildid dir Jiri Olsa
2020-11-09 21:54 ` [PATCH 10/24] perf tools: Use struct extra_kernel_map in machine__process_kernel_mmap_event Jiri Olsa
2020-11-09 21:54 ` [PATCH 11/24] perf tools: Try to load vmlinux from buildid database Jiri Olsa
2020-11-09 21:54 ` [PATCH 12/24] perf tools: Store build id from mmap2 events Jiri Olsa
2020-11-09 21:54 ` [PATCH 13/24] perf tools: Allow mmap2 event to synthesize kernel image Jiri Olsa
2020-11-09 21:54 ` [PATCH 14/24] perf tools: Allow mmap2 event to synthesize modules Jiri Olsa
2020-11-09 21:54 ` [PATCH 15/24] perf tools: Synthesize build id for kernel/modules/tasks Jiri Olsa
2020-11-13  4:32   ` Namhyung Kim
2020-11-13 11:10     ` Jiri Olsa
2020-11-09 21:54 ` [PATCH 16/24] perf tools: Add support to display build id for mmap2 events Jiri Olsa
2020-11-09 21:54 ` [PATCH 17/24] perf tools: Use machine__for_each_dso in perf_session__cache_build_ids Jiri Olsa
2020-11-09 21:54 ` [PATCH 18/24] perf tools: Add __perf_session__cache_build_ids function Jiri Olsa
2020-11-09 21:54 ` [PATCH 19/24] perf tools: Add is_perf_data function Jiri Olsa
2020-11-09 21:54 ` [PATCH 20/24] perf tools: Add build_id_cache__add function Jiri Olsa
2020-11-09 21:54 ` [PATCH 21/24] perf buildid-cache: Add support to add build ids from perf data Jiri Olsa
2020-11-09 21:54 ` [PATCH 22/24] perf buildid-cache: Add --debuginfod option Jiri Olsa
     [not found]   ` <CAP-5=fUDtTU2XYr6w6wYndP6RVFDLoJSnC31m+djA-r9EVMQiw@mail.gmail.com>
2020-11-23 22:26     ` Jiri Olsa
2020-11-09 21:54 ` [PATCH 23/24] perf buildid-list: Add support for mmap2's buildid events Jiri Olsa
2020-11-09 21:54 ` [PATCH 24/24] perf record: Add --buildid-mmap option to enable mmap's build id Jiri Olsa
2020-11-11 17:00   ` Andi Kleen
2020-11-12 11:57     ` Jiri Olsa
2020-11-12 20:39       ` Arnaldo Carvalho de Melo
2020-11-12 21:25         ` Jiri Olsa
2020-11-13  4:40   ` Namhyung Kim
2020-11-13 11:09     ` Jiri Olsa
2020-11-14  0:31       ` Namhyung Kim
2020-11-14 20:44         ` 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=20201109215415.400153-3-jolsa@kernel.org \
    --to=jolsa@kernel.org \
    --cc=a.p.zijlstra@chello.nl \
    --cc=acme@kernel.org \
    --cc=adrian.hunter@intel.com \
    --cc=ak@linux.intel.com \
    --cc=alexander.shishkin@linux.intel.com \
    --cc=alexey.budankov@linux.intel.com \
    --cc=ast@kernel.org \
    --cc=eranian@google.com \
    --cc=irogers@google.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mark.rutland@arm.com \
    --cc=mingo@kernel.org \
    --cc=mpetlan@redhat.com \
    --cc=namhyung@kernel.org \
    --cc=songliubraving@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