testsuite patch: Skip py-unwind.exp on x86_64 -m32
[deliverable/binutils-gdb.git] / gdb / solib.c
index 31298a721be74acd4e72d8cc39713348030353ab..22355058b3e8d001d2cdcbb275b65a9b676bd43a 100644 (file)
@@ -1,6 +1,6 @@
 /* Handle shared libraries for GDB, the GNU Debugger.
 
-   Copyright (C) 1990-2015 Free Software Foundation, Inc.
+   Copyright (C) 1990-2016 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -65,7 +65,8 @@ solib_init (struct obstack *obstack)
 static const struct target_so_ops *
 solib_ops (struct gdbarch *gdbarch)
 {
-  const struct target_so_ops **ops = gdbarch_data (gdbarch, solib_data);
+  const struct target_so_ops **ops
+    = (const struct target_so_ops **) gdbarch_data (gdbarch, solib_data);
 
   return *ops;
 }
@@ -75,7 +76,8 @@ solib_ops (struct gdbarch *gdbarch)
 void
 set_solib_ops (struct gdbarch *gdbarch, const struct target_so_ops *new_ops)
 {
-  const struct target_so_ops **ops = gdbarch_data (gdbarch, solib_data);
+  const struct target_so_ops **ops
+    = (const struct target_so_ops **) gdbarch_data (gdbarch, solib_data);
 
   *ops = new_ops;
 }
@@ -112,13 +114,14 @@ show_solib_search_path (struct ui_file *file, int from_tty,
 #  define DOS_BASED_FILE_SYSTEM 0
 #endif
 
-/* Returns the full pathname of the shared library file, or NULL if
-   not found.  (The pathname is malloc'ed; it needs to be freed by the
-   caller.)  *FD is set to either -1 or an open file handle for the
-   library.
+/* Return the full pathname of a binary file (the main executable
+   or a shared library file), or NULL if not found.  The returned
+   pathname is malloc'ed and must be freed by the caller.  If FD
+   is non-NULL, *FD is set to either -1 or an open file handle for
+   the binary file.
 
    Global variable GDB_SYSROOT is used as a prefix directory
-   to search for shared libraries if they have an absolute path.
+   to search for binary files if they have an absolute path.
    If GDB_SYSROOT starts with "target:" and target filesystem
    is the local filesystem then the "target:" prefix will be
    stripped before the search starts.  This ensures that the
@@ -128,83 +131,56 @@ show_solib_search_path (struct ui_file *file, int from_tty,
    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 either the sysroot (if set) or
-   the local filesystem.
+   the local filesystem.  SOLIB_SEARCH_PATH is not used when searching
+   for the main executable.
 
    Search algorithm:
    * If a sysroot is set and path is absolute:
    *   Search for sysroot/path.
    * else
    *   Look for it literally (unmodified).
-   * Look in SOLIB_SEARCH_PATH.
-   * If available, use target defined search function.
+   * If IS_SOLIB is non-zero:
+   *   Look in SOLIB_SEARCH_PATH.
+   *   If available, use target defined search function.
    * If NO sysroot is set, perform the following two searches:
    *   Look in inferior's $PATH.
-   *   Look in inferior's $LD_LIBRARY_PATH.
+   *   If IS_SOLIB is non-zero:
+   *     Look in inferior's $LD_LIBRARY_PATH.
    *
    * The last check avoids doing this search when targetting remote
    * machines since a sysroot will almost always be set.
 */
 
