svn path=/trunk/; revision=355

svn path=/trunk/; revision=355
This commit is contained in:
Søren Sandmann Pedersen
2007-02-25 04:15:51 +00:00
parent cf70d3a7ed
commit 6fa782dcd6
3 changed files with 33 additions and 18 deletions

3
TODO
View File

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

View File

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

View File

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