New function
authorSoren Sandmann <sandmann@daimi.au.dk>
Mon, 21 Aug 2006 01:30:54 +0000 (01:30 +0000)
committerSøren Sandmann Pedersen <ssp@src.gnome.org>
Mon, 21 Aug 2006 01:30:54 +0000 (01:30 +0000)
2006-08-20  Soren Sandmann <sandmann@daimi.au.dk>

* elfparser.c (elf_parser_new_from_file): New function

ChangeLog
elfparser.c
elfparser.h
testelf.c

index c294a6e..b47db70 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2006-08-20  Soren Sandmann <sandmann@daimi.au.dk>
+
+       * elfparser.c (elf_parser_new_from_file): New function
+
 2006-08-20   Soren Sandmann <sandmann@daimi.au.dk>
 
        * elfparser.c (elf_parser_get_debug_link): New function
index a69d4c6..88e238e 100644 (file)
@@ -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);
 }
index daaca11..e5fa47d 100644 (file)
@@ -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.
index 7c27db4..af668cc 100644 (file)
--- 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 */