1 /* AVR-specific support for 32-bit ELF
2 Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009,
4 Free Software Foundation, Inc.
5 Contributed by Denis Chertykov <denisc@overta.ru>
7 This file is part of BFD, the Binary File Descriptor library.
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 3 of the License, or
12 (at your option) any later version.
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 51 Franklin Street - Fifth Floor,
22 Boston, MA 02110-1301, USA. */
29 #include "elf32-avr.h"
31 /* Enable debugging printout at stdout with this variable. */
32 static bfd_boolean debug_relax
= FALSE
;
34 /* Enable debugging printout at stdout with this variable. */
35 static bfd_boolean debug_stubs
= FALSE
;
37 /* Hash table initialization and handling. Code is taken from the hppa port
38 and adapted to the needs of AVR. */
40 /* We use two hash tables to hold information for linking avr objects.
42 The first is the elf32_avr_link_hash_table which is derived from the
43 stanard ELF linker hash table. We use this as a place to attach the other
44 hash table and some static information.
46 The second is the stub hash table which is derived from the base BFD
47 hash table. The stub hash table holds the information on the linker
50 struct elf32_avr_stub_hash_entry
52 /* Base hash table entry structure. */
53 struct bfd_hash_entry bh_root
;
55 /* Offset within stub_sec of the beginning of this stub. */
58 /* Given the symbol's value and its section we can determine its final
59 value when building the stubs (so the stub knows where to jump). */
62 /* This way we could mark stubs to be no longer necessary. */
63 bfd_boolean is_actually_needed
;
66 struct elf32_avr_link_hash_table
68 /* The main hash table. */
69 struct elf_link_hash_table etab
;
71 /* The stub hash table. */
72 struct bfd_hash_table bstab
;
76 /* Linker stub bfd. */
79 /* The stub section. */
82 /* Usually 0, unless we are generating code for a bootloader. Will
83 be initialized by elf32_avr_size_stubs to the vma offset of the
84 output section associated with the stub section. */
87 /* Assorted information used by elf32_avr_size_stubs. */
88 unsigned int bfd_count
;
90 asection
** input_list
;
91 Elf_Internal_Sym
** all_local_syms
;
93 /* Tables for mapping vma beyond the 128k boundary to the address of the
94 corresponding stub. (AMT)
95 "amt_max_entry_cnt" reflects the number of entries that memory is allocated
96 for in the "amt_stub_offsets" and "amt_destination_addr" arrays.
97 "amt_entry_cnt" informs how many of these entries actually contain
99 unsigned int amt_entry_cnt
;
100 unsigned int amt_max_entry_cnt
;
101 bfd_vma
* amt_stub_offsets
;
102 bfd_vma
* amt_destination_addr
;
105 /* Various hash macros and functions. */
106 #define avr_link_hash_table(p) \
107 /* PR 3874: Check that we have an AVR style hash table before using it. */\
108 (elf_hash_table_id ((struct elf_link_hash_table *) ((p)->hash)) \
109 == AVR_ELF_DATA ? ((struct elf32_avr_link_hash_table *) ((p)->hash)) : NULL)
111 #define avr_stub_hash_entry(ent) \
112 ((struct elf32_avr_stub_hash_entry *)(ent))
114 #define avr_stub_hash_lookup(table, string, create, copy) \
115 ((struct elf32_avr_stub_hash_entry *) \
116 bfd_hash_lookup ((table), (string), (create), (copy)))
118 static reloc_howto_type elf_avr_howto_table
[] =
120 HOWTO (R_AVR_NONE
, /* type */
122 2, /* size (0 = byte, 1 = short, 2 = long) */
124 FALSE
, /* pc_relative */
126 complain_overflow_bitfield
, /* complain_on_overflow */
127 bfd_elf_generic_reloc
, /* special_function */
128 "R_AVR_NONE", /* name */
129 FALSE
, /* partial_inplace */
132 FALSE
), /* pcrel_offset */
134 HOWTO (R_AVR_32
, /* type */
136 2, /* size (0 = byte, 1 = short, 2 = long) */
138 FALSE
, /* pc_relative */
140 complain_overflow_bitfield
, /* complain_on_overflow */
141 bfd_elf_generic_reloc
, /* special_function */
142 "R_AVR_32", /* name */
143 FALSE
, /* partial_inplace */
144 0xffffffff, /* src_mask */
145 0xffffffff, /* dst_mask */
146 FALSE
), /* pcrel_offset */
148 /* A 7 bit PC relative relocation. */
149 HOWTO (R_AVR_7_PCREL
, /* type */
151 1, /* size (0 = byte, 1 = short, 2 = long) */
153 TRUE
, /* pc_relative */
155 complain_overflow_bitfield
, /* complain_on_overflow */
156 bfd_elf_generic_reloc
, /* special_function */
157 "R_AVR_7_PCREL", /* name */
158 FALSE
, /* partial_inplace */
159 0xffff, /* src_mask */
160 0xffff, /* dst_mask */
161 TRUE
), /* pcrel_offset */
163 /* A 13 bit PC relative relocation. */
164 HOWTO (R_AVR_13_PCREL
, /* type */
166 1, /* size (0 = byte, 1 = short, 2 = long) */
168 TRUE
, /* pc_relative */
170 complain_overflow_bitfield
, /* complain_on_overflow */
171 bfd_elf_generic_reloc
, /* special_function */
172 "R_AVR_13_PCREL", /* name */
173 FALSE
, /* partial_inplace */
174 0xfff, /* src_mask */
175 0xfff, /* dst_mask */
176 TRUE
), /* pcrel_offset */
178 /* A 16 bit absolute relocation. */
179 HOWTO (R_AVR_16
, /* type */
181 1, /* size (0 = byte, 1 = short, 2 = long) */
183 FALSE
, /* pc_relative */
185 complain_overflow_dont
, /* complain_on_overflow */
186 bfd_elf_generic_reloc
, /* special_function */
187 "R_AVR_16", /* name */
188 FALSE
, /* partial_inplace */
189 0xffff, /* src_mask */
190 0xffff, /* dst_mask */
191 FALSE
), /* pcrel_offset */
193 /* A 16 bit absolute relocation for command address
194 Will be changed when linker stubs are needed. */
195 HOWTO (R_AVR_16_PM
, /* type */
197 1, /* size (0 = byte, 1 = short, 2 = long) */
199 FALSE
, /* pc_relative */
201 complain_overflow_bitfield
, /* complain_on_overflow */
202 bfd_elf_generic_reloc
, /* special_function */
203 "R_AVR_16_PM", /* name */
204 FALSE
, /* partial_inplace */
205 0xffff, /* src_mask */
206 0xffff, /* dst_mask */
207 FALSE
), /* pcrel_offset */
208 /* A low 8 bit absolute relocation of 16 bit address.
210 HOWTO (R_AVR_LO8_LDI
, /* type */
212 1, /* size (0 = byte, 1 = short, 2 = long) */
214 FALSE
, /* pc_relative */
216 complain_overflow_dont
, /* complain_on_overflow */
217 bfd_elf_generic_reloc
, /* special_function */
218 "R_AVR_LO8_LDI", /* name */
219 FALSE
, /* partial_inplace */
220 0xffff, /* src_mask */
221 0xffff, /* dst_mask */
222 FALSE
), /* pcrel_offset */
223 /* A high 8 bit absolute relocation of 16 bit address.
225 HOWTO (R_AVR_HI8_LDI
, /* type */
227 1, /* size (0 = byte, 1 = short, 2 = long) */
229 FALSE
, /* pc_relative */
231 complain_overflow_dont
, /* complain_on_overflow */
232 bfd_elf_generic_reloc
, /* special_function */
233 "R_AVR_HI8_LDI", /* name */
234 FALSE
, /* partial_inplace */
235 0xffff, /* src_mask */
236 0xffff, /* dst_mask */
237 FALSE
), /* pcrel_offset */
238 /* A high 6 bit absolute relocation of 22 bit address.
239 For LDI command. As well second most significant 8 bit value of
240 a 32 bit link-time constant. */
241 HOWTO (R_AVR_HH8_LDI
, /* type */
243 1, /* size (0 = byte, 1 = short, 2 = long) */
245 FALSE
, /* pc_relative */
247 complain_overflow_dont
, /* complain_on_overflow */
248 bfd_elf_generic_reloc
, /* special_function */
249 "R_AVR_HH8_LDI", /* name */
250 FALSE
, /* partial_inplace */
251 0xffff, /* src_mask */
252 0xffff, /* dst_mask */
253 FALSE
), /* pcrel_offset */
254 /* A negative low 8 bit absolute relocation of 16 bit address.
256 HOWTO (R_AVR_LO8_LDI_NEG
, /* type */
258 1, /* size (0 = byte, 1 = short, 2 = long) */
260 FALSE
, /* pc_relative */
262 complain_overflow_dont
, /* complain_on_overflow */
263 bfd_elf_generic_reloc
, /* special_function */
264 "R_AVR_LO8_LDI_NEG", /* name */
265 FALSE
, /* partial_inplace */
266 0xffff, /* src_mask */
267 0xffff, /* dst_mask */
268 FALSE
), /* pcrel_offset */
269 /* A negative high 8 bit absolute relocation of 16 bit address.
271 HOWTO (R_AVR_HI8_LDI_NEG
, /* type */
273 1, /* size (0 = byte, 1 = short, 2 = long) */
275 FALSE
, /* pc_relative */
277 complain_overflow_dont
, /* complain_on_overflow */
278 bfd_elf_generic_reloc
, /* special_function */
279 "R_AVR_HI8_LDI_NEG", /* name */
280 FALSE
, /* partial_inplace */
281 0xffff, /* src_mask */
282 0xffff, /* dst_mask */
283 FALSE
), /* pcrel_offset */
284 /* A negative high 6 bit absolute relocation of 22 bit address.
286 HOWTO (R_AVR_HH8_LDI_NEG
, /* type */
288 1, /* size (0 = byte, 1 = short, 2 = long) */
290 FALSE
, /* pc_relative */
292 complain_overflow_dont
, /* complain_on_overflow */
293 bfd_elf_generic_reloc
, /* special_function */
294 "R_AVR_HH8_LDI_NEG", /* name */
295 FALSE
, /* partial_inplace */
296 0xffff, /* src_mask */
297 0xffff, /* dst_mask */
298 FALSE
), /* pcrel_offset */
299 /* A low 8 bit absolute relocation of 24 bit program memory address.
300 For LDI command. Will not be changed when linker stubs are needed. */
301 HOWTO (R_AVR_LO8_LDI_PM
, /* type */
303 1, /* size (0 = byte, 1 = short, 2 = long) */
305 FALSE
, /* pc_relative */
307 complain_overflow_dont
, /* complain_on_overflow */
308 bfd_elf_generic_reloc
, /* special_function */
309 "R_AVR_LO8_LDI_PM", /* name */
310 FALSE
, /* partial_inplace */
311 0xffff, /* src_mask */
312 0xffff, /* dst_mask */
313 FALSE
), /* pcrel_offset */
314 /* A low 8 bit absolute relocation of 24 bit program memory address.
315 For LDI command. Will not be changed when linker stubs are needed. */
316 HOWTO (R_AVR_HI8_LDI_PM
, /* type */
318 1, /* size (0 = byte, 1 = short, 2 = long) */
320 FALSE
, /* pc_relative */
322 complain_overflow_dont
, /* complain_on_overflow */
323 bfd_elf_generic_reloc
, /* special_function */
324 "R_AVR_HI8_LDI_PM", /* name */
325 FALSE
, /* partial_inplace */
326 0xffff, /* src_mask */
327 0xffff, /* dst_mask */
328 FALSE
), /* pcrel_offset */
329 /* A low 8 bit absolute relocation of 24 bit program memory address.
330 For LDI command. Will not be changed when linker stubs are needed. */
331 HOWTO (R_AVR_HH8_LDI_PM
, /* type */
333 1, /* size (0 = byte, 1 = short, 2 = long) */
335 FALSE
, /* pc_relative */
337 complain_overflow_dont
, /* complain_on_overflow */
338 bfd_elf_generic_reloc
, /* special_function */
339 "R_AVR_HH8_LDI_PM", /* name */
340 FALSE
, /* partial_inplace */
341 0xffff, /* src_mask */
342 0xffff, /* dst_mask */
343 FALSE
), /* pcrel_offset */
344 /* A low 8 bit absolute relocation of 24 bit program memory address.
345 For LDI command. Will not be changed when linker stubs are needed. */
346 HOWTO (R_AVR_LO8_LDI_PM_NEG
, /* type */
348 1, /* size (0 = byte, 1 = short, 2 = long) */
350 FALSE
, /* pc_relative */
352 complain_overflow_dont
, /* complain_on_overflow */
353 bfd_elf_generic_reloc
, /* special_function */
354 "R_AVR_LO8_LDI_PM_NEG", /* name */
355 FALSE
, /* partial_inplace */
356 0xffff, /* src_mask */
357 0xffff, /* dst_mask */
358 FALSE
), /* pcrel_offset */
359 /* A low 8 bit absolute relocation of 24 bit program memory address.
360 For LDI command. Will not be changed when linker stubs are needed. */
361 HOWTO (R_AVR_HI8_LDI_PM_NEG
, /* type */
363 1, /* size (0 = byte, 1 = short, 2 = long) */
365 FALSE
, /* pc_relative */
367 complain_overflow_dont
, /* complain_on_overflow */
368 bfd_elf_generic_reloc
, /* special_function */
369 "R_AVR_HI8_LDI_PM_NEG", /* name */
370 FALSE
, /* partial_inplace */
371 0xffff, /* src_mask */
372 0xffff, /* dst_mask */
373 FALSE
), /* pcrel_offset */
374 /* A low 8 bit absolute relocation of 24 bit program memory address.
375 For LDI command. Will not be changed when linker stubs are needed. */
376 HOWTO (R_AVR_HH8_LDI_PM_NEG
, /* type */
378 1, /* size (0 = byte, 1 = short, 2 = long) */
380 FALSE
, /* pc_relative */
382 complain_overflow_dont
, /* complain_on_overflow */
383 bfd_elf_generic_reloc
, /* special_function */
384 "R_AVR_HH8_LDI_PM_NEG", /* name */
385 FALSE
, /* partial_inplace */
386 0xffff, /* src_mask */
387 0xffff, /* dst_mask */
388 FALSE
), /* pcrel_offset */
389 /* Relocation for CALL command in ATmega. */
390 HOWTO (R_AVR_CALL
, /* type */
392 2, /* size (0 = byte, 1 = short, 2 = long) */
394 FALSE
, /* pc_relative */
396 complain_overflow_dont
,/* complain_on_overflow */
397 bfd_elf_generic_reloc
, /* special_function */
398 "R_AVR_CALL", /* name */
399 FALSE
, /* partial_inplace */
400 0xffffffff, /* src_mask */
401 0xffffffff, /* dst_mask */
402 FALSE
), /* pcrel_offset */
403 /* A 16 bit absolute relocation of 16 bit address.
405 HOWTO (R_AVR_LDI
, /* type */
407 1, /* size (0 = byte, 1 = short, 2 = long) */
409 FALSE
, /* pc_relative */
411 complain_overflow_dont
,/* complain_on_overflow */
412 bfd_elf_generic_reloc
, /* special_function */
413 "R_AVR_LDI", /* name */
414 FALSE
, /* partial_inplace */
415 0xffff, /* src_mask */
416 0xffff, /* dst_mask */
417 FALSE
), /* pcrel_offset */
418 /* A 6 bit absolute relocation of 6 bit offset.
419 For ldd/sdd command. */
420 HOWTO (R_AVR_6
, /* type */
422 0, /* size (0 = byte, 1 = short, 2 = long) */
424 FALSE
, /* pc_relative */
426 complain_overflow_dont
,/* complain_on_overflow */
427 bfd_elf_generic_reloc
, /* special_function */
428 "R_AVR_6", /* name */
429 FALSE
, /* partial_inplace */
430 0xffff, /* src_mask */
431 0xffff, /* dst_mask */
432 FALSE
), /* pcrel_offset */
433 /* A 6 bit absolute relocation of 6 bit offset.
434 For sbiw/adiw command. */
435 HOWTO (R_AVR_6_ADIW
, /* type */
437 0, /* size (0 = byte, 1 = short, 2 = long) */
439 FALSE
, /* pc_relative */
441 complain_overflow_dont
,/* complain_on_overflow */
442 bfd_elf_generic_reloc
, /* special_function */
443 "R_AVR_6_ADIW", /* name */
444 FALSE
, /* partial_inplace */
445 0xffff, /* src_mask */
446 0xffff, /* dst_mask */
447 FALSE
), /* pcrel_offset */
448 /* Most significant 8 bit value of a 32 bit link-time constant. */
449 HOWTO (R_AVR_MS8_LDI
, /* type */
451 1, /* size (0 = byte, 1 = short, 2 = long) */
453 FALSE
, /* pc_relative */
455 complain_overflow_dont
, /* complain_on_overflow */
456 bfd_elf_generic_reloc
, /* special_function */
457 "R_AVR_MS8_LDI", /* name */
458 FALSE
, /* partial_inplace */
459 0xffff, /* src_mask */
460 0xffff, /* dst_mask */
461 FALSE
), /* pcrel_offset */
462 /* Negative most significant 8 bit value of a 32 bit link-time constant. */
463 HOWTO (R_AVR_MS8_LDI_NEG
, /* type */
465 1, /* size (0 = byte, 1 = short, 2 = long) */
467 FALSE
, /* pc_relative */
469 complain_overflow_dont
, /* complain_on_overflow */
470 bfd_elf_generic_reloc
, /* special_function */
471 "R_AVR_MS8_LDI_NEG", /* name */
472 FALSE
, /* partial_inplace */
473 0xffff, /* src_mask */
474 0xffff, /* dst_mask */
475 FALSE
), /* pcrel_offset */
476 /* A low 8 bit absolute relocation of 24 bit program memory address.
477 For LDI command. Will be changed when linker stubs are needed. */
478 HOWTO (R_AVR_LO8_LDI_GS
, /* type */
480 1, /* size (0 = byte, 1 = short, 2 = long) */
482 FALSE
, /* pc_relative */
484 complain_overflow_dont
, /* complain_on_overflow */
485 bfd_elf_generic_reloc
, /* special_function */
486 "R_AVR_LO8_LDI_GS", /* name */
487 FALSE
, /* partial_inplace */
488 0xffff, /* src_mask */
489 0xffff, /* dst_mask */
490 FALSE
), /* pcrel_offset */
491 /* A low 8 bit absolute relocation of 24 bit program memory address.
492 For LDI command. Will be changed when linker stubs are needed. */
493 HOWTO (R_AVR_HI8_LDI_GS
, /* type */
495 1, /* size (0 = byte, 1 = short, 2 = long) */
497 FALSE
, /* pc_relative */
499 complain_overflow_dont
, /* complain_on_overflow */
500 bfd_elf_generic_reloc
, /* special_function */
501 "R_AVR_HI8_LDI_GS", /* name */
502 FALSE
, /* partial_inplace */
503 0xffff, /* src_mask */
504 0xffff, /* dst_mask */
505 FALSE
), /* pcrel_offset */
507 HOWTO (R_AVR_8
, /* type */
509 0, /* size (0 = byte, 1 = short, 2 = long) */
511 FALSE
, /* pc_relative */
513 complain_overflow_bitfield
,/* complain_on_overflow */
514 bfd_elf_generic_reloc
, /* special_function */
515 "R_AVR_8", /* name */
516 FALSE
, /* partial_inplace */
517 0x000000ff, /* src_mask */
518 0x000000ff, /* dst_mask */
519 FALSE
), /* pcrel_offset */
520 /* lo8-part to use in .byte lo8(sym). */
521 HOWTO (R_AVR_8_LO8
, /* type */
523 0, /* size (0 = byte, 1 = short, 2 = long) */
525 FALSE
, /* pc_relative */
527 complain_overflow_dont
,/* complain_on_overflow */
528 bfd_elf_generic_reloc
, /* special_function */
529 "R_AVR_8_LO8", /* name */
530 FALSE
, /* partial_inplace */
531 0xffffff, /* src_mask */
532 0xffffff, /* dst_mask */
533 FALSE
), /* pcrel_offset */
534 /* hi8-part to use in .byte hi8(sym). */
535 HOWTO (R_AVR_8_HI8
, /* type */
537 0, /* size (0 = byte, 1 = short, 2 = long) */
539 FALSE
, /* pc_relative */
541 complain_overflow_dont
,/* complain_on_overflow */
542 bfd_elf_generic_reloc
, /* special_function */
543 "R_AVR_8_HI8", /* name */
544 FALSE
, /* partial_inplace */
545 0xffffff, /* src_mask */
546 0xffffff, /* dst_mask */
547 FALSE
), /* pcrel_offset */
548 /* hlo8-part to use in .byte hlo8(sym). */
549 HOWTO (R_AVR_8_HLO8
, /* type */
551 0, /* size (0 = byte, 1 = short, 2 = long) */
553 FALSE
, /* pc_relative */
555 complain_overflow_dont
,/* complain_on_overflow */
556 bfd_elf_generic_reloc
, /* special_function */
557 "R_AVR_8_HLO8", /* name */
558 FALSE
, /* partial_inplace */
559 0xffffff, /* src_mask */
560 0xffffff, /* dst_mask */
561 FALSE
), /* pcrel_offset */
564 /* Map BFD reloc types to AVR ELF reloc types. */
568 bfd_reloc_code_real_type bfd_reloc_val
;
569 unsigned int elf_reloc_val
;
572 static const struct avr_reloc_map avr_reloc_map
[] =
574 { BFD_RELOC_NONE
, R_AVR_NONE
},
575 { BFD_RELOC_32
, R_AVR_32
},
576 { BFD_RELOC_AVR_7_PCREL
, R_AVR_7_PCREL
},
577 { BFD_RELOC_AVR_13_PCREL
, R_AVR_13_PCREL
},
578 { BFD_RELOC_16
, R_AVR_16
},
579 { BFD_RELOC_AVR_16_PM
, R_AVR_16_PM
},
580 { BFD_RELOC_AVR_LO8_LDI
, R_AVR_LO8_LDI
},
581 { BFD_RELOC_AVR_HI8_LDI
, R_AVR_HI8_LDI
},
582 { BFD_RELOC_AVR_HH8_LDI
, R_AVR_HH8_LDI
},
583 { BFD_RELOC_AVR_MS8_LDI
, R_AVR_MS8_LDI
},
584 { BFD_RELOC_AVR_LO8_LDI_NEG
, R_AVR_LO8_LDI_NEG
},
585 { BFD_RELOC_AVR_HI8_LDI_NEG
, R_AVR_HI8_LDI_NEG
},
586 { BFD_RELOC_AVR_HH8_LDI_NEG
, R_AVR_HH8_LDI_NEG
},
587 { BFD_RELOC_AVR_MS8_LDI_NEG
, R_AVR_MS8_LDI_NEG
},
588 { BFD_RELOC_AVR_LO8_LDI_PM
, R_AVR_LO8_LDI_PM
},
589 { BFD_RELOC_AVR_LO8_LDI_GS
, R_AVR_LO8_LDI_GS
},
590 { BFD_RELOC_AVR_HI8_LDI_PM
, R_AVR_HI8_LDI_PM
},
591 { BFD_RELOC_AVR_HI8_LDI_GS
, R_AVR_HI8_LDI_GS
},
592 { BFD_RELOC_AVR_HH8_LDI_PM
, R_AVR_HH8_LDI_PM
},
593 { BFD_RELOC_AVR_LO8_LDI_PM_NEG
, R_AVR_LO8_LDI_PM_NEG
},
594 { BFD_RELOC_AVR_HI8_LDI_PM_NEG
, R_AVR_HI8_LDI_PM_NEG
},
595 { BFD_RELOC_AVR_HH8_LDI_PM_NEG
, R_AVR_HH8_LDI_PM_NEG
},
596 { BFD_RELOC_AVR_CALL
, R_AVR_CALL
},
597 { BFD_RELOC_AVR_LDI
, R_AVR_LDI
},
598 { BFD_RELOC_AVR_6
, R_AVR_6
},
599 { BFD_RELOC_AVR_6_ADIW
, R_AVR_6_ADIW
},
600 { BFD_RELOC_8
, R_AVR_8
},
601 { BFD_RELOC_AVR_8_LO
, R_AVR_8_LO8
},
602 { BFD_RELOC_AVR_8_HI
, R_AVR_8_HI8
},
603 { BFD_RELOC_AVR_8_HLO
, R_AVR_8_HLO8
}
606 /* Meant to be filled one day with the wrap around address for the
607 specific device. I.e. should get the value 0x4000 for 16k devices,
608 0x8000 for 32k devices and so on.
610 We initialize it here with a value of 0x1000000 resulting in
611 that we will never suggest a wrap-around jump during relaxation.
612 The logic of the source code later on assumes that in
613 avr_pc_wrap_around one single bit is set. */
614 static bfd_vma avr_pc_wrap_around
= 0x10000000;
616 /* If this variable holds a value different from zero, the linker relaxation
617 machine will try to optimize call/ret sequences by a single jump
618 instruction. This option could be switched off by a linker switch. */
619 static int avr_replace_call_ret_sequences
= 1;
621 /* Initialize an entry in the stub hash table. */
623 static struct bfd_hash_entry
*
624 stub_hash_newfunc (struct bfd_hash_entry
*entry
,
625 struct bfd_hash_table
*table
,
628 /* Allocate the structure if it has not already been allocated by a
632 entry
= bfd_hash_allocate (table
,
633 sizeof (struct elf32_avr_stub_hash_entry
));
638 /* Call the allocation method of the superclass. */
639 entry
= bfd_hash_newfunc (entry
, table
, string
);
642 struct elf32_avr_stub_hash_entry
*hsh
;
644 /* Initialize the local fields. */
645 hsh
= avr_stub_hash_entry (entry
);
646 hsh
->stub_offset
= 0;
647 hsh
->target_value
= 0;
653 /* This function is just a straight passthrough to the real
654 function in linker.c. Its prupose is so that its address
655 can be compared inside the avr_link_hash_table macro. */
657 static struct bfd_hash_entry
*
658 elf32_avr_link_hash_newfunc (struct bfd_hash_entry
* entry
,
659 struct bfd_hash_table
* table
,
662 return _bfd_elf_link_hash_newfunc (entry
, table
, string
);
665 /* Create the derived linker hash table. The AVR ELF port uses the derived
666 hash table to keep information specific to the AVR ELF linker (without
667 using static variables). */
669 static struct bfd_link_hash_table
*
670 elf32_avr_link_hash_table_create (bfd
*abfd
)
672 struct elf32_avr_link_hash_table
*htab
;
673 bfd_size_type amt
= sizeof (*htab
);
675 htab
= bfd_zmalloc (amt
);
679 if (!_bfd_elf_link_hash_table_init (&htab
->etab
, abfd
,
680 elf32_avr_link_hash_newfunc
,
681 sizeof (struct elf_link_hash_entry
),
688 /* Init the stub hash table too. */
689 if (!bfd_hash_table_init (&htab
->bstab
, stub_hash_newfunc
,
690 sizeof (struct elf32_avr_stub_hash_entry
)))
693 return &htab
->etab
.root
;
696 /* Free the derived linker hash table. */
699 elf32_avr_link_hash_table_free (struct bfd_link_hash_table
*btab
)
701 struct elf32_avr_link_hash_table
*htab
702 = (struct elf32_avr_link_hash_table
*) btab
;
704 /* Free the address mapping table. */
705 if (htab
->amt_stub_offsets
!= NULL
)
706 free (htab
->amt_stub_offsets
);
707 if (htab
->amt_destination_addr
!= NULL
)
708 free (htab
->amt_destination_addr
);
710 bfd_hash_table_free (&htab
->bstab
);
711 _bfd_elf_link_hash_table_free (btab
);
714 /* Calculates the effective distance of a pc relative jump/call. */
717 avr_relative_distance_considering_wrap_around (unsigned int distance
)
719 unsigned int wrap_around_mask
= avr_pc_wrap_around
- 1;
720 int dist_with_wrap_around
= distance
& wrap_around_mask
;
722 if (dist_with_wrap_around
> ((int) (avr_pc_wrap_around
>> 1)))
723 dist_with_wrap_around
-= avr_pc_wrap_around
;
725 return dist_with_wrap_around
;
729 static reloc_howto_type
*
730 bfd_elf32_bfd_reloc_type_lookup (bfd
*abfd ATTRIBUTE_UNUSED
,
731 bfd_reloc_code_real_type code
)
736 i
< sizeof (avr_reloc_map
) / sizeof (struct avr_reloc_map
);
738 if (avr_reloc_map
[i
].bfd_reloc_val
== code
)
739 return &elf_avr_howto_table
[avr_reloc_map
[i
].elf_reloc_val
];
744 static reloc_howto_type
*
745 bfd_elf32_bfd_reloc_name_lookup (bfd
*abfd ATTRIBUTE_UNUSED
,
751 i
< sizeof (elf_avr_howto_table
) / sizeof (elf_avr_howto_table
[0]);
753 if (elf_avr_howto_table
[i
].name
!= NULL
754 && strcasecmp (elf_avr_howto_table
[i
].name
, r_name
) == 0)
755 return &elf_avr_howto_table
[i
];
760 /* Set the howto pointer for an AVR ELF reloc. */
763 avr_info_to_howto_rela (bfd
*abfd ATTRIBUTE_UNUSED
,
765 Elf_Internal_Rela
*dst
)
769 r_type
= ELF32_R_TYPE (dst
->r_info
);
770 BFD_ASSERT (r_type
< (unsigned int) R_AVR_max
);
771 cache_ptr
->howto
= &elf_avr_howto_table
[r_type
];
775 avr_stub_is_required_for_16_bit_reloc (bfd_vma relocation
)
777 return (relocation
>= 0x020000);
780 /* Returns the address of the corresponding stub if there is one.
781 Returns otherwise an address above 0x020000. This function
782 could also be used, if there is no knowledge on the section where
783 the destination is found. */
786 avr_get_stub_addr (bfd_vma srel
,
787 struct elf32_avr_link_hash_table
*htab
)
790 bfd_vma stub_sec_addr
=
791 (htab
->stub_sec
->output_section
->vma
+
792 htab
->stub_sec
->output_offset
);
794 for (sindex
= 0; sindex
< htab
->amt_max_entry_cnt
; sindex
++)
795 if (htab
->amt_destination_addr
[sindex
] == srel
)
796 return htab
->amt_stub_offsets
[sindex
] + stub_sec_addr
;
798 /* Return an address that could not be reached by 16 bit relocs. */
802 /* Perform a single relocation. By default we use the standard BFD
803 routines, but a few relocs, we have to do them ourselves. */
805 static bfd_reloc_status_type
806 avr_final_link_relocate (reloc_howto_type
* howto
,
808 asection
* input_section
,
810 Elf_Internal_Rela
* rel
,
812 struct elf32_avr_link_hash_table
* htab
)
814 bfd_reloc_status_type r
= bfd_reloc_ok
;
817 bfd_signed_vma reloc_addr
;
818 bfd_boolean use_stubs
= FALSE
;
819 /* Usually is 0, unless we are generating code for a bootloader. */
820 bfd_signed_vma base_addr
= htab
->vector_base
;
822 /* Absolute addr of the reloc in the final excecutable. */
823 reloc_addr
= rel
->r_offset
+ input_section
->output_section
->vma
824 + input_section
->output_offset
;
829 contents
+= rel
->r_offset
;
830 srel
= (bfd_signed_vma
) relocation
;
831 srel
+= rel
->r_addend
;
832 srel
-= rel
->r_offset
;
833 srel
-= 2; /* Branch instructions add 2 to the PC... */
834 srel
-= (input_section
->output_section
->vma
+
835 input_section
->output_offset
);
838 return bfd_reloc_outofrange
;
839 if (srel
> ((1 << 7) - 1) || (srel
< - (1 << 7)))
840 return bfd_reloc_overflow
;
841 x
= bfd_get_16 (input_bfd
, contents
);
842 x
= (x
& 0xfc07) | (((srel
>> 1) << 3) & 0x3f8);
843 bfd_put_16 (input_bfd
, x
, contents
);
847 contents
+= rel
->r_offset
;
848 srel
= (bfd_signed_vma
) relocation
;
849 srel
+= rel
->r_addend
;
850 srel
-= rel
->r_offset
;
851 srel
-= 2; /* Branch instructions add 2 to the PC... */
852 srel
-= (input_section
->output_section
->vma
+
853 input_section
->output_offset
);
856 return bfd_reloc_outofrange
;
858 srel
= avr_relative_distance_considering_wrap_around (srel
);
860 /* AVR addresses commands as words. */
863 /* Check for overflow. */
864 if (srel
< -2048 || srel
> 2047)
866 /* Relative distance is too large. */
868 /* Always apply WRAPAROUND for avr2, avr25, and avr4. */
869 switch (bfd_get_mach (input_bfd
))
877 return bfd_reloc_overflow
;
881 x
= bfd_get_16 (input_bfd
, contents
);
882 x
= (x
& 0xf000) | (srel
& 0xfff);
883 bfd_put_16 (input_bfd
, x
, contents
);
887 contents
+= rel
->r_offset
;
888 srel
= (bfd_signed_vma
) relocation
+ rel
->r_addend
;
889 x
= bfd_get_16 (input_bfd
, contents
);
890 x
= (x
& 0xf0f0) | (srel
& 0xf) | ((srel
<< 4) & 0xf00);
891 bfd_put_16 (input_bfd
, x
, contents
);
895 contents
+= rel
->r_offset
;
896 srel
= (bfd_signed_vma
) relocation
+ rel
->r_addend
;
897 if (((srel
> 0) && (srel
& 0xffff) > 255)
898 || ((srel
< 0) && ((-srel
) & 0xffff) > 128))
899 /* Remove offset for data/eeprom section. */
900 return bfd_reloc_overflow
;
902 x
= bfd_get_16 (input_bfd
, contents
);
903 x
= (x
& 0xf0f0) | (srel
& 0xf) | ((srel
<< 4) & 0xf00);
904 bfd_put_16 (input_bfd
, x
, contents
);
908 contents
+= rel
->r_offset
;
909 srel
= (bfd_signed_vma
) relocation
+ rel
->r_addend
;
910 if (((srel
& 0xffff) > 63) || (srel
< 0))
911 /* Remove offset for data/eeprom section. */
912 return bfd_reloc_overflow
;
913 x
= bfd_get_16 (input_bfd
, contents
);
914 x
= (x
& 0xd3f8) | ((srel
& 7) | ((srel
& (3 << 3)) << 7)
915 | ((srel
& (1 << 5)) << 8));
916 bfd_put_16 (input_bfd
, x
, contents
);
920 contents
+= rel
->r_offset
;
921 srel
= (bfd_signed_vma
) relocation
+ rel
->r_addend
;
922 if (((srel
& 0xffff) > 63) || (srel
< 0))
923 /* Remove offset for data/eeprom section. */
924 return bfd_reloc_overflow
;
925 x
= bfd_get_16 (input_bfd
, contents
);
926 x
= (x
& 0xff30) | (srel
& 0xf) | ((srel
& 0x30) << 2);
927 bfd_put_16 (input_bfd
, x
, contents
);
931 contents
+= rel
->r_offset
;
932 srel
= (bfd_signed_vma
) relocation
+ rel
->r_addend
;
933 srel
= (srel
>> 8) & 0xff;
934 x
= bfd_get_16 (input_bfd
, contents
);
935 x
= (x
& 0xf0f0) | (srel
& 0xf) | ((srel
<< 4) & 0xf00);
936 bfd_put_16 (input_bfd
, x
, contents
);
940 contents
+= rel
->r_offset
;
941 srel
= (bfd_signed_vma
) relocation
+ rel
->r_addend
;
942 srel
= (srel
>> 16) & 0xff;
943 x
= bfd_get_16 (input_bfd
, contents
);
944 x
= (x
& 0xf0f0) | (srel
& 0xf) | ((srel
<< 4) & 0xf00);
945 bfd_put_16 (input_bfd
, x
, contents
);
949 contents
+= rel
->r_offset
;
950 srel
= (bfd_signed_vma
) relocation
+ rel
->r_addend
;
951 srel
= (srel
>> 24) & 0xff;
952 x
= bfd_get_16 (input_bfd
, contents
);
953 x
= (x
& 0xf0f0) | (srel
& 0xf) | ((srel
<< 4) & 0xf00);
954 bfd_put_16 (input_bfd
, x
, contents
);
957 case R_AVR_LO8_LDI_NEG
:
958 contents
+= rel
->r_offset
;
959 srel
= (bfd_signed_vma
) relocation
+ rel
->r_addend
;
961 x
= bfd_get_16 (input_bfd
, contents
);
962 x
= (x
& 0xf0f0) | (srel
& 0xf) | ((srel
<< 4) & 0xf00);
963 bfd_put_16 (input_bfd
, x
, contents
);
966 case R_AVR_HI8_LDI_NEG
:
967 contents
+= rel
->r_offset
;
968 srel
= (bfd_signed_vma
) relocation
+ rel
->r_addend
;
970 srel
= (srel
>> 8) & 0xff;
971 x
= bfd_get_16 (input_bfd
, contents
);
972 x
= (x
& 0xf0f0) | (srel
& 0xf) | ((srel
<< 4) & 0xf00);
973 bfd_put_16 (input_bfd
, x
, contents
);
976 case R_AVR_HH8_LDI_NEG
:
977 contents
+= rel
->r_offset
;
978 srel
= (bfd_signed_vma
) relocation
+ rel
->r_addend
;
980 srel
= (srel
>> 16) & 0xff;
981 x
= bfd_get_16 (input_bfd
, contents
);
982 x
= (x
& 0xf0f0) | (srel
& 0xf) | ((srel
<< 4) & 0xf00);
983 bfd_put_16 (input_bfd
, x
, contents
);
986 case R_AVR_MS8_LDI_NEG
:
987 contents
+= rel
->r_offset
;
988 srel
= (bfd_signed_vma
) relocation
+ rel
->r_addend
;
990 srel
= (srel
>> 24) & 0xff;
991 x
= bfd_get_16 (input_bfd
, contents
);
992 x
= (x
& 0xf0f0) | (srel
& 0xf) | ((srel
<< 4) & 0xf00);
993 bfd_put_16 (input_bfd
, x
, contents
);
996 case R_AVR_LO8_LDI_GS
:
997 use_stubs
= (!htab
->no_stubs
);
999 case R_AVR_LO8_LDI_PM
:
1000 contents
+= rel
->r_offset
;
1001 srel
= (bfd_signed_vma
) relocation
+ rel
->r_addend
;
1004 && avr_stub_is_required_for_16_bit_reloc (srel
- base_addr
))
1006 bfd_vma old_srel
= srel
;
1008 /* We need to use the address of the stub instead. */
1009 srel
= avr_get_stub_addr (srel
, htab
);
1011 printf ("LD: Using jump stub (at 0x%x) with destination 0x%x for "
1012 "reloc at address 0x%x.\n",
1013 (unsigned int) srel
,
1014 (unsigned int) old_srel
,
1015 (unsigned int) reloc_addr
);
1017 if (avr_stub_is_required_for_16_bit_reloc (srel
- base_addr
))
1018 return bfd_reloc_outofrange
;
1022 return bfd_reloc_outofrange
;
1024 x
= bfd_get_16 (input_bfd
, contents
);
1025 x
= (x
& 0xf0f0) | (srel
& 0xf) | ((srel
<< 4) & 0xf00);
1026 bfd_put_16 (input_bfd
, x
, contents
);
1029 case R_AVR_HI8_LDI_GS
:
1030 use_stubs
= (!htab
->no_stubs
);
1032 case R_AVR_HI8_LDI_PM
:
1033 contents
+= rel
->r_offset
;
1034 srel
= (bfd_signed_vma
) relocation
+ rel
->r_addend
;
1037 && avr_stub_is_required_for_16_bit_reloc (srel
- base_addr
))
1039 bfd_vma old_srel
= srel
;
1041 /* We need to use the address of the stub instead. */
1042 srel
= avr_get_stub_addr (srel
, htab
);
1044 printf ("LD: Using jump stub (at 0x%x) with destination 0x%x for "
1045 "reloc at address 0x%x.\n",
1046 (unsigned int) srel
,
1047 (unsigned int) old_srel
,
1048 (unsigned int) reloc_addr
);
1050 if (avr_stub_is_required_for_16_bit_reloc (srel
- base_addr
))
1051 return bfd_reloc_outofrange
;
1055 return bfd_reloc_outofrange
;
1057 srel
= (srel
>> 8) & 0xff;
1058 x
= bfd_get_16 (input_bfd
, contents
);
1059 x
= (x
& 0xf0f0) | (srel
& 0xf) | ((srel
<< 4) & 0xf00);
1060 bfd_put_16 (input_bfd
, x
, contents
);
1063 case R_AVR_HH8_LDI_PM
:
1064 contents
+= rel
->r_offset
;
1065 srel
= (bfd_signed_vma
) relocation
+ rel
->r_addend
;
1067 return bfd_reloc_outofrange
;
1069 srel
= (srel
>> 16) & 0xff;
1070 x
= bfd_get_16 (input_bfd
, contents
);
1071 x
= (x
& 0xf0f0) | (srel
& 0xf) | ((srel
<< 4) & 0xf00);
1072 bfd_put_16 (input_bfd
, x
, contents
);
1075 case R_AVR_LO8_LDI_PM_NEG
:
1076 contents
+= rel
->r_offset
;
1077 srel
= (bfd_signed_vma
) relocation
+ rel
->r_addend
;
1080 return bfd_reloc_outofrange
;
1082 x
= bfd_get_16 (input_bfd
, contents
);
1083 x
= (x
& 0xf0f0) | (srel
& 0xf) | ((srel
<< 4) & 0xf00);
1084 bfd_put_16 (input_bfd
, x
, contents
);
1087 case R_AVR_HI8_LDI_PM_NEG
:
1088 contents
+= rel
->r_offset
;
1089 srel
= (bfd_signed_vma
) relocation
+ rel
->r_addend
;
1092 return bfd_reloc_outofrange
;
1094 srel
= (srel
>> 8) & 0xff;
1095 x
= bfd_get_16 (input_bfd
, contents
);
1096 x
= (x
& 0xf0f0) | (srel
& 0xf) | ((srel
<< 4) & 0xf00);
1097 bfd_put_16 (input_bfd
, x
, contents
);
1100 case R_AVR_HH8_LDI_PM_NEG
:
1101 contents
+= rel
->r_offset
;
1102 srel
= (bfd_signed_vma
) relocation
+ rel
->r_addend
;
1105 return bfd_reloc_outofrange
;
1107 srel
= (srel
>> 16) & 0xff;
1108 x
= bfd_get_16 (input_bfd
, contents
);
1109 x
= (x
& 0xf0f0) | (srel
& 0xf) | ((srel
<< 4) & 0xf00);
1110 bfd_put_16 (input_bfd
, x
, contents
);
1114 contents
+= rel
->r_offset
;
1115 srel
= (bfd_signed_vma
) relocation
+ rel
->r_addend
;
1117 return bfd_reloc_outofrange
;
1119 x
= bfd_get_16 (input_bfd
, contents
);
1120 x
|= ((srel
& 0x10000) | ((srel
<< 3) & 0x1f00000)) >> 16;
1121 bfd_put_16 (input_bfd
, x
, contents
);
1122 bfd_put_16 (input_bfd
, (bfd_vma
) srel
& 0xffff, contents
+2);
1126 use_stubs
= (!htab
->no_stubs
);
1127 contents
+= rel
->r_offset
;
1128 srel
= (bfd_signed_vma
) relocation
+ rel
->r_addend
;
1131 && avr_stub_is_required_for_16_bit_reloc (srel
- base_addr
))
1133 bfd_vma old_srel
= srel
;
1135 /* We need to use the address of the stub instead. */
1136 srel
= avr_get_stub_addr (srel
,htab
);
1138 printf ("LD: Using jump stub (at 0x%x) with destination 0x%x for "
1139 "reloc at address 0x%x.\n",
1140 (unsigned int) srel
,
1141 (unsigned int) old_srel
,
1142 (unsigned int) reloc_addr
);
1144 if (avr_stub_is_required_for_16_bit_reloc (srel
- base_addr
))
1145 return bfd_reloc_outofrange
;
1149 return bfd_reloc_outofrange
;
1151 bfd_put_16 (input_bfd
, (bfd_vma
) srel
&0x00ffff, contents
);
1155 r
= _bfd_final_link_relocate (howto
, input_bfd
, input_section
,
1156 contents
, rel
->r_offset
,
1157 relocation
, rel
->r_addend
);
1163 /* Relocate an AVR ELF section. */
1166 elf32_avr_relocate_section (bfd
*output_bfd ATTRIBUTE_UNUSED
,
1167 struct bfd_link_info
*info
,
1169 asection
*input_section
,
1171 Elf_Internal_Rela
*relocs
,
1172 Elf_Internal_Sym
*local_syms
,
1173 asection
**local_sections
)
1175 Elf_Internal_Shdr
* symtab_hdr
;
1176 struct elf_link_hash_entry
** sym_hashes
;
1177 Elf_Internal_Rela
* rel
;
1178 Elf_Internal_Rela
* relend
;
1179 struct elf32_avr_link_hash_table
* htab
= avr_link_hash_table (info
);
1184 symtab_hdr
= & elf_tdata (input_bfd
)->symtab_hdr
;
1185 sym_hashes
= elf_sym_hashes (input_bfd
);
1186 relend
= relocs
+ input_section
->reloc_count
;
1188 for (rel
= relocs
; rel
< relend
; rel
++)
1190 reloc_howto_type
* howto
;
1191 unsigned long r_symndx
;
1192 Elf_Internal_Sym
* sym
;
1194 struct elf_link_hash_entry
* h
;
1196 bfd_reloc_status_type r
;
1200 r_type
= ELF32_R_TYPE (rel
->r_info
);
1201 r_symndx
= ELF32_R_SYM (rel
->r_info
);
1202 howto
= elf_avr_howto_table
+ r_type
;
1207 if (r_symndx
< symtab_hdr
->sh_info
)
1209 sym
= local_syms
+ r_symndx
;
1210 sec
= local_sections
[r_symndx
];
1211 relocation
= _bfd_elf_rela_local_sym (output_bfd
, sym
, &sec
, rel
);
1213 name
= bfd_elf_string_from_elf_section
1214 (input_bfd
, symtab_hdr
->sh_link
, sym
->st_name
);
1215 name
= (name
== NULL
) ? bfd_section_name (input_bfd
, sec
) : name
;
1219 bfd_boolean unresolved_reloc
, warned
;
1221 RELOC_FOR_GLOBAL_SYMBOL (info
, input_bfd
, input_section
, rel
,
1222 r_symndx
, symtab_hdr
, sym_hashes
,
1224 unresolved_reloc
, warned
);
1226 name
= h
->root
.root
.string
;
1229 if (sec
!= NULL
&& discarded_section (sec
))
1230 RELOC_AGAINST_DISCARDED_SECTION (info
, input_bfd
, input_section
,
1231 rel
, 1, relend
, howto
, 0, contents
);
1233 if (info
->relocatable
)
1236 r
= avr_final_link_relocate (howto
, input_bfd
, input_section
,
1237 contents
, rel
, relocation
, htab
);
1239 if (r
!= bfd_reloc_ok
)
1241 const char * msg
= (const char *) NULL
;
1245 case bfd_reloc_overflow
:
1246 r
= info
->callbacks
->reloc_overflow
1247 (info
, (h
? &h
->root
: NULL
),
1248 name
, howto
->name
, (bfd_vma
) 0,
1249 input_bfd
, input_section
, rel
->r_offset
);
1252 case bfd_reloc_undefined
:
1253 r
= info
->callbacks
->undefined_symbol
1254 (info
, name
, input_bfd
, input_section
, rel
->r_offset
, TRUE
);
1257 case bfd_reloc_outofrange
:
1258 msg
= _("internal error: out of range error");
1261 case bfd_reloc_notsupported
:
1262 msg
= _("internal error: unsupported relocation error");
1265 case bfd_reloc_dangerous
:
1266 msg
= _("internal error: dangerous relocation");
1270 msg
= _("internal error: unknown error");
1275 r
= info
->callbacks
->warning
1276 (info
, msg
, name
, input_bfd
, input_section
, rel
->r_offset
);
1286 /* The final processing done just before writing out a AVR ELF object
1287 file. This gets the AVR architecture right based on the machine
1291 bfd_elf_avr_final_write_processing (bfd
*abfd
,
1292 bfd_boolean linker ATTRIBUTE_UNUSED
)
1296 switch (bfd_get_mach (abfd
))
1300 val
= E_AVR_MACH_AVR2
;
1304 val
= E_AVR_MACH_AVR1
;
1307 case bfd_mach_avr25
:
1308 val
= E_AVR_MACH_AVR25
;
1312 val
= E_AVR_MACH_AVR3
;
1315 case bfd_mach_avr31
:
1316 val
= E_AVR_MACH_AVR31
;
1319 case bfd_mach_avr35
:
1320 val
= E_AVR_MACH_AVR35
;
1324 val
= E_AVR_MACH_AVR4
;
1328 val
= E_AVR_MACH_AVR5
;
1331 case bfd_mach_avr51
:
1332 val
= E_AVR_MACH_AVR51
;
1336 val
= E_AVR_MACH_AVR6
;
1339 case bfd_mach_avrxmega1
:
1340 val
= E_AVR_MACH_XMEGA1
;
1343 case bfd_mach_avrxmega2
:
1344 val
= E_AVR_MACH_XMEGA2
;
1347 case bfd_mach_avrxmega3
:
1348 val
= E_AVR_MACH_XMEGA3
;
1351 case bfd_mach_avrxmega4
:
1352 val
= E_AVR_MACH_XMEGA4
;
1355 case bfd_mach_avrxmega5
:
1356 val
= E_AVR_MACH_XMEGA5
;
1359 case bfd_mach_avrxmega6
:
1360 val
= E_AVR_MACH_XMEGA6
;
1363 case bfd_mach_avrxmega7
:
1364 val
= E_AVR_MACH_XMEGA7
;
1368 elf_elfheader (abfd
)->e_machine
= EM_AVR
;
1369 elf_elfheader (abfd
)->e_flags
&= ~ EF_AVR_MACH
;
1370 elf_elfheader (abfd
)->e_flags
|= val
;
1371 elf_elfheader (abfd
)->e_flags
|= EF_AVR_LINKRELAX_PREPARED
;
1374 /* Set the right machine number. */
1377 elf32_avr_object_p (bfd
*abfd
)
1379 unsigned int e_set
= bfd_mach_avr2
;
1381 if (elf_elfheader (abfd
)->e_machine
== EM_AVR
1382 || elf_elfheader (abfd
)->e_machine
== EM_AVR_OLD
)
1384 int e_mach
= elf_elfheader (abfd
)->e_flags
& EF_AVR_MACH
;
1389 case E_AVR_MACH_AVR2
:
1390 e_set
= bfd_mach_avr2
;
1393 case E_AVR_MACH_AVR1
:
1394 e_set
= bfd_mach_avr1
;
1397 case E_AVR_MACH_AVR25
:
1398 e_set
= bfd_mach_avr25
;
1401 case E_AVR_MACH_AVR3
:
1402 e_set
= bfd_mach_avr3
;
1405 case E_AVR_MACH_AVR31
:
1406 e_set
= bfd_mach_avr31
;
1409 case E_AVR_MACH_AVR35
:
1410 e_set
= bfd_mach_avr35
;
1413 case E_AVR_MACH_AVR4
:
1414 e_set
= bfd_mach_avr4
;
1417 case E_AVR_MACH_AVR5
:
1418 e_set
= bfd_mach_avr5
;
1421 case E_AVR_MACH_AVR51
:
1422 e_set
= bfd_mach_avr51
;
1425 case E_AVR_MACH_AVR6
:
1426 e_set
= bfd_mach_avr6
;
1429 case E_AVR_MACH_XMEGA1
:
1430 e_set
= bfd_mach_avrxmega1
;
1433 case E_AVR_MACH_XMEGA2
:
1434 e_set
= bfd_mach_avrxmega2
;
1437 case E_AVR_MACH_XMEGA3
:
1438 e_set
= bfd_mach_avrxmega3
;
1441 case E_AVR_MACH_XMEGA4
:
1442 e_set
= bfd_mach_avrxmega4
;
1445 case E_AVR_MACH_XMEGA5
:
1446 e_set
= bfd_mach_avrxmega5
;
1449 case E_AVR_MACH_XMEGA6
:
1450 e_set
= bfd_mach_avrxmega6
;
1453 case E_AVR_MACH_XMEGA7
:
1454 e_set
= bfd_mach_avrxmega7
;
1458 return bfd_default_set_arch_mach (abfd
, bfd_arch_avr
,
1463 /* Delete some bytes from a section while changing the size of an instruction.
1464 The parameter "addr" denotes the section-relative offset pointing just
1465 behind the shrinked instruction. "addr+count" point at the first
1466 byte just behind the original unshrinked instruction. */
1469 elf32_avr_relax_delete_bytes (bfd
*abfd
,
1474 Elf_Internal_Shdr
*symtab_hdr
;
1475 unsigned int sec_shndx
;
1477 Elf_Internal_Rela
*irel
, *irelend
;
1478 Elf_Internal_Sym
*isym
;
1479 Elf_Internal_Sym
*isymbuf
= NULL
;
1481 struct elf_link_hash_entry
**sym_hashes
;
1482 struct elf_link_hash_entry
**end_hashes
;
1483 unsigned int symcount
;
1485 symtab_hdr
= &elf_tdata (abfd
)->symtab_hdr
;
1486 sec_shndx
= _bfd_elf_section_from_bfd_section (abfd
, sec
);
1487 contents
= elf_section_data (sec
)->this_hdr
.contents
;
1491 irel
= elf_section_data (sec
)->relocs
;
1492 irelend
= irel
+ sec
->reloc_count
;
1494 /* Actually delete the bytes. */
1495 if (toaddr
- addr
- count
> 0)
1496 memmove (contents
+ addr
, contents
+ addr
+ count
,
1497 (size_t) (toaddr
- addr
- count
));
1500 /* Adjust all the reloc addresses. */
1501 for (irel
= elf_section_data (sec
)->relocs
; irel
< irelend
; irel
++)
1503 bfd_vma old_reloc_address
;
1505 old_reloc_address
= (sec
->output_section
->vma
1506 + sec
->output_offset
+ irel
->r_offset
);
1508 /* Get the new reloc address. */
1509 if ((irel
->r_offset
> addr
1510 && irel
->r_offset
< toaddr
))
1513 printf ("Relocation at address 0x%x needs to be moved.\n"
1514 "Old section offset: 0x%x, New section offset: 0x%x \n",
1515 (unsigned int) old_reloc_address
,
1516 (unsigned int) irel
->r_offset
,
1517 (unsigned int) ((irel
->r_offset
) - count
));
1519 irel
->r_offset
-= count
;
1524 /* The reloc's own addresses are now ok. However, we need to readjust
1525 the reloc's addend, i.e. the reloc's value if two conditions are met:
1526 1.) the reloc is relative to a symbol in this section that
1527 is located in front of the shrinked instruction
1528 2.) symbol plus addend end up behind the shrinked instruction.
1530 The most common case where this happens are relocs relative to
1531 the section-start symbol.
1533 This step needs to be done for all of the sections of the bfd. */
1536 struct bfd_section
*isec
;
1538 for (isec
= abfd
->sections
; isec
; isec
= isec
->next
)
1541 bfd_vma shrinked_insn_address
;
1543 if (isec
->reloc_count
== 0)
1546 shrinked_insn_address
= (sec
->output_section
->vma
1547 + sec
->output_offset
+ addr
- count
);
1549 irel
= elf_section_data (isec
)->relocs
;
1550 /* PR 12161: Read in the relocs for this section if necessary. */
1552 irel
= _bfd_elf_link_read_relocs (abfd
, isec
, NULL
, NULL
, TRUE
);
1554 for (irelend
= irel
+ isec
->reloc_count
;
1558 /* Read this BFD's local symbols if we haven't done
1560 if (isymbuf
== NULL
&& symtab_hdr
->sh_info
!= 0)
1562 isymbuf
= (Elf_Internal_Sym
*) symtab_hdr
->contents
;
1563 if (isymbuf
== NULL
)
1564 isymbuf
= bfd_elf_get_elf_syms (abfd
, symtab_hdr
,
1565 symtab_hdr
->sh_info
, 0,
1567 if (isymbuf
== NULL
)
1571 /* Get the value of the symbol referred to by the reloc. */
1572 if (ELF32_R_SYM (irel
->r_info
) < symtab_hdr
->sh_info
)
1574 /* A local symbol. */
1577 isym
= isymbuf
+ ELF32_R_SYM (irel
->r_info
);
1578 sym_sec
= bfd_section_from_elf_index (abfd
, isym
->st_shndx
);
1579 symval
= isym
->st_value
;
1580 /* If the reloc is absolute, it will not have
1581 a symbol or section associated with it. */
1584 symval
+= sym_sec
->output_section
->vma
1585 + sym_sec
->output_offset
;
1588 printf ("Checking if the relocation's "
1589 "addend needs corrections.\n"
1590 "Address of anchor symbol: 0x%x \n"
1591 "Address of relocation target: 0x%x \n"
1592 "Address of relaxed insn: 0x%x \n",
1593 (unsigned int) symval
,
1594 (unsigned int) (symval
+ irel
->r_addend
),
1595 (unsigned int) shrinked_insn_address
);
1597 if (symval
<= shrinked_insn_address
1598 && (symval
+ irel
->r_addend
) > shrinked_insn_address
)
1600 irel
->r_addend
-= count
;
1603 printf ("Relocation's addend needed to be fixed \n");
1606 /* else...Reference symbol is absolute. No adjustment needed. */
1608 /* else...Reference symbol is extern. No need for adjusting
1614 /* Adjust the local symbols defined in this section. */
1615 isym
= (Elf_Internal_Sym
*) symtab_hdr
->contents
;
1616 /* Fix PR 9841, there may be no local symbols. */
1619 Elf_Internal_Sym
*isymend
;
1621 isymend
= isym
+ symtab_hdr
->sh_info
;
1622 for (; isym
< isymend
; isym
++)
1624 if (isym
->st_shndx
== sec_shndx
1625 && isym
->st_value
> addr
1626 && isym
->st_value
< toaddr
)
1627 isym
->st_value
-= count
;
1631 /* Now adjust the global symbols defined in this section. */
1632 symcount
= (symtab_hdr
->sh_size
/ sizeof (Elf32_External_Sym
)
1633 - symtab_hdr
->sh_info
);
1634 sym_hashes
= elf_sym_hashes (abfd
);
1635 end_hashes
= sym_hashes
+ symcount
;
1636 for (; sym_hashes
< end_hashes
; sym_hashes
++)
1638 struct elf_link_hash_entry
*sym_hash
= *sym_hashes
;
1639 if ((sym_hash
->root
.type
== bfd_link_hash_defined
1640 || sym_hash
->root
.type
== bfd_link_hash_defweak
)
1641 && sym_hash
->root
.u
.def
.section
== sec
1642 && sym_hash
->root
.u
.def
.value
> addr
1643 && sym_hash
->root
.u
.def
.value
< toaddr
)
1645 sym_hash
->root
.u
.def
.value
-= count
;
1652 /* This function handles relaxing for the avr.
1653 Many important relaxing opportunities within functions are already
1654 realized by the compiler itself.
1655 Here we try to replace call (4 bytes) -> rcall (2 bytes)
1656 and jump -> rjmp (safes also 2 bytes).
1657 As well we now optimize seqences of
1658 - call/rcall function
1663 . In case that within a sequence
1666 the ret could no longer be reached it is optimized away. In order
1667 to check if the ret is no longer needed, it is checked that the ret's address
1668 is not the target of a branch or jump within the same section, it is checked
1669 that there is no skip instruction before the jmp/rjmp and that there
1670 is no local or global label place at the address of the ret.
1672 We refrain from relaxing within sections ".vectors" and
1673 ".jumptables" in order to maintain the position of the instructions.
1674 There, however, we substitute jmp/call by a sequence rjmp,nop/rcall,nop
1675 if possible. (In future one could possibly use the space of the nop
1676 for the first instruction of the irq service function.
1678 The .jumptables sections is meant to be used for a future tablejump variant
1679 for the devices with 3-byte program counter where the table itself
1680 contains 4-byte jump instructions whose relative offset must not
1684 elf32_avr_relax_section (bfd
*abfd
,
1686 struct bfd_link_info
*link_info
,
1689 Elf_Internal_Shdr
*symtab_hdr
;
1690 Elf_Internal_Rela
*internal_relocs
;
1691 Elf_Internal_Rela
*irel
, *irelend
;
1692 bfd_byte
*contents
= NULL
;
1693 Elf_Internal_Sym
*isymbuf
= NULL
;
1694 struct elf32_avr_link_hash_table
*htab
;
1696 /* If 'shrinkable' is FALSE, do not shrink by deleting bytes while
1697 relaxing. Such shrinking can cause issues for the sections such
1698 as .vectors and .jumptables. Instead the unused bytes should be
1699 filled with nop instructions. */
1700 bfd_boolean shrinkable
= TRUE
;
1702 if (!strcmp (sec
->name
,".vectors")
1703 || !strcmp (sec
->name
,".jumptables"))
1706 if (link_info
->relocatable
)
1707 (*link_info
->callbacks
->einfo
)
1708 (_("%P%F: --relax and -r may not be used together\n"));
1710 htab
= avr_link_hash_table (link_info
);
1714 /* Assume nothing changes. */
1717 if ((!htab
->no_stubs
) && (sec
== htab
->stub_sec
))
1719 /* We are just relaxing the stub section.
1720 Let's calculate the size needed again. */
1721 bfd_size_type last_estimated_stub_section_size
= htab
->stub_sec
->size
;
1724 printf ("Relaxing the stub section. Size prior to this pass: %i\n",
1725 (int) last_estimated_stub_section_size
);
1727 elf32_avr_size_stubs (htab
->stub_sec
->output_section
->owner
,
1730 /* Check if the number of trampolines changed. */
1731 if (last_estimated_stub_section_size
!= htab
->stub_sec
->size
)
1735 printf ("Size of stub section after this pass: %i\n",
1736 (int) htab
->stub_sec
->size
);
1741 /* We don't have to do anything for a relocatable link, if
1742 this section does not have relocs, or if this is not a
1744 if (link_info
->relocatable
1745 || (sec
->flags
& SEC_RELOC
) == 0
1746 || sec
->reloc_count
== 0
1747 || (sec
->flags
& SEC_CODE
) == 0)
1750 /* Check if the object file to relax uses internal symbols so that we
1751 could fix up the relocations. */
1752 if (!(elf_elfheader (abfd
)->e_flags
& EF_AVR_LINKRELAX_PREPARED
))
1755 symtab_hdr
= &elf_tdata (abfd
)->symtab_hdr
;
1757 /* Get a copy of the native relocations. */
1758 internal_relocs
= (_bfd_elf_link_read_relocs
1759 (abfd
, sec
, NULL
, NULL
, link_info
->keep_memory
));
1760 if (internal_relocs
== NULL
)
1763 /* Walk through the relocs looking for relaxing opportunities. */
1764 irelend
= internal_relocs
+ sec
->reloc_count
;
1765 for (irel
= internal_relocs
; irel
< irelend
; irel
++)
1769 if ( ELF32_R_TYPE (irel
->r_info
) != R_AVR_13_PCREL
1770 && ELF32_R_TYPE (irel
->r_info
) != R_AVR_7_PCREL
1771 && ELF32_R_TYPE (irel
->r_info
) != R_AVR_CALL
)
1774 /* Get the section contents if we haven't done so already. */
1775 if (contents
== NULL
)
1777 /* Get cached copy if it exists. */
1778 if (elf_section_data (sec
)->this_hdr
.contents
!= NULL
)
1779 contents
= elf_section_data (sec
)->this_hdr
.contents
;
1782 /* Go get them off disk. */
1783 if (! bfd_malloc_and_get_section (abfd
, sec
, &contents
))
1788 /* Read this BFD's local symbols if we haven't done so already. */
1789 if (isymbuf
== NULL
&& symtab_hdr
->sh_info
!= 0)
1791 isymbuf
= (Elf_Internal_Sym
*) symtab_hdr
->contents
;
1792 if (isymbuf
== NULL
)
1793 isymbuf
= bfd_elf_get_elf_syms (abfd
, symtab_hdr
,
1794 symtab_hdr
->sh_info
, 0,
1796 if (isymbuf
== NULL
)
1801 /* Get the value of the symbol referred to by the reloc. */
1802 if (ELF32_R_SYM (irel
->r_info
) < symtab_hdr
->sh_info
)
1804 /* A local symbol. */
1805 Elf_Internal_Sym
*isym
;
1808 isym
= isymbuf
+ ELF32_R_SYM (irel
->r_info
);
1809 sym_sec
= bfd_section_from_elf_index (abfd
, isym
->st_shndx
);
1810 symval
= isym
->st_value
;
1811 /* If the reloc is absolute, it will not have
1812 a symbol or section associated with it. */
1814 symval
+= sym_sec
->output_section
->vma
1815 + sym_sec
->output_offset
;
1820 struct elf_link_hash_entry
*h
;
1822 /* An external symbol. */
1823 indx
= ELF32_R_SYM (irel
->r_info
) - symtab_hdr
->sh_info
;
1824 h
= elf_sym_hashes (abfd
)[indx
];
1825 BFD_ASSERT (h
!= NULL
);
1826 if (h
->root
.type
!= bfd_link_hash_defined
1827 && h
->root
.type
!= bfd_link_hash_defweak
)
1828 /* This appears to be a reference to an undefined
1829 symbol. Just ignore it--it will be caught by the
1830 regular reloc processing. */
1833 symval
= (h
->root
.u
.def
.value
1834 + h
->root
.u
.def
.section
->output_section
->vma
1835 + h
->root
.u
.def
.section
->output_offset
);
1838 /* For simplicity of coding, we are going to modify the section
1839 contents, the section relocs, and the BFD symbol table. We
1840 must tell the rest of the code not to free up this
1841 information. It would be possible to instead create a table
1842 of changes which have to be made, as is done in coff-mips.c;
1843 that would be more work, but would require less memory when
1844 the linker is run. */
1845 switch (ELF32_R_TYPE (irel
->r_info
))
1847 /* Try to turn a 22-bit absolute call/jump into an 13-bit
1848 pc-relative rcall/rjmp. */
1851 bfd_vma value
= symval
+ irel
->r_addend
;
1853 int distance_short_enough
= 0;
1855 /* Get the address of this instruction. */
1856 dot
= (sec
->output_section
->vma
1857 + sec
->output_offset
+ irel
->r_offset
);
1859 /* Compute the distance from this insn to the branch target. */
1862 /* Check if the gap falls in the range that can be accommodated
1863 in 13bits signed (It is 12bits when encoded, as we deal with
1864 word addressing). */
1865 if (!shrinkable
&& ((int) gap
>= -4096 && (int) gap
<= 4095))
1866 distance_short_enough
= 1;
1867 /* If shrinkable, then we can check for a range of distance which
1868 is two bytes farther on both the directions because the call
1869 or jump target will be closer by two bytes after the
1871 else if (shrinkable
&& ((int) gap
>= -4094 && (int) gap
<= 4097))
1872 distance_short_enough
= 1;
1874 /* Here we handle the wrap-around case. E.g. for a 16k device
1875 we could use a rjmp to jump from address 0x100 to 0x3d00!
1876 In order to make this work properly, we need to fill the
1877 vaiable avr_pc_wrap_around with the appropriate value.
1878 I.e. 0x4000 for a 16k device. */
1880 /* Shrinking the code size makes the gaps larger in the
1881 case of wrap-arounds. So we use a heuristical safety
1882 margin to avoid that during relax the distance gets
1883 again too large for the short jumps. Let's assume
1884 a typical code-size reduction due to relax for a
1885 16k device of 600 bytes. So let's use twice the
1886 typical value as safety margin. */
1890 int assumed_shrink
= 600;
1891 if (avr_pc_wrap_around
> 0x4000)
1892 assumed_shrink
= 900;
1894 safety_margin
= 2 * assumed_shrink
;
1896 rgap
= avr_relative_distance_considering_wrap_around (gap
);
1898 if (rgap
>= (-4092 + safety_margin
)
1899 && rgap
<= (4094 - safety_margin
))
1900 distance_short_enough
= 1;
1903 if (distance_short_enough
)
1905 unsigned char code_msb
;
1906 unsigned char code_lsb
;
1909 printf ("shrinking jump/call instruction at address 0x%x"
1910 " in section %s\n\n",
1911 (int) dot
, sec
->name
);
1913 /* Note that we've changed the relocs, section contents,
1915 elf_section_data (sec
)->relocs
= internal_relocs
;
1916 elf_section_data (sec
)->this_hdr
.contents
= contents
;
1917 symtab_hdr
->contents
= (unsigned char *) isymbuf
;
1919 /* Get the instruction code for relaxing. */
1920 code_lsb
= bfd_get_8 (abfd
, contents
+ irel
->r_offset
);
1921 code_msb
= bfd_get_8 (abfd
, contents
+ irel
->r_offset
+ 1);
1923 /* Mask out the relocation bits. */
1926 if (code_msb
== 0x94 && code_lsb
== 0x0E)
1928 /* we are changing call -> rcall . */
1929 bfd_put_8 (abfd
, 0x00, contents
+ irel
->r_offset
);
1930 bfd_put_8 (abfd
, 0xD0, contents
+ irel
->r_offset
+ 1);
1932 else if (code_msb
== 0x94 && code_lsb
== 0x0C)
1934 /* we are changeing jump -> rjmp. */
1935 bfd_put_8 (abfd
, 0x00, contents
+ irel
->r_offset
);
1936 bfd_put_8 (abfd
, 0xC0, contents
+ irel
->r_offset
+ 1);
1941 /* Fix the relocation's type. */
1942 irel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
),
1945 /* We should not modify the ordering if 'shrinkable' is
1949 /* Let's insert a nop. */
1950 bfd_put_8 (abfd
, 0x00, contents
+ irel
->r_offset
+ 2);
1951 bfd_put_8 (abfd
, 0x00, contents
+ irel
->r_offset
+ 3);
1955 /* Delete two bytes of data. */
1956 if (!elf32_avr_relax_delete_bytes (abfd
, sec
,
1957 irel
->r_offset
+ 2, 2))
1960 /* That will change things, so, we should relax again.
1961 Note that this is not required, and it may be slow. */
1969 unsigned char code_msb
;
1970 unsigned char code_lsb
;
1973 code_msb
= bfd_get_8 (abfd
, contents
+ irel
->r_offset
+ 1);
1974 code_lsb
= bfd_get_8 (abfd
, contents
+ irel
->r_offset
+ 0);
1976 /* Get the address of this instruction. */
1977 dot
= (sec
->output_section
->vma
1978 + sec
->output_offset
+ irel
->r_offset
);
1980 /* Here we look for rcall/ret or call/ret sequences that could be
1981 safely replaced by rjmp/ret or jmp/ret. */
1982 if (((code_msb
& 0xf0) == 0xd0)
1983 && avr_replace_call_ret_sequences
)
1985 /* This insn is a rcall. */
1986 unsigned char next_insn_msb
= 0;
1987 unsigned char next_insn_lsb
= 0;
1989 if (irel
->r_offset
+ 3 < sec
->size
)
1992 bfd_get_8 (abfd
, contents
+ irel
->r_offset
+ 3);
1994 bfd_get_8 (abfd
, contents
+ irel
->r_offset
+ 2);
1997 if ((0x95 == next_insn_msb
) && (0x08 == next_insn_lsb
))
1999 /* The next insn is a ret. We now convert the rcall insn
2000 into a rjmp instruction. */
2002 bfd_put_8 (abfd
, code_msb
, contents
+ irel
->r_offset
+ 1);
2004 printf ("converted rcall/ret sequence at address 0x%x"
2005 " into rjmp/ret sequence. Section is %s\n\n",
2006 (int) dot
, sec
->name
);
2011 else if ((0x94 == (code_msb
& 0xfe))
2012 && (0x0e == (code_lsb
& 0x0e))
2013 && avr_replace_call_ret_sequences
)
2015 /* This insn is a call. */
2016 unsigned char next_insn_msb
= 0;
2017 unsigned char next_insn_lsb
= 0;
2019 if (irel
->r_offset
+ 5 < sec
->size
)
2022 bfd_get_8 (abfd
, contents
+ irel
->r_offset
+ 5);
2024 bfd_get_8 (abfd
, contents
+ irel
->r_offset
+ 4);
2027 if ((0x95 == next_insn_msb
) && (0x08 == next_insn_lsb
))
2029 /* The next insn is a ret. We now convert the call insn
2030 into a jmp instruction. */
2033 bfd_put_8 (abfd
, code_lsb
, contents
+ irel
->r_offset
);
2035 printf ("converted call/ret sequence at address 0x%x"
2036 " into jmp/ret sequence. Section is %s\n\n",
2037 (int) dot
, sec
->name
);
2042 else if ((0xc0 == (code_msb
& 0xf0))
2043 || ((0x94 == (code_msb
& 0xfe))
2044 && (0x0c == (code_lsb
& 0x0e))))
2046 /* This insn is a rjmp or a jmp. */
2047 unsigned char next_insn_msb
= 0;
2048 unsigned char next_insn_lsb
= 0;
2051 if (0xc0 == (code_msb
& 0xf0))
2052 insn_size
= 2; /* rjmp insn */
2054 insn_size
= 4; /* jmp insn */
2056 if (irel
->r_offset
+ insn_size
+ 1 < sec
->size
)
2059 bfd_get_8 (abfd
, contents
+ irel
->r_offset
2062 bfd_get_8 (abfd
, contents
+ irel
->r_offset
2066 if ((0x95 == next_insn_msb
) && (0x08 == next_insn_lsb
))
2068 /* The next insn is a ret. We possibly could delete
2069 this ret. First we need to check for preceding
2070 sbis/sbic/sbrs or cpse "skip" instructions. */
2072 int there_is_preceding_non_skip_insn
= 1;
2073 bfd_vma address_of_ret
;
2075 address_of_ret
= dot
+ insn_size
;
2077 if (debug_relax
&& (insn_size
== 2))
2078 printf ("found rjmp / ret sequence at address 0x%x\n",
2080 if (debug_relax
&& (insn_size
== 4))
2081 printf ("found jmp / ret sequence at address 0x%x\n",
2084 /* We have to make sure that there is a preceding insn. */
2085 if (irel
->r_offset
>= 2)
2087 unsigned char preceding_msb
;
2088 unsigned char preceding_lsb
;
2091 bfd_get_8 (abfd
, contents
+ irel
->r_offset
- 1);
2093 bfd_get_8 (abfd
, contents
+ irel
->r_offset
- 2);
2096 if (0x99 == preceding_msb
)
2097 there_is_preceding_non_skip_insn
= 0;
2100 if (0x9b == preceding_msb
)
2101 there_is_preceding_non_skip_insn
= 0;
2104 if ((0xfc == (preceding_msb
& 0xfe)
2105 && (0x00 == (preceding_lsb
& 0x08))))
2106 there_is_preceding_non_skip_insn
= 0;
2109 if ((0xfe == (preceding_msb
& 0xfe)
2110 && (0x00 == (preceding_lsb
& 0x08))))
2111 there_is_preceding_non_skip_insn
= 0;
2114 if (0x10 == (preceding_msb
& 0xfc))
2115 there_is_preceding_non_skip_insn
= 0;
2117 if (there_is_preceding_non_skip_insn
== 0)
2119 printf ("preceding skip insn prevents deletion of"
2120 " ret insn at Addy 0x%x in section %s\n",
2121 (int) dot
+ 2, sec
->name
);
2125 /* There is no previous instruction. */
2126 there_is_preceding_non_skip_insn
= 0;
2129 if (there_is_preceding_non_skip_insn
)
2131 /* We now only have to make sure that there is no
2132 local label defined at the address of the ret
2133 instruction and that there is no local relocation
2134 in this section pointing to the ret. */
2136 int deleting_ret_is_safe
= 1;
2137 unsigned int section_offset_of_ret_insn
=
2138 irel
->r_offset
+ insn_size
;
2139 Elf_Internal_Sym
*isym
, *isymend
;
2140 unsigned int sec_shndx
;
2143 _bfd_elf_section_from_bfd_section (abfd
, sec
);
2145 /* Check for local symbols. */
2146 isym
= (Elf_Internal_Sym
*) symtab_hdr
->contents
;
2147 isymend
= isym
+ symtab_hdr
->sh_info
;
2148 /* PR 6019: There may not be any local symbols. */
2149 for (; isym
!= NULL
&& isym
< isymend
; isym
++)
2151 if (isym
->st_value
== section_offset_of_ret_insn
2152 && isym
->st_shndx
== sec_shndx
)
2154 deleting_ret_is_safe
= 0;
2156 printf ("local label prevents deletion of ret "
2157 "insn at address 0x%x\n",
2158 (int) dot
+ insn_size
);
2162 /* Now check for global symbols. */
2165 struct elf_link_hash_entry
**sym_hashes
;
2166 struct elf_link_hash_entry
**end_hashes
;
2168 symcount
= (symtab_hdr
->sh_size
2169 / sizeof (Elf32_External_Sym
)
2170 - symtab_hdr
->sh_info
);
2171 sym_hashes
= elf_sym_hashes (abfd
);
2172 end_hashes
= sym_hashes
+ symcount
;
2173 for (; sym_hashes
< end_hashes
; sym_hashes
++)
2175 struct elf_link_hash_entry
*sym_hash
=
2177 if ((sym_hash
->root
.type
== bfd_link_hash_defined
2178 || sym_hash
->root
.type
==
2179 bfd_link_hash_defweak
)
2180 && sym_hash
->root
.u
.def
.section
== sec
2181 && sym_hash
->root
.u
.def
.value
== section_offset_of_ret_insn
)
2183 deleting_ret_is_safe
= 0;
2185 printf ("global label prevents deletion of "
2186 "ret insn at address 0x%x\n",
2187 (int) dot
+ insn_size
);
2191 /* Now we check for relocations pointing to ret. */
2193 Elf_Internal_Rela
*rel
;
2194 Elf_Internal_Rela
*relend
;
2196 relend
= elf_section_data (sec
)->relocs
2199 for (rel
= elf_section_data (sec
)->relocs
;
2200 rel
< relend
; rel
++)
2202 bfd_vma reloc_target
= 0;
2204 /* Read this BFD's local symbols if we haven't
2206 if (isymbuf
== NULL
&& symtab_hdr
->sh_info
!= 0)
2208 isymbuf
= (Elf_Internal_Sym
*)
2209 symtab_hdr
->contents
;
2210 if (isymbuf
== NULL
)
2211 isymbuf
= bfd_elf_get_elf_syms
2214 symtab_hdr
->sh_info
, 0,
2216 if (isymbuf
== NULL
)
2220 /* Get the value of the symbol referred to
2222 if (ELF32_R_SYM (rel
->r_info
)
2223 < symtab_hdr
->sh_info
)
2225 /* A local symbol. */
2229 + ELF32_R_SYM (rel
->r_info
);
2230 sym_sec
= bfd_section_from_elf_index
2231 (abfd
, isym
->st_shndx
);
2232 symval
= isym
->st_value
;
2234 /* If the reloc is absolute, it will not
2235 have a symbol or section associated
2241 sym_sec
->output_section
->vma
2242 + sym_sec
->output_offset
;
2243 reloc_target
= symval
+ rel
->r_addend
;
2247 reloc_target
= symval
+ rel
->r_addend
;
2248 /* Reference symbol is absolute. */
2251 /* else ... reference symbol is extern. */
2253 if (address_of_ret
== reloc_target
)
2255 deleting_ret_is_safe
= 0;
2258 "rjmp/jmp ret sequence at address"
2259 " 0x%x could not be deleted. ret"
2260 " is target of a relocation.\n",
2261 (int) address_of_ret
);
2266 if (deleting_ret_is_safe
)
2269 printf ("unreachable ret instruction "
2270 "at address 0x%x deleted.\n",
2271 (int) dot
+ insn_size
);
2273 /* Delete two bytes of data. */
2274 if (!elf32_avr_relax_delete_bytes (abfd
, sec
,
2275 irel
->r_offset
+ insn_size
, 2))
2278 /* That will change things, so, we should relax
2279 again. Note that this is not required, and it
2293 if (contents
!= NULL
2294 && elf_section_data (sec
)->this_hdr
.contents
!= contents
)
2296 if (! link_info
->keep_memory
)
2300 /* Cache the section contents for elf_link_input_bfd. */
2301 elf_section_data (sec
)->this_hdr
.contents
= contents
;
2305 if (internal_relocs
!= NULL
2306 && elf_section_data (sec
)->relocs
!= internal_relocs
)
2307 free (internal_relocs
);
2313 && symtab_hdr
->contents
!= (unsigned char *) isymbuf
)
2315 if (contents
!= NULL
2316 && elf_section_data (sec
)->this_hdr
.contents
!= contents
)
2318 if (internal_relocs
!= NULL
2319 && elf_section_data (sec
)->relocs
!= internal_relocs
)
2320 free (internal_relocs
);
2325 /* This is a version of bfd_generic_get_relocated_section_contents
2326 which uses elf32_avr_relocate_section.
2328 For avr it's essentially a cut and paste taken from the H8300 port.
2329 The author of the relaxation support patch for avr had absolutely no
2330 clue what is happening here but found out that this part of the code
2331 seems to be important. */
2334 elf32_avr_get_relocated_section_contents (bfd
*output_bfd
,
2335 struct bfd_link_info
*link_info
,
2336 struct bfd_link_order
*link_order
,
2338 bfd_boolean relocatable
,
2341 Elf_Internal_Shdr
*symtab_hdr
;
2342 asection
*input_section
= link_order
->u
.indirect
.section
;
2343 bfd
*input_bfd
= input_section
->owner
;
2344 asection
**sections
= NULL
;
2345 Elf_Internal_Rela
*internal_relocs
= NULL
;
2346 Elf_Internal_Sym
*isymbuf
= NULL
;
2348 /* We only need to handle the case of relaxing, or of having a
2349 particular set of section contents, specially. */
2351 || elf_section_data (input_section
)->this_hdr
.contents
== NULL
)
2352 return bfd_generic_get_relocated_section_contents (output_bfd
, link_info
,
2356 symtab_hdr
= &elf_tdata (input_bfd
)->symtab_hdr
;
2358 memcpy (data
, elf_section_data (input_section
)->this_hdr
.contents
,
2359 (size_t) input_section
->size
);
2361 if ((input_section
->flags
& SEC_RELOC
) != 0
2362 && input_section
->reloc_count
> 0)
2365 Elf_Internal_Sym
*isym
, *isymend
;
2368 internal_relocs
= (_bfd_elf_link_read_relocs
2369 (input_bfd
, input_section
, NULL
, NULL
, FALSE
));
2370 if (internal_relocs
== NULL
)
2373 if (symtab_hdr
->sh_info
!= 0)
2375 isymbuf
= (Elf_Internal_Sym
*) symtab_hdr
->contents
;
2376 if (isymbuf
== NULL
)
2377 isymbuf
= bfd_elf_get_elf_syms (input_bfd
, symtab_hdr
,
2378 symtab_hdr
->sh_info
, 0,
2380 if (isymbuf
== NULL
)
2384 amt
= symtab_hdr
->sh_info
;
2385 amt
*= sizeof (asection
*);
2386 sections
= bfd_malloc (amt
);
2387 if (sections
== NULL
&& amt
!= 0)
2390 isymend
= isymbuf
+ symtab_hdr
->sh_info
;
2391 for (isym
= isymbuf
, secpp
= sections
; isym
< isymend
; ++isym
, ++secpp
)
2395 if (isym
->st_shndx
== SHN_UNDEF
)
2396 isec
= bfd_und_section_ptr
;
2397 else if (isym
->st_shndx
== SHN_ABS
)
2398 isec
= bfd_abs_section_ptr
;
2399 else if (isym
->st_shndx
== SHN_COMMON
)
2400 isec
= bfd_com_section_ptr
;
2402 isec
= bfd_section_from_elf_index (input_bfd
, isym
->st_shndx
);
2407 if (! elf32_avr_relocate_section (output_bfd
, link_info
, input_bfd
,
2408 input_section
, data
, internal_relocs
,
2412 if (sections
!= NULL
)
2415 && symtab_hdr
->contents
!= (unsigned char *) isymbuf
)
2417 if (elf_section_data (input_section
)->relocs
!= internal_relocs
)
2418 free (internal_relocs
);
2424 if (sections
!= NULL
)
2427 && symtab_hdr
->contents
!= (unsigned char *) isymbuf
)
2429 if (internal_relocs
!= NULL
2430 && elf_section_data (input_section
)->relocs
!= internal_relocs
)
2431 free (internal_relocs
);
2436 /* Determines the hash entry name for a particular reloc. It consists of
2437 the identifier of the symbol section and the added reloc addend and
2438 symbol offset relative to the section the symbol is attached to. */
2441 avr_stub_name (const asection
*symbol_section
,
2442 const bfd_vma symbol_offset
,
2443 const Elf_Internal_Rela
*rela
)
2448 len
= 8 + 1 + 8 + 1 + 1;
2449 stub_name
= bfd_malloc (len
);
2451 sprintf (stub_name
, "%08x+%08x",
2452 symbol_section
->id
& 0xffffffff,
2453 (unsigned int) ((rela
->r_addend
& 0xffffffff) + symbol_offset
));
2459 /* Add a new stub entry to the stub hash. Not all fields of the new
2460 stub entry are initialised. */
2462 static struct elf32_avr_stub_hash_entry
*
2463 avr_add_stub (const char *stub_name
,
2464 struct elf32_avr_link_hash_table
*htab
)
2466 struct elf32_avr_stub_hash_entry
*hsh
;
2468 /* Enter this entry into the linker stub hash table. */
2469 hsh
= avr_stub_hash_lookup (&htab
->bstab
, stub_name
, TRUE
, FALSE
);
2473 (*_bfd_error_handler
) (_("%B: cannot create stub entry %s"),
2478 hsh
->stub_offset
= 0;
2482 /* We assume that there is already space allocated for the stub section
2483 contents and that before building the stubs the section size is
2484 initialized to 0. We assume that within the stub hash table entry,
2485 the absolute position of the jmp target has been written in the
2486 target_value field. We write here the offset of the generated jmp insn
2487 relative to the trampoline section start to the stub_offset entry in
2488 the stub hash table entry. */
2491 avr_build_one_stub (struct bfd_hash_entry
*bh
, void *in_arg
)
2493 struct elf32_avr_stub_hash_entry
*hsh
;
2494 struct bfd_link_info
*info
;
2495 struct elf32_avr_link_hash_table
*htab
;
2502 bfd_vma jmp_insn
= 0x0000940c;
2504 /* Massage our args to the form they really have. */
2505 hsh
= avr_stub_hash_entry (bh
);
2507 if (!hsh
->is_actually_needed
)
2510 info
= (struct bfd_link_info
*) in_arg
;
2512 htab
= avr_link_hash_table (info
);
2516 target
= hsh
->target_value
;
2518 /* Make a note of the offset within the stubs for this entry. */
2519 hsh
->stub_offset
= htab
->stub_sec
->size
;
2520 loc
= htab
->stub_sec
->contents
+ hsh
->stub_offset
;
2522 stub_bfd
= htab
->stub_sec
->owner
;
2525 printf ("Building one Stub. Address: 0x%x, Offset: 0x%x\n",
2526 (unsigned int) target
,
2527 (unsigned int) hsh
->stub_offset
);
2529 /* We now have to add the information on the jump target to the bare
2530 opcode bits already set in jmp_insn. */
2532 /* Check for the alignment of the address. */
2536 starget
= target
>> 1;
2537 jmp_insn
|= ((starget
& 0x10000) | ((starget
<< 3) & 0x1f00000)) >> 16;
2538 bfd_put_16 (stub_bfd
, jmp_insn
, loc
);
2539 bfd_put_16 (stub_bfd
, (bfd_vma
) starget
& 0xffff, loc
+ 2);
2541 htab
->stub_sec
->size
+= 4;
2543 /* Now add the entries in the address mapping table if there is still
2548 nr
= htab
->amt_entry_cnt
+ 1;
2549 if (nr
<= htab
->amt_max_entry_cnt
)
2551 htab
->amt_entry_cnt
= nr
;
2553 htab
->amt_stub_offsets
[nr
- 1] = hsh
->stub_offset
;
2554 htab
->amt_destination_addr
[nr
- 1] = target
;
2562 avr_mark_stub_not_to_be_necessary (struct bfd_hash_entry
*bh
,
2563 void *in_arg ATTRIBUTE_UNUSED
)
2565 struct elf32_avr_stub_hash_entry
*hsh
;
2567 hsh
= avr_stub_hash_entry (bh
);
2568 hsh
->is_actually_needed
= FALSE
;
2574 avr_size_one_stub (struct bfd_hash_entry
*bh
, void *in_arg
)
2576 struct elf32_avr_stub_hash_entry
*hsh
;
2577 struct elf32_avr_link_hash_table
*htab
;
2580 /* Massage our args to the form they really have. */
2581 hsh
= avr_stub_hash_entry (bh
);
2584 if (hsh
->is_actually_needed
)
2589 htab
->stub_sec
->size
+= size
;
2594 elf32_avr_setup_params (struct bfd_link_info
*info
,
2596 asection
*avr_stub_section
,
2597 bfd_boolean no_stubs
,
2598 bfd_boolean deb_stubs
,
2599 bfd_boolean deb_relax
,
2600 bfd_vma pc_wrap_around
,
2601 bfd_boolean call_ret_replacement
)
2603 struct elf32_avr_link_hash_table
*htab
= avr_link_hash_table (info
);
2607 htab
->stub_sec
= avr_stub_section
;
2608 htab
->stub_bfd
= avr_stub_bfd
;
2609 htab
->no_stubs
= no_stubs
;
2611 debug_relax
= deb_relax
;
2612 debug_stubs
= deb_stubs
;
2613 avr_pc_wrap_around
= pc_wrap_around
;
2614 avr_replace_call_ret_sequences
= call_ret_replacement
;
2618 /* Set up various things so that we can make a list of input sections
2619 for each output section included in the link. Returns -1 on error,
2620 0 when no stubs will be needed, and 1 on success. It also sets
2621 information on the stubs bfd and the stub section in the info
2625 elf32_avr_setup_section_lists (bfd
*output_bfd
,
2626 struct bfd_link_info
*info
)
2629 unsigned int bfd_count
;
2630 int top_id
, top_index
;
2632 asection
**input_list
, **list
;
2634 struct elf32_avr_link_hash_table
*htab
= avr_link_hash_table (info
);
2636 if (htab
== NULL
|| htab
->no_stubs
)
2639 /* Count the number of input BFDs and find the top input section id. */
2640 for (input_bfd
= info
->input_bfds
, bfd_count
= 0, top_id
= 0;
2642 input_bfd
= input_bfd
->link_next
)
2645 for (section
= input_bfd
->sections
;
2647 section
= section
->next
)
2648 if (top_id
< section
->id
)
2649 top_id
= section
->id
;
2652 htab
->bfd_count
= bfd_count
;
2654 /* We can't use output_bfd->section_count here to find the top output
2655 section index as some sections may have been removed, and
2656 strip_excluded_output_sections doesn't renumber the indices. */
2657 for (section
= output_bfd
->sections
, top_index
= 0;
2659 section
= section
->next
)
2660 if (top_index
< section
->index
)
2661 top_index
= section
->index
;
2663 htab
->top_index
= top_index
;
2664 amt
= sizeof (asection
*) * (top_index
+ 1);
2665 input_list
= bfd_malloc (amt
);
2666 htab
->input_list
= input_list
;
2667 if (input_list
== NULL
)
2670 /* For sections we aren't interested in, mark their entries with a
2671 value we can check later. */
2672 list
= input_list
+ top_index
;
2674 *list
= bfd_abs_section_ptr
;
2675 while (list
-- != input_list
);
2677 for (section
= output_bfd
->sections
;
2679 section
= section
->next
)
2680 if ((section
->flags
& SEC_CODE
) != 0)
2681 input_list
[section
->index
] = NULL
;
2687 /* Read in all local syms for all input bfds, and create hash entries
2688 for export stubs if we are building a multi-subspace shared lib.
2689 Returns -1 on error, 0 otherwise. */
2692 get_local_syms (bfd
*input_bfd
, struct bfd_link_info
*info
)
2694 unsigned int bfd_indx
;
2695 Elf_Internal_Sym
*local_syms
, **all_local_syms
;
2696 struct elf32_avr_link_hash_table
*htab
= avr_link_hash_table (info
);
2702 /* We want to read in symbol extension records only once. To do this
2703 we need to read in the local symbols in parallel and save them for
2704 later use; so hold pointers to the local symbols in an array. */
2705 amt
= sizeof (Elf_Internal_Sym
*) * htab
->bfd_count
;
2706 all_local_syms
= bfd_zmalloc (amt
);
2707 htab
->all_local_syms
= all_local_syms
;
2708 if (all_local_syms
== NULL
)
2711 /* Walk over all the input BFDs, swapping in local symbols.
2712 If we are creating a shared library, create hash entries for the
2716 input_bfd
= input_bfd
->link_next
, bfd_indx
++)
2718 Elf_Internal_Shdr
*symtab_hdr
;
2720 /* We'll need the symbol table in a second. */
2721 symtab_hdr
= &elf_tdata (input_bfd
)->symtab_hdr
;
2722 if (symtab_hdr
->sh_info
== 0)
2725 /* We need an array of the local symbols attached to the input bfd. */
2726 local_syms
= (Elf_Internal_Sym
*) symtab_hdr
->contents
;
2727 if (local_syms
== NULL
)
2729 local_syms
= bfd_elf_get_elf_syms (input_bfd
, symtab_hdr
,
2730 symtab_hdr
->sh_info
, 0,
2732 /* Cache them for elf_link_input_bfd. */
2733 symtab_hdr
->contents
= (unsigned char *) local_syms
;
2735 if (local_syms
== NULL
)
2738 all_local_syms
[bfd_indx
] = local_syms
;
2744 #define ADD_DUMMY_STUBS_FOR_DEBUGGING 0
2747 elf32_avr_size_stubs (bfd
*output_bfd
,
2748 struct bfd_link_info
*info
,
2749 bfd_boolean is_prealloc_run
)
2751 struct elf32_avr_link_hash_table
*htab
;
2752 int stub_changed
= 0;
2754 htab
= avr_link_hash_table (info
);
2758 /* At this point we initialize htab->vector_base
2759 To the start of the text output section. */
2760 htab
->vector_base
= htab
->stub_sec
->output_section
->vma
;
2762 if (get_local_syms (info
->input_bfds
, info
))
2764 if (htab
->all_local_syms
)
2765 goto error_ret_free_local
;
2769 if (ADD_DUMMY_STUBS_FOR_DEBUGGING
)
2771 struct elf32_avr_stub_hash_entry
*test
;
2773 test
= avr_add_stub ("Hugo",htab
);
2774 test
->target_value
= 0x123456;
2775 test
->stub_offset
= 13;
2777 test
= avr_add_stub ("Hugo2",htab
);
2778 test
->target_value
= 0x84210;
2779 test
->stub_offset
= 14;
2785 unsigned int bfd_indx
;
2787 /* We will have to re-generate the stub hash table each time anything
2788 in memory has changed. */
2790 bfd_hash_traverse (&htab
->bstab
, avr_mark_stub_not_to_be_necessary
, htab
);
2791 for (input_bfd
= info
->input_bfds
, bfd_indx
= 0;
2793 input_bfd
= input_bfd
->link_next
, bfd_indx
++)
2795 Elf_Internal_Shdr
*symtab_hdr
;
2797 Elf_Internal_Sym
*local_syms
;
2799 /* We'll need the symbol table in a second. */
2800 symtab_hdr
= &elf_tdata (input_bfd
)->symtab_hdr
;
2801 if (symtab_hdr
->sh_info
== 0)
2804 local_syms
= htab
->all_local_syms
[bfd_indx
];
2806 /* Walk over each section attached to the input bfd. */
2807 for (section
= input_bfd
->sections
;
2809 section
= section
->next
)
2811 Elf_Internal_Rela
*internal_relocs
, *irelaend
, *irela
;
2813 /* If there aren't any relocs, then there's nothing more
2815 if ((section
->flags
& SEC_RELOC
) == 0
2816 || section
->reloc_count
== 0)
2819 /* If this section is a link-once section that will be
2820 discarded, then don't create any stubs. */
2821 if (section
->output_section
== NULL
2822 || section
->output_section
->owner
!= output_bfd
)
2825 /* Get the relocs. */
2827 = _bfd_elf_link_read_relocs (input_bfd
, section
, NULL
, NULL
,
2829 if (internal_relocs
== NULL
)
2830 goto error_ret_free_local
;
2832 /* Now examine each relocation. */
2833 irela
= internal_relocs
;
2834 irelaend
= irela
+ section
->reloc_count
;
2835 for (; irela
< irelaend
; irela
++)
2837 unsigned int r_type
, r_indx
;
2838 struct elf32_avr_stub_hash_entry
*hsh
;
2841 bfd_vma destination
;
2842 struct elf_link_hash_entry
*hh
;
2845 r_type
= ELF32_R_TYPE (irela
->r_info
);
2846 r_indx
= ELF32_R_SYM (irela
->r_info
);
2848 /* Only look for 16 bit GS relocs. No other reloc will need a
2850 if (!((r_type
== R_AVR_16_PM
)
2851 || (r_type
== R_AVR_LO8_LDI_GS
)
2852 || (r_type
== R_AVR_HI8_LDI_GS
)))
2855 /* Now determine the call target, its name, value,
2861 if (r_indx
< symtab_hdr
->sh_info
)
2863 /* It's a local symbol. */
2864 Elf_Internal_Sym
*sym
;
2865 Elf_Internal_Shdr
*hdr
;
2868 sym
= local_syms
+ r_indx
;
2869 if (ELF_ST_TYPE (sym
->st_info
) != STT_SECTION
)
2870 sym_value
= sym
->st_value
;
2871 shndx
= sym
->st_shndx
;
2872 if (shndx
< elf_numsections (input_bfd
))
2874 hdr
= elf_elfsections (input_bfd
)[shndx
];
2875 sym_sec
= hdr
->bfd_section
;
2876 destination
= (sym_value
+ irela
->r_addend
2877 + sym_sec
->output_offset
2878 + sym_sec
->output_section
->vma
);
2883 /* It's an external symbol. */
2886 e_indx
= r_indx
- symtab_hdr
->sh_info
;
2887 hh
= elf_sym_hashes (input_bfd
)[e_indx
];
2889 while (hh
->root
.type
== bfd_link_hash_indirect
2890 || hh
->root
.type
== bfd_link_hash_warning
)
2891 hh
= (struct elf_link_hash_entry
*)
2892 (hh
->root
.u
.i
.link
);
2894 if (hh
->root
.type
== bfd_link_hash_defined
2895 || hh
->root
.type
== bfd_link_hash_defweak
)
2897 sym_sec
= hh
->root
.u
.def
.section
;
2898 sym_value
= hh
->root
.u
.def
.value
;
2899 if (sym_sec
->output_section
!= NULL
)
2900 destination
= (sym_value
+ irela
->r_addend
2901 + sym_sec
->output_offset
2902 + sym_sec
->output_section
->vma
);
2904 else if (hh
->root
.type
== bfd_link_hash_undefweak
)
2909 else if (hh
->root
.type
== bfd_link_hash_undefined
)
2911 if (! (info
->unresolved_syms_in_objects
== RM_IGNORE
2912 && (ELF_ST_VISIBILITY (hh
->other
)
2918 bfd_set_error (bfd_error_bad_value
);
2920 error_ret_free_internal
:
2921 if (elf_section_data (section
)->relocs
== NULL
)
2922 free (internal_relocs
);
2923 goto error_ret_free_local
;
2927 if (! avr_stub_is_required_for_16_bit_reloc
2928 (destination
- htab
->vector_base
))
2930 if (!is_prealloc_run
)
2931 /* We are having a reloc that does't need a stub. */
2934 /* We don't right now know if a stub will be needed.
2935 Let's rather be on the safe side. */
2938 /* Get the name of this stub. */
2939 stub_name
= avr_stub_name (sym_sec
, sym_value
, irela
);
2942 goto error_ret_free_internal
;
2945 hsh
= avr_stub_hash_lookup (&htab
->bstab
,
2950 /* The proper stub has already been created. Mark it
2951 to be used and write the possibly changed destination
2953 hsh
->is_actually_needed
= TRUE
;
2954 hsh
->target_value
= destination
;
2959 hsh
= avr_add_stub (stub_name
, htab
);
2963 goto error_ret_free_internal
;
2966 hsh
->is_actually_needed
= TRUE
;
2967 hsh
->target_value
= destination
;
2970 printf ("Adding stub with destination 0x%x to the"
2971 " hash table.\n", (unsigned int) destination
);
2973 printf ("(Pre-Alloc run: %i)\n", is_prealloc_run
);
2975 stub_changed
= TRUE
;
2978 /* We're done with the internal relocs, free them. */
2979 if (elf_section_data (section
)->relocs
== NULL
)
2980 free (internal_relocs
);
2984 /* Re-Calculate the number of needed stubs. */
2985 htab
->stub_sec
->size
= 0;
2986 bfd_hash_traverse (&htab
->bstab
, avr_size_one_stub
, htab
);
2991 stub_changed
= FALSE
;
2994 free (htab
->all_local_syms
);
2997 error_ret_free_local
:
2998 free (htab
->all_local_syms
);
3003 /* Build all the stubs associated with the current output file. The
3004 stubs are kept in a hash table attached to the main linker hash
3005 table. We also set up the .plt entries for statically linked PIC
3006 functions here. This function is called via hppaelf_finish in the
3010 elf32_avr_build_stubs (struct bfd_link_info
*info
)
3013 struct bfd_hash_table
*table
;
3014 struct elf32_avr_link_hash_table
*htab
;
3015 bfd_size_type total_size
= 0;
3017 htab
= avr_link_hash_table (info
);
3021 /* In case that there were several stub sections: */
3022 for (stub_sec
= htab
->stub_bfd
->sections
;
3024 stub_sec
= stub_sec
->next
)
3028 /* Allocate memory to hold the linker stubs. */
3029 size
= stub_sec
->size
;
3032 stub_sec
->contents
= bfd_zalloc (htab
->stub_bfd
, size
);
3033 if (stub_sec
->contents
== NULL
&& size
!= 0)
3038 /* Allocate memory for the adress mapping table. */
3039 htab
->amt_entry_cnt
= 0;
3040 htab
->amt_max_entry_cnt
= total_size
/ 4;
3041 htab
->amt_stub_offsets
= bfd_malloc (sizeof (bfd_vma
)
3042 * htab
->amt_max_entry_cnt
);
3043 htab
->amt_destination_addr
= bfd_malloc (sizeof (bfd_vma
)
3044 * htab
->amt_max_entry_cnt
);
3047 printf ("Allocating %i entries in the AMT\n", htab
->amt_max_entry_cnt
);
3049 /* Build the stubs as directed by the stub hash table. */
3050 table
= &htab
->bstab
;
3051 bfd_hash_traverse (table
, avr_build_one_stub
, info
);
3054 printf ("Final Stub section Size: %i\n", (int) htab
->stub_sec
->size
);
3059 #define ELF_ARCH bfd_arch_avr
3060 #define ELF_TARGET_ID AVR_ELF_DATA
3061 #define ELF_MACHINE_CODE EM_AVR
3062 #define ELF_MACHINE_ALT1 EM_AVR_OLD
3063 #define ELF_MAXPAGESIZE 1
3065 #define TARGET_LITTLE_SYM bfd_elf32_avr_vec
3066 #define TARGET_LITTLE_NAME "elf32-avr"
3068 #define bfd_elf32_bfd_link_hash_table_create elf32_avr_link_hash_table_create
3069 #define bfd_elf32_bfd_link_hash_table_free elf32_avr_link_hash_table_free
3071 #define elf_info_to_howto avr_info_to_howto_rela
3072 #define elf_info_to_howto_rel NULL
3073 #define elf_backend_relocate_section elf32_avr_relocate_section
3074 #define elf_backend_can_gc_sections 1
3075 #define elf_backend_rela_normal 1
3076 #define elf_backend_final_write_processing \
3077 bfd_elf_avr_final_write_processing
3078 #define elf_backend_object_p elf32_avr_object_p
3080 #define bfd_elf32_bfd_relax_section elf32_avr_relax_section
3081 #define bfd_elf32_bfd_get_relocated_section_contents \
3082 elf32_avr_get_relocated_section_contents
3084 #include "elf32-target.h"