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 /* Create the derived linker hash table. The AVR ELF port uses the derived
715 hash table to keep information specific to the AVR ELF linker (without
716 using static variables). */
718 static struct bfd_link_hash_table
*
719 elf32_avr_link_hash_table_create (bfd
*abfd
)
721 struct elf32_avr_link_hash_table
*htab
;
722 bfd_size_type amt
= sizeof (*htab
);
724 htab
= bfd_zmalloc (amt
);
728 if (!_bfd_elf_link_hash_table_init (&htab
->etab
, abfd
,
729 elf32_avr_link_hash_newfunc
,
730 sizeof (struct elf_link_hash_entry
),
737 /* Init the stub hash table too. */
738 if (!bfd_hash_table_init (&htab
->bstab
, stub_hash_newfunc
,
739 sizeof (struct elf32_avr_stub_hash_entry
)))
742 return &htab
->etab
.root
;
745 /* Free the derived linker hash table. */
748 elf32_avr_link_hash_table_free (struct bfd_link_hash_table
*btab
)
750 struct elf32_avr_link_hash_table
*htab
751 = (struct elf32_avr_link_hash_table
*) btab
;
753 /* Free the address mapping table. */
754 if (htab
->amt_stub_offsets
!= NULL
)
755 free (htab
->amt_stub_offsets
);
756 if (htab
->amt_destination_addr
!= NULL
)
757 free (htab
->amt_destination_addr
);
759 bfd_hash_table_free (&htab
->bstab
);
760 _bfd_elf_link_hash_table_free (btab
);
763 /* Calculates the effective distance of a pc relative jump/call. */
766 avr_relative_distance_considering_wrap_around (unsigned int distance
)
768 unsigned int wrap_around_mask
= avr_pc_wrap_around
- 1;
769 int dist_with_wrap_around
= distance
& wrap_around_mask
;
771 if (dist_with_wrap_around
> ((int) (avr_pc_wrap_around
>> 1)))
772 dist_with_wrap_around
-= avr_pc_wrap_around
;
774 return dist_with_wrap_around
;
778 static reloc_howto_type
*
779 bfd_elf32_bfd_reloc_type_lookup (bfd
*abfd ATTRIBUTE_UNUSED
,
780 bfd_reloc_code_real_type code
)
785 i
< sizeof (avr_reloc_map
) / sizeof (struct avr_reloc_map
);
787 if (avr_reloc_map
[i
].bfd_reloc_val
== code
)
788 return &elf_avr_howto_table
[avr_reloc_map
[i
].elf_reloc_val
];
793 static reloc_howto_type
*
794 bfd_elf32_bfd_reloc_name_lookup (bfd
*abfd ATTRIBUTE_UNUSED
,
800 i
< sizeof (elf_avr_howto_table
) / sizeof (elf_avr_howto_table
[0]);
802 if (elf_avr_howto_table
[i
].name
!= NULL
803 && strcasecmp (elf_avr_howto_table
[i
].name
, r_name
) == 0)
804 return &elf_avr_howto_table
[i
];
809 /* Set the howto pointer for an AVR ELF reloc. */
812 avr_info_to_howto_rela (bfd
*abfd ATTRIBUTE_UNUSED
,
814 Elf_Internal_Rela
*dst
)
818 r_type
= ELF32_R_TYPE (dst
->r_info
);
819 BFD_ASSERT (r_type
< (unsigned int) R_AVR_max
);
820 cache_ptr
->howto
= &elf_avr_howto_table
[r_type
];
824 avr_stub_is_required_for_16_bit_reloc (bfd_vma relocation
)
826 return (relocation
>= 0x020000);
829 /* Returns the address of the corresponding stub if there is one.
830 Returns otherwise an address above 0x020000. This function
831 could also be used, if there is no knowledge on the section where
832 the destination is found. */
835 avr_get_stub_addr (bfd_vma srel
,
836 struct elf32_avr_link_hash_table
*htab
)
839 bfd_vma stub_sec_addr
=
840 (htab
->stub_sec
->output_section
->vma
+
841 htab
->stub_sec
->output_offset
);
843 for (sindex
= 0; sindex
< htab
->amt_max_entry_cnt
; sindex
++)
844 if (htab
->amt_destination_addr
[sindex
] == srel
)
845 return htab
->amt_stub_offsets
[sindex
] + stub_sec_addr
;
847 /* Return an address that could not be reached by 16 bit relocs. */
851 /* Perform a diff relocation. Nothing to do, as the difference value is already
852 written into the section's contents. */
854 static bfd_reloc_status_type
855 bfd_elf_avr_diff_reloc (bfd
*abfd ATTRIBUTE_UNUSED
,
856 arelent
*reloc_entry ATTRIBUTE_UNUSED
,
857 asymbol
*symbol ATTRIBUTE_UNUSED
,
858 void *data ATTRIBUTE_UNUSED
,
859 asection
*input_section ATTRIBUTE_UNUSED
,
860 bfd
*output_bfd ATTRIBUTE_UNUSED
,
861 char **error_message ATTRIBUTE_UNUSED
)
867 /* Perform a single relocation. By default we use the standard BFD
868 routines, but a few relocs, we have to do them ourselves. */
870 static bfd_reloc_status_type
871 avr_final_link_relocate (reloc_howto_type
* howto
,
873 asection
* input_section
,
875 Elf_Internal_Rela
* rel
,
877 struct elf32_avr_link_hash_table
* htab
)
879 bfd_reloc_status_type r
= bfd_reloc_ok
;
882 bfd_signed_vma reloc_addr
;
883 bfd_boolean use_stubs
= FALSE
;
884 /* Usually is 0, unless we are generating code for a bootloader. */
885 bfd_signed_vma base_addr
= htab
->vector_base
;
887 /* Absolute addr of the reloc in the final excecutable. */
888 reloc_addr
= rel
->r_offset
+ input_section
->output_section
->vma
889 + input_section
->output_offset
;
894 contents
+= rel
->r_offset
;
895 srel
= (bfd_signed_vma
) relocation
;
896 srel
+= rel
->r_addend
;
897 srel
-= rel
->r_offset
;
898 srel
-= 2; /* Branch instructions add 2 to the PC... */
899 srel
-= (input_section
->output_section
->vma
+
900 input_section
->output_offset
);
903 return bfd_reloc_outofrange
;
904 if (srel
> ((1 << 7) - 1) || (srel
< - (1 << 7)))
905 return bfd_reloc_overflow
;
906 x
= bfd_get_16 (input_bfd
, contents
);
907 x
= (x
& 0xfc07) | (((srel
>> 1) << 3) & 0x3f8);
908 bfd_put_16 (input_bfd
, x
, contents
);
912 contents
+= rel
->r_offset
;
913 srel
= (bfd_signed_vma
) relocation
;
914 srel
+= rel
->r_addend
;
915 srel
-= rel
->r_offset
;
916 srel
-= 2; /* Branch instructions add 2 to the PC... */
917 srel
-= (input_section
->output_section
->vma
+
918 input_section
->output_offset
);
921 return bfd_reloc_outofrange
;
923 srel
= avr_relative_distance_considering_wrap_around (srel
);
925 /* AVR addresses commands as words. */
928 /* Check for overflow. */
929 if (srel
< -2048 || srel
> 2047)
931 /* Relative distance is too large. */
933 /* Always apply WRAPAROUND for avr2, avr25, and avr4. */
934 switch (bfd_get_mach (input_bfd
))
942 return bfd_reloc_overflow
;
946 x
= bfd_get_16 (input_bfd
, contents
);
947 x
= (x
& 0xf000) | (srel
& 0xfff);
948 bfd_put_16 (input_bfd
, x
, contents
);
952 contents
+= rel
->r_offset
;
953 srel
= (bfd_signed_vma
) relocation
+ rel
->r_addend
;
954 x
= bfd_get_16 (input_bfd
, contents
);
955 x
= (x
& 0xf0f0) | (srel
& 0xf) | ((srel
<< 4) & 0xf00);
956 bfd_put_16 (input_bfd
, x
, contents
);
960 contents
+= rel
->r_offset
;
961 srel
= (bfd_signed_vma
) relocation
+ rel
->r_addend
;
962 if (((srel
> 0) && (srel
& 0xffff) > 255)
963 || ((srel
< 0) && ((-srel
) & 0xffff) > 128))
964 /* Remove offset for data/eeprom section. */
965 return bfd_reloc_overflow
;
967 x
= bfd_get_16 (input_bfd
, contents
);
968 x
= (x
& 0xf0f0) | (srel
& 0xf) | ((srel
<< 4) & 0xf00);
969 bfd_put_16 (input_bfd
, x
, contents
);
973 contents
+= rel
->r_offset
;
974 srel
= (bfd_signed_vma
) relocation
+ rel
->r_addend
;
975 if (((srel
& 0xffff) > 63) || (srel
< 0))
976 /* Remove offset for data/eeprom section. */
977 return bfd_reloc_overflow
;
978 x
= bfd_get_16 (input_bfd
, contents
);
979 x
= (x
& 0xd3f8) | ((srel
& 7) | ((srel
& (3 << 3)) << 7)
980 | ((srel
& (1 << 5)) << 8));
981 bfd_put_16 (input_bfd
, x
, contents
);
985 contents
+= rel
->r_offset
;
986 srel
= (bfd_signed_vma
) relocation
+ rel
->r_addend
;
987 if (((srel
& 0xffff) > 63) || (srel
< 0))
988 /* Remove offset for data/eeprom section. */
989 return bfd_reloc_overflow
;
990 x
= bfd_get_16 (input_bfd
, contents
);
991 x
= (x
& 0xff30) | (srel
& 0xf) | ((srel
& 0x30) << 2);
992 bfd_put_16 (input_bfd
, x
, contents
);
996 contents
+= rel
->r_offset
;
997 srel
= (bfd_signed_vma
) relocation
+ rel
->r_addend
;
998 srel
= (srel
>> 8) & 0xff;
999 x
= bfd_get_16 (input_bfd
, contents
);
1000 x
= (x
& 0xf0f0) | (srel
& 0xf) | ((srel
<< 4) & 0xf00);
1001 bfd_put_16 (input_bfd
, x
, contents
);
1005 contents
+= rel
->r_offset
;
1006 srel
= (bfd_signed_vma
) relocation
+ rel
->r_addend
;
1007 srel
= (srel
>> 16) & 0xff;
1008 x
= bfd_get_16 (input_bfd
, contents
);
1009 x
= (x
& 0xf0f0) | (srel
& 0xf) | ((srel
<< 4) & 0xf00);
1010 bfd_put_16 (input_bfd
, x
, contents
);
1014 contents
+= rel
->r_offset
;
1015 srel
= (bfd_signed_vma
) relocation
+ rel
->r_addend
;
1016 srel
= (srel
>> 24) & 0xff;
1017 x
= bfd_get_16 (input_bfd
, contents
);
1018 x
= (x
& 0xf0f0) | (srel
& 0xf) | ((srel
<< 4) & 0xf00);
1019 bfd_put_16 (input_bfd
, x
, contents
);
1022 case R_AVR_LO8_LDI_NEG
:
1023 contents
+= rel
->r_offset
;
1024 srel
= (bfd_signed_vma
) relocation
+ rel
->r_addend
;
1026 x
= bfd_get_16 (input_bfd
, contents
);
1027 x
= (x
& 0xf0f0) | (srel
& 0xf) | ((srel
<< 4) & 0xf00);
1028 bfd_put_16 (input_bfd
, x
, contents
);
1031 case R_AVR_HI8_LDI_NEG
:
1032 contents
+= rel
->r_offset
;
1033 srel
= (bfd_signed_vma
) relocation
+ rel
->r_addend
;
1035 srel
= (srel
>> 8) & 0xff;
1036 x
= bfd_get_16 (input_bfd
, contents
);
1037 x
= (x
& 0xf0f0) | (srel
& 0xf) | ((srel
<< 4) & 0xf00);
1038 bfd_put_16 (input_bfd
, x
, contents
);
1041 case R_AVR_HH8_LDI_NEG
:
1042 contents
+= rel
->r_offset
;
1043 srel
= (bfd_signed_vma
) relocation
+ rel
->r_addend
;
1045 srel
= (srel
>> 16) & 0xff;
1046 x
= bfd_get_16 (input_bfd
, contents
);
1047 x
= (x
& 0xf0f0) | (srel
& 0xf) | ((srel
<< 4) & 0xf00);
1048 bfd_put_16 (input_bfd
, x
, contents
);
1051 case R_AVR_MS8_LDI_NEG
:
1052 contents
+= rel
->r_offset
;
1053 srel
= (bfd_signed_vma
) relocation
+ rel
->r_addend
;
1055 srel
= (srel
>> 24) & 0xff;
1056 x
= bfd_get_16 (input_bfd
, contents
);
1057 x
= (x
& 0xf0f0) | (srel
& 0xf) | ((srel
<< 4) & 0xf00);
1058 bfd_put_16 (input_bfd
, x
, contents
);
1061 case R_AVR_LO8_LDI_GS
:
1062 use_stubs
= (!htab
->no_stubs
);
1064 case R_AVR_LO8_LDI_PM
:
1065 contents
+= rel
->r_offset
;
1066 srel
= (bfd_signed_vma
) relocation
+ rel
->r_addend
;
1069 && avr_stub_is_required_for_16_bit_reloc (srel
- base_addr
))
1071 bfd_vma old_srel
= srel
;
1073 /* We need to use the address of the stub instead. */
1074 srel
= avr_get_stub_addr (srel
, htab
);
1076 printf ("LD: Using jump stub (at 0x%x) with destination 0x%x for "
1077 "reloc at address 0x%x.\n",
1078 (unsigned int) srel
,
1079 (unsigned int) old_srel
,
1080 (unsigned int) reloc_addr
);
1082 if (avr_stub_is_required_for_16_bit_reloc (srel
- base_addr
))
1083 return bfd_reloc_outofrange
;
1087 return bfd_reloc_outofrange
;
1089 x
= bfd_get_16 (input_bfd
, contents
);
1090 x
= (x
& 0xf0f0) | (srel
& 0xf) | ((srel
<< 4) & 0xf00);
1091 bfd_put_16 (input_bfd
, x
, contents
);
1094 case R_AVR_HI8_LDI_GS
:
1095 use_stubs
= (!htab
->no_stubs
);
1097 case R_AVR_HI8_LDI_PM
:
1098 contents
+= rel
->r_offset
;
1099 srel
= (bfd_signed_vma
) relocation
+ rel
->r_addend
;
1102 && avr_stub_is_required_for_16_bit_reloc (srel
- base_addr
))
1104 bfd_vma old_srel
= srel
;
1106 /* We need to use the address of the stub instead. */
1107 srel
= avr_get_stub_addr (srel
, htab
);
1109 printf ("LD: Using jump stub (at 0x%x) with destination 0x%x for "
1110 "reloc at address 0x%x.\n",
1111 (unsigned int) srel
,
1112 (unsigned int) old_srel
,
1113 (unsigned int) reloc_addr
);
1115 if (avr_stub_is_required_for_16_bit_reloc (srel
- base_addr
))
1116 return bfd_reloc_outofrange
;
1120 return bfd_reloc_outofrange
;
1122 srel
= (srel
>> 8) & 0xff;
1123 x
= bfd_get_16 (input_bfd
, contents
);
1124 x
= (x
& 0xf0f0) | (srel
& 0xf) | ((srel
<< 4) & 0xf00);
1125 bfd_put_16 (input_bfd
, x
, contents
);
1128 case R_AVR_HH8_LDI_PM
:
1129 contents
+= rel
->r_offset
;
1130 srel
= (bfd_signed_vma
) relocation
+ rel
->r_addend
;
1132 return bfd_reloc_outofrange
;
1134 srel
= (srel
>> 16) & 0xff;
1135 x
= bfd_get_16 (input_bfd
, contents
);
1136 x
= (x
& 0xf0f0) | (srel
& 0xf) | ((srel
<< 4) & 0xf00);
1137 bfd_put_16 (input_bfd
, x
, contents
);
1140 case R_AVR_LO8_LDI_PM_NEG
:
1141 contents
+= rel
->r_offset
;
1142 srel
= (bfd_signed_vma
) relocation
+ rel
->r_addend
;
1145 return bfd_reloc_outofrange
;
1147 x
= bfd_get_16 (input_bfd
, contents
);
1148 x
= (x
& 0xf0f0) | (srel
& 0xf) | ((srel
<< 4) & 0xf00);
1149 bfd_put_16 (input_bfd
, x
, contents
);
1152 case R_AVR_HI8_LDI_PM_NEG
:
1153 contents
+= rel
->r_offset
;
1154 srel
= (bfd_signed_vma
) relocation
+ rel
->r_addend
;
1157 return bfd_reloc_outofrange
;
1159 srel
= (srel
>> 8) & 0xff;
1160 x
= bfd_get_16 (input_bfd
, contents
);
1161 x
= (x
& 0xf0f0) | (srel
& 0xf) | ((srel
<< 4) & 0xf00);
1162 bfd_put_16 (input_bfd
, x
, contents
);
1165 case R_AVR_HH8_LDI_PM_NEG
:
1166 contents
+= rel
->r_offset
;
1167 srel
= (bfd_signed_vma
) relocation
+ rel
->r_addend
;
1170 return bfd_reloc_outofrange
;
1172 srel
= (srel
>> 16) & 0xff;
1173 x
= bfd_get_16 (input_bfd
, contents
);
1174 x
= (x
& 0xf0f0) | (srel
& 0xf) | ((srel
<< 4) & 0xf00);
1175 bfd_put_16 (input_bfd
, x
, contents
);
1179 contents
+= rel
->r_offset
;
1180 srel
= (bfd_signed_vma
) relocation
+ rel
->r_addend
;
1182 return bfd_reloc_outofrange
;
1184 x
= bfd_get_16 (input_bfd
, contents
);
1185 x
|= ((srel
& 0x10000) | ((srel
<< 3) & 0x1f00000)) >> 16;
1186 bfd_put_16 (input_bfd
, x
, contents
);
1187 bfd_put_16 (input_bfd
, (bfd_vma
) srel
& 0xffff, contents
+2);
1191 use_stubs
= (!htab
->no_stubs
);
1192 contents
+= rel
->r_offset
;
1193 srel
= (bfd_signed_vma
) relocation
+ rel
->r_addend
;
1196 && avr_stub_is_required_for_16_bit_reloc (srel
- base_addr
))
1198 bfd_vma old_srel
= srel
;
1200 /* We need to use the address of the stub instead. */
1201 srel
= avr_get_stub_addr (srel
,htab
);
1203 printf ("LD: Using jump stub (at 0x%x) with destination 0x%x for "
1204 "reloc at address 0x%x.\n",
1205 (unsigned int) srel
,
1206 (unsigned int) old_srel
,
1207 (unsigned int) reloc_addr
);
1209 if (avr_stub_is_required_for_16_bit_reloc (srel
- base_addr
))
1210 return bfd_reloc_outofrange
;
1214 return bfd_reloc_outofrange
;
1216 bfd_put_16 (input_bfd
, (bfd_vma
) srel
&0x00ffff, contents
);
1222 /* Nothing to do here, as contents already contains the diff value. */
1227 r
= _bfd_final_link_relocate (howto
, input_bfd
, input_section
,
1228 contents
, rel
->r_offset
,
1229 relocation
, rel
->r_addend
);
1235 /* Relocate an AVR ELF section. */
1238 elf32_avr_relocate_section (bfd
*output_bfd ATTRIBUTE_UNUSED
,
1239 struct bfd_link_info
*info
,
1241 asection
*input_section
,
1243 Elf_Internal_Rela
*relocs
,
1244 Elf_Internal_Sym
*local_syms
,
1245 asection
**local_sections
)
1247 Elf_Internal_Shdr
* symtab_hdr
;
1248 struct elf_link_hash_entry
** sym_hashes
;
1249 Elf_Internal_Rela
* rel
;
1250 Elf_Internal_Rela
* relend
;
1251 struct elf32_avr_link_hash_table
* htab
= avr_link_hash_table (info
);
1256 symtab_hdr
= & elf_tdata (input_bfd
)->symtab_hdr
;
1257 sym_hashes
= elf_sym_hashes (input_bfd
);
1258 relend
= relocs
+ input_section
->reloc_count
;
1260 for (rel
= relocs
; rel
< relend
; rel
++)
1262 reloc_howto_type
* howto
;
1263 unsigned long r_symndx
;
1264 Elf_Internal_Sym
* sym
;
1266 struct elf_link_hash_entry
* h
;
1268 bfd_reloc_status_type r
;
1272 r_type
= ELF32_R_TYPE (rel
->r_info
);
1273 r_symndx
= ELF32_R_SYM (rel
->r_info
);
1274 howto
= elf_avr_howto_table
+ r_type
;
1279 if (r_symndx
< symtab_hdr
->sh_info
)
1281 sym
= local_syms
+ r_symndx
;
1282 sec
= local_sections
[r_symndx
];
1283 relocation
= _bfd_elf_rela_local_sym (output_bfd
, sym
, &sec
, rel
);
1285 name
= bfd_elf_string_from_elf_section
1286 (input_bfd
, symtab_hdr
->sh_link
, sym
->st_name
);
1287 name
= (name
== NULL
) ? bfd_section_name (input_bfd
, sec
) : name
;
1291 bfd_boolean unresolved_reloc
, warned
, ignored
;
1293 RELOC_FOR_GLOBAL_SYMBOL (info
, input_bfd
, input_section
, rel
,
1294 r_symndx
, symtab_hdr
, sym_hashes
,
1296 unresolved_reloc
, warned
, ignored
);
1298 name
= h
->root
.root
.string
;
1301 if (sec
!= NULL
&& discarded_section (sec
))
1302 RELOC_AGAINST_DISCARDED_SECTION (info
, input_bfd
, input_section
,
1303 rel
, 1, relend
, howto
, 0, contents
);
1305 if (info
->relocatable
)
1308 r
= avr_final_link_relocate (howto
, input_bfd
, input_section
,
1309 contents
, rel
, relocation
, htab
);
1311 if (r
!= bfd_reloc_ok
)
1313 const char * msg
= (const char *) NULL
;
1317 case bfd_reloc_overflow
:
1318 r
= info
->callbacks
->reloc_overflow
1319 (info
, (h
? &h
->root
: NULL
),
1320 name
, howto
->name
, (bfd_vma
) 0,
1321 input_bfd
, input_section
, rel
->r_offset
);
1324 case bfd_reloc_undefined
:
1325 r
= info
->callbacks
->undefined_symbol
1326 (info
, name
, input_bfd
, input_section
, rel
->r_offset
, TRUE
);
1329 case bfd_reloc_outofrange
:
1330 msg
= _("internal error: out of range error");
1333 case bfd_reloc_notsupported
:
1334 msg
= _("internal error: unsupported relocation error");
1337 case bfd_reloc_dangerous
:
1338 msg
= _("internal error: dangerous relocation");
1342 msg
= _("internal error: unknown error");
1347 r
= info
->callbacks
->warning
1348 (info
, msg
, name
, input_bfd
, input_section
, rel
->r_offset
);
1358 /* The final processing done just before writing out a AVR ELF object
1359 file. This gets the AVR architecture right based on the machine
1363 bfd_elf_avr_final_write_processing (bfd
*abfd
,
1364 bfd_boolean linker ATTRIBUTE_UNUSED
)
1368 switch (bfd_get_mach (abfd
))
1372 val
= E_AVR_MACH_AVR2
;
1376 val
= E_AVR_MACH_AVR1
;
1379 case bfd_mach_avr25
:
1380 val
= E_AVR_MACH_AVR25
;
1384 val
= E_AVR_MACH_AVR3
;
1387 case bfd_mach_avr31
:
1388 val
= E_AVR_MACH_AVR31
;
1391 case bfd_mach_avr35
:
1392 val
= E_AVR_MACH_AVR35
;
1396 val
= E_AVR_MACH_AVR4
;
1400 val
= E_AVR_MACH_AVR5
;
1403 case bfd_mach_avr51
:
1404 val
= E_AVR_MACH_AVR51
;
1408 val
= E_AVR_MACH_AVR6
;
1411 case bfd_mach_avrxmega1
:
1412 val
= E_AVR_MACH_XMEGA1
;
1415 case bfd_mach_avrxmega2
:
1416 val
= E_AVR_MACH_XMEGA2
;
1419 case bfd_mach_avrxmega3
:
1420 val
= E_AVR_MACH_XMEGA3
;
1423 case bfd_mach_avrxmega4
:
1424 val
= E_AVR_MACH_XMEGA4
;
1427 case bfd_mach_avrxmega5
:
1428 val
= E_AVR_MACH_XMEGA5
;
1431 case bfd_mach_avrxmega6
:
1432 val
= E_AVR_MACH_XMEGA6
;
1435 case bfd_mach_avrxmega7
:
1436 val
= E_AVR_MACH_XMEGA7
;
1440 elf_elfheader (abfd
)->e_machine
= EM_AVR
;
1441 elf_elfheader (abfd
)->e_flags
&= ~ EF_AVR_MACH
;
1442 elf_elfheader (abfd
)->e_flags
|= val
;
1443 elf_elfheader (abfd
)->e_flags
|= EF_AVR_LINKRELAX_PREPARED
;
1446 /* Set the right machine number. */
1449 elf32_avr_object_p (bfd
*abfd
)
1451 unsigned int e_set
= bfd_mach_avr2
;
1453 if (elf_elfheader (abfd
)->e_machine
== EM_AVR
1454 || elf_elfheader (abfd
)->e_machine
== EM_AVR_OLD
)
1456 int e_mach
= elf_elfheader (abfd
)->e_flags
& EF_AVR_MACH
;
1461 case E_AVR_MACH_AVR2
:
1462 e_set
= bfd_mach_avr2
;
1465 case E_AVR_MACH_AVR1
:
1466 e_set
= bfd_mach_avr1
;
1469 case E_AVR_MACH_AVR25
:
1470 e_set
= bfd_mach_avr25
;
1473 case E_AVR_MACH_AVR3
:
1474 e_set
= bfd_mach_avr3
;
1477 case E_AVR_MACH_AVR31
:
1478 e_set
= bfd_mach_avr31
;
1481 case E_AVR_MACH_AVR35
:
1482 e_set
= bfd_mach_avr35
;
1485 case E_AVR_MACH_AVR4
:
1486 e_set
= bfd_mach_avr4
;
1489 case E_AVR_MACH_AVR5
:
1490 e_set
= bfd_mach_avr5
;
1493 case E_AVR_MACH_AVR51
:
1494 e_set
= bfd_mach_avr51
;
1497 case E_AVR_MACH_AVR6
:
1498 e_set
= bfd_mach_avr6
;
1501 case E_AVR_MACH_XMEGA1
:
1502 e_set
= bfd_mach_avrxmega1
;
1505 case E_AVR_MACH_XMEGA2
:
1506 e_set
= bfd_mach_avrxmega2
;
1509 case E_AVR_MACH_XMEGA3
:
1510 e_set
= bfd_mach_avrxmega3
;
1513 case E_AVR_MACH_XMEGA4
:
1514 e_set
= bfd_mach_avrxmega4
;
1517 case E_AVR_MACH_XMEGA5
:
1518 e_set
= bfd_mach_avrxmega5
;
1521 case E_AVR_MACH_XMEGA6
:
1522 e_set
= bfd_mach_avrxmega6
;
1525 case E_AVR_MACH_XMEGA7
:
1526 e_set
= bfd_mach_avrxmega7
;
1530 return bfd_default_set_arch_mach (abfd
, bfd_arch_avr
,
1534 /* Returns whether the relocation type passed is a diff reloc. */
1537 elf32_avr_is_diff_reloc (Elf_Internal_Rela
*irel
)
1539 return (ELF32_R_TYPE (irel
->r_info
) == R_AVR_DIFF8
1540 ||ELF32_R_TYPE (irel
->r_info
) == R_AVR_DIFF16
1541 || ELF32_R_TYPE (irel
->r_info
) == R_AVR_DIFF32
);
1544 /* Reduce the diff value written in the section by count if the shrinked
1545 insn address happens to fall between the two symbols for which this
1546 diff reloc was emitted. */
1549 elf32_avr_adjust_diff_reloc_value (bfd
*abfd
,
1550 struct bfd_section
*isec
,
1551 Elf_Internal_Rela
*irel
,
1553 bfd_vma shrinked_insn_address
,
1556 unsigned char *reloc_contents
= NULL
;
1557 unsigned char *isec_contents
= elf_section_data (isec
)->this_hdr
.contents
;
1558 if (isec_contents
== NULL
)
1560 if (! bfd_malloc_and_get_section (abfd
, isec
, &isec_contents
))
1563 elf_section_data (isec
)->this_hdr
.contents
= isec_contents
;
1566 reloc_contents
= isec_contents
+ irel
->r_offset
;
1568 /* Read value written in object file. */
1570 switch (ELF32_R_TYPE (irel
->r_info
))
1574 x
= *reloc_contents
;
1579 x
= bfd_get_16 (abfd
, reloc_contents
);
1584 x
= bfd_get_32 (abfd
, reloc_contents
);
1593 /* For a diff reloc sym1 - sym2 the diff at assembly time (x) is written
1594 into the object file at the reloc offset. sym2's logical value is
1595 symval (<start_of_section>) + reloc addend. Compute the start and end
1596 addresses and check if the shrinked insn falls between sym1 and sym2. */
1598 bfd_vma end_address
= symval
+ irel
->r_addend
;
1599 bfd_vma start_address
= end_address
- x
;
1601 /* Reduce the diff value by count bytes and write it back into section
1604 if (shrinked_insn_address
>= start_address
&&
1605 shrinked_insn_address
<= end_address
)
1607 switch (ELF32_R_TYPE (irel
->r_info
))
1611 *reloc_contents
= (x
- count
);
1616 bfd_put_16 (abfd
, (x
- count
) & 0xFFFF, reloc_contents
);
1621 bfd_put_32 (abfd
, (x
- count
) & 0xFFFFFFFF, reloc_contents
);
1633 /* Delete some bytes from a section while changing the size of an instruction.
1634 The parameter "addr" denotes the section-relative offset pointing just
1635 behind the shrinked instruction. "addr+count" point at the first
1636 byte just behind the original unshrinked instruction. */
1639 elf32_avr_relax_delete_bytes (bfd
*abfd
,
1644 Elf_Internal_Shdr
*symtab_hdr
;
1645 unsigned int sec_shndx
;
1647 Elf_Internal_Rela
*irel
, *irelend
;
1648 Elf_Internal_Sym
*isym
;
1649 Elf_Internal_Sym
*isymbuf
= NULL
;
1651 struct elf_link_hash_entry
**sym_hashes
;
1652 struct elf_link_hash_entry
**end_hashes
;
1653 unsigned int symcount
;
1655 symtab_hdr
= &elf_tdata (abfd
)->symtab_hdr
;
1656 sec_shndx
= _bfd_elf_section_from_bfd_section (abfd
, sec
);
1657 contents
= elf_section_data (sec
)->this_hdr
.contents
;
1661 irel
= elf_section_data (sec
)->relocs
;
1662 irelend
= irel
+ sec
->reloc_count
;
1664 /* Actually delete the bytes. */
1665 if (toaddr
- addr
- count
> 0)
1666 memmove (contents
+ addr
, contents
+ addr
+ count
,
1667 (size_t) (toaddr
- addr
- count
));
1670 /* Adjust all the reloc addresses. */
1671 for (irel
= elf_section_data (sec
)->relocs
; irel
< irelend
; irel
++)
1673 bfd_vma old_reloc_address
;
1675 old_reloc_address
= (sec
->output_section
->vma
1676 + sec
->output_offset
+ irel
->r_offset
);
1678 /* Get the new reloc address. */
1679 if ((irel
->r_offset
> addr
1680 && irel
->r_offset
< toaddr
))
1683 printf ("Relocation at address 0x%x needs to be moved.\n"
1684 "Old section offset: 0x%x, New section offset: 0x%x \n",
1685 (unsigned int) old_reloc_address
,
1686 (unsigned int) irel
->r_offset
,
1687 (unsigned int) ((irel
->r_offset
) - count
));
1689 irel
->r_offset
-= count
;
1694 /* The reloc's own addresses are now ok. However, we need to readjust
1695 the reloc's addend, i.e. the reloc's value if two conditions are met:
1696 1.) the reloc is relative to a symbol in this section that
1697 is located in front of the shrinked instruction
1698 2.) symbol plus addend end up behind the shrinked instruction.
1700 The most common case where this happens are relocs relative to
1701 the section-start symbol.
1703 This step needs to be done for all of the sections of the bfd. */
1706 struct bfd_section
*isec
;
1708 for (isec
= abfd
->sections
; isec
; isec
= isec
->next
)
1711 bfd_vma shrinked_insn_address
;
1713 if (isec
->reloc_count
== 0)
1716 shrinked_insn_address
= (sec
->output_section
->vma
1717 + sec
->output_offset
+ addr
- count
);
1719 irel
= elf_section_data (isec
)->relocs
;
1720 /* PR 12161: Read in the relocs for this section if necessary. */
1722 irel
= _bfd_elf_link_read_relocs (abfd
, isec
, NULL
, NULL
, TRUE
);
1724 for (irelend
= irel
+ isec
->reloc_count
;
1728 /* Read this BFD's local symbols if we haven't done
1730 if (isymbuf
== NULL
&& symtab_hdr
->sh_info
!= 0)
1732 isymbuf
= (Elf_Internal_Sym
*) symtab_hdr
->contents
;
1733 if (isymbuf
== NULL
)
1734 isymbuf
= bfd_elf_get_elf_syms (abfd
, symtab_hdr
,
1735 symtab_hdr
->sh_info
, 0,
1737 if (isymbuf
== NULL
)
1741 /* Get the value of the symbol referred to by the reloc. */
1742 if (ELF32_R_SYM (irel
->r_info
) < symtab_hdr
->sh_info
)
1744 /* A local symbol. */
1747 isym
= isymbuf
+ ELF32_R_SYM (irel
->r_info
);
1748 sym_sec
= bfd_section_from_elf_index (abfd
, isym
->st_shndx
);
1749 symval
= isym
->st_value
;
1750 /* If the reloc is absolute, it will not have
1751 a symbol or section associated with it. */
1754 symval
+= sym_sec
->output_section
->vma
1755 + sym_sec
->output_offset
;
1758 printf ("Checking if the relocation's "
1759 "addend needs corrections.\n"
1760 "Address of anchor symbol: 0x%x \n"
1761 "Address of relocation target: 0x%x \n"
1762 "Address of relaxed insn: 0x%x \n",
1763 (unsigned int) symval
,
1764 (unsigned int) (symval
+ irel
->r_addend
),
1765 (unsigned int) shrinked_insn_address
);
1767 if (symval
<= shrinked_insn_address
1768 && (symval
+ irel
->r_addend
) > shrinked_insn_address
)
1770 if (elf32_avr_is_diff_reloc (irel
))
1772 elf32_avr_adjust_diff_reloc_value (abfd
, isec
, irel
,
1774 shrinked_insn_address
,
1778 irel
->r_addend
-= count
;
1781 printf ("Relocation's addend needed to be fixed \n");
1784 /* else...Reference symbol is absolute. No adjustment needed. */
1786 /* else...Reference symbol is extern. No need for adjusting
1792 /* Adjust the local symbols defined in this section. */
1793 isym
= (Elf_Internal_Sym
*) symtab_hdr
->contents
;
1794 /* Fix PR 9841, there may be no local symbols. */
1797 Elf_Internal_Sym
*isymend
;
1799 isymend
= isym
+ symtab_hdr
->sh_info
;
1800 for (; isym
< isymend
; isym
++)
1802 if (isym
->st_shndx
== sec_shndx
1803 && isym
->st_value
> addr
1804 && isym
->st_value
< toaddr
)
1805 isym
->st_value
-= count
;
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
;
1817 if ((sym_hash
->root
.type
== bfd_link_hash_defined
1818 || sym_hash
->root
.type
== bfd_link_hash_defweak
)
1819 && sym_hash
->root
.u
.def
.section
== sec
1820 && sym_hash
->root
.u
.def
.value
> addr
1821 && sym_hash
->root
.u
.def
.value
< toaddr
)
1823 sym_hash
->root
.u
.def
.value
-= count
;
1830 /* This function handles relaxing for the avr.
1831 Many important relaxing opportunities within functions are already
1832 realized by the compiler itself.
1833 Here we try to replace call (4 bytes) -> rcall (2 bytes)
1834 and jump -> rjmp (safes also 2 bytes).
1835 As well we now optimize seqences of
1836 - call/rcall function
1841 . In case that within a sequence
1844 the ret could no longer be reached it is optimized away. In order
1845 to check if the ret is no longer needed, it is checked that the ret's address
1846 is not the target of a branch or jump within the same section, it is checked
1847 that there is no skip instruction before the jmp/rjmp and that there
1848 is no local or global label place at the address of the ret.
1850 We refrain from relaxing within sections ".vectors" and
1851 ".jumptables" in order to maintain the position of the instructions.
1852 There, however, we substitute jmp/call by a sequence rjmp,nop/rcall,nop
1853 if possible. (In future one could possibly use the space of the nop
1854 for the first instruction of the irq service function.
1856 The .jumptables sections is meant to be used for a future tablejump variant
1857 for the devices with 3-byte program counter where the table itself
1858 contains 4-byte jump instructions whose relative offset must not
1862 elf32_avr_relax_section (bfd
*abfd
,
1864 struct bfd_link_info
*link_info
,
1867 Elf_Internal_Shdr
*symtab_hdr
;
1868 Elf_Internal_Rela
*internal_relocs
;
1869 Elf_Internal_Rela
*irel
, *irelend
;
1870 bfd_byte
*contents
= NULL
;
1871 Elf_Internal_Sym
*isymbuf
= NULL
;
1872 struct elf32_avr_link_hash_table
*htab
;
1874 /* If 'shrinkable' is FALSE, do not shrink by deleting bytes while
1875 relaxing. Such shrinking can cause issues for the sections such
1876 as .vectors and .jumptables. Instead the unused bytes should be
1877 filled with nop instructions. */
1878 bfd_boolean shrinkable
= TRUE
;
1880 if (!strcmp (sec
->name
,".vectors")
1881 || !strcmp (sec
->name
,".jumptables"))
1884 if (link_info
->relocatable
)
1885 (*link_info
->callbacks
->einfo
)
1886 (_("%P%F: --relax and -r may not be used together\n"));
1888 htab
= avr_link_hash_table (link_info
);
1892 /* Assume nothing changes. */
1895 if ((!htab
->no_stubs
) && (sec
== htab
->stub_sec
))
1897 /* We are just relaxing the stub section.
1898 Let's calculate the size needed again. */
1899 bfd_size_type last_estimated_stub_section_size
= htab
->stub_sec
->size
;
1902 printf ("Relaxing the stub section. Size prior to this pass: %i\n",
1903 (int) last_estimated_stub_section_size
);
1905 elf32_avr_size_stubs (htab
->stub_sec
->output_section
->owner
,
1908 /* Check if the number of trampolines changed. */
1909 if (last_estimated_stub_section_size
!= htab
->stub_sec
->size
)
1913 printf ("Size of stub section after this pass: %i\n",
1914 (int) htab
->stub_sec
->size
);
1919 /* We don't have to do anything for a relocatable link, if
1920 this section does not have relocs, or if this is not a
1922 if (link_info
->relocatable
1923 || (sec
->flags
& SEC_RELOC
) == 0
1924 || sec
->reloc_count
== 0
1925 || (sec
->flags
& SEC_CODE
) == 0)
1928 /* Check if the object file to relax uses internal symbols so that we
1929 could fix up the relocations. */
1930 if (!(elf_elfheader (abfd
)->e_flags
& EF_AVR_LINKRELAX_PREPARED
))
1933 symtab_hdr
= &elf_tdata (abfd
)->symtab_hdr
;
1935 /* Get a copy of the native relocations. */
1936 internal_relocs
= (_bfd_elf_link_read_relocs
1937 (abfd
, sec
, NULL
, NULL
, link_info
->keep_memory
));
1938 if (internal_relocs
== NULL
)
1941 /* Walk through the relocs looking for relaxing opportunities. */
1942 irelend
= internal_relocs
+ sec
->reloc_count
;
1943 for (irel
= internal_relocs
; irel
< irelend
; irel
++)
1947 if ( ELF32_R_TYPE (irel
->r_info
) != R_AVR_13_PCREL
1948 && ELF32_R_TYPE (irel
->r_info
) != R_AVR_7_PCREL
1949 && ELF32_R_TYPE (irel
->r_info
) != R_AVR_CALL
)
1952 /* Get the section contents if we haven't done so already. */
1953 if (contents
== NULL
)
1955 /* Get cached copy if it exists. */
1956 if (elf_section_data (sec
)->this_hdr
.contents
!= NULL
)
1957 contents
= elf_section_data (sec
)->this_hdr
.contents
;
1960 /* Go get them off disk. */
1961 if (! bfd_malloc_and_get_section (abfd
, sec
, &contents
))
1966 /* Read this BFD's local symbols if we haven't done so already. */
1967 if (isymbuf
== NULL
&& symtab_hdr
->sh_info
!= 0)
1969 isymbuf
= (Elf_Internal_Sym
*) symtab_hdr
->contents
;
1970 if (isymbuf
== NULL
)
1971 isymbuf
= bfd_elf_get_elf_syms (abfd
, symtab_hdr
,
1972 symtab_hdr
->sh_info
, 0,
1974 if (isymbuf
== NULL
)
1979 /* Get the value of the symbol referred to by the reloc. */
1980 if (ELF32_R_SYM (irel
->r_info
) < symtab_hdr
->sh_info
)
1982 /* A local symbol. */
1983 Elf_Internal_Sym
*isym
;
1986 isym
= isymbuf
+ ELF32_R_SYM (irel
->r_info
);
1987 sym_sec
= bfd_section_from_elf_index (abfd
, isym
->st_shndx
);
1988 symval
= isym
->st_value
;
1989 /* If the reloc is absolute, it will not have
1990 a symbol or section associated with it. */
1992 symval
+= sym_sec
->output_section
->vma
1993 + sym_sec
->output_offset
;
1998 struct elf_link_hash_entry
*h
;
2000 /* An external symbol. */
2001 indx
= ELF32_R_SYM (irel
->r_info
) - symtab_hdr
->sh_info
;
2002 h
= elf_sym_hashes (abfd
)[indx
];
2003 BFD_ASSERT (h
!= NULL
);
2004 if (h
->root
.type
!= bfd_link_hash_defined
2005 && h
->root
.type
!= bfd_link_hash_defweak
)
2006 /* This appears to be a reference to an undefined
2007 symbol. Just ignore it--it will be caught by the
2008 regular reloc processing. */
2011 symval
= (h
->root
.u
.def
.value
2012 + h
->root
.u
.def
.section
->output_section
->vma
2013 + h
->root
.u
.def
.section
->output_offset
);
2016 /* For simplicity of coding, we are going to modify the section
2017 contents, the section relocs, and the BFD symbol table. We
2018 must tell the rest of the code not to free up this
2019 information. It would be possible to instead create a table
2020 of changes which have to be made, as is done in coff-mips.c;
2021 that would be more work, but would require less memory when
2022 the linker is run. */
2023 switch (ELF32_R_TYPE (irel
->r_info
))
2025 /* Try to turn a 22-bit absolute call/jump into an 13-bit
2026 pc-relative rcall/rjmp. */
2029 bfd_vma value
= symval
+ irel
->r_addend
;
2031 int distance_short_enough
= 0;
2033 /* Get the address of this instruction. */
2034 dot
= (sec
->output_section
->vma
2035 + sec
->output_offset
+ irel
->r_offset
);
2037 /* Compute the distance from this insn to the branch target. */
2040 /* Check if the gap falls in the range that can be accommodated
2041 in 13bits signed (It is 12bits when encoded, as we deal with
2042 word addressing). */
2043 if (!shrinkable
&& ((int) gap
>= -4096 && (int) gap
<= 4095))
2044 distance_short_enough
= 1;
2045 /* If shrinkable, then we can check for a range of distance which
2046 is two bytes farther on both the directions because the call
2047 or jump target will be closer by two bytes after the
2049 else if (shrinkable
&& ((int) gap
>= -4094 && (int) gap
<= 4097))
2050 distance_short_enough
= 1;
2052 /* Here we handle the wrap-around case. E.g. for a 16k device
2053 we could use a rjmp to jump from address 0x100 to 0x3d00!
2054 In order to make this work properly, we need to fill the
2055 vaiable avr_pc_wrap_around with the appropriate value.
2056 I.e. 0x4000 for a 16k device. */
2058 /* Shrinking the code size makes the gaps larger in the
2059 case of wrap-arounds. So we use a heuristical safety
2060 margin to avoid that during relax the distance gets
2061 again too large for the short jumps. Let's assume
2062 a typical code-size reduction due to relax for a
2063 16k device of 600 bytes. So let's use twice the
2064 typical value as safety margin. */
2068 int assumed_shrink
= 600;
2069 if (avr_pc_wrap_around
> 0x4000)
2070 assumed_shrink
= 900;
2072 safety_margin
= 2 * assumed_shrink
;
2074 rgap
= avr_relative_distance_considering_wrap_around (gap
);
2076 if (rgap
>= (-4092 + safety_margin
)
2077 && rgap
<= (4094 - safety_margin
))
2078 distance_short_enough
= 1;
2081 if (distance_short_enough
)
2083 unsigned char code_msb
;
2084 unsigned char code_lsb
;
2087 printf ("shrinking jump/call instruction at address 0x%x"
2088 " in section %s\n\n",
2089 (int) dot
, sec
->name
);
2091 /* Note that we've changed the relocs, section contents,
2093 elf_section_data (sec
)->relocs
= internal_relocs
;
2094 elf_section_data (sec
)->this_hdr
.contents
= contents
;
2095 symtab_hdr
->contents
= (unsigned char *) isymbuf
;
2097 /* Get the instruction code for relaxing. */
2098 code_lsb
= bfd_get_8 (abfd
, contents
+ irel
->r_offset
);
2099 code_msb
= bfd_get_8 (abfd
, contents
+ irel
->r_offset
+ 1);
2101 /* Mask out the relocation bits. */
2104 if (code_msb
== 0x94 && code_lsb
== 0x0E)
2106 /* we are changing call -> rcall . */
2107 bfd_put_8 (abfd
, 0x00, contents
+ irel
->r_offset
);
2108 bfd_put_8 (abfd
, 0xD0, contents
+ irel
->r_offset
+ 1);
2110 else if (code_msb
== 0x94 && code_lsb
== 0x0C)
2112 /* we are changeing jump -> rjmp. */
2113 bfd_put_8 (abfd
, 0x00, contents
+ irel
->r_offset
);
2114 bfd_put_8 (abfd
, 0xC0, contents
+ irel
->r_offset
+ 1);
2119 /* Fix the relocation's type. */
2120 irel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
),
2123 /* We should not modify the ordering if 'shrinkable' is
2127 /* Let's insert a nop. */
2128 bfd_put_8 (abfd
, 0x00, contents
+ irel
->r_offset
+ 2);
2129 bfd_put_8 (abfd
, 0x00, contents
+ irel
->r_offset
+ 3);
2133 /* Delete two bytes of data. */
2134 if (!elf32_avr_relax_delete_bytes (abfd
, sec
,
2135 irel
->r_offset
+ 2, 2))
2138 /* That will change things, so, we should relax again.
2139 Note that this is not required, and it may be slow. */
2147 unsigned char code_msb
;
2148 unsigned char code_lsb
;
2151 code_msb
= bfd_get_8 (abfd
, contents
+ irel
->r_offset
+ 1);
2152 code_lsb
= bfd_get_8 (abfd
, contents
+ irel
->r_offset
+ 0);
2154 /* Get the address of this instruction. */
2155 dot
= (sec
->output_section
->vma
2156 + sec
->output_offset
+ irel
->r_offset
);
2158 /* Here we look for rcall/ret or call/ret sequences that could be
2159 safely replaced by rjmp/ret or jmp/ret. */
2160 if (((code_msb
& 0xf0) == 0xd0)
2161 && avr_replace_call_ret_sequences
)
2163 /* This insn is a rcall. */
2164 unsigned char next_insn_msb
= 0;
2165 unsigned char next_insn_lsb
= 0;
2167 if (irel
->r_offset
+ 3 < sec
->size
)
2170 bfd_get_8 (abfd
, contents
+ irel
->r_offset
+ 3);
2172 bfd_get_8 (abfd
, contents
+ irel
->r_offset
+ 2);
2175 if ((0x95 == next_insn_msb
) && (0x08 == next_insn_lsb
))
2177 /* The next insn is a ret. We now convert the rcall insn
2178 into a rjmp instruction. */
2180 bfd_put_8 (abfd
, code_msb
, contents
+ irel
->r_offset
+ 1);
2182 printf ("converted rcall/ret sequence at address 0x%x"
2183 " into rjmp/ret sequence. Section is %s\n\n",
2184 (int) dot
, sec
->name
);
2189 else if ((0x94 == (code_msb
& 0xfe))
2190 && (0x0e == (code_lsb
& 0x0e))
2191 && avr_replace_call_ret_sequences
)
2193 /* This insn is a call. */
2194 unsigned char next_insn_msb
= 0;
2195 unsigned char next_insn_lsb
= 0;
2197 if (irel
->r_offset
+ 5 < sec
->size
)
2200 bfd_get_8 (abfd
, contents
+ irel
->r_offset
+ 5);
2202 bfd_get_8 (abfd
, contents
+ irel
->r_offset
+ 4);
2205 if ((0x95 == next_insn_msb
) && (0x08 == next_insn_lsb
))
2207 /* The next insn is a ret. We now convert the call insn
2208 into a jmp instruction. */
2211 bfd_put_8 (abfd
, code_lsb
, contents
+ irel
->r_offset
);
2213 printf ("converted call/ret sequence at address 0x%x"
2214 " into jmp/ret sequence. Section is %s\n\n",
2215 (int) dot
, sec
->name
);
2220 else if ((0xc0 == (code_msb
& 0xf0))
2221 || ((0x94 == (code_msb
& 0xfe))
2222 && (0x0c == (code_lsb
& 0x0e))))
2224 /* This insn is a rjmp or a jmp. */
2225 unsigned char next_insn_msb
= 0;
2226 unsigned char next_insn_lsb
= 0;
2229 if (0xc0 == (code_msb
& 0xf0))
2230 insn_size
= 2; /* rjmp insn */
2232 insn_size
= 4; /* jmp insn */
2234 if (irel
->r_offset
+ insn_size
+ 1 < sec
->size
)
2237 bfd_get_8 (abfd
, contents
+ irel
->r_offset
2240 bfd_get_8 (abfd
, contents
+ irel
->r_offset
2244 if ((0x95 == next_insn_msb
) && (0x08 == next_insn_lsb
))
2246 /* The next insn is a ret. We possibly could delete
2247 this ret. First we need to check for preceding
2248 sbis/sbic/sbrs or cpse "skip" instructions. */
2250 int there_is_preceding_non_skip_insn
= 1;
2251 bfd_vma address_of_ret
;
2253 address_of_ret
= dot
+ insn_size
;
2255 if (debug_relax
&& (insn_size
== 2))
2256 printf ("found rjmp / ret sequence at address 0x%x\n",
2258 if (debug_relax
&& (insn_size
== 4))
2259 printf ("found jmp / ret sequence at address 0x%x\n",
2262 /* We have to make sure that there is a preceding insn. */
2263 if (irel
->r_offset
>= 2)
2265 unsigned char preceding_msb
;
2266 unsigned char preceding_lsb
;
2269 bfd_get_8 (abfd
, contents
+ irel
->r_offset
- 1);
2271 bfd_get_8 (abfd
, contents
+ irel
->r_offset
- 2);
2274 if (0x99 == preceding_msb
)
2275 there_is_preceding_non_skip_insn
= 0;
2278 if (0x9b == preceding_msb
)
2279 there_is_preceding_non_skip_insn
= 0;
2282 if ((0xfc == (preceding_msb
& 0xfe)
2283 && (0x00 == (preceding_lsb
& 0x08))))
2284 there_is_preceding_non_skip_insn
= 0;
2287 if ((0xfe == (preceding_msb
& 0xfe)
2288 && (0x00 == (preceding_lsb
& 0x08))))
2289 there_is_preceding_non_skip_insn
= 0;
2292 if (0x10 == (preceding_msb
& 0xfc))
2293 there_is_preceding_non_skip_insn
= 0;
2295 if (there_is_preceding_non_skip_insn
== 0)
2297 printf ("preceding skip insn prevents deletion of"
2298 " ret insn at Addy 0x%x in section %s\n",
2299 (int) dot
+ 2, sec
->name
);
2303 /* There is no previous instruction. */
2304 there_is_preceding_non_skip_insn
= 0;
2307 if (there_is_preceding_non_skip_insn
)
2309 /* We now only have to make sure that there is no
2310 local label defined at the address of the ret
2311 instruction and that there is no local relocation
2312 in this section pointing to the ret. */
2314 int deleting_ret_is_safe
= 1;
2315 unsigned int section_offset_of_ret_insn
=
2316 irel
->r_offset
+ insn_size
;
2317 Elf_Internal_Sym
*isym
, *isymend
;
2318 unsigned int sec_shndx
;
2319 struct bfd_section
*isec
;
2322 _bfd_elf_section_from_bfd_section (abfd
, sec
);
2324 /* Check for local symbols. */
2325 isym
= (Elf_Internal_Sym
*) symtab_hdr
->contents
;
2326 isymend
= isym
+ symtab_hdr
->sh_info
;
2327 /* PR 6019: There may not be any local symbols. */
2328 for (; isym
!= NULL
&& isym
< isymend
; isym
++)
2330 if (isym
->st_value
== section_offset_of_ret_insn
2331 && isym
->st_shndx
== sec_shndx
)
2333 deleting_ret_is_safe
= 0;
2335 printf ("local label prevents deletion of ret "
2336 "insn at address 0x%x\n",
2337 (int) dot
+ insn_size
);
2341 /* Now check for global symbols. */
2344 struct elf_link_hash_entry
**sym_hashes
;
2345 struct elf_link_hash_entry
**end_hashes
;
2347 symcount
= (symtab_hdr
->sh_size
2348 / sizeof (Elf32_External_Sym
)
2349 - symtab_hdr
->sh_info
);
2350 sym_hashes
= elf_sym_hashes (abfd
);
2351 end_hashes
= sym_hashes
+ symcount
;
2352 for (; sym_hashes
< end_hashes
; sym_hashes
++)
2354 struct elf_link_hash_entry
*sym_hash
=
2356 if ((sym_hash
->root
.type
== bfd_link_hash_defined
2357 || sym_hash
->root
.type
==
2358 bfd_link_hash_defweak
)
2359 && sym_hash
->root
.u
.def
.section
== sec
2360 && sym_hash
->root
.u
.def
.value
== section_offset_of_ret_insn
)
2362 deleting_ret_is_safe
= 0;
2364 printf ("global label prevents deletion of "
2365 "ret insn at address 0x%x\n",
2366 (int) dot
+ insn_size
);
2371 /* Now we check for relocations pointing to ret. */
2372 for (isec
= abfd
->sections
; isec
&& deleting_ret_is_safe
; isec
= isec
->next
)
2374 Elf_Internal_Rela
*rel
;
2375 Elf_Internal_Rela
*relend
;
2377 rel
= elf_section_data (isec
)->relocs
;
2379 rel
= _bfd_elf_link_read_relocs (abfd
, isec
, NULL
, NULL
, TRUE
);
2381 relend
= rel
+ isec
->reloc_count
;
2383 for (; rel
&& rel
< relend
; rel
++)
2385 bfd_vma reloc_target
= 0;
2387 /* Read this BFD's local symbols if we haven't
2389 if (isymbuf
== NULL
&& symtab_hdr
->sh_info
!= 0)
2391 isymbuf
= (Elf_Internal_Sym
*)
2392 symtab_hdr
->contents
;
2393 if (isymbuf
== NULL
)
2394 isymbuf
= bfd_elf_get_elf_syms
2397 symtab_hdr
->sh_info
, 0,
2399 if (isymbuf
== NULL
)
2403 /* Get the value of the symbol referred to
2405 if (ELF32_R_SYM (rel
->r_info
)
2406 < symtab_hdr
->sh_info
)
2408 /* A local symbol. */
2412 + ELF32_R_SYM (rel
->r_info
);
2413 sym_sec
= bfd_section_from_elf_index
2414 (abfd
, isym
->st_shndx
);
2415 symval
= isym
->st_value
;
2417 /* If the reloc is absolute, it will not
2418 have a symbol or section associated
2424 sym_sec
->output_section
->vma
2425 + sym_sec
->output_offset
;
2426 reloc_target
= symval
+ rel
->r_addend
;
2430 reloc_target
= symval
+ rel
->r_addend
;
2431 /* Reference symbol is absolute. */
2434 /* else ... reference symbol is extern. */
2436 if (address_of_ret
== reloc_target
)
2438 deleting_ret_is_safe
= 0;
2441 "rjmp/jmp ret sequence at address"
2442 " 0x%x could not be deleted. ret"
2443 " is target of a relocation.\n",
2444 (int) address_of_ret
);
2450 if (deleting_ret_is_safe
)
2453 printf ("unreachable ret instruction "
2454 "at address 0x%x deleted.\n",
2455 (int) dot
+ insn_size
);
2457 /* Delete two bytes of data. */
2458 if (!elf32_avr_relax_delete_bytes (abfd
, sec
,
2459 irel
->r_offset
+ insn_size
, 2))
2462 /* That will change things, so, we should relax
2463 again. Note that this is not required, and it
2476 if (contents
!= NULL
2477 && elf_section_data (sec
)->this_hdr
.contents
!= contents
)
2479 if (! link_info
->keep_memory
)
2483 /* Cache the section contents for elf_link_input_bfd. */
2484 elf_section_data (sec
)->this_hdr
.contents
= contents
;
2488 if (internal_relocs
!= NULL
2489 && elf_section_data (sec
)->relocs
!= internal_relocs
)
2490 free (internal_relocs
);
2496 && symtab_hdr
->contents
!= (unsigned char *) isymbuf
)
2498 if (contents
!= NULL
2499 && elf_section_data (sec
)->this_hdr
.contents
!= contents
)
2501 if (internal_relocs
!= NULL
2502 && elf_section_data (sec
)->relocs
!= internal_relocs
)
2503 free (internal_relocs
);
2508 /* This is a version of bfd_generic_get_relocated_section_contents
2509 which uses elf32_avr_relocate_section.
2511 For avr it's essentially a cut and paste taken from the H8300 port.
2512 The author of the relaxation support patch for avr had absolutely no
2513 clue what is happening here but found out that this part of the code
2514 seems to be important. */
2517 elf32_avr_get_relocated_section_contents (bfd
*output_bfd
,
2518 struct bfd_link_info
*link_info
,
2519 struct bfd_link_order
*link_order
,
2521 bfd_boolean relocatable
,
2524 Elf_Internal_Shdr
*symtab_hdr
;
2525 asection
*input_section
= link_order
->u
.indirect
.section
;
2526 bfd
*input_bfd
= input_section
->owner
;
2527 asection
**sections
= NULL
;
2528 Elf_Internal_Rela
*internal_relocs
= NULL
;
2529 Elf_Internal_Sym
*isymbuf
= NULL
;
2531 /* We only need to handle the case of relaxing, or of having a
2532 particular set of section contents, specially. */
2534 || elf_section_data (input_section
)->this_hdr
.contents
== NULL
)
2535 return bfd_generic_get_relocated_section_contents (output_bfd
, link_info
,
2539 symtab_hdr
= &elf_tdata (input_bfd
)->symtab_hdr
;
2541 memcpy (data
, elf_section_data (input_section
)->this_hdr
.contents
,
2542 (size_t) input_section
->size
);
2544 if ((input_section
->flags
& SEC_RELOC
) != 0
2545 && input_section
->reloc_count
> 0)
2548 Elf_Internal_Sym
*isym
, *isymend
;
2551 internal_relocs
= (_bfd_elf_link_read_relocs
2552 (input_bfd
, input_section
, NULL
, NULL
, FALSE
));
2553 if (internal_relocs
== NULL
)
2556 if (symtab_hdr
->sh_info
!= 0)
2558 isymbuf
= (Elf_Internal_Sym
*) symtab_hdr
->contents
;
2559 if (isymbuf
== NULL
)
2560 isymbuf
= bfd_elf_get_elf_syms (input_bfd
, symtab_hdr
,
2561 symtab_hdr
->sh_info
, 0,
2563 if (isymbuf
== NULL
)
2567 amt
= symtab_hdr
->sh_info
;
2568 amt
*= sizeof (asection
*);
2569 sections
= bfd_malloc (amt
);
2570 if (sections
== NULL
&& amt
!= 0)
2573 isymend
= isymbuf
+ symtab_hdr
->sh_info
;
2574 for (isym
= isymbuf
, secpp
= sections
; isym
< isymend
; ++isym
, ++secpp
)
2578 if (isym
->st_shndx
== SHN_UNDEF
)
2579 isec
= bfd_und_section_ptr
;
2580 else if (isym
->st_shndx
== SHN_ABS
)
2581 isec
= bfd_abs_section_ptr
;
2582 else if (isym
->st_shndx
== SHN_COMMON
)
2583 isec
= bfd_com_section_ptr
;
2585 isec
= bfd_section_from_elf_index (input_bfd
, isym
->st_shndx
);
2590 if (! elf32_avr_relocate_section (output_bfd
, link_info
, input_bfd
,
2591 input_section
, data
, internal_relocs
,
2595 if (sections
!= NULL
)
2598 && symtab_hdr
->contents
!= (unsigned char *) isymbuf
)
2600 if (elf_section_data (input_section
)->relocs
!= internal_relocs
)
2601 free (internal_relocs
);
2607 if (sections
!= NULL
)
2610 && symtab_hdr
->contents
!= (unsigned char *) isymbuf
)
2612 if (internal_relocs
!= NULL
2613 && elf_section_data (input_section
)->relocs
!= internal_relocs
)
2614 free (internal_relocs
);
2619 /* Determines the hash entry name for a particular reloc. It consists of
2620 the identifier of the symbol section and the added reloc addend and
2621 symbol offset relative to the section the symbol is attached to. */
2624 avr_stub_name (const asection
*symbol_section
,
2625 const bfd_vma symbol_offset
,
2626 const Elf_Internal_Rela
*rela
)
2631 len
= 8 + 1 + 8 + 1 + 1;
2632 stub_name
= bfd_malloc (len
);
2634 sprintf (stub_name
, "%08x+%08x",
2635 symbol_section
->id
& 0xffffffff,
2636 (unsigned int) ((rela
->r_addend
& 0xffffffff) + symbol_offset
));
2642 /* Add a new stub entry to the stub hash. Not all fields of the new
2643 stub entry are initialised. */
2645 static struct elf32_avr_stub_hash_entry
*
2646 avr_add_stub (const char *stub_name
,
2647 struct elf32_avr_link_hash_table
*htab
)
2649 struct elf32_avr_stub_hash_entry
*hsh
;
2651 /* Enter this entry into the linker stub hash table. */
2652 hsh
= avr_stub_hash_lookup (&htab
->bstab
, stub_name
, TRUE
, FALSE
);
2656 (*_bfd_error_handler
) (_("%B: cannot create stub entry %s"),
2661 hsh
->stub_offset
= 0;
2665 /* We assume that there is already space allocated for the stub section
2666 contents and that before building the stubs the section size is
2667 initialized to 0. We assume that within the stub hash table entry,
2668 the absolute position of the jmp target has been written in the
2669 target_value field. We write here the offset of the generated jmp insn
2670 relative to the trampoline section start to the stub_offset entry in
2671 the stub hash table entry. */
2674 avr_build_one_stub (struct bfd_hash_entry
*bh
, void *in_arg
)
2676 struct elf32_avr_stub_hash_entry
*hsh
;
2677 struct bfd_link_info
*info
;
2678 struct elf32_avr_link_hash_table
*htab
;
2685 bfd_vma jmp_insn
= 0x0000940c;
2687 /* Massage our args to the form they really have. */
2688 hsh
= avr_stub_hash_entry (bh
);
2690 if (!hsh
->is_actually_needed
)
2693 info
= (struct bfd_link_info
*) in_arg
;
2695 htab
= avr_link_hash_table (info
);
2699 target
= hsh
->target_value
;
2701 /* Make a note of the offset within the stubs for this entry. */
2702 hsh
->stub_offset
= htab
->stub_sec
->size
;
2703 loc
= htab
->stub_sec
->contents
+ hsh
->stub_offset
;
2705 stub_bfd
= htab
->stub_sec
->owner
;
2708 printf ("Building one Stub. Address: 0x%x, Offset: 0x%x\n",
2709 (unsigned int) target
,
2710 (unsigned int) hsh
->stub_offset
);
2712 /* We now have to add the information on the jump target to the bare
2713 opcode bits already set in jmp_insn. */
2715 /* Check for the alignment of the address. */
2719 starget
= target
>> 1;
2720 jmp_insn
|= ((starget
& 0x10000) | ((starget
<< 3) & 0x1f00000)) >> 16;
2721 bfd_put_16 (stub_bfd
, jmp_insn
, loc
);
2722 bfd_put_16 (stub_bfd
, (bfd_vma
) starget
& 0xffff, loc
+ 2);
2724 htab
->stub_sec
->size
+= 4;
2726 /* Now add the entries in the address mapping table if there is still
2731 nr
= htab
->amt_entry_cnt
+ 1;
2732 if (nr
<= htab
->amt_max_entry_cnt
)
2734 htab
->amt_entry_cnt
= nr
;
2736 htab
->amt_stub_offsets
[nr
- 1] = hsh
->stub_offset
;
2737 htab
->amt_destination_addr
[nr
- 1] = target
;
2745 avr_mark_stub_not_to_be_necessary (struct bfd_hash_entry
*bh
,
2746 void *in_arg ATTRIBUTE_UNUSED
)
2748 struct elf32_avr_stub_hash_entry
*hsh
;
2750 hsh
= avr_stub_hash_entry (bh
);
2751 hsh
->is_actually_needed
= FALSE
;
2757 avr_size_one_stub (struct bfd_hash_entry
*bh
, void *in_arg
)
2759 struct elf32_avr_stub_hash_entry
*hsh
;
2760 struct elf32_avr_link_hash_table
*htab
;
2763 /* Massage our args to the form they really have. */
2764 hsh
= avr_stub_hash_entry (bh
);
2767 if (hsh
->is_actually_needed
)
2772 htab
->stub_sec
->size
+= size
;
2777 elf32_avr_setup_params (struct bfd_link_info
*info
,
2779 asection
*avr_stub_section
,
2780 bfd_boolean no_stubs
,
2781 bfd_boolean deb_stubs
,
2782 bfd_boolean deb_relax
,
2783 bfd_vma pc_wrap_around
,
2784 bfd_boolean call_ret_replacement
)
2786 struct elf32_avr_link_hash_table
*htab
= avr_link_hash_table (info
);
2790 htab
->stub_sec
= avr_stub_section
;
2791 htab
->stub_bfd
= avr_stub_bfd
;
2792 htab
->no_stubs
= no_stubs
;
2794 debug_relax
= deb_relax
;
2795 debug_stubs
= deb_stubs
;
2796 avr_pc_wrap_around
= pc_wrap_around
;
2797 avr_replace_call_ret_sequences
= call_ret_replacement
;
2801 /* Set up various things so that we can make a list of input sections
2802 for each output section included in the link. Returns -1 on error,
2803 0 when no stubs will be needed, and 1 on success. It also sets
2804 information on the stubs bfd and the stub section in the info
2808 elf32_avr_setup_section_lists (bfd
*output_bfd
,
2809 struct bfd_link_info
*info
)
2812 unsigned int bfd_count
;
2813 int top_id
, top_index
;
2815 asection
**input_list
, **list
;
2817 struct elf32_avr_link_hash_table
*htab
= avr_link_hash_table (info
);
2819 if (htab
== NULL
|| htab
->no_stubs
)
2822 /* Count the number of input BFDs and find the top input section id. */
2823 for (input_bfd
= info
->input_bfds
, bfd_count
= 0, top_id
= 0;
2825 input_bfd
= input_bfd
->link
.next
)
2828 for (section
= input_bfd
->sections
;
2830 section
= section
->next
)
2831 if (top_id
< section
->id
)
2832 top_id
= section
->id
;
2835 htab
->bfd_count
= bfd_count
;
2837 /* We can't use output_bfd->section_count here to find the top output
2838 section index as some sections may have been removed, and
2839 strip_excluded_output_sections doesn't renumber the indices. */
2840 for (section
= output_bfd
->sections
, top_index
= 0;
2842 section
= section
->next
)
2843 if (top_index
< section
->index
)
2844 top_index
= section
->index
;
2846 htab
->top_index
= top_index
;
2847 amt
= sizeof (asection
*) * (top_index
+ 1);
2848 input_list
= bfd_malloc (amt
);
2849 htab
->input_list
= input_list
;
2850 if (input_list
== NULL
)
2853 /* For sections we aren't interested in, mark their entries with a
2854 value we can check later. */
2855 list
= input_list
+ top_index
;
2857 *list
= bfd_abs_section_ptr
;
2858 while (list
-- != input_list
);
2860 for (section
= output_bfd
->sections
;
2862 section
= section
->next
)
2863 if ((section
->flags
& SEC_CODE
) != 0)
2864 input_list
[section
->index
] = NULL
;
2870 /* Read in all local syms for all input bfds, and create hash entries
2871 for export stubs if we are building a multi-subspace shared lib.
2872 Returns -1 on error, 0 otherwise. */
2875 get_local_syms (bfd
*input_bfd
, struct bfd_link_info
*info
)
2877 unsigned int bfd_indx
;
2878 Elf_Internal_Sym
*local_syms
, **all_local_syms
;
2879 struct elf32_avr_link_hash_table
*htab
= avr_link_hash_table (info
);
2885 /* We want to read in symbol extension records only once. To do this
2886 we need to read in the local symbols in parallel and save them for
2887 later use; so hold pointers to the local symbols in an array. */
2888 amt
= sizeof (Elf_Internal_Sym
*) * htab
->bfd_count
;
2889 all_local_syms
= bfd_zmalloc (amt
);
2890 htab
->all_local_syms
= all_local_syms
;
2891 if (all_local_syms
== NULL
)
2894 /* Walk over all the input BFDs, swapping in local symbols.
2895 If we are creating a shared library, create hash entries for the
2899 input_bfd
= input_bfd
->link
.next
, bfd_indx
++)
2901 Elf_Internal_Shdr
*symtab_hdr
;
2903 /* We'll need the symbol table in a second. */
2904 symtab_hdr
= &elf_tdata (input_bfd
)->symtab_hdr
;
2905 if (symtab_hdr
->sh_info
== 0)
2908 /* We need an array of the local symbols attached to the input bfd. */
2909 local_syms
= (Elf_Internal_Sym
*) symtab_hdr
->contents
;
2910 if (local_syms
== NULL
)
2912 local_syms
= bfd_elf_get_elf_syms (input_bfd
, symtab_hdr
,
2913 symtab_hdr
->sh_info
, 0,
2915 /* Cache them for elf_link_input_bfd. */
2916 symtab_hdr
->contents
= (unsigned char *) local_syms
;
2918 if (local_syms
== NULL
)
2921 all_local_syms
[bfd_indx
] = local_syms
;
2927 #define ADD_DUMMY_STUBS_FOR_DEBUGGING 0
2930 elf32_avr_size_stubs (bfd
*output_bfd
,
2931 struct bfd_link_info
*info
,
2932 bfd_boolean is_prealloc_run
)
2934 struct elf32_avr_link_hash_table
*htab
;
2935 int stub_changed
= 0;
2937 htab
= avr_link_hash_table (info
);
2941 /* At this point we initialize htab->vector_base
2942 To the start of the text output section. */
2943 htab
->vector_base
= htab
->stub_sec
->output_section
->vma
;
2945 if (get_local_syms (info
->input_bfds
, info
))
2947 if (htab
->all_local_syms
)
2948 goto error_ret_free_local
;
2952 if (ADD_DUMMY_STUBS_FOR_DEBUGGING
)
2954 struct elf32_avr_stub_hash_entry
*test
;
2956 test
= avr_add_stub ("Hugo",htab
);
2957 test
->target_value
= 0x123456;
2958 test
->stub_offset
= 13;
2960 test
= avr_add_stub ("Hugo2",htab
);
2961 test
->target_value
= 0x84210;
2962 test
->stub_offset
= 14;
2968 unsigned int bfd_indx
;
2970 /* We will have to re-generate the stub hash table each time anything
2971 in memory has changed. */
2973 bfd_hash_traverse (&htab
->bstab
, avr_mark_stub_not_to_be_necessary
, htab
);
2974 for (input_bfd
= info
->input_bfds
, bfd_indx
= 0;
2976 input_bfd
= input_bfd
->link
.next
, bfd_indx
++)
2978 Elf_Internal_Shdr
*symtab_hdr
;
2980 Elf_Internal_Sym
*local_syms
;
2982 /* We'll need the symbol table in a second. */
2983 symtab_hdr
= &elf_tdata (input_bfd
)->symtab_hdr
;
2984 if (symtab_hdr
->sh_info
== 0)
2987 local_syms
= htab
->all_local_syms
[bfd_indx
];
2989 /* Walk over each section attached to the input bfd. */
2990 for (section
= input_bfd
->sections
;
2992 section
= section
->next
)
2994 Elf_Internal_Rela
*internal_relocs
, *irelaend
, *irela
;
2996 /* If there aren't any relocs, then there's nothing more
2998 if ((section
->flags
& SEC_RELOC
) == 0
2999 || section
->reloc_count
== 0)
3002 /* If this section is a link-once section that will be
3003 discarded, then don't create any stubs. */
3004 if (section
->output_section
== NULL
3005 || section
->output_section
->owner
!= output_bfd
)
3008 /* Get the relocs. */
3010 = _bfd_elf_link_read_relocs (input_bfd
, section
, NULL
, NULL
,
3012 if (internal_relocs
== NULL
)
3013 goto error_ret_free_local
;
3015 /* Now examine each relocation. */
3016 irela
= internal_relocs
;
3017 irelaend
= irela
+ section
->reloc_count
;
3018 for (; irela
< irelaend
; irela
++)
3020 unsigned int r_type
, r_indx
;
3021 struct elf32_avr_stub_hash_entry
*hsh
;
3024 bfd_vma destination
;
3025 struct elf_link_hash_entry
*hh
;
3028 r_type
= ELF32_R_TYPE (irela
->r_info
);
3029 r_indx
= ELF32_R_SYM (irela
->r_info
);
3031 /* Only look for 16 bit GS relocs. No other reloc will need a
3033 if (!((r_type
== R_AVR_16_PM
)
3034 || (r_type
== R_AVR_LO8_LDI_GS
)
3035 || (r_type
== R_AVR_HI8_LDI_GS
)))
3038 /* Now determine the call target, its name, value,
3044 if (r_indx
< symtab_hdr
->sh_info
)
3046 /* It's a local symbol. */
3047 Elf_Internal_Sym
*sym
;
3048 Elf_Internal_Shdr
*hdr
;
3051 sym
= local_syms
+ r_indx
;
3052 if (ELF_ST_TYPE (sym
->st_info
) != STT_SECTION
)
3053 sym_value
= sym
->st_value
;
3054 shndx
= sym
->st_shndx
;
3055 if (shndx
< elf_numsections (input_bfd
))
3057 hdr
= elf_elfsections (input_bfd
)[shndx
];
3058 sym_sec
= hdr
->bfd_section
;
3059 destination
= (sym_value
+ irela
->r_addend
3060 + sym_sec
->output_offset
3061 + sym_sec
->output_section
->vma
);
3066 /* It's an external symbol. */
3069 e_indx
= r_indx
- symtab_hdr
->sh_info
;
3070 hh
= elf_sym_hashes (input_bfd
)[e_indx
];
3072 while (hh
->root
.type
== bfd_link_hash_indirect
3073 || hh
->root
.type
== bfd_link_hash_warning
)
3074 hh
= (struct elf_link_hash_entry
*)
3075 (hh
->root
.u
.i
.link
);
3077 if (hh
->root
.type
== bfd_link_hash_defined
3078 || hh
->root
.type
== bfd_link_hash_defweak
)
3080 sym_sec
= hh
->root
.u
.def
.section
;
3081 sym_value
= hh
->root
.u
.def
.value
;
3082 if (sym_sec
->output_section
!= NULL
)
3083 destination
= (sym_value
+ irela
->r_addend
3084 + sym_sec
->output_offset
3085 + sym_sec
->output_section
->vma
);
3087 else if (hh
->root
.type
== bfd_link_hash_undefweak
)
3092 else if (hh
->root
.type
== bfd_link_hash_undefined
)
3094 if (! (info
->unresolved_syms_in_objects
== RM_IGNORE
3095 && (ELF_ST_VISIBILITY (hh
->other
)
3101 bfd_set_error (bfd_error_bad_value
);
3103 error_ret_free_internal
:
3104 if (elf_section_data (section
)->relocs
== NULL
)
3105 free (internal_relocs
);
3106 goto error_ret_free_local
;
3110 if (! avr_stub_is_required_for_16_bit_reloc
3111 (destination
- htab
->vector_base
))
3113 if (!is_prealloc_run
)
3114 /* We are having a reloc that does't need a stub. */
3117 /* We don't right now know if a stub will be needed.
3118 Let's rather be on the safe side. */
3121 /* Get the name of this stub. */
3122 stub_name
= avr_stub_name (sym_sec
, sym_value
, irela
);
3125 goto error_ret_free_internal
;
3128 hsh
= avr_stub_hash_lookup (&htab
->bstab
,
3133 /* The proper stub has already been created. Mark it
3134 to be used and write the possibly changed destination
3136 hsh
->is_actually_needed
= TRUE
;
3137 hsh
->target_value
= destination
;
3142 hsh
= avr_add_stub (stub_name
, htab
);
3146 goto error_ret_free_internal
;
3149 hsh
->is_actually_needed
= TRUE
;
3150 hsh
->target_value
= destination
;
3153 printf ("Adding stub with destination 0x%x to the"
3154 " hash table.\n", (unsigned int) destination
);
3156 printf ("(Pre-Alloc run: %i)\n", is_prealloc_run
);
3158 stub_changed
= TRUE
;
3161 /* We're done with the internal relocs, free them. */
3162 if (elf_section_data (section
)->relocs
== NULL
)
3163 free (internal_relocs
);
3167 /* Re-Calculate the number of needed stubs. */
3168 htab
->stub_sec
->size
= 0;
3169 bfd_hash_traverse (&htab
->bstab
, avr_size_one_stub
, htab
);
3174 stub_changed
= FALSE
;
3177 free (htab
->all_local_syms
);
3180 error_ret_free_local
:
3181 free (htab
->all_local_syms
);
3186 /* Build all the stubs associated with the current output file. The
3187 stubs are kept in a hash table attached to the main linker hash
3188 table. We also set up the .plt entries for statically linked PIC
3189 functions here. This function is called via hppaelf_finish in the
3193 elf32_avr_build_stubs (struct bfd_link_info
*info
)
3196 struct bfd_hash_table
*table
;
3197 struct elf32_avr_link_hash_table
*htab
;
3198 bfd_size_type total_size
= 0;
3200 htab
= avr_link_hash_table (info
);
3204 /* In case that there were several stub sections: */
3205 for (stub_sec
= htab
->stub_bfd
->sections
;
3207 stub_sec
= stub_sec
->next
)
3211 /* Allocate memory to hold the linker stubs. */
3212 size
= stub_sec
->size
;
3215 stub_sec
->contents
= bfd_zalloc (htab
->stub_bfd
, size
);
3216 if (stub_sec
->contents
== NULL
&& size
!= 0)
3221 /* Allocate memory for the adress mapping table. */
3222 htab
->amt_entry_cnt
= 0;
3223 htab
->amt_max_entry_cnt
= total_size
/ 4;
3224 htab
->amt_stub_offsets
= bfd_malloc (sizeof (bfd_vma
)
3225 * htab
->amt_max_entry_cnt
);
3226 htab
->amt_destination_addr
= bfd_malloc (sizeof (bfd_vma
)
3227 * htab
->amt_max_entry_cnt
);
3230 printf ("Allocating %i entries in the AMT\n", htab
->amt_max_entry_cnt
);
3232 /* Build the stubs as directed by the stub hash table. */
3233 table
= &htab
->bstab
;
3234 bfd_hash_traverse (table
, avr_build_one_stub
, info
);
3237 printf ("Final Stub section Size: %i\n", (int) htab
->stub_sec
->size
);
3242 #define ELF_ARCH bfd_arch_avr
3243 #define ELF_TARGET_ID AVR_ELF_DATA
3244 #define ELF_MACHINE_CODE EM_AVR
3245 #define ELF_MACHINE_ALT1 EM_AVR_OLD
3246 #define ELF_MAXPAGESIZE 1
3248 #define TARGET_LITTLE_SYM avr_elf32_vec
3249 #define TARGET_LITTLE_NAME "elf32-avr"
3251 #define bfd_elf32_bfd_link_hash_table_create elf32_avr_link_hash_table_create
3252 #define bfd_elf32_bfd_link_hash_table_free elf32_avr_link_hash_table_free
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"