From: Daniel Jacobowitz <drow@false.org>
To: gdb-patches@sourceware.org
Subject: RFC: Fix an infinite loop placing sections in relocatable objects
Date: Thu, 16 Feb 2006 15:24:00 -0000 [thread overview]
Message-ID: <20060216152444.GA22371@nevyn.them.org> (raw)
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?
--
Daniel Jacobowitz
CodeSourcery
2006-02-16 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 16 Feb 2006 15:21:43 -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 = 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. */
next reply other threads:[~2006-02-16 15:24 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-02-16 15:24 Daniel Jacobowitz [this message]
2006-02-16 19:16 ` Jim Blandy
2006-02-16 22:04 ` Andreas Schwab
2006-02-16 22:17 ` Daniel Jacobowitz
2006-02-16 22:23 ` Jim Blandy
2006-02-16 22:24 ` Daniel Jacobowitz
2006-02-20 15:03 ` Daniel Jacobowitz
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20060216152444.GA22371@nevyn.them.org \
--to=drow@false.org \
--cc=gdb-patches@sourceware.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox