gcore, handle exited threads better
[deliverable/binutils-gdb.git] / binutils / arsup.c
index b3e967243aa72182c65455af646d04e89d0fe465..a668f270f1a11c3cbc0c77be6419910ece47de7b 100644 (file)
@@ -1,12 +1,11 @@
 /* arsup.c - Archive support for MRI compatibility
 /* arsup.c - Archive support for MRI compatibility
-   Copyright 1992, 1994, 1995, 1996, 1997, 2000, 2002
-   Free Software Foundation, Inc.
+   Copyright (C) 1992-2020 Free Software Foundation, Inc.
 
    This file is part of GNU Binutils.
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
 
    This file is part of GNU Binutils.
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
+   the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
@@ -16,7 +15,8 @@
 
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
 
    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.  */
 
 
 /* Contributed by Steve Chamberlain
 
 
 /* Contributed by Steve Chamberlain
    This file looks after requests from arparse.y, to provide the MRI
    style librarian command syntax + 1 word LIST.  */
 
    This file looks after requests from arparse.y, to provide the MRI
    style librarian command syntax + 1 word LIST.  */
 
+#include "sysdep.h"
 #include "bfd.h"
 #include "bfd.h"
-#include "arsup.h"
 #include "libiberty.h"
 #include "libiberty.h"
-#include "bucomm.h"
 #include "filenames.h"
 #include "filenames.h"
+#include "bucomm.h"
+#include "arsup.h"
 
 static void map_over_list
 
 static void map_over_list
-  PARAMS ((bfd *, void (*function) (bfd *, bfd *), struct list *));
-static void ar_directory_doer PARAMS ((bfd *, bfd *));
-static void ar_addlib_doer PARAMS ((bfd *, bfd *));
+  (bfd *, void (*function) (bfd *, bfd *), struct list *);
+static void ar_directory_doer (bfd *, bfd *);
+static void ar_addlib_doer (bfd *, bfd *);
 
 extern int verbose;
 
 extern int verbose;
+extern int deterministic;
+
+static bfd *obfd;
+static char *real_name;
+static FILE *outfile;
 
 static void
 
 static void
