1 /* Binutils emulation layer. 2 Copyright (C) 2002-2025 Free Software Foundation, Inc. 3 Written by Tom Rix, Red Hat Inc. 4 5 This file is part of GNU Binutils. 6 7 This program is free software; you can redistribute it and/or modify 8 it under the terms of the GNU General Public License as published by 9 the Free Software Foundation; either version 3 of the License, or 10 (at your option) any later version. 11 12 This program is distributed in the hope that it will be useful, 13 but WITHOUT ANY WARRANTY; without even the implied warranty of 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 GNU General Public License for more details. 16 17 You should have received a copy of the GNU General Public License 18 along with this program; if not, write to the Free Software 19 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, 20 MA 02110-1301, USA. */ 21 22 #include "binemul.h" 23 24 extern bin_emulation_xfer_type bin_dummy_emulation; 25 26 void 27 ar_emul_usage (FILE *fp) 28 { 29 if (bin_dummy_emulation.ar_usage) 30 bin_dummy_emulation.ar_usage (fp); 31 } 32 33 void 34 ar_emul_default_usage (FILE *fp) 35 { 36 AR_EMUL_USAGE_PRINT_OPTION_HEADER (fp); 37 /* xgettext:c-format */ 38 fprintf (fp, _(" No emulation specific options\n")); 39 } 40 41 bool 42 ar_emul_append (bfd **after_bfd, char *file_name, const char *target, 43 bool verbose, bool flatten) 44 { 45 bfd *new_bfd; 46 47 new_bfd = bfd_openr (file_name, target); 48 AR_EMUL_ELEMENT_CHECK (new_bfd, file_name); 49 if (bin_dummy_emulation.ar_append) 50 return bin_dummy_emulation.ar_append (after_bfd, new_bfd, 51 verbose, flatten); 52 53 return false; 54 } 55 56 bool 57 ar_emul_append_bfd (bfd **after_bfd, bfd *new_bfd, 58 bool verbose, bool flatten) 59 { 60 if (bin_dummy_emulation.ar_append) 61 return bin_dummy_emulation.ar_append (after_bfd, new_bfd, 62 verbose, flatten); 63 64 return false; 65 } 66 67 static bool 68 any_ok (bfd *new_bfd ATTRIBUTE_UNUSED) 69 { 70 return true; 71 } 72 73 bool 74 do_ar_emul_append (bfd **after_bfd, bfd *new_bfd, 75 bool verbose, bool flatten, 76 bool (*check) (bfd *)) 77 { 78 /* When flattening, add the members of an archive instead of the 79 archive itself. */ 80 if (flatten && bfd_check_format (new_bfd, bfd_archive)) 81 { 82 bfd *elt; 83 bool added = false; 84 85 for (elt = bfd_openr_next_archived_file (new_bfd, NULL); 86 elt; 87 elt = bfd_openr_next_archived_file (new_bfd, elt)) 88 { 89 if (do_ar_emul_append (after_bfd, elt, verbose, true, check)) 90 { 91 added = true; 92 after_bfd = &((*after_bfd)->archive_next); 93 } 94 } 95 96 return added; 97 } 98 99 if (!check (new_bfd)) 100 return false; 101 102 AR_EMUL_APPEND_PRINT_VERBOSE (verbose, bfd_get_filename (new_bfd)); 103 104 new_bfd->archive_next = *after_bfd; 105 *after_bfd = new_bfd; 106 107 return true; 108 } 109 110 bool 111 ar_emul_default_append (bfd **after_bfd, bfd *new_bfd, 112 bool verbose, bool flatten) 113 { 114 return do_ar_emul_append (after_bfd, new_bfd, verbose, flatten, any_ok); 115 } 116 117 bool 118 ar_emul_replace (bfd **after_bfd, char *file_name, const char *target, 119 bool verbose) 120 { 121 bfd *new_bfd; 122 123 new_bfd = bfd_openr (file_name, target); 124 AR_EMUL_ELEMENT_CHECK (new_bfd, file_name); 125 126 if (bin_dummy_emulation.ar_replace) 127 return bin_dummy_emulation.ar_replace (after_bfd, new_bfd, 128 verbose); 129 130 return false; 131 } 132 133 bool 134 ar_emul_replace_bfd (bfd **after_bfd, bfd *new_bfd, 135 bool verbose) 136 { 137 if (bin_dummy_emulation.ar_replace) 138 return bin_dummy_emulation.ar_replace (after_bfd, new_bfd, 139 verbose); 140 141 return false; 142 } 143 144 bool 145 ar_emul_default_replace (bfd **after_bfd, bfd *new_bfd, 146 bool verbose) 147 { 148 AR_EMUL_REPLACE_PRINT_VERBOSE (verbose, bfd_get_filename (new_bfd)); 149 150 new_bfd->archive_next = *after_bfd; 151 *after_bfd = new_bfd; 152 153 return true; 154 } 155 156 bool 157 ar_emul_parse_arg (char *arg) 158 { 159 if (bin_dummy_emulation.ar_parse_arg) 160 return bin_dummy_emulation.ar_parse_arg (arg); 161 162 return false; 163 } 164 165 bool 166 ar_emul_default_parse_arg (char *arg ATTRIBUTE_UNUSED) 167 { 168 return false; 169 } 170