This is the mail archive of the gdb-patches@sourceware.org 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]

Re: Crash in write_exp_msymbol for coff targets.


Daniel Jacobowitz wrote:
On Thu, Nov 16, 2006 at 11:39:38PM +0000, Pedro Alves wrote:
Like in the attached patch1.diff?

Or, it isn't safe to index the objfile->sections by section index,
and we have to look them up linearly? That is what patch2.diff does.
In that version, I've repeated the search on coffread.c, caching the last
section looked up. Only slightly tested, but I got around around 50% cache
hit on a few exes. (Premature optimization?)

I'm somewhat worried about the numbering :-( It looks like "int section" is only useful for ANOFFSET / struct section_offsets. And that suggests there's no useful way to get from those numbers to the bfd_section or vice versa. What an awful mess.

I see. What about this? (Attached)

2006-11-16 Pedro Alves <pedro_alves@portugalmail.pt>

* coffread.c (cs_to_bfd_section): New function.
(coff_symtab_read): Use cs_to_bfd_section.

cs_to_section could be then converted to bfd_section_to_section.

I suppose the only way to fix this will be to overhaul the associated
code and reduce the number of numberings in use.  But in the mean time,
we should use your original patch that checked for non-NULL.  Sorry
for the runaround.

No prob.

Shall I commit it for you?

Yes please, no write access.

Cheers,
Pedro Alves

Index: coffread.c
===================================================================
RCS file: /cvs/src/src/gdb/coffread.c,v
retrieving revision 1.63
diff -u -p -r1.63 coffread.c
--- coffread.c	17 Dec 2005 22:33:59 -0000	1.63
+++ coffread.c	17 Nov 2006 00:45:46 -0000
@@ -284,6 +284,19 @@ cs_to_section (struct coff_symbol *cs, s
   return off;
 }
 
+/* Return the bfd_section that CS points to.  */
+static struct bfd_section*
+cs_to_bfd_section (struct coff_symbol *cs, struct objfile *objfile)
+{
+  asection *sect = NULL;
+  struct find_targ_sec_arg args;
+
+  args.targ_index = cs->c_secnum;
+  args.resultp = &sect;
+  bfd_map_over_sections (objfile->obfd, find_targ_sec, &args);
+  return sect;
+}
+
 /* Return the address of the section of a COFF symbol.  */
 
 static CORE_ADDR cs_section_address (struct coff_symbol *, bfd *);
@@ -926,9 +939,10 @@ coff_symtab_read (long symtab_offset, un
 	    if (cs->c_name[0] != '@' /* Skip tdesc symbols */ )
 	      {
 		struct minimal_symbol *msym;
+		struct bfd_section *bfd_section = cs_to_bfd_section (cs, objfile);
 		msym = prim_record_minimal_symbol_and_info
 		  (cs->c_name, tmpaddr, ms_type, NULL,
-		   sec, NULL, objfile);
+		   sec, bfd_section, objfile);
 		if (msym)
 		  COFF_MAKE_MSYMBOL_SPECIAL (cs->c_sclass, msym);
 	      }

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