X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=binutils%2Fbinemul.c;h=7c71b5b78c1a25116862696b7dee536f377e1c7d;hb=975f8708de015fb2b813edbf8b714f4777c57a41;hp=74e5d9c38497d8e928c9d293af85b9440dd01b6c;hpb=a8da6403829d6f87867da6a737dfdaa736a37dfa;p=deliverable%2Fbinutils-gdb.git diff --git a/binutils/binemul.c b/binutils/binemul.c index 74e5d9c384..7c71b5b78c 100644 --- a/binutils/binemul.c +++ b/binutils/binemul.c @@ -1,5 +1,5 @@ /* Binutils emulation layer. - Copyright 2002, 2003, 2007, 2008 Free Software Foundation, Inc. + Copyright (C) 2002-2020 Free Software Foundation, Inc. Written by Tom Rix, Red Hat Inc. This file is part of GNU Binutils. @@ -39,20 +39,27 @@ ar_emul_default_usage (FILE *fp) } bfd_boolean -ar_emul_append (bfd **after_bfd, char *file_name, bfd_boolean verbose, - bfd_boolean flatten) +ar_emul_append (bfd **after_bfd, char *file_name, const char *target, + bfd_boolean verbose, bfd_boolean flatten) { if (bin_dummy_emulation.ar_append) - return bin_dummy_emulation.ar_append (after_bfd, file_name, verbose, - flatten); + return bin_dummy_emulation.ar_append (after_bfd, file_name, target, + verbose, flatten); return FALSE; } static bfd_boolean -do_ar_emul_default_append (bfd **after_bfd, bfd *new_bfd, - bfd_boolean verbose, bfd_boolean flatten) - { +any_ok (bfd *new_bfd ATTRIBUTE_UNUSED) +{ + return TRUE; +} + +bfd_boolean +do_ar_emul_append (bfd **after_bfd, bfd *new_bfd, + bfd_boolean verbose, bfd_boolean flatten, + bfd_boolean (*check) (bfd *)) +{ /* When flattening, add the members of an archive instead of the archive itself. */ if (flatten && bfd_check_format (new_bfd, bfd_archive)) @@ -64,7 +71,7 @@ do_ar_emul_default_append (bfd **after_bfd, bfd *new_bfd, elt; elt = bfd_openr_next_archived_file (new_bfd, elt)) { - if (do_ar_emul_default_append (after_bfd, elt, verbose, TRUE)) + if (do_ar_emul_append (after_bfd, elt, verbose, TRUE, check)) { added = TRUE; after_bfd = &((*after_bfd)->archive_next); @@ -74,7 +81,10 @@ do_ar_emul_default_append (bfd **after_bfd, bfd *new_bfd, return added; } - AR_EMUL_APPEND_PRINT_VERBOSE (verbose, new_bfd->filename); + if (!check (new_bfd)) + return FALSE; + + AR_EMUL_APPEND_PRINT_VERBOSE (verbose, bfd_get_filename (new_bfd)); new_bfd->archive_next = *after_bfd; *after_bfd = new_bfd; @@ -84,37 +94,40 @@ do_ar_emul_default_append (bfd **after_bfd, bfd *new_bfd, bfd_boolean ar_emul_default_append (bfd **after_bfd, char *file_name, - bfd_boolean verbose, bfd_boolean flatten) + const char *target, bfd_boolean verbose, + bfd_boolean flatten) { bfd *new_bfd; - new_bfd = bfd_openr (file_name, NULL); + new_bfd = bfd_openr (file_name, target); AR_EMUL_ELEMENT_CHECK (new_bfd, file_name); - return do_ar_emul_default_append (after_bfd, new_bfd, verbose, flatten); + return do_ar_emul_append (after_bfd, new_bfd, verbose, flatten, any_ok); } bfd_boolean -ar_emul_replace (bfd **after_bfd, char *file_name, bfd_boolean verbose) +ar_emul_replace (bfd **after_bfd, char *file_name, const char *target, + bfd_boolean verbose) { if (bin_dummy_emulation.ar_replace) - return bin_dummy_emulation.ar_replace (after_bfd, file_name, verbose); + return bin_dummy_emulation.ar_replace (after_bfd, file_name, + target, verbose); return FALSE; } bfd_boolean ar_emul_default_replace (bfd **after_bfd, char *file_name, - bfd_boolean verbose) + const char *target, bfd_boolean verbose) { - bfd *temp; + bfd *new_bfd; - temp = *after_bfd; - *after_bfd = bfd_openr (file_name, NULL); + new_bfd = bfd_openr (file_name, target); + AR_EMUL_ELEMENT_CHECK (new_bfd, file_name); - AR_EMUL_ELEMENT_CHECK (*after_bfd, file_name); AR_EMUL_REPLACE_PRINT_VERBOSE (verbose, file_name); - (*after_bfd)->archive_next = temp; + new_bfd->archive_next = *after_bfd; + *after_bfd = new_bfd; return TRUE; }