Rename elf_sym_get_* to elf_parser_get_sym_* and make these functions take

2006-08-21  Soren Sandmann <sandmann@redhat.com>

	* 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
This commit is contained in:
Soren Sandmann
2006-08-22 04:19:08 +00:00
committed by Søren Sandmann Pedersen
parent bb616fd754
commit 4a145a21bc
6 changed files with 40 additions and 49 deletions

View File

@ -1,3 +1,18 @@
2006-08-21 Soren Sandmann <sandmann@redhat.com>
* 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 <sandmann@redhat.com> 2006-08-21 Soren Sandmann <sandmann@redhat.com>
* binfile.c (struct BinFile): Add ref_count and filename * binfile.c (struct BinFile): Add ref_count and filename

3
TODO
View File

@ -32,6 +32,9 @@ Before 1.0.4:
Before 1.2: 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() * Delete elf_parser_new() and rename elf_parser_new_from_file()
* See if we can make "In file <blah>" not be treated as a recursive function. * See if we can make "In file <blah>" not be treated as a recursive function.

View File

@ -63,7 +63,7 @@ static ElfParser *
separate_debug_file_exists (const char *name, guint32 crc) separate_debug_file_exists (const char *name, guint32 crc)
{ {
guint32 file_crc; guint32 file_crc;
ElfParser *parser = elf_parser_new_from_file (name, NULL); ElfParser *parser = elf_parser_new (name, NULL);
if (!parser) if (!parser)
return NULL; return NULL;
@ -153,7 +153,7 @@ bin_file_new (const char *filename)
else else
{ {
bf = g_new0 (BinFile, 1); 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->elf = find_separate_debug_file (bf->elf, filename);
bf->inode = read_inode (filename); bf->inode = read_inode (filename);
bf->filename = g_strdup (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) if (file->undefined_name == (char *)symbol)
return file->undefined_name; return file->undefined_name;
else else
return elf_sym_get_name ((const ElfSym *)symbol); return elf_parser_get_sym_name (file->elf, (const ElfSym *)symbol);
} }

View File

@ -111,10 +111,8 @@ find_section (ElfParser *parser,
return NULL; return NULL;
} }
static GList *all_elf_parsers = NULL; static ElfParser *
parser_new_from_data (const guchar *data, gsize length)
ElfParser *
elf_parser_new (const guchar *data, gsize length)
{ {
ElfParser *parser; ElfParser *parser;
gboolean is_64, is_big_endian; gboolean is_64, is_big_endian;
@ -161,14 +159,12 @@ elf_parser_new (const guchar *data, gsize length)
bin_parser_end (parser->parser); bin_parser_end (parser->parser);
all_elf_parsers = g_list_prepend (all_elf_parsers, parser);
return parser; return parser;
} }
ElfParser * ElfParser *
elf_parser_new_from_file (const char *filename, elf_parser_new (const char *filename,
GError **err) GError **err)
{ {
const guchar *data; const guchar *data;
gsize length; gsize length;
@ -182,7 +178,7 @@ elf_parser_new_from_file (const char *filename,
data = (guchar *)g_mapped_file_get_contents (file); data = (guchar *)g_mapped_file_get_contents (file);
length = g_mapped_file_get_length (file); length = g_mapped_file_get_length (file);
parser = elf_parser_new (data, length); parser = parser_new_from_data (data, length);
parser->file = file; parser->file = file;
@ -258,8 +254,6 @@ elf_parser_free (ElfParser *parser)
{ {
int i; int i;
all_elf_parsers = g_list_remove (all_elf_parsers, parser);
for (i = 0; i < parser->n_sections; ++i) for (i = 0; i < parser->n_sections; ++i)
section_free (parser->sections[i]); section_free (parser->sections[i]);
g_free (parser->sections); g_free (parser->sections);
@ -495,28 +489,6 @@ elf_parser_lookup_symbol (ElfParser *parser,
return result; 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 * const char *
elf_parser_get_debug_link (ElfParser *parser, guint32 *crc32) elf_parser_get_debug_link (ElfParser *parser, guint32 *crc32)
{ {
@ -580,9 +552,9 @@ get_debug_link_info (bfd *abfd, unsigned long *crc32_out)
#endif #endif
const char * 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; const char *result;
g_return_val_if_fail (parser != NULL, NULL); g_return_val_if_fail (parser != NULL, NULL);
@ -597,7 +569,8 @@ elf_sym_get_name (const ElfSym *sym)
} }
gulong gulong
elf_sym_get_address (const ElfSym *sym) elf_parser_get_sym_address (ElfParser *parser,
const ElfSym *sym)
{ {
return sym->address; return sym->address;
} }

View File

@ -3,10 +3,8 @@
typedef struct ElfSym ElfSym; typedef struct ElfSym ElfSym;
typedef struct ElfParser ElfParser; typedef struct ElfParser ElfParser;
ElfParser *elf_parser_new (const guchar *data, ElfParser *elf_parser_new (const char *filename,
gsize length); GError **err);
ElfParser *elf_parser_new_from_file (const char *filename,
GError **err);
void elf_parser_free (ElfParser *parser); void elf_parser_free (ElfParser *parser);
const char *elf_parser_get_debug_link (ElfParser *parser, guint32 *crc32); 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, const ElfSym *elf_parser_lookup_symbol (ElfParser *parser,
gulong address); gulong address);
guint32 elf_parser_get_crc32 (ElfParser *parser); guint32 elf_parser_get_crc32 (ElfParser *parser);
const char *elf_sym_get_name (const ElfSym *sym); const char *elf_parser_get_sym_name (ElfParser *parser,
gulong elf_sym_get_address (const ElfSym *sym); const ElfSym *sym);
gulong elf_parser_get_sym_address (ElfParser *parser,
const ElfSym *sym);
char *elf_demangle (const char *name); char *elf_demangle (const char *name);

View File

@ -14,15 +14,15 @@ check (ElfParser *elf, gulong addr)
return; return;
} }
n = elf_sym_get_name (sym); n = elf_parser_get_sym_name (elf, sym);
g_print ("%p => ", (void *)addr); g_print ("%p => ", (void *)addr);
if (sym) if (sym)
{ {
g_print ("found: %s (%p)\n", g_print ("found: %s (%p)\n",
elf_sym_get_name (sym), elf_parser_get_sym_name (elf, sym),
(void *)elf_sym_get_address (sym)); (void *)elf_parser_get_sym_address (elf, sym));
} }
else else
{ {
@ -36,7 +36,7 @@ main ()
ElfParser *elf; ElfParser *elf;
int i; 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) if (!elf)
{ {