From 7d8f3c232dce5e24226512a3e8b176bc25f17ddb Mon Sep 17 00:00:00 2001 From: Soren Sandmann Date: Mon, 21 Aug 2006 01:30:54 +0000 Subject: [PATCH] New function 2006-08-20 Soren Sandmann * elfparser.c (elf_parser_new_from_file): New function --- ChangeLog | 4 ++++ elfparser.c | 28 ++++++++++++++++++++++++++++ elfparser.h | 2 ++ testelf.c | 18 ++++++++++++------ 4 files changed, 46 insertions(+), 6 deletions(-) diff --git a/ChangeLog b/ChangeLog index c294a6e..b47db70 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2006-08-20 Soren Sandmann + + * elfparser.c (elf_parser_new_from_file): New function + 2006-08-20 Soren Sandmann * elfparser.c (elf_parser_get_debug_link): New function diff --git a/elfparser.c b/elfparser.c index a69d4c6..88e238e 100644 --- a/elfparser.c +++ b/elfparser.c @@ -36,6 +36,8 @@ struct ElfParser int n_symbols; ElfSym * symbols; gsize sym_strings; + + GMappedFile * file; }; static gboolean parse_elf_signature (const guchar *data, gsize length, @@ -164,6 +166,29 @@ elf_parser_new (const guchar *data, gsize length) return parser; } +ElfParser * +elf_parser_new_from_file (const char *filename, + GError **err) +{ + const guchar *data; + gsize length; + ElfParser *parser; + + GMappedFile *file = g_mapped_file_new (filename, FALSE, NULL); + + if (!file) + return NULL; + + data = (guchar *)g_mapped_file_get_contents (file); + length = g_mapped_file_get_length (file); + + parser = elf_parser_new (data, length); + + parser->file = file; + + return parser; +} + guint32 elf_parser_get_crc32 (ElfParser *parser) { @@ -238,6 +263,9 @@ elf_parser_free (ElfParser *parser) for (i = 0; i < parser->n_sections; ++i) section_free (parser->sections[i]); g_free (parser->sections); + + if (parser->file) + g_mapped_file_free (parser->file); g_free (parser); } diff --git a/elfparser.h b/elfparser.h index daaca11..e5fa47d 100644 --- a/elfparser.h +++ b/elfparser.h @@ -5,6 +5,8 @@ typedef struct ElfParser ElfParser; ElfParser *elf_parser_new (const guchar *data, gsize length); +ElfParser *elf_parser_new_from_file (const char *filename, + GError **err); void elf_parser_free (ElfParser *parser); /* Lookup a symbol in the file. diff --git a/testelf.c b/testelf.c index 7c27db4..af668cc 100644 --- a/testelf.c +++ b/testelf.c @@ -33,16 +33,22 @@ check (ElfParser *elf, gulong addr) int main () { - GMappedFile *libgtk = g_mapped_file_new ("/usr/lib/libgtk-x11-2.0.so", - FALSE, NULL); - ElfParser *elf = elf_parser_new ( - g_mapped_file_get_contents (libgtk), - g_mapped_file_get_length (libgtk)); - + ElfParser *elf; int i; + elf = elf_parser_new_from_file ("/usr/lib/libgtk-x11-2.0.so", NULL); + + if (!elf) + { + g_print ("NO ELF!!!!\n"); + return -1; + } + + elf_parser_get_crc32 (elf); + for (i = 0; i < 5000000; ++i) { + elf_parser_get_crc32 (elf); check (elf, 0x077c80f0 - (0x07787000 - 0)); /* gtk_about_dialog_set_artists (add - (map - offset)) */ check (elf, 0x077c80f0 - (0x07787000 - 0)); /* same (but in the middle of the function */ -- 2.7.4