1 /* AVR-specific support for 32-bit ELF
2 Copyright (C) 1999-2014 Free Software Foundation, Inc.
3 Contributed by Denis Chertykov <denisc@overta.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,
20 Boston, MA 02110-1301, USA. */
27 #include "elf32-avr.h"
29 /* Enable debugging printout at stdout with this variable. */
30 static bfd_boolean debug_relax = FALSE;
32 /* Enable debugging printout at stdout with this variable. */
33 static bfd_boolean debug_stubs = FALSE;
35 static bfd_reloc_status_type
36 bfd_elf_avr_diff_reloc (bfd *abfd,
40 asection *input_section,
42 char **error_message);
44 /* Hash table initialization and handling. Code is taken from the hppa port
45 and adapted to the needs of AVR. */
47 /* We use two hash tables to hold information for linking avr objects.
49 The first is the elf32_avr_link_hash_table which is derived from the
50 stanard ELF linker hash table. We use this as a place to attach the other
51 hash table and some static information.
53 The second is the stub hash table which is derived from the base BFD
54 hash table. The stub hash table holds the information on the linker
57 struct elf32_avr_stub_hash_entry
59 /* Base hash table entry structure. */
60 struct bfd_hash_entry bh_root;
62 /* Offset within stub_sec of the beginning of this stub. */
65 /* Given the symbol's value and its section we can determine its final
66 value when building the stubs (so the stub knows where to jump). */
69 /* This way we could mark stubs to be no longer necessary. */
70 bfd_boolean is_actually_needed;
73 struct elf32_avr_link_hash_table
75 /* The main hash table. */
76 struct elf_link_hash_table etab;
78 /* The stub hash table. */
79 struct bfd_hash_table bstab;
83 /* Linker stub bfd. */
86 /* The stub section. */
89 /* Usually 0, unless we are generating code for a bootloader. Will
90 be initialized by elf32_avr_size_stubs to the vma offset of the
91 output section associated with the stub section. */
94 /* Assorted information used by elf32_avr_size_stubs. */
95 unsigned int bfd_count;
97 asection ** input_list;
98 Elf_Internal_Sym ** all_local_syms;
100 /* Tables for mapping vma beyond the 128k boundary to the address of the
101 corresponding stub. (AMT)
102 "amt_max_entry_cnt" reflects the number of entries that memory is allocated
103 for in the "amt_stub_offsets" and "amt_destination_addr" arrays.
104 "amt_entry_cnt" informs how many of these entries actually contain
106 unsigned int amt_entry_cnt;
107 unsigned int amt_max_entry_cnt;
108 bfd_vma * amt_stub_offsets;
109 bfd_vma * amt_destination_addr;
112 /* Various hash macros and functions. */
113 #define avr_link_hash_table(p) \
114 /* PR 3874: Check that we have an AVR style hash table before using it. */\
115 (elf_hash_table_id ((struct elf_link_hash_table *) ((p)->hash)) \
116 == AVR_ELF_DATA ? ((struct elf32_avr_link_hash_table *) ((p)->hash)) : NULL)
118 #define avr_stub_hash_entry(ent) \
119 ((struct elf32_avr_stub_hash_entry *)(ent))
121 #define avr_stub_hash_lookup(table, string, create, copy) \
122 ((struct elf32_avr_stub_hash_entry *) \
123 bfd_hash_lookup ((table), (string), (create), (copy)))
125 static reloc_howto_type elf_avr_howto_table[] =
127 HOWTO (R_AVR_NONE, /* type */
129 2, /* size (0 = byte, 1 = short, 2 = long) */
131 FALSE, /* pc_relative */
133 complain_overflow_bitfield, /* complain_on_overflow */
134 bfd_elf_generic_reloc, /* special_function */
135 "R_AVR_NONE", /* name */
136 FALSE, /* partial_inplace */
139 FALSE), /* pcrel_offset */
141 HOWTO (R_AVR_32, /* type */
143 2, /* size (0 = byte, 1 = short, 2 = long) */
145 FALSE, /* pc_relative */
147 complain_overflow_bitfield, /* complain_on_overflow */
148 bfd_elf_generic_reloc, /* special_function */
149 "R_AVR_32", /* name */
150 FALSE, /* partial_inplace */
151 0xffffffff, /* src_mask */
152 0xffffffff, /* dst_mask */
153 FALSE), /* pcrel_offset */
155 /* A 7 bit PC relative relocation. */
156 HOWTO (R_AVR_7_PCREL, /* type */
158 1, /* size (0 = byte, 1 = short, 2 = long) */
160 TRUE, /* pc_relative */
162 complain_overflow_bitfield, /* complain_on_overflow */
163 bfd_elf_generic_reloc, /* special_function */
164 "R_AVR_7_PCREL", /* name */
165 FALSE, /* partial_inplace */
166 0xffff, /* src_mask */
167 0xffff, /* dst_mask */
168 TRUE), /* pcrel_offset */
170 /* A 13 bit PC relative relocation. */
171 HOWTO (R_AVR_13_PCREL, /* type */
173 1, /* size (0 = byte, 1 = short, 2 = long) */
175 TRUE, /* pc_relative */
177 complain_overflow_bitfield, /* complain_on_overflow */
178 bfd_elf_generic_reloc, /* special_function */
179 "R_AVR_13_PCREL", /* name */
180 FALSE, /* partial_inplace */
181 0xfff, /* src_mask */
182 0xfff, /* dst_mask */
183 TRUE), /* pcrel_offset */
185 /* A 16 bit absolute relocation. */
186 HOWTO (R_AVR_16, /* type */
188 1, /* size (0 = byte, 1 = short, 2 = long) */
190 FALSE, /* pc_relative */
192 complain_overflow_dont, /* complain_on_overflow */
193 bfd_elf_generic_reloc, /* special_function */
194 "R_AVR_16", /* name */
195 FALSE, /* partial_inplace */
196 0xffff, /* src_mask */
197 0xffff, /* dst_mask */
198 FALSE), /* pcrel_offset */
200 /* A 16 bit absolute relocation for command address
201 Will be changed when linker stubs are needed. */
202 HOWTO (R_AVR_16_PM, /* type */
204 1, /* size (0 = byte, 1 = short, 2 = long) */
206 FALSE, /* pc_relative */
208 complain_overflow_bitfield, /* complain_on_overflow */
209 bfd_elf_generic_reloc, /* special_function */
210 "R_AVR_16_PM", /* name */
211 FALSE, /* partial_inplace */
212 0xffff, /* src_mask */
213 0xffff, /* dst_mask */
214 FALSE), /* pcrel_offset */
215 /* A low 8 bit absolute relocation of 16 bit address.
217 HOWTO (R_AVR_LO8_LDI, /* type */
219 1, /* size (0 = byte, 1 = short, 2 = long) */
221 FALSE, /* pc_relative */
223 complain_overflow_dont, /* complain_on_overflow */
224 bfd_elf_generic_reloc, /* special_function */
225 "R_AVR_LO8_LDI", /* name */
226 FALSE, /* partial_inplace */
227 0xffff, /* src_mask */
228 0xffff, /* dst_mask */
229 FALSE), /* pcrel_offset */
230 /* A high 8 bit absolute relocation of 16 bit address.
232 HOWTO (R_AVR_HI8_LDI, /* type */
234 1, /* size (0 = byte, 1 = short, 2 = long) */
236 FALSE, /* pc_relative */
238 complain_overflow_dont, /* complain_on_overflow */
239 bfd_elf_generic_reloc, /* special_function */
240 "R_AVR_HI8_LDI", /* name */
241 FALSE, /* partial_inplace */
242 0xffff, /* src_mask */
243 0xffff, /* dst_mask */
244 FALSE), /* pcrel_offset */
245 /* A high 6 bit absolute relocation of 22 bit address.
246 For LDI command. As well second most significant 8 bit value of
247 a 32 bit link-time constant. */
248 HOWTO (R_AVR_HH8_LDI, /* type */
250 1, /* size (0 = byte, 1 = short, 2 = long) */
252 FALSE, /* pc_relative */
254 complain_overflow_dont, /* complain_on_overflow */
255 bfd_elf_generic_reloc, /* special_function */
256 "R_AVR_HH8_LDI", /* name */
257 FALSE, /* partial_inplace */
258 0xffff, /* src_mask */
259 0xffff, /* dst_mask */
260 FALSE), /* pcrel_offset */
261 /* A negative low 8 bit absolute relocation of 16 bit address.
263 HOWTO (R_AVR_LO8_LDI_NEG, /* type */
265 1, /* size (0 = byte, 1 = short, 2 = long) */
267 FALSE, /* pc_relative */
269 complain_overflow_dont, /* complain_on_overflow */
270 bfd_elf_generic_reloc, /* special_function */
271 "R_AVR_LO8_LDI_NEG", /* name */
272 FALSE, /* partial_inplace */
273 0xffff, /* src_mask */
274 0xffff, /* dst_mask */
275 FALSE), /* pcrel_offset */
276 /* A negative high 8 bit absolute relocation of 16 bit address.
278 HOWTO (R_AVR_HI8_LDI_NEG, /* type */
280 1, /* size (0 = byte, 1 = short, 2 = long) */
282 FALSE, /* pc_relative */
284 complain_overflow_dont, /* complain_on_overflow */
285 bfd_elf_generic_reloc, /* special_function */
286 "R_AVR_HI8_LDI_NEG", /* name */
287 FALSE, /* partial_inplace */
288 0xffff, /* src_mask */
289 0xffff, /* dst_mask */
290 FALSE), /* pcrel_offset */
291 /* A negative high 6 bit absolute relocation of 22 bit address.
293 HOWTO (R_AVR_HH8_LDI_NEG, /* type */
295 1, /* size (0 = byte, 1 = short, 2 = long) */
297 FALSE, /* pc_relative */
299 complain_overflow_dont, /* complain_on_overflow */
300 bfd_elf_generic_reloc, /* special_function */
301 "R_AVR_HH8_LDI_NEG", /* name */
302 FALSE, /* partial_inplace */
303 0xffff, /* src_mask */
304 0xffff, /* dst_mask */
305 FALSE), /* pcrel_offset */
306 /* A low 8 bit absolute relocation of 24 bit program memory address.
307 For LDI command. Will not be changed when linker stubs are needed. */
308 HOWTO (R_AVR_LO8_LDI_PM, /* type */
310 1, /* size (0 = byte, 1 = short, 2 = long) */
312 FALSE, /* pc_relative */
314 complain_overflow_dont, /* complain_on_overflow */
315 bfd_elf_generic_reloc, /* special_function */
316 "R_AVR_LO8_LDI_PM", /* name */
317 FALSE, /* partial_inplace */
318 0xffff, /* src_mask */
319 0xffff, /* dst_mask */
320 FALSE), /* pcrel_offset */
321 /* A low 8 bit absolute relocation of 24 bit program memory address.
322 For LDI command. Will not be changed when linker stubs are needed. */
323 HOWTO (R_AVR_HI8_LDI_PM, /* type */
325 1, /* size (0 = byte, 1 = short, 2 = long) */
327 FALSE, /* pc_relative */
329 complain_overflow_dont, /* complain_on_overflow */
330 bfd_elf_generic_reloc, /* special_function */
331 "R_AVR_HI8_LDI_PM", /* name */
332 FALSE, /* partial_inplace */
333 0xffff, /* src_mask */
334 0xffff, /* dst_mask */
335 FALSE), /* pcrel_offset */
336 /* A low 8 bit absolute relocation of 24 bit program memory address.
337 For LDI command. Will not be changed when linker stubs are needed. */
338 HOWTO (R_AVR_HH8_LDI_PM, /* type */
340 1, /* size (0 = byte, 1 = short, 2 = long) */
342 FALSE, /* pc_relative */
344 complain_overflow_dont, /* complain_on_overflow */
345 bfd_elf_generic_reloc, /* special_function */
346 "R_AVR_HH8_LDI_PM", /* name */
347 FALSE, /* partial_inplace */
348 0xffff, /* src_mask */
349 0xffff, /* dst_mask */
350 FALSE), /* pcrel_offset */
351 /* A low 8 bit absolute relocation of 24 bit program memory address.
352 For LDI command. Will not be changed when linker stubs are needed. */
353 HOWTO (R_AVR_LO8_LDI_PM_NEG, /* type */
355 1, /* size (0 = byte, 1 = short, 2 = long) */
357 FALSE, /* pc_relative */
359 complain_overflow_dont, /* complain_on_overflow */
360 bfd_elf_generic_reloc, /* special_function */
361 "R_AVR_LO8_LDI_PM_NEG", /* name */
362 FALSE, /* partial_inplace */
363 0xffff, /* src_mask */
364 0xffff, /* dst_mask */
365 FALSE), /* pcrel_offset */
366 /* A low 8 bit absolute relocation of 24 bit program memory address.
367 For LDI command. Will not be changed when linker stubs are needed. */
368 HOWTO (R_AVR_HI8_LDI_PM_NEG, /* type */
370 1, /* size (0 = byte, 1 = short, 2 = long) */
372 FALSE, /* pc_relative */
374 complain_overflow_dont, /* complain_on_overflow */
375 bfd_elf_generic_reloc, /* special_function */
376 "R_AVR_HI8_LDI_PM_NEG", /* name */
377 FALSE, /* partial_inplace */
378 0xffff, /* src_mask */
379 0xffff, /* dst_mask */
380 FALSE), /* pcrel_offset */
381 /* A low 8 bit absolute relocation of 24 bit program memory address.
382 For LDI command. Will not be changed when linker stubs are needed. */
383 HOWTO (R_AVR_HH8_LDI_PM_NEG, /* type */
385 1, /* size (0 = byte, 1 = short, 2 = long) */
387 FALSE, /* pc_relative */
389 complain_overflow_dont, /* complain_on_overflow */
390 bfd_elf_generic_reloc, /* special_function */
391 "R_AVR_HH8_LDI_PM_NEG", /* name */
392 FALSE, /* partial_inplace */
393 0xffff, /* src_mask */
394 0xffff, /* dst_mask */
395 FALSE), /* pcrel_offset */
396 /* Relocation for CALL command in ATmega. */
397 HOWTO (R_AVR_CALL, /* type */
399 2, /* size (0 = byte, 1 = short, 2 = long) */
401 FALSE, /* pc_relative */
403 complain_overflow_dont,/* complain_on_overflow */
404 bfd_elf_generic_reloc, /* special_function */
405 "R_AVR_CALL", /* name */
406 FALSE, /* partial_inplace */
407 0xffffffff, /* src_mask */
408 0xffffffff, /* dst_mask */
409 FALSE), /* pcrel_offset */
410 /* A 16 bit absolute relocation of 16 bit address.
412 HOWTO (R_AVR_LDI, /* type */
414 1, /* size (0 = byte, 1 = short, 2 = long) */
416 FALSE, /* pc_relative */
418 complain_overflow_dont,/* complain_on_overflow */
419 bfd_elf_generic_reloc, /* special_function */
420 "R_AVR_LDI", /* name */
421 FALSE, /* partial_inplace */
422 0xffff, /* src_mask */
423 0xffff, /* dst_mask */
424 FALSE), /* pcrel_offset */
425 /* A 6 bit absolute relocation of 6 bit offset.
426 For ldd/sdd command. */
427 HOWTO (R_AVR_6, /* type */
429 0, /* size (0 = byte, 1 = short, 2 = long) */
431 FALSE, /* pc_relative */
433 complain_overflow_dont,/* complain_on_overflow */
434 bfd_elf_generic_reloc, /* special_function */
435 "R_AVR_6", /* name */
436 FALSE, /* partial_inplace */
437 0xffff, /* src_mask */
438 0xffff, /* dst_mask */
439 FALSE), /* pcrel_offset */
440 /* A 6 bit absolute relocation of 6 bit offset.
441 For sbiw/adiw command. */
442 HOWTO (R_AVR_6_ADIW, /* type */
444 0, /* size (0 = byte, 1 = short, 2 = long) */
446 FALSE, /* pc_relative */
448 complain_overflow_dont,/* complain_on_overflow */
449 bfd_elf_generic_reloc, /* special_function */
450 "R_AVR_6_ADIW", /* name */
451 FALSE, /* partial_inplace */
452 0xffff, /* src_mask */
453 0xffff, /* dst_mask */
454 FALSE), /* pcrel_offset */
455 /* Most significant 8 bit value of a 32 bit link-time constant. */
456 HOWTO (R_AVR_MS8_LDI, /* type */
458 1, /* size (0 = byte, 1 = short, 2 = long) */
460 FALSE, /* pc_relative */
462 complain_overflow_dont, /* complain_on_overflow */
463 bfd_elf_generic_reloc, /* special_function */
464 "R_AVR_MS8_LDI", /* name */
465 FALSE, /* partial_inplace */
466 0xffff, /* src_mask */
467 0xffff, /* dst_mask */
468 FALSE), /* pcrel_offset */
469 /* Negative most significant 8 bit value of a 32 bit link-time constant. */
470 HOWTO (R_AVR_MS8_LDI_NEG, /* type */
472 1, /* size (0 = byte, 1 = short, 2 = long) */
474 FALSE, /* pc_relative */
476 complain_overflow_dont, /* complain_on_overflow */
477 bfd_elf_generic_reloc, /* special_function */
478 "R_AVR_MS8_LDI_NEG", /* name */
479 FALSE, /* partial_inplace */
480 0xffff, /* src_mask */
481 0xffff, /* dst_mask */
482 FALSE), /* pcrel_offset */
483 /* A low 8 bit absolute relocation of 24 bit program memory address.
484 For LDI command. Will be changed when linker stubs are needed. */
485 HOWTO (R_AVR_LO8_LDI_GS, /* type */
487 1, /* size (0 = byte, 1 = short, 2 = long) */
489 FALSE, /* pc_relative */
491 complain_overflow_dont, /* complain_on_overflow */
492 bfd_elf_generic_reloc, /* special_function */
493 "R_AVR_LO8_LDI_GS", /* name */
494 FALSE, /* partial_inplace */
495 0xffff, /* src_mask */
496 0xffff, /* dst_mask */
497 FALSE), /* pcrel_offset */
498 /* A low 8 bit absolute relocation of 24 bit program memory address.
499 For LDI command. Will be changed when linker stubs are needed. */
500 HOWTO (R_AVR_HI8_LDI_GS, /* type */
502 1, /* size (0 = byte, 1 = short, 2 = long) */
504 FALSE, /* pc_relative */
506 complain_overflow_dont, /* complain_on_overflow */
507 bfd_elf_generic_reloc, /* special_function */
508 "R_AVR_HI8_LDI_GS", /* name */
509 FALSE, /* partial_inplace */
510 0xffff, /* src_mask */
511 0xffff, /* dst_mask */
512 FALSE), /* pcrel_offset */
514 HOWTO (R_AVR_8, /* type */
516 0, /* size (0 = byte, 1 = short, 2 = long) */
518 FALSE, /* pc_relative */
520 complain_overflow_bitfield,/* complain_on_overflow */
521 bfd_elf_generic_reloc, /* special_function */
522 "R_AVR_8", /* name */
523 FALSE, /* partial_inplace */
524 0x000000ff, /* src_mask */
525 0x000000ff, /* dst_mask */
526 FALSE), /* pcrel_offset */
527 /* lo8-part to use in .byte lo8(sym). */
528 HOWTO (R_AVR_8_LO8, /* type */
530 0, /* size (0 = byte, 1 = short, 2 = long) */
532 FALSE, /* pc_relative */
534 complain_overflow_dont,/* complain_on_overflow */
535 bfd_elf_generic_reloc, /* special_function */
536 "R_AVR_8_LO8", /* name */
537 FALSE, /* partial_inplace */
538 0xffffff, /* src_mask */
539 0xffffff, /* dst_mask */
540 FALSE), /* pcrel_offset */
541 /* hi8-part to use in .byte hi8(sym). */
542 HOWTO (R_AVR_8_HI8, /* type */
544 0, /* size (0 = byte, 1 = short, 2 = long) */
546 FALSE, /* pc_relative */
548 complain_overflow_dont,/* complain_on_overflow */
549 bfd_elf_generic_reloc, /* special_function */
550 "R_AVR_8_HI8", /* name */
551 FALSE, /* partial_inplace */
552 0xffffff, /* src_mask */
553 0xffffff, /* dst_mask */
554 FALSE), /* pcrel_offset */
555 /* hlo8-part to use in .byte hlo8(sym). */
556 HOWTO (R_AVR_8_HLO8, /* type */
558 0, /* size (0 = byte, 1 = short, 2 = long) */
560 FALSE, /* pc_relative */
562 complain_overflow_dont,/* complain_on_overflow */
563 bfd_elf_generic_reloc, /* special_function */
564 "R_AVR_8_HLO8", /* name */
565 FALSE, /* partial_inplace */
566 0xffffff, /* src_mask */
567 0xffffff, /* dst_mask */
568 FALSE), /* pcrel_offset */
569 HOWTO (R_AVR_DIFF8, /* type */
571 0, /* size (0 = byte, 1 = short, 2 = long) */
573 FALSE, /* pc_relative */
575 complain_overflow_bitfield, /* complain_on_overflow */
576 bfd_elf_avr_diff_reloc, /* special_function */
577 "R_AVR_DIFF8", /* name */
578 FALSE, /* partial_inplace */
581 FALSE), /* pcrel_offset */
582 HOWTO (R_AVR_DIFF16, /* type */
584 1, /* size (0 = byte, 1 = short, 2 = long) */
586 FALSE, /* pc_relative */
588 complain_overflow_bitfield, /* complain_on_overflow */
589 bfd_elf_avr_diff_reloc, /* special_function */
590 "R_AVR_DIFF16", /* name */
591 FALSE, /* partial_inplace */
593 0xffff, /* dst_mask */
594 FALSE), /* pcrel_offset */
595 HOWTO (R_AVR_DIFF32, /* type */
597 2, /* size (0 = byte, 1 = short, 2 = long) */
599 FALSE, /* pc_relative */
601 complain_overflow_bitfield, /* complain_on_overflow */
602 bfd_elf_avr_diff_reloc, /* special_function */
603 "R_AVR_DIFF32", /* name */
604 FALSE, /* partial_inplace */
606 0xffffffff, /* dst_mask */
607 FALSE) /* pcrel_offset */
610 /* Map BFD reloc types to AVR ELF reloc types. */
614 bfd_reloc_code_real_type bfd_reloc_val;
615 unsigned int elf_reloc_val;
618 static const struct avr_reloc_map avr_reloc_map[] =
620 { BFD_RELOC_NONE, R_AVR_NONE },
621 { BFD_RELOC_32, R_AVR_32 },
622 { BFD_RELOC_AVR_7_PCREL, R_AVR_7_PCREL },
623 { BFD_RELOC_AVR_13_PCREL, R_AVR_13_PCREL },
624 { BFD_RELOC_16, R_AVR_16 },
625 { BFD_RELOC_AVR_16_PM, R_AVR_16_PM },
626 { BFD_RELOC_AVR_LO8_LDI, R_AVR_LO8_LDI},
627 { BFD_RELOC_AVR_HI8_LDI, R_AVR_HI8_LDI },
628 { BFD_RELOC_AVR_HH8_LDI, R_AVR_HH8_LDI },
629 { BFD_RELOC_AVR_MS8_LDI, R_AVR_MS8_LDI },
630 { BFD_RELOC_AVR_LO8_LDI_NEG, R_AVR_LO8_LDI_NEG },
631 { BFD_RELOC_AVR_HI8_LDI_NEG, R_AVR_HI8_LDI_NEG },
632 { BFD_RELOC_AVR_HH8_LDI_NEG, R_AVR_HH8_LDI_NEG },
633 { BFD_RELOC_AVR_MS8_LDI_NEG, R_AVR_MS8_LDI_NEG },
634 { BFD_RELOC_AVR_LO8_LDI_PM, R_AVR_LO8_LDI_PM },
635 { BFD_RELOC_AVR_LO8_LDI_GS, R_AVR_LO8_LDI_GS },
636 { BFD_RELOC_AVR_HI8_LDI_PM, R_AVR_HI8_LDI_PM },
637 { BFD_RELOC_AVR_HI8_LDI_GS, R_AVR_HI8_LDI_GS },
638 { BFD_RELOC_AVR_HH8_LDI_PM, R_AVR_HH8_LDI_PM },
639 { BFD_RELOC_AVR_LO8_LDI_PM_NEG, R_AVR_LO8_LDI_PM_NEG },
640 { BFD_RELOC_AVR_HI8_LDI_PM_NEG, R_AVR_HI8_LDI_PM_NEG },
641 { BFD_RELOC_AVR_HH8_LDI_PM_NEG, R_AVR_HH8_LDI_PM_NEG },
642 { BFD_RELOC_AVR_CALL, R_AVR_CALL },
643 { BFD_RELOC_AVR_LDI, R_AVR_LDI },
644 { BFD_RELOC_AVR_6, R_AVR_6 },
645 { BFD_RELOC_AVR_6_ADIW, R_AVR_6_ADIW },
646 { BFD_RELOC_8, R_AVR_8 },
647 { BFD_RELOC_AVR_8_LO, R_AVR_8_LO8 },
648 { BFD_RELOC_AVR_8_HI, R_AVR_8_HI8 },
649 { BFD_RELOC_AVR_8_HLO, R_AVR_8_HLO8 },
650 { BFD_RELOC_AVR_DIFF8, R_AVR_DIFF8 },
651 { BFD_RELOC_AVR_DIFF16, R_AVR_DIFF16 },
652 { BFD_RELOC_AVR_DIFF32, R_AVR_DIFF32 }
655 /* Meant to be filled one day with the wrap around address for the
656 specific device. I.e. should get the value 0x4000 for 16k devices,
657 0x8000 for 32k devices and so on.
659 We initialize it here with a value of 0x1000000 resulting in
660 that we will never suggest a wrap-around jump during relaxation.
661 The logic of the source code later on assumes that in
662 avr_pc_wrap_around one single bit is set. */
663 static bfd_vma avr_pc_wrap_around = 0x10000000;
665 /* If this variable holds a value different from zero, the linker relaxation
666 machine will try to optimize call/ret sequences by a single jump
667 instruction. This option could be switched off by a linker switch. */
668 static int avr_replace_call_ret_sequences = 1;
670 /* Initialize an entry in the stub hash table. */
672 static struct bfd_hash_entry *
673 stub_hash_newfunc (struct bfd_hash_entry *entry,
674 struct bfd_hash_table *table,
677 /* Allocate the structure if it has not already been allocated by a
681 entry = bfd_hash_allocate (table,
682 sizeof (struct elf32_avr_stub_hash_entry));
687 /* Call the allocation method of the superclass. */
688 entry = bfd_hash_newfunc (entry, table, string);
691 struct elf32_avr_stub_hash_entry *hsh;
693 /* Initialize the local fields. */
694 hsh = avr_stub_hash_entry (entry);
695 hsh->stub_offset = 0;
696 hsh->target_value = 0;
702 /* This function is just a straight passthrough to the real
703 function in linker.c. Its prupose is so that its address
704 can be compared inside the avr_link_hash_table macro. */
706 static struct bfd_hash_entry *
707 elf32_avr_link_hash_newfunc (struct bfd_hash_entry * entry,
708 struct bfd_hash_table * table,
711 return _bfd_elf_link_hash_newfunc (entry, table, string);
714 /* Free the derived linker hash table. */
717 elf32_avr_link_hash_table_free (struct bfd_link_hash_table *btab)
719 struct elf32_avr_link_hash_table *htab
720 = (struct elf32_avr_link_hash_table *) btab;
722 /* Free the address mapping table. */
723 if (htab->amt_stub_offsets != NULL)
724 free (htab->amt_stub_offsets);
725 if (htab->amt_destination_addr != NULL)
726 free (htab->amt_destination_addr);
728 bfd_hash_table_free (&htab->bstab);
729 _bfd_elf_link_hash_table_free (btab);
732 /* Create the derived linker hash table. The AVR ELF port uses the derived
733 hash table to keep information specific to the AVR ELF linker (without
734 using static variables). */
736 static struct bfd_link_hash_table *
737 elf32_avr_link_hash_table_create (bfd *abfd)
739 struct elf32_avr_link_hash_table *htab;
740 bfd_size_type amt = sizeof (*htab);
742 htab = bfd_zmalloc (amt);
746 if (!_bfd_elf_link_hash_table_init (&htab->etab, abfd,
747 elf32_avr_link_hash_newfunc,
748 sizeof (struct elf_link_hash_entry),
755 /* Init the stub hash table too. */
756 if (!bfd_hash_table_init (&htab->bstab, stub_hash_newfunc,
757 sizeof (struct elf32_avr_stub_hash_entry)))
759 (void) elf32_avr_link_hash_table_free;
761 return &htab->etab.root;
764 /* Calculates the effective distance of a pc relative jump/call. */
767 avr_relative_distance_considering_wrap_around (unsigned int distance)
769 unsigned int wrap_around_mask = avr_pc_wrap_around - 1;
770 int dist_with_wrap_around = distance & wrap_around_mask;
772 if (dist_with_wrap_around > ((int) (avr_pc_wrap_around >> 1)))
773 dist_with_wrap_around -= avr_pc_wrap_around;
775 return dist_with_wrap_around;
779 static reloc_howto_type *
780 bfd_elf32_bfd_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
781 bfd_reloc_code_real_type code)
786 i < sizeof (avr_reloc_map) / sizeof (struct avr_reloc_map);
788 if (avr_reloc_map[i].bfd_reloc_val == code)
789 return &elf_avr_howto_table[avr_reloc_map[i].elf_reloc_val];
794 static reloc_howto_type *
795 bfd_elf32_bfd_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
801 i < sizeof (elf_avr_howto_table) / sizeof (elf_avr_howto_table[0]);
803 if (elf_avr_howto_table[i].name != NULL
804 && strcasecmp (elf_avr_howto_table[i].name, r_name) == 0)
805 return &elf_avr_howto_table[i];
810 /* Set the howto pointer for an AVR ELF reloc. */
813 avr_info_to_howto_rela (bfd *abfd ATTRIBUTE_UNUSED,
815 Elf_Internal_Rela *dst)
819 r_type = ELF32_R_TYPE (dst->r_info);
820 BFD_ASSERT (r_type < (unsigned int) R_AVR_max);
821 cache_ptr->howto = &elf_avr_howto_table[r_type];
825 avr_stub_is_required_for_16_bit_reloc (bfd_vma relocation)
827 return (relocation >= 0x020000);
830 /* Returns the address of the corresponding stub if there is one.
831 Returns otherwise an address above 0x020000. This function
832 could also be used, if there is no knowledge on the section where
833 the destination is found. */
836 avr_get_stub_addr (bfd_vma srel,
837 struct elf32_avr_link_hash_table *htab)
840 bfd_vma stub_sec_addr =
841 (htab->stub_sec->output_section->vma +
842 htab->stub_sec->output_offset);
844 for (sindex = 0; sindex < htab->amt_max_entry_cnt; sindex ++)
845 if (htab->amt_destination_addr[sindex] == srel)
846 return htab->amt_stub_offsets[sindex] + stub_sec_addr;
848 /* Return an address that could not be reached by 16 bit relocs. */
852 /* Perform a diff relocation. Nothing to do, as the difference value is already
853 written into the section's contents. */
855 static bfd_reloc_status_type
856 bfd_elf_avr_diff_reloc (bfd *abfd ATTRIBUTE_UNUSED,
857 arelent *reloc_entry ATTRIBUTE_UNUSED,
858 asymbol *symbol ATTRIBUTE_UNUSED,
859 void *data ATTRIBUTE_UNUSED,
860 asection *input_section ATTRIBUTE_UNUSED,
861 bfd *output_bfd ATTRIBUTE_UNUSED,
862 char **error_message ATTRIBUTE_UNUSED)
868 /* Perform a single relocation. By default we use the standard BFD
869 routines, but a few relocs, we have to do them ourselves. */
871 static bfd_reloc_status_type
872 avr_final_link_relocate (reloc_howto_type * howto,
874 asection * input_section,
876 Elf_Internal_Rela * rel,
878 struct elf32_avr_link_hash_table * htab)
880 bfd_reloc_status_type r = bfd_reloc_ok;
883 bfd_signed_vma reloc_addr;
884 bfd_boolean use_stubs = FALSE;
885 /* Usually is 0, unless we are generating code for a bootloader. */
886 bfd_signed_vma base_addr = htab->vector_base;
888 /* Absolute addr of the reloc in the final excecutable. */
889 reloc_addr = rel->r_offset + input_section->output_section->vma
890 + input_section->output_offset;
895 contents += rel->r_offset;
896 srel = (bfd_signed_vma) relocation;
897 srel += rel->r_addend;
898 srel -= rel->r_offset;
899 srel -= 2; /* Branch instructions add 2 to the PC... */
900 srel -= (input_section->output_section->vma +
901 input_section->output_offset);
904 return bfd_reloc_outofrange;
905 if (srel > ((1 << 7) - 1) || (srel < - (1 << 7)))
906 return bfd_reloc_overflow;
907 x = bfd_get_16 (input_bfd, contents);
908 x = (x & 0xfc07) | (((srel >> 1) << 3) & 0x3f8);
909 bfd_put_16 (input_bfd, x, contents);
913 contents += rel->r_offset;
914 srel = (bfd_signed_vma) relocation;
915 srel += rel->r_addend;
916 srel -= rel->r_offset;
917 srel -= 2; /* Branch instructions add 2 to the PC... */
918 srel -= (input_section->output_section->vma +
919 input_section->output_offset);
922 return bfd_reloc_outofrange;
924 srel = avr_relative_distance_considering_wrap_around (srel);
926 /* AVR addresses commands as words. */
929 /* Check for overflow. */
930 if (srel < -2048 || srel > 2047)
932 /* Relative distance is too large. */
934 /* Always apply WRAPAROUND for avr2, avr25, and avr4. */
935 switch (bfd_get_mach (input_bfd))
943 return bfd_reloc_overflow;
947 x = bfd_get_16 (input_bfd, contents);
948 x = (x & 0xf000) | (srel & 0xfff);
949 bfd_put_16 (input_bfd, x, contents);
953 contents += rel->r_offset;
954 srel = (bfd_signed_vma) relocation + rel->r_addend;
955 x = bfd_get_16 (input_bfd, contents);
956 x = (x & 0xf0f0) | (srel & 0xf) | ((srel << 4) & 0xf00);
957 bfd_put_16 (input_bfd, x, contents);
961 contents += rel->r_offset;
962 srel = (bfd_signed_vma) relocation + rel->r_addend;
963 if (((srel > 0) && (srel & 0xffff) > 255)
964 || ((srel < 0) && ((-srel) & 0xffff) > 128))
965 /* Remove offset for data/eeprom section. */
966 return bfd_reloc_overflow;
968 x = bfd_get_16 (input_bfd, contents);
969 x = (x & 0xf0f0) | (srel & 0xf) | ((srel << 4) & 0xf00);
970 bfd_put_16 (input_bfd, x, contents);
974 contents += rel->r_offset;
975 srel = (bfd_signed_vma) relocation + rel->r_addend;
976 if (((srel & 0xffff) > 63) || (srel < 0))
977 /* Remove offset for data/eeprom section. */
978 return bfd_reloc_overflow;
979 x = bfd_get_16 (input_bfd, contents);
980 x = (x & 0xd3f8) | ((srel & 7) | ((srel & (3 << 3)) << 7)
981 | ((srel & (1 << 5)) << 8));
982 bfd_put_16 (input_bfd, x, contents);
986 contents += rel->r_offset;
987 srel = (bfd_signed_vma) relocation + rel->r_addend;
988 if (((srel & 0xffff) > 63) || (srel < 0))
989 /* Remove offset for data/eeprom section. */
990 return bfd_reloc_overflow;
991 x = bfd_get_16 (input_bfd, contents);
992 x = (x & 0xff30) | (srel & 0xf) | ((srel & 0x30) << 2);
993 bfd_put_16 (input_bfd, x, contents);
997 contents += rel->r_offset;
998 srel = (bfd_signed_vma) relocation + rel->r_addend;
999 srel = (srel >> 8) & 0xff;
1000 x = bfd_get_16 (input_bfd, contents);
1001 x = (x & 0xf0f0) | (srel & 0xf) | ((srel << 4) & 0xf00);
1002 bfd_put_16 (input_bfd, x, contents);
1006 contents += rel->r_offset;
1007 srel = (bfd_signed_vma) relocation + rel->r_addend;
1008 srel = (srel >> 16) & 0xff;
1009 x = bfd_get_16 (input_bfd, contents);
1010 x = (x & 0xf0f0) | (srel & 0xf) | ((srel << 4) & 0xf00);
1011 bfd_put_16 (input_bfd, x, contents);
1015 contents += rel->r_offset;
1016 srel = (bfd_signed_vma) relocation + rel->r_addend;
1017 srel = (srel >> 24) & 0xff;
1018 x = bfd_get_16 (input_bfd, contents);
1019 x = (x & 0xf0f0) | (srel & 0xf) | ((srel << 4) & 0xf00);
1020 bfd_put_16 (input_bfd, x, contents);
1023 case R_AVR_LO8_LDI_NEG:
1024 contents += rel->r_offset;
1025 srel = (bfd_signed_vma) relocation + rel->r_addend;
1027 x = bfd_get_16 (input_bfd, contents);
1028 x = (x & 0xf0f0) | (srel & 0xf) | ((srel << 4) & 0xf00);
1029 bfd_put_16 (input_bfd, x, contents);
1032 case R_AVR_HI8_LDI_NEG:
1033 contents += rel->r_offset;
1034 srel = (bfd_signed_vma) relocation + rel->r_addend;
1036 srel = (srel >> 8) & 0xff;
1037 x = bfd_get_16 (input_bfd, contents);
1038 x = (x & 0xf0f0) | (srel & 0xf) | ((srel << 4) & 0xf00);
1039 bfd_put_16 (input_bfd, x, contents);
1042 case R_AVR_HH8_LDI_NEG:
1043 contents += rel->r_offset;
1044 srel = (bfd_signed_vma) relocation + rel->r_addend;
1046 srel = (srel >> 16) & 0xff;
1047 x = bfd_get_16 (input_bfd, contents);
1048 x = (x & 0xf0f0) | (srel & 0xf) | ((srel << 4) & 0xf00);
1049 bfd_put_16 (input_bfd, x, contents);
1052 case R_AVR_MS8_LDI_NEG:
1053 contents += rel->r_offset;
1054 srel = (bfd_signed_vma) relocation + rel->r_addend;
1056 srel = (srel >> 24) & 0xff;
1057 x = bfd_get_16 (input_bfd, contents);
1058 x = (x & 0xf0f0) | (srel & 0xf) | ((srel << 4) & 0xf00);
1059 bfd_put_16 (input_bfd, x, contents);
1062 case R_AVR_LO8_LDI_GS:
1063 use_stubs = (!htab->no_stubs);
1065 case R_AVR_LO8_LDI_PM:
1066 contents += rel->r_offset;
1067 srel = (bfd_signed_vma) relocation + rel->r_addend;
1070 && avr_stub_is_required_for_16_bit_reloc (srel - base_addr))
1072 bfd_vma old_srel = srel;
1074 /* We need to use the address of the stub instead. */
1075 srel = avr_get_stub_addr (srel, htab);
1077 printf ("LD: Using jump stub (at 0x%x) with destination 0x%x for "
1078 "reloc at address 0x%x.\n",
1079 (unsigned int) srel,
1080 (unsigned int) old_srel,
1081 (unsigned int) reloc_addr);
1083 if (avr_stub_is_required_for_16_bit_reloc (srel - base_addr))
1084 return bfd_reloc_outofrange;
1088 return bfd_reloc_outofrange;
1090 x = bfd_get_16 (input_bfd, contents);
1091 x = (x & 0xf0f0) | (srel & 0xf) | ((srel << 4) & 0xf00);
1092 bfd_put_16 (input_bfd, x, contents);
1095 case R_AVR_HI8_LDI_GS:
1096 use_stubs = (!htab->no_stubs);
1098 case R_AVR_HI8_LDI_PM:
1099 contents += rel->r_offset;
1100 srel = (bfd_signed_vma) relocation + rel->r_addend;
1103 && avr_stub_is_required_for_16_bit_reloc (srel - base_addr))
1105 bfd_vma old_srel = srel;
1107 /* We need to use the address of the stub instead. */
1108 srel = avr_get_stub_addr (srel, htab);
1110 printf ("LD: Using jump stub (at 0x%x) with destination 0x%x for "
1111 "reloc at address 0x%x.\n",
1112 (unsigned int) srel,
1113 (unsigned int) old_srel,
1114 (unsigned int) reloc_addr);
1116 if (avr_stub_is_required_for_16_bit_reloc (srel - base_addr))
1117 return bfd_reloc_outofrange;
1121 return bfd_reloc_outofrange;
1123 srel = (srel >> 8) & 0xff;
1124 x = bfd_get_16 (input_bfd, contents);
1125 x = (x & 0xf0f0) | (srel & 0xf) | ((srel << 4) & 0xf00);
1126 bfd_put_16 (input_bfd, x, contents);
1129 case R_AVR_HH8_LDI_PM:
1130 contents += rel->r_offset;
1131 srel = (bfd_signed_vma) relocation + rel->r_addend;
1133 return bfd_reloc_outofrange;
1135 srel = (srel >> 16) & 0xff;
1136 x = bfd_get_16 (input_bfd, contents);
1137 x = (x & 0xf0f0) | (srel & 0xf) | ((srel << 4) & 0xf00);
1138 bfd_put_16 (input_bfd, x, contents);
1141 case R_AVR_LO8_LDI_PM_NEG:
1142 contents += rel->r_offset;
1143 srel = (bfd_signed_vma) relocation + rel->r_addend;
1146 return bfd_reloc_outofrange;
1148 x = bfd_get_16 (input_bfd, contents);
1149 x = (x & 0xf0f0) | (srel & 0xf) | ((srel << 4) & 0xf00);
1150 bfd_put_16 (input_bfd, x, contents);
1153 case R_AVR_HI8_LDI_PM_NEG:
1154 contents += rel->r_offset;
1155 srel = (bfd_signed_vma) relocation + rel->r_addend;
1158 return bfd_reloc_outofrange;
1160 srel = (srel >> 8) & 0xff;
1161 x = bfd_get_16 (input_bfd, contents);
1162 x = (x & 0xf0f0) | (srel & 0xf) | ((srel << 4) & 0xf00);
1163 bfd_put_16 (input_bfd, x, contents);
1166 case R_AVR_HH8_LDI_PM_NEG:
1167 contents += rel->r_offset;
1168 srel = (bfd_signed_vma) relocation + rel->r_addend;
1171 return bfd_reloc_outofrange;
1173 srel = (srel >> 16) & 0xff;
1174 x = bfd_get_16 (input_bfd, contents);
1175 x = (x & 0xf0f0) | (srel & 0xf) | ((srel << 4) & 0xf00);
1176 bfd_put_16 (input_bfd, x, contents);
1180 contents += rel->r_offset;
1181 srel = (bfd_signed_vma) relocation + rel->r_addend;
1183 return bfd_reloc_outofrange;
1185 x = bfd_get_16 (input_bfd, contents);
1186 x |= ((srel & 0x10000) | ((srel << 3) & 0x1f00000)) >> 16;
1187 bfd_put_16 (input_bfd, x, contents);
1188 bfd_put_16 (input_bfd, (bfd_vma) srel & 0xffff, contents+2);
1192 use_stubs = (!htab->no_stubs);
1193 contents += rel->r_offset;
1194 srel = (bfd_signed_vma) relocation + rel->r_addend;
1197 && avr_stub_is_required_for_16_bit_reloc (srel - base_addr))
1199 bfd_vma old_srel = srel;
1201 /* We need to use the address of the stub instead. */
1202 srel = avr_get_stub_addr (srel,htab);
1204 printf ("LD: Using jump stub (at 0x%x) with destination 0x%x for "
1205 "reloc at address 0x%x.\n",
1206 (unsigned int) srel,
1207 (unsigned int) old_srel,
1208 (unsigned int) reloc_addr);
1210 if (avr_stub_is_required_for_16_bit_reloc (srel - base_addr))
1211 return bfd_reloc_outofrange;
1215 return bfd_reloc_outofrange;
1217 bfd_put_16 (input_bfd, (bfd_vma) srel &0x00ffff, contents);
1223 /* Nothing to do here, as contents already contains the diff value. */
1228 r = _bfd_final_link_relocate (howto, input_bfd, input_section,
1229 contents, rel->r_offset,
1230 relocation, rel->r_addend);
1236 /* Relocate an AVR ELF section. */
1239 elf32_avr_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED,
1240 struct bfd_link_info *info,
1242 asection *input_section,
1244 Elf_Internal_Rela *relocs,
1245 Elf_Internal_Sym *local_syms,
1246 asection **local_sections)
1248 Elf_Internal_Shdr * symtab_hdr;
1249 struct elf_link_hash_entry ** sym_hashes;
1250 Elf_Internal_Rela * rel;
1251 Elf_Internal_Rela * relend;
1252 struct elf32_avr_link_hash_table * htab = avr_link_hash_table (info);
1257 symtab_hdr = & elf_tdata (input_bfd)->symtab_hdr;
1258 sym_hashes = elf_sym_hashes (input_bfd);
1259 relend = relocs + input_section->reloc_count;
1261 for (rel = relocs; rel < relend; rel ++)
1263 reloc_howto_type * howto;
1264 unsigned long r_symndx;
1265 Elf_Internal_Sym * sym;
1267 struct elf_link_hash_entry * h;
1269 bfd_reloc_status_type r;
1273 r_type = ELF32_R_TYPE (rel->r_info);
1274 r_symndx = ELF32_R_SYM (rel->r_info);
1275 howto = elf_avr_howto_table + r_type;
1280 if (r_symndx < symtab_hdr->sh_info)
1282 sym = local_syms + r_symndx;
1283 sec = local_sections [r_symndx];
1284 relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
1286 name = bfd_elf_string_from_elf_section
1287 (input_bfd, symtab_hdr->sh_link, sym->st_name);
1288 name = (name == NULL) ? bfd_section_name (input_bfd, sec) : name;
1292 bfd_boolean unresolved_reloc, warned, ignored;
1294 RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
1295 r_symndx, symtab_hdr, sym_hashes,
1297 unresolved_reloc, warned, ignored);
1299 name = h->root.root.string;
1302 if (sec != NULL && discarded_section (sec))
1303 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
1304 rel, 1, relend, howto, 0, contents);
1306 if (info->relocatable)
1309 r = avr_final_link_relocate (howto, input_bfd, input_section,
1310 contents, rel, relocation, htab);
1312 if (r != bfd_reloc_ok)
1314 const char * msg = (const char *) NULL;
1318 case bfd_reloc_overflow:
1319 r = info->callbacks->reloc_overflow
1320 (info, (h ? &h->root : NULL),
1321 name, howto->name, (bfd_vma) 0,
1322 input_bfd, input_section, rel->r_offset);
1325 case bfd_reloc_undefined:
1326 r = info->callbacks->undefined_symbol
1327 (info, name, input_bfd, input_section, rel->r_offset, TRUE);
1330 case bfd_reloc_outofrange:
1331 msg = _("internal error: out of range error");
1334 case bfd_reloc_notsupported:
1335 msg = _("internal error: unsupported relocation error");
1338 case bfd_reloc_dangerous:
1339 msg = _("internal error: dangerous relocation");
1343 msg = _("internal error: unknown error");
1348 r = info->callbacks->warning
1349 (info, msg, name, input_bfd, input_section, rel->r_offset);
1359 /* The final processing done just before writing out a AVR ELF object
1360 file. This gets the AVR architecture right based on the machine
1364 bfd_elf_avr_final_write_processing (bfd *abfd,
1365 bfd_boolean linker ATTRIBUTE_UNUSED)
1369 switch (bfd_get_mach (abfd))
1373 val = E_AVR_MACH_AVR2;
1377 val = E_AVR_MACH_AVR1;
1380 case bfd_mach_avr25:
1381 val = E_AVR_MACH_AVR25;
1385 val = E_AVR_MACH_AVR3;
1388 case bfd_mach_avr31:
1389 val = E_AVR_MACH_AVR31;
1392 case bfd_mach_avr35:
1393 val = E_AVR_MACH_AVR35;
1397 val = E_AVR_MACH_AVR4;
1401 val = E_AVR_MACH_AVR5;
1404 case bfd_mach_avr51:
1405 val = E_AVR_MACH_AVR51;
1409 val = E_AVR_MACH_AVR6;
1412 case bfd_mach_avrxmega1:
1413 val = E_AVR_MACH_XMEGA1;
1416 case bfd_mach_avrxmega2:
1417 val = E_AVR_MACH_XMEGA2;
1420 case bfd_mach_avrxmega3:
1421 val = E_AVR_MACH_XMEGA3;
1424 case bfd_mach_avrxmega4:
1425 val = E_AVR_MACH_XMEGA4;
1428 case bfd_mach_avrxmega5:
1429 val = E_AVR_MACH_XMEGA5;
1432 case bfd_mach_avrxmega6:
1433 val = E_AVR_MACH_XMEGA6;
1436 case bfd_mach_avrxmega7:
1437 val = E_AVR_MACH_XMEGA7;
1441 elf_elfheader (abfd)->e_machine = EM_AVR;
1442 elf_elfheader (abfd)->e_flags &= ~ EF_AVR_MACH;
1443 elf_elfheader (abfd)->e_flags |= val;
1444 elf_elfheader (abfd)->e_flags |= EF_AVR_LINKRELAX_PREPARED;
1447 /* Set the right machine number. */
1450 elf32_avr_object_p (bfd *abfd)
1452 unsigned int e_set = bfd_mach_avr2;
1454 if (elf_elfheader (abfd)->e_machine == EM_AVR
1455 || elf_elfheader (abfd)->e_machine == EM_AVR_OLD)
1457 int e_mach = elf_elfheader (abfd)->e_flags & EF_AVR_MACH;
1462 case E_AVR_MACH_AVR2:
1463 e_set = bfd_mach_avr2;
1466 case E_AVR_MACH_AVR1:
1467 e_set = bfd_mach_avr1;
1470 case E_AVR_MACH_AVR25:
1471 e_set = bfd_mach_avr25;
1474 case E_AVR_MACH_AVR3:
1475 e_set = bfd_mach_avr3;
1478 case E_AVR_MACH_AVR31:
1479 e_set = bfd_mach_avr31;
1482 case E_AVR_MACH_AVR35:
1483 e_set = bfd_mach_avr35;
1486 case E_AVR_MACH_AVR4:
1487 e_set = bfd_mach_avr4;
1490 case E_AVR_MACH_AVR5:
1491 e_set = bfd_mach_avr5;
1494 case E_AVR_MACH_AVR51:
1495 e_set = bfd_mach_avr51;
1498 case E_AVR_MACH_AVR6:
1499 e_set = bfd_mach_avr6;
1502 case E_AVR_MACH_XMEGA1:
1503 e_set = bfd_mach_avrxmega1;
1506 case E_AVR_MACH_XMEGA2:
1507 e_set = bfd_mach_avrxmega2;
1510 case E_AVR_MACH_XMEGA3:
1511 e_set = bfd_mach_avrxmega3;
1514 case E_AVR_MACH_XMEGA4:
1515 e_set = bfd_mach_avrxmega4;
1518 case E_AVR_MACH_XMEGA5:
1519 e_set = bfd_mach_avrxmega5;
1522 case E_AVR_MACH_XMEGA6:
1523 e_set = bfd_mach_avrxmega6;
1526 case E_AVR_MACH_XMEGA7:
1527 e_set = bfd_mach_avrxmega7;
1531 return bfd_default_set_arch_mach (abfd, bfd_arch_avr,
1535 /* Returns whether the relocation type passed is a diff reloc. */
1538 elf32_avr_is_diff_reloc (Elf_Internal_Rela *irel)
1540 return (ELF32_R_TYPE (irel->r_info) == R_AVR_DIFF8
1541 ||ELF32_R_TYPE (irel->r_info) == R_AVR_DIFF16
1542 || ELF32_R_TYPE (irel->r_info) == R_AVR_DIFF32);
1545 /* Reduce the diff value written in the section by count if the shrinked
1546 insn address happens to fall between the two symbols for which this
1547 diff reloc was emitted. */
1550 elf32_avr_adjust_diff_reloc_value (bfd *abfd,
1551 struct bfd_section *isec,
1552 Elf_Internal_Rela *irel,
1554 bfd_vma shrinked_insn_address,
1557 unsigned char *reloc_contents = NULL;
1558 unsigned char *isec_contents = elf_section_data (isec)->this_hdr.contents;
1559 if (isec_contents == NULL)
1561 if (! bfd_malloc_and_get_section (abfd, isec, &isec_contents))
1564 elf_section_data (isec)->this_hdr.contents = isec_contents;
1567 reloc_contents = isec_contents + irel->r_offset;
1569 /* Read value written in object file. */
1571 switch (ELF32_R_TYPE (irel->r_info))
1575 x = *reloc_contents;
1580 x = bfd_get_16 (abfd, reloc_contents);
1585 x = bfd_get_32 (abfd, reloc_contents);
1594 /* For a diff reloc sym1 - sym2 the diff at assembly time (x) is written
1595 into the object file at the reloc offset. sym2's logical value is
1596 symval (<start_of_section>) + reloc addend. Compute the start and end
1597 addresses and check if the shrinked insn falls between sym1 and sym2. */
1599 bfd_vma end_address = symval + irel->r_addend;
1600 bfd_vma start_address = end_address - x;
1602 /* Reduce the diff value by count bytes and write it back into section
1605 if (shrinked_insn_address >= start_address &&
1606 shrinked_insn_address <= end_address)
1608 switch (ELF32_R_TYPE (irel->r_info))
1612 *reloc_contents = (x - count);
1617 bfd_put_16 (abfd, (x - count) & 0xFFFF, reloc_contents);
1622 bfd_put_32 (abfd, (x - count) & 0xFFFFFFFF, reloc_contents);
1634 /* Delete some bytes from a section while changing the size of an instruction.
1635 The parameter "addr" denotes the section-relative offset pointing just
1636 behind the shrinked instruction. "addr+count" point at the first
1637 byte just behind the original unshrinked instruction. */
1640 elf32_avr_relax_delete_bytes (bfd *abfd,
1645 Elf_Internal_Shdr *symtab_hdr;
1646 unsigned int sec_shndx;
1648 Elf_Internal_Rela *irel, *irelend;
1649 Elf_Internal_Sym *isym;
1650 Elf_Internal_Sym *isymbuf = NULL;
1652 struct elf_link_hash_entry **sym_hashes;
1653 struct elf_link_hash_entry **end_hashes;
1654 unsigned int symcount;
1656 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1657 sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
1658 contents = elf_section_data (sec)->this_hdr.contents;
1662 irel = elf_section_data (sec)->relocs;
1663 irelend = irel + sec->reloc_count;
1665 /* Actually delete the bytes. */
1666 if (toaddr - addr - count > 0)
1667 memmove (contents + addr, contents + addr + count,
1668 (size_t) (toaddr - addr - count));
1671 /* Adjust all the reloc addresses. */
1672 for (irel = elf_section_data (sec)->relocs; irel < irelend; irel++)
1674 bfd_vma old_reloc_address;
1676 old_reloc_address = (sec->output_section->vma
1677 + sec->output_offset + irel->r_offset);
1679 /* Get the new reloc address. */
1680 if ((irel->r_offset > addr
1681 && irel->r_offset < toaddr))
1684 printf ("Relocation at address 0x%x needs to be moved.\n"
1685 "Old section offset: 0x%x, New section offset: 0x%x \n",
1686 (unsigned int) old_reloc_address,
1687 (unsigned int) irel->r_offset,
1688 (unsigned int) ((irel->r_offset) - count));
1690 irel->r_offset -= count;
1695 /* The reloc's own addresses are now ok. However, we need to readjust
1696 the reloc's addend, i.e. the reloc's value if two conditions are met:
1697 1.) the reloc is relative to a symbol in this section that
1698 is located in front of the shrinked instruction
1699 2.) symbol plus addend end up behind the shrinked instruction.
1701 The most common case where this happens are relocs relative to
1702 the section-start symbol.
1704 This step needs to be done for all of the sections of the bfd. */
1707 struct bfd_section *isec;
1709 for (isec = abfd->sections; isec; isec = isec->next)
1712 bfd_vma shrinked_insn_address;
1714 if (isec->reloc_count == 0)
1717 shrinked_insn_address = (sec->output_section->vma
1718 + sec->output_offset + addr - count);
1720 irel = elf_section_data (isec)->relocs;
1721 /* PR 12161: Read in the relocs for this section if necessary. */
1723 irel = _bfd_elf_link_read_relocs (abfd, isec, NULL, NULL, TRUE);
1725 for (irelend = irel + isec->reloc_count;
1729 /* Read this BFD's local symbols if we haven't done
1731 if (isymbuf == NULL && symtab_hdr->sh_info != 0)
1733 isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
1734 if (isymbuf == NULL)
1735 isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
1736 symtab_hdr->sh_info, 0,
1738 if (isymbuf == NULL)
1742 /* Get the value of the symbol referred to by the reloc. */
1743 if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
1745 /* A local symbol. */
1748 isym = isymbuf + ELF32_R_SYM (irel->r_info);
1749 sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
1750 symval = isym->st_value;
1751 /* If the reloc is absolute, it will not have
1752 a symbol or section associated with it. */
1755 symval += sym_sec->output_section->vma
1756 + sym_sec->output_offset;
1759 printf ("Checking if the relocation's "
1760 "addend needs corrections.\n"
1761 "Address of anchor symbol: 0x%x \n"
1762 "Address of relocation target: 0x%x \n"
1763 "Address of relaxed insn: 0x%x \n",
1764 (unsigned int) symval,
1765 (unsigned int) (symval + irel->r_addend),
1766 (unsigned int) shrinked_insn_address);
1768 if (symval <= shrinked_insn_address
1769 && (symval + irel->r_addend) > shrinked_insn_address)
1771 if (elf32_avr_is_diff_reloc (irel))
1773 elf32_avr_adjust_diff_reloc_value (abfd, isec, irel,
1775 shrinked_insn_address,
1779 irel->r_addend -= count;
1782 printf ("Relocation's addend needed to be fixed \n");
1785 /* else...Reference symbol is absolute. No adjustment needed. */
1787 /* else...Reference symbol is extern. No need for adjusting
1793 /* Adjust the local symbols defined in this section. */
1794 isym = (Elf_Internal_Sym *) symtab_hdr->contents;
1795 /* Fix PR 9841, there may be no local symbols. */
1798 Elf_Internal_Sym *isymend;
1800 isymend = isym + symtab_hdr->sh_info;
1801 for (; isym < isymend; isym++)
1803 if (isym->st_shndx == sec_shndx
1804 && isym->st_value > addr
1805 && isym->st_value < toaddr)
1806 isym->st_value -= count;
1810 /* Now adjust the global symbols defined in this section. */
1811 symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
1812 - symtab_hdr->sh_info);
1813 sym_hashes = elf_sym_hashes (abfd);
1814 end_hashes = sym_hashes + symcount;
1815 for (; sym_hashes < end_hashes; sym_hashes++)
1817 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 < toaddr)
1824 sym_hash->root.u.def.value -= count;
1831 /* This function handles relaxing for the avr.
1832 Many important relaxing opportunities within functions are already
1833 realized by the compiler itself.
1834 Here we try to replace call (4 bytes) -> rcall (2 bytes)
1835 and jump -> rjmp (safes also 2 bytes).
1836 As well we now optimize seqences of
1837 - call/rcall function
1842 . In case that within a sequence
1845 the ret could no longer be reached it is optimized away. In order
1846 to check if the ret is no longer needed, it is checked that the ret's address
1847 is not the target of a branch or jump within the same section, it is checked
1848 that there is no skip instruction before the jmp/rjmp and that there
1849 is no local or global label place at the address of the ret.
1851 We refrain from relaxing within sections ".vectors" and
1852 ".jumptables" in order to maintain the position of the instructions.
1853 There, however, we substitute jmp/call by a sequence rjmp,nop/rcall,nop
1854 if possible. (In future one could possibly use the space of the nop
1855 for the first instruction of the irq service function.
1857 The .jumptables sections is meant to be used for a future tablejump variant
1858 for the devices with 3-byte program counter where the table itself
1859 contains 4-byte jump instructions whose relative offset must not
1863 elf32_avr_relax_section (bfd *abfd,
1865 struct bfd_link_info *link_info,
1868 Elf_Internal_Shdr *symtab_hdr;
1869 Elf_Internal_Rela *internal_relocs;
1870 Elf_Internal_Rela *irel, *irelend;
1871 bfd_byte *contents = NULL;
1872 Elf_Internal_Sym *isymbuf = NULL;
1873 struct elf32_avr_link_hash_table *htab;
1875 /* If 'shrinkable' is FALSE, do not shrink by deleting bytes while
1876 relaxing. Such shrinking can cause issues for the sections such
1877 as .vectors and .jumptables. Instead the unused bytes should be
1878 filled with nop instructions. */
1879 bfd_boolean shrinkable = TRUE;
1881 if (!strcmp (sec->name,".vectors")
1882 || !strcmp (sec->name,".jumptables"))
1885 if (link_info->relocatable)
1886 (*link_info->callbacks->einfo)
1887 (_("%P%F: --relax and -r may not be used together\n"));
1889 htab = avr_link_hash_table (link_info);
1893 /* Assume nothing changes. */
1896 if ((!htab->no_stubs) && (sec == htab->stub_sec))
1898 /* We are just relaxing the stub section.
1899 Let's calculate the size needed again. */
1900 bfd_size_type last_estimated_stub_section_size = htab->stub_sec->size;
1903 printf ("Relaxing the stub section. Size prior to this pass: %i\n",
1904 (int) last_estimated_stub_section_size);
1906 elf32_avr_size_stubs (htab->stub_sec->output_section->owner,
1909 /* Check if the number of trampolines changed. */
1910 if (last_estimated_stub_section_size != htab->stub_sec->size)
1914 printf ("Size of stub section after this pass: %i\n",
1915 (int) htab->stub_sec->size);
1920 /* We don't have to do anything for a relocatable link, if
1921 this section does not have relocs, or if this is not a
1923 if (link_info->relocatable
1924 || (sec->flags & SEC_RELOC) == 0
1925 || sec->reloc_count == 0
1926 || (sec->flags & SEC_CODE) == 0)
1929 /* Check if the object file to relax uses internal symbols so that we
1930 could fix up the relocations. */
1931 if (!(elf_elfheader (abfd)->e_flags & EF_AVR_LINKRELAX_PREPARED))
1934 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1936 /* Get a copy of the native relocations. */
1937 internal_relocs = (_bfd_elf_link_read_relocs
1938 (abfd, sec, NULL, NULL, link_info->keep_memory));
1939 if (internal_relocs == NULL)
1942 /* Walk through the relocs looking for relaxing opportunities. */
1943 irelend = internal_relocs + sec->reloc_count;
1944 for (irel = internal_relocs; irel < irelend; irel++)
1948 if ( ELF32_R_TYPE (irel->r_info) != R_AVR_13_PCREL
1949 && ELF32_R_TYPE (irel->r_info) != R_AVR_7_PCREL
1950 && ELF32_R_TYPE (irel->r_info) != R_AVR_CALL)
1953 /* Get the section contents if we haven't done so already. */
1954 if (contents == NULL)
1956 /* Get cached copy if it exists. */
1957 if (elf_section_data (sec)->this_hdr.contents != NULL)
1958 contents = elf_section_data (sec)->this_hdr.contents;
1961 /* Go get them off disk. */
1962 if (! bfd_malloc_and_get_section (abfd, sec, &contents))
1967 /* Read this BFD's local symbols if we haven't done so already. */
1968 if (isymbuf == NULL && symtab_hdr->sh_info != 0)
1970 isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
1971 if (isymbuf == NULL)
1972 isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
1973 symtab_hdr->sh_info, 0,
1975 if (isymbuf == NULL)
1980 /* Get the value of the symbol referred to by the reloc. */
1981 if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
1983 /* A local symbol. */
1984 Elf_Internal_Sym *isym;
1987 isym = isymbuf + ELF32_R_SYM (irel->r_info);
1988 sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
1989 symval = isym->st_value;
1990 /* If the reloc is absolute, it will not have
1991 a symbol or section associated with it. */
1993 symval += sym_sec->output_section->vma
1994 + sym_sec->output_offset;
1999 struct elf_link_hash_entry *h;
2001 /* An external symbol. */
2002 indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
2003 h = elf_sym_hashes (abfd)[indx];
2004 BFD_ASSERT (h != NULL);
2005 if (h->root.type != bfd_link_hash_defined
2006 && h->root.type != bfd_link_hash_defweak)
2007 /* This appears to be a reference to an undefined
2008 symbol. Just ignore it--it will be caught by the
2009 regular reloc processing. */
2012 symval = (h->root.u.def.value
2013 + h->root.u.def.section->output_section->vma
2014 + h->root.u.def.section->output_offset);
2017 /* For simplicity of coding, we are going to modify the section
2018 contents, the section relocs, and the BFD symbol table. We
2019 must tell the rest of the code not to free up this
2020 information. It would be possible to instead create a table
2021 of changes which have to be made, as is done in coff-mips.c;
2022 that would be more work, but would require less memory when
2023 the linker is run. */
2024 switch (ELF32_R_TYPE (irel->r_info))
2026 /* Try to turn a 22-bit absolute call/jump into an 13-bit
2027 pc-relative rcall/rjmp. */
2030 bfd_vma value = symval + irel->r_addend;
2032 int distance_short_enough = 0;
2034 /* Get the address of this instruction. */
2035 dot = (sec->output_section->vma
2036 + sec->output_offset + irel->r_offset);
2038 /* Compute the distance from this insn to the branch target. */
2041 /* Check if the gap falls in the range that can be accommodated
2042 in 13bits signed (It is 12bits when encoded, as we deal with
2043 word addressing). */
2044 if (!shrinkable && ((int) gap >= -4096 && (int) gap <= 4095))
2045 distance_short_enough = 1;
2046 /* If shrinkable, then we can check for a range of distance which
2047 is two bytes farther on both the directions because the call
2048 or jump target will be closer by two bytes after the
2050 else if (shrinkable && ((int) gap >= -4094 && (int) gap <= 4097))
2051 distance_short_enough = 1;
2053 /* Here we handle the wrap-around case. E.g. for a 16k device
2054 we could use a rjmp to jump from address 0x100 to 0x3d00!
2055 In order to make this work properly, we need to fill the
2056 vaiable avr_pc_wrap_around with the appropriate value.
2057 I.e. 0x4000 for a 16k device. */
2059 /* Shrinking the code size makes the gaps larger in the
2060 case of wrap-arounds. So we use a heuristical safety
2061 margin to avoid that during relax the distance gets
2062 again too large for the short jumps. Let's assume
2063 a typical code-size reduction due to relax for a
2064 16k device of 600 bytes. So let's use twice the
2065 typical value as safety margin. */
2069 int assumed_shrink = 600;
2070 if (avr_pc_wrap_around > 0x4000)
2071 assumed_shrink = 900;
2073 safety_margin = 2 * assumed_shrink;
2075 rgap = avr_relative_distance_considering_wrap_around (gap);
2077 if (rgap >= (-4092 + safety_margin)
2078 && rgap <= (4094 - safety_margin))
2079 distance_short_enough = 1;
2082 if (distance_short_enough)
2084 unsigned char code_msb;
2085 unsigned char code_lsb;
2088 printf ("shrinking jump/call instruction at address 0x%x"
2089 " in section %s\n\n",
2090 (int) dot, sec->name);
2092 /* Note that we've changed the relocs, section contents,
2094 elf_section_data (sec)->relocs = internal_relocs;
2095 elf_section_data (sec)->this_hdr.contents = contents;
2096 symtab_hdr->contents = (unsigned char *) isymbuf;
2098 /* Get the instruction code for relaxing. */
2099 code_lsb = bfd_get_8 (abfd, contents + irel->r_offset);
2100 code_msb = bfd_get_8 (abfd, contents + irel->r_offset + 1);
2102 /* Mask out the relocation bits. */
2105 if (code_msb == 0x94 && code_lsb == 0x0E)
2107 /* we are changing call -> rcall . */
2108 bfd_put_8 (abfd, 0x00, contents + irel->r_offset);
2109 bfd_put_8 (abfd, 0xD0, contents + irel->r_offset + 1);
2111 else if (code_msb == 0x94 && code_lsb == 0x0C)
2113 /* we are changeing jump -> rjmp. */
2114 bfd_put_8 (abfd, 0x00, contents + irel->r_offset);
2115 bfd_put_8 (abfd, 0xC0, contents + irel->r_offset + 1);
2120 /* Fix the relocation's type. */
2121 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
2124 /* We should not modify the ordering if 'shrinkable' is
2128 /* Let's insert a nop. */
2129 bfd_put_8 (abfd, 0x00, contents + irel->r_offset + 2);
2130 bfd_put_8 (abfd, 0x00, contents + irel->r_offset + 3);
2134 /* Delete two bytes of data. */
2135 if (!elf32_avr_relax_delete_bytes (abfd, sec,
2136 irel->r_offset + 2, 2))
2139 /* That will change things, so, we should relax again.
2140 Note that this is not required, and it may be slow. */
2148 unsigned char code_msb;
2149 unsigned char code_lsb;
2152 code_msb = bfd_get_8 (abfd, contents + irel->r_offset + 1);
2153 code_lsb = bfd_get_8 (abfd, contents + irel->r_offset + 0);
2155 /* Get the address of this instruction. */
2156 dot = (sec->output_section->vma
2157 + sec->output_offset + irel->r_offset);
2159 /* Here we look for rcall/ret or call/ret sequences that could be
2160 safely replaced by rjmp/ret or jmp/ret. */
2161 if (((code_msb & 0xf0) == 0xd0)
2162 && avr_replace_call_ret_sequences)
2164 /* This insn is a rcall. */
2165 unsigned char next_insn_msb = 0;
2166 unsigned char next_insn_lsb = 0;
2168 if (irel->r_offset + 3 < sec->size)
2171 bfd_get_8 (abfd, contents + irel->r_offset + 3);
2173 bfd_get_8 (abfd, contents + irel->r_offset + 2);
2176 if ((0x95 == next_insn_msb) && (0x08 == next_insn_lsb))
2178 /* The next insn is a ret. We now convert the rcall insn
2179 into a rjmp instruction. */
2181 bfd_put_8 (abfd, code_msb, contents + irel->r_offset + 1);
2183 printf ("converted rcall/ret sequence at address 0x%x"
2184 " into rjmp/ret sequence. Section is %s\n\n",
2185 (int) dot, sec->name);
2190 else if ((0x94 == (code_msb & 0xfe))
2191 && (0x0e == (code_lsb & 0x0e))
2192 && avr_replace_call_ret_sequences)
2194 /* This insn is a call. */
2195 unsigned char next_insn_msb = 0;
2196 unsigned char next_insn_lsb = 0;
2198 if (irel->r_offset + 5 < sec->size)
2201 bfd_get_8 (abfd, contents + irel->r_offset + 5);
2203 bfd_get_8 (abfd, contents + irel->r_offset + 4);
2206 if ((0x95 == next_insn_msb) && (0x08 == next_insn_lsb))
2208 /* The next insn is a ret. We now convert the call insn
2209 into a jmp instruction. */
2212 bfd_put_8 (abfd, code_lsb, contents + irel->r_offset);
2214 printf ("converted call/ret sequence at address 0x%x"
2215 " into jmp/ret sequence. Section is %s\n\n",
2216 (int) dot, sec->name);
2221 else if ((0xc0 == (code_msb & 0xf0))
2222 || ((0x94 == (code_msb & 0xfe))
2223 && (0x0c == (code_lsb & 0x0e))))
2225 /* This insn is a rjmp or a jmp. */
2226 unsigned char next_insn_msb = 0;
2227 unsigned char next_insn_lsb = 0;
2230 if (0xc0 == (code_msb & 0xf0))
2231 insn_size = 2; /* rjmp insn */
2233 insn_size = 4; /* jmp insn */
2235 if (irel->r_offset + insn_size + 1 < sec->size)
2238 bfd_get_8 (abfd, contents + irel->r_offset
2241 bfd_get_8 (abfd, contents + irel->r_offset
2245 if ((0x95 == next_insn_msb) && (0x08 == next_insn_lsb))
2247 /* The next insn is a ret. We possibly could delete
2248 this ret. First we need to check for preceding
2249 sbis/sbic/sbrs or cpse "skip" instructions. */
2251 int there_is_preceding_non_skip_insn = 1;
2252 bfd_vma address_of_ret;
2254 address_of_ret = dot + insn_size;
2256 if (debug_relax && (insn_size == 2))
2257 printf ("found rjmp / ret sequence at address 0x%x\n",
2259 if (debug_relax && (insn_size == 4))
2260 printf ("found jmp / ret sequence at address 0x%x\n",
2263 /* We have to make sure that there is a preceding insn. */
2264 if (irel->r_offset >= 2)
2266 unsigned char preceding_msb;
2267 unsigned char preceding_lsb;
2270 bfd_get_8 (abfd, contents + irel->r_offset - 1);
2272 bfd_get_8 (abfd, contents + irel->r_offset - 2);
2275 if (0x99 == preceding_msb)
2276 there_is_preceding_non_skip_insn = 0;
2279 if (0x9b == preceding_msb)
2280 there_is_preceding_non_skip_insn = 0;
2283 if ((0xfc == (preceding_msb & 0xfe)
2284 && (0x00 == (preceding_lsb & 0x08))))
2285 there_is_preceding_non_skip_insn = 0;
2288 if ((0xfe == (preceding_msb & 0xfe)
2289 && (0x00 == (preceding_lsb & 0x08))))
2290 there_is_preceding_non_skip_insn = 0;
2293 if (0x10 == (preceding_msb & 0xfc))
2294 there_is_preceding_non_skip_insn = 0;
2296 if (there_is_preceding_non_skip_insn == 0)
2298 printf ("preceding skip insn prevents deletion of"
2299 " ret insn at Addy 0x%x in section %s\n",
2300 (int) dot + 2, sec->name);
2304 /* There is no previous instruction. */
2305 there_is_preceding_non_skip_insn = 0;
2308 if (there_is_preceding_non_skip_insn)
2310 /* We now only have to make sure that there is no
2311 local label defined at the address of the ret
2312 instruction and that there is no local relocation
2313 in this section pointing to the ret. */
2315 int deleting_ret_is_safe = 1;
2316 unsigned int section_offset_of_ret_insn =
2317 irel->r_offset + insn_size;
2318 Elf_Internal_Sym *isym, *isymend;
2319 unsigned int sec_shndx;
2320 struct bfd_section *isec;
2323 _bfd_elf_section_from_bfd_section (abfd, sec);
2325 /* Check for local symbols. */
2326 isym = (Elf_Internal_Sym *) symtab_hdr->contents;
2327 isymend = isym + symtab_hdr->sh_info;
2328 /* PR 6019: There may not be any local symbols. */
2329 for (; isym != NULL && isym < isymend; isym++)
2331 if (isym->st_value == section_offset_of_ret_insn
2332 && isym->st_shndx == sec_shndx)
2334 deleting_ret_is_safe = 0;
2336 printf ("local label prevents deletion of ret "
2337 "insn at address 0x%x\n",
2338 (int) dot + insn_size);
2342 /* Now check for global symbols. */
2345 struct elf_link_hash_entry **sym_hashes;
2346 struct elf_link_hash_entry **end_hashes;
2348 symcount = (symtab_hdr->sh_size
2349 / sizeof (Elf32_External_Sym)
2350 - symtab_hdr->sh_info);
2351 sym_hashes = elf_sym_hashes (abfd);
2352 end_hashes = sym_hashes + symcount;
2353 for (; sym_hashes < end_hashes; sym_hashes++)
2355 struct elf_link_hash_entry *sym_hash =
2357 if ((sym_hash->root.type == bfd_link_hash_defined
2358 || sym_hash->root.type ==
2359 bfd_link_hash_defweak)
2360 && sym_hash->root.u.def.section == sec
2361 && sym_hash->root.u.def.value == section_offset_of_ret_insn)
2363 deleting_ret_is_safe = 0;
2365 printf ("global label prevents deletion of "
2366 "ret insn at address 0x%x\n",
2367 (int) dot + insn_size);
2372 /* Now we check for relocations pointing to ret. */
2373 for (isec = abfd->sections; isec && deleting_ret_is_safe; isec = isec->next)
2375 Elf_Internal_Rela *rel;
2376 Elf_Internal_Rela *relend;
2378 rel = elf_section_data (isec)->relocs;
2380 rel = _bfd_elf_link_read_relocs (abfd, isec, NULL, NULL, TRUE);
2382 relend = rel + isec->reloc_count;
2384 for (; rel && rel < relend; rel++)
2386 bfd_vma reloc_target = 0;
2388 /* Read this BFD's local symbols if we haven't
2390 if (isymbuf == NULL && symtab_hdr->sh_info != 0)
2392 isymbuf = (Elf_Internal_Sym *)
2393 symtab_hdr->contents;
2394 if (isymbuf == NULL)
2395 isymbuf = bfd_elf_get_elf_syms
2398 symtab_hdr->sh_info, 0,
2400 if (isymbuf == NULL)
2404 /* Get the value of the symbol referred to
2406 if (ELF32_R_SYM (rel->r_info)
2407 < symtab_hdr->sh_info)
2409 /* A local symbol. */
2413 + ELF32_R_SYM (rel->r_info);
2414 sym_sec = bfd_section_from_elf_index
2415 (abfd, isym->st_shndx);
2416 symval = isym->st_value;
2418 /* If the reloc is absolute, it will not
2419 have a symbol or section associated
2425 sym_sec->output_section->vma
2426 + sym_sec->output_offset;
2427 reloc_target = symval + rel->r_addend;
2431 reloc_target = symval + rel->r_addend;
2432 /* Reference symbol is absolute. */
2435 /* else ... reference symbol is extern. */
2437 if (address_of_ret == reloc_target)
2439 deleting_ret_is_safe = 0;
2442 "rjmp/jmp ret sequence at address"
2443 " 0x%x could not be deleted. ret"
2444 " is target of a relocation.\n",
2445 (int) address_of_ret);
2451 if (deleting_ret_is_safe)
2454 printf ("unreachable ret instruction "
2455 "at address 0x%x deleted.\n",
2456 (int) dot + insn_size);
2458 /* Delete two bytes of data. */
2459 if (!elf32_avr_relax_delete_bytes (abfd, sec,
2460 irel->r_offset + insn_size, 2))
2463 /* That will change things, so, we should relax
2464 again. Note that this is not required, and it
2477 if (contents != NULL
2478 && elf_section_data (sec)->this_hdr.contents != contents)
2480 if (! link_info->keep_memory)
2484 /* Cache the section contents for elf_link_input_bfd. */
2485 elf_section_data (sec)->this_hdr.contents = contents;
2489 if (internal_relocs != NULL
2490 && elf_section_data (sec)->relocs != internal_relocs)
2491 free (internal_relocs);
2497 && symtab_hdr->contents != (unsigned char *) isymbuf)
2499 if (contents != NULL
2500 && elf_section_data (sec)->this_hdr.contents != contents)
2502 if (internal_relocs != NULL
2503 && elf_section_data (sec)->relocs != internal_relocs)
2504 free (internal_relocs);
2509 /* This is a version of bfd_generic_get_relocated_section_contents
2510 which uses elf32_avr_relocate_section.
2512 For avr it's essentially a cut and paste taken from the H8300 port.
2513 The author of the relaxation support patch for avr had absolutely no
2514 clue what is happening here but found out that this part of the code
2515 seems to be important. */
2518 elf32_avr_get_relocated_section_contents (bfd *output_bfd,
2519 struct bfd_link_info *link_info,
2520 struct bfd_link_order *link_order,
2522 bfd_boolean relocatable,
2525 Elf_Internal_Shdr *symtab_hdr;
2526 asection *input_section = link_order->u.indirect.section;
2527 bfd *input_bfd = input_section->owner;
2528 asection **sections = NULL;
2529 Elf_Internal_Rela *internal_relocs = NULL;
2530 Elf_Internal_Sym *isymbuf = NULL;
2532 /* We only need to handle the case of relaxing, or of having a
2533 particular set of section contents, specially. */
2535 || elf_section_data (input_section)->this_hdr.contents == NULL)
2536 return bfd_generic_get_relocated_section_contents (output_bfd, link_info,
2540 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
2542 memcpy (data, elf_section_data (input_section)->this_hdr.contents,
2543 (size_t) input_section->size);
2545 if ((input_section->flags & SEC_RELOC) != 0
2546 && input_section->reloc_count > 0)
2549 Elf_Internal_Sym *isym, *isymend;
2552 internal_relocs = (_bfd_elf_link_read_relocs
2553 (input_bfd, input_section, NULL, NULL, FALSE));
2554 if (internal_relocs == NULL)
2557 if (symtab_hdr->sh_info != 0)
2559 isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
2560 if (isymbuf == NULL)
2561 isymbuf = bfd_elf_get_elf_syms (input_bfd, symtab_hdr,
2562 symtab_hdr->sh_info, 0,
2564 if (isymbuf == NULL)
2568 amt = symtab_hdr->sh_info;
2569 amt *= sizeof (asection *);
2570 sections = bfd_malloc (amt);
2571 if (sections == NULL && amt != 0)
2574 isymend = isymbuf + symtab_hdr->sh_info;
2575 for (isym = isymbuf, secpp = sections; isym < isymend; ++isym, ++secpp)
2579 if (isym->st_shndx == SHN_UNDEF)
2580 isec = bfd_und_section_ptr;
2581 else if (isym->st_shndx == SHN_ABS)
2582 isec = bfd_abs_section_ptr;
2583 else if (isym->st_shndx == SHN_COMMON)
2584 isec = bfd_com_section_ptr;
2586 isec = bfd_section_from_elf_index (input_bfd, isym->st_shndx);
2591 if (! elf32_avr_relocate_section (output_bfd, link_info, input_bfd,
2592 input_section, data, internal_relocs,
2596 if (sections != NULL)
2599 && symtab_hdr->contents != (unsigned char *) isymbuf)
2601 if (elf_section_data (input_section)->relocs != internal_relocs)
2602 free (internal_relocs);
2608 if (sections != NULL)
2611 && symtab_hdr->contents != (unsigned char *) isymbuf)
2613 if (internal_relocs != NULL
2614 && elf_section_data (input_section)->relocs != internal_relocs)
2615 free (internal_relocs);
2620 /* Determines the hash entry name for a particular reloc. It consists of
2621 the identifier of the symbol section and the added reloc addend and
2622 symbol offset relative to the section the symbol is attached to. */
2625 avr_stub_name (const asection *symbol_section,
2626 const bfd_vma symbol_offset,
2627 const Elf_Internal_Rela *rela)
2632 len = 8 + 1 + 8 + 1 + 1;
2633 stub_name = bfd_malloc (len);
2635 sprintf (stub_name, "%08x+%08x",
2636 symbol_section->id & 0xffffffff,
2637 (unsigned int) ((rela->r_addend & 0xffffffff) + symbol_offset));
2643 /* Add a new stub entry to the stub hash. Not all fields of the new
2644 stub entry are initialised. */
2646 static struct elf32_avr_stub_hash_entry *
2647 avr_add_stub (const char *stub_name,
2648 struct elf32_avr_link_hash_table *htab)
2650 struct elf32_avr_stub_hash_entry *hsh;
2652 /* Enter this entry into the linker stub hash table. */
2653 hsh = avr_stub_hash_lookup (&htab->bstab, stub_name, TRUE, FALSE);
2657 (*_bfd_error_handler) (_("%B: cannot create stub entry %s"),
2662 hsh->stub_offset = 0;
2666 /* We assume that there is already space allocated for the stub section
2667 contents and that before building the stubs the section size is
2668 initialized to 0. We assume that within the stub hash table entry,
2669 the absolute position of the jmp target has been written in the
2670 target_value field. We write here the offset of the generated jmp insn
2671 relative to the trampoline section start to the stub_offset entry in
2672 the stub hash table entry. */
2675 avr_build_one_stub (struct bfd_hash_entry *bh, void *in_arg)
2677 struct elf32_avr_stub_hash_entry *hsh;
2678 struct bfd_link_info *info;
2679 struct elf32_avr_link_hash_table *htab;
2686 bfd_vma jmp_insn = 0x0000940c;
2688 /* Massage our args to the form they really have. */
2689 hsh = avr_stub_hash_entry (bh);
2691 if (!hsh->is_actually_needed)
2694 info = (struct bfd_link_info *) in_arg;
2696 htab = avr_link_hash_table (info);
2700 target = hsh->target_value;
2702 /* Make a note of the offset within the stubs for this entry. */
2703 hsh->stub_offset = htab->stub_sec->size;
2704 loc = htab->stub_sec->contents + hsh->stub_offset;
2706 stub_bfd = htab->stub_sec->owner;
2709 printf ("Building one Stub. Address: 0x%x, Offset: 0x%x\n",
2710 (unsigned int) target,
2711 (unsigned int) hsh->stub_offset);
2713 /* We now have to add the information on the jump target to the bare
2714 opcode bits already set in jmp_insn. */
2716 /* Check for the alignment of the address. */
2720 starget = target >> 1;
2721 jmp_insn |= ((starget & 0x10000) | ((starget << 3) & 0x1f00000)) >> 16;
2722 bfd_put_16 (stub_bfd, jmp_insn, loc);
2723 bfd_put_16 (stub_bfd, (bfd_vma) starget & 0xffff, loc + 2);
2725 htab->stub_sec->size += 4;
2727 /* Now add the entries in the address mapping table if there is still
2732 nr = htab->amt_entry_cnt + 1;
2733 if (nr <= htab->amt_max_entry_cnt)
2735 htab->amt_entry_cnt = nr;
2737 htab->amt_stub_offsets[nr - 1] = hsh->stub_offset;
2738 htab->amt_destination_addr[nr - 1] = target;
2746 avr_mark_stub_not_to_be_necessary (struct bfd_hash_entry *bh,
2747 void *in_arg ATTRIBUTE_UNUSED)
2749 struct elf32_avr_stub_hash_entry *hsh;
2751 hsh = avr_stub_hash_entry (bh);
2752 hsh->is_actually_needed = FALSE;
2758 avr_size_one_stub (struct bfd_hash_entry *bh, void *in_arg)
2760 struct elf32_avr_stub_hash_entry *hsh;
2761 struct elf32_avr_link_hash_table *htab;
2764 /* Massage our args to the form they really have. */
2765 hsh = avr_stub_hash_entry (bh);
2768 if (hsh->is_actually_needed)
2773 htab->stub_sec->size += size;
2778 elf32_avr_setup_params (struct bfd_link_info *info,
2780 asection *avr_stub_section,
2781 bfd_boolean no_stubs,
2782 bfd_boolean deb_stubs,
2783 bfd_boolean deb_relax,
2784 bfd_vma pc_wrap_around,
2785 bfd_boolean call_ret_replacement)
2787 struct elf32_avr_link_hash_table *htab = avr_link_hash_table (info);
2791 htab->stub_sec = avr_stub_section;
2792 htab->stub_bfd = avr_stub_bfd;
2793 htab->no_stubs = no_stubs;
2795 debug_relax = deb_relax;
2796 debug_stubs = deb_stubs;
2797 avr_pc_wrap_around = pc_wrap_around;
2798 avr_replace_call_ret_sequences = call_ret_replacement;
2802 /* Set up various things so that we can make a list of input sections
2803 for each output section included in the link. Returns -1 on error,
2804 0 when no stubs will be needed, and 1 on success. It also sets
2805 information on the stubs bfd and the stub section in the info
2809 elf32_avr_setup_section_lists (bfd *output_bfd,
2810 struct bfd_link_info *info)
2813 unsigned int bfd_count;
2814 int top_id, top_index;
2816 asection **input_list, **list;
2818 struct elf32_avr_link_hash_table *htab = avr_link_hash_table (info);
2820 if (htab == NULL || htab->no_stubs)
2823 /* Count the number of input BFDs and find the top input section id. */
2824 for (input_bfd = info->input_bfds, bfd_count = 0, top_id = 0;
2826 input_bfd = input_bfd->link.next)
2829 for (section = input_bfd->sections;
2831 section = section->next)
2832 if (top_id < section->id)
2833 top_id = section->id;
2836 htab->bfd_count = bfd_count;
2838 /* We can't use output_bfd->section_count here to find the top output
2839 section index as some sections may have been removed, and
2840 strip_excluded_output_sections doesn't renumber the indices. */
2841 for (section = output_bfd->sections, top_index = 0;
2843 section = section->next)
2844 if (top_index < section->index)
2845 top_index = section->index;
2847 htab->top_index = top_index;
2848 amt = sizeof (asection *) * (top_index + 1);
2849 input_list = bfd_malloc (amt);
2850 htab->input_list = input_list;
2851 if (input_list == NULL)
2854 /* For sections we aren't interested in, mark their entries with a
2855 value we can check later. */
2856 list = input_list + top_index;
2858 *list = bfd_abs_section_ptr;
2859 while (list-- != input_list);
2861 for (section = output_bfd->sections;
2863 section = section->next)
2864 if ((section->flags & SEC_CODE) != 0)
2865 input_list[section->index] = NULL;
2871 /* Read in all local syms for all input bfds, and create hash entries
2872 for export stubs if we are building a multi-subspace shared lib.
2873 Returns -1 on error, 0 otherwise. */
2876 get_local_syms (bfd *input_bfd, struct bfd_link_info *info)
2878 unsigned int bfd_indx;
2879 Elf_Internal_Sym *local_syms, **all_local_syms;
2880 struct elf32_avr_link_hash_table *htab = avr_link_hash_table (info);
2886 /* We want to read in symbol extension records only once. To do this
2887 we need to read in the local symbols in parallel and save them for
2888 later use; so hold pointers to the local symbols in an array. */
2889 amt = sizeof (Elf_Internal_Sym *) * htab->bfd_count;
2890 all_local_syms = bfd_zmalloc (amt);
2891 htab->all_local_syms = all_local_syms;
2892 if (all_local_syms == NULL)
2895 /* Walk over all the input BFDs, swapping in local symbols.
2896 If we are creating a shared library, create hash entries for the
2900 input_bfd = input_bfd->link.next, bfd_indx++)
2902 Elf_Internal_Shdr *symtab_hdr;
2904 /* We'll need the symbol table in a second. */
2905 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
2906 if (symtab_hdr->sh_info == 0)
2909 /* We need an array of the local symbols attached to the input bfd. */
2910 local_syms = (Elf_Internal_Sym *) symtab_hdr->contents;
2911 if (local_syms == NULL)
2913 local_syms = bfd_elf_get_elf_syms (input_bfd, symtab_hdr,
2914 symtab_hdr->sh_info, 0,
2916 /* Cache them for elf_link_input_bfd. */
2917 symtab_hdr->contents = (unsigned char *) local_syms;
2919 if (local_syms == NULL)
2922 all_local_syms[bfd_indx] = local_syms;
2928 #define ADD_DUMMY_STUBS_FOR_DEBUGGING 0
2931 elf32_avr_size_stubs (bfd *output_bfd,
2932 struct bfd_link_info *info,
2933 bfd_boolean is_prealloc_run)
2935 struct elf32_avr_link_hash_table *htab;
2936 int stub_changed = 0;
2938 htab = avr_link_hash_table (info);
2942 /* At this point we initialize htab->vector_base
2943 To the start of the text output section. */
2944 htab->vector_base = htab->stub_sec->output_section->vma;
2946 if (get_local_syms (info->input_bfds, info))
2948 if (htab->all_local_syms)
2949 goto error_ret_free_local;
2953 if (ADD_DUMMY_STUBS_FOR_DEBUGGING)
2955 struct elf32_avr_stub_hash_entry *test;
2957 test = avr_add_stub ("Hugo",htab);
2958 test->target_value = 0x123456;
2959 test->stub_offset = 13;
2961 test = avr_add_stub ("Hugo2",htab);
2962 test->target_value = 0x84210;
2963 test->stub_offset = 14;
2969 unsigned int bfd_indx;
2971 /* We will have to re-generate the stub hash table each time anything
2972 in memory has changed. */
2974 bfd_hash_traverse (&htab->bstab, avr_mark_stub_not_to_be_necessary, htab);
2975 for (input_bfd = info->input_bfds, bfd_indx = 0;
2977 input_bfd = input_bfd->link.next, bfd_indx++)
2979 Elf_Internal_Shdr *symtab_hdr;
2981 Elf_Internal_Sym *local_syms;
2983 /* We'll need the symbol table in a second. */
2984 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
2985 if (symtab_hdr->sh_info == 0)
2988 local_syms = htab->all_local_syms[bfd_indx];
2990 /* Walk over each section attached to the input bfd. */
2991 for (section = input_bfd->sections;
2993 section = section->next)
2995 Elf_Internal_Rela *internal_relocs, *irelaend, *irela;
2997 /* If there aren't any relocs, then there's nothing more
2999 if ((section->flags & SEC_RELOC) == 0
3000 || section->reloc_count == 0)
3003 /* If this section is a link-once section that will be
3004 discarded, then don't create any stubs. */
3005 if (section->output_section == NULL
3006 || section->output_section->owner != output_bfd)
3009 /* Get the relocs. */
3011 = _bfd_elf_link_read_relocs (input_bfd, section, NULL, NULL,
3013 if (internal_relocs == NULL)
3014 goto error_ret_free_local;
3016 /* Now examine each relocation. */
3017 irela = internal_relocs;
3018 irelaend = irela + section->reloc_count;
3019 for (; irela < irelaend; irela++)
3021 unsigned int r_type, r_indx;
3022 struct elf32_avr_stub_hash_entry *hsh;
3025 bfd_vma destination;
3026 struct elf_link_hash_entry *hh;
3029 r_type = ELF32_R_TYPE (irela->r_info);
3030 r_indx = ELF32_R_SYM (irela->r_info);
3032 /* Only look for 16 bit GS relocs. No other reloc will need a
3034 if (!((r_type == R_AVR_16_PM)
3035 || (r_type == R_AVR_LO8_LDI_GS)
3036 || (r_type == R_AVR_HI8_LDI_GS)))
3039 /* Now determine the call target, its name, value,
3045 if (r_indx < symtab_hdr->sh_info)
3047 /* It's a local symbol. */
3048 Elf_Internal_Sym *sym;
3049 Elf_Internal_Shdr *hdr;
3052 sym = local_syms + r_indx;
3053 if (ELF_ST_TYPE (sym->st_info) != STT_SECTION)
3054 sym_value = sym->st_value;
3055 shndx = sym->st_shndx;
3056 if (shndx < elf_numsections (input_bfd))
3058 hdr = elf_elfsections (input_bfd)[shndx];
3059 sym_sec = hdr->bfd_section;
3060 destination = (sym_value + irela->r_addend
3061 + sym_sec->output_offset
3062 + sym_sec->output_section->vma);
3067 /* It's an external symbol. */
3070 e_indx = r_indx - symtab_hdr->sh_info;
3071 hh = elf_sym_hashes (input_bfd)[e_indx];
3073 while (hh->root.type == bfd_link_hash_indirect
3074 || hh->root.type == bfd_link_hash_warning)
3075 hh = (struct elf_link_hash_entry *)
3076 (hh->root.u.i.link);
3078 if (hh->root.type == bfd_link_hash_defined
3079 || hh->root.type == bfd_link_hash_defweak)
3081 sym_sec = hh->root.u.def.section;
3082 sym_value = hh->root.u.def.value;
3083 if (sym_sec->output_section != NULL)
3084 destination = (sym_value + irela->r_addend
3085 + sym_sec->output_offset
3086 + sym_sec->output_section->vma);
3088 else if (hh->root.type == bfd_link_hash_undefweak)
3093 else if (hh->root.type == bfd_link_hash_undefined)
3095 if (! (info->unresolved_syms_in_objects == RM_IGNORE
3096 && (ELF_ST_VISIBILITY (hh->other)
3102 bfd_set_error (bfd_error_bad_value);
3104 error_ret_free_internal:
3105 if (elf_section_data (section)->relocs == NULL)
3106 free (internal_relocs);
3107 goto error_ret_free_local;
3111 if (! avr_stub_is_required_for_16_bit_reloc
3112 (destination - htab->vector_base))
3114 if (!is_prealloc_run)
3115 /* We are having a reloc that does't need a stub. */
3118 /* We don't right now know if a stub will be needed.
3119 Let's rather be on the safe side. */
3122 /* Get the name of this stub. */
3123 stub_name = avr_stub_name (sym_sec, sym_value, irela);
3126 goto error_ret_free_internal;
3129 hsh = avr_stub_hash_lookup (&htab->bstab,
3134 /* The proper stub has already been created. Mark it
3135 to be used and write the possibly changed destination
3137 hsh->is_actually_needed = TRUE;
3138 hsh->target_value = destination;
3143 hsh = avr_add_stub (stub_name, htab);
3147 goto error_ret_free_internal;
3150 hsh->is_actually_needed = TRUE;
3151 hsh->target_value = destination;
3154 printf ("Adding stub with destination 0x%x to the"
3155 " hash table.\n", (unsigned int) destination);
3157 printf ("(Pre-Alloc run: %i)\n", is_prealloc_run);
3159 stub_changed = TRUE;
3162 /* We're done with the internal relocs, free them. */
3163 if (elf_section_data (section)->relocs == NULL)
3164 free (internal_relocs);
3168 /* Re-Calculate the number of needed stubs. */
3169 htab->stub_sec->size = 0;
3170 bfd_hash_traverse (&htab->bstab, avr_size_one_stub, htab);
3175 stub_changed = FALSE;
3178 free (htab->all_local_syms);
3181 error_ret_free_local:
3182 free (htab->all_local_syms);
3187 /* Build all the stubs associated with the current output file. The
3188 stubs are kept in a hash table attached to the main linker hash
3189 table. We also set up the .plt entries for statically linked PIC
3190 functions here. This function is called via hppaelf_finish in the
3194 elf32_avr_build_stubs (struct bfd_link_info *info)
3197 struct bfd_hash_table *table;
3198 struct elf32_avr_link_hash_table *htab;
3199 bfd_size_type total_size = 0;
3201 htab = avr_link_hash_table (info);
3205 /* In case that there were several stub sections: */
3206 for (stub_sec = htab->stub_bfd->sections;
3208 stub_sec = stub_sec->next)
3212 /* Allocate memory to hold the linker stubs. */
3213 size = stub_sec->size;
3216 stub_sec->contents = bfd_zalloc (htab->stub_bfd, size);
3217 if (stub_sec->contents == NULL && size != 0)
3222 /* Allocate memory for the adress mapping table. */
3223 htab->amt_entry_cnt = 0;
3224 htab->amt_max_entry_cnt = total_size / 4;
3225 htab->amt_stub_offsets = bfd_malloc (sizeof (bfd_vma)
3226 * htab->amt_max_entry_cnt);
3227 htab->amt_destination_addr = bfd_malloc (sizeof (bfd_vma)
3228 * htab->amt_max_entry_cnt );
3231 printf ("Allocating %i entries in the AMT\n", htab->amt_max_entry_cnt);
3233 /* Build the stubs as directed by the stub hash table. */
3234 table = &htab->bstab;
3235 bfd_hash_traverse (table, avr_build_one_stub, info);
3238 printf ("Final Stub section Size: %i\n", (int) htab->stub_sec->size);
3243 #define ELF_ARCH bfd_arch_avr
3244 #define ELF_TARGET_ID AVR_ELF_DATA
3245 #define ELF_MACHINE_CODE EM_AVR
3246 #define ELF_MACHINE_ALT1 EM_AVR_OLD
3247 #define ELF_MAXPAGESIZE 1
3249 #define TARGET_LITTLE_SYM avr_elf32_vec
3250 #define TARGET_LITTLE_NAME "elf32-avr"
3252 #define bfd_elf32_bfd_link_hash_table_create elf32_avr_link_hash_table_create
3254 #define elf_info_to_howto avr_info_to_howto_rela
3255 #define elf_info_to_howto_rel NULL
3256 #define elf_backend_relocate_section elf32_avr_relocate_section
3257 #define elf_backend_can_gc_sections 1
3258 #define elf_backend_rela_normal 1
3259 #define elf_backend_final_write_processing \
3260 bfd_elf_avr_final_write_processing
3261 #define elf_backend_object_p elf32_avr_object_p
3263 #define bfd_elf32_bfd_relax_section elf32_avr_relax_section
3264 #define bfd_elf32_bfd_get_relocated_section_contents \
3265 elf32_avr_get_relocated_section_contents
3267 #include "elf32-target.h"