bfd/
[external/binutils.git] / bfd / coff-tic54x.c
1 /* BFD back-end for TMS320C54X coff binaries.
2    Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2007
3    Free Software Foundation, Inc.
4    Contributed by Timothy Wall (twall@cygnus.com)
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 2 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, MA
21    02110-1301, USA.  */
22
23 #include "sysdep.h"
24 #include "bfd.h"
25 #include "libbfd.h"
26 #include "bfdlink.h"
27 #include "coff/tic54x.h"
28 #include "coff/internal.h"
29 #include "libcoff.h"
30
31 #undef  F_LSYMS
32 #define F_LSYMS         F_LSYMS_TICOFF
33
34 static void tic54x_reloc_processing
35   PARAMS ((arelent *, struct internal_reloc *, asymbol **, bfd *, asection *));
36 static bfd_reloc_status_type tic54x_relocation
37   PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
38 static bfd_boolean tic54x_set_section_contents
39   PARAMS ((bfd *, sec_ptr, const PTR, file_ptr, bfd_size_type));
40 static reloc_howto_type *coff_tic54x_rtype_to_howto
41   PARAMS ((bfd *, asection *, struct internal_reloc *, struct coff_link_hash_entry *, struct internal_syment *, bfd_vma *));
42 static bfd_boolean tic54x_set_arch_mach
43   PARAMS ((bfd *, enum bfd_architecture, unsigned long));
44 static reloc_howto_type * tic54x_coff_reloc_type_lookup
45   PARAMS ((bfd *, bfd_reloc_code_real_type));
46 static void tic54x_lookup_howto
47   PARAMS ((arelent *, struct internal_reloc *));
48 static bfd_boolean ticoff_bfd_is_local_label_name
49   PARAMS ((bfd *, const char *));
50
51 /* 32-bit operations
52    The octet order is screwy.  words are LSB first (LS octet, actually), but
53    longwords are MSW first.  For example, 0x12345678 is encoded 0x5678 in the
54    first word and 0x1234 in the second.  When looking at the data as stored in
55    the COFF file, you would see the octets ordered as 0x78, 0x56, 0x34, 0x12.
56    Don't bother with 64-bits, as there aren't any.  */
57
58 static bfd_vma
59 tic54x_getl32 (const void *p)
60 {
61   const bfd_byte *addr = p;
62   unsigned long v;
63
64   v  = (unsigned long) addr[2];
65   v |= (unsigned long) addr[3] << 8;
66   v |= (unsigned long) addr[0] << 16;
67   v |= (unsigned long) addr[1] << 24;
68   return v;
69 }
70
71 static void
72 tic54x_putl32 (bfd_vma data, void *p)
73 {
74   bfd_byte *addr = p;
75   addr[2] = data & 0xff;
76   addr[3] = (data >>  8) & 0xff;
77   addr[0] = (data >> 16) & 0xff;
78   addr[1] = (data >> 24) & 0xff;
79 }
80
81 static bfd_signed_vma
82 tic54x_getl_signed_32 (const void *p)
83 {
84   const bfd_byte *addr = p;
85   unsigned long v;
86
87   v  = (unsigned long) addr[2];
88   v |= (unsigned long) addr[3] << 8;
89   v |= (unsigned long) addr[0] << 16;
90   v |= (unsigned long) addr[1] << 24;
91 #define COERCE32(x) \
92   ((bfd_signed_vma) (long) (((unsigned long) (x) ^ 0x80000000) - 0x80000000))
93   return COERCE32 (v);
94 }
95
96 #define coff_get_section_load_page bfd_ticoff_get_section_load_page
97 #define coff_set_section_load_page bfd_ticoff_set_section_load_page
98
99 void
100 bfd_ticoff_set_section_load_page (sect, page)
101   asection *sect;
102   int page;
103 {
104   sect->lma = (sect->lma & ADDR_MASK) | PG_TO_FLAG(page);
105 }
106
107 int
108 bfd_ticoff_get_section_load_page (sect)
109   asection *sect;
110 {
111   int page;
112
113   /* Provide meaningful defaults for predefined sections.  */
114   if (sect == &bfd_com_section)
115     page = PG_DATA;
116
117   else if (sect == &bfd_und_section
118       || sect == &bfd_abs_section
119       || sect == &bfd_ind_section)
120     page = PG_PROG;
121
122   else
123     page = FLAG_TO_PG (sect->lma);
124
125   return page;
126 }
127
128 /* Set the architecture appropriately.  Allow unkown architectures
129    (e.g. binary).  */
130
131 static bfd_boolean
132 tic54x_set_arch_mach (abfd, arch, machine)
133      bfd *abfd;
134      enum bfd_architecture arch;
135      unsigned long machine;
136 {
137   if (arch == bfd_arch_unknown)
138     arch = bfd_arch_tic54x;
139
140   else if (arch != bfd_arch_tic54x)
141     return FALSE;
142
143   return bfd_default_set_arch_mach (abfd, arch, machine);
144 }
145
146 static bfd_reloc_status_type
147 tic54x_relocation (abfd, reloc_entry, symbol, data, input_section,
148                    output_bfd, error_message)
149   bfd *abfd ATTRIBUTE_UNUSED;
150   arelent *reloc_entry;
151   asymbol *symbol ATTRIBUTE_UNUSED;
152   PTR data ATTRIBUTE_UNUSED;
153   asection *input_section;
154   bfd *output_bfd;
155   char **error_message ATTRIBUTE_UNUSED;
156 {
157   if (output_bfd != (bfd *) NULL)
158     {
159       /* This is a partial relocation, and we want to apply the
160          relocation to the reloc entry rather than the raw data.
161          Modify the reloc inplace to reflect what we now know.  */
162       reloc_entry->address += input_section->output_offset;
163       return bfd_reloc_ok;
164     }
165   return bfd_reloc_continue;
166 }
167
168 reloc_howto_type tic54x_howto_table[] =
169   {
170     /* type,rightshift,size (0=byte, 1=short, 2=long),
171        bit size, pc_relative, bitpos, dont complain_on_overflow,
172        special_function, name, partial_inplace, src_mask, dst_mask, pcrel_offset.  */
173
174     /* NORMAL BANK */
175     /* 16-bit direct reference to symbol's address.  */
176     HOWTO (R_RELWORD,0,1,16,FALSE,0,complain_overflow_dont,
177            tic54x_relocation,"REL16",FALSE,0xFFFF,0xFFFF,FALSE),
178
179     /* 7 LSBs of an address */
180     HOWTO (R_PARTLS7,0,1,7,FALSE,0,complain_overflow_dont,
181            tic54x_relocation,"LS7",FALSE,0x007F,0x007F,FALSE),
182
183     /* 9 MSBs of an address */
184     /* TI assembler doesn't shift its encoding, and is thus incompatible */
185     HOWTO (R_PARTMS9,7,1,9,FALSE,0,complain_overflow_dont,
186            tic54x_relocation,"MS9",FALSE,0x01FF,0x01FF,FALSE),
187
188     /* 23-bit relocation */
189     HOWTO (R_EXTWORD,0,2,23,FALSE,0,complain_overflow_dont,
190            tic54x_relocation,"RELEXT",FALSE,0x7FFFFF,0x7FFFFF,FALSE),
191
192     /* 16 bits of 23-bit extended address */
193     HOWTO (R_EXTWORD16,0,1,16,FALSE,0,complain_overflow_dont,
194            tic54x_relocation,"RELEXT16",FALSE,0x7FFFFF,0x7FFFFF,FALSE),
195
196     /* upper 7 bits of 23-bit extended address */
197     HOWTO (R_EXTWORDMS7,16,1,7,FALSE,0,complain_overflow_dont,
198            tic54x_relocation,"RELEXTMS7",FALSE,0x7F,0x7F,FALSE),
199
200     /* ABSOLUTE BANK */
201     /* 16-bit direct reference to symbol's address, absolute */
202     HOWTO (R_RELWORD,0,1,16,FALSE,0,complain_overflow_dont,
203            tic54x_relocation,"AREL16",FALSE,0xFFFF,0xFFFF,FALSE),
204
205     /* 7 LSBs of an address, absolute */
206     HOWTO (R_PARTLS7,0,1,7,FALSE,0,complain_overflow_dont,
207            tic54x_relocation,"ALS7",FALSE,0x007F,0x007F,FALSE),
208
209     /* 9 MSBs of an address, absolute */
210     /* TI assembler doesn't shift its encoding, and is thus incompatible */
211     HOWTO (R_PARTMS9,7,1,9,FALSE,0,complain_overflow_dont,
212            tic54x_relocation,"AMS9",FALSE,0x01FF,0x01FF,FALSE),
213
214     /* 23-bit direct reference, absolute */
215     HOWTO (R_EXTWORD,0,2,23,FALSE,0,complain_overflow_dont,
216            tic54x_relocation,"ARELEXT",FALSE,0x7FFFFF,0x7FFFFF,FALSE),
217
218     /* 16 bits of 23-bit extended address, absolute */
219     HOWTO (R_EXTWORD16,0,1,16,FALSE,0,complain_overflow_dont,
220            tic54x_relocation,"ARELEXT16",FALSE,0x7FFFFF,0x7FFFFF,FALSE),
221
222     /* upper 7 bits of 23-bit extended address, absolute */
223     HOWTO (R_EXTWORDMS7,16,1,7,FALSE,0,complain_overflow_dont,
224            tic54x_relocation,"ARELEXTMS7",FALSE,0x7F,0x7F,FALSE),
225
226     /* 32-bit relocation exclusively for stabs */
227     HOWTO (R_RELLONG,0,2,32,FALSE,0,complain_overflow_dont,
228            tic54x_relocation,"STAB",FALSE,0xFFFFFFFF,0xFFFFFFFF,FALSE),
229   };
230
231 #define coff_bfd_reloc_type_lookup tic54x_coff_reloc_type_lookup
232 #define coff_bfd_reloc_name_lookup tic54x_coff_reloc_name_lookup
233
234 /* For the case statement use the code values used tc_gen_reloc (defined in
235    bfd/reloc.c) to map to the howto table entries.  */
236
237 reloc_howto_type *
238 tic54x_coff_reloc_type_lookup (abfd, code)
239      bfd *abfd ATTRIBUTE_UNUSED;
240      bfd_reloc_code_real_type code;
241 {
242   switch (code)
243     {
244     case BFD_RELOC_16:
245       return &tic54x_howto_table[0];
246     case BFD_RELOC_TIC54X_PARTLS7:
247       return &tic54x_howto_table[1];
248     case BFD_RELOC_TIC54X_PARTMS9:
249       return &tic54x_howto_table[2];
250     case BFD_RELOC_TIC54X_23:
251       return &tic54x_howto_table[3];
252     case BFD_RELOC_TIC54X_16_OF_23:
253       return &tic54x_howto_table[4];
254     case BFD_RELOC_TIC54X_MS7_OF_23:
255       return &tic54x_howto_table[5];
256     case BFD_RELOC_32:
257       return &tic54x_howto_table[12];
258     default:
259       return (reloc_howto_type *) NULL;
260     }
261 }
262
263 static reloc_howto_type *
264 tic54x_coff_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
265                                const char *r_name)
266 {
267   unsigned int i;
268
269   for (i = 0;
270        i < sizeof (tic54x_howto_table) / sizeof (tic54x_howto_table[0]);
271        i++)
272     if (tic54x_howto_table[i].name != NULL
273         && strcasecmp (tic54x_howto_table[i].name, r_name) == 0)
274       return &tic54x_howto_table[i];
275
276   return NULL;
277 }
278
279 /* Code to turn a r_type into a howto ptr, uses the above howto table.
280    Called after some initial checking by the tic54x_rtype_to_howto fn below.  */
281
282 static void
283 tic54x_lookup_howto (internal, dst)
284      arelent *internal;
285      struct internal_reloc *dst;
286 {
287   unsigned i;
288   int bank = (dst->r_symndx == -1) ? HOWTO_BANK : 0;
289
290   for (i = 0; i < sizeof tic54x_howto_table/sizeof tic54x_howto_table[0]; i++)
291     {
292       if (tic54x_howto_table[i].type == dst->r_type)
293         {
294           internal->howto = tic54x_howto_table + i + bank;
295           return;
296         }
297     }
298
299   (*_bfd_error_handler) (_("Unrecognized reloc type 0x%x"),
300                          (unsigned int) dst->r_type);
301   abort ();
302 }
303
304 #define RELOC_PROCESSING(RELENT,RELOC,SYMS,ABFD,SECT)\
305  tic54x_reloc_processing(RELENT,RELOC,SYMS,ABFD,SECT)
306
307 #define coff_rtype_to_howto coff_tic54x_rtype_to_howto
308
309 static reloc_howto_type *
310 coff_tic54x_rtype_to_howto (abfd, sec, rel, h, sym, addendp)
311      bfd *abfd ATTRIBUTE_UNUSED;
312      asection *sec;
313      struct internal_reloc *rel;
314      struct coff_link_hash_entry *h ATTRIBUTE_UNUSED;
315      struct internal_syment *sym ATTRIBUTE_UNUSED;
316      bfd_vma *addendp;
317 {
318   arelent genrel;
319
320   if (rel->r_symndx == -1 && addendp != NULL)
321     {
322       /* This is a TI "internal relocation", which means that the relocation
323          amount is the amount by which the current section is being relocated
324          in the output section.  */
325       *addendp = (sec->output_section->vma + sec->output_offset) - sec->vma;
326     }
327
328   tic54x_lookup_howto (&genrel, rel);
329
330   return genrel.howto;
331 }
332
333 /* Replace the stock _bfd_coff_is_local_label_name to recognize TI COFF local
334    labels.  */
335
336 static bfd_boolean
337 ticoff_bfd_is_local_label_name (abfd, name)
338   bfd *abfd ATTRIBUTE_UNUSED;
339   const char *name;
340 {
341   if (TICOFF_LOCAL_LABEL_P(name))
342     return TRUE;
343   return FALSE;
344 }
345
346 #define coff_bfd_is_local_label_name ticoff_bfd_is_local_label_name
347
348 /* Clear the r_reserved field in relocs.  */
349 #define SWAP_OUT_RELOC_EXTRA(abfd,src,dst) \
350   do \
351     { \
352       dst->r_reserved[0] = 0; \
353       dst->r_reserved[1] = 0; \
354     } \
355   while (0)
356
357 /* Customize coffcode.h; the default coff_ functions are set up to use COFF2;
358    coff_bad_format_hook uses BADMAG, so set that for COFF2.  The COFF1
359    and COFF0 vectors use custom _bad_format_hook procs instead of setting
360    BADMAG.  */
361 #define BADMAG(x) COFF2_BADMAG(x)
362 #include "coffcode.h"
363
364 static bfd_boolean
365 tic54x_set_section_contents (abfd, section, location, offset, bytes_to_do)
366      bfd *abfd;
367      sec_ptr section;
368      const PTR location;
369      file_ptr offset;
370      bfd_size_type bytes_to_do;
371 {
372   return coff_set_section_contents (abfd, section, location,
373                                     offset, bytes_to_do);
374 }
375
376 static void
377 tic54x_reloc_processing (relent, reloc, symbols, abfd, section)
378      arelent *relent;
379      struct internal_reloc *reloc;
380      asymbol **symbols;
381      bfd *abfd;
382      asection *section;
383 {
384   asymbol *ptr;
385
386   relent->address = reloc->r_vaddr;
387
388   if (reloc->r_symndx != -1)
389     {
390       if (reloc->r_symndx < 0 || reloc->r_symndx >= obj_conv_table_size (abfd))
391         {
392           (*_bfd_error_handler)
393             (_("%B: warning: illegal symbol index %ld in relocs"),
394              abfd, reloc->r_symndx);
395           relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
396           ptr = NULL;
397         }
398       else
399         {
400           relent->sym_ptr_ptr = (symbols
401                                  + obj_convert (abfd)[reloc->r_symndx]);
402           ptr = *(relent->sym_ptr_ptr);
403         }
404     }
405   else
406     {
407       relent->sym_ptr_ptr = section->symbol_ptr_ptr;
408       ptr = *(relent->sym_ptr_ptr);
409     }
410
411   /* The symbols definitions that we have read in have been
412      relocated as if their sections started at 0. But the offsets
413      refering to the symbols in the raw data have not been
414      modified, so we have to have a negative addend to compensate.
415
416      Note that symbols which used to be common must be left alone.  */
417
418   /* Calculate any reloc addend by looking at the symbol.  */
419   CALC_ADDEND (abfd, ptr, *reloc, relent);
420
421   relent->address -= section->vma;
422   /* !!     relent->section = (asection *) NULL;*/
423
424   /* Fill in the relent->howto field from reloc->r_type.  */
425   tic54x_lookup_howto (relent, reloc);
426 }
427
428 /* TI COFF v0, DOS tools (little-endian headers).  */
429 const bfd_target tic54x_coff0_vec =
430   {
431     "coff0-c54x",                       /* name */
432     bfd_target_coff_flavour,
433     BFD_ENDIAN_LITTLE,          /* data byte order is little */
434     BFD_ENDIAN_LITTLE,          /* header byte order is little (DOS tools) */
435
436     (HAS_RELOC | EXEC_P |               /* object flags */
437      HAS_LINENO | HAS_DEBUG |
438      HAS_SYMS | HAS_LOCALS | WP_TEXT ),
439
440     (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */
441     '_',                                /* leading symbol underscore */
442     '/',                                /* ar_pad_char */
443     15,                         /* ar_max_namelen */
444     bfd_getl64, bfd_getl_signed_64, bfd_putl64,
445     tic54x_getl32, tic54x_getl_signed_32, tic54x_putl32,
446     bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* data */
447     bfd_getl64, bfd_getl_signed_64, bfd_putl64,
448     bfd_getl32, bfd_getl_signed_32, bfd_putl32,
449     bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* hdrs */
450
451     {_bfd_dummy_target, coff_object_p,  /* bfd_check_format */
452      bfd_generic_archive_p, _bfd_dummy_target},
453     {bfd_false, coff_mkobject, _bfd_generic_mkarchive,  /* bfd_set_format */
454      bfd_false},
455     {bfd_false, coff_write_object_contents,     /* bfd_write_contents */
456      _bfd_write_archive_contents, bfd_false},
457
458     BFD_JUMP_TABLE_GENERIC (coff),
459     BFD_JUMP_TABLE_COPY (coff),
460     BFD_JUMP_TABLE_CORE (_bfd_nocore),
461     BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff),
462     BFD_JUMP_TABLE_SYMBOLS (coff),
463     BFD_JUMP_TABLE_RELOCS (coff),
464     BFD_JUMP_TABLE_WRITE (tic54x),
465     BFD_JUMP_TABLE_LINK (coff),
466     BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
467     NULL,
468
469     (PTR) & ticoff0_swap_table
470   };
471
472 /* TI COFF v0, SPARC tools (big-endian headers).  */
473 const bfd_target tic54x_coff0_beh_vec =
474   {
475     "coff0-beh-c54x",                   /* name */
476     bfd_target_coff_flavour,
477     BFD_ENDIAN_LITTLE,          /* data byte order is little */
478     BFD_ENDIAN_BIG,             /* header byte order is big */
479
480     (HAS_RELOC | EXEC_P |               /* object flags */
481      HAS_LINENO | HAS_DEBUG |
482      HAS_SYMS | HAS_LOCALS | WP_TEXT ),
483
484     (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */
485     '_',                                /* leading symbol underscore */
486     '/',                                /* ar_pad_char */
487     15,                         /* ar_max_namelen */
488     bfd_getl64, bfd_getl_signed_64, bfd_putl64,
489     tic54x_getl32, tic54x_getl_signed_32, tic54x_putl32,
490     bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* data */
491     bfd_getb64, bfd_getb_signed_64, bfd_putb64,
492     bfd_getb32, bfd_getb_signed_32, bfd_putb32,
493     bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* hdrs */
494
495     {_bfd_dummy_target, coff_object_p,  /* bfd_check_format */
496      bfd_generic_archive_p, _bfd_dummy_target},
497     {bfd_false, coff_mkobject, _bfd_generic_mkarchive,  /* bfd_set_format */
498      bfd_false},
499     {bfd_false, coff_write_object_contents,     /* bfd_write_contents */
500      _bfd_write_archive_contents, bfd_false},
501
502     BFD_JUMP_TABLE_GENERIC (coff),
503     BFD_JUMP_TABLE_COPY (coff),
504     BFD_JUMP_TABLE_CORE (_bfd_nocore),
505     BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff),
506     BFD_JUMP_TABLE_SYMBOLS (coff),
507     BFD_JUMP_TABLE_RELOCS (coff),
508     BFD_JUMP_TABLE_WRITE (tic54x),
509     BFD_JUMP_TABLE_LINK (coff),
510     BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
511
512     & tic54x_coff0_vec,
513
514     (PTR) & ticoff0_swap_table
515   };
516
517 /* TI COFF v1, DOS tools (little-endian headers).  */
518 const bfd_target tic54x_coff1_vec =
519   {
520     "coff1-c54x",                       /* name */
521     bfd_target_coff_flavour,
522     BFD_ENDIAN_LITTLE,          /* data byte order is little */
523     BFD_ENDIAN_LITTLE,          /* header byte order is little (DOS tools) */
524
525     (HAS_RELOC | EXEC_P |               /* object flags */
526      HAS_LINENO | HAS_DEBUG |
527      HAS_SYMS | HAS_LOCALS | WP_TEXT ),
528
529     (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */
530     '_',                                /* leading symbol underscore */
531     '/',                                /* ar_pad_char */
532     15,                         /* ar_max_namelen */
533     bfd_getl64, bfd_getl_signed_64, bfd_putl64,
534     tic54x_getl32, tic54x_getl_signed_32, tic54x_putl32,
535     bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* data */
536     bfd_getl64, bfd_getl_signed_64, bfd_putl64,
537     bfd_getl32, bfd_getl_signed_32, bfd_putl32,
538     bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* hdrs */
539
540     {_bfd_dummy_target, coff_object_p,  /* bfd_check_format */
541      bfd_generic_archive_p, _bfd_dummy_target},
542     {bfd_false, coff_mkobject, _bfd_generic_mkarchive,  /* bfd_set_format */
543      bfd_false},
544     {bfd_false, coff_write_object_contents,     /* bfd_write_contents */
545      _bfd_write_archive_contents, bfd_false},
546
547     BFD_JUMP_TABLE_GENERIC (coff),
548     BFD_JUMP_TABLE_COPY (coff),
549     BFD_JUMP_TABLE_CORE (_bfd_nocore),
550     BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff),
551     BFD_JUMP_TABLE_SYMBOLS (coff),
552     BFD_JUMP_TABLE_RELOCS (coff),
553     BFD_JUMP_TABLE_WRITE (tic54x),
554     BFD_JUMP_TABLE_LINK (coff),
555     BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
556
557     & tic54x_coff0_beh_vec,
558
559     (PTR) & ticoff1_swap_table
560 };
561
562 /* TI COFF v1, SPARC tools (big-endian headers).  */
563 const bfd_target tic54x_coff1_beh_vec =
564   {
565     "coff1-beh-c54x",                   /* name */
566     bfd_target_coff_flavour,
567     BFD_ENDIAN_LITTLE,          /* data byte order is little */
568     BFD_ENDIAN_BIG,             /* header byte order is big */
569
570     (HAS_RELOC | EXEC_P |               /* object flags */
571      HAS_LINENO | HAS_DEBUG |
572      HAS_SYMS | HAS_LOCALS | WP_TEXT ),
573
574     (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */
575     '_',                                /* leading symbol underscore */
576     '/',                                /* ar_pad_char */
577     15,                         /* ar_max_namelen */
578     bfd_getl64, bfd_getl_signed_64, bfd_putl64,
579     tic54x_getl32, tic54x_getl_signed_32, tic54x_putl32,
580     bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* data */
581     bfd_getb64, bfd_getb_signed_64, bfd_putb64,
582     bfd_getb32, bfd_getb_signed_32, bfd_putb32,
583     bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* hdrs */
584
585     {_bfd_dummy_target, coff_object_p,  /* bfd_check_format */
586      bfd_generic_archive_p, _bfd_dummy_target},
587     {bfd_false, coff_mkobject, _bfd_generic_mkarchive,  /* bfd_set_format */
588      bfd_false},
589     {bfd_false, coff_write_object_contents,     /* bfd_write_contents */
590      _bfd_write_archive_contents, bfd_false},
591
592     BFD_JUMP_TABLE_GENERIC (coff),
593     BFD_JUMP_TABLE_COPY (coff),
594     BFD_JUMP_TABLE_CORE (_bfd_nocore),
595     BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff),
596     BFD_JUMP_TABLE_SYMBOLS (coff),
597     BFD_JUMP_TABLE_RELOCS (coff),
598     BFD_JUMP_TABLE_WRITE (tic54x),
599     BFD_JUMP_TABLE_LINK (coff),
600     BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
601
602     & tic54x_coff1_vec,
603
604     (PTR) & ticoff1_swap_table
605   };
606
607 /* TI COFF v2, TI DOS tools output (little-endian headers).  */
608 const bfd_target tic54x_coff2_vec =
609   {
610     "coff2-c54x",                       /* name */
611     bfd_target_coff_flavour,
612     BFD_ENDIAN_LITTLE,          /* data byte order is little */
613     BFD_ENDIAN_LITTLE,          /* header byte order is little (DOS tools) */
614
615     (HAS_RELOC | EXEC_P |               /* object flags */
616      HAS_LINENO | HAS_DEBUG |
617      HAS_SYMS | HAS_LOCALS | WP_TEXT ),
618
619     (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */
620     '_',                                /* leading symbol underscore */
621     '/',                                /* ar_pad_char */
622     15,                         /* ar_max_namelen */
623     bfd_getl64, bfd_getl_signed_64, bfd_putl64,
624     tic54x_getl32, tic54x_getl_signed_32, tic54x_putl32,
625     bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* data */
626     bfd_getl64, bfd_getl_signed_64, bfd_putl64,
627     bfd_getl32, bfd_getl_signed_32, bfd_putl32,
628     bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* hdrs */
629
630     {_bfd_dummy_target, coff_object_p,  /* bfd_check_format */
631      bfd_generic_archive_p, _bfd_dummy_target},
632     {bfd_false, coff_mkobject, _bfd_generic_mkarchive,  /* bfd_set_format */
633      bfd_false},
634     {bfd_false, coff_write_object_contents,     /* bfd_write_contents */
635      _bfd_write_archive_contents, bfd_false},
636
637     BFD_JUMP_TABLE_GENERIC (coff),
638     BFD_JUMP_TABLE_COPY (coff),
639     BFD_JUMP_TABLE_CORE (_bfd_nocore),
640     BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff),
641     BFD_JUMP_TABLE_SYMBOLS (coff),
642     BFD_JUMP_TABLE_RELOCS (coff),
643     BFD_JUMP_TABLE_WRITE (tic54x),
644     BFD_JUMP_TABLE_LINK (coff),
645     BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
646
647     & tic54x_coff1_beh_vec,
648
649     COFF_SWAP_TABLE
650   };
651
652 /* TI COFF v2, TI SPARC tools output (big-endian headers).  */
653 const bfd_target tic54x_coff2_beh_vec =
654   {
655     "coff2-beh-c54x",                   /* name */
656     bfd_target_coff_flavour,
657     BFD_ENDIAN_LITTLE,          /* data byte order is little */
658     BFD_ENDIAN_BIG,             /* header byte order is big */
659
660     (HAS_RELOC | EXEC_P |               /* object flags */
661      HAS_LINENO | HAS_DEBUG |
662      HAS_SYMS | HAS_LOCALS | WP_TEXT ),
663
664     (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */
665     '_',                                /* leading symbol underscore */
666     '/',                                /* ar_pad_char */
667     15,                         /* ar_max_namelen */
668     bfd_getl64, bfd_getl_signed_64, bfd_putl64,
669     tic54x_getl32, tic54x_getl_signed_32, tic54x_putl32,
670     bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* data */
671     bfd_getb64, bfd_getb_signed_64, bfd_putb64,
672     bfd_getb32, bfd_getb_signed_32, bfd_putb32,
673     bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* hdrs */
674
675     {_bfd_dummy_target, coff_object_p,  /* bfd_check_format */
676      bfd_generic_archive_p, _bfd_dummy_target},
677     {bfd_false, coff_mkobject, _bfd_generic_mkarchive,  /* bfd_set_format */
678      bfd_false},
679     {bfd_false, coff_write_object_contents,     /* bfd_write_contents */
680      _bfd_write_archive_contents, bfd_false},
681
682     BFD_JUMP_TABLE_GENERIC (coff),
683     BFD_JUMP_TABLE_COPY (coff),
684     BFD_JUMP_TABLE_CORE (_bfd_nocore),
685     BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff),
686     BFD_JUMP_TABLE_SYMBOLS (coff),
687     BFD_JUMP_TABLE_RELOCS (coff),
688     BFD_JUMP_TABLE_WRITE (tic54x),
689     BFD_JUMP_TABLE_LINK (coff),
690     BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
691
692     & tic54x_coff2_vec,
693
694     COFF_SWAP_TABLE
695   };