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: RFC: Fix an infinite loop placing sections in relocatable objects


On Thu, Feb 16, 2006 at 10:24:44AM -0500, Daniel Jacobowitz wrote:
> While trying to track down something completely different, I accidentally
> got GDB stuck in an infinite loop.  I'm not entirely sure what I was
> thinking when I wrote this, but I believe the attached patch is a correct
> fix:
>   - if we can't place at this address, we bump start_addr, so we should
>     restart the inner for loop.
>   - arg->lowest and align are both invariant in the function up to this
>     point, so there's no point resetting start_addr inside the loop and
>     clobbering the retry logic.
> 
> Tested x86_64-pc-linux-gnu, where I can no longer trigger an infinite loop
> here.  Any opinions?

I've checked in this version; thanks to both Jim and Andreas.


-- 
Daniel Jacobowitz
CodeSourcery

2006-02-20  Daniel Jacobowitz  <dan@codesourcery.com>

	* symfile.c (place_section): Correct retry logic.

Index: symfile.c
===================================================================
RCS file: /cvs/src/src/gdb/symfile.c,v
retrieving revision 1.167
diff -u -p -r1.167 symfile.c
--- symfile.c	7 Feb 2006 19:40:30 -0000	1.167
+++ symfile.c	20 Feb 2006 14:58:31 -0000
@@ -476,6 +476,7 @@ place_section (bfd *abfd, asection *sect
   struct place_section_arg *arg = obj;
   CORE_ADDR *offsets = arg->offsets->offsets, start_addr;
   int done;
+  ULONGEST align = ((ULONGEST) 1) << bfd_get_section_alignment (abfd, sect);
 
   /* We are only interested in loadable sections.  */
   if ((bfd_get_section_flags (abfd, sect) & SEC_LOAD) == 0)
@@ -486,11 +487,11 @@ place_section (bfd *abfd, asection *sect
     return;
 
   /* Otherwise, let's try to find a place for the section.  */
+  start_addr = (arg->lowest + align - 1) & -align;
+
   do {
     asection *cur_sec;
-    ULONGEST align = 1 << bfd_get_section_alignment (abfd, sect);
 
-    start_addr = (arg->lowest + align - 1) & -align;
     done = 1;
 
     for (cur_sec = abfd->sections; cur_sec != NULL; cur_sec = cur_sec->next)
@@ -524,7 +525,7 @@ place_section (bfd *abfd, asection *sect
 	    start_addr = offsets[indx] + bfd_get_section_size (cur_sec);
 	    start_addr = (start_addr + align - 1) & -align;
 	    done = 0;
-	    continue;
+	    break;
 	  }
 
 	/* Otherwise, we appear to be OK.  So far.  */


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