From 4a145a21bcce46e30f14e77f4b74812df1e5c13d Mon Sep 17 00:00:00 2001 From: Soren Sandmann Date: Tue, 22 Aug 2006 04:19:08 +0000 Subject: [PATCH] Rename elf_sym_get_* to elf_parser_get_sym_* and make these functions take 2006-08-21 Soren Sandmann * elfparser.[ch] (elf_parser_get_sym_name): Rename elf_sym_get_* to elf_parser_get_sym_* and make these functions take a parser. (parser_from_sym): Delete this function. (elf_parser_new): Don't add to all_elf_parsers (elf_parser_free): Don't remove from all_elf_parsers (elf_parser_new): Rename to parser_new_from_file() (elf_parser_new_from_file): Rename to elf_parser_new * binfile.c: Update for new elfparser API * TODO: updates --- ChangeLog | 15 +++++++++++++++ TODO | 3 +++ binfile.c | 6 +++--- elfparser.c | 45 +++++++++------------------------------------ elfparser.h | 12 ++++++------ testelf.c | 8 ++++---- 6 files changed, 40 insertions(+), 49 deletions(-) diff --git a/ChangeLog b/ChangeLog index c8492a4b..73f8ace8 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,18 @@ +2006-08-21 Soren Sandmann + + * elfparser.[ch] + (elf_parser_get_sym_name): Rename elf_sym_get_* to + elf_parser_get_sym_* and make these functions take a parser. + (parser_from_sym): Delete this function. + (elf_parser_new): Don't add to all_elf_parsers + (elf_parser_free): Don't remove from all_elf_parsers + (elf_parser_new): Rename to parser_new_from_file() + (elf_parser_new_from_file): Rename to elf_parser_new + + * binfile.c: Update for new elfparser API + + * TODO: updates + 2006-08-21 Soren Sandmann * binfile.c (struct BinFile): Add ref_count and filename diff --git a/TODO b/TODO index 93bb10c2..938f51da 100644 --- a/TODO +++ b/TODO @@ -32,6 +32,9 @@ Before 1.0.4: Before 1.2: +* "Expand all" is horrendously slow because update screenshot gets called + for every "expanded" signal. + * Delete elf_parser_new() and rename elf_parser_new_from_file() * See if we can make "In file " not be treated as a recursive function. diff --git a/binfile.c b/binfile.c index 692d3e45..494c9c97 100644 --- a/binfile.c +++ b/binfile.c @@ -63,7 +63,7 @@ static ElfParser * separate_debug_file_exists (const char *name, guint32 crc) { guint32 file_crc; - ElfParser *parser = elf_parser_new_from_file (name, NULL); + ElfParser *parser = elf_parser_new (name, NULL); if (!parser) return NULL; @@ -153,7 +153,7 @@ bin_file_new (const char *filename) else { bf = g_new0 (BinFile, 1); - bf->elf = elf_parser_new_from_file (filename, NULL); + bf->elf = elf_parser_new (filename, NULL); bf->elf = find_separate_debug_file (bf->elf, filename); bf->inode = read_inode (filename); bf->filename = g_strdup (filename); @@ -209,5 +209,5 @@ bin_symbol_get_name (BinFile *file, const BinSymbol *symbol) if (file->undefined_name == (char *)symbol) return file->undefined_name; else - return elf_sym_get_name ((const ElfSym *)symbol); + return elf_parser_get_sym_name (file->elf, (const ElfSym *)symbol); } diff --git a/elfparser.c b/elfparser.c index 5434065a..651b2644 100644 --- a/elfparser.c +++ b/elfparser.c @@ -111,10 +111,8 @@ find_section (ElfParser *parser, return NULL; } -static GList *all_elf_parsers = NULL; - -ElfParser * -elf_parser_new (const guchar *data, gsize length) +static ElfParser * +parser_new_from_data (const guchar *data, gsize length) { ElfParser *parser; gboolean is_64, is_big_endian; @@ -161,14 +159,12 @@ elf_parser_new (const guchar *data, gsize length) bin_parser_end (parser->parser); - all_elf_parsers = g_list_prepend (all_elf_parsers, parser); - return parser; } ElfParser * -elf_parser_new_from_file (const char *filename, - GError **err) +elf_parser_new (const char *filename, + GError **err) { const guchar *data; gsize length; @@ -182,7 +178,7 @@ elf_parser_new_from_file (const char *filename, data = (guchar *)g_mapped_file_get_contents (file); length = g_mapped_file_get_length (file); - parser = elf_parser_new (data, length); + parser = parser_new_from_data (data, length); parser->file = file; @@ -258,8 +254,6 @@ elf_parser_free (ElfParser *parser) { int i; - all_elf_parsers = g_list_remove (all_elf_parsers, parser); - for (i = 0; i < parser->n_sections; ++i) section_free (parser->sections[i]); g_free (parser->sections); @@ -495,28 +489,6 @@ elf_parser_lookup_symbol (ElfParser *parser, return result; } -static ElfParser * -parser_from_sym (const ElfSym *sym) -{ - GList *list; - - /* FIXME: This is gross, but the alternatives I can think of - * are all worse. - */ - for (list = all_elf_parsers; list != NULL; list = list->next) - { - ElfParser *parser = list->data; - - if (sym >= parser->symbols && - sym < parser->symbols + parser->n_symbols) - { - return parser; - } - } - - return NULL; -} - const char * elf_parser_get_debug_link (ElfParser *parser, guint32 *crc32) { @@ -580,9 +552,9 @@ get_debug_link_info (bfd *abfd, unsigned long *crc32_out) #endif const char * -elf_sym_get_name (const ElfSym *sym) +elf_parser_get_sym_name (ElfParser *parser, + const ElfSym *sym) { - ElfParser *parser = parser_from_sym (sym); const char *result; g_return_val_if_fail (parser != NULL, NULL); @@ -597,7 +569,8 @@ elf_sym_get_name (const ElfSym *sym) } gulong -elf_sym_get_address (const ElfSym *sym) +elf_parser_get_sym_address (ElfParser *parser, + const ElfSym *sym) { return sym->address; } diff --git a/elfparser.h b/elfparser.h index 64bfcb6c..f1f7e594 100644 --- a/elfparser.h +++ b/elfparser.h @@ -3,10 +3,8 @@ typedef struct ElfSym ElfSym; typedef struct ElfParser ElfParser; -ElfParser *elf_parser_new (const guchar *data, - gsize length); -ElfParser *elf_parser_new_from_file (const char *filename, - GError **err); +ElfParser *elf_parser_new (const char *filename, + GError **err); void elf_parser_free (ElfParser *parser); const char *elf_parser_get_debug_link (ElfParser *parser, guint32 *crc32); @@ -25,6 +23,8 @@ const char *elf_parser_get_debug_link (ElfParser *parser, guint32 *crc32); const ElfSym *elf_parser_lookup_symbol (ElfParser *parser, gulong address); guint32 elf_parser_get_crc32 (ElfParser *parser); -const char *elf_sym_get_name (const ElfSym *sym); -gulong elf_sym_get_address (const ElfSym *sym); +const char *elf_parser_get_sym_name (ElfParser *parser, + const ElfSym *sym); +gulong elf_parser_get_sym_address (ElfParser *parser, + const ElfSym *sym); char *elf_demangle (const char *name); diff --git a/testelf.c b/testelf.c index af668ccb..ed2c7a89 100644 --- a/testelf.c +++ b/testelf.c @@ -14,15 +14,15 @@ check (ElfParser *elf, gulong addr) return; } - n = elf_sym_get_name (sym); + n = elf_parser_get_sym_name (elf, sym); g_print ("%p => ", (void *)addr); if (sym) { g_print ("found: %s (%p)\n", - elf_sym_get_name (sym), - (void *)elf_sym_get_address (sym)); + elf_parser_get_sym_name (elf, sym), + (void *)elf_parser_get_sym_address (elf, sym)); } else { @@ -36,7 +36,7 @@ main () ElfParser *elf; int i; - elf = elf_parser_new_from_file ("/usr/lib/libgtk-x11-2.0.so", NULL); + elf = elf_parser_new ("/usr/lib/libgtk-x11-2.0.so", NULL); if (!elf) {