X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=binutils%2Far.c;h=aceb9d1384336a7190a9dcaf4fd0a1c85b25fbe0;hb=bcef180ccbeb8a6a9301065ede1fe038c3040fa5;hp=a5ae4f001a1d0efd502d4fe0e9f72f88473ac321;hpb=90b79792c01821d14248f4cf8c330a599fb5a4be;p=deliverable%2Fbinutils-gdb.git diff --git a/binutils/ar.c b/binutils/ar.c index a5ae4f001a..aceb9d1384 100644 --- a/binutils/ar.c +++ b/binutils/ar.c @@ -1,6 +1,6 @@ /* ar.c - Archive modify and extract. Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, - 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 + 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc. This file is part of GNU Binutils. @@ -37,7 +37,6 @@ #include "filenames.h" #include "binemul.h" #include "plugin.h" -#include #ifdef __GO32___ #define EXT_NAME_LEN 3 /* Bufflen of addition to name if it's MS-DOS. */ @@ -97,7 +96,7 @@ int write_armap = 0; /* Operate in deterministic mode: write zero for timestamps, uids, and gids for archive members and the archive symbol table, and write consistent file modes. */ -int deterministic = 0; +int deterministic = -1; /* Determinism indeterminate. */ /* Nonzero means it's the name of an existing member; position new or moved files with respect to this one. */ @@ -216,8 +215,8 @@ map_over_members (bfd *arch, void (*function)(bfd *), char **files, int count) filename = normalize (filename, arch); } - if ((filename != NULL) && - (!FILENAME_CMP (normalize (*files, arch), filename))) + if (filename != NULL + && !FILENAME_CMP (normalize (*files, arch), filename)) { ++match_count; if (counted_name_mode @@ -248,12 +247,17 @@ usage (int help) s = help ? stdout : stderr; - /* xgettext:c-format */ - const char * command_line = #if BFD_SUPPORTS_PLUGINS - _("Usage: %s [emulation options] [-]{dmpqrstx}[abcfilNoPsSuvV] [--plugin ] [member-name] [count] archive-file file...\n"); + /* xgettext:c-format */ + const char *command_line + = _("Usage: %s [emulation options] [-]{dmpqrstx}[abcDfilMNoPsSTuvV]" + " [--plugin ] [member-name] [count] archive-file file...\n"); + #else - _("Usage: %s [emulation options] [-]{dmpqrstx}[abcfilNoPsSuvV] [member-name] [count] archive-file file...\n"); + /* xgettext:c-format */ + const char *command_line + = _("Usage: %s [emulation options] [-]{dmpqrstx}[abcDfilMNoPsSTuvV]" + " [member-name] [count] archive-file file...\n"); #endif fprintf (s, command_line, program_name); @@ -271,7 +275,20 @@ usage (int help) fprintf (s, _(" command specific modifiers:\n")); fprintf (s, _(" [a] - put file(s) after [member-name]\n")); fprintf (s, _(" [b] - put file(s) before [member-name] (same as [i])\n")); - fprintf (s, _(" [D] - use zero for timestamps and uids/gids\n")); + if (DEFAULT_AR_DETERMINISTIC) + { + fprintf (s, _("\ + [D] - use zero for timestamps and uids/gids (default)\n")); + fprintf (s, _("\ + [U] - use actual timestamps and uids/gids\n")); + } + else + { + fprintf (s, _("\ + [D] - use zero for timestamps and uids/gids\n")); + fprintf (s, _("\ + [U] - use actual timestamps and uids/gids (default)\n")); + } fprintf (s, _(" [N] - use instance [count] of name\n")); fprintf (s, _(" [f] - truncate inserted file names\n")); fprintf (s, _(" [P] - use full path names when matching\n")); @@ -285,6 +302,7 @@ usage (int help) fprintf (s, _(" [v] - be verbose\n")); fprintf (s, _(" [V] - display the version number\n")); fprintf (s, _(" @ - read options from \n")); + fprintf (s, _(" --target=BFDNAME - specify the target object format as BFDNAME\n")); #if BFD_SUPPORTS_PLUGINS fprintf (s, _(" optional:\n")); fprintf (s, _(" --plugin

- load the specified plugin\n")); @@ -301,7 +319,7 @@ usage (int help) } static void -ranlib_usage(int help) +ranlib_usage (int help) { FILE *s; @@ -316,6 +334,14 @@ ranlib_usage(int help) fprintf (s, _("\ --plugin Load the specified plugin\n")); #endif + if (DEFAULT_AR_DETERMINISTIC) + fprintf (s, _("\ + -D Use zero for symbol map timestamp (default)\n\ + -U Use an actual symbol map timestamp\n")); + else + fprintf (s, _("\ + -D Use zero for symbol map timestamp\n\ + -U Use actual symbol map timestamp (default)\n")); fprintf (s, _("\ -t Update the archive's symbol map timestamp\n\ -h --help Print this help message\n\ @@ -378,7 +404,7 @@ remove_output (void) } static char ** -decode_options(int argc, char **argv) +decode_options (int argc, char **argv) { int c; @@ -427,7 +453,7 @@ decode_options(int argc, char **argv) argv = new_argv; } - while ((c = getopt_long (argc, argv, "hdmpqrstxabcfilNoPsSuvV", + while ((c = getopt_long (argc, argv, "hdmpqrtxlcoVsSuvabiMNfPTDU", long_options, NULL)) != EOF) { switch (c) @@ -524,6 +550,9 @@ decode_options(int argc, char **argv) case 'D': deterministic = TRUE; break; + case 'U': + deterministic = FALSE; + break; case OPTION_PLUGIN: #if BFD_SUPPORTS_PLUGINS plugin_target = "plugin"; @@ -539,8 +568,6 @@ decode_options(int argc, char **argv) case 0: /* A long option that just sets a flag. */ break; default: - /* xgettext:c-format */ - non_fatal (_("illegal option -- '%d'"), c); usage (0); } } @@ -548,17 +575,32 @@ decode_options(int argc, char **argv) return &argv[optind]; } +/* If neither -D nor -U was not specified explicitly, + then use the configured default. */ +static void +default_deterministic (void) +{ + if (deterministic < 0) + deterministic = DEFAULT_AR_DETERMINISTIC; +} + static void -ranlib_main(int argc, char **argv) +ranlib_main (int argc, char **argv) { int arg_index, status = 0; bfd_boolean touch = FALSE; int c; - while ((c = getopt_long (argc, argv, "hHvVt", long_options, NULL)) != EOF) + while ((c = getopt_long (argc, argv, "DhHUvVt", long_options, NULL)) != EOF) { switch (c) { + case 'D': + deterministic = TRUE; + break; + case 'U': + deterministic = FALSE; + break; case 'h': case 'H': show_help = 1; @@ -570,19 +612,32 @@ ranlib_main(int argc, char **argv) case 'V': show_version = 1; break; - } + + /* PR binutils/13493: Support plugins. */ + case OPTION_PLUGIN: +#if BFD_SUPPORTS_PLUGINS + plugin_target = "plugin"; + bfd_plugin_set_plugin (optarg); +#else + fprintf (stderr, _("sorry - this program has been built without plugin support\n")); + xexit (1); +#endif + break; + } } if (argc < 2) ranlib_usage (0); if (show_help) - usage(1); + ranlib_usage (1); if (show_version) print_version ("ranlib"); - arg_index = 1; + default_deterministic (); + + arg_index = optind; while (arg_index < argc) { @@ -596,9 +651,6 @@ ranlib_main(int argc, char **argv) xexit (status); } -/* The option parsing should be in its own function. - It will be when I have getopt working. */ - int main (int, char **); int @@ -652,21 +704,15 @@ main (int argc, char **argv) argc -= (i - 1); if (is_ranlib) - ranlib_main(argc, argv); - - if (argc == 2 && strcmp (argv[1], "-M") == 0) - { - mri_emul (); - xexit (0); - } + ranlib_main (argc, argv); if (argc < 2) usage (0); - argv = decode_options(argc, argv); + argv = decode_options (argc, argv); if (show_help) - usage(1); + usage (1); if (show_version) print_version ("ar"); @@ -700,8 +746,14 @@ main (int argc, char **argv) if (newer_only && operation != replace) fatal (_("`u' is only meaningful with the `r' option.")); - if (newer_only && deterministic) - fatal (_("`u' is not meaningful with the `D' option.")); + if (newer_only && deterministic > 0) + fatal (_("`u' is not meaningful with the `D' option.")); + + if (newer_only && deterministic < 0 && DEFAULT_AR_DETERMINISTIC) + non_fatal (_("\ +`u' modifier ignored since `D' is the default (see `U')")); + + default_deterministic (); if (postype != pos_default) posname = argv[arg_index++]; @@ -709,7 +761,7 @@ main (int argc, char **argv) if (counted_name_mode) { if (operation != extract && operation != del) - fatal (_("`N' is only meaningful with the `x' and `d' options.")); + fatal (_("`N' is only meaningful with the `x' and `d' options.")); counted_name_counter = atoi (argv[arg_index++]); if (counted_name_counter <= 0) fatal (_("Value for `N' must be positive.")); @@ -718,7 +770,7 @@ main (int argc, char **argv) inarch_filename = argv[arg_index++]; for (file_count = 0; argv[arg_index + file_count] != NULL; file_count++) - continue; + continue; files = (file_count > 0) ? argv + arg_index : NULL; @@ -750,11 +802,17 @@ main (int argc, char **argv) break; case move: - if (files != NULL) - move_members (arch, files); - else - output_filename = NULL; - break; + /* PR 12558: Creating and moving at the same time does + not make sense. Just create the archive instead. */ + if (! silent_create) + { + if (files != NULL) + move_members (arch, files); + else + output_filename = NULL; + break; + } + /* Fall through. */ case replace: case quick_append: @@ -800,8 +858,8 @@ open_inarch (const char *archive_filename, const char *file) stat() works just fine in v2.x, so I think this should be removed. For now, I enable it for DJGPP v2. -- EZ. */ -/* KLUDGE ALERT! Temporary fix until I figger why - stat() is wrong ... think it's buried in GO32's IDT - Jax */ + /* KLUDGE ALERT! Temporary fix until I figger why + stat() is wrong ... think it's buried in GO32's IDT - Jax */ if (errno != ENOENT) bfd_fatal (archive_filename); #endif @@ -814,9 +872,9 @@ open_inarch (const char *archive_filename, const char *file) return NULL; } - /* Try to figure out the target to use for the archive from the - first object on the list. */ - if (file != NULL) + /* If the target isn't set, try to figure out the target to use + for the archive from the first object on the list. */ + if (target == NULL && file != NULL) { bfd *obj; @@ -879,10 +937,11 @@ open_inarch (const char *archive_filename, const char *file) static void print_contents (bfd *abfd) { - size_t ncopied = 0; + bfd_size_type ncopied = 0; + bfd_size_type size; char *cbuf = (char *) xmalloc (BUFSIZE); struct stat buf; - size_t size; + if (bfd_stat_arch_elt (abfd, &buf) != 0) /* xgettext:c-format */ fatal (_("internal stat error on %s"), bfd_get_filename (abfd)); @@ -895,22 +954,22 @@ print_contents (bfd *abfd) size = buf.st_size; while (ncopied < size) { + bfd_size_type nread; + bfd_size_type tocopy = size - ncopied; - size_t nread; - size_t tocopy = size - ncopied; if (tocopy > BUFSIZE) tocopy = BUFSIZE; - nread = bfd_bread (cbuf, (bfd_size_type) tocopy, abfd); + nread = bfd_bread (cbuf, tocopy, abfd); if (nread != tocopy) /* xgettext:c-format */ fatal (_("%s is not a valid archive"), bfd_get_filename (bfd_my_archive (abfd))); - /* fwrite in mingw32 may return int instead of size_t. Cast the - return value to size_t to avoid comparison between signed and + /* fwrite in mingw32 may return int instead of bfd_size_type. Cast the + return value to bfd_size_type to avoid comparison between signed and unsigned values. */ - if ((size_t) fwrite (cbuf, 1, nread, stdout) != nread) + if ((bfd_size_type) fwrite (cbuf, 1, nread, stdout) != nread) fatal ("stdout: %s", strerror (errno)); ncopied += tocopy; } @@ -932,9 +991,9 @@ extract_file (bfd *abfd) { FILE *ostream; char *cbuf = (char *) xmalloc (BUFSIZE); - size_t nread, tocopy; - size_t ncopied = 0; - size_t size; + bfd_size_type nread, tocopy; + bfd_size_type ncopied = 0; + bfd_size_type size; struct stat buf; if (bfd_stat_arch_elt (abfd, &buf) != 0) @@ -969,7 +1028,7 @@ extract_file (bfd *abfd) if (tocopy > BUFSIZE) tocopy = BUFSIZE; - nread = bfd_bread (cbuf, (bfd_size_type) tocopy, abfd); + nread = bfd_bread (cbuf, tocopy, abfd); if (nread != tocopy) /* xgettext:c-format */ fatal (_("%s is not a valid archive"), @@ -991,10 +1050,10 @@ extract_file (bfd *abfd) output_file = ostream; } - /* fwrite in mingw32 may return int instead of size_t. Cast - the return value to size_t to avoid comparison between + /* fwrite in mingw32 may return int instead of bfd_size_type. Cast + the return value to bfd_size_type to avoid comparison between signed and unsigned values. */ - if ((size_t) fwrite (cbuf, 1, nread, ostream) != nread) + if ((bfd_size_type) fwrite (cbuf, 1, nread, ostream) != nread) fatal ("%s: %s", output_filename, strerror (errno)); ncopied += tocopy; } @@ -1030,7 +1089,7 @@ write_archive (bfd *iarch) new_name = make_tempname (old_name); if (new_name == NULL) - bfd_fatal ("could not create temporary file whilst writing archive"); + bfd_fatal (_("could not create temporary file whilst writing archive")); output_filename = new_name; @@ -1074,6 +1133,7 @@ write_archive (bfd *iarch) if (smart_rename (new_name, old_name, 0) != 0) xexit (1); + free (old_name); } /* Return a pointer to the pointer to the entry which should be rplacd'd @@ -1363,6 +1423,9 @@ ranlib_touch (const char *archname) /* xgettext:c-format */ fatal (_("%s: no archive map to update"), archname); + if (deterministic) + arch->flags |= BFD_DETERMINISTIC_OUTPUT; + bfd_update_armap_timestamp (arch); if (! bfd_close (arch))