* gdb.base/long_long.exp: Accept optional symbol name in <...>
[deliverable/binutils-gdb.git] / gdb / solib-legacy.c
index 29ed014d62292b880bb6ca1b33fc2dc51ab253d5..d876802d35f935108410503685b1f12f02339c55 100644 (file)
@@ -1,6 +1,6 @@
 /* Provide legacy r_debug and link_map support for SVR4-like native targets.
-   Copyright 2000, 2001
-   Free Software Foundation, Inc.
+
+   Copyright (C) 2000, 2001, 2006, 2007 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
 
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place - Suite 330,
-   Boston, MA 02111-1307, USA.  */
+   Foundation, Inc., 51 Franklin Street, Fifth Floor,
+   Boston, MA 02110-1301, USA.  */
 
-#define _SYSCALL32     /* for Sparc64 cross Sparc32 */
 #include "defs.h"
 #include "gdbcore.h"
 #include "solib-svr4.h"
 
 #ifdef HAVE_LINK_H
+
+#ifdef HAVE_NLIST_H
+/* nlist.h needs to be included before link.h on some older *BSD systems. */
+#include <nlist.h>
+#endif
+
 #include <link.h>
 
 /* Fetch (and possibly build) an appropriate link_map_offsets structure
@@ -49,11 +54,11 @@ legacy_svr4_fetch_link_map_offsets (void)
     {
       lmp = &lmo;
 
-#ifdef SVR4_SHARED_LIBS
-      lmo.r_debug_size = sizeof (struct r_debug);
-
+#ifdef HAVE_STRUCT_LINK_MAP_WITH_L_MEMBERS
+      lmo.r_version_offset = offsetof (struct r_debug, r_version);
+      lmo.r_version_size = fieldsize (struct r_debug, r_version);
       lmo.r_map_offset = offsetof (struct r_debug, r_map);
-      lmo.r_map_size = fieldsize (struct r_debug, r_map);
+      lmo.r_ldsomap_offset = -1;
 
       lmo.link_map_size = sizeof (struct link_map);
 
@@ -63,12 +68,16 @@ legacy_svr4_fetch_link_map_offsets (void)
       lmo.l_next_offset = offsetof (struct link_map, l_next);
       lmo.l_next_size = fieldsize (struct link_map, l_next);
 
+      lmo.l_ld_offset = offsetof (struct link_map, l_ld);
+      lmo.l_ld_size = fieldsize (struct link_map, l_ld);
+
       lmo.l_prev_offset = offsetof (struct link_map, l_prev);
       lmo.l_prev_size = fieldsize (struct link_map, l_prev);
 
       lmo.l_name_offset = offsetof (struct link_map, l_name);
       lmo.l_name_size = fieldsize (struct link_map, l_name);
-#else /* !SVR4_SHARED_LIBS */
+#else /* !defined(HAVE_STRUCT_LINK_MAP_WITH_L_MEMBERS) */
+#ifdef HAVE_STRUCT_LINK_MAP_WITH_LM_MEMBERS
       lmo.link_map_size = sizeof (struct link_map);
 
       lmo.l_addr_offset = offsetof (struct link_map, lm_addr);
@@ -77,9 +86,31 @@ legacy_svr4_fetch_link_map_offsets (void)
       lmo.l_next_offset = offsetof (struct link_map, lm_next);
       lmo.l_next_size = fieldsize (struct link_map, lm_next);
 
+      /* FIXME: Is this the right field name, or is it available at all?  */
+      lmo.l_ld_offset = offsetof (struct link_map, lm_ld);
+      lmo.l_ld_size = fieldsize (struct link_map, lm_ld);
+
       lmo.l_name_offset = offsetof (struct link_map, lm_name);
       lmo.l_name_size = fieldsize (struct link_map, lm_name);
-#endif /* SVR4_SHARED_LIBS */
+#else /* !defined(HAVE_STRUCT_LINK_MAP_WITH_LM_MEMBERS) */
+#if HAVE_STRUCT_SO_MAP_WITH_SOM_MEMBERS
+      lmo.link_map_size = sizeof (struct so_map);
+
+      lmo.l_addr_offset = offsetof (struct so_map, som_addr);
+      lmo.l_addr_size = fieldsize (struct so_map, som_addr);
+
+      lmo.l_next_offset = offsetof (struct so_map, som_next);
+      lmo.l_next_size = fieldsize (struct so_map, som_next);
+
+      lmo.l_name_offset = offsetof (struct so_map, som_path);
+      lmo.l_name_size = fieldsize (struct so_map, som_path);
+
+      /* FIXME: Is the address of the dynamic table available?  */
+      lmo.l_ld_offset = 0;
+      lmo.l_ld_size = 0;
+#endif /* HAVE_STRUCT_SO_MAP_WITH_SOM_MEMBERS */
+#endif /* HAVE_STRUCT_LINK_MAP_WITH_LM_MEMBERS */
+#endif /* HAVE_STRUCT_LINK_MAP_WITH_L_MEMBERS */
     }
 
 #if defined (HAVE_STRUCT_LINK_MAP32)
@@ -87,10 +118,10 @@ legacy_svr4_fetch_link_map_offsets (void)
     {
       lmp32 = &lmo32;
 
-      lmo32.r_debug_size = sizeof (struct r_debug32);
-
+      lmo32.r_version_offset = offsetof (struct r_debug32, r_version);
+      lmo32.r_version_size = fieldsize (struct r_debug32, r_version);
       lmo32.r_map_offset = offsetof (struct r_debug32, r_map);
-      lmo32.r_map_size = fieldsize (struct r_debug32, r_map);
+      lmo32.r_ldsomap_offset = -1;
 
       lmo32.link_map_size = sizeof (struct link_map32);
 
@@ -109,15 +140,21 @@ legacy_svr4_fetch_link_map_offsets (void)
 #endif /* defined (HAVE_STRUCT_LINK_MAP32) */
 
 #if defined (HAVE_STRUCT_LINK_MAP32)
-  if (bfd_get_arch_size (exec_bfd) == 32)
+  if (exec_bfd != NULL)
+    {
+      if (bfd_get_arch_size (exec_bfd) == 32)
+       return lmp32;
+    }
+  if (TARGET_PTR_BIT == 32)
     return lmp32;
-  else
 #endif
-    return lmp;
+  return lmp;
 }
 
 #endif /* HAVE_LINK_H */
 
+extern initialize_file_ftype _initialize_svr4_lm; /* -Wmissing-prototypes */
+
 void
 _initialize_svr4_lm (void)
 {
This page took 0.025899 seconds and 4 git commands to generate.