2002-10-21 Elena Zannoni <ezannoni@redhat.com>
authorElena Zannoni <ezannoni@kwikemart.cygnus.com>
Mon, 21 Oct 2002 18:42:40 +0000 (18:42 +0000)
committerElena Zannoni <ezannoni@kwikemart.cygnus.com>
Mon, 21 Oct 2002 18:42:40 +0000 (18:42 +0000)
        * solib-svr4.c (svr4_fetch_objfile_link_map): New function.
        * solib-svr4.h (svr4_fetch_objfile_link_map): Export.

gdb/ChangeLog
gdb/solib-svr4.c

index eaf09e6..738246d 100644 (file)
@@ -1,5 +1,10 @@
 2002-10-21  Elena Zannoni  <ezannoni@redhat.com>
 
+        * solib-svr4.c (svr4_fetch_objfile_link_map): New function.
+        * solib-svr4.h (svr4_fetch_objfile_link_map): Export.   
+
+2002-10-21  Elena Zannoni  <ezannoni@redhat.com>
+
        * symtab.h (address_class):  Rename
        LOC_THREAD_LOCAL_STATIC to LOC_HP_THREAD_LOCAL_STATIC.
        * hpread.c (hpread_process_one_debug_symbol): Ditto.
index 3f98a1e..78161e0 100644 (file)
@@ -762,6 +762,77 @@ svr4_current_sos (void)
   return head;
 }
 
+/* Get the address of the link_map for a given OBJFILE.  Loop through
+   the link maps, and return the address of the one corresponding to
+   the given objfile.  Note that this function takes into account that
+   objfile can be the main executable, not just a shared library.  The
+   main executable has always an empty name field in the linkmap.  */
+
+CORE_ADDR
+svr4_fetch_objfile_link_map (struct objfile *objfile)
+{
+  CORE_ADDR lm;
+
+  if ((debug_base = locate_base ()) == 0)
+    return 0;   /* failed somehow... */
+
+  /* Position ourselves on the first link map.  */
+  lm = first_link_map_member ();  
+  while (lm)
+    {
+      /* Get info on the layout of the r_debug and link_map structures. */
+      struct link_map_offsets *lmo = SVR4_FETCH_LINK_MAP_OFFSETS ();
+      int errcode;
+      char *buffer;
+      struct lm_info objfile_lm_info;
+      struct cleanup *old_chain;
+      CORE_ADDR name_address;
+      char *l_name_buf = xmalloc (lmo->l_name_size);
+      old_chain = make_cleanup (xfree, l_name_buf);
+
+      /* Set up the buffer to contain the portion of the link_map
+         structure that gdb cares about.  Note that this is not the
+         whole link_map structure.  */
+      objfile_lm_info.lm = xmalloc (lmo->link_map_size);
+      make_cleanup (xfree, objfile_lm_info.lm);
+      memset (objfile_lm_info.lm, 0, lmo->link_map_size);
+
+      /* Read the link map into our internal structure.  */
+      read_memory (lm, objfile_lm_info.lm, lmo->link_map_size);
+
+      /* Read address of name from target memory to GDB.  */
+      read_memory (lm + lmo->l_name_offset, l_name_buf, lmo->l_name_size);
+
+      /* Extract this object's name.  */
+      name_address = extract_address (l_name_buf,
+                                     lmo->l_name_size);
+      target_read_string (name_address, &buffer,
+                         SO_NAME_MAX_PATH_SIZE - 1, &errcode);
+      make_cleanup (xfree, buffer);
+      if (errcode != 0)
+       {
+         warning ("svr4_fetch_objfile_link_map: Can't read pathname for load map: %s\n",
+                  safe_strerror (errcode));
+       }
+      else
+       {
+         /* Is this the linkmap for the file we want?  */
+         /* If the file is not a shared library and has no name,
+            we are sure it is the main executable, so we return that.  */
+         if ((buffer && strcmp (buffer, objfile->name) == 0)
+              || (!(objfile->flags & OBJF_SHARED) && (strcmp (buffer, "") == 0)))
+           {
+             do_cleanups (old_chain);
+             return lm;
+           }
+       }
+      /* Not the file we wanted, continue checking.  */
+      lm = extract_address (objfile_lm_info.lm + lmo->l_next_offset,
+                           lmo->l_next_size);
+      do_cleanups (old_chain);
+    }
+  return 0;
+}
 
 /* On some systems, the only way to recognize the link map entry for
    the main executable file is by looking at its name.  Return