1 1.1 skrll /* Generic BFD support for file formats. 2 1.1.1.12 christos Copyright (C) 1990-2026 Free Software Foundation, Inc. 3 1.1 skrll Written by Cygnus Support. 4 1.1 skrll 5 1.1 skrll This file is part of BFD, the Binary File Descriptor library. 6 1.1 skrll 7 1.1 skrll This program is free software; you can redistribute it and/or modify 8 1.1 skrll it under the terms of the GNU General Public License as published by 9 1.1 skrll the Free Software Foundation; either version 3 of the License, or 10 1.1 skrll (at your option) any later version. 11 1.1 skrll 12 1.1 skrll This program is distributed in the hope that it will be useful, 13 1.1 skrll but WITHOUT ANY WARRANTY; without even the implied warranty of 14 1.1 skrll MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 1.1 skrll GNU General Public License for more details. 16 1.1 skrll 17 1.1 skrll You should have received a copy of the GNU General Public License 18 1.1 skrll along with this program; if not, write to the Free Software 19 1.1 skrll Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, 20 1.1 skrll MA 02110-1301, USA. */ 21 1.1 skrll 22 1.1 skrll 23 1.1 skrll /* 24 1.1 skrll SECTION 25 1.1 skrll File formats 26 1.1 skrll 27 1.1 skrll A format is a BFD concept of high level file contents type. The 28 1.1 skrll formats supported by BFD are: 29 1.1 skrll 30 1.1 skrll o <<bfd_object>> 31 1.1 skrll 32 1.1 skrll The BFD may contain data, symbols, relocations and debug info. 33 1.1 skrll 34 1.1 skrll o <<bfd_archive>> 35 1.1 skrll 36 1.1 skrll The BFD contains other BFDs and an optional index. 37 1.1 skrll 38 1.1 skrll o <<bfd_core>> 39 1.1 skrll 40 1.1 skrll The BFD contains the result of an executable core dump. 41 1.1 skrll 42 1.1 skrll SUBSECTION 43 1.1 skrll File format functions 44 1.1 skrll */ 45 1.1 skrll 46 1.1 skrll #include "sysdep.h" 47 1.1 skrll #include "bfd.h" 48 1.1 skrll #include "libbfd.h" 49 1.1.1.11 christos #include "plugin.h" 50 1.1.1.12 christos #include "elf-bfd.h" 51 1.1 skrll 52 1.1 skrll /* IMPORT from targets.c. */ 53 1.1 skrll extern const size_t _bfd_target_vector_entries; 54 1.1 skrll 55 1.1 skrll /* 56 1.1 skrll FUNCTION 57 1.1.1.12 christos bfd_check_format 58 1.1 skrll 59 1.1 skrll SYNOPSIS 60 1.1.1.12 christos bool bfd_check_format (bfd *abfd, bfd_format format); 61 1.1 skrll 62 1.1 skrll DESCRIPTION 63 1.1 skrll Verify if the file attached to the BFD @var{abfd} is compatible 64 1.1 skrll with the format @var{format} (i.e., one of <<bfd_object>>, 65 1.1 skrll <<bfd_archive>> or <<bfd_core>>). 66 1.1 skrll 67 1.1 skrll If the BFD has been set to a specific target before the 68 1.1 skrll call, only the named target and format combination is 69 1.1 skrll checked. If the target has not been set, or has been set to 70 1.1 skrll <<default>>, then all the known target backends is 71 1.1 skrll interrogated to determine a match. If the default target 72 1.1 skrll matches, it is used. If not, exactly one target must recognize 73 1.1 skrll the file, or an error results. 74 1.1 skrll 75 1.1 skrll The function returns <<TRUE>> on success, otherwise <<FALSE>> 76 1.1 skrll with one of the following error codes: 77 1.1 skrll 78 1.1 skrll o <<bfd_error_invalid_operation>> - 79 1.1 skrll if <<format>> is not one of <<bfd_object>>, <<bfd_archive>> or 80 1.1 skrll <<bfd_core>>. 81 1.1 skrll 82 1.1 skrll o <<bfd_error_system_call>> - 83 1.1 skrll if an error occured during a read - even some file mismatches 84 1.1 skrll can cause bfd_error_system_calls. 85 1.1 skrll 86 1.1 skrll o <<file_not_recognised>> - 87 1.1 skrll none of the backends recognised the file format. 88 1.1 skrll 89 1.1 skrll o <<bfd_error_file_ambiguously_recognized>> - 90 1.1 skrll more than one backend recognised the file format. 91 1.1.1.11 christos 92 1.1.1.11 christos When calling bfd_check_format (or bfd_check_format_matches), 93 1.1.1.11 christos any underlying file descriptor will be kept open for the 94 1.1.1.11 christos duration of the call. This is done to avoid races when 95 1.1.1.11 christos another thread calls bfd_cache_close_all. In this scenario, 96 1.1.1.11 christos the thread calling bfd_check_format must call bfd_cache_close 97 1.1.1.11 christos itself. 98 1.1.1.11 christos */ 99 1.1.1.11 christos 100 1.1.1.11 christos bool 101 1.1 skrll bfd_check_format (bfd *abfd, bfd_format format) 102 1.1 skrll { 103 1.1.1.12 christos return bfd_check_format_matches (abfd, format, NULL); 104 1.1 skrll } 105 1.1 skrll 106 1.1.1.4 christos struct bfd_preserve 107 1.1.1.4 christos { 108 1.1.1.4 christos void *marker; 109 1.1.1.4 christos void *tdata; 110 1.1.1.4 christos flagword flags; 111 1.1.1.10 christos const struct bfd_iovec *iovec; 112 1.1.1.10 christos void *iostream; 113 1.1.1.4 christos const struct bfd_arch_info *arch_info; 114 1.1.1.10 christos const struct bfd_build_id *build_id; 115 1.1.1.10 christos bfd_cleanup cleanup; 116 1.1.1.4 christos struct bfd_section *sections; 117 1.1.1.4 christos struct bfd_section *section_last; 118 1.1.1.4 christos unsigned int section_count; 119 1.1.1.7 christos unsigned int section_id; 120 1.1.1.10 christos unsigned int symcount; 121 1.1.1.10 christos bool read_only; 122 1.1.1.10 christos bfd_vma start_address; 123 1.1.1.4 christos struct bfd_hash_table section_htab; 124 1.1.1.4 christos }; 125 1.1.1.4 christos 126 1.1.1.4 christos /* When testing an object for compatibility with a particular target 127 1.1.1.4 christos back-end, the back-end object_p function needs to set up certain 128 1.1.1.4 christos fields in the bfd on successfully recognizing the object. This 129 1.1.1.4 christos typically happens in a piecemeal fashion, with failures possible at 130 1.1.1.4 christos many points. On failure, the bfd is supposed to be restored to its 131 1.1.1.4 christos initial state, which is virtually impossible. However, restoring a 132 1.1.1.4 christos subset of the bfd state works in practice. This function stores 133 1.1.1.4 christos the subset. */ 134 1.1.1.4 christos 135 1.1.1.9 christos static bool 136 1.1.1.9 christos bfd_preserve_save (bfd *abfd, struct bfd_preserve *preserve, 137 1.1.1.9 christos bfd_cleanup cleanup) 138 1.1.1.4 christos { 139 1.1.1.4 christos preserve->tdata = abfd->tdata.any; 140 1.1.1.4 christos preserve->arch_info = abfd->arch_info; 141 1.1.1.4 christos preserve->flags = abfd->flags; 142 1.1.1.10 christos preserve->iovec = abfd->iovec; 143 1.1.1.10 christos preserve->iostream = abfd->iostream; 144 1.1.1.4 christos preserve->sections = abfd->sections; 145 1.1.1.4 christos preserve->section_last = abfd->section_last; 146 1.1.1.4 christos preserve->section_count = abfd->section_count; 147 1.1.1.7 christos preserve->section_id = _bfd_section_id; 148 1.1.1.10 christos preserve->symcount = abfd->symcount; 149 1.1.1.10 christos preserve->read_only = abfd->read_only; 150 1.1.1.10 christos preserve->start_address = abfd->start_address; 151 1.1.1.4 christos preserve->section_htab = abfd->section_htab; 152 1.1.1.4 christos preserve->marker = bfd_alloc (abfd, 1); 153 1.1.1.6 christos preserve->build_id = abfd->build_id; 154 1.1.1.9 christos preserve->cleanup = cleanup; 155 1.1.1.4 christos if (preserve->marker == NULL) 156 1.1.1.9 christos return false; 157 1.1.1.4 christos 158 1.1.1.4 christos return bfd_hash_table_init (&abfd->section_htab, bfd_section_hash_newfunc, 159 1.1.1.4 christos sizeof (struct section_hash_entry)); 160 1.1.1.4 christos } 161 1.1.1.4 christos 162 1.1.1.10 christos /* A back-end object_p function may flip a bfd from file backed to 163 1.1.1.10 christos in-memory, eg. pe_ILF_object_p. In that case to restore the 164 1.1.1.10 christos original IO state we need to reopen the file. Conversely, if we 165 1.1.1.10 christos are restoring a previously matched pe ILF format and have been 166 1.1.1.10 christos checking further target matches using file IO then we need to close 167 1.1.1.10 christos the file and detach the bfd from the cache lru list. */ 168 1.1.1.10 christos 169 1.1.1.10 christos static void 170 1.1.1.10 christos io_reinit (bfd *abfd, struct bfd_preserve *preserve) 171 1.1.1.10 christos { 172 1.1.1.10 christos if (abfd->iovec != preserve->iovec) 173 1.1.1.10 christos { 174 1.1.1.10 christos /* Handle file backed to in-memory transition. bfd_cache_close 175 1.1.1.10 christos won't do anything unless abfd->iovec is the cache_iovec. 176 1.1.1.10 christos Don't be tempted to call iovec->bclose here. We don't want 177 1.1.1.10 christos to call memory_bclose, which would free the bim. The bim 178 1.1.1.10 christos must be kept if bfd_check_format_matches is going to decide 179 1.1.1.10 christos later that the PE format needing it is in fact the correct 180 1.1.1.10 christos target match. */ 181 1.1.1.10 christos bfd_cache_close (abfd); 182 1.1.1.10 christos abfd->iovec = preserve->iovec; 183 1.1.1.10 christos abfd->iostream = preserve->iostream; 184 1.1.1.10 christos 185 1.1.1.10 christos /* Handle in-memory to file backed transition. */ 186 1.1.1.10 christos if ((abfd->flags & BFD_CLOSED_BY_CACHE) != 0 187 1.1.1.10 christos && (abfd->flags & BFD_IN_MEMORY) != 0 188 1.1.1.10 christos && (preserve->flags & BFD_CLOSED_BY_CACHE) == 0 189 1.1.1.10 christos && (preserve->flags & BFD_IN_MEMORY) == 0) 190 1.1.1.10 christos bfd_open_file (abfd); 191 1.1.1.10 christos } 192 1.1.1.10 christos abfd->flags = preserve->flags; 193 1.1.1.10 christos } 194 1.1.1.10 christos 195 1.1.1.4 christos /* Clear out a subset of BFD state. */ 196 1.1.1.4 christos 197 1.1.1.4 christos static void 198 1.1.1.10 christos bfd_reinit (bfd *abfd, unsigned int section_id, 199 1.1.1.10 christos struct bfd_preserve *preserve, bfd_cleanup cleanup) 200 1.1.1.4 christos { 201 1.1.1.9 christos _bfd_section_id = section_id; 202 1.1.1.9 christos if (cleanup) 203 1.1.1.9 christos cleanup (abfd); 204 1.1.1.4 christos abfd->tdata.any = NULL; 205 1.1.1.4 christos abfd->arch_info = &bfd_default_arch_struct; 206 1.1.1.10 christos io_reinit (abfd, preserve); 207 1.1.1.10 christos abfd->symcount = 0; 208 1.1.1.10 christos abfd->read_only = 0; 209 1.1.1.10 christos abfd->start_address = 0; 210 1.1.1.9 christos abfd->build_id = NULL; 211 1.1.1.4 christos bfd_section_list_clear (abfd); 212 1.1.1.4 christos } 213 1.1.1.4 christos 214 1.1.1.4 christos /* Restores bfd state saved by bfd_preserve_save. */ 215 1.1.1.4 christos 216 1.1.1.9 christos static bfd_cleanup 217 1.1.1.4 christos bfd_preserve_restore (bfd *abfd, struct bfd_preserve *preserve) 218 1.1.1.4 christos { 219 1.1.1.4 christos bfd_hash_table_free (&abfd->section_htab); 220 1.1.1.4 christos 221 1.1.1.4 christos abfd->tdata.any = preserve->tdata; 222 1.1.1.4 christos abfd->arch_info = preserve->arch_info; 223 1.1.1.10 christos io_reinit (abfd, preserve); 224 1.1.1.4 christos abfd->section_htab = preserve->section_htab; 225 1.1.1.4 christos abfd->sections = preserve->sections; 226 1.1.1.4 christos abfd->section_last = preserve->section_last; 227 1.1.1.4 christos abfd->section_count = preserve->section_count; 228 1.1.1.7 christos _bfd_section_id = preserve->section_id; 229 1.1.1.10 christos abfd->symcount = preserve->symcount; 230 1.1.1.10 christos abfd->read_only = preserve->read_only; 231 1.1.1.10 christos abfd->start_address = preserve->start_address; 232 1.1.1.6 christos abfd->build_id = preserve->build_id; 233 1.1.1.4 christos 234 1.1.1.4 christos /* bfd_release frees all memory more recently bfd_alloc'd than 235 1.1.1.4 christos its arg, as well as its arg. */ 236 1.1.1.4 christos bfd_release (abfd, preserve->marker); 237 1.1.1.4 christos preserve->marker = NULL; 238 1.1.1.9 christos return preserve->cleanup; 239 1.1.1.4 christos } 240 1.1.1.4 christos 241 1.1.1.4 christos /* Called when the bfd state saved by bfd_preserve_save is no longer 242 1.1.1.4 christos needed. */ 243 1.1.1.4 christos 244 1.1.1.4 christos static void 245 1.1.1.4 christos bfd_preserve_finish (bfd *abfd ATTRIBUTE_UNUSED, struct bfd_preserve *preserve) 246 1.1.1.4 christos { 247 1.1.1.9 christos if (preserve->cleanup) 248 1.1.1.9 christos { 249 1.1.1.9 christos /* Run the cleanup, assuming that all it will need is the 250 1.1.1.9 christos tdata at the time the cleanup was returned. */ 251 1.1.1.9 christos void *tdata = abfd->tdata.any; 252 1.1.1.9 christos abfd->tdata.any = preserve->tdata; 253 1.1.1.9 christos preserve->cleanup (abfd); 254 1.1.1.9 christos abfd->tdata.any = tdata; 255 1.1.1.9 christos } 256 1.1.1.4 christos /* It would be nice to be able to free more memory here, eg. old 257 1.1.1.4 christos tdata, but that's not possible since these blocks are sitting 258 1.1.1.4 christos inside bfd_alloc'd memory. The section hash is on a separate 259 1.1.1.4 christos objalloc. */ 260 1.1.1.4 christos bfd_hash_table_free (&preserve->section_htab); 261 1.1.1.4 christos preserve->marker = NULL; 262 1.1.1.4 christos } 263 1.1.1.4 christos 264 1.1.1.10 christos static void 265 1.1.1.10 christos print_warnmsg (struct per_xvec_message **list) 266 1.1.1.10 christos { 267 1.1.1.10 christos for (struct per_xvec_message *warn = *list; warn; warn = warn->next) 268 1.1.1.11 christos _bfd_error_handler ("%s", warn->message); 269 1.1.1.10 christos } 270 1.1.1.10 christos 271 1.1.1.10 christos static void 272 1.1.1.10 christos clear_warnmsg (struct per_xvec_message **list) 273 1.1.1.10 christos { 274 1.1.1.10 christos struct per_xvec_message *warn = *list; 275 1.1.1.10 christos while (warn) 276 1.1.1.10 christos { 277 1.1.1.10 christos struct per_xvec_message *next = warn->next; 278 1.1.1.10 christos free (warn); 279 1.1.1.10 christos warn = next; 280 1.1.1.10 christos } 281 1.1.1.10 christos *list = NULL; 282 1.1.1.10 christos } 283 1.1.1.10 christos 284 1.1.1.11 christos /* Free all the storage in LIST. Note that the first element of LIST 285 1.1.1.11 christos is special and is assumed to be stack-allocated. TARG is used for 286 1.1.1.11 christos re-issuing warning messages. If TARG is PER_XVEC_NO_TARGET, then 287 1.1.1.11 christos it acts like a sort of wildcard -- messages are reissued if all 288 1.1.1.11 christos targets with messages have identical messages. One copy of the 289 1.1.1.11 christos messages are then reissued. If TARG is anything else, then only 290 1.1.1.11 christos messages associated with TARG are emitted. */ 291 1.1.1.11 christos 292 1.1.1.10 christos static void 293 1.1.1.11 christos print_and_clear_messages (struct per_xvec_messages *list, 294 1.1.1.11 christos const bfd_target *targ) 295 1.1.1.10 christos { 296 1.1.1.11 christos struct per_xvec_messages *iter; 297 1.1.1.11 christos 298 1.1.1.11 christos if (targ == PER_XVEC_NO_TARGET) 299 1.1.1.11 christos { 300 1.1.1.11 christos iter = list->next; 301 1.1.1.11 christos while (iter != NULL) 302 1.1.1.11 christos { 303 1.1.1.11 christos struct per_xvec_message *msg1 = list->messages; 304 1.1.1.11 christos struct per_xvec_message *msg2 = iter->messages; 305 1.1.1.11 christos do 306 1.1.1.11 christos { 307 1.1.1.11 christos if (strcmp (msg1->message, msg2->message)) 308 1.1.1.11 christos break; 309 1.1.1.11 christos msg1 = msg1->next; 310 1.1.1.11 christos msg2 = msg2->next; 311 1.1.1.11 christos } while (msg1 && msg2); 312 1.1.1.11 christos if (msg1 || msg2) 313 1.1.1.11 christos break; 314 1.1.1.11 christos iter = iter->next; 315 1.1.1.11 christos } 316 1.1.1.11 christos if (iter == NULL) 317 1.1.1.11 christos targ = list->targ; 318 1.1.1.11 christos } 319 1.1.1.11 christos 320 1.1.1.11 christos iter = list; 321 1.1.1.11 christos while (iter != NULL) 322 1.1.1.11 christos { 323 1.1.1.11 christos struct per_xvec_messages *next = iter->next; 324 1.1.1.11 christos 325 1.1.1.11 christos if (iter->targ == targ) 326 1.1.1.11 christos print_warnmsg (&iter->messages); 327 1.1.1.11 christos clear_warnmsg (&iter->messages); 328 1.1.1.11 christos if (iter != list) 329 1.1.1.11 christos free (iter); 330 1.1.1.11 christos iter = next; 331 1.1.1.11 christos } 332 1.1.1.11 christos 333 1.1.1.11 christos /* Don't retain a pointer to free'd memory. */ 334 1.1.1.11 christos list->next = NULL; 335 1.1.1.11 christos } 336 1.1.1.11 christos 337 1.1.1.11 christos /* Discard all messages associated with TARG in LIST. Unlike 338 1.1.1.11 christos print_and_clear_messages, PER_XVEC_NO_TARGET is not valid for TARG. */ 339 1.1.1.11 christos 340 1.1.1.11 christos static void 341 1.1.1.11 christos clear_messages (struct per_xvec_messages *list, 342 1.1.1.11 christos const bfd_target *targ) 343 1.1.1.11 christos { 344 1.1.1.11 christos struct per_xvec_messages *iter; 345 1.1.1.11 christos 346 1.1.1.11 christos for (iter = list; iter != NULL; iter = iter->next) 347 1.1.1.11 christos { 348 1.1.1.11 christos if (iter->targ == targ) 349 1.1.1.11 christos clear_warnmsg (&iter->messages); 350 1.1.1.11 christos } 351 1.1.1.11 christos } 352 1.1.1.11 christos 353 1.1.1.11 christos /* This a copy of lto_section defined in GCC (lto-streamer.h). */ 354 1.1.1.11 christos 355 1.1.1.11 christos struct lto_section 356 1.1.1.11 christos { 357 1.1.1.11 christos int16_t major_version; 358 1.1.1.11 christos int16_t minor_version; 359 1.1.1.11 christos unsigned char slim_object; 360 1.1.1.11 christos 361 1.1.1.11 christos /* Flags is a private field that is not defined publicly. */ 362 1.1.1.11 christos uint16_t flags; 363 1.1.1.11 christos }; 364 1.1.1.11 christos 365 1.1.1.11 christos /* Set lto_type in ABFD. */ 366 1.1.1.11 christos 367 1.1.1.11 christos static void 368 1.1.1.12 christos bfd_set_lto_type (bfd *abfd) 369 1.1.1.11 christos { 370 1.1.1.11 christos if (abfd->format == bfd_object 371 1.1.1.11 christos && abfd->lto_type == lto_non_object 372 1.1.1.11 christos && (abfd->flags 373 1.1.1.11 christos & (DYNAMIC 374 1.1.1.11 christos | (bfd_get_flavour (abfd) == bfd_target_elf_flavour 375 1.1.1.11 christos ? EXEC_P : 0))) == 0) 376 1.1.1.11 christos { 377 1.1.1.12 christos asection *sec = abfd->sections; 378 1.1.1.11 christos enum bfd_lto_object_type type = lto_non_ir_object; 379 1.1.1.12 christos if (sec == NULL) 380 1.1.1.12 christos { 381 1.1.1.12 christos /* If there are no sections, check for slim LLVM IR object whose 382 1.1.1.12 christos first 4 bytes are: 'B', 'C', 0xc0, 0xde. */ 383 1.1.1.12 christos bfd_byte llvm_ir_magic[4]; 384 1.1.1.12 christos if (bfd_seek (abfd, 0, SEEK_SET) == 0 385 1.1.1.12 christos && bfd_read (llvm_ir_magic, 4, abfd) == 4 386 1.1.1.12 christos && llvm_ir_magic[0] == 'B' 387 1.1.1.12 christos && llvm_ir_magic[1] == 'C' 388 1.1.1.12 christos && llvm_ir_magic[2] == 0xc0 389 1.1.1.12 christos && llvm_ir_magic[3] == 0xde) 390 1.1.1.12 christos type = lto_slim_ir_object; 391 1.1.1.12 christos } 392 1.1.1.12 christos else 393 1.1.1.12 christos { 394 1.1.1.12 christos struct lto_section lsection = { 0, 0, 0, 0 }; 395 1.1.1.12 christos /* GCC uses .gnu.lto_.lto.<some_hash> as a LTO bytecode 396 1.1.1.12 christos information section. */ 397 1.1.1.12 christos for (; sec != NULL; sec = sec->next) 398 1.1.1.12 christos if (strcmp (sec->name, GNU_OBJECT_ONLY_SECTION_NAME) == 0) 399 1.1.1.12 christos { 400 1.1.1.12 christos type = lto_mixed_object; 401 1.1.1.12 christos abfd->object_only_section = sec; 402 1.1.1.12 christos break; 403 1.1.1.12 christos } 404 1.1.1.12 christos else if (strcmp (sec->name, ".llvm.lto") == 0) 405 1.1.1.12 christos { 406 1.1.1.12 christos type = lto_fat_ir_object; 407 1.1.1.12 christos break; 408 1.1.1.12 christos } 409 1.1.1.12 christos else if (lsection.major_version == 0 410 1.1.1.12 christos && startswith (sec->name, ".gnu.lto_.lto.") 411 1.1.1.12 christos && bfd_get_section_contents (abfd, sec, &lsection, 0, 412 1.1.1.12 christos sizeof (struct lto_section))) 413 1.1.1.12 christos { 414 1.1.1.12 christos if (lsection.slim_object) 415 1.1.1.12 christos type = lto_slim_ir_object; 416 1.1.1.12 christos else 417 1.1.1.12 christos type = lto_fat_ir_object; 418 1.1.1.11 christos } 419 1.1.1.12 christos } 420 1.1.1.11 christos 421 1.1.1.11 christos abfd->lto_type = type; 422 1.1.1.11 christos } 423 1.1.1.10 christos } 424 1.1.1.10 christos 425 1.1 skrll /* 426 1.1 skrll FUNCTION 427 1.1.1.12 christos bfd_check_format_matches 428 1.1 skrll 429 1.1 skrll SYNOPSIS 430 1.1.1.12 christos bool bfd_check_format_matches 431 1.1.1.12 christos (bfd *abfd, bfd_format format, char ***matching); 432 1.1 skrll 433 1.1 skrll DESCRIPTION 434 1.1 skrll Like <<bfd_check_format>>, except when it returns FALSE with 435 1.1.1.12 christos <<bfd_errno>> set to <<bfd_error_file_ambiguously_recognized>>. 436 1.1.1.12 christos In that case, if @var{matching} is not NULL, it will be filled 437 1.1.1.12 christos in with a NULL-terminated list of the names of the formats 438 1.1.1.12 christos that matched, allocated with <<malloc>>. 439 1.1 skrll Then the user may choose a format and try again. 440 1.1 skrll 441 1.1 skrll When done with the list that @var{matching} points to, the caller 442 1.1 skrll should free it. 443 1.1 skrll */ 444 1.1 skrll 445 1.1.1.9 christos bool 446 1.1.1.12 christos bfd_check_format_matches (bfd *abfd, bfd_format format, char ***matching) 447 1.1 skrll { 448 1.1 skrll extern const bfd_target binary_vec; 449 1.1 skrll const bfd_target * const *target; 450 1.1.1.12 christos const bfd_target **matching_vector; 451 1.1.1.3 christos const bfd_target *save_targ, *right_targ, *ar_right_targ, *match_targ; 452 1.1.1.12 christos const bfd_target *fail_targ; 453 1.1.1.3 christos int match_count, best_count, best_match; 454 1.1 skrll int ar_match_index; 455 1.1.1.7 christos unsigned int initial_section_id = _bfd_section_id; 456 1.1.1.8 christos struct bfd_preserve preserve, preserve_match; 457 1.1.1.9 christos bfd_cleanup cleanup = NULL; 458 1.1.1.11 christos struct per_xvec_messages messages = { abfd, PER_XVEC_NO_TARGET, NULL, NULL }; 459 1.1.1.11 christos struct per_xvec_messages *orig_messages; 460 1.1.1.11 christos bool old_in_format_matches; 461 1.1 skrll 462 1.1 skrll if (matching != NULL) 463 1.1 skrll *matching = NULL; 464 1.1 skrll 465 1.1 skrll if (!bfd_read_p (abfd) 466 1.1 skrll || (unsigned int) abfd->format >= (unsigned int) bfd_type_end) 467 1.1 skrll { 468 1.1 skrll bfd_set_error (bfd_error_invalid_operation); 469 1.1.1.9 christos return false; 470 1.1 skrll } 471 1.1 skrll 472 1.1 skrll if (abfd->format != bfd_unknown) 473 1.1.1.12 christos return abfd->format == format; 474 1.1 skrll 475 1.1.1.12 christos matching_vector = bfd_malloc (sizeof (*matching_vector) 476 1.1.1.12 christos * 2 * _bfd_target_vector_entries); 477 1.1.1.12 christos if (!matching_vector) 478 1.1.1.12 christos return false; 479 1.1 skrll 480 1.1.1.11 christos /* Avoid clashes with bfd_cache_close_all running in another 481 1.1.1.11 christos thread. */ 482 1.1.1.11 christos if (!bfd_cache_set_uncloseable (abfd, true, &old_in_format_matches)) 483 1.1.1.11 christos { 484 1.1.1.11 christos free (matching_vector); 485 1.1.1.11 christos return false; 486 1.1.1.11 christos } 487 1.1.1.11 christos 488 1.1.1.11 christos /* Locking is required here in order to manage _bfd_section_id. */ 489 1.1.1.11 christos if (!bfd_lock ()) 490 1.1.1.11 christos { 491 1.1.1.11 christos bfd_cache_set_uncloseable (abfd, old_in_format_matches, NULL); 492 1.1.1.11 christos free (matching_vector); 493 1.1.1.11 christos return false; 494 1.1.1.11 christos } 495 1.1.1.11 christos 496 1.1 skrll /* Presume the answer is yes. */ 497 1.1 skrll abfd->format = format; 498 1.1.1.4 christos save_targ = abfd->xvec; 499 1.1.1.8 christos 500 1.1.1.10 christos /* Don't report errors on recursive calls checking the first element 501 1.1.1.10 christos of an archive. */ 502 1.1.1.11 christos orig_messages = _bfd_set_error_handler_caching (&messages); 503 1.1.1.10 christos 504 1.1.1.8 christos preserve_match.marker = NULL; 505 1.1.1.9 christos if (!bfd_preserve_save (abfd, &preserve, NULL)) 506 1.1.1.8 christos goto err_ret; 507 1.1 skrll 508 1.1.1.12 christos /* First try matching the plugin target if appropriate. Next try 509 1.1.1.12 christos the current target. The current target may have been set due to 510 1.1.1.12 christos a user option, or due to the linker trying optimistically to load 511 1.1.1.12 christos input files for the same target as the output. Either will 512 1.1.1.12 christos have target_defaulted false. Failing that, bfd_find_target will 513 1.1.1.12 christos have chosen a default target, and target_defaulted will be true. */ 514 1.1.1.12 christos fail_targ = NULL; 515 1.1.1.12 christos if (bfd_plugin_enabled () 516 1.1.1.12 christos && abfd->format == bfd_object 517 1.1.1.12 christos && abfd->target_defaulted 518 1.1.1.12 christos && !abfd->is_linker_input 519 1.1.1.12 christos && abfd->plugin_format != bfd_plugin_no) 520 1.1 skrll { 521 1.1.1.12 christos if (bfd_seek (abfd, 0, SEEK_SET) != 0) 522 1.1 skrll goto err_ret; 523 1.1 skrll 524 1.1.1.12 christos BFD_ASSERT (save_targ != bfd_plugin_vec ()); 525 1.1.1.12 christos abfd->xvec = bfd_plugin_vec (); 526 1.1.1.12 christos bfd_set_error (bfd_error_no_error); 527 1.1.1.9 christos cleanup = BFD_SEND_FMT (abfd, _bfd_check_format, (abfd)); 528 1.1.1.9 christos if (cleanup) 529 1.1 skrll goto ok_ret; 530 1.1 skrll 531 1.1.1.12 christos bfd_reinit (abfd, initial_section_id, &preserve, cleanup); 532 1.1.1.12 christos bfd_release (abfd, preserve.marker); 533 1.1.1.12 christos preserve.marker = bfd_alloc (abfd, 1); 534 1.1.1.12 christos abfd->xvec = save_targ; 535 1.1.1.12 christos } 536 1.1.1.12 christos 537 1.1.1.12 christos /* bfd_plugin_no excluding the plugin target is an optimisation. 538 1.1.1.12 christos The test can be removed if desired. */ 539 1.1.1.12 christos if (!(abfd->plugin_format == bfd_plugin_no 540 1.1.1.12 christos && bfd_plugin_target_p (save_targ))) 541 1.1.1.12 christos { 542 1.1.1.12 christos if (bfd_seek (abfd, 0, SEEK_SET) != 0) 543 1.1.1.12 christos goto err_ret; 544 1.1.1.12 christos 545 1.1.1.12 christos bfd_set_error (bfd_error_no_error); 546 1.1.1.12 christos cleanup = BFD_SEND_FMT (abfd, _bfd_check_format, (abfd)); 547 1.1.1.12 christos if (cleanup) 548 1.1.1.12 christos { 549 1.1.1.12 christos if (abfd->format != bfd_archive 550 1.1.1.12 christos /* An archive with object files matching the archive 551 1.1.1.12 christos target is OK. Other archives should be further 552 1.1.1.12 christos tested. */ 553 1.1.1.12 christos || (bfd_has_map (abfd) 554 1.1.1.12 christos && bfd_get_error () != bfd_error_wrong_object_format) 555 1.1.1.12 christos /* Empty archives can match the current target. 556 1.1.1.12 christos Attempting to read the armap will result in a file 557 1.1.1.12 christos truncated error. */ 558 1.1.1.12 christos || (!bfd_has_map (abfd) 559 1.1.1.12 christos && bfd_get_error () == bfd_error_file_truncated)) 560 1.1.1.12 christos goto ok_ret; 561 1.1.1.12 christos } 562 1.1.1.12 christos else 563 1.1.1.12 christos { 564 1.1.1.12 christos if (!abfd->target_defaulted && !abfd->is_linker_input) 565 1.1.1.12 christos goto err_unrecog; 566 1.1.1.12 christos fail_targ = save_targ; 567 1.1.1.12 christos } 568 1.1 skrll } 569 1.1 skrll 570 1.1.1.12 christos /* Check all targets in the hope that one will be recognized. */ 571 1.1.1.4 christos right_targ = NULL; 572 1.1.1.4 christos ar_right_targ = NULL; 573 1.1.1.4 christos match_targ = NULL; 574 1.1.1.4 christos best_match = 256; 575 1.1.1.4 christos best_count = 0; 576 1.1.1.4 christos match_count = 0; 577 1.1.1.4 christos ar_match_index = _bfd_target_vector_entries; 578 1.1.1.4 christos 579 1.1 skrll for (target = bfd_target_vector; *target != NULL; target++) 580 1.1 skrll { 581 1.1.1.8 christos void **high_water; 582 1.1 skrll 583 1.1.1.8 christos /* The binary target matches anything, so don't return it when 584 1.1.1.12 christos searching. Also, don't check the current target twice when 585 1.1.1.12 christos it has failed already. 586 1.1.1.12 christos Don't match the plugin target during linking if we have 587 1.1.1.12 christos another alternative since we want to properly set the input 588 1.1.1.12 christos format before allowing a plugin to claim the file. 589 1.1.1.12 christos Also as an optimisation don't match the plugin target when 590 1.1.1.12 christos abfd->plugin_format is set to bfd_plugin_no. (This occurs 591 1.1.1.12 christos when LTO sections have been stripped or when we have a 592 1.1.1.12 christos recursive call here from the plugin object_p via 593 1.1.1.12 christos bfd_plugin_get_symbols_in_object_only.) */ 594 1.1 skrll if (*target == &binary_vec 595 1.1.1.12 christos || *target == fail_targ 596 1.1.1.12 christos || (((abfd->is_linker_input && match_count != 0) 597 1.1.1.12 christos || abfd->plugin_format == bfd_plugin_no) 598 1.1.1.12 christos && bfd_plugin_target_p (*target))) 599 1.1 skrll continue; 600 1.1 skrll 601 1.1.1.4 christos /* If we already tried a match, the bfd is modified and may 602 1.1.1.4 christos have sections attached, which will confuse the next 603 1.1.1.4 christos _bfd_check_format call. */ 604 1.1.1.10 christos bfd_reinit (abfd, initial_section_id, &preserve, cleanup); 605 1.1.1.8 christos /* Free bfd_alloc memory too. If we have matched and preserved 606 1.1.1.8 christos a target then the high water mark is that much higher. */ 607 1.1.1.8 christos if (preserve_match.marker) 608 1.1.1.8 christos high_water = &preserve_match.marker; 609 1.1.1.8 christos else 610 1.1.1.8 christos high_water = &preserve.marker; 611 1.1.1.8 christos bfd_release (abfd, *high_water); 612 1.1.1.8 christos *high_water = bfd_alloc (abfd, 1); 613 1.1.1.4 christos 614 1.1.1.4 christos /* Change BFD's target temporarily. */ 615 1.1.1.4 christos abfd->xvec = *target; 616 1.1 skrll 617 1.1.1.11 christos /* It is possible that targets appear multiple times in 618 1.1.1.11 christos bfd_target_vector. If this is the case, then we want to avoid 619 1.1.1.11 christos accumulating duplicate messages for a target in MESSAGES, so 620 1.1.1.11 christos discard any previous messages associated with this target. */ 621 1.1.1.11 christos clear_messages (&messages, abfd->xvec); 622 1.1.1.11 christos 623 1.1.1.10 christos if (bfd_seek (abfd, 0, SEEK_SET) != 0) 624 1.1 skrll goto err_ret; 625 1.1 skrll 626 1.1.1.12 christos bfd_set_error (bfd_error_no_error); 627 1.1.1.9 christos cleanup = BFD_SEND_FMT (abfd, _bfd_check_format, (abfd)); 628 1.1.1.9 christos if (cleanup) 629 1.1 skrll { 630 1.1.1.4 christos if (abfd->format != bfd_archive 631 1.1.1.4 christos || (bfd_has_map (abfd) 632 1.1.1.4 christos && bfd_get_error () != bfd_error_wrong_object_format)) 633 1.1.1.4 christos { 634 1.1.1.4 christos /* If this is the default target, accept it, even if 635 1.1.1.4 christos other targets might match. People who want those 636 1.1.1.4 christos other targets have to set the GNUTARGET variable. */ 637 1.1.1.9 christos if (abfd->xvec == bfd_default_vector[0]) 638 1.1.1.4 christos goto ok_ret; 639 1.1.1.4 christos 640 1.1.1.12 christos matching_vector[match_count] = abfd->xvec; 641 1.1.1.4 christos match_count++; 642 1.1.1.4 christos 643 1.1.1.12 christos int match_priority = abfd->xvec->match_priority; 644 1.1.1.12 christos if (match_priority == 1 645 1.1.1.12 christos && bfd_get_flavour (abfd) == bfd_target_elf_flavour) 646 1.1.1.12 christos { 647 1.1.1.12 christos /* If the object e_ident matches the hint elf_osabi, 648 1.1.1.12 christos bump priority up. */ 649 1.1.1.12 christos Elf_Internal_Ehdr *i_ehdrp = elf_elfheader (abfd); 650 1.1.1.12 christos elf_backend_data *bed = get_elf_backend_data (abfd); 651 1.1.1.12 christos if (bed->elf_osabi != ELFOSABI_NONE 652 1.1.1.12 christos && i_ehdrp->e_ident[EI_OSABI] == bed->elf_osabi) 653 1.1.1.12 christos match_priority = 0; 654 1.1.1.12 christos } 655 1.1.1.5 christos if (match_priority < best_match) 656 1.1.1.4 christos { 657 1.1.1.5 christos best_match = match_priority; 658 1.1.1.4 christos best_count = 0; 659 1.1.1.4 christos } 660 1.1.1.7 christos if (match_priority <= best_match) 661 1.1.1.7 christos { 662 1.1.1.7 christos /* This format checks out as ok! */ 663 1.1.1.9 christos right_targ = abfd->xvec; 664 1.1.1.7 christos best_count++; 665 1.1.1.7 christos } 666 1.1.1.4 christos } 667 1.1.1.4 christos else 668 1.1.1.3 christos { 669 1.1.1.4 christos /* An archive with no armap or objects of the wrong 670 1.1.1.4 christos type. We want this target to match if we get no 671 1.1.1.4 christos better matches. */ 672 1.1.1.4 christos if (ar_right_targ != bfd_default_vector[0]) 673 1.1.1.4 christos ar_right_targ = *target; 674 1.1.1.12 christos matching_vector[ar_match_index] = *target; 675 1.1.1.4 christos ar_match_index++; 676 1.1.1.3 christos } 677 1.1.1.4 christos 678 1.1.1.8 christos if (preserve_match.marker == NULL) 679 1.1.1.8 christos { 680 1.1.1.9 christos match_targ = abfd->xvec; 681 1.1.1.9 christos if (!bfd_preserve_save (abfd, &preserve_match, cleanup)) 682 1.1.1.8 christos goto err_ret; 683 1.1.1.9 christos cleanup = NULL; 684 1.1.1.8 christos } 685 1.1 skrll } 686 1.1 skrll } 687 1.1 skrll 688 1.1.1.3 christos if (best_count == 1) 689 1.1.1.3 christos match_count = 1; 690 1.1.1.3 christos 691 1.1 skrll if (match_count == 0) 692 1.1 skrll { 693 1.1 skrll /* Try partial matches. */ 694 1.1 skrll right_targ = ar_right_targ; 695 1.1 skrll 696 1.1 skrll if (right_targ == bfd_default_vector[0]) 697 1.1 skrll { 698 1.1 skrll match_count = 1; 699 1.1 skrll } 700 1.1 skrll else 701 1.1 skrll { 702 1.1 skrll match_count = ar_match_index - _bfd_target_vector_entries; 703 1.1 skrll 704 1.1.1.12 christos if (match_count > 1) 705 1.1 skrll memcpy (matching_vector, 706 1.1 skrll matching_vector + _bfd_target_vector_entries, 707 1.1 skrll sizeof (*matching_vector) * match_count); 708 1.1 skrll } 709 1.1 skrll } 710 1.1 skrll 711 1.1.1.4 christos /* We have more than one equally good match. If any of the best 712 1.1.1.4 christos matches is a target in config.bfd targ_defvec or targ_selvecs, 713 1.1.1.4 christos choose it. */ 714 1.1 skrll if (match_count > 1) 715 1.1 skrll { 716 1.1 skrll const bfd_target * const *assoc = bfd_associated_vector; 717 1.1 skrll 718 1.1 skrll while ((right_targ = *assoc++) != NULL) 719 1.1 skrll { 720 1.1 skrll int i = match_count; 721 1.1 skrll 722 1.1 skrll while (--i >= 0) 723 1.1.1.4 christos if (matching_vector[i] == right_targ 724 1.1.1.4 christos && right_targ->match_priority <= best_match) 725 1.1 skrll break; 726 1.1 skrll 727 1.1 skrll if (i >= 0) 728 1.1 skrll { 729 1.1 skrll match_count = 1; 730 1.1 skrll break; 731 1.1 skrll } 732 1.1 skrll } 733 1.1 skrll } 734 1.1 skrll 735 1.1.1.4 christos /* We still have more than one equally good match, and at least some 736 1.1.1.4 christos of the targets support match priority. Choose the first of the 737 1.1.1.4 christos best matches. */ 738 1.1.1.12 christos if (match_count > 1 && best_count != match_count) 739 1.1.1.4 christos { 740 1.1.1.4 christos int i; 741 1.1.1.4 christos 742 1.1.1.4 christos for (i = 0; i < match_count; i++) 743 1.1.1.4 christos { 744 1.1.1.4 christos right_targ = matching_vector[i]; 745 1.1.1.4 christos if (right_targ->match_priority <= best_match) 746 1.1.1.4 christos break; 747 1.1.1.4 christos } 748 1.1.1.4 christos match_count = 1; 749 1.1.1.4 christos } 750 1.1.1.4 christos 751 1.1.1.4 christos /* There is way too much undoing of half-known state here. We 752 1.1.1.4 christos really shouldn't iterate on live bfd's. Note that saving the 753 1.1.1.4 christos whole bfd and restoring it would be even worse; the first thing 754 1.1.1.4 christos you notice is that the cached bfd file position gets out of sync. */ 755 1.1.1.8 christos if (preserve_match.marker != NULL) 756 1.1.1.9 christos cleanup = bfd_preserve_restore (abfd, &preserve_match); 757 1.1.1.4 christos 758 1.1 skrll if (match_count == 1) 759 1.1 skrll { 760 1.1.1.3 christos abfd->xvec = right_targ; 761 1.1.1.3 christos /* If we come out of the loop knowing that the last target that 762 1.1.1.3 christos matched is the one we want, then ABFD should still be in a usable 763 1.1.1.8 christos state (except possibly for XVEC). This is not just an 764 1.1.1.8 christos optimisation. In the case of plugins a match against the 765 1.1.1.8 christos plugin target can result in the bfd being changed such that 766 1.1.1.8 christos it no longer matches the plugin target, nor will it match 767 1.1.1.8 christos RIGHT_TARG again. */ 768 1.1.1.3 christos if (match_targ != right_targ) 769 1.1.1.3 christos { 770 1.1.1.10 christos bfd_reinit (abfd, initial_section_id, &preserve, cleanup); 771 1.1.1.8 christos bfd_release (abfd, preserve.marker); 772 1.1.1.10 christos if (bfd_seek (abfd, 0, SEEK_SET) != 0) 773 1.1.1.3 christos goto err_ret; 774 1.1.1.9 christos cleanup = BFD_SEND_FMT (abfd, _bfd_check_format, (abfd)); 775 1.1.1.9 christos BFD_ASSERT (cleanup != NULL); 776 1.1.1.3 christos } 777 1.1 skrll 778 1.1.1.3 christos ok_ret: 779 1.1 skrll /* If the file was opened for update, then `output_has_begun' 780 1.1 skrll some time ago when the file was created. Do not recompute 781 1.1 skrll sections sizes or alignments in _bfd_set_section_contents. 782 1.1 skrll We can not set this flag until after checking the format, 783 1.1 skrll because it will interfere with creation of BFD sections. */ 784 1.1 skrll if (abfd->direction == both_direction) 785 1.1.1.9 christos abfd->output_has_begun = true; 786 1.1 skrll 787 1.1.1.9 christos free (matching_vector); 788 1.1.1.8 christos if (preserve_match.marker != NULL) 789 1.1.1.8 christos bfd_preserve_finish (abfd, &preserve_match); 790 1.1.1.8 christos bfd_preserve_finish (abfd, &preserve); 791 1.1.1.11 christos _bfd_restore_error_handler_caching (orig_messages); 792 1.1.1.11 christos 793 1.1.1.11 christos print_and_clear_messages (&messages, abfd->xvec); 794 1.1.1.10 christos 795 1.1.1.11 christos bfd_set_lto_type (abfd); 796 1.1.1.4 christos 797 1.1.1.4 christos /* File position has moved, BTW. */ 798 1.1.1.11 christos bool ret = bfd_cache_set_uncloseable (abfd, old_in_format_matches, NULL); 799 1.1.1.11 christos if (!bfd_unlock ()) 800 1.1.1.11 christos return false; 801 1.1.1.11 christos return ret; 802 1.1 skrll } 803 1.1 skrll 804 1.1 skrll if (match_count == 0) 805 1.1 skrll { 806 1.1 skrll err_unrecog: 807 1.1 skrll bfd_set_error (bfd_error_file_not_recognized); 808 1.1 skrll err_ret: 809 1.1.1.9 christos if (cleanup) 810 1.1.1.9 christos cleanup (abfd); 811 1.1 skrll abfd->xvec = save_targ; 812 1.1 skrll abfd->format = bfd_unknown; 813 1.1.1.9 christos free (matching_vector); 814 1.1.1.10 christos goto out; 815 1.1 skrll } 816 1.1 skrll 817 1.1.1.4 christos /* Restore original target type and format. */ 818 1.1.1.4 christos abfd->xvec = save_targ; 819 1.1.1.4 christos abfd->format = bfd_unknown; 820 1.1 skrll bfd_set_error (bfd_error_file_ambiguously_recognized); 821 1.1 skrll 822 1.1 skrll if (matching) 823 1.1 skrll { 824 1.1 skrll *matching = (char **) matching_vector; 825 1.1 skrll matching_vector[match_count] = NULL; 826 1.1 skrll /* Return target names. This is a little nasty. Maybe we 827 1.1 skrll should do another bfd_malloc? */ 828 1.1 skrll while (--match_count >= 0) 829 1.1 skrll { 830 1.1 skrll const char *name = matching_vector[match_count]->name; 831 1.1 skrll *(const char **) &matching_vector[match_count] = name; 832 1.1 skrll } 833 1.1 skrll } 834 1.1.1.9 christos else 835 1.1.1.8 christos free (matching_vector); 836 1.1.1.9 christos if (cleanup) 837 1.1.1.9 christos cleanup (abfd); 838 1.1.1.10 christos out: 839 1.1.1.8 christos if (preserve_match.marker != NULL) 840 1.1.1.8 christos bfd_preserve_finish (abfd, &preserve_match); 841 1.1.1.11 christos if (preserve.marker != NULL) 842 1.1.1.11 christos bfd_preserve_restore (abfd, &preserve); 843 1.1.1.11 christos _bfd_restore_error_handler_caching (orig_messages); 844 1.1.1.11 christos print_and_clear_messages (&messages, PER_XVEC_NO_TARGET); 845 1.1.1.11 christos bfd_cache_set_uncloseable (abfd, old_in_format_matches, NULL); 846 1.1.1.11 christos bfd_unlock (); 847 1.1.1.9 christos return false; 848 1.1 skrll } 849 1.1 skrll 850 1.1 skrll /* 851 1.1 skrll FUNCTION 852 1.1 skrll bfd_set_format 853 1.1 skrll 854 1.1 skrll SYNOPSIS 855 1.1.1.9 christos bool bfd_set_format (bfd *abfd, bfd_format format); 856 1.1 skrll 857 1.1 skrll DESCRIPTION 858 1.1 skrll This function sets the file format of the BFD @var{abfd} to the 859 1.1 skrll format @var{format}. If the target set in the BFD does not 860 1.1 skrll support the format requested, the format is invalid, or the BFD 861 1.1 skrll is not open for writing, then an error occurs. 862 1.1 skrll */ 863 1.1 skrll 864 1.1.1.9 christos bool 865 1.1 skrll bfd_set_format (bfd *abfd, bfd_format format) 866 1.1 skrll { 867 1.1 skrll if (bfd_read_p (abfd) 868 1.1 skrll || (unsigned int) abfd->format >= (unsigned int) bfd_type_end) 869 1.1 skrll { 870 1.1 skrll bfd_set_error (bfd_error_invalid_operation); 871 1.1.1.9 christos return false; 872 1.1 skrll } 873 1.1 skrll 874 1.1 skrll if (abfd->format != bfd_unknown) 875 1.1 skrll return abfd->format == format; 876 1.1 skrll 877 1.1 skrll /* Presume the answer is yes. */ 878 1.1 skrll abfd->format = format; 879 1.1 skrll 880 1.1 skrll if (!BFD_SEND_FMT (abfd, _bfd_set_format, (abfd))) 881 1.1 skrll { 882 1.1 skrll abfd->format = bfd_unknown; 883 1.1.1.9 christos return false; 884 1.1 skrll } 885 1.1 skrll 886 1.1.1.9 christos return true; 887 1.1 skrll } 888 1.1 skrll 889 1.1 skrll /* 890 1.1 skrll FUNCTION 891 1.1 skrll bfd_format_string 892 1.1 skrll 893 1.1 skrll SYNOPSIS 894 1.1 skrll const char *bfd_format_string (bfd_format format); 895 1.1 skrll 896 1.1 skrll DESCRIPTION 897 1.1 skrll Return a pointer to a const string 898 1.1 skrll <<invalid>>, <<object>>, <<archive>>, <<core>>, or <<unknown>>, 899 1.1 skrll depending upon the value of @var{format}. 900 1.1 skrll */ 901 1.1 skrll 902 1.1 skrll const char * 903 1.1 skrll bfd_format_string (bfd_format format) 904 1.1 skrll { 905 1.1 skrll if (((int) format < (int) bfd_unknown) 906 1.1 skrll || ((int) format >= (int) bfd_type_end)) 907 1.1 skrll return "invalid"; 908 1.1 skrll 909 1.1 skrll switch (format) 910 1.1 skrll { 911 1.1 skrll case bfd_object: 912 1.1 skrll return "object"; /* Linker/assembler/compiler output. */ 913 1.1 skrll case bfd_archive: 914 1.1 skrll return "archive"; /* Object archive file. */ 915 1.1 skrll case bfd_core: 916 1.1 skrll return "core"; /* Core dump. */ 917 1.1 skrll default: 918 1.1 skrll return "unknown"; 919 1.1 skrll } 920 1.1 skrll } 921