xref: /dflybsd-src/contrib/gdb-7/bfd/binary.c (revision 5796c8dc12c637f18a1740c26afd8d40ffa9b719)
1*5796c8dcSSimon Schubert /* BFD back-end for binary objects.
2*5796c8dcSSimon Schubert    Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
3*5796c8dcSSimon Schubert    2004, 2005, 2006, 2007, 2009 Free Software Foundation, Inc.
4*5796c8dcSSimon Schubert    Written by Ian Lance Taylor, Cygnus Support, <ian@cygnus.com>
5*5796c8dcSSimon Schubert 
6*5796c8dcSSimon Schubert    This file is part of BFD, the Binary File Descriptor library.
7*5796c8dcSSimon Schubert 
8*5796c8dcSSimon Schubert    This program is free software; you can redistribute it and/or modify
9*5796c8dcSSimon Schubert    it under the terms of the GNU General Public License as published by
10*5796c8dcSSimon Schubert    the Free Software Foundation; either version 3 of the License, or
11*5796c8dcSSimon Schubert    (at your option) any later version.
12*5796c8dcSSimon Schubert 
13*5796c8dcSSimon Schubert    This program is distributed in the hope that it will be useful,
14*5796c8dcSSimon Schubert    but WITHOUT ANY WARRANTY; without even the implied warranty of
15*5796c8dcSSimon Schubert    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16*5796c8dcSSimon Schubert    GNU General Public License for more details.
17*5796c8dcSSimon Schubert 
18*5796c8dcSSimon Schubert    You should have received a copy of the GNU General Public License
19*5796c8dcSSimon Schubert    along with this program; if not, write to the Free Software
20*5796c8dcSSimon Schubert    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
21*5796c8dcSSimon Schubert    MA 02110-1301, USA.  */
22*5796c8dcSSimon Schubert 
23*5796c8dcSSimon Schubert /* This is a BFD backend which may be used to write binary objects.
24*5796c8dcSSimon Schubert    It may only be used for output, not input.  The intention is that
25*5796c8dcSSimon Schubert    this may be used as an output format for objcopy in order to
26*5796c8dcSSimon Schubert    generate raw binary data.
27*5796c8dcSSimon Schubert 
28*5796c8dcSSimon Schubert    This is very simple.  The only complication is that the real data
29*5796c8dcSSimon Schubert    will start at some address X, and in some cases we will not want to
30*5796c8dcSSimon Schubert    include X zeroes just to get to that point.  Since the start
31*5796c8dcSSimon Schubert    address is not meaningful for this object file format, we use it
32*5796c8dcSSimon Schubert    instead to indicate the number of zeroes to skip at the start of
33*5796c8dcSSimon Schubert    the file.  objcopy cooperates by specially setting the start
34*5796c8dcSSimon Schubert    address to zero by default.  */
35*5796c8dcSSimon Schubert 
36*5796c8dcSSimon Schubert #include "sysdep.h"
37*5796c8dcSSimon Schubert #include "bfd.h"
38*5796c8dcSSimon Schubert #include "safe-ctype.h"
39*5796c8dcSSimon Schubert #include "libbfd.h"
40*5796c8dcSSimon Schubert 
41*5796c8dcSSimon Schubert /* Any bfd we create by reading a binary file has three symbols:
42*5796c8dcSSimon Schubert    a start symbol, an end symbol, and an absolute length symbol.  */
43*5796c8dcSSimon Schubert #define BIN_SYMS 3
44*5796c8dcSSimon Schubert 
45*5796c8dcSSimon Schubert /* Create a binary object.  Invoked via bfd_set_format.  */
46*5796c8dcSSimon Schubert 
47*5796c8dcSSimon Schubert static bfd_boolean
48*5796c8dcSSimon Schubert binary_mkobject (bfd *abfd ATTRIBUTE_UNUSED)
49*5796c8dcSSimon Schubert {
50*5796c8dcSSimon Schubert   return TRUE;
51*5796c8dcSSimon Schubert }
52*5796c8dcSSimon Schubert 
53*5796c8dcSSimon Schubert /* Any file may be considered to be a binary file, provided the target
54*5796c8dcSSimon Schubert    was not defaulted.  That is, it must be explicitly specified as
55*5796c8dcSSimon Schubert    being binary.  */
56*5796c8dcSSimon Schubert 
57*5796c8dcSSimon Schubert static const bfd_target *
58*5796c8dcSSimon Schubert binary_object_p (bfd *abfd)
59*5796c8dcSSimon Schubert {
60*5796c8dcSSimon Schubert   struct stat statbuf;
61*5796c8dcSSimon Schubert   asection *sec;
62*5796c8dcSSimon Schubert   flagword flags;
63*5796c8dcSSimon Schubert 
64*5796c8dcSSimon Schubert   if (abfd->target_defaulted)
65*5796c8dcSSimon Schubert     {
66*5796c8dcSSimon Schubert       bfd_set_error (bfd_error_wrong_format);
67*5796c8dcSSimon Schubert       return NULL;
68*5796c8dcSSimon Schubert     }
69*5796c8dcSSimon Schubert 
70*5796c8dcSSimon Schubert   abfd->symcount = BIN_SYMS;
71*5796c8dcSSimon Schubert 
72*5796c8dcSSimon Schubert   /* Find the file size.  */
73*5796c8dcSSimon Schubert   if (bfd_stat (abfd, &statbuf) < 0)
74*5796c8dcSSimon Schubert     {
75*5796c8dcSSimon Schubert       bfd_set_error (bfd_error_system_call);
76*5796c8dcSSimon Schubert       return NULL;
77*5796c8dcSSimon Schubert     }
78*5796c8dcSSimon Schubert 
79*5796c8dcSSimon Schubert   /* One data section.  */
80*5796c8dcSSimon Schubert   flags = SEC_ALLOC | SEC_LOAD | SEC_DATA | SEC_HAS_CONTENTS;
81*5796c8dcSSimon Schubert   sec = bfd_make_section_with_flags (abfd, ".data", flags);
82*5796c8dcSSimon Schubert   if (sec == NULL)
83*5796c8dcSSimon Schubert     return NULL;
84*5796c8dcSSimon Schubert   sec->vma = 0;
85*5796c8dcSSimon Schubert   sec->size = statbuf.st_size;
86*5796c8dcSSimon Schubert   sec->filepos = 0;
87*5796c8dcSSimon Schubert 
88*5796c8dcSSimon Schubert   abfd->tdata.any = (void *) sec;
89*5796c8dcSSimon Schubert 
90*5796c8dcSSimon Schubert   return abfd->xvec;
91*5796c8dcSSimon Schubert }
92*5796c8dcSSimon Schubert 
93*5796c8dcSSimon Schubert #define binary_close_and_cleanup     _bfd_generic_close_and_cleanup
94*5796c8dcSSimon Schubert #define binary_bfd_free_cached_info  _bfd_generic_bfd_free_cached_info
95*5796c8dcSSimon Schubert #define binary_new_section_hook      _bfd_generic_new_section_hook
96*5796c8dcSSimon Schubert 
97*5796c8dcSSimon Schubert /* Get contents of the only section.  */
98*5796c8dcSSimon Schubert 
99*5796c8dcSSimon Schubert static bfd_boolean
100*5796c8dcSSimon Schubert binary_get_section_contents (bfd *abfd,
101*5796c8dcSSimon Schubert 			     asection *section ATTRIBUTE_UNUSED,
102*5796c8dcSSimon Schubert 			     void * location,
103*5796c8dcSSimon Schubert 			     file_ptr offset,
104*5796c8dcSSimon Schubert 			     bfd_size_type count)
105*5796c8dcSSimon Schubert {
106*5796c8dcSSimon Schubert   if (bfd_seek (abfd, offset, SEEK_SET) != 0
107*5796c8dcSSimon Schubert       || bfd_bread (location, count, abfd) != count)
108*5796c8dcSSimon Schubert     return FALSE;
109*5796c8dcSSimon Schubert   return TRUE;
110*5796c8dcSSimon Schubert }
111*5796c8dcSSimon Schubert 
112*5796c8dcSSimon Schubert /* Return the amount of memory needed to read the symbol table.  */
113*5796c8dcSSimon Schubert 
114*5796c8dcSSimon Schubert static long
115*5796c8dcSSimon Schubert binary_get_symtab_upper_bound (bfd *abfd ATTRIBUTE_UNUSED)
116*5796c8dcSSimon Schubert {
117*5796c8dcSSimon Schubert   return (BIN_SYMS + 1) * sizeof (asymbol *);
118*5796c8dcSSimon Schubert }
119*5796c8dcSSimon Schubert 
120*5796c8dcSSimon Schubert /* Create a symbol name based on the bfd's filename.  */
121*5796c8dcSSimon Schubert 
122*5796c8dcSSimon Schubert static char *
123*5796c8dcSSimon Schubert mangle_name (bfd *abfd, char *suffix)
124*5796c8dcSSimon Schubert {
125*5796c8dcSSimon Schubert   bfd_size_type size;
126*5796c8dcSSimon Schubert   char *buf;
127*5796c8dcSSimon Schubert   char *p;
128*5796c8dcSSimon Schubert 
129*5796c8dcSSimon Schubert   size = (strlen (bfd_get_filename (abfd))
130*5796c8dcSSimon Schubert 	  + strlen (suffix)
131*5796c8dcSSimon Schubert 	  + sizeof "_binary__");
132*5796c8dcSSimon Schubert 
133*5796c8dcSSimon Schubert   buf = (char *) bfd_alloc (abfd, size);
134*5796c8dcSSimon Schubert   if (buf == NULL)
135*5796c8dcSSimon Schubert     return "";
136*5796c8dcSSimon Schubert 
137*5796c8dcSSimon Schubert   sprintf (buf, "_binary_%s_%s", bfd_get_filename (abfd), suffix);
138*5796c8dcSSimon Schubert 
139*5796c8dcSSimon Schubert   /* Change any non-alphanumeric characters to underscores.  */
140*5796c8dcSSimon Schubert   for (p = buf; *p; p++)
141*5796c8dcSSimon Schubert     if (! ISALNUM (*p))
142*5796c8dcSSimon Schubert       *p = '_';
143*5796c8dcSSimon Schubert 
144*5796c8dcSSimon Schubert   return buf;
145*5796c8dcSSimon Schubert }
146*5796c8dcSSimon Schubert 
147*5796c8dcSSimon Schubert /* Return the symbol table.  */
148*5796c8dcSSimon Schubert 
149*5796c8dcSSimon Schubert static long
150*5796c8dcSSimon Schubert binary_canonicalize_symtab (bfd *abfd, asymbol **alocation)
151*5796c8dcSSimon Schubert {
152*5796c8dcSSimon Schubert   asection *sec = (asection *) abfd->tdata.any;
153*5796c8dcSSimon Schubert   asymbol *syms;
154*5796c8dcSSimon Schubert   unsigned int i;
155*5796c8dcSSimon Schubert   bfd_size_type amt = BIN_SYMS * sizeof (asymbol);
156*5796c8dcSSimon Schubert 
157*5796c8dcSSimon Schubert   syms = (asymbol *) bfd_alloc (abfd, amt);
158*5796c8dcSSimon Schubert   if (syms == NULL)
159*5796c8dcSSimon Schubert     return -1;
160*5796c8dcSSimon Schubert 
161*5796c8dcSSimon Schubert   /* Start symbol.  */
162*5796c8dcSSimon Schubert   syms[0].the_bfd = abfd;
163*5796c8dcSSimon Schubert   syms[0].name = mangle_name (abfd, "start");
164*5796c8dcSSimon Schubert   syms[0].value = 0;
165*5796c8dcSSimon Schubert   syms[0].flags = BSF_GLOBAL;
166*5796c8dcSSimon Schubert   syms[0].section = sec;
167*5796c8dcSSimon Schubert   syms[0].udata.p = NULL;
168*5796c8dcSSimon Schubert 
169*5796c8dcSSimon Schubert   /* End symbol.  */
170*5796c8dcSSimon Schubert   syms[1].the_bfd = abfd;
171*5796c8dcSSimon Schubert   syms[1].name = mangle_name (abfd, "end");
172*5796c8dcSSimon Schubert   syms[1].value = sec->size;
173*5796c8dcSSimon Schubert   syms[1].flags = BSF_GLOBAL;
174*5796c8dcSSimon Schubert   syms[1].section = sec;
175*5796c8dcSSimon Schubert   syms[1].udata.p = NULL;
176*5796c8dcSSimon Schubert 
177*5796c8dcSSimon Schubert   /* Size symbol.  */
178*5796c8dcSSimon Schubert   syms[2].the_bfd = abfd;
179*5796c8dcSSimon Schubert   syms[2].name = mangle_name (abfd, "size");
180*5796c8dcSSimon Schubert   syms[2].value = sec->size;
181*5796c8dcSSimon Schubert   syms[2].flags = BSF_GLOBAL;
182*5796c8dcSSimon Schubert   syms[2].section = bfd_abs_section_ptr;
183*5796c8dcSSimon Schubert   syms[2].udata.p = NULL;
184*5796c8dcSSimon Schubert 
185*5796c8dcSSimon Schubert   for (i = 0; i < BIN_SYMS; i++)
186*5796c8dcSSimon Schubert     *alocation++ = syms++;
187*5796c8dcSSimon Schubert   *alocation = NULL;
188*5796c8dcSSimon Schubert 
189*5796c8dcSSimon Schubert   return BIN_SYMS;
190*5796c8dcSSimon Schubert }
191*5796c8dcSSimon Schubert 
192*5796c8dcSSimon Schubert #define binary_make_empty_symbol  _bfd_generic_make_empty_symbol
193*5796c8dcSSimon Schubert #define binary_print_symbol       _bfd_nosymbols_print_symbol
194*5796c8dcSSimon Schubert 
195*5796c8dcSSimon Schubert /* Get information about a symbol.  */
196*5796c8dcSSimon Schubert 
197*5796c8dcSSimon Schubert static void
198*5796c8dcSSimon Schubert binary_get_symbol_info (bfd *ignore_abfd ATTRIBUTE_UNUSED,
199*5796c8dcSSimon Schubert 			asymbol *symbol,
200*5796c8dcSSimon Schubert 			symbol_info *ret)
201*5796c8dcSSimon Schubert {
202*5796c8dcSSimon Schubert   bfd_symbol_info (symbol, ret);
203*5796c8dcSSimon Schubert }
204*5796c8dcSSimon Schubert 
205*5796c8dcSSimon Schubert #define binary_bfd_is_local_label_name      bfd_generic_is_local_label_name
206*5796c8dcSSimon Schubert #define binary_get_lineno                  _bfd_nosymbols_get_lineno
207*5796c8dcSSimon Schubert #define binary_find_nearest_line           _bfd_nosymbols_find_nearest_line
208*5796c8dcSSimon Schubert #define binary_find_inliner_info           _bfd_nosymbols_find_inliner_info
209*5796c8dcSSimon Schubert #define binary_bfd_make_debug_symbol       _bfd_nosymbols_bfd_make_debug_symbol
210*5796c8dcSSimon Schubert #define binary_read_minisymbols            _bfd_generic_read_minisymbols
211*5796c8dcSSimon Schubert #define binary_minisymbol_to_symbol        _bfd_generic_minisymbol_to_symbol
212*5796c8dcSSimon Schubert #define binary_bfd_is_target_special_symbol ((bfd_boolean (*) (bfd *, asymbol *)) bfd_false)
213*5796c8dcSSimon Schubert 
214*5796c8dcSSimon Schubert /* Set the architecture of a binary file.  */
215*5796c8dcSSimon Schubert #define binary_set_arch_mach _bfd_generic_set_arch_mach
216*5796c8dcSSimon Schubert 
217*5796c8dcSSimon Schubert /* Write section contents of a binary file.  */
218*5796c8dcSSimon Schubert 
219*5796c8dcSSimon Schubert static bfd_boolean
220*5796c8dcSSimon Schubert binary_set_section_contents (bfd *abfd,
221*5796c8dcSSimon Schubert 			     asection *sec,
222*5796c8dcSSimon Schubert 			     const void * data,
223*5796c8dcSSimon Schubert 			     file_ptr offset,
224*5796c8dcSSimon Schubert 			     bfd_size_type size)
225*5796c8dcSSimon Schubert {
226*5796c8dcSSimon Schubert   if (size == 0)
227*5796c8dcSSimon Schubert     return TRUE;
228*5796c8dcSSimon Schubert 
229*5796c8dcSSimon Schubert   if (! abfd->output_has_begun)
230*5796c8dcSSimon Schubert     {
231*5796c8dcSSimon Schubert       bfd_boolean found_low;
232*5796c8dcSSimon Schubert       bfd_vma low;
233*5796c8dcSSimon Schubert       asection *s;
234*5796c8dcSSimon Schubert 
235*5796c8dcSSimon Schubert       /* The lowest section LMA sets the virtual address of the start
236*5796c8dcSSimon Schubert          of the file.  We use this to set the file position of all the
237*5796c8dcSSimon Schubert          sections.  */
238*5796c8dcSSimon Schubert       found_low = FALSE;
239*5796c8dcSSimon Schubert       low = 0;
240*5796c8dcSSimon Schubert       for (s = abfd->sections; s != NULL; s = s->next)
241*5796c8dcSSimon Schubert 	if (((s->flags
242*5796c8dcSSimon Schubert 	      & (SEC_HAS_CONTENTS | SEC_LOAD | SEC_ALLOC | SEC_NEVER_LOAD))
243*5796c8dcSSimon Schubert 	     == (SEC_HAS_CONTENTS | SEC_LOAD | SEC_ALLOC))
244*5796c8dcSSimon Schubert 	    && (s->size > 0)
245*5796c8dcSSimon Schubert 	    && (! found_low || s->lma < low))
246*5796c8dcSSimon Schubert 	  {
247*5796c8dcSSimon Schubert 	    low = s->lma;
248*5796c8dcSSimon Schubert 	    found_low = TRUE;
249*5796c8dcSSimon Schubert 	  }
250*5796c8dcSSimon Schubert 
251*5796c8dcSSimon Schubert       for (s = abfd->sections; s != NULL; s = s->next)
252*5796c8dcSSimon Schubert 	{
253*5796c8dcSSimon Schubert 	  s->filepos = s->lma - low;
254*5796c8dcSSimon Schubert 
255*5796c8dcSSimon Schubert 	  /* Skip following warning check for sections that will not
256*5796c8dcSSimon Schubert 	     occupy file space.  */
257*5796c8dcSSimon Schubert 	  if ((s->flags
258*5796c8dcSSimon Schubert 	       & (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_NEVER_LOAD))
259*5796c8dcSSimon Schubert 	      != (SEC_HAS_CONTENTS | SEC_ALLOC)
260*5796c8dcSSimon Schubert 	      || (s->size == 0))
261*5796c8dcSSimon Schubert 	    continue;
262*5796c8dcSSimon Schubert 
263*5796c8dcSSimon Schubert 	  /* If attempting to generate a binary file from a bfd with
264*5796c8dcSSimon Schubert 	     LMA's all over the place, huge (sparse?) binary files may
265*5796c8dcSSimon Schubert 	     result.  This condition attempts to detect this situation
266*5796c8dcSSimon Schubert 	     and print a warning.  Better heuristics would be nice to
267*5796c8dcSSimon Schubert 	     have.  */
268*5796c8dcSSimon Schubert 
269*5796c8dcSSimon Schubert 	  if (s->filepos < 0)
270*5796c8dcSSimon Schubert 	    (*_bfd_error_handler)
271*5796c8dcSSimon Schubert 	      (_("Warning: Writing section `%s' to huge (ie negative) file offset 0x%lx."),
272*5796c8dcSSimon Schubert 	       bfd_get_section_name (abfd, s),
273*5796c8dcSSimon Schubert 	       (unsigned long) s->filepos);
274*5796c8dcSSimon Schubert 	}
275*5796c8dcSSimon Schubert 
276*5796c8dcSSimon Schubert       abfd->output_has_begun = TRUE;
277*5796c8dcSSimon Schubert     }
278*5796c8dcSSimon Schubert 
279*5796c8dcSSimon Schubert   /* We don't want to output anything for a section that is neither
280*5796c8dcSSimon Schubert      loaded nor allocated.  The contents of such a section are not
281*5796c8dcSSimon Schubert      meaningful in the binary format.  */
282*5796c8dcSSimon Schubert   if ((sec->flags & (SEC_LOAD | SEC_ALLOC)) == 0)
283*5796c8dcSSimon Schubert     return TRUE;
284*5796c8dcSSimon Schubert   if ((sec->flags & SEC_NEVER_LOAD) != 0)
285*5796c8dcSSimon Schubert     return TRUE;
286*5796c8dcSSimon Schubert 
287*5796c8dcSSimon Schubert   return _bfd_generic_set_section_contents (abfd, sec, data, offset, size);
288*5796c8dcSSimon Schubert }
289*5796c8dcSSimon Schubert 
290*5796c8dcSSimon Schubert /* No space is required for header information.  */
291*5796c8dcSSimon Schubert 
292*5796c8dcSSimon Schubert static int
293*5796c8dcSSimon Schubert binary_sizeof_headers (bfd *abfd ATTRIBUTE_UNUSED,
294*5796c8dcSSimon Schubert 		       struct bfd_link_info *info ATTRIBUTE_UNUSED)
295*5796c8dcSSimon Schubert {
296*5796c8dcSSimon Schubert   return 0;
297*5796c8dcSSimon Schubert }
298*5796c8dcSSimon Schubert 
299*5796c8dcSSimon Schubert #define binary_bfd_get_relocated_section_contents  bfd_generic_get_relocated_section_contents
300*5796c8dcSSimon Schubert #define binary_bfd_relax_section                   bfd_generic_relax_section
301*5796c8dcSSimon Schubert #define binary_bfd_gc_sections                     bfd_generic_gc_sections
302*5796c8dcSSimon Schubert #define binary_bfd_merge_sections                  bfd_generic_merge_sections
303*5796c8dcSSimon Schubert #define binary_bfd_is_group_section                bfd_generic_is_group_section
304*5796c8dcSSimon Schubert #define binary_bfd_discard_group                   bfd_generic_discard_group
305*5796c8dcSSimon Schubert #define binary_section_already_linked             _bfd_generic_section_already_linked
306*5796c8dcSSimon Schubert #define binary_bfd_define_common_symbol            bfd_generic_define_common_symbol
307*5796c8dcSSimon Schubert #define binary_bfd_link_hash_table_create         _bfd_generic_link_hash_table_create
308*5796c8dcSSimon Schubert #define binary_bfd_link_hash_table_free           _bfd_generic_link_hash_table_free
309*5796c8dcSSimon Schubert #define binary_bfd_link_just_syms                 _bfd_generic_link_just_syms
310*5796c8dcSSimon Schubert #define binary_bfd_link_add_symbols               _bfd_generic_link_add_symbols
311*5796c8dcSSimon Schubert #define binary_bfd_final_link                     _bfd_generic_final_link
312*5796c8dcSSimon Schubert #define binary_bfd_link_split_section             _bfd_generic_link_split_section
313*5796c8dcSSimon Schubert #define binary_get_section_contents_in_window     _bfd_generic_get_section_contents_in_window
314*5796c8dcSSimon Schubert 
315*5796c8dcSSimon Schubert const bfd_target binary_vec =
316*5796c8dcSSimon Schubert {
317*5796c8dcSSimon Schubert   "binary",			/* name */
318*5796c8dcSSimon Schubert   bfd_target_unknown_flavour,	/* flavour */
319*5796c8dcSSimon Schubert   BFD_ENDIAN_UNKNOWN,		/* byteorder */
320*5796c8dcSSimon Schubert   BFD_ENDIAN_UNKNOWN,		/* header_byteorder */
321*5796c8dcSSimon Schubert   EXEC_P,			/* object_flags */
322*5796c8dcSSimon Schubert   (SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_CODE | SEC_DATA
323*5796c8dcSSimon Schubert    | SEC_ROM | SEC_HAS_CONTENTS), /* section_flags */
324*5796c8dcSSimon Schubert   0,				/* symbol_leading_char */
325*5796c8dcSSimon Schubert   ' ',				/* ar_pad_char */
326*5796c8dcSSimon Schubert   16,				/* ar_max_namelen */
327*5796c8dcSSimon Schubert   bfd_getb64, bfd_getb_signed_64, bfd_putb64,
328*5796c8dcSSimon Schubert   bfd_getb32, bfd_getb_signed_32, bfd_putb32,
329*5796c8dcSSimon Schubert   bfd_getb16, bfd_getb_signed_16, bfd_putb16,	/* data */
330*5796c8dcSSimon Schubert   bfd_getb64, bfd_getb_signed_64, bfd_putb64,
331*5796c8dcSSimon Schubert   bfd_getb32, bfd_getb_signed_32, bfd_putb32,
332*5796c8dcSSimon Schubert   bfd_getb16, bfd_getb_signed_16, bfd_putb16,	/* hdrs */
333*5796c8dcSSimon Schubert   {				/* bfd_check_format */
334*5796c8dcSSimon Schubert     _bfd_dummy_target,
335*5796c8dcSSimon Schubert     binary_object_p,
336*5796c8dcSSimon Schubert     _bfd_dummy_target,
337*5796c8dcSSimon Schubert     _bfd_dummy_target,
338*5796c8dcSSimon Schubert   },
339*5796c8dcSSimon Schubert   {				/* bfd_set_format */
340*5796c8dcSSimon Schubert     bfd_false,
341*5796c8dcSSimon Schubert     binary_mkobject,
342*5796c8dcSSimon Schubert     bfd_false,
343*5796c8dcSSimon Schubert     bfd_false,
344*5796c8dcSSimon Schubert   },
345*5796c8dcSSimon Schubert   {				/* bfd_write_contents */
346*5796c8dcSSimon Schubert     bfd_false,
347*5796c8dcSSimon Schubert     bfd_true,
348*5796c8dcSSimon Schubert     bfd_false,
349*5796c8dcSSimon Schubert     bfd_false,
350*5796c8dcSSimon Schubert   },
351*5796c8dcSSimon Schubert 
352*5796c8dcSSimon Schubert   BFD_JUMP_TABLE_GENERIC (binary),
353*5796c8dcSSimon Schubert   BFD_JUMP_TABLE_COPY (_bfd_generic),
354*5796c8dcSSimon Schubert   BFD_JUMP_TABLE_CORE (_bfd_nocore),
355*5796c8dcSSimon Schubert   BFD_JUMP_TABLE_ARCHIVE (_bfd_noarchive),
356*5796c8dcSSimon Schubert   BFD_JUMP_TABLE_SYMBOLS (binary),
357*5796c8dcSSimon Schubert   BFD_JUMP_TABLE_RELOCS (_bfd_norelocs),
358*5796c8dcSSimon Schubert   BFD_JUMP_TABLE_WRITE (binary),
359*5796c8dcSSimon Schubert   BFD_JUMP_TABLE_LINK (binary),
360*5796c8dcSSimon Schubert   BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
361*5796c8dcSSimon Schubert 
362*5796c8dcSSimon Schubert   NULL,
363*5796c8dcSSimon Schubert 
364*5796c8dcSSimon Schubert   NULL
365*5796c8dcSSimon Schubert };
366