[PATCH] remote SVR4 shared libraries vs. reattaching

Kevin Buettner kevinb@cygnus.com
Wed Aug 29 12:39:00 GMT 2001


Daniel is on travel and asked me to commit his patch.  It's been
slightly modified since it was originally posted, so here it is...

	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.

Index: solib-svr4.c
===================================================================
RCS file: /cvs/src/src/gdb/solib-svr4.c,v
retrieving revision 1.16
diff -u -p -r1.16 solib-svr4.c
--- solib-svr4.c	2001/07/02 19:37:59	1.16
+++ solib-svr4.c	2001/08/29 18:46:00
@@ -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.  */



More information about the Gdb-patches mailing list