X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=binutils%2Fbinemul.c;h=894a915716ce39eaec167e93f2c7ad8346c15f99;hb=660df28acfa1b58c978d65d9cb26d37023f791ce;hp=35587db26bebdcf368c40c1e60c111d095685c3d;hpb=492d5973f09a803b6829c5c7d0dde6ea0c77fbfd;p=deliverable%2Fbinutils-gdb.git diff --git a/binutils/binemul.c b/binutils/binemul.c index 35587db26b..894a915716 100644 --- a/binutils/binemul.c +++ b/binutils/binemul.c @@ -1,5 +1,5 @@ /* Binutils emulation layer. - Copyright 2002, 2003, 2005, 2007, 2008 Free Software Foundation, Inc. + Copyright (C) 2002-2019 Free Software Foundation, Inc. Written by Tom Rix, Red Hat Inc. This file is part of GNU Binutils. @@ -50,9 +50,16 @@ ar_emul_append (bfd **after_bfd, char *file_name, const char *target, } 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,6 +81,9 @@ do_ar_emul_default_append (bfd **after_bfd, bfd *new_bfd, return added; } + if (!check (new_bfd)) + return FALSE; + AR_EMUL_APPEND_PRINT_VERBOSE (verbose, new_bfd->filename); new_bfd->archive_next = *after_bfd; @@ -91,7 +101,7 @@ ar_emul_default_append (bfd **after_bfd, char *file_name, 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 @@ -109,15 +119,15 @@ bfd_boolean ar_emul_default_replace (bfd **after_bfd, char *file_name, const char *target, bfd_boolean verbose) { - bfd *temp; + bfd *new_bfd; - temp = *after_bfd; - *after_bfd = bfd_openr (file_name, target); + 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; }