OSDN Git Service

2010-01-04 Daniel Gutson <dgutson@codesourcery.com>
[pf3gnuchains/pf3gnuchains3x.git] / bfd / coff-i960.c
1 /* BFD back-end for Intel 960 COFF files.
2    Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1997, 1999, 2000, 2001,
3    2002, 2003, 2004, 2005, 2007, 2008  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 #define I960 1
24 #define BADMAG(x) I960BADMAG(x)
25
26 #include "sysdep.h"
27 #include "bfd.h"
28 #include "libbfd.h"
29 #include "coff/i960.h"
30 #include "coff/internal.h"
31
32 #ifndef bfd_pe_print_pdata
33 #define bfd_pe_print_pdata      NULL
34 #endif
35
36 #include "libcoff.h"            /* To allow easier abstraction-breaking.  */
37
38 static bfd_boolean coff_i960_is_local_label_name
39   PARAMS ((bfd *, const char *));
40 static bfd_reloc_status_type optcall_callback
41   PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
42 static bfd_reloc_status_type coff_i960_relocate
43   PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
44 static reloc_howto_type *coff_i960_reloc_type_lookup
45   PARAMS ((bfd *, bfd_reloc_code_real_type));
46 static bfd_boolean coff_i960_start_final_link
47   PARAMS ((bfd *, struct bfd_link_info *));
48 static bfd_boolean coff_i960_relocate_section
49   PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *,
50            struct internal_reloc *, struct internal_syment *, asection **));
51 static bfd_boolean coff_i960_adjust_symndx
52   PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *,
53            struct internal_reloc *, bfd_boolean *));
54
55 #define COFF_DEFAULT_SECTION_ALIGNMENT_POWER (3)
56 #define COFF_ALIGN_IN_SECTION_HEADER 1
57
58 #define GET_SCNHDR_ALIGN H_GET_32
59 #define PUT_SCNHDR_ALIGN H_PUT_32
60
61 /* The i960 does not support an MMU, so COFF_PAGE_SIZE can be
62    arbitrarily small.  */
63 #define COFF_PAGE_SIZE 1
64
65 #define COFF_LONG_FILENAMES
66
67 /* This set of local label names is taken from gas.  */
68
69 static bfd_boolean
70 coff_i960_is_local_label_name (abfd, name)
71      bfd *abfd ATTRIBUTE_UNUSED;
72      const char *name;
73 {
74   return (name[0] == 'L'
75           || (name[0] == '.'
76               && (name[1] == 'C'
77                   || name[1] == 'I'
78                   || name[1] == '.')));
79 }
80
81 /* This is just like the usual CALC_ADDEND, but it includes the
82    section VMA for PC relative relocs.  */
83 #ifndef CALC_ADDEND
84 #define CALC_ADDEND(abfd, ptr, reloc, cache_ptr)                \
85   {                                                             \
86     coff_symbol_type *coffsym = (coff_symbol_type *) NULL;      \
87     if (ptr && bfd_asymbol_bfd (ptr) != abfd)                   \
88       coffsym = (obj_symbols (abfd)                             \
89                  + (cache_ptr->sym_ptr_ptr - symbols));         \
90     else if (ptr)                                               \
91       coffsym = coff_symbol_from (abfd, ptr);                   \
92     if (coffsym != (coff_symbol_type *) NULL                    \
93         && coffsym->native->u.syment.n_scnum == 0)              \
94       cache_ptr->addend = 0;                                    \
95     else if (ptr && bfd_asymbol_bfd (ptr) == abfd               \
96              && ptr->section != (asection *) NULL)              \
97       cache_ptr->addend = - (ptr->section->vma + ptr->value);   \
98     else                                                        \
99       cache_ptr->addend = 0;                                    \
100     if (ptr && (reloc.r_type == 25 || reloc.r_type == 27))      \
101       cache_ptr->addend += asect->vma;                          \
102   }
103 #endif
104
105 #define CALLS    0x66003800     /* Template for 'calls' instruction     */
106 #define BAL      0x0b000000     /* Template for 'bal' instruction       */
107 #define BAL_MASK 0x00ffffff
108
109 static bfd_reloc_status_type
110 optcall_callback (abfd, reloc_entry, symbol_in, data,
111                   input_section, ignore_bfd, error_message)
112      bfd *abfd;
113      arelent *reloc_entry;
114      asymbol *symbol_in;
115      PTR data;
116      asection *input_section;
117      bfd *ignore_bfd ATTRIBUTE_UNUSED;
118      char **error_message;
119 {
120   /* This item has already been relocated correctly, but we may be
121    * able to patch in yet better code - done by digging out the
122    * correct info on this symbol */
123   bfd_reloc_status_type result;
124   coff_symbol_type *cs = coffsymbol(symbol_in);
125
126   /* Don't do anything with symbols which aren't tied up yet,
127      except move the reloc.  */
128   if (bfd_is_und_section (cs->symbol.section)) {
129     reloc_entry->address += input_section->output_offset;
130     return bfd_reloc_ok;
131   }
132
133   /* So the target symbol has to be of coff type, and the symbol
134      has to have the correct native information within it */
135   if ((bfd_asymbol_flavour(&cs->symbol) != bfd_target_coff_flavour)
136       || (cs->native == (combined_entry_type *)NULL))
137     {
138       /* This is interesting, consider the case where we're outputting coff
139          from a mix n match input, linking from coff to a symbol defined in a
140          bout file will cause this match to be true. Should I complain?  This
141          will only work if the bout symbol is non leaf.  */
142       *error_message =
143         (char *) _("uncertain calling convention for non-COFF symbol");
144       result = bfd_reloc_dangerous;
145     }
146   else
147     {
148     switch (cs->native->u.syment.n_sclass)
149       {
150       case C_LEAFSTAT:
151       case C_LEAFEXT:
152         /* This is a call to a leaf procedure, replace instruction with a bal
153            to the correct location.  */
154         {
155           union internal_auxent *aux = &((cs->native+2)->u.auxent);
156           int word = bfd_get_32 (abfd, (bfd_byte *)data + reloc_entry->address);
157           int olf = (aux->x_bal.x_balntry - cs->native->u.syment.n_value);
158           BFD_ASSERT(cs->native->u.syment.n_numaux==2);
159
160           /* We replace the original call instruction with a bal to
161              the bal entry point - the offset of which is described in
162              the 2nd auxent of the original symbol. We keep the native
163              sym and auxents untouched, so the delta between the two
164              is the offset of the bal entry point.  */
165           word = ((word +  olf)  & BAL_MASK) | BAL;
166           bfd_put_32 (abfd, (bfd_vma) word,
167                       (bfd_byte *) data + reloc_entry->address);
168         }
169         result = bfd_reloc_ok;
170         break;
171       case C_SCALL:
172         /* This is a call to a system call, replace with a calls to # */
173         BFD_ASSERT(0);
174         result = bfd_reloc_ok;
175         break;
176       default:
177         result = bfd_reloc_ok;
178         break;
179       }
180   }
181   return result;
182 }
183
184 /* i960 COFF is used by VxWorks 5.1.  However, VxWorks 5.1 does not
185    appear to correctly handle a reloc against a symbol defined in the
186    same object file.  It appears to simply discard such relocs, rather
187    than adding their values into the object file.  We handle this here
188    by converting all relocs against defined symbols into relocs
189    against the section symbol, when generating a relocatable output
190    file.
191
192    Note that this function is only called if we are not using the COFF
193    specific backend linker.  It only does something when doing a
194    relocatable link, which will almost certainly fail when not
195    generating COFF i960 output, so this function is actually no longer
196    useful.  It was used before this target was converted to use the
197    COFF specific backend linker.  */
198
199 static bfd_reloc_status_type
200 coff_i960_relocate (abfd, reloc_entry, symbol, data, input_section,
201                     output_bfd, error_message)
202      bfd *abfd;
203      arelent *reloc_entry;
204      asymbol *symbol;
205      PTR data ATTRIBUTE_UNUSED;
206      asection *input_section ATTRIBUTE_UNUSED;
207      bfd *output_bfd;
208      char **error_message ATTRIBUTE_UNUSED;
209 {
210   asection *osec;
211
212   if (output_bfd == NULL)
213     {
214       /* Not generating relocatable output file.  */
215       return bfd_reloc_continue;
216     }
217
218   if (bfd_is_und_section (bfd_get_section (symbol)))
219     {
220       /* Symbol is not defined, so no need to worry about it.  */
221       return bfd_reloc_continue;
222     }
223
224   if (bfd_is_com_section (bfd_get_section (symbol)))
225     {
226       /* I don't really know what the right action is for a common
227          symbol.  */
228       return bfd_reloc_continue;
229     }
230
231   /* Convert the reloc to use the section symbol.  FIXME: This method
232      is ridiculous.  */
233   osec = bfd_get_section (symbol)->output_section;
234   if (coff_section_data (output_bfd, osec) != NULL
235       && coff_section_data (output_bfd, osec)->tdata != NULL)
236     reloc_entry->sym_ptr_ptr =
237       (asymbol **) coff_section_data (output_bfd, osec)->tdata;
238   else
239     {
240       const char *sec_name;
241       asymbol **syms, **sym_end;
242
243       sec_name = bfd_get_section_name (output_bfd, osec);
244       syms = bfd_get_outsymbols (output_bfd);
245       sym_end = syms + bfd_get_symcount (output_bfd);
246       for (; syms < sym_end; syms++)
247         {
248           if (bfd_asymbol_name (*syms) != NULL
249               && (*syms)->value == 0
250               && strcmp ((*syms)->section->output_section->name,
251                          sec_name) == 0)
252             break;
253         }
254
255       if (syms >= sym_end)
256         abort ();
257
258       reloc_entry->sym_ptr_ptr = syms;
259
260       if (coff_section_data (output_bfd, osec) == NULL)
261         {
262           bfd_size_type amt = sizeof (struct coff_section_tdata);
263           osec->used_by_bfd = (PTR) bfd_zalloc (abfd, amt);
264           if (osec->used_by_bfd == NULL)
265             return bfd_reloc_overflow;
266         }
267       coff_section_data (output_bfd, osec)->tdata = (PTR) syms;
268     }
269
270   /* Let bfd_perform_relocation do its thing, which will include
271      stuffing the symbol addend into the object file.  */
272   return bfd_reloc_continue;
273 }
274
275 static reloc_howto_type howto_rellong =
276   HOWTO ((unsigned int) R_RELLONG, 0, 2, 32,FALSE, 0,
277          complain_overflow_bitfield, coff_i960_relocate,"rellong", TRUE,
278          0xffffffff, 0xffffffff, 0);
279 static reloc_howto_type howto_iprmed =
280   HOWTO (R_IPRMED, 0, 2, 24,TRUE,0, complain_overflow_signed,
281          coff_i960_relocate, "iprmed ", TRUE, 0x00ffffff, 0x00ffffff, 0);
282 static reloc_howto_type howto_optcall =
283   HOWTO (R_OPTCALL, 0,2,24,TRUE,0, complain_overflow_signed,
284          optcall_callback, "optcall", TRUE, 0x00ffffff, 0x00ffffff, 0);
285
286 static reloc_howto_type *
287 coff_i960_reloc_type_lookup (abfd, code)
288      bfd *abfd ATTRIBUTE_UNUSED;
289      bfd_reloc_code_real_type code;
290 {
291   switch (code)
292     {
293     default:
294       return 0;
295     case BFD_RELOC_I960_CALLJ:
296       return &howto_optcall;
297     case BFD_RELOC_32:
298     case BFD_RELOC_CTOR:
299       return &howto_rellong;
300     case BFD_RELOC_24_PCREL:
301       return &howto_iprmed;
302     }
303 }
304
305 static reloc_howto_type *
306 coff_i960_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
307                              const char *r_name)
308 {
309   if (strcasecmp (howto_optcall.name, r_name) == 0)
310     return &howto_optcall;
311   if (strcasecmp (howto_rellong.name, r_name) == 0)
312     return &howto_rellong;
313   if (strcasecmp (howto_iprmed.name, r_name) == 0)
314     return &howto_iprmed;
315
316   return NULL;
317 }
318
319 /* The real code is in coffcode.h */
320
321 #define RTYPE2HOWTO(cache_ptr, dst) \
322 {                                                       \
323    reloc_howto_type *howto_ptr;                         \
324    switch ((dst)->r_type) {                             \
325      case 17: howto_ptr = &howto_rellong; break;        \
326      case 25: howto_ptr = &howto_iprmed; break;         \
327      case 27: howto_ptr = &howto_optcall; break;        \
328      default: howto_ptr = 0; break;                     \
329      }                                                  \
330    (cache_ptr)->howto = howto_ptr;                      \
331  }
332
333 /* i960 COFF is used by VxWorks 5.1.  However, VxWorks 5.1 does not
334    appear to correctly handle a reloc against a symbol defined in the
335    same object file.  It appears to simply discard such relocs, rather
336    than adding their values into the object file.  We handle this by
337    converting all relocs against global symbols into relocs against
338    internal symbols at the start of the section.  This routine is
339    called at the start of the linking process, and it creates the
340    necessary symbols.  */
341
342 static bfd_boolean
343 coff_i960_start_final_link (abfd, info)
344      bfd *abfd;
345      struct bfd_link_info *info;
346 {
347   bfd_size_type symesz = bfd_coff_symesz (abfd);
348   asection *o;
349   bfd_byte *esym;
350
351   if (! info->relocatable)
352     return TRUE;
353
354   esym = (bfd_byte *) bfd_malloc (symesz);
355   if (esym == NULL)
356     return FALSE;
357
358   if (bfd_seek (abfd, obj_sym_filepos (abfd), SEEK_SET) != 0)
359     return FALSE;
360
361   for (o = abfd->sections; o != NULL; o = o->next)
362     {
363       struct internal_syment isym;
364
365       strncpy (isym._n._n_name, o->name, SYMNMLEN);
366       isym.n_value = 0;
367       isym.n_scnum = o->target_index;
368       isym.n_type = T_NULL;
369       isym.n_sclass = C_STAT;
370       isym.n_numaux = 0;
371
372       bfd_coff_swap_sym_out (abfd, (PTR) &isym, (PTR) esym);
373
374       if (bfd_bwrite (esym, symesz, abfd) != symesz)
375         {
376           free (esym);
377           return FALSE;
378         }
379
380       obj_raw_syment_count (abfd) += 1;
381     }
382
383   free (esym);
384
385   return TRUE;
386 }
387
388 /* The reloc processing routine for the optimized COFF linker.  */
389
390 static bfd_boolean
391 coff_i960_relocate_section (output_bfd, info, input_bfd, input_section,
392                             contents, relocs, syms, sections)
393      bfd *output_bfd ATTRIBUTE_UNUSED;
394      struct bfd_link_info *info;
395      bfd *input_bfd;
396      asection *input_section;
397      bfd_byte *contents;
398      struct internal_reloc *relocs;
399      struct internal_syment *syms;
400      asection **sections;
401 {
402   struct internal_reloc *rel;
403   struct internal_reloc *relend;
404
405   rel = relocs;
406   relend = rel + input_section->reloc_count;
407   for (; rel < relend; rel++)
408     {
409       long symndx;
410       struct coff_link_hash_entry *h;
411       struct internal_syment *sym;
412       bfd_vma addend;
413       bfd_vma val;
414       reloc_howto_type *howto;
415       bfd_reloc_status_type rstat = bfd_reloc_ok;
416       bfd_boolean done;
417
418       symndx = rel->r_symndx;
419
420       if (symndx == -1)
421         {
422           h = NULL;
423           sym = NULL;
424         }
425       else
426         {
427           h = obj_coff_sym_hashes (input_bfd)[symndx];
428           sym = syms + symndx;
429         }
430
431       if (sym != NULL && sym->n_scnum != 0)
432         addend = - sym->n_value;
433       else
434         addend = 0;
435
436       switch (rel->r_type)
437         {
438         case 17: howto = &howto_rellong; break;
439         case 25: howto = &howto_iprmed; break;
440         case 27: howto = &howto_optcall; break;
441         default:
442           bfd_set_error (bfd_error_bad_value);
443           return FALSE;
444         }
445
446       val = 0;
447
448       if (h == NULL)
449         {
450           asection *sec;
451
452           if (symndx == -1)
453             {
454               sec = bfd_abs_section_ptr;
455               val = 0;
456             }
457           else
458             {
459               sec = sections[symndx];
460               val = (sec->output_section->vma
461                      + sec->output_offset
462                      + sym->n_value
463                      - sec->vma);
464             }
465         }
466       else
467         {
468           if (h->root.type == bfd_link_hash_defined
469               || h->root.type == bfd_link_hash_defweak)
470             {
471               asection *sec;
472
473               sec = h->root.u.def.section;
474               val = (h->root.u.def.value
475                      + sec->output_section->vma
476                      + sec->output_offset);
477             }
478           else if (! info->relocatable)
479             {
480               if (! ((*info->callbacks->undefined_symbol)
481                      (info, h->root.root.string, input_bfd, input_section,
482                       rel->r_vaddr - input_section->vma, TRUE)))
483                 return FALSE;
484             }
485         }
486
487       done = FALSE;
488
489       if (howto->type == R_OPTCALL && ! info->relocatable && symndx != -1)
490         {
491           int class_val;
492
493           if (h != NULL)
494             class_val = h->symbol_class;
495           else
496             class_val = sym->n_sclass;
497
498           switch (class_val)
499             {
500             case C_NULL:
501               /* This symbol is apparently not from a COFF input file.
502                  We warn, and then assume that it is not a leaf
503                  function.  */
504               if (! ((*info->callbacks->reloc_dangerous)
505                      (info,
506                       _("uncertain calling convention for non-COFF symbol"),
507                       input_bfd, input_section,
508                       rel->r_vaddr - input_section->vma)))
509                 return FALSE;
510               break;
511             case C_LEAFSTAT:
512             case C_LEAFEXT:
513               /* This is a call to a leaf procedure; use the bal
514                  instruction.  */
515               {
516                 long olf;
517                 unsigned long word;
518
519                 if (h != NULL)
520                   {
521                     BFD_ASSERT (h->numaux == 2);
522                     olf = h->aux[1].x_bal.x_balntry;
523                   }
524                 else
525                   {
526                     bfd_byte *esyms;
527                     union internal_auxent aux;
528
529                     BFD_ASSERT (sym->n_numaux == 2);
530                     esyms = (bfd_byte *) obj_coff_external_syms (input_bfd);
531                     esyms += (symndx + 2) * bfd_coff_symesz (input_bfd);
532                     bfd_coff_swap_aux_in (input_bfd, (PTR) esyms, sym->n_type,
533                                           sym->n_sclass, 1, sym->n_numaux,
534                                           (PTR) &aux);
535                     olf = aux.x_bal.x_balntry;
536                   }
537
538                 word = bfd_get_32 (input_bfd,
539                                    (contents
540                                     + (rel->r_vaddr - input_section->vma)));
541                 word = ((word + olf - val) & BAL_MASK) | BAL;
542                 bfd_put_32 (input_bfd,
543                             (bfd_vma) word,
544                             contents + (rel->r_vaddr - input_section->vma));
545                 done = TRUE;
546               }
547               break;
548             case C_SCALL:
549               BFD_ASSERT (0);
550               break;
551             }
552         }
553
554       if (! done)
555         {
556           if (howto->pc_relative)
557             addend += input_section->vma;
558           rstat = _bfd_final_link_relocate (howto, input_bfd, input_section,
559                                             contents,
560                                             rel->r_vaddr - input_section->vma,
561                                             val, addend);
562         }
563
564       switch (rstat)
565         {
566         default:
567           abort ();
568         case bfd_reloc_ok:
569           break;
570         case bfd_reloc_overflow:
571           {
572             const char *name;
573             char buf[SYMNMLEN + 1];
574
575             if (symndx == -1)
576               name = "*ABS*";
577             else if (h != NULL)
578               name = NULL;
579             else
580               {
581                 name = _bfd_coff_internal_syment_name (input_bfd, sym, buf);
582                 if (name == NULL)
583                   return FALSE;
584               }
585
586             if (! ((*info->callbacks->reloc_overflow)
587                    (info, (h ? &h->root : NULL), name, howto->name,
588                     (bfd_vma) 0, input_bfd, input_section,
589                     rel->r_vaddr - input_section->vma)))
590               return FALSE;
591           }
592         }
593     }
594
595   return TRUE;
596 }
597
598 /* Adjust the symbol index of any reloc against a global symbol to
599    instead be a reloc against the internal symbol we created specially
600    for the section.  */
601
602 static bfd_boolean
603 coff_i960_adjust_symndx (obfd, info, ibfd, sec, irel, adjustedp)
604      bfd *obfd ATTRIBUTE_UNUSED;
605      struct bfd_link_info *info ATTRIBUTE_UNUSED;
606      bfd *ibfd;
607      asection *sec ATTRIBUTE_UNUSED;
608      struct internal_reloc *irel;
609      bfd_boolean *adjustedp;
610 {
611   struct coff_link_hash_entry *h;
612
613   *adjustedp = FALSE;
614
615   h = obj_coff_sym_hashes (ibfd)[irel->r_symndx];
616   if (h == NULL
617       || (h->root.type != bfd_link_hash_defined
618           && h->root.type != bfd_link_hash_defweak))
619     return TRUE;
620
621   irel->r_symndx = h->root.u.def.section->output_section->target_index - 1;
622   *adjustedp = TRUE;
623
624   return TRUE;
625 }
626
627 #define coff_bfd_is_local_label_name coff_i960_is_local_label_name
628
629 #define coff_start_final_link coff_i960_start_final_link
630
631 #define coff_relocate_section coff_i960_relocate_section
632
633 #define coff_adjust_symndx coff_i960_adjust_symndx
634
635 #define coff_bfd_reloc_type_lookup coff_i960_reloc_type_lookup
636 #define coff_bfd_reloc_name_lookup coff_i960_reloc_name_lookup
637
638 #include "coffcode.h"
639
640 extern const bfd_target icoff_big_vec;
641
642 CREATE_LITTLE_COFF_TARGET_VEC (icoff_little_vec, "coff-Intel-little", 0, 0, '_', & icoff_big_vec, COFF_SWAP_TABLE)
643
644 const bfd_target icoff_big_vec =
645 {
646   "coff-Intel-big",             /* name */
647   bfd_target_coff_flavour,
648   BFD_ENDIAN_LITTLE,            /* data byte order is little */
649   BFD_ENDIAN_BIG,               /* header byte order is big */
650
651   (HAS_RELOC | EXEC_P |         /* object flags */
652    HAS_LINENO | HAS_DEBUG |
653    HAS_SYMS | HAS_LOCALS | WP_TEXT),
654
655   (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */
656   '_',                          /* leading underscore */
657   '/',                          /* ar_pad_char */
658   15,                           /* ar_max_namelen */
659
660 bfd_getl64, bfd_getl_signed_64, bfd_putl64,
661      bfd_getl32, bfd_getl_signed_32, bfd_putl32,
662      bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* data */
663 bfd_getb64, bfd_getb_signed_64, bfd_putb64,
664      bfd_getb32, bfd_getb_signed_32, bfd_putb32,
665      bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* hdrs */
666
667   {_bfd_dummy_target, coff_object_p, /* bfd_check_format */
668      bfd_generic_archive_p, _bfd_dummy_target},
669   {bfd_false, coff_mkobject,    /* bfd_set_format */
670      _bfd_generic_mkarchive, bfd_false},
671   {bfd_false, coff_write_object_contents,       /* bfd_write_contents */
672      _bfd_write_archive_contents, bfd_false},
673
674      BFD_JUMP_TABLE_GENERIC (coff),
675      BFD_JUMP_TABLE_COPY (coff),
676      BFD_JUMP_TABLE_CORE (_bfd_nocore),
677      BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff),
678      BFD_JUMP_TABLE_SYMBOLS (coff),
679      BFD_JUMP_TABLE_RELOCS (coff),
680      BFD_JUMP_TABLE_WRITE (coff),
681      BFD_JUMP_TABLE_LINK (coff),
682      BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
683
684   & icoff_little_vec,
685
686   COFF_SWAP_TABLE
687 };