PR binutils/15462
[platform/upstream/binutils.git] / bfd / coff-i386.c
1 /* BFD back-end for Intel 386 COFF files.
2    Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
3    2000, 2001, 2002, 2003, 2004, 2005, 2007, 2008, 2009, 2010, 2011, 2012
4    Free Software Foundation, Inc.
5    Written by Cygnus Support.
6
7    This file is part of BFD, the Binary File Descriptor library.
8
9    This program is free software; you can redistribute it and/or modify
10    it under the terms of the GNU General Public License as published by
11    the Free Software Foundation; either version 3 of the License, or
12    (at your option) any later version.
13
14    This program is distributed in the hope that it will be useful,
15    but WITHOUT ANY WARRANTY; without even the implied warranty of
16    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17    GNU General Public License for more details.
18
19    You should have received a copy of the GNU General Public License
20    along with this program; if not, write to the Free Software
21    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
22    MA 02110-1301, USA.  */
23
24 #include "sysdep.h"
25 #include "bfd.h"
26 #include "libbfd.h"
27
28 #include "coff/i386.h"
29
30 #include "coff/internal.h"
31
32 #ifdef COFF_WITH_PE
33 #include "coff/pe.h"
34 #endif
35
36 #ifdef COFF_GO32_EXE
37 #include "coff/go32exe.h"
38 #endif
39
40 #ifndef bfd_pe_print_pdata
41 #define bfd_pe_print_pdata      NULL
42 #endif
43
44 #include "libcoff.h"
45
46 static reloc_howto_type *coff_i386_rtype_to_howto
47   (bfd *, asection *, struct internal_reloc *,
48    struct coff_link_hash_entry *, struct internal_syment *,
49    bfd_vma *);
50 static reloc_howto_type *coff_i386_reloc_type_lookup
51   (bfd *, bfd_reloc_code_real_type);
52
53 #define COFF_DEFAULT_SECTION_ALIGNMENT_POWER (2)
54 /* The page size is a guess based on ELF.  */
55
56 #define COFF_PAGE_SIZE 0x1000
57
58 /* For some reason when using i386 COFF the value stored in the .text
59    section for a reference to a common symbol is the value itself plus
60    any desired offset.  Ian Taylor, Cygnus Support.  */
61
62 /* If we are producing relocatable output, we need to do some
63    adjustments to the object file that are not done by the
64    bfd_perform_relocation function.  This function is called by every
65    reloc type to make any required adjustments.  */
66
67 static bfd_reloc_status_type
68 coff_i386_reloc (bfd *abfd,
69                  arelent *reloc_entry,
70                  asymbol *symbol,
71                  void * data,
72                  asection *input_section ATTRIBUTE_UNUSED,
73                  bfd *output_bfd,
74                  char **error_message ATTRIBUTE_UNUSED)
75 {
76   symvalue diff;
77
78 #ifndef COFF_WITH_PE
79   if (output_bfd == (bfd *) NULL)
80     return bfd_reloc_continue;
81 #endif
82
83   if (bfd_is_com_section (symbol->section))
84     {
85 #ifndef COFF_WITH_PE
86       /* We are relocating a common symbol.  The current value in the
87          object file is ORIG + OFFSET, where ORIG is the value of the
88          common symbol as seen by the object file when it was compiled
89          (this may be zero if the symbol was undefined) and OFFSET is
90          the offset into the common symbol (normally zero, but may be
91          non-zero when referring to a field in a common structure).
92          ORIG is the negative of reloc_entry->addend, which is set by
93          the CALC_ADDEND macro below.  We want to replace the value in
94          the object file with NEW + OFFSET, where NEW is the value of
95          the common symbol which we are going to put in the final
96          object file.  NEW is symbol->value.  */
97       diff = symbol->value + reloc_entry->addend;
98 #else
99       /* In PE mode, we do not offset the common symbol.  */
100       diff = reloc_entry->addend;
101 #endif
102     }
103   else
104     {
105       /* For some reason bfd_perform_relocation always effectively
106          ignores the addend for a COFF target when producing
107          relocatable output.  This seems to be always wrong for 386
108          COFF, so we handle the addend here instead.  */
109 #ifdef COFF_WITH_PE
110       if (output_bfd == (bfd *) NULL)
111         {
112           reloc_howto_type *howto = reloc_entry->howto;
113
114           /* Although PC relative relocations are very similar between
115              PE and non-PE formats, but they are off by 1 << howto->size
116              bytes. For the external relocation, PE is very different
117              from others. See md_apply_fix3 () in gas/config/tc-i386.c.
118              When we link PE and non-PE object files together to
119              generate a non-PE executable, we have to compensate it
120              here.  */
121           if (howto->pc_relative && howto->pcrel_offset)
122             diff = -(1 << howto->size);
123           else if (symbol->flags & BSF_WEAK)
124             diff = reloc_entry->addend - symbol->value;
125           else
126             diff = -reloc_entry->addend;
127         }
128       else
129 #endif
130         diff = reloc_entry->addend;
131     }
132
133 #ifdef COFF_WITH_PE
134   /* FIXME: How should this case be handled?  */
135   if (reloc_entry->howto->type == R_IMAGEBASE
136       && output_bfd != NULL
137       && bfd_get_flavour(output_bfd) == bfd_target_coff_flavour)
138     diff -= pe_data (output_bfd)->pe_opthdr.ImageBase;
139 #endif
140
141 #define DOIT(x) \
142   x = ((x & ~howto->dst_mask) | (((x & howto->src_mask) + diff) & howto->dst_mask))
143
144     if (diff != 0)
145       {
146         reloc_howto_type *howto = reloc_entry->howto;
147         unsigned char *addr = (unsigned char *) data + reloc_entry->address;
148
149         switch (howto->size)
150           {
151           case 0:
152             {
153               char x = bfd_get_8 (abfd, addr);
154               DOIT (x);
155               bfd_put_8 (abfd, x, addr);
156             }
157             break;
158
159           case 1:
160             {
161               short x = bfd_get_16 (abfd, addr);
162               DOIT (x);
163               bfd_put_16 (abfd, (bfd_vma) x, addr);
164             }
165             break;
166
167           case 2:
168             {
169               long x = bfd_get_32 (abfd, addr);
170               DOIT (x);
171               bfd_put_32 (abfd, (bfd_vma) x, addr);
172             }
173             break;
174
175           default:
176             abort ();
177           }
178       }
179
180   /* Now let bfd_perform_relocation finish everything up.  */
181   return bfd_reloc_continue;
182 }
183
184 #ifdef COFF_WITH_PE
185 /* Return TRUE if this relocation should appear in the output .reloc
186    section.  */
187
188 static bfd_boolean in_reloc_p (bfd * abfd ATTRIBUTE_UNUSED,
189                                reloc_howto_type *howto)
190 {
191   return ! howto->pc_relative && howto->type != R_IMAGEBASE
192          && howto->type != R_SECREL32;
193 }
194 #endif /* COFF_WITH_PE */
195
196 #ifndef PCRELOFFSET
197 #define PCRELOFFSET FALSE
198 #endif
199
200 static reloc_howto_type howto_table[] =
201 {
202   EMPTY_HOWTO (0),
203   EMPTY_HOWTO (1),
204   EMPTY_HOWTO (2),
205   EMPTY_HOWTO (3),
206   EMPTY_HOWTO (4),
207   EMPTY_HOWTO (5),
208   HOWTO (R_DIR32,               /* type */
209          0,                     /* rightshift */
210          2,                     /* size (0 = byte, 1 = short, 2 = long) */
211          32,                    /* bitsize */
212          FALSE,                 /* pc_relative */
213          0,                     /* bitpos */
214          complain_overflow_bitfield, /* complain_on_overflow */
215          coff_i386_reloc,       /* special_function */
216          "dir32",               /* name */
217          TRUE,                  /* partial_inplace */
218          0xffffffff,            /* src_mask */
219          0xffffffff,            /* dst_mask */
220          TRUE),                 /* pcrel_offset */
221   /* PE IMAGE_REL_I386_DIR32NB relocation (7).  */
222   HOWTO (R_IMAGEBASE,           /* type */
223          0,                     /* rightshift */
224          2,                     /* size (0 = byte, 1 = short, 2 = long) */
225          32,                    /* bitsize */
226          FALSE,                 /* pc_relative */
227          0,                     /* bitpos */
228          complain_overflow_bitfield, /* complain_on_overflow */
229          coff_i386_reloc,       /* special_function */
230          "rva32",               /* name */
231          TRUE,                  /* partial_inplace */
232          0xffffffff,            /* src_mask */
233          0xffffffff,            /* dst_mask */
234          FALSE),                /* pcrel_offset */
235   EMPTY_HOWTO (010),
236   EMPTY_HOWTO (011),
237   EMPTY_HOWTO (012),
238 #ifdef COFF_WITH_PE
239   /* 32-bit longword section relative relocation (013).  */
240   HOWTO (R_SECREL32,            /* type */
241          0,                     /* rightshift */
242          2,                     /* size (0 = byte, 1 = short, 2 = long) */
243          32,                    /* bitsize */
244          FALSE,                 /* pc_relative */
245          0,                     /* bitpos */
246          complain_overflow_bitfield, /* complain_on_overflow */
247          coff_i386_reloc,       /* special_function */
248          "secrel32",            /* name */
249          TRUE,                  /* partial_inplace */
250          0xffffffff,            /* src_mask */
251          0xffffffff,            /* dst_mask */
252          TRUE),                 /* pcrel_offset */
253 #else
254   EMPTY_HOWTO (013),
255 #endif
256   EMPTY_HOWTO (014),
257   EMPTY_HOWTO (015),
258   EMPTY_HOWTO (016),
259   /* Byte relocation (017).  */
260   HOWTO (R_RELBYTE,             /* type */
261          0,                     /* rightshift */
262          0,                     /* size (0 = byte, 1 = short, 2 = long) */
263          8,                     /* bitsize */
264          FALSE,                 /* pc_relative */
265          0,                     /* bitpos */
266          complain_overflow_bitfield, /* complain_on_overflow */
267          coff_i386_reloc,       /* special_function */
268          "8",                   /* name */
269          TRUE,                  /* partial_inplace */
270          0x000000ff,            /* src_mask */
271          0x000000ff,            /* dst_mask */
272          PCRELOFFSET),          /* pcrel_offset */
273   /* 16-bit word relocation (020).  */
274   HOWTO (R_RELWORD,             /* type */
275          0,                     /* rightshift */
276          1,                     /* size (0 = byte, 1 = short, 2 = long) */
277          16,                    /* bitsize */
278          FALSE,                 /* pc_relative */
279          0,                     /* bitpos */
280          complain_overflow_bitfield, /* complain_on_overflow */
281          coff_i386_reloc,       /* special_function */
282          "16",                  /* name */
283          TRUE,                  /* partial_inplace */
284          0x0000ffff,            /* src_mask */
285          0x0000ffff,            /* dst_mask */
286          PCRELOFFSET),          /* pcrel_offset */
287   /* 32-bit longword relocation (021).  */
288   HOWTO (R_RELLONG,             /* type */
289          0,                     /* rightshift */
290          2,                     /* size (0 = byte, 1 = short, 2 = long) */
291          32,                    /* bitsize */
292          FALSE,                 /* pc_relative */
293          0,                     /* bitpos */
294          complain_overflow_bitfield, /* complain_on_overflow */
295          coff_i386_reloc,       /* special_function */
296          "32",                  /* name */
297          TRUE,                  /* partial_inplace */
298          0xffffffff,            /* src_mask */
299          0xffffffff,            /* dst_mask */
300          PCRELOFFSET),          /* pcrel_offset */
301   /* Byte PC relative relocation (022).  */
302   HOWTO (R_PCRBYTE,             /* type */
303          0,                     /* rightshift */
304          0,                     /* size (0 = byte, 1 = short, 2 = long) */
305          8,                     /* bitsize */
306          TRUE,                  /* pc_relative */
307          0,                     /* bitpos */
308          complain_overflow_signed, /* complain_on_overflow */
309          coff_i386_reloc,       /* special_function */
310          "DISP8",               /* name */
311          TRUE,                  /* partial_inplace */
312          0x000000ff,            /* src_mask */
313          0x000000ff,            /* dst_mask */
314          PCRELOFFSET),          /* pcrel_offset */
315   /* 16-bit word PC relative relocation (023).  */
316   HOWTO (R_PCRWORD,             /* type */
317          0,                     /* rightshift */
318          1,                     /* size (0 = byte, 1 = short, 2 = long) */
319          16,                    /* bitsize */
320          TRUE,                  /* pc_relative */
321          0,                     /* bitpos */
322          complain_overflow_signed, /* complain_on_overflow */
323          coff_i386_reloc,       /* special_function */
324          "DISP16",              /* name */
325          TRUE,                  /* partial_inplace */
326          0x0000ffff,            /* src_mask */
327          0x0000ffff,            /* dst_mask */
328          PCRELOFFSET),          /* pcrel_offset */
329   /* 32-bit longword PC relative relocation (024).  */
330   HOWTO (R_PCRLONG,             /* type */
331          0,                     /* rightshift */
332          2,                     /* size (0 = byte, 1 = short, 2 = long) */
333          32,                    /* bitsize */
334          TRUE,                  /* pc_relative */
335          0,                     /* bitpos */
336          complain_overflow_signed, /* complain_on_overflow */
337          coff_i386_reloc,       /* special_function */
338          "DISP32",              /* name */
339          TRUE,                  /* partial_inplace */
340          0xffffffff,            /* src_mask */
341          0xffffffff,            /* dst_mask */
342          PCRELOFFSET)           /* pcrel_offset */
343 };
344
345 /* Turn a howto into a reloc  nunmber */
346
347 #define SELECT_RELOC(x,howto) { x.r_type = howto->type; }
348 #define BADMAG(x) I386BADMAG(x)
349 #define I386 1                  /* Customize coffcode.h */
350
351 #define RTYPE2HOWTO(cache_ptr, dst)                                     \
352   ((cache_ptr)->howto =                                                 \
353    ((dst)->r_type < sizeof (howto_table) / sizeof (howto_table[0])      \
354     ? howto_table + (dst)->r_type                                       \
355     : NULL))
356
357 /* For 386 COFF a STYP_NOLOAD | STYP_BSS section is part of a shared
358    library.  On some other COFF targets STYP_BSS is normally
359    STYP_NOLOAD.  */
360 #define BSS_NOLOAD_IS_SHARED_LIBRARY
361
362 /* Compute the addend of a reloc.  If the reloc is to a common symbol,
363    the object file contains the value of the common symbol.  By the
364    time this is called, the linker may be using a different symbol
365    from a different object file with a different value.  Therefore, we
366    hack wildly to locate the original symbol from this file so that we
367    can make the correct adjustment.  This macro sets coffsym to the
368    symbol from the original file, and uses it to set the addend value
369    correctly.  If this is not a common symbol, the usual addend
370    calculation is done, except that an additional tweak is needed for
371    PC relative relocs.
372    FIXME: This macro refers to symbols and asect; these are from the
373    calling function, not the macro arguments.  */
374
375 #define CALC_ADDEND(abfd, ptr, reloc, cache_ptr)                \
376   {                                                             \
377     coff_symbol_type *coffsym = (coff_symbol_type *) NULL;      \
378     if (ptr && bfd_asymbol_bfd (ptr) != abfd)                   \
379       coffsym = (obj_symbols (abfd)                             \
380                  + (cache_ptr->sym_ptr_ptr - symbols));         \
381     else if (ptr)                                               \
382       coffsym = coff_symbol_from (abfd, ptr);                   \
383     if (coffsym != (coff_symbol_type *) NULL                    \
384         && coffsym->native->u.syment.n_scnum == 0)              \
385       cache_ptr->addend = - coffsym->native->u.syment.n_value;  \
386     else if (ptr && bfd_asymbol_bfd (ptr) == abfd               \
387              && ptr->section != (asection *) NULL)              \
388       cache_ptr->addend = - (ptr->section->vma + ptr->value);   \
389     else                                                        \
390       cache_ptr->addend = 0;                                    \
391     if (ptr && howto_table[reloc.r_type].pc_relative)           \
392       cache_ptr->addend += asect->vma;                          \
393   }
394
395 /* We use the special COFF backend linker.  For normal i386 COFF, we
396    can use the generic relocate_section routine.  For PE, we need our
397    own routine.  */
398
399 #ifndef COFF_WITH_PE
400
401 #define coff_relocate_section _bfd_coff_generic_relocate_section
402
403 #else /* COFF_WITH_PE */
404
405 /* The PE relocate section routine.  The only difference between this
406    and the regular routine is that we don't want to do anything for a
407    relocatable link.  */
408
409 static bfd_boolean
410 coff_pe_i386_relocate_section (bfd *output_bfd,
411                                struct bfd_link_info *info,
412                                bfd *input_bfd,
413                                asection *input_section,
414                                bfd_byte *contents,
415                                struct internal_reloc *relocs,
416                                struct internal_syment *syms,
417                                asection **sections)
418 {
419   if (info->relocatable)
420     return TRUE;
421
422   return _bfd_coff_generic_relocate_section (output_bfd, info, input_bfd,
423                                              input_section, contents,
424                                              relocs, syms, sections);
425 }
426
427 #define coff_relocate_section coff_pe_i386_relocate_section
428
429 #endif /* COFF_WITH_PE */
430
431 /* Convert an rtype to howto for the COFF backend linker.  */
432
433 static reloc_howto_type *
434 coff_i386_rtype_to_howto (bfd *abfd ATTRIBUTE_UNUSED,
435                           asection *sec,
436                           struct internal_reloc *rel,
437                           struct coff_link_hash_entry *h,
438                           struct internal_syment *sym,
439                           bfd_vma *addendp)
440 {
441   reloc_howto_type *howto;
442
443   if (rel->r_type >= sizeof (howto_table) / sizeof (howto_table[0]))
444     {
445       bfd_set_error (bfd_error_bad_value);
446       return NULL;
447     }
448
449   howto = howto_table + rel->r_type;
450
451 #ifdef COFF_WITH_PE
452   /* Cancel out code in _bfd_coff_generic_relocate_section.  */
453   *addendp = 0;
454 #endif
455
456   if (howto->pc_relative)
457     *addendp += sec->vma;
458
459   if (sym != NULL && sym->n_scnum == 0 && sym->n_value != 0)
460     {
461       /* This is a common symbol.  The section contents include the
462          size (sym->n_value) as an addend.  The relocate_section
463          function will be adding in the final value of the symbol.  We
464          need to subtract out the current size in order to get the
465          correct result.  */
466
467       BFD_ASSERT (h != NULL);
468
469 #ifndef COFF_WITH_PE
470       /* I think we *do* want to bypass this.  If we don't, I have
471          seen some data parameters get the wrong relocation address.
472          If I link two versions with and without this section bypassed
473          and then do a binary comparison, the addresses which are
474          different can be looked up in the map.  The case in which
475          this section has been bypassed has addresses which correspond
476          to values I can find in the map.  */
477       *addendp -= sym->n_value;
478 #endif
479     }
480
481 #ifndef COFF_WITH_PE
482   /* If the output symbol is common (in which case this must be a
483      relocatable link), we need to add in the final size of the
484      common symbol.  */
485   if (h != NULL && h->root.type == bfd_link_hash_common)
486     *addendp += h->root.u.c.size;
487 #endif
488
489 #ifdef COFF_WITH_PE
490   if (howto->pc_relative)
491     {
492       *addendp -= 4;
493
494       /* If the symbol is defined, then the generic code is going to
495          add back the symbol value in order to cancel out an
496          adjustment it made to the addend.  However, we set the addend
497          to 0 at the start of this function.  We need to adjust here,
498          to avoid the adjustment the generic code will make.  FIXME:
499          This is getting a bit hackish.  */
500       if (sym != NULL && sym->n_scnum != 0)
501         *addendp -= sym->n_value;
502     }
503
504   if (rel->r_type == R_IMAGEBASE
505       && (bfd_get_flavour(sec->output_section->owner)
506           == bfd_target_coff_flavour))
507     {
508       *addendp -= pe_data(sec->output_section->owner)->pe_opthdr.ImageBase;
509     }
510
511   BFD_ASSERT (sym != NULL);
512   if (rel->r_type == R_SECREL32 && sym != NULL)
513     {
514       bfd_vma osect_vma;
515
516       if (h && (h->root.type == bfd_link_hash_defined
517                 || h->root.type == bfd_link_hash_defweak))
518         osect_vma = h->root.u.def.section->output_section->vma;
519       else
520         {
521           asection *s;
522           int i;
523
524           /* Sigh, the only way to get the section to offset against
525              is to find it the hard way.  */
526
527           for (s = abfd->sections, i = 1; i < sym->n_scnum; i++)
528             s = s->next;
529
530           osect_vma = s->output_section->vma;
531         }
532
533       *addendp -= osect_vma;
534     }
535 #endif
536
537   return howto;
538 }
539
540 #define coff_bfd_reloc_type_lookup coff_i386_reloc_type_lookup
541 #define coff_bfd_reloc_name_lookup coff_i386_reloc_name_lookup
542
543 static reloc_howto_type *
544 coff_i386_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
545                              bfd_reloc_code_real_type code)
546 {
547   switch (code)
548     {
549     case BFD_RELOC_RVA:
550       return howto_table + R_IMAGEBASE;
551     case BFD_RELOC_32:
552       return howto_table + R_DIR32;
553     case BFD_RELOC_32_PCREL:
554       return howto_table + R_PCRLONG;
555     case BFD_RELOC_16:
556       return howto_table + R_RELWORD;
557     case BFD_RELOC_16_PCREL:
558       return howto_table + R_PCRWORD;
559     case BFD_RELOC_8:
560       return howto_table + R_RELBYTE;
561     case BFD_RELOC_8_PCREL:
562       return howto_table + R_PCRBYTE;
563 #ifdef COFF_WITH_PE
564     case BFD_RELOC_32_SECREL:
565       return howto_table + R_SECREL32;
566 #endif
567     default:
568       BFD_FAIL ();
569       return 0;
570     }
571 }
572
573 static reloc_howto_type *
574 coff_i386_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
575                              const char *r_name)
576 {
577   unsigned int i;
578
579   for (i = 0; i < sizeof (howto_table) / sizeof (howto_table[0]); i++)
580     if (howto_table[i].name != NULL
581         && strcasecmp (howto_table[i].name, r_name) == 0)
582       return &howto_table[i];
583
584   return NULL;
585 }
586
587 #define coff_rtype_to_howto coff_i386_rtype_to_howto
588
589 #ifdef TARGET_UNDERSCORE
590
591 /* If i386 gcc uses underscores for symbol names, then it does not use
592    a leading dot for local labels, so if TARGET_UNDERSCORE is defined
593    we treat all symbols starting with L as local.  */
594
595 static bfd_boolean
596 coff_i386_is_local_label_name (bfd *abfd, const char *name)
597 {
598   if (name[0] == 'L')
599     return TRUE;
600
601   return _bfd_coff_is_local_label_name (abfd, name);
602 }
603
604 #define coff_bfd_is_local_label_name coff_i386_is_local_label_name
605
606 #endif /* TARGET_UNDERSCORE */
607
608 #include "coffcode.h"
609
610 #define _bfd_generic_find_nearest_line_discriminator \
611         coff_find_nearest_line_discriminator
612
613 const bfd_target
614 #ifdef TARGET_SYM
615   TARGET_SYM =
616 #else
617   i386coff_vec =
618 #endif
619 {
620 #ifdef TARGET_NAME
621   TARGET_NAME,
622 #else
623   "coff-i386",                  /* name */
624 #endif
625   bfd_target_coff_flavour,
626   BFD_ENDIAN_LITTLE,            /* data byte order is little */
627   BFD_ENDIAN_LITTLE,            /* header byte order is little */
628
629   (HAS_RELOC | EXEC_P |         /* object flags */
630    HAS_LINENO | HAS_DEBUG |
631    HAS_SYMS | HAS_LOCALS | WP_TEXT | D_PAGED | BFD_COMPRESS | BFD_DECOMPRESS ),
632
633   (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC /* section flags */
634 #ifdef COFF_WITH_PE
635    | SEC_LINK_ONCE | SEC_LINK_DUPLICATES | SEC_READONLY | SEC_DEBUGGING
636 #endif
637    | SEC_CODE | SEC_DATA | SEC_EXCLUDE ),
638
639 #ifdef TARGET_UNDERSCORE
640   TARGET_UNDERSCORE,            /* leading underscore */
641 #else
642   0,                            /* leading underscore */
643 #endif
644   '/',                          /* ar_pad_char */
645   15,                           /* ar_max_namelen */
646   0,                            /* match priority.  */
647
648   bfd_getl64, bfd_getl_signed_64, bfd_putl64,
649      bfd_getl32, bfd_getl_signed_32, bfd_putl32,
650      bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* data */
651   bfd_getl64, bfd_getl_signed_64, bfd_putl64,
652      bfd_getl32, bfd_getl_signed_32, bfd_putl32,
653      bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* hdrs */
654
655 /* Note that we allow an object file to be treated as a core file as well.  */
656     /* bfd_check_format */
657 #ifdef COFF_CHECK_FORMAT
658     {_bfd_dummy_target, COFF_CHECK_FORMAT,
659        bfd_generic_archive_p, COFF_CHECK_FORMAT},
660 #else
661     {_bfd_dummy_target, coff_object_p, bfd_generic_archive_p, coff_object_p},
662 #endif
663     {bfd_false, coff_mkobject, _bfd_generic_mkarchive, /* bfd_set_format */
664        bfd_false},
665     {bfd_false, coff_write_object_contents, /* bfd_write_contents */
666        _bfd_write_archive_contents, bfd_false},
667
668      BFD_JUMP_TABLE_GENERIC (coff),
669      BFD_JUMP_TABLE_COPY (coff),
670      BFD_JUMP_TABLE_CORE (_bfd_nocore),
671      BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff),
672      BFD_JUMP_TABLE_SYMBOLS (coff),
673      BFD_JUMP_TABLE_RELOCS (coff),
674      BFD_JUMP_TABLE_WRITE (coff),
675      BFD_JUMP_TABLE_LINK (coff),
676      BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
677
678   NULL,
679
680   COFF_SWAP_TABLE
681 };