New function

2006-08-20  Soren Sandmann <sandmann@daimi.au.dk>

	* elfparser.c (elf_parser_new_from_file): New function
This commit is contained in:
Soren Sandmann
2006-08-21 01:30:54 +00:00
committed by Søren Sandmann Pedersen
parent 1b72901c4d
commit 7d8f3c232d
4 changed files with 46 additions and 6 deletions

View File

@ -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

View 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);
}

View 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.

View File

@ -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 */