format.c revision 1.1.1.12 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