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