Replace assert (about endianism) with an error message
[platform/upstream/binutils.git] / bfd / coff-mcore.c
1 /* BFD back-end for Motorolla MCore COFF/PE
2    Copyright 1999
3    Free Software Foundation, Inc.
4
5 This file is part of BFD, the Binary File Descriptor library.
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA.  */
21
22 #include "bfd.h"
23 #include "sysdep.h"
24 #include "libbfd.h"
25 #include "coff/mcore.h"
26 #include "coff/internal.h"
27 #include "coff/pe.h"
28 #include "libcoff.h"
29
30 #ifdef BADMAG
31 #undef BADMAG
32 #endif
33 #define BADMAG(x) MCOREBADMAG(x)
34
35 #ifndef NUM_ELEM
36 #define NUM_ELEM(A) (sizeof (A) / sizeof (A)[0])
37 #endif
38
39 /* This file is compiled more than once, but we only compile the
40    final_link routine once.  */
41 extern boolean mcore_bfd_coff_final_link
42   PARAMS ((bfd *, struct bfd_link_info *));
43
44 static struct bfd_link_hash_table * coff_mcore_link_hash_table_create
45   PARAMS ((bfd *));
46 static bfd_reloc_status_type        mcore_coff_unsupported_reloc 
47   PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
48 static boolean                      in_reloc_p
49   PARAMS ((bfd *, reloc_howto_type *));
50 static boolean                      coff_mcore_relocate_section
51   PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *,
52            struct internal_reloc *, struct internal_syment *, asection **));
53 static reloc_howto_type *           mcore_coff_reloc_type_lookup
54   PARAMS ((bfd *, bfd_reloc_code_real_type));
55 static reloc_howto_type *           coff_mcore_rtype_to_howto
56   PARAMS ((bfd *, asection *, struct internal_reloc *,
57            struct coff_link_hash_entry *, struct internal_syment *, bfd_vma *));
58 static const bfd_target *           pe_object_p
59   PARAMS ((bfd *));
60
61
62 \f
63 /* The NT loader points the toc register to &toc + 32768, in order to
64    use the complete range of a 16-bit displacement. We have to adjust
65    for this when we fix up loads displaced off the toc reg.  */
66 #define TOC_LOAD_ADJUSTMENT (-32768)
67 #define TOC_SECTION_NAME ".private.toc"
68
69 /* The main body of code is in coffcode.h.  */
70 #define COFF_DEFAULT_SECTION_ALIGNMENT_POWER (3)
71
72 /* In case we're on a 32-bit machine, construct a 64-bit "-1" value
73    from smaller values.  Start with zero, widen, *then* decrement.  */
74 #define MINUS_ONE       (((bfd_vma)0) - 1)
75
76 \f
77 static reloc_howto_type mcore_coff_howto_table[] =
78 {
79   /* Unused: */
80   HOWTO (IMAGE_REL_MCORE_ABSOLUTE,/* type */                                 
81          0,                      /* rightshift */                           
82          0,                      /* size (0 = byte, 1 = short, 2 = long) */ 
83          0,                      /* bitsize */                   
84          false,                  /* pc_relative */                          
85          0,                      /* bitpos */                               
86          complain_overflow_dont, /* dont complain_on_overflow */
87          0,                      /* special_function */                     
88          "ABSOLUTE",             /* name */
89          false,                  /* partial_inplace */                      
90          0x00,                   /* src_mask */                             
91          0x00,                   /* dst_mask */                             
92          false),                 /* pcrel_offset */
93   
94   HOWTO (IMAGE_REL_MCORE_ADDR32,/* type */
95          0,                     /* rightshift */                           
96          2,                     /* size (0 = byte, 1 = short, 2 = long) */ 
97          32,                    /* bitsize */                   
98          false,                 /* pc_relative */                          
99          0,                     /* bitpos */                               
100          complain_overflow_bitfield, /* complain_on_overflow */
101          0,                     /* special_function */                     
102          "ADDR32",              /* name */
103          true,                  /* partial_inplace */                      
104          0xffffffff,            /* src_mask */                             
105          0xffffffff,            /* dst_mask */                             
106          false),                /* pcrel_offset */
107   
108   /* 8 bits + 2 zero bits; jmpi/jsri/lrw instructions.
109      Should not appear in object files. */
110   HOWTO (IMAGE_REL_MCORE_PCREL_IMM8BY4, /* type */
111          2,                     /* rightshift */
112          1,                     /* size (0 = byte, 1 = short, 2 = long) */
113          8,                     /* bitsize */
114          true,                  /* pc_relative */
115          0,                     /* bitpos */
116          complain_overflow_bitfield, /* complain_on_overflow */
117          mcore_coff_unsupported_reloc,  /* special_function */
118          "IMM8BY4",             /* name */
119          false,                 /* partial_inplace */
120          0,                     /* src_mask */
121          0,                     /* dst_mask */
122          true),                 /* pcrel_offset */
123
124   /* bsr/bt/bf/br instructions; 11 bits + 1 zero bit 
125      Span 2k instructions == 4k bytes.
126      Only useful pieces at the relocated address are the opcode (5 bits) */
127   HOWTO (IMAGE_REL_MCORE_PCREL_IMM11BY2,/* type */
128          1,                     /* rightshift */
129          1,                     /* size (0 = byte, 1 = short, 2 = long) */
130          11,                    /* bitsize */
131          true,                  /* pc_relative */
132          0,                     /* bitpos */
133          complain_overflow_signed, /* complain_on_overflow */
134          NULL,                  /* special_function */
135          "IMM11BY2",            /* name */
136          false,                 /* partial_inplace */
137          0x0,                   /* src_mask */
138          0x7ff,                 /* dst_mask */
139          true),                 /* pcrel_offset */
140
141   /* 4 bits + 1 zero bit; 'loopt' instruction only; unsupported. */
142   HOWTO (IMAGE_REL_MCORE_PCREL_IMM4BY2, /* type */
143          1,                     /* rightshift */
144          1,                     /* size (0 = byte, 1 = short, 2 = long) */
145          4,                     /* bitsize */
146          true,                  /* pc_relative */
147          0,                     /* bitpos */
148          complain_overflow_bitfield, /* complain_on_overflow */
149          mcore_coff_unsupported_reloc,/* special_function */
150          "IMM4BY2",              /* name */
151          false,                 /* partial_inplace */
152          0,                     /* src_mask */
153          0,                     /* dst_mask */
154          true),                 /* pcrel_offset */
155
156   /* 32-bit pc-relative. Eventually this will help support PIC code. */
157   HOWTO (IMAGE_REL_MCORE_PCREL_32,/* type */
158          0,                     /* rightshift */
159          2,                     /* size (0 = byte, 1 = short, 2 = long) */
160          32,                    /* bitsize */
161          true,                  /* pc_relative */
162          0,                     /* bitpos */
163          complain_overflow_bitfield, /* complain_on_overflow */
164          NULL,                  /* special_function */
165          "PCREL_32",            /* name */
166          false,                 /* partial_inplace */
167          0x0,                   /* src_mask */
168          0xffffffff,            /* dst_mask */
169          true),                 /* pcrel_offset */
170
171   /* Like PCREL_IMM11BY2, this relocation indicates that there is a
172      'jsri' at the specified address. There is a separate relocation
173      entry for the literal pool entry that it references, but we 
174      might be able to change the jsri to a bsr if the target turns out
175      to be close enough [even though we won't reclaim the literal pool
176      entry, we'll get some runtime efficiency back]. Note that this
177      is a relocation that we are allowed to safely ignore.  */ 
178   HOWTO (IMAGE_REL_MCORE_PCREL_JSR_IMM11BY2,/* type */
179          1,                     /* rightshift */
180          1,                     /* size (0 = byte, 1 = short, 2 = long) */
181          11,                    /* bitsize */
182          true,                  /* pc_relative */
183          0,                     /* bitpos */
184          complain_overflow_signed, /* complain_on_overflow */
185          NULL,                  /* special_function */
186          "JSR_IMM11BY2",        /* name */
187          false,                 /* partial_inplace */
188          0x0,                   /* src_mask */
189          0x7ff,                 /* dst_mask */
190          true)                  /* pcrel_offset */
191 };
192 \f
193 /* Extend the coff_link_hash_table structure with a few M*Core specific fields.
194    This allows us to store global data here without actually creating any
195    global variables, which is a no-no in the BFD world.  */
196 typedef struct coff_mcore_link_hash_table
197 {
198   /* The original coff_link_hash_table structure.  MUST be first field.  */
199   struct coff_link_hash_table   root;
200
201   bfd *                         bfd_of_toc_owner;
202   long int                      global_toc_size;
203   long int                      import_table_size;
204   long int                      first_thunk_address;
205   long int                      thunk_size;
206 }
207 mcore_hash_table;
208
209 /* Get the MCore coff linker hash table from a link_info structure.  */
210 #define coff_mcore_hash_table(info) \
211   ((mcore_hash_table *) ((info)->hash))
212
213 /* Create an MCore coff linker hash table.  */
214 static struct bfd_link_hash_table *
215 coff_mcore_link_hash_table_create (abfd)
216      bfd * abfd;
217 {
218   mcore_hash_table * ret;
219
220   ret = ((mcore_hash_table *) bfd_alloc (abfd, sizeof (* ret)));
221   if (ret == (mcore_hash_table *) NULL)
222     return NULL;
223
224   if (! _bfd_coff_link_hash_table_init
225       (& ret->root, abfd, _bfd_coff_link_hash_newfunc))
226     {
227       bfd_release (abfd, ret);
228       return (struct bfd_link_hash_table *) NULL;
229     }
230
231   ret->bfd_of_toc_owner = NULL;
232   ret->global_toc_size  = 0;
233   ret->import_table_size = 0;
234   ret->first_thunk_address = 0;
235   ret->thunk_size = 0;
236
237   return & ret->root.root;
238 }
239 \f
240 /*ARGSUSED*/
241 static bfd_reloc_status_type
242 mcore_coff_unsupported_reloc (abfd, reloc_entry, symbol, data, input_section,
243                            output_bfd, error_message)
244      bfd * abfd;
245      arelent * reloc_entry;
246      asymbol * symbol;
247      PTR data;
248      asection * input_section;
249      bfd * output_bfd;
250      char ** error_message;
251 {
252   BFD_ASSERT (reloc_entry->howto != (reloc_howto_type *)0);
253   
254   _bfd_error_handler (_("%s: Relocation %s (%d) is not currently supported.\n"),
255                       bfd_get_filename (abfd),
256                       reloc_entry->howto->name,
257                       reloc_entry->howto->type);
258   
259   return bfd_reloc_notsupported;
260 }
261
262 \f
263 /* A cheesy little macro to make the code a little more readable. */
264 #define HOW2MAP(bfd_rtype, mcore_rtype)  \
265  case bfd_rtype: return & mcore_coff_howto_table [mcore_rtype]
266
267 static reloc_howto_type *
268 mcore_coff_reloc_type_lookup (abfd, code)
269      bfd * abfd;
270      bfd_reloc_code_real_type code;
271 {
272   switch (code)
273     { 
274       HOW2MAP (BFD_RELOC_32,                       IMAGE_REL_MCORE_ADDR32);
275       HOW2MAP (BFD_RELOC_MCORE_PCREL_IMM8BY4,      IMAGE_REL_MCORE_PCREL_IMM8BY4);
276       HOW2MAP (BFD_RELOC_MCORE_PCREL_IMM11BY2,     IMAGE_REL_MCORE_PCREL_IMM11BY2);
277       HOW2MAP (BFD_RELOC_MCORE_PCREL_IMM4BY2,      IMAGE_REL_MCORE_PCREL_IMM4BY2);
278       HOW2MAP (BFD_RELOC_32_PCREL,                 IMAGE_REL_MCORE_PCREL_32);
279       HOW2MAP (BFD_RELOC_MCORE_PCREL_JSR_IMM11BY2, IMAGE_REL_MCORE_PCREL_JSR_IMM11BY2);
280    default: 
281       return NULL;
282     }
283   /*NOTREACHED*/
284 }
285
286 #undef HOW2MAP
287
288 #define RTYPE2HOWTO(cache_ptr, dst) \
289   (cache_ptr)->howto = mcore_coff_howto_table + (dst)->r_type;
290
291 static reloc_howto_type *
292 coff_mcore_rtype_to_howto (abfd, sec, rel, h, sym, addendp)
293      bfd * abfd;
294      asection * sec;
295      struct internal_reloc * rel;
296      struct coff_link_hash_entry * h;
297      struct internal_syment * sym;
298      bfd_vma * addendp;
299 {
300   reloc_howto_type * howto;
301
302
303   if (rel->r_type >= NUM_ELEM (mcore_coff_howto_table))
304     return NULL;
305   
306   howto = mcore_coff_howto_table + rel->r_type;
307   
308   if (howto->pc_relative)
309     {
310       * addendp = sec->vma - 2; /* XXX guess - is this right ? */
311       
312       /* If the symbol is defined, then the generic code is going to
313          add back the symbol value in order to cancel out an
314          adjustment it made to the addend.  However, we set the addend
315          to 0 at the start of this function.  We need to adjust here,
316          to avoid the adjustment the generic code will make.  FIXME:
317          This is getting a bit hackish.  */
318       if (sym != NULL && sym->n_scnum != 0)
319         * addendp -= sym->n_value;
320     }
321   else
322     * addendp = 0;
323   
324   return howto;
325 }
326 \f
327 /* Return true if this relocation should
328    appear in the output .reloc section. */
329 static boolean in_reloc_p (abfd, howto)
330      bfd * abfd;
331      reloc_howto_type * howto;
332 {
333   return ! howto->pc_relative;
334 }     
335
336 /* The reloc processing routine for the optimized COFF linker.  */
337 static boolean
338 coff_mcore_relocate_section (output_bfd, info, input_bfd, input_section,
339                            contents, relocs, syms, sections)
340      bfd * output_bfd;
341      struct bfd_link_info * info;
342      bfd * input_bfd;
343      asection * input_section;
344      bfd_byte * contents;
345      struct internal_reloc * relocs;
346      struct internal_syment * syms;
347      asection ** sections;
348 {
349   struct internal_reloc * rel;
350   struct internal_reloc * relend;
351   boolean hihalf;
352   bfd_vma hihalf_val;
353   
354   /* If we are performing a relocateable link, we don't need to do a
355      thing.  The caller will take care of adjusting the reloc
356      addresses and symbol indices.  */
357   if (info->relocateable)
358     return true;
359   
360   /* Check if we have the same endianess */
361   if (   input_bfd->xvec->byteorder != output_bfd->xvec->byteorder
362       && output_bfd->xvec->byteorder != BFD_ENDIAN_UNKNOWN)
363     {
364       (*_bfd_error_handler)
365         (_("%s: compiled for a %s endian system and target is %s endian.\n"),
366          bfd_get_filename (input_bfd),
367          bfd_big_endian (input_bfd) ? "big" : "little",
368          bfd_big_endian (output_bfd) ? "big" : "little");
369
370       bfd_set_error (bfd_error_wrong_format);
371       return false;
372     }
373
374   hihalf = false;
375   hihalf_val = 0;
376
377   rel = relocs;
378   relend = rel + input_section->reloc_count;
379   
380   for (; rel < relend; rel++)
381     {
382       asection *                     toc_section = NULL;
383       bfd_vma                        relocation;
384       long                           symndx;
385       struct internal_syment *       sym;
386       bfd_vma                        val;
387       bfd_vma                        addend;
388       bfd_reloc_status_type          rstat;
389       bfd_byte *                     loc;
390       unsigned short                 r_type = rel->r_type;
391       reloc_howto_type *             howto = NULL;
392       struct coff_link_hash_entry *  h;
393       const char *                   my_name;
394   
395       symndx = rel->r_symndx;
396       loc = contents + rel->r_vaddr - input_section->vma;
397
398       if (symndx == -1)
399         {
400           h = NULL;
401           sym = NULL;
402         }
403       else
404         {
405           h = obj_coff_sym_hashes (input_bfd)[symndx];
406           sym = syms + symndx;
407         }
408
409       /* Get the howto and initialise the addend.  */
410       howto = bfd_coff_rtype_to_howto (input_bfd, input_section, rel, h,
411                                        sym, & addend);
412       if (howto == NULL)
413         return false;
414
415       val = 0;
416       
417       if (h == NULL)
418         {
419           if (symndx == -1)
420             my_name = "*ABS*";
421           else
422             {
423               asection * sec = sections[symndx];
424               
425               val = (sym->n_value 
426                      + sec->output_section->vma
427                      + sec->output_offset);
428
429               if (sym == NULL)
430                 my_name = "*unknown*";
431               else if (   sym->_n._n_n._n_zeroes == 0
432                        && sym->_n._n_n._n_offset != 0)
433                 my_name = obj_coff_strings (input_bfd) + sym->_n._n_n._n_offset;
434               else 
435                 {
436                   static char buf [SYMNMLEN + 1];
437                   
438                   strncpy (buf, sym->_n._n_name, SYMNMLEN);
439                   buf[SYMNMLEN] = '\0';
440                   my_name = buf;
441                 }
442             }
443         }
444       else
445         {
446           if (   h->root.type == bfd_link_hash_defined
447               || h->root.type == bfd_link_hash_defweak)
448             {
449               asection * sec = h->root.u.def.section;
450               
451               val = (h->root.u.def.value
452                      + sec->output_section->vma
453                      + sec->output_offset);
454             }
455           else
456             {
457               if (! ((*info->callbacks->undefined_symbol)
458                      (info, h->root.root.string, input_bfd, input_section,
459                       rel->r_vaddr - input_section->vma)))
460                 return false;
461             }
462           
463           my_name = h->root.root.string;
464         }       
465
466       rstat = bfd_reloc_ok;
467       
468       /* Each case must do its own relocation, setting rstat appropriately.  */
469       switch (r_type)
470         {
471         default:
472           _bfd_error_handler (_("%s: unsupported relocation type 0x%02x"),
473                               bfd_get_filename (input_bfd), r_type);
474           bfd_set_error (bfd_error_bad_value);
475           return false;
476           
477         case IMAGE_REL_MCORE_ABSOLUTE:
478           fprintf (stderr, 
479                    _("Warning: unsupported reloc %s <file %s, section %s>\n"), 
480                    howto->name,
481                    bfd_get_filename (input_bfd),
482                    input_section->name);
483           
484           fprintf (stderr,"sym %ld (%s), r_vaddr %ld (%lx)\n", 
485                    rel->r_symndx, my_name, (long) rel->r_vaddr,
486                    (unsigned long) rel->r_vaddr);  
487           break;
488           
489         case IMAGE_REL_MCORE_PCREL_IMM8BY4:
490         case IMAGE_REL_MCORE_PCREL_IMM11BY2:
491         case IMAGE_REL_MCORE_PCREL_IMM4BY2:
492         case IMAGE_REL_MCORE_PCREL_32:
493         case IMAGE_REL_MCORE_PCREL_JSR_IMM11BY2:
494         case IMAGE_REL_MCORE_ADDR32:
495           rstat = _bfd_relocate_contents (howto, input_bfd, val, loc);
496           break;
497         }
498       
499       switch (rstat)
500         {
501         default:
502           abort ();
503           
504         case bfd_reloc_ok:
505           break;
506           
507         case bfd_reloc_overflow:
508           if (! ((*info->callbacks->reloc_overflow)
509                  (info, my_name, howto->name, 
510                   (bfd_vma) 0, input_bfd,
511                   input_section, rel->r_vaddr - input_section->vma)))
512             return false;
513         }
514     }     
515
516   return true;
517 }
518
519 \f
520 /* Tailor coffcode.h -- macro heaven. */
521
522 /* We use the special COFF backend linker, with our own special touch.  */
523
524 #define coff_bfd_reloc_type_lookup   mcore_coff_reloc_type_lookup
525 #define coff_relocate_section        coff_mcore_relocate_section
526 #define coff_rtype_to_howto          coff_mcore_rtype_to_howto
527
528 #define SELECT_RELOC(internal, howto) {internal.r_type = howto->type;}
529
530 #define COFF_PAGE_SIZE               0x1000
531
532 #include "coffcode.h"
533 \f
534 static const bfd_target *
535 pe_object_p (abfd)
536      bfd * abfd;
537 {
538 #ifdef COFF_IMAGE_WITH_PE
539   /* We need to hack badly to handle a PE image correctly.  In PE
540      images created by the GNU linker, the offset to the COFF header
541      is always the size.  However, this is not the case in images
542      generated by other PE linkers.  The PE format stores a four byte
543      offset to the PE signature just before the COFF header at
544      location 0x3c of the file.  We pick up that offset, verify that
545      the PE signature is there, and then set ourselves up to read in
546      the COFF header.  */
547   {
548     bfd_byte ext_offset[4];
549     file_ptr offset;
550     bfd_byte ext_signature[4];
551     unsigned long signature;
552
553     if (bfd_seek (abfd, 0x3c, SEEK_SET) != 0
554         || bfd_read (ext_offset, 1, 4, abfd) != 4)
555       {
556         if (bfd_get_error () != bfd_error_system_call)
557           bfd_set_error (bfd_error_wrong_format);
558         return NULL;
559       }
560     
561     offset = bfd_h_get_32 (abfd, ext_offset);
562     
563     if (bfd_seek (abfd, offset, SEEK_SET) != 0
564         || bfd_read (ext_signature, 1, 4, abfd) != 4)
565       {
566         if (bfd_get_error () != bfd_error_system_call)
567           bfd_set_error (bfd_error_wrong_format);
568         
569         return NULL;
570       }
571     
572     signature = bfd_h_get_32 (abfd, ext_signature);
573
574     if (signature != 0x4550)
575       {
576         bfd_set_error (bfd_error_wrong_format);
577         return NULL;
578       }
579
580     /* Here is the hack.  coff_object_p wants to read filhsz bytes to
581        pick up the COFF header.  We adjust so that that will work.  20
582        is the size of the mips COFF filehdr.  */
583     if (bfd_seek (abfd, (bfd_tell (abfd) - bfd_coff_filhsz (abfd) + 20),
584                   SEEK_SET) != 0)
585       {
586         if (bfd_get_error () != bfd_error_system_call)
587           bfd_set_error (bfd_error_wrong_format);
588         
589         return NULL;
590       }
591   }
592 #endif
593
594   return coff_object_p (abfd);
595 }
596 \f
597 /* The transfer vectors that lead the outside world to all of the above. */
598
599 const bfd_target
600 TARGET_BIG_SYM =
601 {
602   TARGET_BIG_NAME,
603   bfd_target_coff_flavour,      
604   BFD_ENDIAN_BIG,               /* data byte order is big */
605   BFD_ENDIAN_BIG,               /* header byte order is big */
606
607   (HAS_RELOC | EXEC_P |         /* object flags */
608    HAS_LINENO | HAS_DEBUG |
609    HAS_SYMS | HAS_LOCALS | WP_TEXT | D_PAGED),
610
611   (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC /* section flags */
612    | SEC_LINK_ONCE | SEC_LINK_DUPLICATES),
613
614   0,                            /* leading char */
615   '/',                          /* ar_pad_char */
616   15,                           /* ar_max_namelen */
617
618   bfd_getb64, bfd_getb_signed_64, bfd_putb64,
619   bfd_getb32, bfd_getb_signed_32, bfd_putb32,
620   bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* data */
621
622   bfd_getb64, bfd_getb_signed_64, bfd_putb64,
623   bfd_getb32, bfd_getb_signed_32, bfd_putb32,
624   bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* hdrs */
625
626   { _bfd_dummy_target,
627     pe_object_p,                /* bfd_check_format */
628     bfd_generic_archive_p,      /* _bfd_dummy_target */
629     pe_object_p
630   },
631   { bfd_false,
632     coff_mkobject,
633     _bfd_generic_mkarchive,     /* bfd_set_format */
634     bfd_false
635   },
636   { bfd_false,
637     coff_write_object_contents, /* bfd_write_contents */
638     _bfd_write_archive_contents,
639     bfd_false
640   },
641
642   BFD_JUMP_TABLE_GENERIC (coff),
643   BFD_JUMP_TABLE_COPY (coff),
644   BFD_JUMP_TABLE_CORE (_bfd_nocore),
645   BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff),
646   BFD_JUMP_TABLE_SYMBOLS (coff),
647   BFD_JUMP_TABLE_RELOCS (coff),
648   BFD_JUMP_TABLE_WRITE (coff),
649   BFD_JUMP_TABLE_LINK (coff),
650   BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
651
652   COFF_SWAP_TABLE,
653 };
654
655 const bfd_target
656 TARGET_LITTLE_SYM =
657 {
658   TARGET_LITTLE_NAME,
659   bfd_target_coff_flavour,
660   BFD_ENDIAN_LITTLE,            /* data byte order is little */
661   BFD_ENDIAN_LITTLE,            /* header byte order is little */
662
663   (HAS_RELOC | EXEC_P |         /* object flags */
664    HAS_LINENO | HAS_DEBUG |
665    HAS_SYMS | HAS_LOCALS | WP_TEXT | D_PAGED),
666
667   (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC /* section flags */
668    | SEC_LINK_ONCE | SEC_LINK_DUPLICATES),
669   
670   0,                            /* leading underscore */
671   '/',                          /* ar_pad_char */
672   15,                           /* ar_max_namelen */
673
674   bfd_getl64, bfd_getl_signed_64, bfd_putl64,
675   bfd_getl32, bfd_getl_signed_32, bfd_putl32,
676   bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* data */
677   
678   bfd_getl64, bfd_getl_signed_64, bfd_putl64,
679   bfd_getl32, bfd_getl_signed_32, bfd_putl32,
680   bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* hdrs */
681
682 /* Note that we allow an object file to be treated as a core file as well. */
683   {
684     _bfd_dummy_target,
685     pe_object_p,                /* bfd_check_format */
686     bfd_generic_archive_p,
687     pe_object_p
688   },
689   {
690     bfd_false,
691     coff_mkobject,
692     _bfd_generic_mkarchive,     /* bfd_set_format */
693     bfd_false
694   },
695   {
696     bfd_false,
697     coff_write_object_contents, /* bfd_write_contents */
698     _bfd_write_archive_contents,
699     bfd_false
700   },
701
702   BFD_JUMP_TABLE_GENERIC (coff),
703   BFD_JUMP_TABLE_COPY (coff),
704   BFD_JUMP_TABLE_CORE (_bfd_nocore),
705   BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff),
706   BFD_JUMP_TABLE_SYMBOLS (coff),
707   BFD_JUMP_TABLE_RELOCS (coff),
708   BFD_JUMP_TABLE_WRITE (coff),
709   BFD_JUMP_TABLE_LINK (coff),
710   BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
711
712   COFF_SWAP_TABLE,
713 };
714