* solib-svr4.c (svr4_have_link_map_offsets): New function.
authorKevin Buettner <kevinb@redhat.com>
Tue, 15 Apr 2003 00:28:23 +0000 (00:28 +0000)
committerKevin Buettner <kevinb@redhat.com>
Tue, 15 Apr 2003 00:28:23 +0000 (00:28 +0000)
(locate_base): Return early if there aren't any link map offsets.
(svr4_solib_create_inferior_hook): Warn if shared library support
is unavailable.

gdb/ChangeLog
gdb/solib-svr4.c

index 8cb7af17150aba9ccd21e72b4bfa224a4525bd85..9d04f9259017581046e5227451c81e330f69ee92 100644 (file)
@@ -1,3 +1,10 @@
+2003-04-14  Kevin Buettner  <kevinb@redhat.com>
+
+       * solib-svr4.c (svr4_have_link_map_offsets): New function.
+       (locate_base): Return early if there aren't any link map offsets.
+       (svr4_solib_create_inferior_hook): Warn if shared library support
+       is unavailable.
+
 2003-04-14  David Carlton  <carlton@math.stanford.edu>
 
        * symtab.c (symbol_set_names): Add prefix when storing Java names
index 1b0a43e97d426c5b1edb15ad7e1fd4d61a3a6108..6c4c10ae0139d8fc4c8d8419f7e92ae195c977fc 100644 (file)
@@ -43,6 +43,7 @@
 
 static struct link_map_offsets *svr4_fetch_link_map_offsets (void);
 static struct link_map_offsets *legacy_fetch_link_map_offsets (void);
+static int svr4_have_link_map_offsets (void);
 
 /* fetch_link_map_offsets_gdbarch_data is a handle used to obtain the
    architecture specific link map offsets fetching function.  */
@@ -542,9 +543,10 @@ locate_base (void)
   /* Check to see if we have a currently valid address, and if so, avoid
      doing all this work again and just return the cached address.  If
      we have no cached address, try to locate it in the dynamic info
-     section for ELF executables.  */
+     section for ELF executables.  There's no point in doing any of this
+     though if we don't have some link map offsets to work with.  */
 
-  if (debug_base == 0)
+  if (debug_base == 0 && svr4_have_link_map_offsets ())
     {
       if (exec_bfd != NULL
          && bfd_get_flavour (exec_bfd) == bfd_target_elf_flavour)
@@ -1273,6 +1275,13 @@ svr4_solib_create_inferior_hook (void)
   /* Relocate the main executable if necessary.  */
   svr4_relocate_main_executable ();
 
+  if (!svr4_have_link_map_offsets ())
+    {
+      warning ("no shared library support for this OS / ABI");
+      return;
+
+    }
+
   if (!enable_break ())
     {
       warning ("shared library handler failed to enable breakpoint");
@@ -1392,6 +1401,20 @@ svr4_fetch_link_map_offsets (void)
     return (flmo ());
 }
 
+/* Return 1 if a link map offset fetcher has been defined, 0 otherwise.  */
+static int
+svr4_have_link_map_offsets (void)
+{
+  struct link_map_offsets *(*flmo)(void) =
+    gdbarch_data (current_gdbarch, fetch_link_map_offsets_gdbarch_data);
+  if (flmo == NULL
+      || (flmo == legacy_fetch_link_map_offsets 
+          && legacy_svr4_fetch_link_map_offsets_hook == NULL))
+    return 0;
+  else
+    return 1;
+}
+
 /* set_solib_svr4_fetch_link_map_offsets() is intended to be called by
    a <arch>_gdbarch_init() function.  It is used to establish an
    architecture specific link_map_offsets fetcher for the architecture