-char *
-solib_find (char *in_pathname, int *fd)
+static char *
+solib_find_1 (char *in_pathname, int *fd, int is_solib)
 {
   const struct target_so_ops *ops = solib_ops (target_gdbarch ());
   int found_file = -1;
   char *temp_pathname = NULL;
-  const char *solib_symbols_extension
-    = gdbarch_solib_symbols_extension (target_gdbarch ());
   const char *fskind = effective_target_file_system_kind ();
   struct cleanup *old_chain = make_cleanup (null_cleanup, NULL);
   char *sysroot = gdb_sysroot;
-
-  /* If solib_symbols_extension is set, replace the file's
-     extension.  */
-  if (solib_symbols_extension)
+  int prefix_len, orig_prefix_len;
+
+  /* If the absolute prefix starts with "target:" but the filesystem
+     accessed by the target_fileio_* methods is the local filesystem
+     then we strip the "target:" prefix now and work with the local
+     filesystem.  This ensures that the same search algorithm is used
+     for all local files regardless of whether a "target:" prefix was
+     used.  */
+  if (is_target_filename (sysroot) && target_filesystem_is_local ())
+    sysroot += strlen (TARGET_SYSROOT_PREFIX);
+
+  /* Strip any trailing slashes from the absolute prefix.  */
+  prefix_len = orig_prefix_len = strlen (sysroot);
+
+  while (prefix_len > 0 && IS_DIR_SEPARATOR (sysroot[prefix_len - 1]))
+    prefix_len--;
+
+  if (prefix_len == 0)
+    sysroot = NULL;
+  else if (prefix_len != orig_prefix_len)
     {
-      char *p = in_pathname + strlen (in_pathname);
-
-      while (p > in_pathname && *p != '.')
-       p--;
-
-      if (*p == '.')
-       {
-         char *new_pathname;
-
-         new_pathname = alloca (p - in_pathname + 1
-                                + strlen (solib_symbols_extension) + 1);
-         memcpy (new_pathname, in_pathname, p - in_pathname + 1);
-         strcpy (new_pathname + (p - in_pathname) + 1,
-                 solib_symbols_extension);
-
-         in_pathname = new_pathname;
-       }
-    }
-
-  if (sysroot != NULL)
-    {
-      /* If the absolute prefix starts with "target:" but the
-        filesystem accessed by the target_fileio_* methods
-        is the local filesystem then we strip the "target:"
-        prefix now and work with the local filesystem.  This
-        ensures that the same search algorithm is used for
-        all local files regardless of whether a "target:"
-        prefix was used.  */
-      if (is_target_filename (sysroot) && target_filesystem_is_local ())
-       sysroot += strlen (TARGET_SYSROOT_PREFIX);
-
-      if (*sysroot == '\0')
-       sysroot = NULL;
-    }
-
-  if (sysroot != NULL)
-    {
-      int prefix_len = strlen (sysroot);
-
-      /* Remove trailing slashes from absolute prefix.  */
-      while (prefix_len > 0
-            && IS_DIR_SEPARATOR (sysroot[prefix_len - 1]))
-       prefix_len--;
-
       sysroot = savestring (sysroot, prefix_len);
       make_cleanup (xfree, sysroot);
     }
@@ -218,7 +194,7 @@ solib_find (char *in_pathname, int *fd)
       char *p;
 
       /* Avoid clobbering our input.  */
-      p = alloca (strlen (in_pathname) + 1);
+      p = (char *) alloca (strlen (in_pathname) + 1);
       strcpy (p, in_pathname);
       in_pathname = p;
 
@@ -276,7 +252,8 @@ solib_find (char *in_pathname, int *fd)
   /* Handle files to be accessed via the target.  */
   if (is_target_filename (temp_pathname))
     {
-      *fd = -1;
+      if (fd != NULL)
+       *fd = -1;
       do_cleanups (old_chain);
       return temp_pathname;
     }
@@ -351,23 +328,26 @@ solib_find (char *in_pathname, int *fd)
        in_pathname++;
     }
 
-  /* If not found, search the solib_search_path (if any).  */
-  if (found_file < 0 && solib_search_path != NULL)
+  /* If not found, and we're looking for a solib, search the
+     solib_search_path (if any).  */
+  if (is_solib && found_file < 0 && solib_search_path != NULL)
     found_file = openp (solib_search_path,
                        OPF_TRY_CWD_FIRST | OPF_RETURN_REALPATH,
                        in_pathname, O_RDONLY | O_BINARY, &temp_pathname);
 
-  /* If not found, next search the solib_search_path (if any) for the basename
-     only (ignoring the path).  This is to allow reading solibs from a path
-     that differs from the opened path.  */
-  if (found_file < 0 && solib_search_path != NULL)
+  /* If not found, and we're looking for a solib, next search the
+     solib_search_path (if any) for the basename only (ignoring the
+     path).  This is to allow reading solibs from a path that differs
+     from the opened path.  */
+  if (is_solib && found_file < 0 && solib_search_path != NULL)
     found_file = openp (solib_search_path,
                        OPF_TRY_CWD_FIRST | OPF_RETURN_REALPATH,
                        target_lbasename (fskind, in_pathname),
                        O_RDONLY | O_BINARY, &temp_pathname);
 
