diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 986a701c2fa..9540c4f1208 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,10 @@ +2019-09-12 Andrew Burgess + + * psymtab.c (find_pc_sect_psymtab): Move baseaddr local into more + inner scope, add check that the objfile has psymtabs before + checking psymtabs_addrmap. + * psymtab.h (psymtab_storage) : Extend comment. + 2019-09-12 Philippe Waroquiers * NEWS: Announce that Ada task names are now shown at more places, diff --git a/gdb/psymtab.c b/gdb/psymtab.c index e9cc8c3bc6d..031dbd9c1ef 100644 --- a/gdb/psymtab.c +++ b/gdb/psymtab.c @@ -301,14 +301,24 @@ find_pc_sect_psymtab (struct objfile *objfile, CORE_ADDR pc, struct obj_section *section, struct bound_minimal_symbol msymbol) { - CORE_ADDR baseaddr = ANOFFSET (objfile->section_offsets, - SECT_OFF_TEXT (objfile)); + /* Try just the PSYMTABS_ADDRMAP mapping first as it has better + granularity than the later used TEXTLOW/TEXTHIGH one. However, we need + to take care as the PSYMTABS_ADDRMAP can hold things other than partial + symtabs in some cases. - /* Try just the PSYMTABS_ADDRMAP mapping first as it has better granularity - than the later used TEXTLOW/TEXTHIGH one. */ + This function should only be called for objfiles that are using partial + symtabs, not for objfiles that are using indexes (.gdb_index or + .debug_names), however 'maintenance print psymbols' calls this function + directly for all objfiles. If we assume that PSYMTABS_ADDRMAP contains + partial symtabs then we will end up returning a pointer to an object + that is not a partial_symtab, which doesn't end well. */ - if (objfile->partial_symtabs->psymtabs_addrmap != NULL) + if (objfile->partial_symtabs->psymtabs != NULL + && objfile->partial_symtabs->psymtabs_addrmap != NULL) { + CORE_ADDR baseaddr = ANOFFSET (objfile->section_offsets, + SECT_OFF_TEXT (objfile)); + struct partial_symtab *pst = ((struct partial_symtab *) addrmap_find (objfile->partial_symtabs->psymtabs_addrmap, diff --git a/gdb/psymtab.h b/gdb/psymtab.h index aed686258d4..0ad2b49d9a5 100644 --- a/gdb/psymtab.h +++ b/gdb/psymtab.h @@ -109,7 +109,11 @@ public: /* Map addresses to the entries of PSYMTABS. It would be more efficient to have a map per the whole process but ADDRMAP cannot selectively remove its items during FREE_OBJFILE. This mapping is already present even for - PARTIAL_SYMTABs which still have no corresponding full SYMTABs read. */ + PARTIAL_SYMTABs which still have no corresponding full SYMTABs read. + + The DWARF parser reuses this addrmap to store things other than + psymtabs in the cases where debug information is being read from, for + example, the .debug-names section. */ struct addrmap *psymtabs_addrmap = nullptr;