diff options
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | elfparser.c | 25 |
2 files changed, 27 insertions, 4 deletions
@@ -1,5 +1,11 @@ 2006-08-20 Soren Sandmann <sandmann@daimi.au.dk> + * elfparser.c (elf_parser_get_load_address): Comment out debug spew. + (elf_parser_lookup_symbol): Add check that address is actually + within the bounds of the found function. + +2006-08-20 Soren Sandmann <sandmann@daimi.au.dk> + * process.h: Make process_lookup_symbol() return a string. Delete process_lookup_symbol_with_filename(). diff --git a/elfparser.c b/elfparser.c index 88e238e..7153be3 100644 --- a/elfparser.c +++ b/elfparser.c @@ -411,7 +411,9 @@ elf_parser_get_load_address (ElfParser *parser) } } +#if 0 g_print ("load address is: %8p\n", (void *)load_address); +#endif return load_address; } @@ -453,6 +455,9 @@ const ElfSym * elf_parser_lookup_symbol (ElfParser *parser, gulong address) { + const ElfSym *result; + gsize size; + if (!parser->symbols) read_symbols (parser); @@ -465,10 +470,22 @@ elf_parser_lookup_symbol (ElfParser *parser, g_print ("the address we are looking up is %p\n", address); #endif - /* FIXME: we should look at the symbol size and check if the - * address is actually within the function. - */ - return do_lookup (parser->symbols, address, 0, parser->n_symbols - 1); + result = do_lookup (parser->symbols, address, 0, parser->n_symbols - 1); + + if (result) + { + /* Check that address is actually within the function */ + bin_parser_begin (parser->parser, parser->sym_format, result->offset); + + size = bin_parser_get_uint (parser->parser, "st_size"); + + if (result->address + size > address) + result = NULL; + + bin_parser_end (parser->parser); + } + + return result; } static ElfParser * |