-  /* If not found, try to use target supplied solib search method.  */
-  if (found_file < 0 && ops->find_and_open_solib)
+  /* If not found, and we're looking for a solib, try to use target
+     supplied solib search method.  */
+  if (is_solib && found_file < 0 && ops->find_and_open_solib)
     found_file = ops->find_and_open_solib (in_pathname, O_RDONLY | O_BINARY,
                                           &temp_pathname);
 
@@ -378,18 +358,98 @@ solib_find (char *in_pathname, int *fd)
                        OPF_TRY_CWD_FIRST | OPF_RETURN_REALPATH, in_pathname,
                        O_RDONLY | O_BINARY, &temp_pathname);
 
-  /* If not found, next search the inferior's $LD_LIBRARY_PATH
-     environment variable.  */
-  if (found_file < 0 && sysroot == NULL)
+  /* If not found, and we're looking for a solib, next search the
+     inferior's $LD_LIBRARY_PATH environment variable.  */
+  if (is_solib && found_file < 0 && sysroot == NULL)
     found_file = openp (get_in_environ (current_inferior ()->environment,
                                        "LD_LIBRARY_PATH"),
                        OPF_TRY_CWD_FIRST | OPF_RETURN_REALPATH, in_pathname,
                        O_RDONLY | O_BINARY, &temp_pathname);
 
-  *fd = found_file;
+  if (fd == NULL)
+    {
+      if (found_file >= 0)
+       close (found_file);
+    }
+  else
+    *fd = found_file;
+
   return temp_pathname;
 }
 
+/* Return the full pathname of the main executable, or NULL if not
+   found.  The returned pathname is malloc'ed and must be freed by
+   the caller.  If FD is non-NULL, *FD is set to either -1 or an open
+   file handle for the main executable.
+
+   The search algorithm used is described in solib_find_1's comment
+   above.  */
+
+char *
+exec_file_find (char *in_pathname, int *fd)
+{
+  char *result = solib_find_1 (in_pathname, fd, 0);
+
+  if (result == NULL)
+    {
+      const char *fskind = effective_target_file_system_kind ();
+
+      if (fskind == file_system_kind_dos_based)
+       {
+         char *new_pathname;
+
+         new_pathname = (char *) alloca (strlen (in_pathname) + 5);
+         strcpy (new_pathname, in_pathname);
+         strcat (new_pathname, ".exe");
+
+         result = solib_find_1 (new_pathname, fd, 0);
+       }
+    }
+
+  return result;
+}
+
+/* Return the full pathname of a shared library file, or NULL if not
+   found.  The returned pathname is malloc'ed and must be freed by
+   the caller.  If FD is non-NULL, *FD is set to either -1 or an open
+   file handle for the shared library.
+
+   The search algorithm used is described in solib_find_1's comment
+   above.  */
+
+char *
+solib_find (char *in_pathname, int *fd)
+{
+  const char *solib_symbols_extension
+    = gdbarch_solib_symbols_extension (target_gdbarch ());
+
+  /* If solib_symbols_extension is set, replace the file's
+     extension.  */
+  if (solib_symbols_extension != NULL)
+    {
+      char *p = in_pathname + strlen (in_pathname);
+
+      while (p > in_pathname && *p != '.')
+       p--;
+
+      if (*p == '.')
+       {
+         char *new_pathname;
+
+         new_pathname
+           = (char *) alloca (p - in_pathname + 1
+                              + strlen (solib_symbols_extension) + 1);
+         memcpy (new_pathname, in_pathname, p - in_pathname + 1);
+         strcpy (new_pathname + (p - in_pathname) + 1,
+                 solib_symbols_extension);
+
+         in_pathname = new_pathname;
+       }
+    }
+
+  return solib_find_1 (in_pathname, fd, 1);
+}
+
 /* Open and return a BFD for the shared library PATHNAME.  If FD is not -1,
    it is used as file handle to open the file.  Throws an error if the file
    could not be opened.  Handles both local and remote file access.
@@ -636,16 +696,16 @@ solib_read_symbols (struct so_list *so, int flags)
                  && so->objfile->addr_low == so->addr_low)
                break;
            }
-         if (so->objfile != NULL)
-           break;
-
-         sap = build_section_addr_info_from_section_table (so->sections,
-                                                           so->sections_end);
-         so->objfile = symbol_file_add_from_bfd (so->abfd, so->so_name,
-                                                 flags, sap, OBJF_SHARED,
-                                                 NULL);
-         so->objfile->addr_low = so->addr_low;
-         free_section_addr_info (sap);
+         if (so->objfile == NULL)
+           {
+             sap = build_section_addr_info_from_section_table (so->sections,
+                                                               so->sections_end);
+             so->objfile = symbol_file_add_from_bfd (so->abfd, so->so_name,
+                                                     flags, sap, OBJF_SHARED,
+                                                     NULL);
+             so->objfile->addr_low = so->addr_low;
+             free_section_addr_info (sap);
+           }
 
          so->symbols_loaded = 1;
        }
@@ -1454,16 +1514,16 @@ show_auto_solib_add (struct ui_file *file, int from_tty,
 /* Handler for library-specific lookup of global symbol NAME in OBJFILE.  Call
    the library-specific handler if it is installed for the current target.  */
 
