This is the mail archive of the gdb-patches@sources.redhat.com mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

PING (4 months) Re: [RFA/tru64] Compute bfd_section for minimal symbols


Hello,

I am wondering who could review this patch. This is related to COFF,
and hence would fall in Philippe De Muyter's area of expertise,
but I don't remember seeing him being active anymore. Perhaps a global
maintainer could have a look?

On Wed, Nov 10, 2004 at 10:01:39AM -0800, Joel Brobecker wrote:
> Hello,
> 
> I noticed we had a lot of errors like this in the testsuite logs:
> 
>     (gdb) break main
>     warning: (Internal error: pc 0x12000134c in read in psymtab, but not in symtab.)
>     
>     Breakpoint 1 at 0x120001364: file ./gdb.base/advance.c, line 41.
> 
> The reason for this is the following check in in find_pc_sect_symtab():
> 
>                 fixup_symbol_section (sym, objfile);
>                 if (section == SYMBOL_BFD_SECTION (sym))
>                   break;
> 
> This check makes sure that the symbol section matches the section
> in which we expect to find the symbol. Unfortunately for us on Tru64,
> the symbol bfd_section is not set. So we fail the check, and end up
> discarding the correct symbol table.
> 
> Then when find_pc_sect_symtab() falls back to searching the partial
> symtabs, it founds the psymtab corresponding to the symtab we just
> rejected, and is surprised to see that it has already been read in.
> 
>   ps = find_pc_sect_psymtab (pc, section);
>   if (ps)
>     {
>       if (ps->readin)
>         /* Might want to error() here (in case symtab is corrupt and
>            will cause a core dump), but maybe we can successfully
>            continue, so let's not.  */
>         warning ("\
> (Internal error: pc 0x%s in read in psymtab, but not in symtab.)\n",
>                  paddr_nz (pc));
>       s = PSYMTAB_TO_SYMTAB (ps);
> 
> Investigating the source of the problem showed that symbol bfd_section
> is not provided by the debugging information, and hence it is retrieved
> using the minimal symbols through:
> 
>                 fixup_symbol_section (sym, objfile);
> 
> That lead me to find that the bfd_section for the symbols was not
> set either. The attached patch fixes this.
> 
> 2004-11-10  Joel Brobecker  <brobecker@gnat.com>
> 
>         * mdebugread.c (record_minimal_symbol): New procedure.
>         (parse_partial_symbols): Use record_minimal_symbol to record
>         the new minimal symbols instead of prim_record_minimal_symbol
>         and prim_record_minimal_symbol_and_info.
> 
> Tested on alpha-tru64, fixes a few hundred regressions.
> OK to apply?
> 
> Note that I only modified the code that loads the symbol table from
> objects generated by GCC. I don't have a DEC C compiler, so I didn't
> modify the part of parse_partial_symbols that deals with non-gcc
> symbol tables because I wouldn't be able to test the changes. I can
> make the changes blindly, but ...
> 
> Thanks,
> -- 
> Joel

> Index: mdebugread.c
> ===================================================================
> RCS file: /cvs/src/src/gdb/mdebugread.c,v
> retrieving revision 1.71
> diff -u -p -r1.71 mdebugread.c
> --- mdebugread.c	31 Oct 2004 17:57:43 -0000	1.71
> +++ mdebugread.c	10 Nov 2004 17:34:02 -0000
> @@ -2173,6 +2173,85 @@ function_outside_compilation_unit_compla
>  	     arg1);
>  }
>  
> +/* Use the STORAGE_CLASS to compute which section the given symbol
> +   belongs to, and then records this new minimal symbol.  */
> +
> +static void
> +record_minimal_symbol (const char *name, const CORE_ADDR address,
> +                       enum minimal_symbol_type ms_type, int storage_class,
> +                       struct objfile *objfile)
> +{
> +  int section;
> +  asection *bfd_section;
> +
> +  switch (storage_class)
> +    {
> +      case scText:
> +        section = SECT_OFF_TEXT (objfile);
> +        bfd_section = bfd_get_section_by_name (cur_bfd, ".text");
> +        break;
> +      case scData:
> +        section = SECT_OFF_DATA (objfile);
> +        bfd_section = bfd_get_section_by_name (cur_bfd, ".data");
> +        break;
> +      case scBss:
> +        section = SECT_OFF_BSS (objfile);
> +        bfd_section = bfd_get_section_by_name (cur_bfd, ".bss");
> +        break;
> +      case scSData:
> +        section = get_section_index (objfile, ".sdata");
> +        bfd_section = bfd_get_section_by_name (cur_bfd, ".sdata");
> +        break;
> +      case scSBss:
> +        section = get_section_index (objfile, ".sbss");
> +        bfd_section = bfd_get_section_by_name (cur_bfd, ".sbss");
> +        break;
> +      case scRData:
> +        section = get_section_index (objfile, ".rdata");
> +        bfd_section = bfd_get_section_by_name (cur_bfd, ".rdata");
> +        break;
> +      case scInit:
> +        section = get_section_index (objfile, ".init");
> +        bfd_section = bfd_get_section_by_name (cur_bfd, ".init");
> +        break;
> +      case scXData:
> +        section = get_section_index (objfile, ".xdata");
> +        bfd_section = bfd_get_section_by_name (cur_bfd, ".xdata");
> +        break;
> +      case scPData:
> +        section = get_section_index (objfile, ".pdata");
> +        bfd_section = bfd_get_section_by_name (cur_bfd, ".pdata");
> +        break;
> +      case scFini:
> +        section = get_section_index (objfile, ".fini");
> +        bfd_section = bfd_get_section_by_name (cur_bfd, ".fini");
> +        break;
> +      case scRConst:
> +        section = get_section_index (objfile, ".rconst");
> +        bfd_section = bfd_get_section_by_name (cur_bfd, ".rconst");
> +        break;
> +#ifdef scTlsData
> +      case scTlsData:
> +        section = get_section_index (objfile, ".tlsdata");
> +        bfd_section = bfd_get_section_by_name (cur_bfd, ".tlsdata");
> +        break;
> +#endif
> +#ifdef scTlsBss
> +      case scTlsBss:
> +        section = get_section_index (objfile, ".tlsbss");
> +        bfd_section = bfd_get_section_by_name (cur_bfd, ".tlsbss");
> +        break;
> +#endif
> +      default:
> +        /* This kind of symbol is not associated to a section.  */
> +        section = -1;
> +        bfd_section = NULL;
> +    }
> +
> +  prim_record_minimal_symbol_and_info (name, address, ms_type, NULL,
> +                                       section, bfd_section, objfile);
> +}
> +
>  /* Master parsing procedure for first-pass reading of file symbols
>     into a partial_symtab.  */
>  
> @@ -2487,7 +2566,8 @@ parse_partial_symbols (struct objfile *o
>  	  unknown_ext_complaint (name);
>  	}
>        if (!ECOFF_IN_ELF (cur_bfd))
> -	prim_record_minimal_symbol (name, svalue, ms_type, objfile);
> +        record_minimal_symbol (name, svalue, ms_type, ext_in->asym.sc,
> +                               objfile);
>      }
>  
>    /* Pass 3 over files, over local syms: fill in static symbols */
> @@ -2604,13 +2684,9 @@ parse_partial_symbols (struct objfile *o
>  		      if (sh.st == stStaticProc)
>  			{
>  			  namestring = debug_info->ss + fh->issBase + sh.iss;
> -			  prim_record_minimal_symbol_and_info (namestring,
> -							       sh.value,
> -							       mst_file_text,
> -							       NULL,
> -							       SECT_OFF_TEXT (objfile),
> -							       NULL,
> -							       objfile);
> +                          record_minimal_symbol (namestring, sh.value,
> +                                                 mst_file_text, sh.sc,
> +                                                 objfile);
>  			}
>  		      procaddr = sh.value;
>  
> @@ -2652,13 +2728,9 @@ parse_partial_symbols (struct objfile *o
>  			case scXData:
>  			  namestring = debug_info->ss + fh->issBase + sh.iss;
>  			  sh.value += ANOFFSET (objfile->section_offsets, SECT_OFF_DATA (objfile));
> -			  prim_record_minimal_symbol_and_info (namestring,
> -							       sh.value,
> -							       mst_file_data,
> -							       NULL,
> -							       SECT_OFF_DATA (objfile),
> -							       NULL,
> -							       objfile);
> +                          record_minimal_symbol (namestring, sh.value,
> +                                                 mst_file_data, sh.sc,
> +                                                 objfile);
>  			  break;
>  
>  			default:
> @@ -2666,13 +2738,9 @@ parse_partial_symbols (struct objfile *o
>  			     then have the default be abs? */
>  			  namestring = debug_info->ss + fh->issBase + sh.iss;
>  			  sh.value += ANOFFSET (objfile->section_offsets, SECT_OFF_BSS (objfile));
> -			  prim_record_minimal_symbol_and_info (namestring,
> -							       sh.value,
> -							       mst_file_bss,
> -							       NULL,
> -							       SECT_OFF_BSS (objfile),
> -							       NULL,
> -							       objfile);
> +                          record_minimal_symbol (namestring, sh.value,
> +                                                 mst_file_bss, sh.sc,
> +                                                 objfile);
>  			  break;
>  			}
>  		    }


-- 
Joel


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]