2000-11-20 Michael Snyder <msnyder@cleaver.cygnus.com>
authorMichael Snyder <msnyder@vmware.com>
Tue, 21 Nov 2000 01:09:54 +0000 (01:09 +0000)
committerMichael Snyder <msnyder@vmware.com>
Tue, 21 Nov 2000 01:09:54 +0000 (01:09 +0000)
        * solist.h: Declare new function solib_open.
        * solib.c (solib_open): New function.  Abstracts some of the
        code from solib_map_sections, for finding the binary solib file.
        (solib_map_sections): Call solib_open.
        * solib-svr4.c (enable_break): Call solib_open.

gdb/ChangeLog
gdb/solib-svr4.c
gdb/solib.c
gdb/solist.h

index 3b8fceb..491bc53 100644 (file)
@@ -1,3 +1,11 @@
+2000-11-20  Michael Snyder  <msnyder@cleaver.cygnus.com>
+
+       * solist.h: Declare new function solib_open.
+       * solib.c (solib_open): New function.  Abstracts some of the
+       code from solib_map_sections, for finding the binary solib file.
+       (solib_map_sections): Call solib_open.
+       * solib-svr4.c (enable_break): Call solib_open.
+
 2000-11-20  J.T. Conklin  <jtc@redback.com>
 
        * gdbserver/low-nbsd.c (fetch_inferior_registers,
index bbe90a6..f7c7a78 100644 (file)
@@ -287,7 +287,6 @@ IGNORE_FIRST_LINK_MAP_ENTRY (struct so_list *so)
 
 #endif /* !SVR4_SHARED_LIBS */
 
-
 static CORE_ADDR debug_base;   /* Base of dynamic linker structures */
 static CORE_ADDR breakpoint_addr;      /* Address where end bkpt is set */
 
@@ -295,16 +294,6 @@ static CORE_ADDR breakpoint_addr;  /* Address where end bkpt is set */
 
 static int match_main (char *);
 
-/* If non-zero, this is a prefix that will be added to the front of the name
-   shared libraries with an absolute filename for loading.  */
-static char *solib_absolute_prefix = NULL;
-
-/* If non-empty, this is a search path for loading non-absolute shared library
-   symbol files.  This takes precedence over the environment variables PATH
-   and LD_LIBRARY_PATH.  */
-static char *solib_search_path = NULL;
-
-
 #ifndef SVR4_SHARED_LIBS
 
 /* Allocate the runtime common object file.  */
@@ -1269,7 +1258,9 @@ enable_break (void)
       unsigned int interp_sect_size;
       char *buf;
       CORE_ADDR load_addr;
-      bfd *tmp_bfd;
+      bfd *tmp_bfd = NULL;
+      int tmp_fd = -1;
+      char *tmp_pathname = NULL;
       CORE_ADDR sym_addr = 0;
 
       /* Read the contents of the .interp section into a local buffer;
@@ -1287,7 +1278,11 @@ enable_break (void)
          to find any magic formula to find it for Solaris (appears to
          be trivial on GNU/Linux).  Therefore, we have to try an alternate
          mechanism to find the dynamic linker's base address.  */
-      tmp_bfd = bfd_openr (buf, gnutarget);
+
+      tmp_fd  = solib_open (buf, &tmp_pathname);
+      if (tmp_fd >= 0)
+       tmp_bfd = bfd_fdopenr (tmp_pathname, gnutarget, tmp_fd);
+
       if (tmp_bfd == NULL)
        goto bkpt_at_symbol;
 
index 7da15b9..5c982e2 100644 (file)
@@ -66,6 +66,85 @@ static char *solib_search_path = NULL;
 
 /*
 
+   GLOBAL FUNCTION
+
+   solib_open -- Find a shared library file and open it.
+
+   SYNOPSIS
+
+   int solib_open (char *in_patname, char **found_pathname);
+
+   DESCRIPTION
+
+   Global variable SOLIB_ABSOLUTE_PREFIX is used as a prefix directory
+   to search for shared libraries if they have an absolute path.
+
+   Global variable SOLIB_SEARCH_PATH is used as a prefix directory
+   (or set of directories, as in LD_LIBRARY_PATH) to search for all
+   shared libraries if not found in SOLIB_ABSOLUTE_PREFIX.
+
+   Search order:
+   * If path is absolute, look in SOLIB_ABSOLUTE_PREFIX.
+   * If path is absolute, look for it literally (unmodified).
+   * Look in SOLIB_SEARCH_PATH.
+   * Look in inferior's $PATH.
+   * Look in inferior's $LD_LIBRARY_PATH.
+
+   RETURNS
+   
+   file handle for opened solib, or -1 for failure.  */
+
+int
+solib_open (char *in_pathname, char **found_pathname)
+{
+  int found_file = -1;
+  char *temp_pathname = NULL;
+
+  if (solib_absolute_prefix != NULL &&
+      ROOTED_P (in_pathname))
+    {
+      int  prefix_len = strlen (solib_absolute_prefix);
+
+      /* Remove trailing slashes from absolute prefix.  */
+      while (prefix_len > 0 && SLASH_P (solib_absolute_prefix[prefix_len - 1]))
+       prefix_len--;
+
+      /* Cat the prefixed pathname together.  */
+      temp_pathname = alloca (prefix_len + strlen (in_pathname) + 1);
+      strncpy (temp_pathname, solib_absolute_prefix, prefix_len);
+      temp_pathname[prefix_len] = '\0';
+      strcat (temp_pathname, in_pathname);
+
+      /* Now see if we can open it.  */
+      found_file = open (temp_pathname, O_RDONLY, 0);
+    }
+
+  /* If not found, next search the solib_search_path (if any).  */
+  if (found_file < 0 && solib_search_path != NULL)
+    found_file = openp (solib_search_path,
+                       1, in_pathname, O_RDONLY, 0, &temp_pathname);
+
+  /* If not found, next search the inferior's $PATH environment variable. */
+  if (found_file < 0 && solib_search_path != NULL)
+    found_file = openp (get_in_environ (inferior_environ, "PATH"),
+                       1, in_pathname, O_RDONLY, 0, &temp_pathname);
+
+  /* If not found, next search the inferior's $LD_LIBRARY_PATH 
+     environment variable. */
+  if (found_file < 0 && solib_search_path != NULL)
+    found_file = openp (get_in_environ (inferior_environ, "LD_LIBRARY_PATH"),
+                       1, in_pathname, O_RDONLY, 0, &temp_pathname);
+
+  /* Done.  If not found, tough luck.  Return found_file and 
+     (optionally) found_pathname.  */
+  if (found_pathname != NULL)
+    *found_pathname = strsave (temp_pathname);
+  return found_file;
+}
+
+
+/*
+
    LOCAL FUNCTION
 
    solib_map_sections -- open bfd and build sections for shared lib
@@ -104,49 +183,15 @@ solib_map_sections (PTR arg)
 
   filename = tilde_expand (so->so_name);
 
-  if (solib_absolute_prefix && ROOTED_P (filename))
-    /* Prefix shared libraries with absolute filenames with
-       SOLIB_ABSOLUTE_PREFIX.  */
-    {
-      char *pfxed_fn;
-      int pfx_len;
-
-      pfx_len = strlen (solib_absolute_prefix);
-
-      /* Remove trailing slashes.  */
-      while (pfx_len > 0 && SLASH_P (solib_absolute_prefix[pfx_len - 1]))
-       pfx_len--;
-
-      pfxed_fn = xmalloc (pfx_len + strlen (filename) + 1);
-      strcpy (pfxed_fn, solib_absolute_prefix);
-      strcat (pfxed_fn, filename);
-      free (filename);
-
-      filename = pfxed_fn;
-    }
-
   old_chain = make_cleanup (free, filename);
+  scratch_chan = solib_open (filename, &scratch_pathname);
 
-  scratch_chan = -1;
-
-  if (solib_search_path)
-    scratch_chan = openp (solib_search_path,
-                         1, filename, O_RDONLY, 0, &scratch_pathname);
-  if (scratch_chan < 0)
-    scratch_chan = openp (get_in_environ (inferior_environ, "PATH"),
-                         1, filename, O_RDONLY, 0, &scratch_pathname);
-  if (scratch_chan < 0)
-    {
-      scratch_chan = openp (get_in_environ
-                           (inferior_environ, "LD_LIBRARY_PATH"),
-                           1, filename, O_RDONLY, 0, &scratch_pathname);
-    }
   if (scratch_chan < 0)
     {
       perror_with_name (filename);
     }
-  /* Leave scratch_pathname allocated.  abfd->name will point to it.  */
 
+  /* Leave scratch_pathname allocated.  abfd->name will point to it.  */
   abfd = bfd_fdopenr (scratch_pathname, gnutarget, scratch_chan);
   if (!abfd)
     {
@@ -154,12 +199,13 @@ solib_map_sections (PTR arg)
       error ("Could not open `%s' as an executable file: %s",
             scratch_pathname, bfd_errmsg (bfd_get_error ()));
     }
+
   /* Leave bfd open, core_xfer_memory and "info files" need it.  */
   so->abfd = abfd;
   abfd->cacheable = true;
 
-  /* copy full path name into so_name, so that later symbol_file_add can find
-     it */
+  /* copy full path name into so_name, so that later symbol_file_add
+     can find it */
   if (strlen (scratch_pathname) >= SO_NAME_MAX_PATH_SIZE)
     error ("Full path name length of shared library exceeds SO_NAME_MAX_PATH_SIZE in so_list structure.");
   strcpy (so->so_name, scratch_pathname);
index e55190d..2925250 100644 (file)
@@ -93,6 +93,9 @@ struct target_so_ops
 
 void free_so (struct so_list *so);
 
+/* Find solib binary file and open it.  */
+extern int solib_open (char *in_pathname, char **found_pathname);
+
 /* FIXME: gdbarch needs to control this variable */
 extern struct target_so_ops *current_target_so_ops;