diff --git a/TODO b/TODO index 719b132a..ec95c760 100644 --- a/TODO +++ b/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 diff --git a/binparser.h b/binparser.h index d5761619..4b0a853f 100644 --- a/binparser.h +++ b/binparser.h @@ -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); diff --git a/elfparser.c b/elfparser.c index 332ea107..7e78013e 100644 --- a/elfparser.c +++ b/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;