-struct symbol *
+struct block_symbol
 solib_global_lookup (struct objfile *objfile,
                     const char *name,
                     const domain_enum domain)
 {
-  const struct target_so_ops *ops = solib_ops (get_objfile_arch (objfile));
+  const struct target_so_ops *ops = solib_ops (target_gdbarch ());
 
   if (ops->lookup_lib_global_symbol != NULL)
     return ops->lookup_lib_global_symbol (objfile, name, domain);
-  return NULL;
+  return (struct block_symbol) {NULL, NULL};
 }
 
 /* Lookup the value for a specific symbol from dynamic symbol table.  Look
@@ -1473,8 +1533,9 @@ solib_global_lookup (struct objfile *objfile,
 
 CORE_ADDR
 gdb_bfd_lookup_symbol_from_symtab (bfd *abfd,
-                                  int (*match_sym) (asymbol *, void *),
-                                  void *data)
+                                  int (*match_sym) (const asymbol *,
+                                                    const void *),
+                                  const void *data)
 {
   long storage_needed = bfd_get_symtab_upper_bound (abfd);
   CORE_ADDR symaddr = 0;
@@ -1532,8 +1593,9 @@ gdb_bfd_lookup_symbol_from_symtab (bfd *abfd,
 
 static CORE_ADDR
 bfd_lookup_symbol_from_dyn_symtab (bfd *abfd,
-                                  int (*match_sym) (asymbol *, void *),
-                                  void *data)
+                                  int (*match_sym) (const asymbol *,
+                                                    const void *),
+                                  const void *data)
 {
   long storage_needed = bfd_get_dynamic_symtab_upper_bound (abfd);
   CORE_ADDR symaddr = 0;
@@ -1570,8 +1632,8 @@ bfd_lookup_symbol_from_dyn_symtab (bfd *abfd,
 
 CORE_ADDR
 gdb_bfd_lookup_symbol (bfd *abfd,
-                      int (*match_sym) (asymbol *, void *),
-                      void *data)
+                      int (*match_sym) (const asymbol *, const void *),
+                      const void *data)
 {
   CORE_ADDR symaddr = gdb_bfd_lookup_symbol_from_symtab (abfd, match_sym, data);
 
@@ -1613,6 +1675,7 @@ _initialize_solib (void)
           _("Load shared object library symbols for files matching REGEXP."));
   add_info ("sharedlibrary", info_sharedlibrary_command,
            _("Status of loaded shared object libraries."));
+  add_info_alias ("dll", "sharedlibrary", 1);
   add_com ("nosharedlibrary", class_files, no_shared_libraries,
           _("Unload all shared object library symbols."));
 
This page took 0.042837 seconds and 4 git commands to generate.