-map_over_list (arch, function, list)
-     bfd *arch;
-     void (*function) PARAMS ((bfd *, bfd *));
-     struct list *list;
+map_over_list (bfd *arch, void (*function) (bfd *, bfd *), struct list *list)
 {
   bfd *head;
 
 {
   bfd *head;
 
@@ -50,10 +53,10 @@ map_over_list (arch, function, list)
     {
       bfd *next;
 
     {
       bfd *next;
 
-      head = arch->next;
+      head = arch->archive_next;
       while (head != NULL)
        {
       while (head != NULL)
        {
-         next = head->next;
+         next = head->archive_next;
          function (head, (bfd *) NULL);
          head = next;
        }
          function (head, (bfd *) NULL);
          head = next;
        }
@@ -72,10 +75,10 @@ map_over_list (arch, function, list)
          bfd_boolean found = FALSE;
          bfd *prev = arch;
 
          bfd_boolean found = FALSE;
          bfd *prev = arch;
 
-         for (head = arch->next; head; head = head->next)
+         for (head = arch->archive_next; head; head = head->archive_next)
            {
            {
-             if (head->filename != NULL
-                 && FILENAME_CMP (ptr->name, head->filename) == 0)
+             if (bfd_get_filename (head) != NULL
+                 && FILENAME_CMP (ptr->name, bfd_get_filename (head)) == 0)
                {
                  found = TRUE;
                  function (head, prev);
                {
                  found = TRUE;
                  function (head, prev);
@@ -89,21 +92,15 @@ map_over_list (arch, function, list)
 }
 
 
 }
 
 
-FILE *outfile;
 
 static void
 
 static void
-ar_directory_doer (abfd, ignore)
-     bfd *abfd;
-     bfd *ignore ATTRIBUTE_UNUSED;
+ar_directory_doer (bfd *abfd, bfd *ignore ATTRIBUTE_UNUSED)
 {
 {
-  print_arelt_descr(outfile, abfd, verbose);
+  print_arelt_descr(outfile, abfd, verbose, FALSE);
 }
 
 void
 }
 
 void
-ar_directory (ar_name, list, output)
-     char *ar_name;
-     struct list *list;
-     char *output;
+ar_directory (char *ar_name, struct list *list, char *output)
 {
   bfd *arch;
 
 {
   bfd *arch;
 
@@ -130,7 +127,7 @@ ar_directory (ar_name, list, output)
 }
 
 void
 }
 
 void
-DEFUN_VOID(prompt)
+prompt (void)
 {
   extern int interactive;
 
 {
   extern int interactive;
 
@@ -142,28 +139,30 @@ DEFUN_VOID(prompt)
 }
 
 void
 }
 
 void
-maybequit ()
+maybequit (void)
 {
   if (! interactive)
     xexit (9);
 }
 
 
 {
   if (! interactive)
     xexit (9);
 }
 
 
-bfd *obfd;
-char *real_name;
-
 void
 void
-ar_open (name, t)
-  char *name;
-  int t;
+ar_open (char *name, int t)
 {
 {
-  char *tname = (char *) xmalloc (strlen (name) + 10);
+  char *tname;
   const char *bname = lbasename (name);
   real_name = name;
 
   /* Prepend tmp- to the beginning, to avoid file-name clashes after
      truncation on filesystems with limited namespaces (DOS).  */
   const char *bname = lbasename (name);
   real_name = name;
 
   /* Prepend tmp- to the beginning, to avoid file-name clashes after
      truncation on filesystems with limited namespaces (DOS).  */
-  sprintf (tname, "%.*stmp-%s", (int) (bname - name), name, bname);
+  if (asprintf (&tname, "%.*stmp-%s", (int) (bname - name), name, bname) == -1)
+    {
+      fprintf (stderr, _("%s: Can't allocate memory for temp name (%s)\n"),
+              program_name, strerror(errno));
+      maybequit ();
+      return;
+    }
+
   obfd = bfd_openw (tname, NULL);
 
   if (!obfd)
   obfd = bfd_openw (tname, NULL);
 
   if (!obfd)
@@ -207,7 +206,7 @@ ar_open (name, t)
          while (element)
            {
              *ptr = element;
          while (element)
            {
              *ptr = element;
-             ptr = &element->next;
+             ptr = &element->archive_next;
              element = bfd_openr_next_archived_file (ibfd, element);
            }
        }
              element = bfd_openr_next_archived_file (ibfd, element);
            }
        }
@@ -215,26 +214,23 @@ ar_open (name, t)
       bfd_set_format (obfd, bfd_archive);
 
       obfd->has_armap = 1;
       bfd_set_format (obfd, bfd_archive);
 
       obfd->has_armap = 1;
+      obfd->is_thin_archive = 0;
     }
 }
 
 static void
     }
 }
 
 static void
-ar_addlib_doer (abfd, prev)
-     bfd *abfd;
-     bfd *prev;
+ar_addlib_doer (bfd *abfd, bfd *prev)
 {
   /* Add this module to the output bfd.  */
   if (prev != NULL)
 {
   /* Add this module to the output bfd.  */
   if (prev != NULL)
-    prev->next = abfd->next;
+    prev->archive_next = abfd->archive_next;
 
 
-  abfd->next = obfd->archive_head;
+  abfd->archive_next = obfd->archive_head;
   obfd->archive_head = abfd;
 }
 
 void
   obfd->archive_head = abfd;
 }
 
 void
-ar_addlib (name, list)
-     char *name;
-     struct list *list;
+ar_addlib (char *name, struct list *list)
 {
   if (obfd == NULL)
     {
 {
   if (obfd == NULL)
     {
@@ -249,13 +245,12 @@ ar_addlib (name, list)
       if (arch != NULL)
        map_over_list (arch, ar_addlib_doer, list);
 
       if (arch != NULL)
        map_over_list (arch, ar_addlib_doer, list);
 
-      /* Don't close the bfd, since it will make the elements disasppear.  */
+      /* Don't close the bfd, since it will make the elements disappear.  */
     }
 }
 
 void
     }
 }
 
 void
-ar_addmod (list)
-     struct list *list;
+ar_addmod (struct list *list)
 {
   if (!obfd)
     {
 {
   if (!obfd)
     {
@@ -266,8 +261,13 @@ ar_addmod (list)
     {
       while (list)
        {
     {
       while (list)
        {
-         bfd *abfd = bfd_openr (list->name, NULL);
+         bfd *abfd;
 
 
+#if BFD_SUPPORTS_PLUGINS         
+         abfd = bfd_openr (list->name, "plugin");
+#else
+         abfd = bfd_openr (list->name, NULL);
+#endif
          if (!abfd)
            {
              fprintf (stderr, _("%s: can't open file %s\n"),
          if (!abfd)
            {
              fprintf (stderr, _("%s: can't open file %s\n"),
@@ -276,7 +276,7 @@ ar_addmod (list)
            }
          else
            {
            }
          else
            {
-             abfd->next = obfd->archive_head;
+             abfd->archive_next = obfd->archive_head;
              obfd->archive_head = abfd;
            }
          list = list->next;
              obfd->archive_head = abfd;
            }
          list = list->next;
@@ -286,15 +286,14 @@ ar_addmod (list)
 
 
 void
 
 
 void
-ar_clear ()
+ar_clear (void)
 {
   if (obfd)
     obfd->archive_head = 0;
 }
 
 void
 {
   if (obfd)
     obfd->archive_head = 0;
 }
 
 void
-ar_delete (list)
-     struct list *list;
+ar_delete (struct list *list)
 {
   if (!obfd)
     {
 {
   if (!obfd)
     {
@@ -312,15 +311,15 @@ ar_delete (list)
 
          while (member)
            {
 
          while (member)
            {
-             if (FILENAME_CMP(member->filename, list->name) == 0)
+             if (FILENAME_CMP (bfd_get_filename (member), list->name) == 0)
                {
                {
-                 *prev = member->next;
+                 *prev = member->archive_next;
                  found = 1;
                }
              else
                  found = 1;
                }
              else
-               prev = &(member->next);
+               prev = &(member->archive_next);
 
 
-             member = member->next;
+             member = member->archive_next;
            }
 
          if (!found)
            }
 
          if (!found)
@@ -336,7 +335,7 @@ ar_delete (list)
 }
 
 void
 }
 
 void
-ar_save ()
+ar_save (void)
 {
   if (!obfd)
     {
 {
   if (!obfd)
     {
@@ -347,17 +346,19 @@ ar_save ()
     {
       char *ofilename = xstrdup (bfd_get_filename (obfd));
 
     {
       char *ofilename = xstrdup (bfd_get_filename (obfd));
 
+      if (deterministic > 0)
+        obfd->flags |= BFD_DETERMINISTIC_OUTPUT;
+
       bfd_close (obfd);
 
       bfd_close (obfd);
 
-      rename (ofilename, real_name);
+      smart_rename (ofilename, real_name, 0);
       obfd = 0;
       free (ofilename);
     }
 }
 
 void
       obfd = 0;
       free (ofilename);
     }
 }
 
 void
-ar_replace (list)
-     struct list *list;
+ar_replace (struct list *list)
 {
   if (!obfd)
     {
 {
   if (!obfd)
     {
@@ -375,10 +376,10 @@ ar_replace (list)
 
          while (member)
            {
 
          while (member)
            {
-             if (FILENAME_CMP (member->filename, list->name) == 0)
+             if (FILENAME_CMP (bfd_get_filename (member), list->name) == 0)
                {
                  /* Found the one to replace.  */
                {
                  /* Found the one to replace.  */
-                 bfd *abfd = bfd_openr (list->name, 0);
+                 bfd *abfd = bfd_openr (list->name, NULL);
 
                  if (!abfd)
                    {
 
                  if (!abfd)
                    {
@@ -389,20 +390,20 @@ ar_replace (list)
                  else
                    {
                      *prev = abfd;
                  else
                    {
                      *prev = abfd;
-                     abfd->next = member->next;
+                     abfd->archive_next = member->archive_next;
                      found = 1;
                    }
                }
              else
                {
                      found = 1;
                    }
                }
              else
                {
-                 prev = &(member->next);
+                 prev = &(member->archive_next);
                }
                }
-             member = member->next;
+             member = member->archive_next;
            }
 
          if (!found)
            {
            }
 
          if (!found)
            {
-             bfd *abfd = bfd_openr (list->name, 0);
+             bfd *abfd = bfd_openr (list->name, NULL);
 
              fprintf (stderr,_("%s: can't find module file %s\n"),
                       program_name, list->name);
 
              fprintf (stderr,_("%s: can't find module file %s\n"),
                       program_name, list->name);
@@ -423,7 +424,7 @@ ar_replace (list)
 
 /* And I added this one.  */
 void
 
 /* And I added this one.  */
 void
-ar_list ()
+ar_list (void)
 {
   if (!obfd)
     {
 {
   if (!obfd)
     {
@@ -440,24 +441,23 @@ ar_list ()
 
       for (abfd = obfd->archive_head;
           abfd != (bfd *)NULL;
 
       for (abfd = obfd->archive_head;
           abfd != (bfd *)NULL;
-          abfd = abfd->next)
+          abfd = abfd->archive_next)
        ar_directory_doer (abfd, (bfd *) NULL);
     }
 }
 
 void
        ar_directory_doer (abfd, (bfd *) NULL);
     }
 }
 
 void
-ar_end ()
+ar_end (void)
 {
   if (obfd)
     {
 {
   if (obfd)
     {
-      fclose ((FILE *)(obfd->iostream));
+      bfd_cache_close (obfd);
       unlink (bfd_get_filename (obfd));
     }
 }
 
 void
       unlink (bfd_get_filename (obfd));
     }
 }
 
 void
-ar_extract (list)
-     struct list *list;
+ar_extract (struct list *list)
 {
   if (!obfd)
     {
 {
   if (!obfd)
     {
@@ -474,18 +474,18 @@ ar_extract (list)
 
          while (member && !found)
            {
 
          while (member && !found)
            {
-             if (FILENAME_CMP (member->filename, list->name) == 0)
+             if (FILENAME_CMP (bfd_get_filename (member), list->name) == 0)
                {
                  extract_file (member);
                  found = 1;
                }
 
                {
                  extract_file (member);
                  found = 1;
                }
 
-             member = member->next;
+             member = member->archive_next;
            }
 
          if (!found)
            {
            }
 
          if (!found)
            {
-             bfd_openr (list->name, 0);
+             bfd_openr (list->name, NULL);
              fprintf (stderr, _("%s: can't find module file %s\n"),
                       program_name, list->name);
            }
              fprintf (stderr, _("%s: can't find module file %s\n"),
                       program_name, list->name);
            }
This page took 0.068435 seconds and 4 git commands to generate.