diff options
Diffstat (limited to 'binutils/binemul.c')
-rw-r--r-- | binutils/binemul.c | 57 |
1 files changed, 43 insertions, 14 deletions
diff --git a/binutils/binemul.c b/binutils/binemul.c index 0eb1c816c1a..74e5d9c3849 100644 --- a/binutils/binemul.c +++ b/binutils/binemul.c @@ -1,5 +1,5 @@ /* Binutils emulation layer. - Copyright 2002, 2003, 2007 Free Software Foundation, Inc. + Copyright 2002, 2003, 2007, 2008 Free Software Foundation, Inc. Written by Tom Rix, Red Hat Inc. This file is part of GNU Binutils. @@ -39,29 +39,58 @@ ar_emul_default_usage (FILE *fp) } bfd_boolean -ar_emul_append (bfd **after_bfd, char *file_name, bfd_boolean verbose) +ar_emul_append (bfd **after_bfd, char *file_name, bfd_boolean verbose, + bfd_boolean flatten) { if (bin_dummy_emulation.ar_append) - return bin_dummy_emulation.ar_append (after_bfd, file_name, verbose); + return bin_dummy_emulation.ar_append (after_bfd, file_name, verbose, + flatten); return FALSE; } +static bfd_boolean +do_ar_emul_default_append (bfd **after_bfd, bfd *new_bfd, + bfd_boolean verbose, bfd_boolean flatten) + { + /* When flattening, add the members of an archive instead of the + archive itself. */ + if (flatten && bfd_check_format (new_bfd, bfd_archive)) + { + bfd *elt; + bfd_boolean added = FALSE; + + for (elt = bfd_openr_next_archived_file (new_bfd, NULL); + elt; + elt = bfd_openr_next_archived_file (new_bfd, elt)) + { + if (do_ar_emul_default_append (after_bfd, elt, verbose, TRUE)) + { + added = TRUE; + after_bfd = &((*after_bfd)->archive_next); + } + } + + return added; + } + + AR_EMUL_APPEND_PRINT_VERBOSE (verbose, new_bfd->filename); + + new_bfd->archive_next = *after_bfd; + *after_bfd = new_bfd; + + return TRUE; +} + bfd_boolean ar_emul_default_append (bfd **after_bfd, char *file_name, - bfd_boolean verbose) + bfd_boolean verbose, bfd_boolean flatten) { - bfd *temp; + bfd *new_bfd; - temp = *after_bfd; - *after_bfd = bfd_openr (file_name, NULL); - - AR_EMUL_ELEMENT_CHECK (*after_bfd, file_name); - AR_EMUL_APPEND_PRINT_VERBOSE (verbose, file_name); - - (*after_bfd)->archive_next = temp; - - return TRUE; + new_bfd = bfd_openr (file_name, NULL); + AR_EMUL_ELEMENT_CHECK (new_bfd, file_name); + return do_ar_emul_default_append (after_bfd, new_bfd, verbose, flatten); } bfd_boolean |