X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=binutils%2Farsup.c;h=a668f270f1a11c3cbc0c77be6419910ece47de7b;hb=3922b302645fda04da42a5279399578ae2f6206c;hp=9ddc55d64a32d86f62da046dbae61a7ab248549a;hpb=aa820537ead0135a7c38c619039dce8a6fc74ed1;p=deliverable%2Fbinutils-gdb.git diff --git a/binutils/arsup.c b/binutils/arsup.c index 9ddc55d64a..a668f270f1 100644 --- a/binutils/arsup.c +++ b/binutils/arsup.c @@ -1,6 +1,5 @@ /* arsup.c - Archive support for MRI compatibility - Copyright 1992, 1994, 1995, 1996, 1997, 1999, 2000, 2001, 2002, 2003, - 2004, 2005, 2007, 2008 Free Software Foundation, Inc. + Copyright (C) 1992-2020 Free Software Foundation, Inc. This file is part of GNU Binutils. @@ -39,6 +38,7 @@ static void ar_directory_doer (bfd *, bfd *); static void ar_addlib_doer (bfd *, bfd *); extern int verbose; +extern int deterministic; static bfd *obfd; static char *real_name; @@ -77,8 +77,8 @@ map_over_list (bfd *arch, void (*function) (bfd *, bfd *), struct list *list) 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); @@ -96,7 +96,7 @@ map_over_list (bfd *arch, void (*function) (bfd *, bfd *), struct list *list) static void ar_directory_doer (bfd *abfd, bfd *ignore ATTRIBUTE_UNUSED) { - print_arelt_descr(outfile, abfd, verbose); + print_arelt_descr(outfile, abfd, verbose, FALSE); } void @@ -149,13 +149,20 @@ maybequit (void) void 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). */ - 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) @@ -254,8 +261,13 @@ ar_addmod (struct list *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"), @@ -299,7 +311,7 @@ ar_delete (struct list *list) while (member) { - if (FILENAME_CMP(member->filename, list->name) == 0) + if (FILENAME_CMP (bfd_get_filename (member), list->name) == 0) { *prev = member->archive_next; found = 1; @@ -334,6 +346,9 @@ ar_save (void) { char *ofilename = xstrdup (bfd_get_filename (obfd)); + if (deterministic > 0) + obfd->flags |= BFD_DETERMINISTIC_OUTPUT; + bfd_close (obfd); smart_rename (ofilename, real_name, 0); @@ -361,10 +376,10 @@ ar_replace (struct list *list) 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. */ - bfd *abfd = bfd_openr (list->name, 0); + bfd *abfd = bfd_openr (list->name, NULL); if (!abfd) { @@ -388,7 +403,7 @@ ar_replace (struct list *list) 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); @@ -459,7 +474,7 @@ ar_extract (struct list *list) 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; @@ -470,7 +485,7 @@ ar_extract (struct list *list) 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); }