1 /* MSP430-specific support for 32-bit ELF
2 Copyright (C) 2002-2017 Free Software Foundation, Inc.
3 Contributed by Dmitry Diky <diwil@mail.ru>
5 This file is part of BFD, the Binary File Descriptor library.
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 3 of the License, or
10 (at your option) any later version.
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.
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., 51 Franklin Street - Fifth Floor, Boston,
20 MA 02110-1301, USA. */
24 #include "libiberty.h"
27 #include "elf/msp430.h"
29 static bfd_reloc_status_type
30 rl78_sym_diff_handler (bfd
* abfd
,
32 asymbol
* sym ATTRIBUTE_UNUSED
,
33 void * addr ATTRIBUTE_UNUSED
,
35 bfd
* out_bfd ATTRIBUTE_UNUSED
,
36 char ** error_message ATTRIBUTE_UNUSED
)
39 octets
= reloc
->address
* bfd_octets_per_byte (abfd
);
41 /* Catch the case where bfd_install_relocation would return
42 bfd_reloc_outofrange because the SYM_DIFF reloc is being used in a very
43 small section. It does not actually matter if this happens because all
44 that SYM_DIFF does is compute a (4-byte) value. A second reloc then uses
45 this value, and it is that reloc that must fit into the section.
47 This happens in eg, gcc/testsuite/gcc.c-torture/compile/labels-3.c. */
48 if ((octets
+ bfd_get_reloc_size (reloc
->howto
))
49 > bfd_get_section_limit_octets (abfd
, input_sec
))
51 return bfd_reloc_continue
;
54 static reloc_howto_type elf_msp430_howto_table
[] =
56 HOWTO (R_MSP430_NONE
, /* type */
58 3, /* size (0 = byte, 1 = short, 2 = long) */
60 FALSE
, /* pc_relative */
62 complain_overflow_dont
,/* complain_on_overflow */
63 bfd_elf_generic_reloc
, /* special_function */
64 "R_MSP430_NONE", /* name */
65 FALSE
, /* partial_inplace */
68 FALSE
), /* pcrel_offset */
70 HOWTO (R_MSP430_32
, /* type */
72 2, /* size (0 = byte, 1 = short, 2 = long) */
74 FALSE
, /* pc_relative */
76 complain_overflow_bitfield
,/* complain_on_overflow */
77 bfd_elf_generic_reloc
, /* special_function */
78 "R_MSP430_32", /* name */
79 FALSE
, /* partial_inplace */
80 0xffffffff, /* src_mask */
81 0xffffffff, /* dst_mask */
82 FALSE
), /* pcrel_offset */
84 /* A 10 bit PC relative relocation. */
85 HOWTO (R_MSP430_10_PCREL
, /* type */
87 1, /* size (0 = byte, 1 = short, 2 = long) */
89 TRUE
, /* pc_relative */
91 complain_overflow_bitfield
,/* complain_on_overflow */
92 bfd_elf_generic_reloc
, /* special_function */
93 "R_MSP430_10_PCREL", /* name */
94 FALSE
, /* partial_inplace */
97 TRUE
), /* pcrel_offset */
99 /* A 16 bit absolute relocation. */
100 HOWTO (R_MSP430_16
, /* type */
102 1, /* size (0 = byte, 1 = short, 2 = long) */
104 FALSE
, /* pc_relative */
106 complain_overflow_dont
,/* complain_on_overflow */
107 bfd_elf_generic_reloc
, /* special_function */
108 "R_MSP430_16", /* name */
109 FALSE
, /* partial_inplace */
111 0xffff, /* dst_mask */
112 FALSE
), /* pcrel_offset */
114 /* A 16 bit PC relative relocation for command address. */
115 HOWTO (R_MSP430_16_PCREL
, /* type */
117 1, /* size (0 = byte, 1 = short, 2 = long) */
119 TRUE
, /* pc_relative */
121 complain_overflow_dont
,/* complain_on_overflow */
122 bfd_elf_generic_reloc
, /* special_function */
123 "R_MSP430_16_PCREL", /* name */
124 FALSE
, /* partial_inplace */
126 0xffff, /* dst_mask */
127 TRUE
), /* pcrel_offset */
129 /* A 16 bit absolute relocation, byte operations. */
130 HOWTO (R_MSP430_16_BYTE
, /* type */
132 1, /* size (0 = byte, 1 = short, 2 = long) */
134 FALSE
, /* pc_relative */
136 complain_overflow_dont
,/* complain_on_overflow */
137 bfd_elf_generic_reloc
, /* special_function */
138 "R_MSP430_16_BYTE", /* name */
139 FALSE
, /* partial_inplace */
140 0xffff, /* src_mask */
141 0xffff, /* dst_mask */
142 FALSE
), /* pcrel_offset */
144 /* A 16 bit absolute relocation for command address. */
145 HOWTO (R_MSP430_16_PCREL_BYTE
,/* type */
147 1, /* size (0 = byte, 1 = short, 2 = long) */
149 TRUE
, /* pc_relative */
151 complain_overflow_dont
,/* complain_on_overflow */
152 bfd_elf_generic_reloc
, /* special_function */
153 "R_MSP430_16_PCREL_BYTE",/* name */
154 FALSE
, /* partial_inplace */
155 0xffff, /* src_mask */
156 0xffff, /* dst_mask */
157 TRUE
), /* pcrel_offset */
159 /* A 10 bit PC relative relocation for complicated polymorphs. */
160 HOWTO (R_MSP430_2X_PCREL
, /* type */
162 2, /* size (0 = byte, 1 = short, 2 = long) */
164 TRUE
, /* pc_relative */
166 complain_overflow_bitfield
,/* complain_on_overflow */
167 bfd_elf_generic_reloc
, /* special_function */
168 "R_MSP430_2X_PCREL", /* name */
169 FALSE
, /* partial_inplace */
170 0x3ff, /* src_mask */
171 0x3ff, /* dst_mask */
172 TRUE
), /* pcrel_offset */
174 /* A 16 bit relaxable relocation for command address. */
175 HOWTO (R_MSP430_RL_PCREL
, /* type */
177 1, /* size (0 = byte, 1 = short, 2 = long) */
179 TRUE
, /* pc_relative */
181 complain_overflow_dont
,/* complain_on_overflow */
182 bfd_elf_generic_reloc
, /* special_function */
183 "R_MSP430_RL_PCREL", /* name */
184 FALSE
, /* partial_inplace */
186 0xffff, /* dst_mask */
187 TRUE
) /* pcrel_offset */
189 /* A 8-bit absolute relocation. */
190 , HOWTO (R_MSP430_8
, /* type */
192 0, /* size (0 = byte, 1 = short, 2 = long) */
194 FALSE
, /* pc_relative */
196 complain_overflow_dont
,/* complain_on_overflow */
197 bfd_elf_generic_reloc
, /* special_function */
198 "R_MSP430_8", /* name */
199 FALSE
, /* partial_inplace */
201 0xffff, /* dst_mask */
202 FALSE
), /* pcrel_offset */
204 /* Together with a following reloc, allows for the difference
205 between two symbols to be the real addend of the second reloc. */
206 HOWTO (R_MSP430_SYM_DIFF
, /* type */
208 2, /* size (0 = byte, 1 = short, 2 = long) */
210 FALSE
, /* pc_relative */
212 complain_overflow_dont
,/* complain_on_overflow */
213 rl78_sym_diff_handler
, /* special handler. */
214 "R_MSP430_SYM_DIFF", /* name */
215 FALSE
, /* partial_inplace */
216 0xffffffff, /* src_mask */
217 0xffffffff, /* dst_mask */
218 FALSE
) /* pcrel_offset */
221 static reloc_howto_type elf_msp430x_howto_table
[] =
223 HOWTO (R_MSP430_NONE
, /* type */
225 3, /* size (0 = byte, 1 = short, 2 = long) */
227 FALSE
, /* pc_relative */
229 complain_overflow_dont
,/* complain_on_overflow */
230 bfd_elf_generic_reloc
, /* special_function */
231 "R_MSP430_NONE", /* name */
232 FALSE
, /* partial_inplace */
235 FALSE
), /* pcrel_offset */
237 HOWTO (R_MSP430_ABS32
, /* type */
239 2, /* size (0 = byte, 1 = short, 2 = long) */
241 FALSE
, /* pc_relative */
243 complain_overflow_bitfield
,/* complain_on_overflow */
244 bfd_elf_generic_reloc
, /* special_function */
245 "R_MSP430_ABS32", /* name */
246 FALSE
, /* partial_inplace */
247 0xffffffff, /* src_mask */
248 0xffffffff, /* dst_mask */
249 FALSE
), /* pcrel_offset */
251 HOWTO (R_MSP430_ABS16
, /* type */
253 1, /* size (0 = byte, 1 = short, 2 = long) */
255 FALSE
, /* pc_relative */
257 complain_overflow_dont
,/* complain_on_overflow */
258 bfd_elf_generic_reloc
, /* special_function */
259 "R_MSP430_ABS16", /* name */
260 FALSE
, /* partial_inplace */
262 0xffff, /* dst_mask */
263 FALSE
), /* pcrel_offset */
265 HOWTO (R_MSP430_ABS8
, /* type */
267 0, /* size (0 = byte, 1 = short, 2 = long) */
269 FALSE
, /* pc_relative */
271 complain_overflow_bitfield
,/* complain_on_overflow */
272 bfd_elf_generic_reloc
, /* special_function */
273 "R_MSP430_ABS8", /* name */
274 FALSE
, /* partial_inplace */
277 FALSE
), /* pcrel_offset */
279 HOWTO (R_MSP430_PCR16
, /* type */
281 1, /* size (0 = byte, 1 = short, 2 = long) */
283 TRUE
, /* pc_relative */
285 complain_overflow_dont
,/* complain_on_overflow */
286 bfd_elf_generic_reloc
, /* special_function */
287 "R_MSP430_PCR16", /* name */
288 FALSE
, /* partial_inplace */
290 0xffff, /* dst_mask */
291 TRUE
), /* pcrel_offset */
293 HOWTO (R_MSP430X_PCR20_EXT_SRC
,/* type */
295 2, /* size (0 = byte, 1 = short, 2 = long) */
297 TRUE
, /* pc_relative */
299 complain_overflow_dont
,/* complain_on_overflow */
300 bfd_elf_generic_reloc
, /* special_function */
301 "R_MSP430X_PCR20_EXT_SRC",/* name */
302 FALSE
, /* partial_inplace */
304 0xffff, /* dst_mask */
305 TRUE
), /* pcrel_offset */
307 HOWTO (R_MSP430X_PCR20_EXT_DST
,/* type */
309 2, /* size (0 = byte, 1 = short, 2 = long) */
311 TRUE
, /* pc_relative */
313 complain_overflow_dont
,/* complain_on_overflow */
314 bfd_elf_generic_reloc
, /* special_function */
315 "R_MSP430X_PCR20_EXT_DST",/* name */
316 FALSE
, /* partial_inplace */
318 0xffff, /* dst_mask */
319 TRUE
), /* pcrel_offset */
321 HOWTO (R_MSP430X_PCR20_EXT_ODST
,/* type */
323 2, /* size (0 = byte, 1 = short, 2 = long) */
325 TRUE
, /* pc_relative */
327 complain_overflow_dont
,/* complain_on_overflow */
328 bfd_elf_generic_reloc
, /* special_function */
329 "R_MSP430X_PCR20_EXT_ODST",/* name */
330 FALSE
, /* partial_inplace */
332 0xffff, /* dst_mask */
333 TRUE
), /* pcrel_offset */
335 HOWTO (R_MSP430X_ABS20_EXT_SRC
,/* type */
337 2, /* size (0 = byte, 1 = short, 2 = long) */
339 TRUE
, /* pc_relative */
341 complain_overflow_dont
,/* complain_on_overflow */
342 bfd_elf_generic_reloc
, /* special_function */
343 "R_MSP430X_ABS20_EXT_SRC",/* name */
344 FALSE
, /* partial_inplace */
346 0xffff, /* dst_mask */
347 TRUE
), /* pcrel_offset */
349 HOWTO (R_MSP430X_ABS20_EXT_DST
,/* type */
351 2, /* size (0 = byte, 1 = short, 2 = long) */
353 TRUE
, /* pc_relative */
355 complain_overflow_dont
,/* complain_on_overflow */
356 bfd_elf_generic_reloc
, /* special_function */
357 "R_MSP430X_ABS20_EXT_DST",/* name */
358 FALSE
, /* partial_inplace */
360 0xffff, /* dst_mask */
361 TRUE
), /* pcrel_offset */
363 HOWTO (R_MSP430X_ABS20_EXT_ODST
,/* type */
365 2, /* size (0 = byte, 1 = short, 2 = long) */
367 TRUE
, /* pc_relative */
369 complain_overflow_dont
,/* complain_on_overflow */
370 bfd_elf_generic_reloc
, /* special_function */
371 "R_MSP430X_ABS20_EXT_ODST",/* name */
372 FALSE
, /* partial_inplace */
374 0xffff, /* dst_mask */
375 TRUE
), /* pcrel_offset */
377 HOWTO (R_MSP430X_ABS20_ADR_SRC
,/* type */
379 2, /* size (0 = byte, 1 = short, 2 = long) */
381 TRUE
, /* pc_relative */
383 complain_overflow_dont
,/* complain_on_overflow */
384 bfd_elf_generic_reloc
, /* special_function */
385 "R_MSP430X_ABS20_ADR_SRC",/* name */
386 FALSE
, /* partial_inplace */
388 0xffff, /* dst_mask */
389 TRUE
), /* pcrel_offset */
391 HOWTO (R_MSP430X_ABS20_ADR_DST
,/* type */
393 2, /* size (0 = byte, 1 = short, 2 = long) */
395 TRUE
, /* pc_relative */
397 complain_overflow_dont
,/* complain_on_overflow */
398 bfd_elf_generic_reloc
, /* special_function */
399 "R_MSP430X_ABS20_ADR_DST",/* name */
400 FALSE
, /* partial_inplace */
402 0xffff, /* dst_mask */
403 TRUE
), /* pcrel_offset */
405 HOWTO (R_MSP430X_PCR16
, /* type */
407 2, /* size (0 = byte, 1 = short, 2 = long) */
409 TRUE
, /* pc_relative */
411 complain_overflow_dont
,/* complain_on_overflow */
412 bfd_elf_generic_reloc
, /* special_function */
413 "R_MSP430X_PCR16", /* name */
414 FALSE
, /* partial_inplace */
416 0xffff, /* dst_mask */
417 TRUE
), /* pcrel_offset */
419 HOWTO (R_MSP430X_PCR20_CALL
, /* type */
421 2, /* size (0 = byte, 1 = short, 2 = long) */
423 TRUE
, /* pc_relative */
425 complain_overflow_dont
,/* complain_on_overflow */
426 bfd_elf_generic_reloc
, /* special_function */
427 "R_MSP430X_PCR20_CALL",/* name */
428 FALSE
, /* partial_inplace */
430 0xffff, /* dst_mask */
431 TRUE
), /* pcrel_offset */
433 HOWTO (R_MSP430X_ABS16
, /* type */
435 2, /* size (0 = byte, 1 = short, 2 = long) */
437 TRUE
, /* pc_relative */
439 complain_overflow_dont
,/* complain_on_overflow */
440 bfd_elf_generic_reloc
, /* special_function */
441 "R_MSP430X_ABS16", /* name */
442 FALSE
, /* partial_inplace */
444 0xffff, /* dst_mask */
445 TRUE
), /* pcrel_offset */
447 HOWTO (R_MSP430_ABS_HI16
, /* type */
449 2, /* size (0 = byte, 1 = short, 2 = long) */
451 TRUE
, /* pc_relative */
453 complain_overflow_dont
,/* complain_on_overflow */
454 bfd_elf_generic_reloc
, /* special_function */
455 "R_MSP430_ABS_HI16", /* name */
456 FALSE
, /* partial_inplace */
458 0xffff, /* dst_mask */
459 TRUE
), /* pcrel_offset */
461 HOWTO (R_MSP430_PREL31
, /* type */
463 2, /* size (0 = byte, 1 = short, 2 = long) */
465 TRUE
, /* pc_relative */
467 complain_overflow_dont
,/* complain_on_overflow */
468 bfd_elf_generic_reloc
, /* special_function */
469 "R_MSP430_PREL31", /* name */
470 FALSE
, /* partial_inplace */
472 0xffff, /* dst_mask */
473 TRUE
), /* pcrel_offset */
475 EMPTY_HOWTO (R_MSP430_EHTYPE
),
477 /* A 10 bit PC relative relocation. */
478 HOWTO (R_MSP430X_10_PCREL
, /* type */
480 1, /* size (0 = byte, 1 = short, 2 = long) */
482 TRUE
, /* pc_relative */
484 complain_overflow_bitfield
,/* complain_on_overflow */
485 bfd_elf_generic_reloc
, /* special_function */
486 "R_MSP430X_10_PCREL", /* name */
487 FALSE
, /* partial_inplace */
488 0x3ff, /* src_mask */
489 0x3ff, /* dst_mask */
490 TRUE
), /* pcrel_offset */
492 /* A 10 bit PC relative relocation for complicated polymorphs. */
493 HOWTO (R_MSP430X_2X_PCREL
, /* type */
495 2, /* size (0 = byte, 1 = short, 2 = long) */
497 TRUE
, /* pc_relative */
499 complain_overflow_bitfield
,/* complain_on_overflow */
500 bfd_elf_generic_reloc
, /* special_function */
501 "R_MSP430X_2X_PCREL", /* name */
502 FALSE
, /* partial_inplace */
503 0x3ff, /* src_mask */
504 0x3ff, /* dst_mask */
505 TRUE
), /* pcrel_offset */
507 /* Together with a following reloc, allows for the difference
508 between two symbols to be the real addend of the second reloc. */
509 HOWTO (R_MSP430X_SYM_DIFF
, /* type */
511 2, /* size (0 = byte, 1 = short, 2 = long) */
513 FALSE
, /* pc_relative */
515 complain_overflow_dont
,/* complain_on_overflow */
516 rl78_sym_diff_handler
, /* special handler. */
517 "R_MSP430X_SYM_DIFF", /* name */
518 FALSE
, /* partial_inplace */
519 0xffffffff, /* src_mask */
520 0xffffffff, /* dst_mask */
521 FALSE
) /* pcrel_offset */
524 /* Map BFD reloc types to MSP430 ELF reloc types. */
526 struct msp430_reloc_map
528 bfd_reloc_code_real_type bfd_reloc_val
;
529 unsigned int elf_reloc_val
;
532 static const struct msp430_reloc_map msp430_reloc_map
[] =
534 {BFD_RELOC_NONE
, R_MSP430_NONE
},
535 {BFD_RELOC_32
, R_MSP430_32
},
536 {BFD_RELOC_MSP430_10_PCREL
, R_MSP430_10_PCREL
},
537 {BFD_RELOC_16
, R_MSP430_16_BYTE
},
538 {BFD_RELOC_MSP430_16_PCREL
, R_MSP430_16_PCREL
},
539 {BFD_RELOC_MSP430_16
, R_MSP430_16
},
540 {BFD_RELOC_MSP430_16_PCREL_BYTE
, R_MSP430_16_PCREL_BYTE
},
541 {BFD_RELOC_MSP430_16_BYTE
, R_MSP430_16_BYTE
},
542 {BFD_RELOC_MSP430_2X_PCREL
, R_MSP430_2X_PCREL
},
543 {BFD_RELOC_MSP430_RL_PCREL
, R_MSP430_RL_PCREL
},
544 {BFD_RELOC_8
, R_MSP430_8
},
545 {BFD_RELOC_MSP430_SYM_DIFF
, R_MSP430_SYM_DIFF
}
548 static const struct msp430_reloc_map msp430x_reloc_map
[] =
550 {BFD_RELOC_NONE
, R_MSP430_NONE
},
551 {BFD_RELOC_32
, R_MSP430_ABS32
},
552 {BFD_RELOC_16
, R_MSP430_ABS16
},
553 {BFD_RELOC_8
, R_MSP430_ABS8
},
554 {BFD_RELOC_MSP430_ABS8
, R_MSP430_ABS8
},
555 {BFD_RELOC_MSP430X_PCR20_EXT_SRC
, R_MSP430X_PCR20_EXT_SRC
},
556 {BFD_RELOC_MSP430X_PCR20_EXT_DST
, R_MSP430X_PCR20_EXT_DST
},
557 {BFD_RELOC_MSP430X_PCR20_EXT_ODST
, R_MSP430X_PCR20_EXT_ODST
},
558 {BFD_RELOC_MSP430X_ABS20_EXT_SRC
, R_MSP430X_ABS20_EXT_SRC
},
559 {BFD_RELOC_MSP430X_ABS20_EXT_DST
, R_MSP430X_ABS20_EXT_DST
},
560 {BFD_RELOC_MSP430X_ABS20_EXT_ODST
, R_MSP430X_ABS20_EXT_ODST
},
561 {BFD_RELOC_MSP430X_ABS20_ADR_SRC
, R_MSP430X_ABS20_ADR_SRC
},
562 {BFD_RELOC_MSP430X_ABS20_ADR_DST
, R_MSP430X_ABS20_ADR_DST
},
563 {BFD_RELOC_MSP430X_PCR16
, R_MSP430X_PCR16
},
564 {BFD_RELOC_MSP430X_PCR20_CALL
, R_MSP430X_PCR20_CALL
},
565 {BFD_RELOC_MSP430X_ABS16
, R_MSP430X_ABS16
},
566 {BFD_RELOC_MSP430_ABS_HI16
, R_MSP430_ABS_HI16
},
567 {BFD_RELOC_MSP430_PREL31
, R_MSP430_PREL31
},
568 {BFD_RELOC_MSP430_10_PCREL
, R_MSP430X_10_PCREL
},
569 {BFD_RELOC_MSP430_2X_PCREL
, R_MSP430X_2X_PCREL
},
570 {BFD_RELOC_MSP430_RL_PCREL
, R_MSP430X_PCR16
},
571 {BFD_RELOC_MSP430_SYM_DIFF
, R_MSP430X_SYM_DIFF
}
574 static inline bfd_boolean
575 uses_msp430x_relocs (bfd
* abfd
)
577 extern const bfd_target msp430_elf32_ti_vec
;
579 return bfd_get_mach (abfd
) == bfd_mach_msp430x
580 || abfd
->xvec
== & msp430_elf32_ti_vec
;
583 static reloc_howto_type
*
584 bfd_elf32_bfd_reloc_type_lookup (bfd
* abfd ATTRIBUTE_UNUSED
,
585 bfd_reloc_code_real_type code
)
589 if (uses_msp430x_relocs (abfd
))
591 for (i
= ARRAY_SIZE (msp430x_reloc_map
); i
--;)
592 if (msp430x_reloc_map
[i
].bfd_reloc_val
== code
)
593 return elf_msp430x_howto_table
+ msp430x_reloc_map
[i
].elf_reloc_val
;
597 for (i
= 0; i
< ARRAY_SIZE (msp430_reloc_map
); i
++)
598 if (msp430_reloc_map
[i
].bfd_reloc_val
== code
)
599 return &elf_msp430_howto_table
[msp430_reloc_map
[i
].elf_reloc_val
];
605 static reloc_howto_type
*
606 bfd_elf32_bfd_reloc_name_lookup (bfd
*abfd ATTRIBUTE_UNUSED
,
611 if (uses_msp430x_relocs (abfd
))
613 for (i
= ARRAY_SIZE (elf_msp430x_howto_table
); i
--;)
614 if (elf_msp430x_howto_table
[i
].name
!= NULL
615 && strcasecmp (elf_msp430x_howto_table
[i
].name
, r_name
) == 0)
616 return elf_msp430x_howto_table
+ i
;
621 i
< (sizeof (elf_msp430_howto_table
)
622 / sizeof (elf_msp430_howto_table
[0]));
624 if (elf_msp430_howto_table
[i
].name
!= NULL
625 && strcasecmp (elf_msp430_howto_table
[i
].name
, r_name
) == 0)
626 return &elf_msp430_howto_table
[i
];
632 /* Set the howto pointer for an MSP430 ELF reloc. */
635 msp430_info_to_howto_rela (bfd
* abfd ATTRIBUTE_UNUSED
,
637 Elf_Internal_Rela
* dst
)
641 r_type
= ELF32_R_TYPE (dst
->r_info
);
643 if (uses_msp430x_relocs (abfd
))
645 if (r_type
>= (unsigned int) R_MSP430x_max
)
647 /* xgettext:c-format */
648 _bfd_error_handler (_("%B: invalid MSP430X reloc number: %d"), abfd
, r_type
);
651 cache_ptr
->howto
= elf_msp430x_howto_table
+ r_type
;
655 if (r_type
>= (unsigned int) R_MSP430_max
)
657 /* xgettext:c-format */
658 _bfd_error_handler (_("%B: invalid MSP430 reloc number: %d"), abfd
, r_type
);
661 cache_ptr
->howto
= &elf_msp430_howto_table
[r_type
];
664 /* Look through the relocs for a section during the first phase.
665 Since we don't do .gots or .plts, we just need to consider the
666 virtual table relocs for gc. */
669 elf32_msp430_check_relocs (bfd
* abfd
, struct bfd_link_info
* info
,
670 asection
* sec
, const Elf_Internal_Rela
* relocs
)
672 Elf_Internal_Shdr
*symtab_hdr
;
673 struct elf_link_hash_entry
**sym_hashes
;
674 const Elf_Internal_Rela
*rel
;
675 const Elf_Internal_Rela
*rel_end
;
677 if (bfd_link_relocatable (info
))
680 symtab_hdr
= &elf_tdata (abfd
)->symtab_hdr
;
681 sym_hashes
= elf_sym_hashes (abfd
);
683 rel_end
= relocs
+ sec
->reloc_count
;
684 for (rel
= relocs
; rel
< rel_end
; rel
++)
686 struct elf_link_hash_entry
*h
;
687 unsigned long r_symndx
;
689 r_symndx
= ELF32_R_SYM (rel
->r_info
);
690 if (r_symndx
< symtab_hdr
->sh_info
)
694 h
= sym_hashes
[r_symndx
- symtab_hdr
->sh_info
];
695 while (h
->root
.type
== bfd_link_hash_indirect
696 || h
->root
.type
== bfd_link_hash_warning
)
697 h
= (struct elf_link_hash_entry
*) h
->root
.u
.i
.link
;
699 /* PR15323, ref flags aren't set for references in the same
701 h
->root
.non_ir_ref_regular
= 1;
708 /* Perform a single relocation. By default we use the standard BFD
709 routines, but a few relocs, we have to do them ourselves. */
711 static bfd_reloc_status_type
712 msp430_final_link_relocate (reloc_howto_type
* howto
,
714 asection
* input_section
,
716 Elf_Internal_Rela
* rel
,
718 struct bfd_link_info
* info
)
720 static asection
* sym_diff_section
;
721 static bfd_vma sym_diff_value
;
723 struct bfd_elf_section_data
* esd
= elf_section_data (input_section
);
724 bfd_reloc_status_type r
= bfd_reloc_ok
;
727 bfd_boolean is_rel_reloc
= FALSE
;
729 if (uses_msp430x_relocs (input_bfd
))
731 /* See if we have a REL type relocation. */
732 is_rel_reloc
= (esd
->rel
.hdr
!= NULL
);
733 /* Sanity check - only one type of relocation per section.
734 FIXME: Theoretically it is possible to have both types,
735 but if that happens how can we distinguish between the two ? */
736 BFD_ASSERT (! is_rel_reloc
|| ! esd
->rela
.hdr
);
737 /* If we are using a REL relocation then the addend should be empty. */
738 BFD_ASSERT (! is_rel_reloc
|| rel
->r_addend
== 0);
741 if (sym_diff_section
!= NULL
)
743 BFD_ASSERT (sym_diff_section
== input_section
);
745 if (uses_msp430x_relocs (input_bfd
))
749 /* If we are computing a 32-bit value for the location lists
750 and the result is 0 then we add one to the value. A zero
751 value can result because of linker relaxation deleteing
752 prologue instructions and using a value of 1 (for the begin
753 and end offsets in the location list entry) results in a
754 nul entry which does not prevent the following entries from
756 if (relocation
== sym_diff_value
757 && strcmp (input_section
->name
, ".debug_loc") == 0)
761 case R_MSP430X_ABS16
:
763 BFD_ASSERT (! is_rel_reloc
);
764 relocation
-= sym_diff_value
;
768 return bfd_reloc_dangerous
;
775 case R_MSP430_16_BYTE
:
777 relocation
-= sym_diff_value
;
781 return bfd_reloc_dangerous
;
784 sym_diff_section
= NULL
;
787 if (uses_msp430x_relocs (input_bfd
))
790 case R_MSP430X_SYM_DIFF
:
791 /* Cache the input section and value.
792 The offset is unreliable, since relaxation may
793 have reduced the following reloc's offset. */
794 BFD_ASSERT (! is_rel_reloc
);
795 sym_diff_section
= input_section
;
796 sym_diff_value
= relocation
;
800 contents
+= rel
->r_offset
;
801 srel
= (bfd_signed_vma
) relocation
;
803 srel
+= bfd_get_16 (input_bfd
, contents
);
805 srel
+= rel
->r_addend
;
806 bfd_put_16 (input_bfd
, srel
& 0xffff, contents
);
809 case R_MSP430X_10_PCREL
:
810 contents
+= rel
->r_offset
;
811 srel
= (bfd_signed_vma
) relocation
;
813 srel
+= bfd_get_16 (input_bfd
, contents
) & 0x3ff;
815 srel
+= rel
->r_addend
;
816 srel
-= rel
->r_offset
;
817 srel
-= 2; /* Branch instructions add 2 to the PC... */
818 srel
-= (input_section
->output_section
->vma
+
819 input_section
->output_offset
);
821 return bfd_reloc_outofrange
;
823 /* MSP430 addresses commands as words. */
826 /* Check for an overflow. */
827 if (srel
< -512 || srel
> 511)
829 if (info
->disable_target_specific_optimizations
< 0)
831 static bfd_boolean warned
= FALSE
;
834 info
->callbacks
->warning
836 _("Try enabling relaxation to avoid relocation truncations"),
837 NULL
, input_bfd
, input_section
, relocation
);
841 return bfd_reloc_overflow
;
844 x
= bfd_get_16 (input_bfd
, contents
);
845 x
= (x
& 0xfc00) | (srel
& 0x3ff);
846 bfd_put_16 (input_bfd
, x
, contents
);
849 case R_MSP430X_PCR20_EXT_ODST
:
850 /* [0,4]+[48,16] = ---F ---- ---- FFFF */
851 contents
+= rel
->r_offset
;
852 srel
= (bfd_signed_vma
) relocation
;
856 addend
= (bfd_get_16 (input_bfd
, contents
) & 0xf) << 16;
857 addend
|= bfd_get_16 (input_bfd
, contents
+ 6);
862 srel
+= rel
->r_addend
;
863 srel
-= rel
->r_offset
;
864 srel
-= (input_section
->output_section
->vma
+
865 input_section
->output_offset
);
866 bfd_put_16 (input_bfd
, (srel
& 0xffff), contents
+ 6);
867 x
= bfd_get_16 (input_bfd
, contents
);
868 x
= (x
& 0xfff0) | ((srel
>> 16) & 0xf);
869 bfd_put_16 (input_bfd
, x
, contents
);
872 case R_MSP430X_ABS20_EXT_SRC
:
873 /* [7,4]+[32,16] = -78- ---- FFFF */
874 contents
+= rel
->r_offset
;
875 srel
= (bfd_signed_vma
) relocation
;
879 addend
= (bfd_get_16 (input_bfd
, contents
) & 0x0780) << 9;
880 addend
|= bfd_get_16 (input_bfd
, contents
+ 4);
884 srel
+= rel
->r_addend
;
885 bfd_put_16 (input_bfd
, (srel
& 0xffff), contents
+ 4);
887 x
= bfd_get_16 (input_bfd
, contents
);
888 x
= (x
& 0xf87f) | ((srel
<< 7) & 0x0780);
889 bfd_put_16 (input_bfd
, x
, contents
);
892 case R_MSP430_16_PCREL
:
893 contents
+= rel
->r_offset
;
894 srel
= (bfd_signed_vma
) relocation
;
896 srel
+= bfd_get_16 (input_bfd
, contents
);
898 srel
+= rel
->r_addend
;
899 srel
-= rel
->r_offset
;
900 /* Only branch instructions add 2 to the PC... */
901 srel
-= (input_section
->output_section
->vma
+
902 input_section
->output_offset
);
904 return bfd_reloc_outofrange
;
905 bfd_put_16 (input_bfd
, srel
& 0xffff, contents
);
908 case R_MSP430X_PCR20_EXT_DST
:
909 /* [0,4]+[32,16] = ---F ---- FFFF */
910 contents
+= rel
->r_offset
;
911 srel
= (bfd_signed_vma
) relocation
;
915 addend
= (bfd_get_16 (input_bfd
, contents
) & 0xf) << 16;
916 addend
|= bfd_get_16 (input_bfd
, contents
+ 4);
920 srel
+= rel
->r_addend
;
921 srel
-= rel
->r_offset
;
922 srel
-= (input_section
->output_section
->vma
+
923 input_section
->output_offset
);
924 bfd_put_16 (input_bfd
, (srel
& 0xffff), contents
+ 4);
926 x
= bfd_get_16 (input_bfd
, contents
);
927 x
= (x
& 0xfff0) | (srel
& 0xf);
928 bfd_put_16 (input_bfd
, x
, contents
);
931 case R_MSP430X_PCR20_EXT_SRC
:
932 /* [7,4]+[32,16] = -78- ---- FFFF */
933 contents
+= rel
->r_offset
;
934 srel
= (bfd_signed_vma
) relocation
;
938 addend
= ((bfd_get_16 (input_bfd
, contents
) & 0x0780) << 9);
939 addend
|= bfd_get_16 (input_bfd
, contents
+ 4);
943 srel
+= rel
->r_addend
;
944 srel
-= rel
->r_offset
;
945 /* Only branch instructions add 2 to the PC... */
946 srel
-= (input_section
->output_section
->vma
+
947 input_section
->output_offset
);
948 bfd_put_16 (input_bfd
, (srel
& 0xffff), contents
+ 4);
950 x
= bfd_get_16 (input_bfd
, contents
);
951 x
= (x
& 0xf87f) | ((srel
<< 7) & 0x0780);
952 bfd_put_16 (input_bfd
, x
, contents
);
956 contents
+= rel
->r_offset
;
957 srel
= (bfd_signed_vma
) relocation
;
959 srel
+= bfd_get_8 (input_bfd
, contents
);
961 srel
+= rel
->r_addend
;
962 bfd_put_8 (input_bfd
, srel
& 0xff, contents
);
965 case R_MSP430X_ABS20_EXT_DST
:
966 /* [0,4]+[32,16] = ---F ---- FFFF */
967 contents
+= rel
->r_offset
;
968 srel
= (bfd_signed_vma
) relocation
;
972 addend
= (bfd_get_16 (input_bfd
, contents
) & 0xf) << 16;
973 addend
|= bfd_get_16 (input_bfd
, contents
+ 4);
977 srel
+= rel
->r_addend
;
978 bfd_put_16 (input_bfd
, (srel
& 0xffff), contents
+ 4);
980 x
= bfd_get_16 (input_bfd
, contents
);
981 x
= (x
& 0xfff0) | (srel
& 0xf);
982 bfd_put_16 (input_bfd
, x
, contents
);
985 case R_MSP430X_ABS20_EXT_ODST
:
986 /* [0,4]+[48,16] = ---F ---- ---- FFFF */
987 contents
+= rel
->r_offset
;
988 srel
= (bfd_signed_vma
) relocation
;
992 addend
= (bfd_get_16 (input_bfd
, contents
) & 0xf) << 16;
993 addend
|= bfd_get_16 (input_bfd
, contents
+ 6);
997 srel
+= rel
->r_addend
;
998 bfd_put_16 (input_bfd
, (srel
& 0xffff), contents
+ 6);
1000 x
= bfd_get_16 (input_bfd
, contents
);
1001 x
= (x
& 0xfff0) | (srel
& 0xf);
1002 bfd_put_16 (input_bfd
, x
, contents
);
1005 case R_MSP430X_ABS20_ADR_SRC
:
1006 /* [8,4]+[16,16] = -F-- FFFF */
1007 contents
+= rel
->r_offset
;
1008 srel
= (bfd_signed_vma
) relocation
;
1013 addend
= ((bfd_get_16 (input_bfd
, contents
) & 0xf00) << 8);
1014 addend
|= bfd_get_16 (input_bfd
, contents
+ 2);
1018 srel
+= rel
->r_addend
;
1019 bfd_put_16 (input_bfd
, (srel
& 0xffff), contents
+ 2);
1021 x
= bfd_get_16 (input_bfd
, contents
);
1022 x
= (x
& 0xf0ff) | ((srel
<< 8) & 0x0f00);
1023 bfd_put_16 (input_bfd
, x
, contents
);
1026 case R_MSP430X_ABS20_ADR_DST
:
1027 /* [0,4]+[16,16] = ---F FFFF */
1028 contents
+= rel
->r_offset
;
1029 srel
= (bfd_signed_vma
) relocation
;
1033 addend
= ((bfd_get_16 (input_bfd
, contents
) & 0xf) << 16);
1034 addend
|= bfd_get_16 (input_bfd
, contents
+ 2);
1038 srel
+= rel
->r_addend
;
1039 bfd_put_16 (input_bfd
, (srel
& 0xffff), contents
+ 2);
1041 x
= bfd_get_16 (input_bfd
, contents
);
1042 x
= (x
& 0xfff0) | (srel
& 0xf);
1043 bfd_put_16 (input_bfd
, x
, contents
);
1046 case R_MSP430X_ABS16
:
1047 contents
+= rel
->r_offset
;
1048 srel
= (bfd_signed_vma
) relocation
;
1050 srel
+= bfd_get_16 (input_bfd
, contents
);
1052 srel
+= rel
->r_addend
;
1055 return bfd_reloc_overflow
;
1056 bfd_put_16 (input_bfd
, srel
& 0xffff, contents
);
1059 case R_MSP430_ABS_HI16
:
1060 /* The EABI specifies that this must be a RELA reloc. */
1061 BFD_ASSERT (! is_rel_reloc
);
1062 contents
+= rel
->r_offset
;
1063 srel
= (bfd_signed_vma
) relocation
;
1064 srel
+= rel
->r_addend
;
1065 bfd_put_16 (input_bfd
, (srel
>> 16) & 0xffff, contents
);
1068 case R_MSP430X_PCR20_CALL
:
1069 /* [0,4]+[16,16] = ---F FFFF*/
1070 contents
+= rel
->r_offset
;
1071 srel
= (bfd_signed_vma
) relocation
;
1075 addend
= (bfd_get_16 (input_bfd
, contents
) & 0xf) << 16;
1076 addend
|= bfd_get_16 (input_bfd
, contents
+ 2);
1080 srel
+= rel
->r_addend
;
1081 srel
-= rel
->r_offset
;
1082 srel
-= (input_section
->output_section
->vma
+
1083 input_section
->output_offset
);
1084 bfd_put_16 (input_bfd
, srel
& 0xffff, contents
+ 2);
1086 x
= bfd_get_16 (input_bfd
, contents
);
1087 x
= (x
& 0xfff0) | (srel
& 0xf);
1088 bfd_put_16 (input_bfd
, x
, contents
);
1091 case R_MSP430X_PCR16
:
1092 contents
+= rel
->r_offset
;
1093 srel
= (bfd_signed_vma
) relocation
;
1095 srel
+= bfd_get_16 (input_bfd
, contents
);
1097 srel
+= rel
->r_addend
;
1098 srel
-= rel
->r_offset
;
1099 srel
-= (input_section
->output_section
->vma
+
1100 input_section
->output_offset
);
1101 bfd_put_16 (input_bfd
, srel
& 0xffff, contents
);
1104 case R_MSP430_PREL31
:
1105 contents
+= rel
->r_offset
;
1106 srel
= (bfd_signed_vma
) relocation
;
1108 srel
+= (bfd_get_32 (input_bfd
, contents
) & 0x7fffffff);
1110 srel
+= rel
->r_addend
;
1111 srel
+= rel
->r_addend
;
1112 x
= bfd_get_32 (input_bfd
, contents
);
1113 x
= (x
& 0x80000000) | ((srel
>> 31) & 0x7fffffff);
1114 bfd_put_32 (input_bfd
, x
, contents
);
1118 r
= _bfd_final_link_relocate (howto
, input_bfd
, input_section
,
1119 contents
, rel
->r_offset
,
1120 relocation
, rel
->r_addend
);
1123 switch (howto
->type
)
1125 case R_MSP430_10_PCREL
:
1126 contents
+= rel
->r_offset
;
1127 srel
= (bfd_signed_vma
) relocation
;
1128 srel
+= rel
->r_addend
;
1129 srel
-= rel
->r_offset
;
1130 srel
-= 2; /* Branch instructions add 2 to the PC... */
1131 srel
-= (input_section
->output_section
->vma
+
1132 input_section
->output_offset
);
1135 return bfd_reloc_outofrange
;
1137 /* MSP430 addresses commands as words. */
1140 /* Check for an overflow. */
1141 if (srel
< -512 || srel
> 511)
1143 if (info
->disable_target_specific_optimizations
< 0)
1145 static bfd_boolean warned
= FALSE
;
1148 info
->callbacks
->warning
1150 _("Try enabling relaxation to avoid relocation truncations"),
1151 NULL
, input_bfd
, input_section
, relocation
);
1155 return bfd_reloc_overflow
;
1158 x
= bfd_get_16 (input_bfd
, contents
);
1159 x
= (x
& 0xfc00) | (srel
& 0x3ff);
1160 bfd_put_16 (input_bfd
, x
, contents
);
1163 case R_MSP430_2X_PCREL
:
1164 contents
+= rel
->r_offset
;
1165 srel
= (bfd_signed_vma
) relocation
;
1166 srel
+= rel
->r_addend
;
1167 srel
-= rel
->r_offset
;
1168 srel
-= 2; /* Branch instructions add 2 to the PC... */
1169 srel
-= (input_section
->output_section
->vma
+
1170 input_section
->output_offset
);
1173 return bfd_reloc_outofrange
;
1175 /* MSP430 addresses commands as words. */
1178 /* Check for an overflow. */
1179 if (srel
< -512 || srel
> 511)
1180 return bfd_reloc_overflow
;
1182 x
= bfd_get_16 (input_bfd
, contents
);
1183 x
= (x
& 0xfc00) | (srel
& 0x3ff);
1184 bfd_put_16 (input_bfd
, x
, contents
);
1185 /* Handle second jump instruction. */
1186 x
= bfd_get_16 (input_bfd
, contents
- 2);
1188 x
= (x
& 0xfc00) | (srel
& 0x3ff);
1189 bfd_put_16 (input_bfd
, x
, contents
- 2);
1192 case R_MSP430_RL_PCREL
:
1193 case R_MSP430_16_PCREL
:
1194 contents
+= rel
->r_offset
;
1195 srel
= (bfd_signed_vma
) relocation
;
1196 srel
+= rel
->r_addend
;
1197 srel
-= rel
->r_offset
;
1198 /* Only branch instructions add 2 to the PC... */
1199 srel
-= (input_section
->output_section
->vma
+
1200 input_section
->output_offset
);
1203 return bfd_reloc_outofrange
;
1205 bfd_put_16 (input_bfd
, srel
& 0xffff, contents
);
1208 case R_MSP430_16_PCREL_BYTE
:
1209 contents
+= rel
->r_offset
;
1210 srel
= (bfd_signed_vma
) relocation
;
1211 srel
+= rel
->r_addend
;
1212 srel
-= rel
->r_offset
;
1213 /* Only branch instructions add 2 to the PC... */
1214 srel
-= (input_section
->output_section
->vma
+
1215 input_section
->output_offset
);
1217 bfd_put_16 (input_bfd
, srel
& 0xffff, contents
);
1220 case R_MSP430_16_BYTE
:
1221 contents
+= rel
->r_offset
;
1222 srel
= (bfd_signed_vma
) relocation
;
1223 srel
+= rel
->r_addend
;
1224 bfd_put_16 (input_bfd
, srel
& 0xffff, contents
);
1228 contents
+= rel
->r_offset
;
1229 srel
= (bfd_signed_vma
) relocation
;
1230 srel
+= rel
->r_addend
;
1233 return bfd_reloc_notsupported
;
1235 bfd_put_16 (input_bfd
, srel
& 0xffff, contents
);
1239 contents
+= rel
->r_offset
;
1240 srel
= (bfd_signed_vma
) relocation
;
1241 srel
+= rel
->r_addend
;
1243 bfd_put_8 (input_bfd
, srel
& 0xff, contents
);
1246 case R_MSP430_SYM_DIFF
:
1247 /* Cache the input section and value.
1248 The offset is unreliable, since relaxation may
1249 have reduced the following reloc's offset. */
1250 sym_diff_section
= input_section
;
1251 sym_diff_value
= relocation
;
1252 return bfd_reloc_ok
;
1255 r
= _bfd_final_link_relocate (howto
, input_bfd
, input_section
,
1256 contents
, rel
->r_offset
,
1257 relocation
, rel
->r_addend
);
1263 /* Relocate an MSP430 ELF section. */
1266 elf32_msp430_relocate_section (bfd
* output_bfd ATTRIBUTE_UNUSED
,
1267 struct bfd_link_info
* info
,
1269 asection
* input_section
,
1270 bfd_byte
* contents
,
1271 Elf_Internal_Rela
* relocs
,
1272 Elf_Internal_Sym
* local_syms
,
1273 asection
** local_sections
)
1275 Elf_Internal_Shdr
*symtab_hdr
;
1276 struct elf_link_hash_entry
**sym_hashes
;
1277 Elf_Internal_Rela
*rel
;
1278 Elf_Internal_Rela
*relend
;
1280 symtab_hdr
= &elf_tdata (input_bfd
)->symtab_hdr
;
1281 sym_hashes
= elf_sym_hashes (input_bfd
);
1282 relend
= relocs
+ input_section
->reloc_count
;
1284 for (rel
= relocs
; rel
< relend
; rel
++)
1286 reloc_howto_type
*howto
;
1287 unsigned long r_symndx
;
1288 Elf_Internal_Sym
*sym
;
1290 struct elf_link_hash_entry
*h
;
1292 bfd_reloc_status_type r
;
1293 const char *name
= NULL
;
1296 r_type
= ELF32_R_TYPE (rel
->r_info
);
1297 r_symndx
= ELF32_R_SYM (rel
->r_info
);
1299 if (uses_msp430x_relocs (input_bfd
))
1300 howto
= elf_msp430x_howto_table
+ r_type
;
1302 howto
= elf_msp430_howto_table
+ r_type
;
1308 if (r_symndx
< symtab_hdr
->sh_info
)
1310 sym
= local_syms
+ r_symndx
;
1311 sec
= local_sections
[r_symndx
];
1312 relocation
= _bfd_elf_rela_local_sym (output_bfd
, sym
, &sec
, rel
);
1314 name
= bfd_elf_string_from_elf_section
1315 (input_bfd
, symtab_hdr
->sh_link
, sym
->st_name
);
1316 name
= (name
== NULL
|| * name
== 0) ? bfd_section_name (input_bfd
, sec
) : name
;
1320 bfd_boolean unresolved_reloc
, warned
, ignored
;
1322 RELOC_FOR_GLOBAL_SYMBOL (info
, input_bfd
, input_section
, rel
,
1323 r_symndx
, symtab_hdr
, sym_hashes
,
1325 unresolved_reloc
, warned
, ignored
);
1326 name
= h
->root
.root
.string
;
1329 if (sec
!= NULL
&& discarded_section (sec
))
1330 RELOC_AGAINST_DISCARDED_SECTION (info
, input_bfd
, input_section
,
1331 rel
, 1, relend
, howto
, 0, contents
);
1333 if (bfd_link_relocatable (info
))
1336 r
= msp430_final_link_relocate (howto
, input_bfd
, input_section
,
1337 contents
, rel
, relocation
, info
);
1339 if (r
!= bfd_reloc_ok
)
1341 const char *msg
= (const char *) NULL
;
1345 case bfd_reloc_overflow
:
1346 (*info
->callbacks
->reloc_overflow
)
1347 (info
, (h
? &h
->root
: NULL
), name
, howto
->name
,
1348 (bfd_vma
) 0, input_bfd
, input_section
, rel
->r_offset
);
1351 case bfd_reloc_undefined
:
1352 (*info
->callbacks
->undefined_symbol
)
1353 (info
, name
, input_bfd
, input_section
, rel
->r_offset
, TRUE
);
1356 case bfd_reloc_outofrange
:
1357 msg
= _("internal error: branch/jump to an odd address detected");
1360 case bfd_reloc_notsupported
:
1361 msg
= _("internal error: unsupported relocation error");
1364 case bfd_reloc_dangerous
:
1365 msg
= _("internal error: dangerous relocation");
1369 msg
= _("internal error: unknown error");
1374 (*info
->callbacks
->warning
) (info
, msg
, name
, input_bfd
,
1375 input_section
, rel
->r_offset
);
1383 /* The final processing done just before writing out a MSP430 ELF object
1384 file. This gets the MSP430 architecture right based on the machine
1388 bfd_elf_msp430_final_write_processing (bfd
* abfd
,
1389 bfd_boolean linker ATTRIBUTE_UNUSED
)
1393 switch (bfd_get_mach (abfd
))
1396 case bfd_mach_msp110
: val
= E_MSP430_MACH_MSP430x11x1
; break;
1397 case bfd_mach_msp11
: val
= E_MSP430_MACH_MSP430x11
; break;
1398 case bfd_mach_msp12
: val
= E_MSP430_MACH_MSP430x12
; break;
1399 case bfd_mach_msp13
: val
= E_MSP430_MACH_MSP430x13
; break;
1400 case bfd_mach_msp14
: val
= E_MSP430_MACH_MSP430x14
; break;
1401 case bfd_mach_msp15
: val
= E_MSP430_MACH_MSP430x15
; break;
1402 case bfd_mach_msp16
: val
= E_MSP430_MACH_MSP430x16
; break;
1403 case bfd_mach_msp31
: val
= E_MSP430_MACH_MSP430x31
; break;
1404 case bfd_mach_msp32
: val
= E_MSP430_MACH_MSP430x32
; break;
1405 case bfd_mach_msp33
: val
= E_MSP430_MACH_MSP430x33
; break;
1406 case bfd_mach_msp41
: val
= E_MSP430_MACH_MSP430x41
; break;
1407 case bfd_mach_msp42
: val
= E_MSP430_MACH_MSP430x42
; break;
1408 case bfd_mach_msp43
: val
= E_MSP430_MACH_MSP430x43
; break;
1409 case bfd_mach_msp44
: val
= E_MSP430_MACH_MSP430x44
; break;
1410 case bfd_mach_msp20
: val
= E_MSP430_MACH_MSP430x20
; break;
1411 case bfd_mach_msp22
: val
= E_MSP430_MACH_MSP430x22
; break;
1412 case bfd_mach_msp23
: val
= E_MSP430_MACH_MSP430x23
; break;
1413 case bfd_mach_msp24
: val
= E_MSP430_MACH_MSP430x24
; break;
1414 case bfd_mach_msp26
: val
= E_MSP430_MACH_MSP430x26
; break;
1415 case bfd_mach_msp46
: val
= E_MSP430_MACH_MSP430x46
; break;
1416 case bfd_mach_msp47
: val
= E_MSP430_MACH_MSP430x47
; break;
1417 case bfd_mach_msp54
: val
= E_MSP430_MACH_MSP430x54
; break;
1418 case bfd_mach_msp430x
: val
= E_MSP430_MACH_MSP430X
; break;
1421 elf_elfheader (abfd
)->e_machine
= EM_MSP430
;
1422 elf_elfheader (abfd
)->e_flags
&= ~EF_MSP430_MACH
;
1423 elf_elfheader (abfd
)->e_flags
|= val
;
1426 /* Set the right machine number. */
1429 elf32_msp430_object_p (bfd
* abfd
)
1431 int e_set
= bfd_mach_msp14
;
1433 if (elf_elfheader (abfd
)->e_machine
== EM_MSP430
1434 || elf_elfheader (abfd
)->e_machine
== EM_MSP430_OLD
)
1436 int e_mach
= elf_elfheader (abfd
)->e_flags
& EF_MSP430_MACH
;
1441 case E_MSP430_MACH_MSP430x11
: e_set
= bfd_mach_msp11
; break;
1442 case E_MSP430_MACH_MSP430x11x1
: e_set
= bfd_mach_msp110
; break;
1443 case E_MSP430_MACH_MSP430x12
: e_set
= bfd_mach_msp12
; break;
1444 case E_MSP430_MACH_MSP430x13
: e_set
= bfd_mach_msp13
; break;
1445 case E_MSP430_MACH_MSP430x14
: e_set
= bfd_mach_msp14
; break;
1446 case E_MSP430_MACH_MSP430x15
: e_set
= bfd_mach_msp15
; break;
1447 case E_MSP430_MACH_MSP430x16
: e_set
= bfd_mach_msp16
; break;
1448 case E_MSP430_MACH_MSP430x31
: e_set
= bfd_mach_msp31
; break;
1449 case E_MSP430_MACH_MSP430x32
: e_set
= bfd_mach_msp32
; break;
1450 case E_MSP430_MACH_MSP430x33
: e_set
= bfd_mach_msp33
; break;
1451 case E_MSP430_MACH_MSP430x41
: e_set
= bfd_mach_msp41
; break;
1452 case E_MSP430_MACH_MSP430x42
: e_set
= bfd_mach_msp42
; break;
1453 case E_MSP430_MACH_MSP430x43
: e_set
= bfd_mach_msp43
; break;
1454 case E_MSP430_MACH_MSP430x44
: e_set
= bfd_mach_msp44
; break;
1455 case E_MSP430_MACH_MSP430x20
: e_set
= bfd_mach_msp20
; break;
1456 case E_MSP430_MACH_MSP430x22
: e_set
= bfd_mach_msp22
; break;
1457 case E_MSP430_MACH_MSP430x23
: e_set
= bfd_mach_msp23
; break;
1458 case E_MSP430_MACH_MSP430x24
: e_set
= bfd_mach_msp24
; break;
1459 case E_MSP430_MACH_MSP430x26
: e_set
= bfd_mach_msp26
; break;
1460 case E_MSP430_MACH_MSP430x46
: e_set
= bfd_mach_msp46
; break;
1461 case E_MSP430_MACH_MSP430x47
: e_set
= bfd_mach_msp47
; break;
1462 case E_MSP430_MACH_MSP430x54
: e_set
= bfd_mach_msp54
; break;
1463 case E_MSP430_MACH_MSP430X
: e_set
= bfd_mach_msp430x
; break;
1467 return bfd_default_set_arch_mach (abfd
, bfd_arch_msp430
, e_set
);
1470 /* These functions handle relaxing for the msp430.
1471 Relaxation required only in two cases:
1472 - Bad hand coding like jumps from one section to another or
1474 - Sibling calls. This will affect only 'jump label' polymorph. Without
1475 relaxing this enlarges code by 2 bytes. Sibcalls implemented but
1476 do not work in gcc's port by the reason I do not know.
1477 - To convert out of range conditional jump instructions (found inside
1478 a function) into inverted jumps over an unconditional branch instruction.
1479 Anyway, if a relaxation required, user should pass -relax option to the
1482 There are quite a few relaxing opportunities available on the msp430:
1484 ================================================================
1486 1. 3 words -> 1 word
1488 eq == jeq label jne +4; br lab
1489 ne != jne label jeq +4; br lab
1490 lt < jl label jge +4; br lab
1491 ltu < jlo label lhs +4; br lab
1492 ge >= jge label jl +4; br lab
1493 geu >= jhs label jlo +4; br lab
1495 2. 4 words -> 1 word
1497 ltn < jn jn +2; jmp +4; br lab
1499 3. 4 words -> 2 words
1501 gt > jeq +2; jge label jeq +6; jl +4; br label
1502 gtu > jeq +2; jhs label jeq +6; jlo +4; br label
1504 4. 4 words -> 2 words and 2 labels
1506 leu <= jeq label; jlo label jeq +2; jhs +4; br label
1507 le <= jeq label; jl label jeq +2; jge +4; br label
1508 =================================================================
1510 codemap for first cases is (labels masked ):
1511 eq: 0x2002,0x4010,0x0000 -> 0x2400
1512 ne: 0x2402,0x4010,0x0000 -> 0x2000
1513 lt: 0x3402,0x4010,0x0000 -> 0x3800
1514 ltu: 0x2c02,0x4010,0x0000 -> 0x2800
1515 ge: 0x3802,0x4010,0x0000 -> 0x3400
1516 geu: 0x2802,0x4010,0x0000 -> 0x2c00
1519 ltn: 0x3001,0x3c02,0x4010,0x0000 -> 0x3000
1522 gt: 0x2403,0x3802,0x4010,0x0000 -> 0x2401,0x3400
1523 gtu: 0x2403,0x2802,0x4010,0x0000 -> 0x2401,0x2c00
1526 leu: 0x2401,0x2c02,0x4010,0x0000 -> 0x2400,0x2800
1527 le: 0x2401,0x3402,0x4010,0x0000 -> 0x2400,0x3800
1530 jump: 0x4010,0x0000 -> 0x3c00. */
1532 #define NUMB_RELAX_CODES 12
1533 static struct rcodes_s
1535 int f0
, f1
; /* From code. */
1536 int t0
, t1
; /* To code. */
1537 int labels
; /* Position of labels: 1 - one label at first
1538 word, 2 - one at second word, 3 - two
1540 int cdx
; /* Words to match. */
1541 int bs
; /* Shrink bytes. */
1542 int off
; /* Offset from old label for new code. */
1543 int ncl
; /* New code length. */
1545 {/* lab,cdx,bs,off,ncl */
1546 { 0x0000, 0x0000, 0x3c00, 0x0000, 1, 0, 2, 2, 2}, /* jump */
1547 { 0x0000, 0x2002, 0x2400, 0x0000, 1, 1, 4, 4, 2}, /* eq */
1548 { 0x0000, 0x2402, 0x2000, 0x0000, 1, 1, 4, 4, 2}, /* ne */
1549 { 0x0000, 0x3402, 0x3800, 0x0000, 1, 1, 4, 4, 2}, /* lt */
1550 { 0x0000, 0x2c02, 0x2800, 0x0000, 1, 1, 4, 4, 2}, /* ltu */
1551 { 0x0000, 0x3802, 0x3400, 0x0000, 1, 1, 4, 4, 2}, /* ge */
1552 { 0x0000, 0x2802, 0x2c00, 0x0000, 1, 1, 4, 4, 2}, /* geu */
1553 { 0x3001, 0x3c02, 0x3000, 0x0000, 1, 2, 6, 6, 2}, /* ltn */
1554 { 0x2403, 0x3802, 0x2401, 0x3400, 2, 2, 4, 6, 4}, /* gt */
1555 { 0x2403, 0x2802, 0x2401, 0x2c00, 2, 2, 4, 6, 4}, /* gtu */
1556 { 0x2401, 0x2c02, 0x2400, 0x2800, 3, 2, 4, 6, 4}, /* leu , 2 labels */
1557 { 0x2401, 0x2c02, 0x2400, 0x2800, 3, 2, 4, 6, 4}, /* le , 2 labels */
1558 { 0, 0, 0, 0, 0, 0, 0, 0, 0}
1561 /* Return TRUE if a symbol exists at the given address. */
1564 msp430_elf_symbol_address_p (bfd
* abfd
,
1566 Elf_Internal_Sym
* isym
,
1569 Elf_Internal_Shdr
*symtab_hdr
;
1570 unsigned int sec_shndx
;
1571 Elf_Internal_Sym
*isymend
;
1572 struct elf_link_hash_entry
**sym_hashes
;
1573 struct elf_link_hash_entry
**end_hashes
;
1574 unsigned int symcount
;
1576 sec_shndx
= _bfd_elf_section_from_bfd_section (abfd
, sec
);
1578 /* Examine all the local symbols. */
1579 symtab_hdr
= &elf_tdata (abfd
)->symtab_hdr
;
1580 for (isymend
= isym
+ symtab_hdr
->sh_info
; isym
< isymend
; isym
++)
1581 if (isym
->st_shndx
== sec_shndx
&& isym
->st_value
== addr
)
1584 symcount
= (symtab_hdr
->sh_size
/ sizeof (Elf32_External_Sym
)
1585 - symtab_hdr
->sh_info
);
1586 sym_hashes
= elf_sym_hashes (abfd
);
1587 end_hashes
= sym_hashes
+ symcount
;
1588 for (; sym_hashes
< end_hashes
; sym_hashes
++)
1590 struct elf_link_hash_entry
*sym_hash
= *sym_hashes
;
1592 if ((sym_hash
->root
.type
== bfd_link_hash_defined
1593 || sym_hash
->root
.type
== bfd_link_hash_defweak
)
1594 && sym_hash
->root
.u
.def
.section
== sec
1595 && sym_hash
->root
.u
.def
.value
== addr
)
1602 /* Adjust all local symbols defined as '.section + 0xXXXX' (.section has
1603 sec_shndx) referenced from current and other sections. */
1606 msp430_elf_relax_adjust_locals (bfd
* abfd
, asection
* sec
, bfd_vma addr
,
1607 int count
, unsigned int sec_shndx
,
1610 Elf_Internal_Shdr
*symtab_hdr
;
1611 Elf_Internal_Rela
*irel
;
1612 Elf_Internal_Rela
*irelend
;
1613 Elf_Internal_Sym
*isym
;
1615 irel
= elf_section_data (sec
)->relocs
;
1619 irelend
= irel
+ sec
->reloc_count
;
1620 symtab_hdr
= & elf_tdata (abfd
)->symtab_hdr
;
1621 isym
= (Elf_Internal_Sym
*) symtab_hdr
->contents
;
1623 for (;irel
< irelend
; irel
++)
1625 unsigned int sidx
= ELF32_R_SYM(irel
->r_info
);
1626 Elf_Internal_Sym
*lsym
= isym
+ sidx
;
1628 /* Adjust symbols referenced by .sec+0xXX. */
1629 if (irel
->r_addend
> addr
&& irel
->r_addend
< toaddr
1630 && sidx
< symtab_hdr
->sh_info
1631 && lsym
->st_shndx
== sec_shndx
)
1632 irel
->r_addend
-= count
;
1638 /* Delete some bytes from a section while relaxing. */
1641 msp430_elf_relax_delete_bytes (bfd
* abfd
, asection
* sec
, bfd_vma addr
,
1644 Elf_Internal_Shdr
*symtab_hdr
;
1645 unsigned int sec_shndx
;
1647 Elf_Internal_Rela
*irel
;
1648 Elf_Internal_Rela
*irelend
;
1650 Elf_Internal_Sym
*isym
;
1651 Elf_Internal_Sym
*isymend
;
1652 struct elf_link_hash_entry
**sym_hashes
;
1653 struct elf_link_hash_entry
**end_hashes
;
1654 unsigned int symcount
;
1657 sec_shndx
= _bfd_elf_section_from_bfd_section (abfd
, sec
);
1659 contents
= elf_section_data (sec
)->this_hdr
.contents
;
1663 irel
= elf_section_data (sec
)->relocs
;
1664 irelend
= irel
+ sec
->reloc_count
;
1666 /* Actually delete the bytes. */
1667 memmove (contents
+ addr
, contents
+ addr
+ count
,
1668 (size_t) (toaddr
- addr
- count
));
1671 /* Adjust all the relocs. */
1672 symtab_hdr
= & elf_tdata (abfd
)->symtab_hdr
;
1673 isym
= (Elf_Internal_Sym
*) symtab_hdr
->contents
;
1674 for (; irel
< irelend
; irel
++)
1676 /* Get the new reloc address. */
1677 if ((irel
->r_offset
> addr
&& irel
->r_offset
< toaddr
))
1678 irel
->r_offset
-= count
;
1681 for (p
= abfd
->sections
; p
!= NULL
; p
= p
->next
)
1682 msp430_elf_relax_adjust_locals (abfd
,p
,addr
,count
,sec_shndx
,toaddr
);
1684 /* Adjust the local symbols defined in this section. */
1685 symtab_hdr
= & elf_tdata (abfd
)->symtab_hdr
;
1686 isym
= (Elf_Internal_Sym
*) symtab_hdr
->contents
;
1687 for (isymend
= isym
+ symtab_hdr
->sh_info
; isym
< isymend
; isym
++)
1691 name
= bfd_elf_string_from_elf_section
1692 (abfd
, symtab_hdr
->sh_link
, isym
->st_name
);
1693 name
= (name
== NULL
|| * name
== 0) ? bfd_section_name (abfd
, sec
) : name
;
1695 if (isym
->st_shndx
!= sec_shndx
)
1698 if (isym
->st_value
> addr
1699 && (isym
->st_value
< toaddr
1700 /* We also adjust a symbol at the end of the section if its name is
1701 on the list below. These symbols are used for debug info
1702 generation and they refer to the end of the current section, not
1703 the start of the next section. */
1704 || (isym
->st_value
== toaddr
1706 && (CONST_STRNEQ (name
, ".Letext")
1707 || CONST_STRNEQ (name
, ".LFE")))))
1709 if (isym
->st_value
< addr
+ count
)
1710 isym
->st_value
= addr
;
1712 isym
->st_value
-= count
;
1714 /* Adjust the function symbol's size as well. */
1715 else if (ELF_ST_TYPE (isym
->st_info
) == STT_FUNC
1716 && isym
->st_value
+ isym
->st_size
> addr
1717 && isym
->st_value
+ isym
->st_size
< toaddr
)
1718 isym
->st_size
-= count
;
1721 /* Now adjust the global symbols defined in this section. */
1722 symcount
= (symtab_hdr
->sh_size
/ sizeof (Elf32_External_Sym
)
1723 - symtab_hdr
->sh_info
);
1724 sym_hashes
= elf_sym_hashes (abfd
);
1725 end_hashes
= sym_hashes
+ symcount
;
1726 for (; sym_hashes
< end_hashes
; sym_hashes
++)
1728 struct elf_link_hash_entry
*sym_hash
= *sym_hashes
;
1730 if ((sym_hash
->root
.type
== bfd_link_hash_defined
1731 || sym_hash
->root
.type
== bfd_link_hash_defweak
)
1732 && sym_hash
->root
.u
.def
.section
== sec
1733 && sym_hash
->root
.u
.def
.value
> addr
1734 && sym_hash
->root
.u
.def
.value
< toaddr
)
1736 if (sym_hash
->root
.u
.def
.value
< addr
+ count
)
1737 sym_hash
->root
.u
.def
.value
= addr
;
1739 sym_hash
->root
.u
.def
.value
-= count
;
1741 /* Adjust the function symbol's size as well. */
1742 else if (sym_hash
->root
.type
== bfd_link_hash_defined
1743 && sym_hash
->root
.u
.def
.section
== sec
1744 && sym_hash
->type
== STT_FUNC
1745 && sym_hash
->root
.u
.def
.value
+ sym_hash
->size
> addr
1746 && sym_hash
->root
.u
.def
.value
+ sym_hash
->size
< toaddr
)
1747 sym_hash
->size
-= count
;
1753 /* Insert two words into a section whilst relaxing. */
1756 msp430_elf_relax_add_two_words (bfd
* abfd
, asection
* sec
, bfd_vma addr
,
1757 int word1
, int word2
)
1759 Elf_Internal_Shdr
*symtab_hdr
;
1760 unsigned int sec_shndx
;
1762 Elf_Internal_Rela
*irel
;
1763 Elf_Internal_Rela
*irelend
;
1764 Elf_Internal_Sym
*isym
;
1765 Elf_Internal_Sym
*isymend
;
1766 struct elf_link_hash_entry
**sym_hashes
;
1767 struct elf_link_hash_entry
**end_hashes
;
1768 unsigned int symcount
;
1772 contents
= elf_section_data (sec
)->this_hdr
.contents
;
1773 sec_end
= sec
->size
;
1775 /* Make space for the new words. */
1776 contents
= bfd_realloc (contents
, sec_end
+ 4);
1777 memmove (contents
+ addr
+ 4, contents
+ addr
, sec_end
- addr
);
1779 /* Insert the new words. */
1780 bfd_put_16 (abfd
, word1
, contents
+ addr
);
1781 bfd_put_16 (abfd
, word2
, contents
+ addr
+ 2);
1783 /* Update the section information. */
1785 elf_section_data (sec
)->this_hdr
.contents
= contents
;
1787 /* Adjust all the relocs. */
1788 irel
= elf_section_data (sec
)->relocs
;
1789 irelend
= irel
+ sec
->reloc_count
;
1791 for (; irel
< irelend
; irel
++)
1792 if ((irel
->r_offset
>= addr
&& irel
->r_offset
< sec_end
))
1793 irel
->r_offset
+= 4;
1795 /* Adjust the local symbols defined in this section. */
1796 sec_shndx
= _bfd_elf_section_from_bfd_section (abfd
, sec
);
1797 for (p
= abfd
->sections
; p
!= NULL
; p
= p
->next
)
1798 msp430_elf_relax_adjust_locals (abfd
, p
, addr
, -4,
1799 sec_shndx
, sec_end
);
1801 /* Adjust the global symbols affected by the move. */
1802 symtab_hdr
= & elf_tdata (abfd
)->symtab_hdr
;
1803 isym
= (Elf_Internal_Sym
*) symtab_hdr
->contents
;
1804 for (isymend
= isym
+ symtab_hdr
->sh_info
; isym
< isymend
; isym
++)
1805 if (isym
->st_shndx
== sec_shndx
1806 && isym
->st_value
>= addr
&& isym
->st_value
< sec_end
)
1807 isym
->st_value
+= 4;
1809 /* Now adjust the global symbols defined in this section. */
1810 symcount
= (symtab_hdr
->sh_size
/ sizeof (Elf32_External_Sym
)
1811 - symtab_hdr
->sh_info
);
1812 sym_hashes
= elf_sym_hashes (abfd
);
1813 end_hashes
= sym_hashes
+ symcount
;
1814 for (; sym_hashes
< end_hashes
; sym_hashes
++)
1816 struct elf_link_hash_entry
*sym_hash
= *sym_hashes
;
1818 if ((sym_hash
->root
.type
== bfd_link_hash_defined
1819 || sym_hash
->root
.type
== bfd_link_hash_defweak
)
1820 && sym_hash
->root
.u
.def
.section
== sec
1821 && sym_hash
->root
.u
.def
.value
>= addr
1822 && sym_hash
->root
.u
.def
.value
< sec_end
)
1823 sym_hash
->root
.u
.def
.value
+= 4;
1830 msp430_elf_relax_section (bfd
* abfd
, asection
* sec
,
1831 struct bfd_link_info
* link_info
,
1832 bfd_boolean
* again
)
1834 Elf_Internal_Shdr
* symtab_hdr
;
1835 Elf_Internal_Rela
* internal_relocs
;
1836 Elf_Internal_Rela
* irel
;
1837 Elf_Internal_Rela
* irelend
;
1838 bfd_byte
* contents
= NULL
;
1839 Elf_Internal_Sym
* isymbuf
= NULL
;
1841 /* Assume nothing changes. */
1844 /* We don't have to do anything for a relocatable link, if
1845 this section does not have relocs, or if this is not a
1847 if (bfd_link_relocatable (link_info
)
1848 || (sec
->flags
& SEC_RELOC
) == 0
1849 || sec
->reloc_count
== 0 || (sec
->flags
& SEC_CODE
) == 0)
1852 symtab_hdr
= & elf_tdata (abfd
)->symtab_hdr
;
1854 /* Get a copy of the native relocations. */
1856 _bfd_elf_link_read_relocs (abfd
, sec
, NULL
, NULL
, link_info
->keep_memory
);
1857 if (internal_relocs
== NULL
)
1860 /* Walk through them looking for relaxing opportunities. */
1861 irelend
= internal_relocs
+ sec
->reloc_count
;
1863 /* Do code size growing relocs first. */
1864 for (irel
= internal_relocs
; irel
< irelend
; irel
++)
1868 /* If this isn't something that can be relaxed, then ignore
1870 if (uses_msp430x_relocs (abfd
)
1871 && ELF32_R_TYPE (irel
->r_info
) == (int) R_MSP430X_10_PCREL
)
1873 else if (! uses_msp430x_relocs (abfd
)
1874 && ELF32_R_TYPE (irel
->r_info
) == (int) R_MSP430_10_PCREL
)
1879 /* Get the section contents if we haven't done so already. */
1880 if (contents
== NULL
)
1882 /* Get cached copy if it exists. */
1883 if (elf_section_data (sec
)->this_hdr
.contents
!= NULL
)
1884 contents
= elf_section_data (sec
)->this_hdr
.contents
;
1885 else if (! bfd_malloc_and_get_section (abfd
, sec
, &contents
))
1889 /* Read this BFD's local symbols if we haven't done so already. */
1890 if (isymbuf
== NULL
&& symtab_hdr
->sh_info
!= 0)
1892 isymbuf
= (Elf_Internal_Sym
*) symtab_hdr
->contents
;
1893 if (isymbuf
== NULL
)
1894 isymbuf
= bfd_elf_get_elf_syms (abfd
, symtab_hdr
,
1895 symtab_hdr
->sh_info
, 0,
1897 if (isymbuf
== NULL
)
1901 /* Get the value of the symbol referred to by the reloc. */
1902 if (ELF32_R_SYM (irel
->r_info
) < symtab_hdr
->sh_info
)
1904 /* A local symbol. */
1905 Elf_Internal_Sym
*isym
;
1908 isym
= isymbuf
+ ELF32_R_SYM (irel
->r_info
);
1909 if (isym
->st_shndx
== SHN_UNDEF
)
1910 sym_sec
= bfd_und_section_ptr
;
1911 else if (isym
->st_shndx
== SHN_ABS
)
1912 sym_sec
= bfd_abs_section_ptr
;
1913 else if (isym
->st_shndx
== SHN_COMMON
)
1914 sym_sec
= bfd_com_section_ptr
;
1916 sym_sec
= bfd_section_from_elf_index (abfd
, isym
->st_shndx
);
1917 symval
= (isym
->st_value
1918 + sym_sec
->output_section
->vma
+ sym_sec
->output_offset
);
1923 struct elf_link_hash_entry
*h
;
1925 /* An external symbol. */
1926 indx
= ELF32_R_SYM (irel
->r_info
) - symtab_hdr
->sh_info
;
1927 h
= elf_sym_hashes (abfd
)[indx
];
1928 BFD_ASSERT (h
!= NULL
);
1930 if (h
->root
.type
!= bfd_link_hash_defined
1931 && h
->root
.type
!= bfd_link_hash_defweak
)
1932 /* This appears to be a reference to an undefined
1933 symbol. Just ignore it--it will be caught by the
1934 regular reloc processing. */
1937 symval
= (h
->root
.u
.def
.value
1938 + h
->root
.u
.def
.section
->output_section
->vma
1939 + h
->root
.u
.def
.section
->output_offset
);
1942 /* For simplicity of coding, we are going to modify the section
1943 contents, the section relocs, and the BFD symbol table. We
1944 must tell the rest of the code not to free up this
1945 information. It would be possible to instead create a table
1946 of changes which have to be made, as is done in coff-mips.c;
1947 that would be more work, but would require less memory when
1948 the linker is run. */
1950 bfd_signed_vma value
= symval
;
1953 /* Compute the value that will be relocated. */
1954 value
+= irel
->r_addend
;
1955 /* Convert to PC relative. */
1956 value
-= (sec
->output_section
->vma
+ sec
->output_offset
);
1957 value
-= irel
->r_offset
;
1962 /* If it is in range then no modifications are needed. */
1963 if (value
>= -512 && value
<= 511)
1966 /* Get the opcode. */
1967 opcode
= bfd_get_16 (abfd
, contents
+ irel
->r_offset
);
1969 /* Compute the new opcode. We are going to convert:
1975 switch (opcode
& 0xfc00)
1977 case 0x3800: opcode
= 0x3402; break; /* Jl -> Jge +2 */
1978 case 0x3400: opcode
= 0x3802; break; /* Jge -> Jl +2 */
1979 case 0x2c00: opcode
= 0x2802; break; /* Jhs -> Jlo +2 */
1980 case 0x2800: opcode
= 0x2c02; break; /* Jlo -> Jhs +2 */
1981 case 0x2400: opcode
= 0x2002; break; /* Jeq -> Jne +2 */
1982 case 0x2000: opcode
= 0x2402; break; /* jne -> Jeq +2 */
1983 case 0x3000: /* jn */
1984 /* There is no direct inverse of the Jn insn.
1985 FIXME: we could do this as:
1992 /* Not a conditional branch instruction. */
1993 /* fprintf (stderr, "unrecog: %x\n", opcode); */
1997 /* Note that we've changed the relocs, section contents, etc. */
1998 elf_section_data (sec
)->relocs
= internal_relocs
;
1999 elf_section_data (sec
)->this_hdr
.contents
= contents
;
2000 symtab_hdr
->contents
= (unsigned char *) isymbuf
;
2002 /* Install the new opcode. */
2003 bfd_put_16 (abfd
, opcode
, contents
+ irel
->r_offset
);
2005 /* Insert the new branch instruction. */
2006 if (uses_msp430x_relocs (abfd
))
2008 /* Insert an absolute branch (aka MOVA) instruction. */
2009 contents
= msp430_elf_relax_add_two_words
2010 (abfd
, sec
, irel
->r_offset
+ 2, 0x0080, 0x0000);
2012 /* Update the relocation to point to the inserted branch
2013 instruction. Note - we are changing a PC-relative reloc
2014 into an absolute reloc, but this is OK because we have
2015 arranged with the assembler to have the reloc's value be
2016 a (local) symbol, not a section+offset value. */
2017 irel
->r_offset
+= 2;
2018 irel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
),
2019 R_MSP430X_ABS20_ADR_SRC
);
2023 contents
= msp430_elf_relax_add_two_words
2024 (abfd
, sec
, irel
->r_offset
+ 2, 0x4030, 0x0000);
2026 /* See comment above about converting a 10-bit PC-rel
2027 relocation into a 16-bit absolute relocation. */
2028 irel
->r_offset
+= 4;
2029 irel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
),
2033 /* Growing the section may mean that other
2034 conditional branches need to be fixed. */
2038 for (irel
= internal_relocs
; irel
< irelend
; irel
++)
2042 /* Get the section contents if we haven't done so already. */
2043 if (contents
== NULL
)
2045 /* Get cached copy if it exists. */
2046 if (elf_section_data (sec
)->this_hdr
.contents
!= NULL
)
2047 contents
= elf_section_data (sec
)->this_hdr
.contents
;
2048 else if (! bfd_malloc_and_get_section (abfd
, sec
, &contents
))
2052 /* Read this BFD's local symbols if we haven't done so already. */
2053 if (isymbuf
== NULL
&& symtab_hdr
->sh_info
!= 0)
2055 isymbuf
= (Elf_Internal_Sym
*) symtab_hdr
->contents
;
2056 if (isymbuf
== NULL
)
2057 isymbuf
= bfd_elf_get_elf_syms (abfd
, symtab_hdr
,
2058 symtab_hdr
->sh_info
, 0,
2060 if (isymbuf
== NULL
)
2064 /* Get the value of the symbol referred to by the reloc. */
2065 if (ELF32_R_SYM (irel
->r_info
) < symtab_hdr
->sh_info
)
2067 /* A local symbol. */
2068 Elf_Internal_Sym
*isym
;
2071 isym
= isymbuf
+ ELF32_R_SYM (irel
->r_info
);
2072 if (isym
->st_shndx
== SHN_UNDEF
)
2073 sym_sec
= bfd_und_section_ptr
;
2074 else if (isym
->st_shndx
== SHN_ABS
)
2075 sym_sec
= bfd_abs_section_ptr
;
2076 else if (isym
->st_shndx
== SHN_COMMON
)
2077 sym_sec
= bfd_com_section_ptr
;
2079 sym_sec
= bfd_section_from_elf_index (abfd
, isym
->st_shndx
);
2080 symval
= (isym
->st_value
2081 + sym_sec
->output_section
->vma
+ sym_sec
->output_offset
);
2086 struct elf_link_hash_entry
*h
;
2088 /* An external symbol. */
2089 indx
= ELF32_R_SYM (irel
->r_info
) - symtab_hdr
->sh_info
;
2090 h
= elf_sym_hashes (abfd
)[indx
];
2091 BFD_ASSERT (h
!= NULL
);
2093 if (h
->root
.type
!= bfd_link_hash_defined
2094 && h
->root
.type
!= bfd_link_hash_defweak
)
2095 /* This appears to be a reference to an undefined
2096 symbol. Just ignore it--it will be caught by the
2097 regular reloc processing. */
2100 symval
= (h
->root
.u
.def
.value
2101 + h
->root
.u
.def
.section
->output_section
->vma
2102 + h
->root
.u
.def
.section
->output_offset
);
2105 /* For simplicity of coding, we are going to modify the section
2106 contents, the section relocs, and the BFD symbol table. We
2107 must tell the rest of the code not to free up this
2108 information. It would be possible to instead create a table
2109 of changes which have to be made, as is done in coff-mips.c;
2110 that would be more work, but would require less memory when
2111 the linker is run. */
2113 /* Try to turn a 16bit pc-relative branch into a 10bit pc-relative
2115 /* Paranoia? paranoia... */
2116 if (! uses_msp430x_relocs (abfd
)
2117 && ELF32_R_TYPE (irel
->r_info
) == (int) R_MSP430_RL_PCREL
)
2119 bfd_vma value
= symval
;
2121 /* Deal with pc-relative gunk. */
2122 value
-= (sec
->output_section
->vma
+ sec
->output_offset
);
2123 value
-= irel
->r_offset
;
2124 value
+= irel
->r_addend
;
2126 /* See if the value will fit in 10 bits, note the high value is
2127 1016 as the target will be two bytes closer if we are
2129 if ((long) value
< 1016 && (long) value
> -1016)
2131 int code0
= 0, code1
= 0, code2
= 0;
2133 struct rcodes_s
*rx
;
2135 /* Get the opcode. */
2136 if (irel
->r_offset
>= 6)
2137 code0
= bfd_get_16 (abfd
, contents
+ irel
->r_offset
- 6);
2139 if (irel
->r_offset
>= 4)
2140 code1
= bfd_get_16 (abfd
, contents
+ irel
->r_offset
- 4);
2142 code2
= bfd_get_16 (abfd
, contents
+ irel
->r_offset
- 2);
2144 if (code2
!= 0x4010)
2147 /* Check r4 and r3. */
2148 for (i
= NUMB_RELAX_CODES
- 1; i
>= 0; i
--)
2151 if (rx
->cdx
== 2 && rx
->f0
== code0
&& rx
->f1
== code1
)
2153 else if (rx
->cdx
== 1 && rx
->f1
== code1
)
2155 else if (rx
->cdx
== 0) /* This is an unconditional jump. */
2160 .Label0: ; we do not care about this label
2162 .Label1: ; make sure there is no label here
2164 .Label2: ; make sure there is no label here
2167 So, if there is .Label1 or .Label2 we cannot relax this code.
2168 This actually should not happen, cause for relaxable
2169 instructions we use RL_PCREL reloc instead of 16_PCREL.
2170 Will change this in the future. */
2173 && msp430_elf_symbol_address_p (abfd
, sec
, isymbuf
,
2174 irel
->r_offset
- 2))
2177 && msp430_elf_symbol_address_p (abfd
, sec
, isymbuf
,
2178 irel
->r_offset
- 4))
2181 /* Note that we've changed the relocs, section contents, etc. */
2182 elf_section_data (sec
)->relocs
= internal_relocs
;
2183 elf_section_data (sec
)->this_hdr
.contents
= contents
;
2184 symtab_hdr
->contents
= (unsigned char *) isymbuf
;
2186 /* Fix the relocation's type. */
2187 if (uses_msp430x_relocs (abfd
))
2189 if (rx
->labels
== 3) /* Handle special cases. */
2190 irel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
),
2191 R_MSP430X_2X_PCREL
);
2193 irel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
),
2194 R_MSP430X_10_PCREL
);
2198 if (rx
->labels
== 3) /* Handle special cases. */
2199 irel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
),
2202 irel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
),
2206 /* Fix the opcode right way. */
2207 bfd_put_16 (abfd
, rx
->t0
, contents
+ irel
->r_offset
- rx
->off
);
2209 bfd_put_16 (abfd
, rx
->t1
,
2210 contents
+ irel
->r_offset
- rx
->off
+ 2);
2213 if (!msp430_elf_relax_delete_bytes (abfd
, sec
,
2214 irel
->r_offset
- rx
->off
+
2218 /* Handle unconditional jumps. */
2220 irel
->r_offset
-= 2;
2222 /* That will change things, so, we should relax again.
2223 Note that this is not required, and it may be slow. */
2228 /* Try to turn a 16-bit absolute branch into a 10-bit pc-relative
2230 if ((uses_msp430x_relocs (abfd
)
2231 && ELF32_R_TYPE (irel
->r_info
) == R_MSP430X_ABS16
)
2232 || (! uses_msp430x_relocs (abfd
)
2233 && ELF32_R_TYPE (irel
->r_info
) == R_MSP430_16
))
2235 bfd_vma value
= symval
;
2237 value
-= (sec
->output_section
->vma
+ sec
->output_offset
);
2238 value
-= irel
->r_offset
;
2239 value
+= irel
->r_addend
;
2241 /* See if the value will fit in 10 bits, note the high value is
2242 1016 as the target will be two bytes closer if we are
2244 if ((long) value
< 1016 && (long) value
> -1016)
2248 /* Get the opcode. */
2249 code2
= bfd_get_16 (abfd
, contents
+ irel
->r_offset
- 2);
2250 if (code2
!= 0x4030)
2252 /* FIXME: check r4 and r3 ? */
2253 /* FIXME: Handle 0x4010 as well ? */
2255 /* Note that we've changed the relocs, section contents, etc. */
2256 elf_section_data (sec
)->relocs
= internal_relocs
;
2257 elf_section_data (sec
)->this_hdr
.contents
= contents
;
2258 symtab_hdr
->contents
= (unsigned char *) isymbuf
;
2260 /* Fix the relocation's type. */
2261 if (uses_msp430x_relocs (abfd
))
2263 irel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
),
2264 R_MSP430X_10_PCREL
);
2268 irel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
),
2272 /* Fix the opcode right way. */
2273 bfd_put_16 (abfd
, 0x3c00, contents
+ irel
->r_offset
- 2);
2274 irel
->r_offset
-= 2;
2277 if (!msp430_elf_relax_delete_bytes (abfd
, sec
,
2278 irel
->r_offset
+ 2, 2))
2281 /* That will change things, so, we should relax again.
2282 Note that this is not required, and it may be slow. */
2288 if (isymbuf
!= NULL
&& symtab_hdr
->contents
!= (unsigned char *) isymbuf
)
2290 if (!link_info
->keep_memory
)
2294 /* Cache the symbols for elf_link_input_bfd. */
2295 symtab_hdr
->contents
= (unsigned char *) isymbuf
;
2299 if (contents
!= NULL
2300 && elf_section_data (sec
)->this_hdr
.contents
!= contents
)
2302 if (!link_info
->keep_memory
)
2306 /* Cache the section contents for elf_link_input_bfd. */
2307 elf_section_data (sec
)->this_hdr
.contents
= contents
;
2311 if (internal_relocs
!= NULL
2312 && elf_section_data (sec
)->relocs
!= internal_relocs
)
2313 free (internal_relocs
);
2318 if (isymbuf
!= NULL
&& symtab_hdr
->contents
!= (unsigned char *) isymbuf
)
2320 if (contents
!= NULL
2321 && elf_section_data (sec
)->this_hdr
.contents
!= contents
)
2323 if (internal_relocs
!= NULL
2324 && elf_section_data (sec
)->relocs
!= internal_relocs
)
2325 free (internal_relocs
);
2330 /* Handle an MSP430 specific section when reading an object file.
2331 This is called when bfd_section_from_shdr finds a section with
2335 elf32_msp430_section_from_shdr (bfd
*abfd
,
2336 Elf_Internal_Shdr
* hdr
,
2340 switch (hdr
->sh_type
)
2342 case SHT_MSP430_SEC_FLAGS
:
2343 case SHT_MSP430_SYM_ALIASES
:
2344 case SHT_MSP430_ATTRIBUTES
:
2345 return _bfd_elf_make_section_from_shdr (abfd
, hdr
, name
, shindex
);
2352 elf32_msp430_obj_attrs_handle_unknown (bfd
*abfd
, int tag
)
2355 /* xgettext:c-format */
2356 (_("Warning: %B: Unknown MSPABI object attribute %d"),
2361 /* Determine whether an object attribute tag takes an integer, a
2365 elf32_msp430_obj_attrs_arg_type (int tag
)
2367 if (tag
== Tag_compatibility
)
2368 return ATTR_TYPE_FLAG_INT_VAL
| ATTR_TYPE_FLAG_STR_VAL
;
2371 return ATTR_TYPE_FLAG_INT_VAL
;
2373 return (tag
& 1) != 0 ? ATTR_TYPE_FLAG_STR_VAL
: ATTR_TYPE_FLAG_INT_VAL
;
2376 static inline const char *
2381 case 1: return "MSP430";
2382 case 2: return "MSP430X";
2383 default: return "unknown";
2387 static inline const char *
2388 code_model (int model
)
2392 case 1: return "small";
2393 case 2: return "large";
2394 default: return "unknown";
2398 static inline const char *
2399 data_model (int model
)
2403 case 1: return "small";
2404 case 2: return "large";
2405 case 3: return "restricted large";
2406 default: return "unknown";
2410 /* Merge MSPABI object attributes from IBFD into OBFD.
2411 Raise an error if there are conflicting attributes. */
2414 elf32_msp430_merge_mspabi_attributes (bfd
*ibfd
, struct bfd_link_info
*info
)
2416 bfd
*obfd
= info
->output_bfd
;
2417 obj_attribute
*in_attr
;
2418 obj_attribute
*out_attr
;
2419 bfd_boolean result
= TRUE
;
2420 static bfd
* first_input_bfd
= NULL
;
2422 /* Skip linker created files. */
2423 if (ibfd
->flags
& BFD_LINKER_CREATED
)
2426 /* If this is the first real object just copy the attributes. */
2427 if (!elf_known_obj_attributes_proc (obfd
)[0].i
)
2429 _bfd_elf_copy_obj_attributes (ibfd
, obfd
);
2431 out_attr
= elf_known_obj_attributes_proc (obfd
);
2433 /* Use the Tag_null value to indicate that
2434 the attributes have been initialized. */
2437 first_input_bfd
= ibfd
;
2441 in_attr
= elf_known_obj_attributes_proc (ibfd
);
2442 out_attr
= elf_known_obj_attributes_proc (obfd
);
2444 /* The ISAs must be the same. */
2445 if (in_attr
[OFBA_MSPABI_Tag_ISA
].i
!= out_attr
[OFBA_MSPABI_Tag_ISA
].i
)
2448 /* xgettext:c-format */
2449 (_("error: %B uses %s instructions but %B uses %s"),
2450 ibfd
, isa_type (in_attr
[OFBA_MSPABI_Tag_ISA
].i
),
2451 first_input_bfd
, isa_type (out_attr
[OFBA_MSPABI_Tag_ISA
].i
));
2455 /* The code models must be the same. */
2456 if (in_attr
[OFBA_MSPABI_Tag_Code_Model
].i
!=
2457 out_attr
[OFBA_MSPABI_Tag_Code_Model
].i
)
2460 /* xgettext:c-format */
2461 (_("error: %B uses the %s code model whereas %B uses the %s code model"),
2462 ibfd
, code_model (in_attr
[OFBA_MSPABI_Tag_Code_Model
].i
),
2463 first_input_bfd
, code_model (out_attr
[OFBA_MSPABI_Tag_Code_Model
].i
));
2467 /* The large code model is only supported by the MSP430X. */
2468 if (in_attr
[OFBA_MSPABI_Tag_Code_Model
].i
== 2
2469 && out_attr
[OFBA_MSPABI_Tag_ISA
].i
!= 2)
2472 /* xgettext:c-format */
2473 (_("error: %B uses the large code model but %B uses MSP430 instructions"),
2474 ibfd
, first_input_bfd
);
2478 /* The data models must be the same. */
2479 if (in_attr
[OFBA_MSPABI_Tag_Data_Model
].i
!=
2480 out_attr
[OFBA_MSPABI_Tag_Data_Model
].i
)
2483 /* xgettext:c-format */
2484 (_("error: %B uses the %s data model whereas %B uses the %s data model"),
2485 ibfd
, data_model (in_attr
[OFBA_MSPABI_Tag_Data_Model
].i
),
2486 first_input_bfd
, data_model (out_attr
[OFBA_MSPABI_Tag_Data_Model
].i
));
2490 /* The small code model requires the use of the small data model. */
2491 if (in_attr
[OFBA_MSPABI_Tag_Code_Model
].i
== 1
2492 && out_attr
[OFBA_MSPABI_Tag_Data_Model
].i
!= 1)
2495 /* xgettext:c-format */
2496 (_("error: %B uses the small code model but %B uses the %s data model"),
2497 ibfd
, first_input_bfd
,
2498 data_model (out_attr
[OFBA_MSPABI_Tag_Data_Model
].i
));
2502 /* The large data models are only supported by the MSP430X. */
2503 if (in_attr
[OFBA_MSPABI_Tag_Data_Model
].i
> 1
2504 && out_attr
[OFBA_MSPABI_Tag_ISA
].i
!= 2)
2507 /* xgettext:c-format */
2508 (_("error: %B uses the %s data model but %B only uses MSP430 instructions"),
2509 ibfd
, data_model (in_attr
[OFBA_MSPABI_Tag_Data_Model
].i
),
2517 /* Merge backend specific data from an object file to the output
2518 object file when linking. */
2521 elf32_msp430_merge_private_bfd_data (bfd
*ibfd
, struct bfd_link_info
*info
)
2523 bfd
*obfd
= info
->output_bfd
;
2524 /* Make sure that the machine number reflects the most
2525 advanced version of the MSP architecture required. */
2526 #define max(a,b) ((a) > (b) ? (a) : (b))
2527 if (bfd_get_mach (ibfd
) != bfd_get_mach (obfd
))
2528 bfd_default_set_arch_mach (obfd
, bfd_get_arch (obfd
),
2529 max (bfd_get_mach (ibfd
), bfd_get_mach (obfd
)));
2532 return elf32_msp430_merge_mspabi_attributes (ibfd
, info
);
2536 msp430_elf_is_target_special_symbol (bfd
*abfd
, asymbol
*sym
)
2538 return _bfd_elf_is_local_label_name (abfd
, sym
->name
);
2542 uses_large_model (bfd
*abfd
)
2544 obj_attribute
* attr
;
2546 if (abfd
->flags
& BFD_LINKER_CREATED
)
2549 attr
= elf_known_obj_attributes_proc (abfd
);
2553 return attr
[OFBA_MSPABI_Tag_Code_Model
].i
== 2;
2557 elf32_msp430_eh_frame_address_size (bfd
*abfd
,
2558 const asection
*sec ATTRIBUTE_UNUSED
)
2560 return uses_large_model (abfd
) ? 4 : 2;
2563 /* This is gross. The MSP430 EABI says that (sec 11.5):
2565 "An implementation may choose to use Rel or Rela
2566 type relocations for other relocations."
2568 But it also says that:
2570 "Certain relocations are identified as Rela only. [snip]
2571 Where Rela is specified, an implementation must honor
2574 There is one relocation marked as requiring RELA - R_MSP430_ABS_HI16 - but
2575 to keep things simple we choose to use RELA relocations throughout. The
2576 problem is that the TI compiler generates REL relocations, so we have to
2577 be able to accept those as well. */
2579 #define elf_backend_may_use_rel_p 1
2580 #define elf_backend_may_use_rela_p 1
2581 #define elf_backend_default_use_rela_p 1
2583 #undef elf_backend_obj_attrs_vendor
2584 #define elf_backend_obj_attrs_vendor "mspabi"
2585 #undef elf_backend_obj_attrs_section
2586 #define elf_backend_obj_attrs_section ".MSP430.attributes"
2587 #undef elf_backend_obj_attrs_section_type
2588 #define elf_backend_obj_attrs_section_type SHT_MSP430_ATTRIBUTES
2589 #define elf_backend_section_from_shdr elf32_msp430_section_from_shdr
2590 #define elf_backend_obj_attrs_handle_unknown elf32_msp430_obj_attrs_handle_unknown
2591 #undef elf_backend_obj_attrs_arg_type
2592 #define elf_backend_obj_attrs_arg_type elf32_msp430_obj_attrs_arg_type
2593 #define bfd_elf32_bfd_merge_private_bfd_data elf32_msp430_merge_private_bfd_data
2594 #define elf_backend_eh_frame_address_size elf32_msp430_eh_frame_address_size
2596 #define ELF_ARCH bfd_arch_msp430
2597 #define ELF_MACHINE_CODE EM_MSP430
2598 #define ELF_MACHINE_ALT1 EM_MSP430_OLD
2599 #define ELF_MAXPAGESIZE 4
2600 #define ELF_OSABI ELFOSABI_STANDALONE
2602 #define TARGET_LITTLE_SYM msp430_elf32_vec
2603 #define TARGET_LITTLE_NAME "elf32-msp430"
2605 #define elf_info_to_howto msp430_info_to_howto_rela
2606 #define elf_info_to_howto_rel NULL
2607 #define elf_backend_relocate_section elf32_msp430_relocate_section
2608 #define elf_backend_check_relocs elf32_msp430_check_relocs
2609 #define elf_backend_can_gc_sections 1
2610 #define elf_backend_final_write_processing bfd_elf_msp430_final_write_processing
2611 #define elf_backend_object_p elf32_msp430_object_p
2612 #define bfd_elf32_bfd_relax_section msp430_elf_relax_section
2613 #define bfd_elf32_bfd_is_target_special_symbol msp430_elf_is_target_special_symbol
2616 #define elf32_bed elf32_msp430_bed
2618 #include "elf32-target.h"
2620 /* The TI compiler sets the OSABI field to ELFOSABI_NONE. */
2621 #undef TARGET_LITTLE_SYM
2622 #define TARGET_LITTLE_SYM msp430_elf32_ti_vec
2625 #define elf32_bed elf32_msp430_ti_bed
2628 #define ELF_OSABI ELFOSABI_NONE
2630 static const struct bfd_elf_special_section msp430_ti_elf_special_sections
[] =
2632 /* prefix, prefix_length, suffix_len, type, attributes. */
2633 { STRING_COMMA_LEN (".TI.symbol.alias"), 0, SHT_MSP430_SYM_ALIASES
, 0 },
2634 { STRING_COMMA_LEN (".TI.section.flags"), 0, SHT_MSP430_SEC_FLAGS
, 0 },
2635 { STRING_COMMA_LEN ("_TI_build_attrib"), 0, SHT_MSP430_ATTRIBUTES
, 0 },
2636 { NULL
, 0, 0, 0, 0 }
2639 #undef elf_backend_special_sections
2640 #define elf_backend_special_sections msp430_ti_elf_special_sections
2642 #include "elf32-target.h"