mirror of
https://github.com/varun-r-mallya/sysprof.git
synced 2025-12-31 20:36:25 +00:00
svn path=/trunk/; revision=355
svn path=/trunk/; revision=355
This commit is contained in:
3
TODO
3
TODO
@ -106,7 +106,8 @@ Before 1.2:
|
||||
* Missing things in binparser.[ch]
|
||||
|
||||
- it's inconvenient that you have to pass in both a parser _and_
|
||||
a record. The record should just contain a pointer to the parser
|
||||
a record. The record should just contain a pointer to the parser.
|
||||
On the other hand, the result does depend on the parser->offset.
|
||||
|
||||
- the bin_parser_seek_record (..., 1); idiom is a little dubious
|
||||
|
||||
|
||||
@ -89,6 +89,9 @@ const gchar * bin_parser_get_error_msg (BinParser *parser);
|
||||
BinRecord * bin_parser_create_record (BinParser *parser,
|
||||
const BinField *fields);
|
||||
gsize bin_record_get_size (BinRecord *record);
|
||||
guint64 bin_parser_get_uint_field (BinParser *parser,
|
||||
BinRecord *record,
|
||||
const char *field);
|
||||
|
||||
/* Move current offset */
|
||||
gsize bin_parser_get_offset (BinParser *parser);
|
||||
@ -106,6 +109,3 @@ void bin_parser_restore (BinParser *parser);
|
||||
guint64 bin_parser_get_uint (BinParser *parser,
|
||||
int width);
|
||||
const char * bin_parser_get_string (BinParser *parser);
|
||||
guint64 bin_parser_get_uint_field (BinParser *parser,
|
||||
BinRecord *record,
|
||||
const char *field);
|
||||
|
||||
42
elfparser.c
42
elfparser.c
@ -103,9 +103,14 @@ section_new (BinParser *parser,
|
||||
section->allocated = !!(flags & SHF_ALLOC);
|
||||
|
||||
if (section->allocated)
|
||||
section->load_address = bin_parser_get_uint_field (parser, record, "sh_addr");
|
||||
{
|
||||
section->load_address = bin_parser_get_uint_field (
|
||||
parser, record, "sh_addr");
|
||||
}
|
||||
else
|
||||
{
|
||||
section->load_address = 0;
|
||||
}
|
||||
|
||||
section->type = bin_parser_get_uint_field (parser, record, "sh_type");
|
||||
|
||||
@ -169,28 +174,35 @@ elf_parser_new_from_data (const guchar *data,
|
||||
|
||||
bin_parser_set_offset (parser->parser, 0);
|
||||
|
||||
parser->n_sections = bin_parser_get_uint_field (parser->parser, parser->header, "e_shnum");
|
||||
section_names_idx = bin_parser_get_uint_field (parser->parser, parser->header, "e_shstrndx");
|
||||
section_headers = bin_parser_get_uint_field (parser->parser, parser->header, "e_shoff");
|
||||
parser->n_sections = bin_parser_get_uint_field (
|
||||
parser->parser, parser->header, "e_shnum");
|
||||
section_names_idx = bin_parser_get_uint_field (
|
||||
parser->parser, parser->header, "e_shstrndx");
|
||||
section_headers = bin_parser_get_uint_field (
|
||||
parser->parser, parser->header, "e_shoff");
|
||||
|
||||
/* Read section headers */
|
||||
parser->sections = g_new0 (Section *, parser->n_sections);
|
||||
|
||||
|
||||
bin_parser_set_offset (parser->parser, section_headers);
|
||||
|
||||
bin_parser_save (parser->parser);
|
||||
|
||||
bin_parser_seek_record (parser->parser, parser->shn_entry,
|
||||
section_names_idx);
|
||||
|
||||
section_names = bin_parser_get_uint_field (parser->parser, parser->shn_entry, "sh_offset");
|
||||
|
||||
section_names = bin_parser_get_uint_field (
|
||||
parser->parser, parser->shn_entry, "sh_offset");
|
||||
|
||||
bin_parser_restore (parser->parser);
|
||||
|
||||
for (i = 0; i < parser->n_sections; ++i)
|
||||
{
|
||||
bin_parser_set_offset (parser->parser, section_headers);
|
||||
bin_parser_seek_record (parser->parser, parser->shn_entry, i);
|
||||
|
||||
parser->sections[i] = section_new (parser->parser,
|
||||
parser->shn_entry,
|
||||
section_names);
|
||||
|
||||
bin_parser_seek_record (parser->parser, parser->shn_entry, 1);
|
||||
}
|
||||
|
||||
/* Cache the text section */
|
||||
@ -415,8 +427,10 @@ read_table (ElfParser *parser,
|
||||
gulong addr;
|
||||
gulong offset;
|
||||
|
||||
info = bin_parser_get_uint_field (parser->parser, parser->sym_format, "st_info");
|
||||
addr = bin_parser_get_uint_field (parser->parser, parser->sym_format, "st_value");
|
||||
info = bin_parser_get_uint_field (
|
||||
parser->parser, parser->sym_format, "st_info");
|
||||
addr = bin_parser_get_uint_field (
|
||||
parser->parser, parser->sym_format, "st_value");
|
||||
offset = bin_parser_get_offset (parser->parser);
|
||||
|
||||
if (addr != 0 &&
|
||||
@ -546,8 +560,8 @@ elf_parser_lookup_symbol (ElfParser *parser,
|
||||
|
||||
bin_parser_set_offset (parser->parser, result->offset);
|
||||
|
||||
size = bin_parser_get_uint_field (parser->parser,
|
||||
parser->sym_format, "st_size");
|
||||
size = bin_parser_get_uint_field (
|
||||
parser->parser, parser->sym_format, "st_size");
|
||||
|
||||
if (result->address + size <= address)
|
||||
result = NULL;
|
||||
|
||||
Reference in New Issue
Block a user