From: Mike Frysinger <vapier@gentoo.org>
To: gdb-patches@sourceware.org
Subject: [PATCH]: gdb: fdpic/frv: fix shared library loading
Date: Wed, 14 Apr 2010 07:00:00 -0000 [thread overview]
Message-ID: <201004140259.39671.vapier@gentoo.org> (raw)
[-- Attachment #1: Type: text/plain, Size: 4423 bytes --]
The recent change to reload_shared_libraries() broke FDPIC shared libraries as
the solib-frv.c code was implicitly relying on the initial order of calls
(first solib_addr() and then solib_create_inferior_hook()). It was
maintaining internal state via enable_break{1,2}_done to handle this.
While I could tweak these values a bit more, the original code wasn't terribly
bullet proof -- if during the initial debug you attempted to view shared
libraries, the enable2_break() code would whine about the ldso internal debug
addresses being unfetchable (and would actually attempt to read address 0x8 on
the target). So I've dropped this implicit dependency on order (i.e.
enable_break1_done) and updated the ldso poking code (i.e. enable_break2) to
silently return when the internal debug address is still set to 0. It will
remain this way until the ldso gets a chance to initialize at which point the
code will act the same as before.
While I have no way of testing the FRV, the Blackfin FDPIC code is using this
same base in a 100% copy & paste method since we implemented FDPIC the same
way as the FRV guys (I'll address this in the future). This fix was required
in order to handle shared libraries with Blackfin FDPIC properly, and I see no
reason why it wouldn't also work for FRV (since the uClibc ldso FDPIC code is
the same too and that's really what this is poking).
-mike
2010-04-14 Mike Frysinger <vapier@gentoo.org>
* solib-frv.c (enable_break1_done): Delete.
(enable_break2): Do not check enable_break1_done. Move the
enable_break2_done setting and call to
remove_solib_event_breakpoints() to the end. Return without
warning when the contents of _dl_debug_addr are 0.
(enable_break): Do not set enable_break1_done.
(frv_clear_solib): Likewise.
RCS file: /cvs/src/src/gdb/solib-frv.c,v
retrieving revision 1.33
diff -u -p -r1.33 solib-frv.c
--- gdb/solib-frv.c 24 Feb 2010 00:29:02 -0000 1.33
+++ gdb/solib-frv.c 14 Apr 2010 06:49:48 -0000
@@ -631,7 +631,6 @@ enable_break_failure_warning (void)
*/
-static int enable_break1_done = 0;
static int enable_break2_done = 0;
static int
@@ -642,15 +641,9 @@ enable_break2 (void)
char **bkpt_namep;
asection *interp_sect;
- if (!enable_break1_done || enable_break2_done)
+ if (enable_break2_done)
return 1;
- enable_break2_done = 1;
-
- /* First, remove all the solib event breakpoints. Their addresses
- may have changed since the last time we ran the program. */
- remove_solib_event_breakpoints ();
-
interp_text_sect_low = interp_text_sect_high = 0;
interp_plt_sect_low = interp_plt_sect_high = 0;
@@ -771,6 +764,22 @@ enable_break2 (void)
}
addr = extract_unsigned_integer (addr_buf, sizeof addr_buf, byte_order);
+ if (solib_frv_debug)
+ fprintf_unfiltered (gdb_stdlog,
+ "enable_break: _dl_debug_addr[0..3] = %s\n",
+ hex_string_custom (addr, 8));
+
+ /* If it's zero, then the ldso hasn't initialized yet, and so
+ there are no shared libs yet loaded. */
+ if (addr == 0)
+ {
+ if (solib_frv_debug)
+ fprintf_unfiltered (gdb_stdlog,
+ "enable_break: ldso not yet initialized\n");
+ /* Do not warn, but mark to run again. */
+ return 0;
+ }
+
/* Fetch the r_brk field. It's 8 bytes from the start of
_dl_debug_addr. */
if (target_read_memory (addr + 8, addr_buf, sizeof addr_buf) != 0)
@@ -800,9 +809,15 @@ enable_break2 (void)
/* We're also done with the loadmap. */
xfree (ldm);
+ /* First, remove all the solib event breakpoints. Their addresses
+ may have changed since the last time we ran the program. */
+ remove_solib_event_breakpoints ();
+
/* Now (finally!) create the solib breakpoint. */
create_solib_event_breakpoint (target_gdbarch, addr);
+ enable_break2_done = 1;
+
return 1;
}
@@ -847,7 +862,6 @@ enable_break (void)
return 0;
}
- enable_break1_done = 1;
create_solib_event_breakpoint (target_gdbarch,
symfile_objfile->ei.entry_point);
@@ -997,7 +1011,6 @@ static void
frv_clear_solib (void)
{
lm_base_cache = 0;
- enable_break1_done = 0;
enable_break2_done = 0;
main_lm_addr = 0;
if (main_executable_lm_info != 0)
[-- Attachment #2: This is a digitally signed message part. --]
[-- Type: application/pgp-signature, Size: 836 bytes --]
next reply other threads:[~2010-04-14 7:00 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-04-14 7:00 Mike Frysinger [this message]
2010-04-15 15:25 ` Andrew Stubbs
2010-04-15 21:56 ` Mike Frysinger
2010-04-16 22:22 ` Kevin Buettner
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=201004140259.39671.vapier@gentoo.org \
--to=vapier@gentoo.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