format.c revision 1.1.1.4.2.1 1 1.1 skrll /* Generic BFD support for file formats.
2 1.1.1.4.2.1 pgoyette Copyright (C) 1990-2016 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 skrll
50 1.1 skrll /* IMPORT from targets.c. */
51 1.1 skrll extern const size_t _bfd_target_vector_entries;
52 1.1 skrll
53 1.1 skrll /*
54 1.1 skrll FUNCTION
55 1.1 skrll bfd_check_format
56 1.1 skrll
57 1.1 skrll SYNOPSIS
58 1.1 skrll bfd_boolean bfd_check_format (bfd *abfd, bfd_format format);
59 1.1 skrll
60 1.1 skrll DESCRIPTION
61 1.1 skrll Verify if the file attached to the BFD @var{abfd} is compatible
62 1.1 skrll with the format @var{format} (i.e., one of <<bfd_object>>,
63 1.1 skrll <<bfd_archive>> or <<bfd_core>>).
64 1.1 skrll
65 1.1 skrll If the BFD has been set to a specific target before the
66 1.1 skrll call, only the named target and format combination is
67 1.1 skrll checked. If the target has not been set, or has been set to
68 1.1 skrll <<default>>, then all the known target backends is
69 1.1 skrll interrogated to determine a match. If the default target
70 1.1 skrll matches, it is used. If not, exactly one target must recognize
71 1.1 skrll the file, or an error results.
72 1.1 skrll
73 1.1 skrll The function returns <<TRUE>> on success, otherwise <<FALSE>>
74 1.1 skrll with one of the following error codes:
75 1.1 skrll
76 1.1 skrll o <<bfd_error_invalid_operation>> -
77 1.1 skrll if <<format>> is not one of <<bfd_object>>, <<bfd_archive>> or
78 1.1 skrll <<bfd_core>>.
79 1.1 skrll
80 1.1 skrll o <<bfd_error_system_call>> -
81 1.1 skrll if an error occured during a read - even some file mismatches
82 1.1 skrll can cause bfd_error_system_calls.
83 1.1 skrll
84 1.1 skrll o <<file_not_recognised>> -
85 1.1 skrll none of the backends recognised the file format.
86 1.1 skrll
87 1.1 skrll o <<bfd_error_file_ambiguously_recognized>> -
88 1.1 skrll more than one backend recognised the file format.
89 1.1 skrll */
90 1.1 skrll
91 1.1 skrll bfd_boolean
92 1.1 skrll bfd_check_format (bfd *abfd, bfd_format format)
93 1.1 skrll {
94 1.1 skrll return bfd_check_format_matches (abfd, format, NULL);
95 1.1 skrll }
96 1.1 skrll
97 1.1.1.4 christos struct bfd_preserve
98 1.1.1.4 christos {
99 1.1.1.4 christos void *marker;
100 1.1.1.4 christos void *tdata;
101 1.1.1.4 christos flagword flags;
102 1.1.1.4 christos const struct bfd_arch_info *arch_info;
103 1.1.1.4 christos struct bfd_section *sections;
104 1.1.1.4 christos struct bfd_section *section_last;
105 1.1.1.4 christos unsigned int section_count;
106 1.1.1.4 christos struct bfd_hash_table section_htab;
107 1.1.1.4 christos };
108 1.1.1.4 christos
109 1.1.1.4 christos /* When testing an object for compatibility with a particular target
110 1.1.1.4 christos back-end, the back-end object_p function needs to set up certain
111 1.1.1.4 christos fields in the bfd on successfully recognizing the object. This
112 1.1.1.4 christos typically happens in a piecemeal fashion, with failures possible at
113 1.1.1.4 christos many points. On failure, the bfd is supposed to be restored to its
114 1.1.1.4 christos initial state, which is virtually impossible. However, restoring a
115 1.1.1.4 christos subset of the bfd state works in practice. This function stores
116 1.1.1.4 christos the subset. */
117 1.1.1.4 christos
118 1.1.1.4 christos static bfd_boolean
119 1.1.1.4 christos bfd_preserve_save (bfd *abfd, struct bfd_preserve *preserve)
120 1.1.1.4 christos {
121 1.1.1.4 christos preserve->tdata = abfd->tdata.any;
122 1.1.1.4 christos preserve->arch_info = abfd->arch_info;
123 1.1.1.4 christos preserve->flags = abfd->flags;
124 1.1.1.4 christos preserve->sections = abfd->sections;
125 1.1.1.4 christos preserve->section_last = abfd->section_last;
126 1.1.1.4 christos preserve->section_count = abfd->section_count;
127 1.1.1.4 christos preserve->section_htab = abfd->section_htab;
128 1.1.1.4 christos preserve->marker = bfd_alloc (abfd, 1);
129 1.1.1.4 christos if (preserve->marker == NULL)
130 1.1.1.4 christos return FALSE;
131 1.1.1.4 christos
132 1.1.1.4 christos return bfd_hash_table_init (&abfd->section_htab, bfd_section_hash_newfunc,
133 1.1.1.4 christos sizeof (struct section_hash_entry));
134 1.1.1.4 christos }
135 1.1.1.4 christos
136 1.1.1.4 christos /* Clear out a subset of BFD state. */
137 1.1.1.4 christos
138 1.1.1.4 christos static void
139 1.1.1.4 christos bfd_reinit (bfd *abfd)
140 1.1.1.4 christos {
141 1.1.1.4 christos abfd->tdata.any = NULL;
142 1.1.1.4 christos abfd->arch_info = &bfd_default_arch_struct;
143 1.1.1.4 christos abfd->flags &= BFD_FLAGS_SAVED;
144 1.1.1.4 christos bfd_section_list_clear (abfd);
145 1.1.1.4 christos }
146 1.1.1.4 christos
147 1.1.1.4 christos /* Restores bfd state saved by bfd_preserve_save. */
148 1.1.1.4 christos
149 1.1.1.4 christos static void
150 1.1.1.4 christos bfd_preserve_restore (bfd *abfd, struct bfd_preserve *preserve)
151 1.1.1.4 christos {
152 1.1.1.4 christos bfd_hash_table_free (&abfd->section_htab);
153 1.1.1.4 christos
154 1.1.1.4 christos abfd->tdata.any = preserve->tdata;
155 1.1.1.4 christos abfd->arch_info = preserve->arch_info;
156 1.1.1.4 christos abfd->flags = preserve->flags;
157 1.1.1.4 christos abfd->section_htab = preserve->section_htab;
158 1.1.1.4 christos abfd->sections = preserve->sections;
159 1.1.1.4 christos abfd->section_last = preserve->section_last;
160 1.1.1.4 christos abfd->section_count = preserve->section_count;
161 1.1.1.4 christos
162 1.1.1.4 christos /* bfd_release frees all memory more recently bfd_alloc'd than
163 1.1.1.4 christos its arg, as well as its arg. */
164 1.1.1.4 christos bfd_release (abfd, preserve->marker);
165 1.1.1.4 christos preserve->marker = NULL;
166 1.1.1.4 christos }
167 1.1.1.4 christos
168 1.1.1.4 christos /* Called when the bfd state saved by bfd_preserve_save is no longer
169 1.1.1.4 christos needed. */
170 1.1.1.4 christos
171 1.1.1.4 christos static void
172 1.1.1.4 christos bfd_preserve_finish (bfd *abfd ATTRIBUTE_UNUSED, struct bfd_preserve *preserve)
173 1.1.1.4 christos {
174 1.1.1.4 christos /* It would be nice to be able to free more memory here, eg. old
175 1.1.1.4 christos tdata, but that's not possible since these blocks are sitting
176 1.1.1.4 christos inside bfd_alloc'd memory. The section hash is on a separate
177 1.1.1.4 christos objalloc. */
178 1.1.1.4 christos bfd_hash_table_free (&preserve->section_htab);
179 1.1.1.4 christos preserve->marker = NULL;
180 1.1.1.4 christos }
181 1.1.1.4 christos
182 1.1 skrll /*
183 1.1 skrll FUNCTION
184 1.1 skrll bfd_check_format_matches
185 1.1 skrll
186 1.1 skrll SYNOPSIS
187 1.1 skrll bfd_boolean bfd_check_format_matches
188 1.1 skrll (bfd *abfd, bfd_format format, char ***matching);
189 1.1 skrll
190 1.1 skrll DESCRIPTION
191 1.1 skrll Like <<bfd_check_format>>, except when it returns FALSE with
192 1.1 skrll <<bfd_errno>> set to <<bfd_error_file_ambiguously_recognized>>. In that
193 1.1 skrll case, if @var{matching} is not NULL, it will be filled in with
194 1.1 skrll a NULL-terminated list of the names of the formats that matched,
195 1.1 skrll allocated with <<malloc>>.
196 1.1 skrll Then the user may choose a format and try again.
197 1.1 skrll
198 1.1 skrll When done with the list that @var{matching} points to, the caller
199 1.1 skrll should free it.
200 1.1 skrll */
201 1.1 skrll
202 1.1 skrll bfd_boolean
203 1.1 skrll bfd_check_format_matches (bfd *abfd, bfd_format format, char ***matching)
204 1.1 skrll {
205 1.1 skrll extern const bfd_target binary_vec;
206 1.1.1.4.2.1 pgoyette #if BFD_SUPPORTS_PLUGINS
207 1.1.1.4.2.1 pgoyette extern const bfd_target plugin_vec;
208 1.1.1.4.2.1 pgoyette #endif
209 1.1 skrll const bfd_target * const *target;
210 1.1 skrll const bfd_target **matching_vector = NULL;
211 1.1.1.3 christos const bfd_target *save_targ, *right_targ, *ar_right_targ, *match_targ;
212 1.1.1.3 christos int match_count, best_count, best_match;
213 1.1 skrll int ar_match_index;
214 1.1.1.4 christos struct bfd_preserve preserve;
215 1.1 skrll
216 1.1 skrll if (matching != NULL)
217 1.1 skrll *matching = NULL;
218 1.1 skrll
219 1.1 skrll if (!bfd_read_p (abfd)
220 1.1 skrll || (unsigned int) abfd->format >= (unsigned int) bfd_type_end)
221 1.1 skrll {
222 1.1 skrll bfd_set_error (bfd_error_invalid_operation);
223 1.1 skrll return FALSE;
224 1.1 skrll }
225 1.1 skrll
226 1.1 skrll if (abfd->format != bfd_unknown)
227 1.1 skrll return abfd->format == format;
228 1.1 skrll
229 1.1 skrll if (matching != NULL || *bfd_associated_vector != NULL)
230 1.1 skrll {
231 1.1 skrll bfd_size_type amt;
232 1.1 skrll
233 1.1 skrll amt = sizeof (*matching_vector) * 2 * _bfd_target_vector_entries;
234 1.1.1.2 christos matching_vector = (const bfd_target **) bfd_malloc (amt);
235 1.1 skrll if (!matching_vector)
236 1.1 skrll return FALSE;
237 1.1 skrll }
238 1.1 skrll
239 1.1 skrll /* Presume the answer is yes. */
240 1.1 skrll abfd->format = format;
241 1.1.1.4 christos save_targ = abfd->xvec;
242 1.1.1.4 christos preserve.marker = NULL;
243 1.1 skrll
244 1.1 skrll /* If the target type was explicitly specified, just check that target. */
245 1.1 skrll if (!abfd->target_defaulted)
246 1.1 skrll {
247 1.1 skrll if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0) /* rewind! */
248 1.1 skrll goto err_ret;
249 1.1 skrll
250 1.1 skrll right_targ = BFD_SEND_FMT (abfd, _bfd_check_format, (abfd));
251 1.1 skrll
252 1.1 skrll if (right_targ)
253 1.1 skrll goto ok_ret;
254 1.1 skrll
255 1.1 skrll /* For a long time the code has dropped through to check all
256 1.1 skrll targets if the specified target was wrong. I don't know why,
257 1.1 skrll and I'm reluctant to change it. However, in the case of an
258 1.1 skrll archive, it can cause problems. If the specified target does
259 1.1 skrll not permit archives (e.g., the binary target), then we should
260 1.1 skrll not allow some other target to recognize it as an archive, but
261 1.1 skrll should instead allow the specified target to recognize it as an
262 1.1 skrll object. When I first made this change, it broke the PE target,
263 1.1 skrll because the specified pei-i386 target did not recognize the
264 1.1 skrll actual pe-i386 archive. Since there may be other problems of
265 1.1 skrll this sort, I changed this test to check only for the binary
266 1.1 skrll target. */
267 1.1 skrll if (format == bfd_archive && save_targ == &binary_vec)
268 1.1 skrll goto err_unrecog;
269 1.1 skrll }
270 1.1 skrll
271 1.1.1.4 christos /* Since the target type was defaulted, check them all in the hope
272 1.1.1.4 christos that one will be uniquely recognized. */
273 1.1.1.4 christos right_targ = NULL;
274 1.1.1.4 christos ar_right_targ = NULL;
275 1.1.1.4 christos match_targ = NULL;
276 1.1.1.4 christos best_match = 256;
277 1.1.1.4 christos best_count = 0;
278 1.1.1.4 christos match_count = 0;
279 1.1.1.4 christos ar_match_index = _bfd_target_vector_entries;
280 1.1.1.4 christos
281 1.1 skrll for (target = bfd_target_vector; *target != NULL; target++)
282 1.1 skrll {
283 1.1 skrll const bfd_target *temp;
284 1.1 skrll
285 1.1 skrll /* Don't check the default target twice. */
286 1.1 skrll if (*target == &binary_vec
287 1.1.1.3 christos || (!abfd->target_defaulted && *target == save_targ)
288 1.1.1.3 christos || (*target)->match_priority > best_match)
289 1.1 skrll continue;
290 1.1 skrll
291 1.1.1.4 christos /* If we already tried a match, the bfd is modified and may
292 1.1.1.4 christos have sections attached, which will confuse the next
293 1.1.1.4 christos _bfd_check_format call. */
294 1.1.1.4 christos bfd_reinit (abfd);
295 1.1.1.4 christos
296 1.1.1.4 christos /* Change BFD's target temporarily. */
297 1.1.1.4 christos abfd->xvec = *target;
298 1.1 skrll
299 1.1 skrll if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0)
300 1.1 skrll goto err_ret;
301 1.1 skrll
302 1.1 skrll /* If _bfd_check_format neglects to set bfd_error, assume
303 1.1 skrll bfd_error_wrong_format. We didn't used to even pay any
304 1.1 skrll attention to bfd_error, so I suspect that some
305 1.1 skrll _bfd_check_format might have this problem. */
306 1.1 skrll bfd_set_error (bfd_error_wrong_format);
307 1.1 skrll
308 1.1 skrll temp = BFD_SEND_FMT (abfd, _bfd_check_format, (abfd));
309 1.1.1.3 christos if (temp)
310 1.1 skrll {
311 1.1.1.4.2.1 pgoyette int match_priority = temp->match_priority;
312 1.1.1.4.2.1 pgoyette #if BFD_SUPPORTS_PLUGINS
313 1.1.1.4.2.1 pgoyette /* If this object can be handled by a plugin, give that the
314 1.1.1.4.2.1 pgoyette lowest priority; objects both handled by a plugin and
315 1.1.1.4.2.1 pgoyette with an underlying object format will be claimed
316 1.1.1.4.2.1 pgoyette separately by the plugin. */
317 1.1.1.4.2.1 pgoyette if (*target == &plugin_vec)
318 1.1.1.4.2.1 pgoyette match_priority = (*target)->match_priority;
319 1.1.1.4.2.1 pgoyette #endif
320 1.1.1.4.2.1 pgoyette
321 1.1.1.4 christos match_targ = temp;
322 1.1.1.4 christos if (preserve.marker != NULL)
323 1.1.1.4 christos bfd_preserve_finish (abfd, &preserve);
324 1.1.1.4 christos
325 1.1.1.4 christos if (abfd->format != bfd_archive
326 1.1.1.4 christos || (bfd_has_map (abfd)
327 1.1.1.4 christos && bfd_get_error () != bfd_error_wrong_object_format))
328 1.1.1.4 christos {
329 1.1.1.4 christos /* This format checks out as ok! */
330 1.1.1.4 christos right_targ = temp;
331 1.1.1.3 christos
332 1.1.1.4 christos /* If this is the default target, accept it, even if
333 1.1.1.4 christos other targets might match. People who want those
334 1.1.1.4 christos other targets have to set the GNUTARGET variable. */
335 1.1.1.4 christos if (temp == bfd_default_vector[0])
336 1.1.1.4 christos goto ok_ret;
337 1.1.1.4 christos
338 1.1.1.4 christos if (matching_vector)
339 1.1.1.4 christos matching_vector[match_count] = temp;
340 1.1.1.4 christos match_count++;
341 1.1.1.4 christos
342 1.1.1.4.2.1 pgoyette if (match_priority < best_match)
343 1.1.1.4 christos {
344 1.1.1.4.2.1 pgoyette best_match = match_priority;
345 1.1.1.4 christos best_count = 0;
346 1.1.1.4 christos }
347 1.1.1.4 christos best_count++;
348 1.1.1.4 christos }
349 1.1.1.4 christos else
350 1.1.1.3 christos {
351 1.1.1.4 christos /* An archive with no armap or objects of the wrong
352 1.1.1.4 christos type. We want this target to match if we get no
353 1.1.1.4 christos better matches. */
354 1.1.1.4 christos if (ar_right_targ != bfd_default_vector[0])
355 1.1.1.4 christos ar_right_targ = *target;
356 1.1.1.4 christos if (matching_vector)
357 1.1.1.4 christos matching_vector[ar_match_index] = *target;
358 1.1.1.4 christos ar_match_index++;
359 1.1.1.3 christos }
360 1.1.1.4 christos
361 1.1.1.4 christos if (!bfd_preserve_save (abfd, &preserve))
362 1.1.1.4 christos goto err_ret;
363 1.1 skrll }
364 1.1.1.4 christos else if (bfd_get_error () != bfd_error_wrong_format)
365 1.1 skrll goto err_ret;
366 1.1 skrll }
367 1.1 skrll
368 1.1.1.3 christos if (best_count == 1)
369 1.1.1.3 christos match_count = 1;
370 1.1.1.3 christos
371 1.1 skrll if (match_count == 0)
372 1.1 skrll {
373 1.1 skrll /* Try partial matches. */
374 1.1 skrll right_targ = ar_right_targ;
375 1.1 skrll
376 1.1 skrll if (right_targ == bfd_default_vector[0])
377 1.1 skrll {
378 1.1 skrll match_count = 1;
379 1.1 skrll }
380 1.1 skrll else
381 1.1 skrll {
382 1.1 skrll match_count = ar_match_index - _bfd_target_vector_entries;
383 1.1 skrll
384 1.1 skrll if (matching_vector && match_count > 1)
385 1.1 skrll memcpy (matching_vector,
386 1.1 skrll matching_vector + _bfd_target_vector_entries,
387 1.1 skrll sizeof (*matching_vector) * match_count);
388 1.1 skrll }
389 1.1 skrll }
390 1.1 skrll
391 1.1.1.4 christos /* We have more than one equally good match. If any of the best
392 1.1.1.4 christos matches is a target in config.bfd targ_defvec or targ_selvecs,
393 1.1.1.4 christos choose it. */
394 1.1 skrll if (match_count > 1)
395 1.1 skrll {
396 1.1 skrll const bfd_target * const *assoc = bfd_associated_vector;
397 1.1 skrll
398 1.1 skrll while ((right_targ = *assoc++) != NULL)
399 1.1 skrll {
400 1.1 skrll int i = match_count;
401 1.1 skrll
402 1.1 skrll while (--i >= 0)
403 1.1.1.4 christos if (matching_vector[i] == right_targ
404 1.1.1.4 christos && right_targ->match_priority <= best_match)
405 1.1 skrll break;
406 1.1 skrll
407 1.1 skrll if (i >= 0)
408 1.1 skrll {
409 1.1 skrll match_count = 1;
410 1.1 skrll break;
411 1.1 skrll }
412 1.1 skrll }
413 1.1 skrll }
414 1.1 skrll
415 1.1.1.4 christos /* We still have more than one equally good match, and at least some
416 1.1.1.4 christos of the targets support match priority. Choose the first of the
417 1.1.1.4 christos best matches. */
418 1.1.1.4 christos if (matching_vector && match_count > 1 && best_count != match_count)
419 1.1.1.4 christos {
420 1.1.1.4 christos int i;
421 1.1.1.4 christos
422 1.1.1.4 christos for (i = 0; i < match_count; i++)
423 1.1.1.4 christos {
424 1.1.1.4 christos right_targ = matching_vector[i];
425 1.1.1.4 christos if (right_targ->match_priority <= best_match)
426 1.1.1.4 christos break;
427 1.1.1.4 christos }
428 1.1.1.4 christos match_count = 1;
429 1.1.1.4 christos }
430 1.1.1.4 christos
431 1.1.1.4 christos /* There is way too much undoing of half-known state here. We
432 1.1.1.4 christos really shouldn't iterate on live bfd's. Note that saving the
433 1.1.1.4 christos whole bfd and restoring it would be even worse; the first thing
434 1.1.1.4 christos you notice is that the cached bfd file position gets out of sync. */
435 1.1.1.4 christos if (preserve.marker != NULL)
436 1.1.1.4 christos bfd_preserve_restore (abfd, &preserve);
437 1.1.1.4 christos
438 1.1 skrll if (match_count == 1)
439 1.1 skrll {
440 1.1.1.3 christos abfd->xvec = right_targ;
441 1.1.1.3 christos /* If we come out of the loop knowing that the last target that
442 1.1.1.3 christos matched is the one we want, then ABFD should still be in a usable
443 1.1.1.3 christos state (except possibly for XVEC). */
444 1.1.1.3 christos if (match_targ != right_targ)
445 1.1.1.3 christos {
446 1.1.1.4 christos bfd_reinit (abfd);
447 1.1.1.3 christos if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0)
448 1.1.1.3 christos goto err_ret;
449 1.1.1.3 christos match_targ = BFD_SEND_FMT (abfd, _bfd_check_format, (abfd));
450 1.1.1.4 christos BFD_ASSERT (match_targ != NULL);
451 1.1.1.3 christos }
452 1.1 skrll
453 1.1.1.3 christos ok_ret:
454 1.1 skrll /* If the file was opened for update, then `output_has_begun'
455 1.1 skrll some time ago when the file was created. Do not recompute
456 1.1 skrll sections sizes or alignments in _bfd_set_section_contents.
457 1.1 skrll We can not set this flag until after checking the format,
458 1.1 skrll because it will interfere with creation of BFD sections. */
459 1.1 skrll if (abfd->direction == both_direction)
460 1.1 skrll abfd->output_has_begun = TRUE;
461 1.1 skrll
462 1.1 skrll if (matching_vector)
463 1.1 skrll free (matching_vector);
464 1.1.1.4 christos
465 1.1.1.4 christos /* File position has moved, BTW. */
466 1.1.1.4 christos return TRUE;
467 1.1 skrll }
468 1.1 skrll
469 1.1 skrll if (match_count == 0)
470 1.1 skrll {
471 1.1 skrll err_unrecog:
472 1.1 skrll bfd_set_error (bfd_error_file_not_recognized);
473 1.1 skrll err_ret:
474 1.1 skrll abfd->xvec = save_targ;
475 1.1 skrll abfd->format = bfd_unknown;
476 1.1 skrll if (matching_vector)
477 1.1 skrll free (matching_vector);
478 1.1.1.4 christos if (preserve.marker != NULL)
479 1.1.1.4 christos bfd_preserve_restore (abfd, &preserve);
480 1.1 skrll return FALSE;
481 1.1 skrll }
482 1.1 skrll
483 1.1.1.4 christos /* Restore original target type and format. */
484 1.1.1.4 christos abfd->xvec = save_targ;
485 1.1.1.4 christos abfd->format = bfd_unknown;
486 1.1 skrll bfd_set_error (bfd_error_file_ambiguously_recognized);
487 1.1 skrll
488 1.1 skrll if (matching)
489 1.1 skrll {
490 1.1 skrll *matching = (char **) matching_vector;
491 1.1 skrll matching_vector[match_count] = NULL;
492 1.1 skrll /* Return target names. This is a little nasty. Maybe we
493 1.1 skrll should do another bfd_malloc? */
494 1.1 skrll while (--match_count >= 0)
495 1.1 skrll {
496 1.1 skrll const char *name = matching_vector[match_count]->name;
497 1.1 skrll *(const char **) &matching_vector[match_count] = name;
498 1.1 skrll }
499 1.1 skrll }
500 1.1 skrll return FALSE;
501 1.1 skrll }
502 1.1 skrll
503 1.1 skrll /*
504 1.1 skrll FUNCTION
505 1.1 skrll bfd_set_format
506 1.1 skrll
507 1.1 skrll SYNOPSIS
508 1.1 skrll bfd_boolean bfd_set_format (bfd *abfd, bfd_format format);
509 1.1 skrll
510 1.1 skrll DESCRIPTION
511 1.1 skrll This function sets the file format of the BFD @var{abfd} to the
512 1.1 skrll format @var{format}. If the target set in the BFD does not
513 1.1 skrll support the format requested, the format is invalid, or the BFD
514 1.1 skrll is not open for writing, then an error occurs.
515 1.1 skrll */
516 1.1 skrll
517 1.1 skrll bfd_boolean
518 1.1 skrll bfd_set_format (bfd *abfd, bfd_format format)
519 1.1 skrll {
520 1.1 skrll if (bfd_read_p (abfd)
521 1.1 skrll || (unsigned int) abfd->format >= (unsigned int) bfd_type_end)
522 1.1 skrll {
523 1.1 skrll bfd_set_error (bfd_error_invalid_operation);
524 1.1 skrll return FALSE;
525 1.1 skrll }
526 1.1 skrll
527 1.1 skrll if (abfd->format != bfd_unknown)
528 1.1 skrll return abfd->format == format;
529 1.1 skrll
530 1.1 skrll /* Presume the answer is yes. */
531 1.1 skrll abfd->format = format;
532 1.1 skrll
533 1.1 skrll if (!BFD_SEND_FMT (abfd, _bfd_set_format, (abfd)))
534 1.1 skrll {
535 1.1 skrll abfd->format = bfd_unknown;
536 1.1 skrll return FALSE;
537 1.1 skrll }
538 1.1 skrll
539 1.1 skrll return TRUE;
540 1.1 skrll }
541 1.1 skrll
542 1.1 skrll /*
543 1.1 skrll FUNCTION
544 1.1 skrll bfd_format_string
545 1.1 skrll
546 1.1 skrll SYNOPSIS
547 1.1 skrll const char *bfd_format_string (bfd_format format);
548 1.1 skrll
549 1.1 skrll DESCRIPTION
550 1.1 skrll Return a pointer to a const string
551 1.1 skrll <<invalid>>, <<object>>, <<archive>>, <<core>>, or <<unknown>>,
552 1.1 skrll depending upon the value of @var{format}.
553 1.1 skrll */
554 1.1 skrll
555 1.1 skrll const char *
556 1.1 skrll bfd_format_string (bfd_format format)
557 1.1 skrll {
558 1.1 skrll if (((int) format < (int) bfd_unknown)
559 1.1 skrll || ((int) format >= (int) bfd_type_end))
560 1.1 skrll return "invalid";
561 1.1 skrll
562 1.1 skrll switch (format)
563 1.1 skrll {
564 1.1 skrll case bfd_object:
565 1.1 skrll return "object"; /* Linker/assembler/compiler output. */
566 1.1 skrll case bfd_archive:
567 1.1 skrll return "archive"; /* Object archive file. */
568 1.1 skrll case bfd_core:
569 1.1 skrll return "core"; /* Core dump. */
570 1.1 skrll default:
571 1.1 skrll return "unknown";
572 1.1 skrll }
573 1.1 skrll }
574