Applied Daniel Jacobowitz's patch for reattaching in the presence of
authorKevin Buettner <kevinb@redhat.com>
Wed, 29 Aug 2001 19:34:08 +0000 (19:34 +0000)
committerKevin Buettner <kevinb@redhat.com>
Wed, 29 Aug 2001 19:34:08 +0000 (19:34 +0000)
remote SVR4 shared libraries.

gdb/ChangeLog
gdb/solib-svr4.c

index 253e8c5de0fd7c1281356673215b5a4f24dad506..a2854c9bec331ed6442fcdd8794132d12aa4deeb 100644 (file)
@@ -1,3 +1,10 @@
+2001-08-29  Kevin Buettner  <kevinb@redhat.com>
+
+       From 2001-08-07  Daniel Jacobowitz  <drow@mvista.com>:
+       * solib-svr4.c (enable_break): Check the inferior link map
+       before assuming the inferior PC is at the start of the dynamic
+       loader.
+
 2001-08-28  Andrew Cagney  <cagney@toribio.toronto.redhat.com>
 
        * frame.h (struct frame_info): Fix documentation on fields
index 7da14815d11de31b58862c1cbdefb7fd156cf13f..a23b56c2dabd0340124002756d665d5690b21f6b 100644 (file)
@@ -1198,7 +1198,9 @@ enable_break (void)
     {
       unsigned int interp_sect_size;
       char *buf;
-      CORE_ADDR load_addr;
+      CORE_ADDR load_addr = 0;
+      int load_addr_found = 0;
+      struct so_list *inferior_sos;
       bfd *tmp_bfd = NULL;
       int tmp_fd = -1;
       char *tmp_pathname = NULL;
@@ -1235,10 +1237,30 @@ enable_break (void)
          goto bkpt_at_symbol;
        }
 
-      /* We find the dynamic linker's base address by examining the
-         current pc (which point at the entry point for the dynamic
-         linker) and subtracting the offset of the entry point.  */
-      load_addr = read_pc () - tmp_bfd->start_address;
+      /* If the entry in _DYNAMIC for the dynamic linker has already
+         been filled in, we can read its base address from there. */
+      inferior_sos = svr4_current_sos ();
+      if (inferior_sos)
+       {
+         /* Connected to a running target.  Update our shared library table. */
+         solib_add (NULL, 0, NULL);
+       }
+      while (inferior_sos)
+       {
+         if (strcmp (buf, inferior_sos->so_original_name) == 0)
+           {
+             load_addr_found = 1;
+             load_addr = LM_ADDR (inferior_sos);
+             break;
+           }
+         inferior_sos = inferior_sos->next;
+       }
+
+      /* Otherwise we find the dynamic linker's base address by examining
+        the current pc (which should point at the entry point for the
+        dynamic linker) and subtracting the offset of the entry point.  */
+      if (!load_addr_found)
+       load_addr = read_pc () - tmp_bfd->start_address;
 
       /* Record the relocated start and end address of the dynamic linker
          text and plt section for svr4_in_dynsym_resolve_code.  */