mirror of
https://github.com/varun-r-mallya/sysprof.git
synced 2026-02-10 23:20:54 +00:00
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:
committed by
Søren Sandmann Pedersen
parent
bb616fd754
commit
4a145a21bc
15
ChangeLog
15
ChangeLog
@ -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
3
TODO
@ -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.
|
||||||
|
|||||||
@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
45
elfparser.c
45
elfparser.c
@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
12
elfparser.h
12
elfparser.h
@ -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);
|
||||||
|
|||||||
@ -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)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user