diff options
author | Nick Clifton <nickc@redhat.com> | 2015-03-05 12:14:26 +0000 |
---|---|---|
committer | Nick Clifton <nickc@redhat.com> | 2015-03-05 12:14:26 +0000 |
commit | 425bd9e1bb32b25881dd20d76678d041f7bf04f8 (patch) | |
tree | e503906efb4cab1957e3a053fda5d5b8c854bb13 /bfd/dwarf2.c | |
parent | f5771b1d96f844e0767a15b258b2de2d4cc52123 (diff) | |
download | gdb-425bd9e1bb32b25881dd20d76678d041f7bf04f8.zip gdb-425bd9e1bb32b25881dd20d76678d041f7bf04f8.tar.gz gdb-425bd9e1bb32b25881dd20d76678d041f7bf04f8.tar.bz2 |
Allows the binutils to cope with PE binaries where the section addresses have been changed, but the DWARF debug info has not been altered.
PR binutils/18025
* coffgen.c (coff_find_nearest_line_with_names): If the dwarf2
lookup fails, check for an address bias in the dwarf info, and if
one exists, retry the lookup with the biased value.
* dwarf2.c (_bfd_dwarf2_find_symbol_bias): New function.
Determines if a bias exists bewteen the addresses of functions
based on DWARF information vs symbol table information.
* libbfd-in.h (_bfd_dwarf2_find_symbol_bias): Prototype.
* libbfd.h: Regenerate.
Diffstat (limited to 'bfd/dwarf2.c')
-rw-r--r-- | bfd/dwarf2.c | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/bfd/dwarf2.c b/bfd/dwarf2.c index 0a5d1ce..cbd4cf6 100644 --- a/bfd/dwarf2.c +++ b/bfd/dwarf2.c @@ -3788,6 +3788,57 @@ _bfd_dwarf2_slurp_debug_info (bfd *abfd, bfd *debug_bfd, return TRUE; } +/* Scan the debug information in PINFO looking for a DW_TAG_subprogram + abbrev with a DW_AT_low_pc attached to it. Then lookup that same + symbol in SYMBOLS and return the difference between the low_pc and + the symbol's address. Returns 0 if no suitable symbol could be found. */ + +bfd_signed_vma +_bfd_dwarf2_find_symbol_bias (asymbol ** symbols, void ** pinfo) +{ + struct dwarf2_debug *stash; + struct comp_unit * unit; + + stash = (struct dwarf2_debug *) *pinfo; + + if (stash == NULL) + return 0; + + for (unit = stash->all_comp_units; unit; unit = unit->next_unit) + { + struct funcinfo * func; + + if (unit->function_table == NULL) + { + if (unit->line_table == NULL) + unit->line_table = decode_line_info (unit, stash); + if (unit->line_table != NULL) + scan_unit_for_symbols (unit); + } + + for (func = unit->function_table; func != NULL; func = func->prev_func) + if (func->name && func->arange.low) + { + asymbol ** psym; + + /* FIXME: Do we need to scan the aranges looking for the lowest pc value ? */ + + for (psym = symbols; * psym != NULL; psym++) + { + asymbol * sym = * psym; + + if (sym->flags & BSF_FUNCTION + && sym->section != NULL + && strcmp (sym->name, func->name) == 0) + return ((bfd_signed_vma) func->arange.low) - + ((bfd_signed_vma) (sym->value + sym->section->vma)); + } + } + } + + return 0; +} + /* Find the source code location of SYMBOL. If SYMBOL is NULL then find the nearest source code location corresponding to the address SECTION + OFFSET. |