]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blob - bfd/coff-tic4x.c
Add TMS320C4x support
[thirdparty/binutils-gdb.git] / bfd / coff-tic4x.c
1 /* BFD back-end for TMS320C4X coff binaries.
2 Copyright (C) 1996-99, 2000, 2002 Free Software Foundation, Inc.
3 Contributed by Michael Hayes (m.hayes@elec.canterbury.ac.nz)
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, Inc., 59 Temple Place - Suite 330, Boston, MA
20 02111-1307, USA. */
21
22 #include "bfd.h"
23 #include "sysdep.h"
24 #include "libbfd.h"
25 #include "bfdlink.h"
26 #include "coff/tic4x.h"
27 #include "coff/internal.h"
28 #include "libcoff.h"
29
30 #undef F_LSYMS
31 #define F_LSYMS F_LSYMS_TICOFF
32
33 static boolean
34 ticoff0_bad_format_hook (abfd, filehdr)
35 bfd *abfd;
36 PTR filehdr;
37 {
38 struct internal_filehdr *internal_f = (struct internal_filehdr *) filehdr;
39
40 if (COFF0_BADMAG (*internal_f))
41 return false;
42
43 return true;
44 }
45
46 static boolean
47 ticoff1_bad_format_hook (abfd, filehdr)
48 bfd *abfd ATTRIBUTE_UNUSED;
49 PTR filehdr;
50 {
51 struct internal_filehdr *internal_f = (struct internal_filehdr *) filehdr;
52
53 if (COFF1_BADMAG (*internal_f))
54 return false;
55
56 return true;
57 }
58
59 /* Replace the stock _bfd_coff_is_local_label_name to recognize TI COFF local
60 labels. */
61 static boolean
62 ticoff_bfd_is_local_label_name (abfd, name)
63 bfd *abfd ATTRIBUTE_UNUSED;
64 const char *name;
65 {
66 if (TICOFF_LOCAL_LABEL_P(name))
67 return true;
68 return false;
69 }
70
71 #define coff_bfd_is_local_label_name ticoff_bfd_is_local_label_name
72
73 static void tic4x_reloc_processing
74 PARAMS ((arelent *, struct internal_reloc *, asymbol **, bfd *, asection *));
75
76 #define RELOC_PROCESSING(RELENT,RELOC,SYMS,ABFD,SECT)\
77 tic4x_reloc_processing (RELENT,RELOC,SYMS,ABFD,SECT)
78
79 /* Customize coffcode.h; the default coff_ functions are set up to use
80 COFF2; coff_bad_format_hook uses BADMAG, so set that for COFF2.
81 The COFF1 and COFF0 vectors use custom _bad_format_hook procs
82 instead of setting BADMAG. */
83 #define BADMAG(x) COFF2_BADMAG(x)
84 #include "coffcode.h"
85
86 static bfd_reloc_status_type
87 tic4x_relocation (abfd, reloc_entry, symbol, data, input_section,
88 output_bfd, error_message)
89 bfd *abfd ATTRIBUTE_UNUSED;
90 arelent *reloc_entry;
91 asymbol *symbol ATTRIBUTE_UNUSED;
92 PTR data ATTRIBUTE_UNUSED;
93 asection *input_section;
94 bfd *output_bfd;
95 char **error_message ATTRIBUTE_UNUSED;
96 {
97 if (output_bfd != (bfd *) NULL)
98 {
99 /* This is a partial relocation, and we want to apply the
100 relocation to the reloc entry rather than the raw data.
101 Modify the reloc inplace to reflect what we now know. */
102 reloc_entry->address += input_section->output_offset;
103 return bfd_reloc_ok;
104 }
105 return bfd_reloc_continue;
106 }
107
108 reloc_howto_type tic4x_howto_table[] =
109 {
110 HOWTO(R_RELWORD, 0, 2, 16, false, 0, complain_overflow_signed, tic4x_relocation, "RELWORD", true, 0x0000ffff, 0x0000ffff, false),
111 HOWTO(R_REL24, 0, 2, 24, false, 0, complain_overflow_bitfield, tic4x_relocation, "REL24", true, 0x00ffffff, 0x00ffffff, false),
112 HOWTO(R_RELLONG, 0, 2, 32, false, 0, complain_overflow_dont, tic4x_relocation, "RELLONG", true, 0xffffffff, 0xffffffff, false),
113 HOWTO(R_PCRWORD, 0, 2, 16, true, 0, complain_overflow_signed, tic4x_relocation, "PCRWORD", true, 0x0000ffff, 0x0000ffff, false),
114 HOWTO(R_PCR24, 0, 2, 24, true, 0, complain_overflow_signed, tic4x_relocation, "PCR24", true, 0x00ffffff, 0x00ffffff, false),
115 HOWTO(R_PARTLS16, 0, 2, 16, false, 0, complain_overflow_dont, tic4x_relocation, "PARTLS16", true, 0x0000ffff, 0x0000ffff, false),
116 HOWTO(R_PARTMS8, 16, 2, 16, false, 0, complain_overflow_dont, tic4x_relocation, "PARTMS8", true, 0x0000ffff, 0x0000ffff, false),
117 HOWTO(R_RELWORD, 0, 2, 16, false, 0, complain_overflow_signed, tic4x_relocation, "ARELWORD", true, 0x0000ffff, 0x0000ffff, false),
118 HOWTO(R_REL24, 0, 2, 24, false, 0, complain_overflow_signed, tic4x_relocation, "AREL24", true, 0x00ffffff, 0x00ffffff, false),
119 HOWTO(R_RELLONG, 0, 2, 32, false, 0, complain_overflow_signed, tic4x_relocation, "ARELLONG", true, 0xffffffff, 0xffffffff, false),
120 HOWTO(R_PCRWORD, 0, 2, 16, true, 0, complain_overflow_signed, tic4x_relocation, "APCRWORD", true, 0x0000ffff, 0x0000ffff, false),
121 HOWTO(R_PCR24, 0, 2, 24, true, 0, complain_overflow_signed, tic4x_relocation, "APCR24", true, 0x00ffffff, 0x00ffffff, false),
122 HOWTO(R_PARTLS16, 0, 2, 16, false, 0, complain_overflow_dont, tic4x_relocation, "APARTLS16", true, 0x0000ffff, 0x0000ffff, false),
123 HOWTO(R_PARTMS8, 16, 2, 16, false, 0, complain_overflow_dont, tic4x_relocation, "APARTMS8", true, 0x0000ffff, 0x0000ffff, false),
124 };
125 #define HOWTO_SIZE (sizeof(tic4x_howto_table) / sizeof(tic4x_howto_table[0]))
126
127 #undef coff_bfd_reloc_type_lookup
128 #define coff_bfd_reloc_type_lookup tic4x_coff_reloc_type_lookup
129
130 /* For the case statement use the code values used tc_gen_reloc (defined in
131 bfd/reloc.c) to map to the howto table entries. */
132
133 static reloc_howto_type *
134 tic4x_coff_reloc_type_lookup (abfd, code)
135 bfd *abfd ATTRIBUTE_UNUSED;
136 bfd_reloc_code_real_type code;
137 {
138 unsigned int type;
139 unsigned int i;
140
141 switch (code)
142 {
143 case BFD_RELOC_32: type = R_RELLONG; break;
144 case BFD_RELOC_24: type = R_REL24; break;
145 case BFD_RELOC_16: type = R_RELWORD; break;
146 case BFD_RELOC_24_PCREL: type = R_PCR24; break;
147 case BFD_RELOC_16_PCREL: type = R_PCRWORD; break;
148 case BFD_RELOC_HI16: type = R_PARTMS8; break;
149 case BFD_RELOC_LO16: type = R_PARTLS16; break;
150 default:
151 return NULL;
152 }
153
154 for (i = 0; i < HOWTO_SIZE; i++)
155 {
156 if (tic4x_howto_table[i].type == type)
157 return tic4x_howto_table + i;
158 }
159 return NULL;
160 }
161
162
163 /* Code to turn a r_type into a howto ptr, uses the above howto table.
164 Called after some initial checking by the tic4x_rtype_to_howto fn
165 below. */
166 static void
167 tic4x_lookup_howto (internal, dst)
168 arelent *internal;
169 struct internal_reloc *dst;
170 {
171 unsigned int i;
172 int bank = (dst->r_symndx == -1) ? HOWTO_BANK : 0;
173
174 for (i = 0; i < HOWTO_SIZE; i++)
175 {
176 if (tic4x_howto_table[i].type == dst->r_type)
177 {
178 internal->howto = tic4x_howto_table + i + bank;
179 return;
180 }
181 }
182
183 (*_bfd_error_handler) (_("Unrecognized reloc type 0x%x"),
184 (unsigned int) dst->r_type);
185 abort();
186 }
187
188 #undef coff_rtype_to_howto
189 #define coff_rtype_to_howto coff_tic4x_rtype_to_howto
190
191 static reloc_howto_type *
192 coff_tic4x_rtype_to_howto (abfd, sec, rel, h, sym, addendp)
193 bfd *abfd ATTRIBUTE_UNUSED;
194 asection *sec;
195 struct internal_reloc *rel;
196 struct coff_link_hash_entry *h ATTRIBUTE_UNUSED;
197 struct internal_syment *sym ATTRIBUTE_UNUSED;
198 bfd_vma *addendp;
199 {
200 arelent genrel;
201
202 if (rel->r_symndx == -1 && addendp != NULL)
203 /* This is a TI "internal relocation", which means that the relocation
204 amount is the amount by which the current section is being relocated
205 in the output section. */
206 *addendp = (sec->output_section->vma + sec->output_offset) - sec->vma;
207
208 tic4x_lookup_howto (&genrel, rel);
209
210 return genrel.howto;
211 }
212
213
214 static void
215 tic4x_reloc_processing (relent, reloc, symbols, abfd, section)
216 arelent *relent;
217 struct internal_reloc *reloc;
218 asymbol **symbols;
219 bfd *abfd;
220 asection *section;
221 {
222 asymbol *ptr;
223
224 relent->address = reloc->r_vaddr;
225
226 if (reloc->r_symndx != -1)
227 {
228 if (reloc->r_symndx < 0 || reloc->r_symndx >= obj_conv_table_size (abfd))
229 {
230 (*_bfd_error_handler)
231 (_("%s: warning: illegal symbol index %ld in relocs"),
232 bfd_get_filename (abfd), reloc->r_symndx);
233 relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
234 ptr = NULL;
235 }
236 else
237 {
238 relent->sym_ptr_ptr = (symbols
239 + obj_convert (abfd)[reloc->r_symndx]);
240 ptr = *(relent->sym_ptr_ptr);
241 }
242 }
243 else
244 {
245 relent->sym_ptr_ptr = section->symbol_ptr_ptr;
246 ptr = *(relent->sym_ptr_ptr);
247 }
248
249 /* The symbols definitions that we have read in have been relocated
250 as if their sections started at 0. But the offsets refering to
251 the symbols in the raw data have not been modified, so we have to
252 have a negative addend to compensate.
253
254 Note that symbols which used to be common must be left alone. */
255
256 /* Calculate any reloc addend by looking at the symbol. */
257 CALC_ADDEND (abfd, ptr, *reloc, relent);
258
259 relent->address -= section->vma;
260 /* !! relent->section = (asection *) NULL; */
261
262 /* Fill in the relent->howto field from reloc->r_type. */
263 tic4x_lookup_howto (relent, reloc);
264 }
265
266
267 static const bfd_coff_backend_data ticoff0_swap_table =
268 {
269 coff_SWAP_aux_in, coff_SWAP_sym_in, coff_SWAP_lineno_in,
270 coff_SWAP_aux_out, coff_SWAP_sym_out,
271 coff_SWAP_lineno_out, coff_SWAP_reloc_out,
272 coff_SWAP_filehdr_out, coff_SWAP_aouthdr_out,
273 coff_SWAP_scnhdr_out,
274 FILHSZ_V0, AOUTSZ, SCNHSZ_V01, SYMESZ, AUXESZ, RELSZ_V0, LINESZ, FILNMLEN,
275 #ifdef COFF_LONG_FILENAMES
276 true,
277 #else
278 false,
279 #endif
280 #ifdef COFF_LONG_SECTION_NAMES
281 true,
282 #else
283 false,
284 #endif
285 #ifdef COFF_FORCE_SYMBOLS_IN_STRINGS
286 true,
287 #else
288 false,
289 #endif
290 #ifdef COFF_DEBUG_STRING_WIDE_PREFIX
291 4,
292 #else
293 2,
294 #endif
295 COFF_DEFAULT_SECTION_ALIGNMENT_POWER,
296 coff_SWAP_filehdr_in, coff_SWAP_aouthdr_in, coff_SWAP_scnhdr_in,
297 coff_SWAP_reloc_in, ticoff0_bad_format_hook, coff_set_arch_mach_hook,
298 coff_mkobject_hook, styp_to_sec_flags, coff_set_alignment_hook,
299 coff_slurp_symbol_table, symname_in_debug_hook, coff_pointerize_aux_hook,
300 coff_print_aux, coff_reloc16_extra_cases, coff_reloc16_estimate,
301 coff_classify_symbol, coff_compute_section_file_positions,
302 coff_start_final_link, coff_relocate_section, coff_rtype_to_howto,
303 coff_adjust_symndx, coff_link_add_one_symbol,
304 coff_link_output_has_begun, coff_final_link_postscript
305 };
306
307 /* COFF1 differs in section header size. */
308 static const bfd_coff_backend_data ticoff1_swap_table =
309 {
310 coff_SWAP_aux_in, coff_SWAP_sym_in, coff_SWAP_lineno_in,
311 coff_SWAP_aux_out, coff_SWAP_sym_out,
312 coff_SWAP_lineno_out, coff_SWAP_reloc_out,
313 coff_SWAP_filehdr_out, coff_SWAP_aouthdr_out,
314 coff_SWAP_scnhdr_out,
315 FILHSZ, AOUTSZ, SCNHSZ_V01, SYMESZ, AUXESZ, RELSZ, LINESZ, FILNMLEN,
316 #ifdef COFF_LONG_FILENAMES
317 true,
318 #else
319 false,
320 #endif
321 #ifdef COFF_LONG_SECTION_NAMES
322 true,
323 #else
324 false,
325 #endif
326 #ifdef COFF_FORCE_SYMBOLS_IN_STRINGS
327 true,
328 #else
329 false,
330 #endif
331 #ifdef COFF_DEBUG_STRING_WIDE_PREFIX
332 4,
333 #else
334 2,
335 #endif
336 COFF_DEFAULT_SECTION_ALIGNMENT_POWER,
337 coff_SWAP_filehdr_in, coff_SWAP_aouthdr_in, coff_SWAP_scnhdr_in,
338 coff_SWAP_reloc_in, ticoff1_bad_format_hook, coff_set_arch_mach_hook,
339 coff_mkobject_hook, styp_to_sec_flags, coff_set_alignment_hook,
340 coff_slurp_symbol_table, symname_in_debug_hook, coff_pointerize_aux_hook,
341 coff_print_aux, coff_reloc16_extra_cases, coff_reloc16_estimate,
342 coff_classify_symbol, coff_compute_section_file_positions,
343 coff_start_final_link, coff_relocate_section, coff_rtype_to_howto,
344 coff_adjust_symndx, coff_link_add_one_symbol,
345 coff_link_output_has_begun, coff_final_link_postscript
346 };
347
348
349 /* TI COFF v0, DOS tools (little-endian headers). */
350 const bfd_target tic4x_coff0_vec =
351 {
352 "coff0-c4x", /* Name. */
353 bfd_target_coff_flavour,
354 BFD_ENDIAN_LITTLE, /* Data byte order is little. */
355 BFD_ENDIAN_LITTLE, /* Header byte order is little (DOS tools). */
356
357 (HAS_RELOC | EXEC_P | /* Object flags. */
358 HAS_LINENO | HAS_DEBUG |
359 HAS_SYMS | HAS_LOCALS | WP_TEXT | HAS_LOAD_PAGE ),
360
361 (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* Section flags. */
362 '_', /* Leading symbol underscore. */
363 '/', /* ar_pad_char. */
364 15, /* ar_max_namelen. */
365 bfd_getl64, bfd_getl_signed_64, bfd_putl64,
366 bfd_getl32, bfd_getl_signed_32, bfd_putl32,
367 bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* data */
368 bfd_getl64, bfd_getl_signed_64, bfd_putl64,
369 bfd_getl32, bfd_getl_signed_32, bfd_putl32,
370 bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* hdrs */
371
372 {_bfd_dummy_target, coff_object_p, /* bfd_check_format */
373 bfd_generic_archive_p, _bfd_dummy_target},
374 {bfd_false, coff_mkobject, _bfd_generic_mkarchive, /* bfd_set_format */
375 bfd_false},
376 {bfd_false, coff_write_object_contents, /* bfd_write_contents */
377 _bfd_write_archive_contents, bfd_false},
378
379 BFD_JUMP_TABLE_GENERIC (coff),
380 BFD_JUMP_TABLE_COPY (coff),
381 BFD_JUMP_TABLE_CORE (_bfd_nocore),
382 BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff),
383 BFD_JUMP_TABLE_SYMBOLS (coff),
384 BFD_JUMP_TABLE_RELOCS (coff),
385 BFD_JUMP_TABLE_WRITE (coff),
386 BFD_JUMP_TABLE_LINK (coff),
387 BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
388 NULL,
389
390 (PTR)&ticoff0_swap_table
391 };
392
393 /* TI COFF v0, SPARC tools (big-endian headers). */
394 const bfd_target tic4x_coff0_beh_vec =
395 {
396 "coff0-beh-c4x", /* Name. */
397 bfd_target_coff_flavour,
398 BFD_ENDIAN_LITTLE, /* Data byte order is little. */
399 BFD_ENDIAN_BIG, /* Header byte order is big. */
400
401 (HAS_RELOC | EXEC_P | /* Object flags. */
402 HAS_LINENO | HAS_DEBUG |
403 HAS_SYMS | HAS_LOCALS | WP_TEXT | HAS_LOAD_PAGE ),
404
405 (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* Section flags. */
406 '_', /* Leading symbol underscore. */
407 '/', /* ar_pad_char */
408 15, /* ar_max_namelen */
409 bfd_getl64, bfd_getl_signed_64, bfd_putl64,
410 bfd_getl32, bfd_getl_signed_32, bfd_putl32,
411 bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* data */
412 bfd_getb64, bfd_getb_signed_64, bfd_putb64,
413 bfd_getb32, bfd_getb_signed_32, bfd_putb32,
414 bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* hdrs */
415
416 {_bfd_dummy_target, coff_object_p, /* bfd_check_format */
417 bfd_generic_archive_p, _bfd_dummy_target},
418 {bfd_false, coff_mkobject, _bfd_generic_mkarchive, /* bfd_set_format */
419 bfd_false},
420 {bfd_false, coff_write_object_contents, /* bfd_write_contents */
421 _bfd_write_archive_contents, bfd_false},
422
423 BFD_JUMP_TABLE_GENERIC (coff),
424 BFD_JUMP_TABLE_COPY (coff),
425 BFD_JUMP_TABLE_CORE (_bfd_nocore),
426 BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff),
427 BFD_JUMP_TABLE_SYMBOLS (coff),
428 BFD_JUMP_TABLE_RELOCS (coff),
429 BFD_JUMP_TABLE_WRITE (coff),
430 BFD_JUMP_TABLE_LINK (coff),
431 BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
432
433 &tic4x_coff0_vec,
434
435 (PTR)&ticoff0_swap_table
436 };
437
438 /* TI COFF v1, DOS tools (little-endian headers). */
439 const bfd_target tic4x_coff1_vec =
440 {
441 "coff1-c4x", /* Name. */
442 bfd_target_coff_flavour,
443 BFD_ENDIAN_LITTLE, /* Data byte order is little. */
444 BFD_ENDIAN_LITTLE, /* Header byte order is little (DOS tools). */
445
446 (HAS_RELOC | EXEC_P | /* Object flags. */
447 HAS_LINENO | HAS_DEBUG |
448 HAS_SYMS | HAS_LOCALS | WP_TEXT | HAS_LOAD_PAGE ),
449
450 (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* Section flags. */
451 '_', /* Leading symbol underscore. */
452 '/', /* ar_pad_char */
453 15, /* ar_max_namelen */
454 bfd_getl64, bfd_getl_signed_64, bfd_putl64,
455 bfd_getl32, bfd_getl_signed_32, bfd_putl32,
456 bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* data */
457 bfd_getl64, bfd_getl_signed_64, bfd_putl64,
458 bfd_getl32, bfd_getl_signed_32, bfd_putl32,
459 bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* hdrs */
460
461 {_bfd_dummy_target, coff_object_p, /* bfd_check_format */
462 bfd_generic_archive_p, _bfd_dummy_target},
463 {bfd_false, coff_mkobject, _bfd_generic_mkarchive, /* bfd_set_format */
464 bfd_false},
465 {bfd_false, coff_write_object_contents, /* bfd_write_contents */
466 _bfd_write_archive_contents, bfd_false},
467
468 BFD_JUMP_TABLE_GENERIC (coff),
469 BFD_JUMP_TABLE_COPY (coff),
470 BFD_JUMP_TABLE_CORE (_bfd_nocore),
471 BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff),
472 BFD_JUMP_TABLE_SYMBOLS (coff),
473 BFD_JUMP_TABLE_RELOCS (coff),
474 BFD_JUMP_TABLE_WRITE (coff),
475 BFD_JUMP_TABLE_LINK (coff),
476 BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
477
478 &tic4x_coff0_beh_vec,
479
480 (PTR)&ticoff1_swap_table
481 };
482
483 /* TI COFF v1, SPARC tools (big-endian headers). */
484 const bfd_target tic4x_coff1_beh_vec =
485 {
486 "coff1-beh-c4x", /* Name. */
487 bfd_target_coff_flavour,
488 BFD_ENDIAN_LITTLE, /* Data byte order is little. */
489 BFD_ENDIAN_BIG, /* Header byte order is big. */
490
491 (HAS_RELOC | EXEC_P | /* Object flags. */
492 HAS_LINENO | HAS_DEBUG |
493 HAS_SYMS | HAS_LOCALS | WP_TEXT | HAS_LOAD_PAGE ),
494
495 (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* Section flags. */
496 '_', /* Leading symbol underscore. */
497 '/', /* ar_pad_char */
498 15, /* ar_max_namelen */
499 bfd_getl64, bfd_getl_signed_64, bfd_putl64,
500 bfd_getl32, bfd_getl_signed_32, bfd_putl32,
501 bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* data */
502 bfd_getb64, bfd_getb_signed_64, bfd_putb64,
503 bfd_getb32, bfd_getb_signed_32, bfd_putb32,
504 bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* hdrs */
505
506 {_bfd_dummy_target, coff_object_p, /* bfd_check_format */
507 bfd_generic_archive_p, _bfd_dummy_target},
508 {bfd_false, coff_mkobject, _bfd_generic_mkarchive, /* bfd_set_format */
509 bfd_false},
510 {bfd_false, coff_write_object_contents, /* bfd_write_contents */
511 _bfd_write_archive_contents, bfd_false},
512
513 BFD_JUMP_TABLE_GENERIC (coff),
514 BFD_JUMP_TABLE_COPY (coff),
515 BFD_JUMP_TABLE_CORE (_bfd_nocore),
516 BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff),
517 BFD_JUMP_TABLE_SYMBOLS (coff),
518 BFD_JUMP_TABLE_RELOCS (coff),
519 BFD_JUMP_TABLE_WRITE (coff),
520 BFD_JUMP_TABLE_LINK (coff),
521 BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
522
523 &tic4x_coff1_vec,
524
525 (PTR)&ticoff1_swap_table
526 };
527
528 /* TI COFF v2, TI DOS tools output (little-endian headers). */
529 const bfd_target tic4x_coff2_vec =
530 {
531 "coff2-c4x", /* Name. */
532 bfd_target_coff_flavour,
533 BFD_ENDIAN_LITTLE, /* Data byte order is little. */
534 BFD_ENDIAN_LITTLE, /* Header byte order is little (DOS tools). */
535
536 (HAS_RELOC | EXEC_P | /* Object flags. */
537 HAS_LINENO | HAS_DEBUG |
538 HAS_SYMS | HAS_LOCALS | WP_TEXT | HAS_LOAD_PAGE ),
539
540 (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* Section flags. */
541 '_', /* Leading symbol underscore. */
542 '/', /* ar_pad_char */
543 15, /* ar_max_namelen */
544 bfd_getl64, bfd_getl_signed_64, bfd_putl64,
545 bfd_getl32, bfd_getl_signed_32, bfd_putl32,
546 bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* data */
547 bfd_getl64, bfd_getl_signed_64, bfd_putl64,
548 bfd_getl32, bfd_getl_signed_32, bfd_putl32,
549 bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* hdrs */
550
551 {_bfd_dummy_target, coff_object_p, /* bfd_check_format */
552 bfd_generic_archive_p, _bfd_dummy_target},
553 {bfd_false, coff_mkobject, _bfd_generic_mkarchive, /* bfd_set_format */
554 bfd_false},
555 {bfd_false, coff_write_object_contents, /* bfd_write_contents */
556 _bfd_write_archive_contents, bfd_false},
557
558 BFD_JUMP_TABLE_GENERIC (coff),
559 BFD_JUMP_TABLE_COPY (coff),
560 BFD_JUMP_TABLE_CORE (_bfd_nocore),
561 BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff),
562 BFD_JUMP_TABLE_SYMBOLS (coff),
563 BFD_JUMP_TABLE_RELOCS (coff),
564 BFD_JUMP_TABLE_WRITE (coff),
565 BFD_JUMP_TABLE_LINK (coff),
566 BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
567
568 &tic4x_coff1_beh_vec,
569
570 COFF_SWAP_TABLE
571 };
572
573 /* TI COFF v2, TI SPARC tools output (big-endian headers). */
574 const bfd_target tic4x_coff2_beh_vec =
575 {
576 "coff2-beh-c4x", /* Name. */
577 bfd_target_coff_flavour,
578 BFD_ENDIAN_LITTLE, /* Data byte order is little. */
579 BFD_ENDIAN_BIG, /* Header byte order is big. */
580
581 (HAS_RELOC | EXEC_P | /* Object flags. */
582 HAS_LINENO | HAS_DEBUG |
583 HAS_SYMS | HAS_LOCALS | WP_TEXT | HAS_LOAD_PAGE ),
584
585 (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* Section flags. */
586 '_', /* Leading symbol underscore. */
587 '/', /* ar_pad_char */
588 15, /* ar_max_namelen */
589 bfd_getl64, bfd_getl_signed_64, bfd_putl64,
590 bfd_getl32, bfd_getl_signed_32, bfd_putl32,
591 bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* data */
592 bfd_getb64, bfd_getb_signed_64, bfd_putb64,
593 bfd_getb32, bfd_getb_signed_32, bfd_putb32,
594 bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* hdrs */
595
596 {_bfd_dummy_target, coff_object_p, /* bfd_check_format */
597 bfd_generic_archive_p, _bfd_dummy_target},
598 {bfd_false, coff_mkobject, _bfd_generic_mkarchive, /* bfd_set_format */
599 bfd_false},
600 {bfd_false, coff_write_object_contents, /* bfd_write_contents */
601 _bfd_write_archive_contents, bfd_false},
602
603 BFD_JUMP_TABLE_GENERIC (coff),
604 BFD_JUMP_TABLE_COPY (coff),
605 BFD_JUMP_TABLE_CORE (_bfd_nocore),
606 BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff),
607 BFD_JUMP_TABLE_SYMBOLS (coff),
608 BFD_JUMP_TABLE_RELOCS (coff),
609 BFD_JUMP_TABLE_WRITE (coff),
610 BFD_JUMP_TABLE_LINK (coff),
611 BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
612
613 &tic4x_coff2_vec,
614
615 COFF_SWAP_TABLE
616 };