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