From 8e101624bc19971aa859155abfb616f2a8b169fa Mon Sep 17 00:00:00 2001 From: Christian Hergert Date: Fri, 19 May 2023 10:35:31 -0700 Subject: [PATCH] libsysprof: add mmap variant for elfparser --- src/libsysprof/elfparser.c | 31 +++++++++++++++++++++++++++++++ src/libsysprof/elfparser.h | 2 ++ 2 files changed, 33 insertions(+) diff --git a/src/libsysprof/elfparser.c b/src/libsysprof/elfparser.c index 8816a716..2c6b638b 100644 --- a/src/libsysprof/elfparser.c +++ b/src/libsysprof/elfparser.c @@ -297,6 +297,37 @@ open_mapped_file (const char *filename, return file; } +ElfParser * +elf_parser_new_from_mmap (GMappedFile *file, + GError **error) +{ + const guchar *data; + gsize length; + ElfParser *parser; + + if (file == NULL) + return NULL; + + data = (guchar *)g_mapped_file_get_contents (file); + length = g_mapped_file_get_length (file); + parser = elf_parser_new_from_data (data, length); + + if (!parser) + { + g_set_error (error, + G_FILE_ERROR, + G_FILE_ERROR_FAILED, + "Failed to load ELF from mmap region"); + g_mapped_file_unref (file); + return NULL; + } + + parser->filename = NULL; + parser->file = file; + + return parser; +} + ElfParser * elf_parser_new (const char *filename, GError **error) diff --git a/src/libsysprof/elfparser.h b/src/libsysprof/elfparser.h index 94fa5c02..fd19e78d 100644 --- a/src/libsysprof/elfparser.h +++ b/src/libsysprof/elfparser.h @@ -27,6 +27,8 @@ typedef struct ElfParser ElfParser; ElfParser *elf_parser_new_from_data (const guchar *data, gsize length); +ElfParser *elf_parser_new_from_mmap (GMappedFile *mapped_file, + GError **err); ElfParser *elf_parser_new (const char *filename, GError **err); void elf_parser_free (ElfParser *parser);