bfd/
[deliverable/binutils-gdb.git] / bfd / elf32-msp430.c
1 /* MSP430-specific support for 32-bit ELF
2 Copyright (C) 2002, 2003 Free Software Foundation, Inc.
3 Contributed by Dmitry Diky <diwil@mail.ru>
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 02111-1307, USA. */
20
21 #include "bfd.h"
22 #include "sysdep.h"
23 #include "libiberty.h"
24 #include "libbfd.h"
25 #include "elf-bfd.h"
26 #include "elf/msp430.h"
27
28 static reloc_howto_type *bfd_elf32_bfd_reloc_type_lookup
29 PARAMS ((bfd *, bfd_reloc_code_real_type));
30
31 static void msp430_info_to_howto_rela
32 PARAMS ((bfd *, arelent *, Elf_Internal_Rela *));
33
34 static asection *elf32_msp430_gc_mark_hook
35 PARAMS ((asection *, struct bfd_link_info *, Elf_Internal_Rela *,
36 struct elf_link_hash_entry *, Elf_Internal_Sym *));
37
38 static bfd_boolean elf32_msp430_gc_sweep_hook
39 PARAMS ((bfd *, struct bfd_link_info *, asection *,
40 const Elf_Internal_Rela *));
41
42 static bfd_boolean elf32_msp430_check_relocs
43 PARAMS ((bfd *, struct bfd_link_info *, asection *,
44 const Elf_Internal_Rela *));
45
46 static bfd_reloc_status_type msp430_final_link_relocate
47 PARAMS ((reloc_howto_type *, bfd *, asection *, bfd_byte *,
48 Elf_Internal_Rela *, bfd_vma));
49
50 static bfd_boolean elf32_msp430_relocate_section
51 PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *,
52 Elf_Internal_Rela *, Elf_Internal_Sym *, asection **));
53
54 static void bfd_elf_msp430_final_write_processing
55 PARAMS ((bfd *, bfd_boolean));
56
57 static bfd_boolean elf32_msp430_object_p
58 PARAMS ((bfd *));
59
60 static void elf32_msp430_post_process_headers
61 PARAMS ((bfd *, struct bfd_link_info *));
62
63 /* Use RELA instead of REL. */
64 #undef USE_REL
65
66 static reloc_howto_type elf_msp430_howto_table[] =
67 {
68 HOWTO (R_MSP430_NONE, /* type */
69 0, /* rightshift */
70 2, /* size (0 = byte, 1 = short, 2 = long) */
71 32, /* bitsize */
72 FALSE, /* pc_relative */
73 0, /* bitpos */
74 complain_overflow_bitfield, /* complain_on_overflow */
75 bfd_elf_generic_reloc, /* special_function */
76 "R_MSP430_NONE", /* name */
77 FALSE, /* partial_inplace */
78 0, /* src_mask */
79 0, /* dst_mask */
80 FALSE), /* pcrel_offset */
81
82 HOWTO (R_MSP430_32, /* type */
83 0, /* rightshift */
84 2, /* size (0 = byte, 1 = short, 2 = long) */
85 32, /* bitsize */
86 FALSE, /* pc_relative */
87 0, /* bitpos */
88 complain_overflow_bitfield, /* complain_on_overflow */
89 bfd_elf_generic_reloc, /* special_function */
90 "R_MSP430_32", /* name */
91 FALSE, /* partial_inplace */
92 0xffffffff, /* src_mask */
93 0xffffffff, /* dst_mask */
94 FALSE), /* pcrel_offset */
95
96 /* A 13 bit PC relative relocation. */
97 HOWTO (R_MSP430_10_PCREL, /* type */
98 1, /* rightshift */
99 1, /* size (0 = byte, 1 = short, 2 = long) */
100 10, /* bitsize */
101 TRUE, /* pc_relative */
102 0, /* bitpos */
103 complain_overflow_bitfield, /* complain_on_overflow */
104 bfd_elf_generic_reloc, /* special_function */
105 "R_MSP430_13_PCREL", /* name */
106 FALSE, /* partial_inplace */
107 0xfff, /* src_mask */
108 0xfff, /* dst_mask */
109 TRUE), /* pcrel_offset */
110
111 /* A 16 bit absolute relocation. */
112 HOWTO (R_MSP430_16, /* type */
113 0, /* rightshift */
114 1, /* size (0 = byte, 1 = short, 2 = long) */
115 16, /* bitsize */
116 FALSE, /* pc_relative */
117 0, /* bitpos */
118 complain_overflow_dont,/* complain_on_overflow */
119 bfd_elf_generic_reloc, /* special_function */
120 "R_MSP430_16", /* name */
121 FALSE, /* partial_inplace */
122 0xffff, /* src_mask */
123 0xffff, /* dst_mask */
124 FALSE), /* pcrel_offset */
125
126 /* A 16 bit absolute relocation for command address. */
127 HOWTO (R_MSP430_16_PCREL, /* type */
128 1, /* rightshift */
129 1, /* size (0 = byte, 1 = short, 2 = long) */
130 16, /* bitsize */
131 TRUE, /* pc_relative */
132 0, /* bitpos */
133 complain_overflow_dont,/* complain_on_overflow */
134 bfd_elf_generic_reloc, /* special_function */
135 "R_MSP430_16_PCREL", /* name */
136 FALSE, /* partial_inplace */
137 0xffff, /* src_mask */
138 0xffff, /* dst_mask */
139 TRUE), /* pcrel_offset */
140
141 /* A 16 bit absolute relocation, byte operations. */
142 HOWTO (R_MSP430_16_BYTE, /* type */
143 0, /* rightshift */
144 1, /* size (0 = byte, 1 = short, 2 = long) */
145 16, /* bitsize */
146 FALSE, /* pc_relative */
147 0, /* bitpos */
148 complain_overflow_dont,/* complain_on_overflow */
149 bfd_elf_generic_reloc, /* special_function */
150 "R_MSP430_16_BYTE", /* name */
151 FALSE, /* partial_inplace */
152 0xffff, /* src_mask */
153 0xffff, /* dst_mask */
154 FALSE), /* pcrel_offset */
155
156 /* A 16 bit absolute relocation for command address. */
157 HOWTO (R_MSP430_16_PCREL_BYTE,/* type */
158 1, /* rightshift */
159 1, /* size (0 = byte, 1 = short, 2 = long) */
160 16, /* bitsize */
161 TRUE, /* pc_relative */
162 0, /* bitpos */
163 complain_overflow_dont,/* complain_on_overflow */
164 bfd_elf_generic_reloc, /* special_function */
165 "R_MSP430_16_PCREL_BYTE", /* name */
166 FALSE, /* partial_inplace */
167 0xffff, /* src_mask */
168 0xffff, /* dst_mask */
169 TRUE) /* pcrel_offset */
170 };
171
172 /* Map BFD reloc types to MSP430 ELF reloc types. */
173
174 struct msp430_reloc_map
175 {
176 bfd_reloc_code_real_type bfd_reloc_val;
177 unsigned int elf_reloc_val;
178 };
179
180 static const struct msp430_reloc_map msp430_reloc_map[] =
181 {
182 {BFD_RELOC_NONE, R_MSP430_NONE},
183 {BFD_RELOC_32, R_MSP430_32},
184 {BFD_RELOC_MSP430_10_PCREL, R_MSP430_10_PCREL},
185 {BFD_RELOC_16, R_MSP430_16_BYTE},
186 {BFD_RELOC_MSP430_16_PCREL, R_MSP430_16_PCREL},
187 {BFD_RELOC_MSP430_16, R_MSP430_16},
188 {BFD_RELOC_MSP430_16_PCREL_BYTE, R_MSP430_16_PCREL_BYTE},
189 {BFD_RELOC_MSP430_16_BYTE, R_MSP430_16_BYTE}
190 };
191
192 static reloc_howto_type *
193 bfd_elf32_bfd_reloc_type_lookup (abfd, code)
194 bfd *abfd ATTRIBUTE_UNUSED;
195 bfd_reloc_code_real_type code;
196 {
197 unsigned int i;
198
199 for (i = 0; i < ARRAY_SIZE (msp430_reloc_map); i++)
200 if (msp430_reloc_map[i].bfd_reloc_val == code)
201 return &elf_msp430_howto_table[msp430_reloc_map[i].elf_reloc_val];
202
203 return NULL;
204 }
205
206 /* Set the howto pointer for an MSP430 ELF reloc. */
207
208 static void
209 msp430_info_to_howto_rela (abfd, cache_ptr, dst)
210 bfd *abfd ATTRIBUTE_UNUSED;
211 arelent *cache_ptr;
212 Elf_Internal_Rela *dst;
213 {
214 unsigned int r_type;
215
216 r_type = ELF32_R_TYPE (dst->r_info);
217 BFD_ASSERT (r_type < (unsigned int) R_MSP430_max);
218 cache_ptr->howto = &elf_msp430_howto_table[r_type];
219 }
220
221 static asection *
222 elf32_msp430_gc_mark_hook (sec, info, rel, h, sym)
223 asection *sec;
224 struct bfd_link_info *info ATTRIBUTE_UNUSED;
225 Elf_Internal_Rela *rel;
226 struct elf_link_hash_entry *h;
227 Elf_Internal_Sym *sym;
228 {
229 if (h != NULL)
230 {
231 switch (ELF32_R_TYPE (rel->r_info))
232 {
233 default:
234 switch (h->root.type)
235 {
236 case bfd_link_hash_defined:
237 case bfd_link_hash_defweak:
238 return h->root.u.def.section;
239
240 case bfd_link_hash_common:
241 return h->root.u.c.p->section;
242
243 default:
244 break;
245 }
246 }
247 }
248 else
249 return bfd_section_from_elf_index (sec->owner, sym->st_shndx);
250
251 return NULL;
252 }
253
254 static bfd_boolean
255 elf32_msp430_gc_sweep_hook (abfd, info, sec, relocs)
256 bfd *abfd ATTRIBUTE_UNUSED;
257 struct bfd_link_info *info ATTRIBUTE_UNUSED;
258 asection *sec ATTRIBUTE_UNUSED;
259 const Elf_Internal_Rela *relocs ATTRIBUTE_UNUSED;
260 {
261 /* We don't use got and plt entries for msp430. */
262 return TRUE;
263 }
264
265 /* Look through the relocs for a section during the first phase.
266 Since we don't do .gots or .plts, we just need to consider the
267 virtual table relocs for gc. */
268
269 static bfd_boolean
270 elf32_msp430_check_relocs (abfd, info, sec, relocs)
271 bfd *abfd;
272 struct bfd_link_info *info;
273 asection *sec;
274 const Elf_Internal_Rela *relocs;
275 {
276 Elf_Internal_Shdr *symtab_hdr;
277 struct elf_link_hash_entry **sym_hashes, **sym_hashes_end;
278 const Elf_Internal_Rela *rel;
279 const Elf_Internal_Rela *rel_end;
280
281 if (info->relocatable)
282 return TRUE;
283
284 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
285 sym_hashes = elf_sym_hashes (abfd);
286 sym_hashes_end =
287 sym_hashes + symtab_hdr->sh_size / sizeof (Elf32_External_Sym);
288 if (!elf_bad_symtab (abfd))
289 sym_hashes_end -= symtab_hdr->sh_info;
290
291 rel_end = relocs + sec->reloc_count;
292 for (rel = relocs; rel < rel_end; rel++)
293 {
294 struct elf_link_hash_entry *h;
295 unsigned long r_symndx;
296
297 r_symndx = ELF32_R_SYM (rel->r_info);
298 if (r_symndx < symtab_hdr->sh_info)
299 h = NULL;
300 else
301 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
302 }
303
304 return TRUE;
305 }
306
307 /* Perform a single relocation. By default we use the standard BFD
308 routines, but a few relocs, we have to do them ourselves. */
309
310 static bfd_reloc_status_type
311 msp430_final_link_relocate (howto, input_bfd, input_section,
312 contents, rel, relocation)
313 reloc_howto_type *howto;
314 bfd *input_bfd;
315 asection *input_section;
316 bfd_byte *contents;
317 Elf_Internal_Rela *rel;
318 bfd_vma relocation;
319 {
320 bfd_reloc_status_type r = bfd_reloc_ok;
321 bfd_vma x;
322 bfd_signed_vma srel;
323
324 switch (howto->type)
325 {
326 case R_MSP430_10_PCREL:
327 contents += rel->r_offset;
328 srel = (bfd_signed_vma) relocation;
329 srel += rel->r_addend;
330 srel -= rel->r_offset;
331 srel -= 2; /* Branch instructions add 2 to the PC... */
332 srel -= (input_section->output_section->vma +
333 input_section->output_offset);
334
335 if (srel & 1)
336 return bfd_reloc_outofrange;
337
338 /* MSP430 addresses commands as words. */
339 srel >>= 1;
340
341 /* Check for an overflow. */
342 if (srel < -512 || srel > 511)
343 return bfd_reloc_overflow;
344
345 x = bfd_get_16 (input_bfd, contents);
346 x = (x & 0xfc00) | (srel & 0x3ff);
347 bfd_put_16 (input_bfd, x, contents);
348 break;
349
350 case R_MSP430_16_PCREL:
351 contents += rel->r_offset;
352 srel = (bfd_signed_vma) relocation;
353 srel += rel->r_addend;
354 srel -= rel->r_offset;
355 /* Only branch instructions add 2 to the PC... */
356 srel -= (input_section->output_section->vma +
357 input_section->output_offset);
358
359 if (srel & 1)
360 return bfd_reloc_outofrange;
361
362 bfd_put_16 (input_bfd, srel & 0xffff, contents);
363 break;
364
365 case R_MSP430_16_PCREL_BYTE:
366 contents += rel->r_offset;
367 srel = (bfd_signed_vma) relocation;
368 srel += rel->r_addend;
369 srel -= rel->r_offset;
370 /* Only branch instructions add 2 to the PC... */
371 srel -= (input_section->output_section->vma +
372 input_section->output_offset);
373
374 bfd_put_16 (input_bfd, srel & 0xffff, contents);
375 break;
376
377 case R_MSP430_16_BYTE:
378 contents += rel->r_offset;
379 srel = (bfd_signed_vma) relocation;
380 srel += rel->r_addend;
381 bfd_put_16 (input_bfd, srel & 0xffff, contents);
382 break;
383
384 case R_MSP430_16:
385 contents += rel->r_offset;
386 srel = (bfd_signed_vma) relocation;
387 srel += rel->r_addend;
388
389 if (srel & 1)
390 return bfd_reloc_notsupported;
391
392 bfd_put_16 (input_bfd, srel & 0xffff, contents);
393 break;
394
395 default:
396 r = _bfd_final_link_relocate (howto, input_bfd, input_section,
397 contents, rel->r_offset,
398 relocation, rel->r_addend);
399 }
400
401 return r;
402 }
403
404 /* Relocate an MSP430 ELF section. */
405
406 static bfd_boolean
407 elf32_msp430_relocate_section (output_bfd, info, input_bfd, input_section,
408 contents, relocs, local_syms, local_sections)
409 bfd *output_bfd ATTRIBUTE_UNUSED;
410 struct bfd_link_info *info;
411 bfd *input_bfd;
412 asection *input_section;
413 bfd_byte *contents;
414 Elf_Internal_Rela *relocs;
415 Elf_Internal_Sym *local_syms;
416 asection **local_sections;
417 {
418 Elf_Internal_Shdr *symtab_hdr;
419 struct elf_link_hash_entry **sym_hashes;
420 Elf_Internal_Rela *rel;
421 Elf_Internal_Rela *relend;
422
423 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
424 sym_hashes = elf_sym_hashes (input_bfd);
425 relend = relocs + input_section->reloc_count;
426
427 for (rel = relocs; rel < relend; rel++)
428 {
429 reloc_howto_type *howto;
430 unsigned long r_symndx;
431 Elf_Internal_Sym *sym;
432 asection *sec;
433 struct elf_link_hash_entry *h;
434 bfd_vma relocation;
435 bfd_reloc_status_type r;
436 const char *name = NULL;
437 int r_type;
438
439 /* This is a final link. */
440
441 r_type = ELF32_R_TYPE (rel->r_info);
442 r_symndx = ELF32_R_SYM (rel->r_info);
443 howto = elf_msp430_howto_table + ELF32_R_TYPE (rel->r_info);
444 h = NULL;
445 sym = NULL;
446 sec = NULL;
447
448 if (r_symndx < symtab_hdr->sh_info)
449 {
450 sym = local_syms + r_symndx;
451 sec = local_sections[r_symndx];
452 relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
453
454 name = bfd_elf_string_from_elf_section
455 (input_bfd, symtab_hdr->sh_link, sym->st_name);
456 name = (name == NULL) ? bfd_section_name (input_bfd, sec) : name;
457 }
458 else
459 {
460 bfd_boolean unresolved_reloc, warned;
461
462 RELOC_FOR_GLOBAL_SYMBOL (h, sym_hashes, r_symndx, symtab_hdr,
463 relocation, sec, unresolved_reloc,
464 info, warned);
465 }
466
467 r = msp430_final_link_relocate (howto, input_bfd, input_section,
468 contents, rel, relocation);
469
470 if (r != bfd_reloc_ok)
471 {
472 const char *msg = (const char *) NULL;
473
474 switch (r)
475 {
476 case bfd_reloc_overflow:
477 r = info->callbacks->reloc_overflow
478 (info, name, howto->name, (bfd_vma) 0,
479 input_bfd, input_section, rel->r_offset);
480 break;
481
482 case bfd_reloc_undefined:
483 r = info->callbacks->undefined_symbol
484 (info, name, input_bfd, input_section, rel->r_offset, TRUE);
485 break;
486
487 case bfd_reloc_outofrange:
488 msg = _("internal error: out of range error");
489 break;
490
491 case bfd_reloc_notsupported:
492 msg = _("internal error: unsupported relocation error");
493 break;
494
495 case bfd_reloc_dangerous:
496 msg = _("internal error: dangerous relocation");
497 break;
498
499 default:
500 msg = _("internal error: unknown error");
501 break;
502 }
503
504 if (msg)
505 r = info->callbacks->warning
506 (info, msg, name, input_bfd, input_section, rel->r_offset);
507
508 if (!r)
509 return FALSE;
510 }
511
512 }
513
514 return TRUE;
515 }
516
517 /* The final processing done just before writing out a MSP430 ELF object
518 file. This gets the MSP430 architecture right based on the machine
519 number. */
520
521 static void
522 bfd_elf_msp430_final_write_processing (abfd, linker)
523 bfd *abfd;
524 bfd_boolean linker ATTRIBUTE_UNUSED;
525 {
526 unsigned long val;
527
528 switch (bfd_get_mach (abfd))
529 {
530 default:
531 case bfd_mach_msp110:
532 val = E_MSP430_MACH_MSP430x11x1;
533 break;
534
535 case bfd_mach_msp11:
536 val = E_MSP430_MACH_MSP430x11;
537 break;
538
539 case bfd_mach_msp12:
540 val = E_MSP430_MACH_MSP430x12;
541 break;
542
543 case bfd_mach_msp13:
544 val = E_MSP430_MACH_MSP430x13;
545 break;
546
547 case bfd_mach_msp14:
548 val = E_MSP430_MACH_MSP430x14;
549 break;
550
551 case bfd_mach_msp15:
552 val = E_MSP430_MACH_MSP430x15;
553 break;
554
555 case bfd_mach_msp16:
556 val = E_MSP430_MACH_MSP430x16;
557 break;
558
559 case bfd_mach_msp31:
560 val = E_MSP430_MACH_MSP430x31;
561 break;
562
563 case bfd_mach_msp32:
564 val = E_MSP430_MACH_MSP430x32;
565 break;
566
567 case bfd_mach_msp33:
568 val = E_MSP430_MACH_MSP430x33;
569 break;
570
571 case bfd_mach_msp41:
572 val = E_MSP430_MACH_MSP430x41;
573 break;
574
575 case bfd_mach_msp42:
576 val = E_MSP430_MACH_MSP430x42;
577 break;
578
579 case bfd_mach_msp43:
580 val = E_MSP430_MACH_MSP430x43;
581 break;
582
583 case bfd_mach_msp44:
584 val = E_MSP430_MACH_MSP430x44;
585 break;
586 }
587
588 elf_elfheader (abfd)->e_machine = EM_MSP430;
589 elf_elfheader (abfd)->e_flags &= ~EF_MSP430_MACH;
590 elf_elfheader (abfd)->e_flags |= val;
591 }
592
593 /* Set the right machine number. */
594
595 static bfd_boolean
596 elf32_msp430_object_p (abfd)
597 bfd *abfd;
598 {
599 int e_set = bfd_mach_msp14;
600
601 if (elf_elfheader (abfd)->e_machine == EM_MSP430
602 || elf_elfheader (abfd)->e_machine == EM_MSP430_OLD)
603 {
604 int e_mach = elf_elfheader (abfd)->e_flags & EF_MSP430_MACH;
605
606 switch (e_mach)
607 {
608 default:
609 case E_MSP430_MACH_MSP430x11:
610 e_set = bfd_mach_msp11;
611 break;
612
613 case E_MSP430_MACH_MSP430x11x1:
614 e_set = bfd_mach_msp110;
615 break;
616
617 case E_MSP430_MACH_MSP430x12:
618 e_set = bfd_mach_msp12;
619 break;
620
621 case E_MSP430_MACH_MSP430x13:
622 e_set = bfd_mach_msp13;
623 break;
624
625 case E_MSP430_MACH_MSP430x14:
626 e_set = bfd_mach_msp14;
627 break;
628
629 case E_MSP430_MACH_MSP430x15:
630 e_set = bfd_mach_msp15;
631 break;
632
633 case E_MSP430_MACH_MSP430x16:
634 e_set = bfd_mach_msp16;
635 break;
636
637 case E_MSP430_MACH_MSP430x31:
638 e_set = bfd_mach_msp31;
639 break;
640
641 case E_MSP430_MACH_MSP430x32:
642 e_set = bfd_mach_msp32;
643 break;
644
645 case E_MSP430_MACH_MSP430x33:
646 e_set = bfd_mach_msp33;
647 break;
648
649 case E_MSP430_MACH_MSP430x41:
650 e_set = bfd_mach_msp41;
651 break;
652
653 case E_MSP430_MACH_MSP430x42:
654 e_set = bfd_mach_msp42;
655 break;
656
657 case E_MSP430_MACH_MSP430x43:
658 e_set = bfd_mach_msp43;
659 break;
660
661 case E_MSP430_MACH_MSP430x44:
662 e_set = bfd_mach_msp44;
663 break;
664 }
665 }
666
667 return bfd_default_set_arch_mach (abfd, bfd_arch_msp430, e_set);
668 }
669
670 static void
671 elf32_msp430_post_process_headers (abfd, link_info)
672 bfd *abfd;
673 struct bfd_link_info *link_info ATTRIBUTE_UNUSED;
674 {
675 Elf_Internal_Ehdr *i_ehdrp; /* ELF file header, internal form. */
676
677 i_ehdrp = elf_elfheader (abfd);
678
679 #ifndef ELFOSABI_STANDALONE
680 #define ELFOSABI_STANDALONE 255
681 #endif
682
683 i_ehdrp->e_ident[EI_OSABI] = ELFOSABI_STANDALONE;
684 }
685
686
687 #define ELF_ARCH bfd_arch_msp430
688 #define ELF_MACHINE_CODE EM_MSP430
689 #define ELF_MACHINE_ALT1 EM_MSP430_OLD
690 #define ELF_MAXPAGESIZE 1
691
692 #define TARGET_LITTLE_SYM bfd_elf32_msp430_vec
693 #define TARGET_LITTLE_NAME "elf32-msp430"
694
695 #define elf_info_to_howto msp430_info_to_howto_rela
696 #define elf_info_to_howto_rel NULL
697 #define elf_backend_relocate_section elf32_msp430_relocate_section
698 #define elf_backend_gc_mark_hook elf32_msp430_gc_mark_hook
699 #define elf_backend_gc_sweep_hook elf32_msp430_gc_sweep_hook
700 #define elf_backend_check_relocs elf32_msp430_check_relocs
701 #define elf_backend_can_gc_sections 1
702 #define elf_backend_final_write_processing bfd_elf_msp430_final_write_processing
703 #define elf_backend_object_p elf32_msp430_object_p
704 #define elf_backend_post_process_headers elf32_msp430_post_process_headers
705
706 #include "elf32-target.h"
This page took 0.063453 seconds and 4 git commands to generate.