1 /* AVR-specific support for 32-bit ELF
2 Copyright 1999-2013 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 /* Hash table initialization and handling. Code is taken from the hppa port
36 and adapted to the needs of AVR. */
38 /* We use two hash tables to hold information for linking avr objects.
40 The first is the elf32_avr_link_hash_table which is derived from the
41 stanard ELF linker hash table. We use this as a place to attach the other
42 hash table and some static information.
44 The second is the stub hash table which is derived from the base BFD
45 hash table. The stub hash table holds the information on the linker
48 struct elf32_avr_stub_hash_entry
50 /* Base hash table entry structure. */
51 struct bfd_hash_entry bh_root
;
53 /* Offset within stub_sec of the beginning of this stub. */
56 /* Given the symbol's value and its section we can determine its final
57 value when building the stubs (so the stub knows where to jump). */
60 /* This way we could mark stubs to be no longer necessary. */
61 bfd_boolean is_actually_needed
;
64 struct elf32_avr_link_hash_table
66 /* The main hash table. */
67 struct elf_link_hash_table etab
;
69 /* The stub hash table. */
70 struct bfd_hash_table bstab
;
74 /* Linker stub bfd. */
77 /* The stub section. */
80 /* Usually 0, unless we are generating code for a bootloader. Will
81 be initialized by elf32_avr_size_stubs to the vma offset of the
82 output section associated with the stub section. */
85 /* Assorted information used by elf32_avr_size_stubs. */
86 unsigned int bfd_count
;
88 asection
** input_list
;
89 Elf_Internal_Sym
** all_local_syms
;
91 /* Tables for mapping vma beyond the 128k boundary to the address of the
92 corresponding stub. (AMT)
93 "amt_max_entry_cnt" reflects the number of entries that memory is allocated
94 for in the "amt_stub_offsets" and "amt_destination_addr" arrays.
95 "amt_entry_cnt" informs how many of these entries actually contain
97 unsigned int amt_entry_cnt
;
98 unsigned int amt_max_entry_cnt
;
99 bfd_vma
* amt_stub_offsets
;
100 bfd_vma
* amt_destination_addr
;
103 /* Various hash macros and functions. */
104 #define avr_link_hash_table(p) \
105 /* PR 3874: Check that we have an AVR style hash table before using it. */\
106 (elf_hash_table_id ((struct elf_link_hash_table *) ((p)->hash)) \
107 == AVR_ELF_DATA ? ((struct elf32_avr_link_hash_table *) ((p)->hash)) : NULL)
109 #define avr_stub_hash_entry(ent) \
110 ((struct elf32_avr_stub_hash_entry *)(ent))
112 #define avr_stub_hash_lookup(table, string, create, copy) \
113 ((struct elf32_avr_stub_hash_entry *) \
114 bfd_hash_lookup ((table), (string), (create), (copy)))
116 static reloc_howto_type elf_avr_howto_table
[] =
118 HOWTO (R_AVR_NONE
, /* type */
120 2, /* size (0 = byte, 1 = short, 2 = long) */
122 FALSE
, /* pc_relative */
124 complain_overflow_bitfield
, /* complain_on_overflow */
125 bfd_elf_generic_reloc
, /* special_function */
126 "R_AVR_NONE", /* name */
127 FALSE
, /* partial_inplace */
130 FALSE
), /* pcrel_offset */
132 HOWTO (R_AVR_32
, /* type */
134 2, /* size (0 = byte, 1 = short, 2 = long) */
136 FALSE
, /* pc_relative */
138 complain_overflow_bitfield
, /* complain_on_overflow */
139 bfd_elf_generic_reloc
, /* special_function */
140 "R_AVR_32", /* name */
141 FALSE
, /* partial_inplace */
142 0xffffffff, /* src_mask */
143 0xffffffff, /* dst_mask */
144 FALSE
), /* pcrel_offset */
146 /* A 7 bit PC relative relocation. */
147 HOWTO (R_AVR_7_PCREL
, /* type */
149 1, /* size (0 = byte, 1 = short, 2 = long) */
151 TRUE
, /* pc_relative */
153 complain_overflow_bitfield
, /* complain_on_overflow */
154 bfd_elf_generic_reloc
, /* special_function */
155 "R_AVR_7_PCREL", /* name */
156 FALSE
, /* partial_inplace */
157 0xffff, /* src_mask */
158 0xffff, /* dst_mask */
159 TRUE
), /* pcrel_offset */
161 /* A 13 bit PC relative relocation. */
162 HOWTO (R_AVR_13_PCREL
, /* type */
164 1, /* size (0 = byte, 1 = short, 2 = long) */
166 TRUE
, /* pc_relative */
168 complain_overflow_bitfield
, /* complain_on_overflow */
169 bfd_elf_generic_reloc
, /* special_function */
170 "R_AVR_13_PCREL", /* name */
171 FALSE
, /* partial_inplace */
172 0xfff, /* src_mask */
173 0xfff, /* dst_mask */
174 TRUE
), /* pcrel_offset */
176 /* A 16 bit absolute relocation. */
177 HOWTO (R_AVR_16
, /* type */
179 1, /* size (0 = byte, 1 = short, 2 = long) */
181 FALSE
, /* pc_relative */
183 complain_overflow_dont
, /* complain_on_overflow */
184 bfd_elf_generic_reloc
, /* special_function */
185 "R_AVR_16", /* name */
186 FALSE
, /* partial_inplace */
187 0xffff, /* src_mask */
188 0xffff, /* dst_mask */
189 FALSE
), /* pcrel_offset */
191 /* A 16 bit absolute relocation for command address
192 Will be changed when linker stubs are needed. */
193 HOWTO (R_AVR_16_PM
, /* type */
195 1, /* size (0 = byte, 1 = short, 2 = long) */
197 FALSE
, /* pc_relative */
199 complain_overflow_bitfield
, /* complain_on_overflow */
200 bfd_elf_generic_reloc
, /* special_function */
201 "R_AVR_16_PM", /* name */
202 FALSE
, /* partial_inplace */
203 0xffff, /* src_mask */
204 0xffff, /* dst_mask */
205 FALSE
), /* pcrel_offset */
206 /* A low 8 bit absolute relocation of 16 bit address.
208 HOWTO (R_AVR_LO8_LDI
, /* type */
210 1, /* size (0 = byte, 1 = short, 2 = long) */
212 FALSE
, /* pc_relative */
214 complain_overflow_dont
, /* complain_on_overflow */
215 bfd_elf_generic_reloc
, /* special_function */
216 "R_AVR_LO8_LDI", /* name */
217 FALSE
, /* partial_inplace */
218 0xffff, /* src_mask */
219 0xffff, /* dst_mask */
220 FALSE
), /* pcrel_offset */
221 /* A high 8 bit absolute relocation of 16 bit address.
223 HOWTO (R_AVR_HI8_LDI
, /* type */
225 1, /* size (0 = byte, 1 = short, 2 = long) */
227 FALSE
, /* pc_relative */
229 complain_overflow_dont
, /* complain_on_overflow */
230 bfd_elf_generic_reloc
, /* special_function */
231 "R_AVR_HI8_LDI", /* name */
232 FALSE
, /* partial_inplace */
233 0xffff, /* src_mask */
234 0xffff, /* dst_mask */
235 FALSE
), /* pcrel_offset */
236 /* A high 6 bit absolute relocation of 22 bit address.
237 For LDI command. As well second most significant 8 bit value of
238 a 32 bit link-time constant. */
239 HOWTO (R_AVR_HH8_LDI
, /* type */
241 1, /* size (0 = byte, 1 = short, 2 = long) */
243 FALSE
, /* pc_relative */
245 complain_overflow_dont
, /* complain_on_overflow */
246 bfd_elf_generic_reloc
, /* special_function */
247 "R_AVR_HH8_LDI", /* name */
248 FALSE
, /* partial_inplace */
249 0xffff, /* src_mask */
250 0xffff, /* dst_mask */
251 FALSE
), /* pcrel_offset */
252 /* A negative low 8 bit absolute relocation of 16 bit address.
254 HOWTO (R_AVR_LO8_LDI_NEG
, /* type */
256 1, /* size (0 = byte, 1 = short, 2 = long) */
258 FALSE
, /* pc_relative */
260 complain_overflow_dont
, /* complain_on_overflow */
261 bfd_elf_generic_reloc
, /* special_function */
262 "R_AVR_LO8_LDI_NEG", /* name */
263 FALSE
, /* partial_inplace */
264 0xffff, /* src_mask */
265 0xffff, /* dst_mask */
266 FALSE
), /* pcrel_offset */
267 /* A negative high 8 bit absolute relocation of 16 bit address.
269 HOWTO (R_AVR_HI8_LDI_NEG
, /* type */
271 1, /* size (0 = byte, 1 = short, 2 = long) */
273 FALSE
, /* pc_relative */
275 complain_overflow_dont
, /* complain_on_overflow */
276 bfd_elf_generic_reloc
, /* special_function */
277 "R_AVR_HI8_LDI_NEG", /* name */
278 FALSE
, /* partial_inplace */
279 0xffff, /* src_mask */
280 0xffff, /* dst_mask */
281 FALSE
), /* pcrel_offset */
282 /* A negative high 6 bit absolute relocation of 22 bit address.
284 HOWTO (R_AVR_HH8_LDI_NEG
, /* type */
286 1, /* size (0 = byte, 1 = short, 2 = long) */
288 FALSE
, /* pc_relative */
290 complain_overflow_dont
, /* complain_on_overflow */
291 bfd_elf_generic_reloc
, /* special_function */
292 "R_AVR_HH8_LDI_NEG", /* name */
293 FALSE
, /* partial_inplace */
294 0xffff, /* src_mask */
295 0xffff, /* dst_mask */
296 FALSE
), /* pcrel_offset */
297 /* A low 8 bit absolute relocation of 24 bit program memory address.
298 For LDI command. Will not be changed when linker stubs are needed. */
299 HOWTO (R_AVR_LO8_LDI_PM
, /* type */
301 1, /* size (0 = byte, 1 = short, 2 = long) */
303 FALSE
, /* pc_relative */
305 complain_overflow_dont
, /* complain_on_overflow */
306 bfd_elf_generic_reloc
, /* special_function */
307 "R_AVR_LO8_LDI_PM", /* name */
308 FALSE
, /* partial_inplace */
309 0xffff, /* src_mask */
310 0xffff, /* dst_mask */
311 FALSE
), /* pcrel_offset */
312 /* A low 8 bit absolute relocation of 24 bit program memory address.
313 For LDI command. Will not be changed when linker stubs are needed. */
314 HOWTO (R_AVR_HI8_LDI_PM
, /* type */
316 1, /* size (0 = byte, 1 = short, 2 = long) */
318 FALSE
, /* pc_relative */
320 complain_overflow_dont
, /* complain_on_overflow */
321 bfd_elf_generic_reloc
, /* special_function */
322 "R_AVR_HI8_LDI_PM", /* name */
323 FALSE
, /* partial_inplace */
324 0xffff, /* src_mask */
325 0xffff, /* dst_mask */
326 FALSE
), /* pcrel_offset */
327 /* A low 8 bit absolute relocation of 24 bit program memory address.
328 For LDI command. Will not be changed when linker stubs are needed. */
329 HOWTO (R_AVR_HH8_LDI_PM
, /* type */
331 1, /* size (0 = byte, 1 = short, 2 = long) */
333 FALSE
, /* pc_relative */
335 complain_overflow_dont
, /* complain_on_overflow */
336 bfd_elf_generic_reloc
, /* special_function */
337 "R_AVR_HH8_LDI_PM", /* name */
338 FALSE
, /* partial_inplace */
339 0xffff, /* src_mask */
340 0xffff, /* dst_mask */
341 FALSE
), /* pcrel_offset */
342 /* A low 8 bit absolute relocation of 24 bit program memory address.
343 For LDI command. Will not be changed when linker stubs are needed. */
344 HOWTO (R_AVR_LO8_LDI_PM_NEG
, /* type */
346 1, /* size (0 = byte, 1 = short, 2 = long) */
348 FALSE
, /* pc_relative */
350 complain_overflow_dont
, /* complain_on_overflow */
351 bfd_elf_generic_reloc
, /* special_function */
352 "R_AVR_LO8_LDI_PM_NEG", /* name */
353 FALSE
, /* partial_inplace */
354 0xffff, /* src_mask */
355 0xffff, /* dst_mask */
356 FALSE
), /* pcrel_offset */
357 /* A low 8 bit absolute relocation of 24 bit program memory address.
358 For LDI command. Will not be changed when linker stubs are needed. */
359 HOWTO (R_AVR_HI8_LDI_PM_NEG
, /* type */
361 1, /* size (0 = byte, 1 = short, 2 = long) */
363 FALSE
, /* pc_relative */
365 complain_overflow_dont
, /* complain_on_overflow */
366 bfd_elf_generic_reloc
, /* special_function */
367 "R_AVR_HI8_LDI_PM_NEG", /* name */
368 FALSE
, /* partial_inplace */
369 0xffff, /* src_mask */
370 0xffff, /* dst_mask */
371 FALSE
), /* pcrel_offset */
372 /* A low 8 bit absolute relocation of 24 bit program memory address.
373 For LDI command. Will not be changed when linker stubs are needed. */
374 HOWTO (R_AVR_HH8_LDI_PM_NEG
, /* type */
376 1, /* size (0 = byte, 1 = short, 2 = long) */
378 FALSE
, /* pc_relative */
380 complain_overflow_dont
, /* complain_on_overflow */
381 bfd_elf_generic_reloc
, /* special_function */
382 "R_AVR_HH8_LDI_PM_NEG", /* name */
383 FALSE
, /* partial_inplace */
384 0xffff, /* src_mask */
385 0xffff, /* dst_mask */
386 FALSE
), /* pcrel_offset */
387 /* Relocation for CALL command in ATmega. */
388 HOWTO (R_AVR_CALL
, /* type */
390 2, /* size (0 = byte, 1 = short, 2 = long) */
392 FALSE
, /* pc_relative */
394 complain_overflow_dont
,/* complain_on_overflow */
395 bfd_elf_generic_reloc
, /* special_function */
396 "R_AVR_CALL", /* name */
397 FALSE
, /* partial_inplace */
398 0xffffffff, /* src_mask */
399 0xffffffff, /* dst_mask */
400 FALSE
), /* pcrel_offset */
401 /* A 16 bit absolute relocation of 16 bit address.
403 HOWTO (R_AVR_LDI
, /* type */
405 1, /* size (0 = byte, 1 = short, 2 = long) */
407 FALSE
, /* pc_relative */
409 complain_overflow_dont
,/* complain_on_overflow */
410 bfd_elf_generic_reloc
, /* special_function */
411 "R_AVR_LDI", /* name */
412 FALSE
, /* partial_inplace */
413 0xffff, /* src_mask */
414 0xffff, /* dst_mask */
415 FALSE
), /* pcrel_offset */
416 /* A 6 bit absolute relocation of 6 bit offset.
417 For ldd/sdd command. */
418 HOWTO (R_AVR_6
, /* type */
420 0, /* size (0 = byte, 1 = short, 2 = long) */
422 FALSE
, /* pc_relative */
424 complain_overflow_dont
,/* complain_on_overflow */
425 bfd_elf_generic_reloc
, /* special_function */
426 "R_AVR_6", /* name */
427 FALSE
, /* partial_inplace */
428 0xffff, /* src_mask */
429 0xffff, /* dst_mask */
430 FALSE
), /* pcrel_offset */
431 /* A 6 bit absolute relocation of 6 bit offset.
432 For sbiw/adiw command. */
433 HOWTO (R_AVR_6_ADIW
, /* type */
435 0, /* size (0 = byte, 1 = short, 2 = long) */
437 FALSE
, /* pc_relative */
439 complain_overflow_dont
,/* complain_on_overflow */
440 bfd_elf_generic_reloc
, /* special_function */
441 "R_AVR_6_ADIW", /* name */
442 FALSE
, /* partial_inplace */
443 0xffff, /* src_mask */
444 0xffff, /* dst_mask */
445 FALSE
), /* pcrel_offset */
446 /* Most significant 8 bit value of a 32 bit link-time constant. */
447 HOWTO (R_AVR_MS8_LDI
, /* type */
449 1, /* size (0 = byte, 1 = short, 2 = long) */
451 FALSE
, /* pc_relative */
453 complain_overflow_dont
, /* complain_on_overflow */
454 bfd_elf_generic_reloc
, /* special_function */
455 "R_AVR_MS8_LDI", /* name */
456 FALSE
, /* partial_inplace */
457 0xffff, /* src_mask */
458 0xffff, /* dst_mask */
459 FALSE
), /* pcrel_offset */
460 /* Negative most significant 8 bit value of a 32 bit link-time constant. */
461 HOWTO (R_AVR_MS8_LDI_NEG
, /* type */
463 1, /* size (0 = byte, 1 = short, 2 = long) */
465 FALSE
, /* pc_relative */
467 complain_overflow_dont
, /* complain_on_overflow */
468 bfd_elf_generic_reloc
, /* special_function */
469 "R_AVR_MS8_LDI_NEG", /* name */
470 FALSE
, /* partial_inplace */
471 0xffff, /* src_mask */
472 0xffff, /* dst_mask */
473 FALSE
), /* pcrel_offset */
474 /* A low 8 bit absolute relocation of 24 bit program memory address.
475 For LDI command. Will be changed when linker stubs are needed. */
476 HOWTO (R_AVR_LO8_LDI_GS
, /* type */
478 1, /* size (0 = byte, 1 = short, 2 = long) */
480 FALSE
, /* pc_relative */
482 complain_overflow_dont
, /* complain_on_overflow */
483 bfd_elf_generic_reloc
, /* special_function */
484 "R_AVR_LO8_LDI_GS", /* name */
485 FALSE
, /* partial_inplace */
486 0xffff, /* src_mask */
487 0xffff, /* dst_mask */
488 FALSE
), /* pcrel_offset */
489 /* A low 8 bit absolute relocation of 24 bit program memory address.
490 For LDI command. Will be changed when linker stubs are needed. */
491 HOWTO (R_AVR_HI8_LDI_GS
, /* type */
493 1, /* size (0 = byte, 1 = short, 2 = long) */
495 FALSE
, /* pc_relative */
497 complain_overflow_dont
, /* complain_on_overflow */
498 bfd_elf_generic_reloc
, /* special_function */
499 "R_AVR_HI8_LDI_GS", /* name */
500 FALSE
, /* partial_inplace */
501 0xffff, /* src_mask */
502 0xffff, /* dst_mask */
503 FALSE
), /* pcrel_offset */
505 HOWTO (R_AVR_8
, /* type */
507 0, /* size (0 = byte, 1 = short, 2 = long) */
509 FALSE
, /* pc_relative */
511 complain_overflow_bitfield
,/* complain_on_overflow */
512 bfd_elf_generic_reloc
, /* special_function */
513 "R_AVR_8", /* name */
514 FALSE
, /* partial_inplace */
515 0x000000ff, /* src_mask */
516 0x000000ff, /* dst_mask */
517 FALSE
), /* pcrel_offset */
518 /* lo8-part to use in .byte lo8(sym). */
519 HOWTO (R_AVR_8_LO8
, /* type */
521 0, /* size (0 = byte, 1 = short, 2 = long) */
523 FALSE
, /* pc_relative */
525 complain_overflow_dont
,/* complain_on_overflow */
526 bfd_elf_generic_reloc
, /* special_function */
527 "R_AVR_8_LO8", /* name */
528 FALSE
, /* partial_inplace */
529 0xffffff, /* src_mask */
530 0xffffff, /* dst_mask */
531 FALSE
), /* pcrel_offset */
532 /* hi8-part to use in .byte hi8(sym). */
533 HOWTO (R_AVR_8_HI8
, /* type */
535 0, /* size (0 = byte, 1 = short, 2 = long) */
537 FALSE
, /* pc_relative */
539 complain_overflow_dont
,/* complain_on_overflow */
540 bfd_elf_generic_reloc
, /* special_function */
541 "R_AVR_8_HI8", /* name */
542 FALSE
, /* partial_inplace */
543 0xffffff, /* src_mask */
544 0xffffff, /* dst_mask */
545 FALSE
), /* pcrel_offset */
546 /* hlo8-part to use in .byte hlo8(sym). */
547 HOWTO (R_AVR_8_HLO8
, /* type */
549 0, /* size (0 = byte, 1 = short, 2 = long) */
551 FALSE
, /* pc_relative */
553 complain_overflow_dont
,/* complain_on_overflow */
554 bfd_elf_generic_reloc
, /* special_function */
555 "R_AVR_8_HLO8", /* name */
556 FALSE
, /* partial_inplace */
557 0xffffff, /* src_mask */
558 0xffffff, /* dst_mask */
559 FALSE
), /* pcrel_offset */
562 /* Map BFD reloc types to AVR ELF reloc types. */
566 bfd_reloc_code_real_type bfd_reloc_val
;
567 unsigned int elf_reloc_val
;
570 static const struct avr_reloc_map avr_reloc_map
[] =
572 { BFD_RELOC_NONE
, R_AVR_NONE
},
573 { BFD_RELOC_32
, R_AVR_32
},
574 { BFD_RELOC_AVR_7_PCREL
, R_AVR_7_PCREL
},
575 { BFD_RELOC_AVR_13_PCREL
, R_AVR_13_PCREL
},
576 { BFD_RELOC_16
, R_AVR_16
},
577 { BFD_RELOC_AVR_16_PM
, R_AVR_16_PM
},
578 { BFD_RELOC_AVR_LO8_LDI
, R_AVR_LO8_LDI
},
579 { BFD_RELOC_AVR_HI8_LDI
, R_AVR_HI8_LDI
},
580 { BFD_RELOC_AVR_HH8_LDI
, R_AVR_HH8_LDI
},
581 { BFD_RELOC_AVR_MS8_LDI
, R_AVR_MS8_LDI
},
582 { BFD_RELOC_AVR_LO8_LDI_NEG
, R_AVR_LO8_LDI_NEG
},
583 { BFD_RELOC_AVR_HI8_LDI_NEG
, R_AVR_HI8_LDI_NEG
},
584 { BFD_RELOC_AVR_HH8_LDI_NEG
, R_AVR_HH8_LDI_NEG
},
585 { BFD_RELOC_AVR_MS8_LDI_NEG
, R_AVR_MS8_LDI_NEG
},
586 { BFD_RELOC_AVR_LO8_LDI_PM
, R_AVR_LO8_LDI_PM
},
587 { BFD_RELOC_AVR_LO8_LDI_GS
, R_AVR_LO8_LDI_GS
},
588 { BFD_RELOC_AVR_HI8_LDI_PM
, R_AVR_HI8_LDI_PM
},
589 { BFD_RELOC_AVR_HI8_LDI_GS
, R_AVR_HI8_LDI_GS
},
590 { BFD_RELOC_AVR_HH8_LDI_PM
, R_AVR_HH8_LDI_PM
},
591 { BFD_RELOC_AVR_LO8_LDI_PM_NEG
, R_AVR_LO8_LDI_PM_NEG
},
592 { BFD_RELOC_AVR_HI8_LDI_PM_NEG
, R_AVR_HI8_LDI_PM_NEG
},
593 { BFD_RELOC_AVR_HH8_LDI_PM_NEG
, R_AVR_HH8_LDI_PM_NEG
},
594 { BFD_RELOC_AVR_CALL
, R_AVR_CALL
},
595 { BFD_RELOC_AVR_LDI
, R_AVR_LDI
},
596 { BFD_RELOC_AVR_6
, R_AVR_6
},
597 { BFD_RELOC_AVR_6_ADIW
, R_AVR_6_ADIW
},
598 { BFD_RELOC_8
, R_AVR_8
},
599 { BFD_RELOC_AVR_8_LO
, R_AVR_8_LO8
},
600 { BFD_RELOC_AVR_8_HI
, R_AVR_8_HI8
},
601 { BFD_RELOC_AVR_8_HLO
, R_AVR_8_HLO8
}
604 /* Meant to be filled one day with the wrap around address for the
605 specific device. I.e. should get the value 0x4000 for 16k devices,
606 0x8000 for 32k devices and so on.
608 We initialize it here with a value of 0x1000000 resulting in
609 that we will never suggest a wrap-around jump during relaxation.
610 The logic of the source code later on assumes that in
611 avr_pc_wrap_around one single bit is set. */
612 static bfd_vma avr_pc_wrap_around
= 0x10000000;
614 /* If this variable holds a value different from zero, the linker relaxation
615 machine will try to optimize call/ret sequences by a single jump
616 instruction. This option could be switched off by a linker switch. */
617 static int avr_replace_call_ret_sequences
= 1;
619 /* Initialize an entry in the stub hash table. */
621 static struct bfd_hash_entry
*
622 stub_hash_newfunc (struct bfd_hash_entry
*entry
,
623 struct bfd_hash_table
*table
,
626 /* Allocate the structure if it has not already been allocated by a
630 entry
= bfd_hash_allocate (table
,
631 sizeof (struct elf32_avr_stub_hash_entry
));
636 /* Call the allocation method of the superclass. */
637 entry
= bfd_hash_newfunc (entry
, table
, string
);
640 struct elf32_avr_stub_hash_entry
*hsh
;
642 /* Initialize the local fields. */
643 hsh
= avr_stub_hash_entry (entry
);
644 hsh
->stub_offset
= 0;
645 hsh
->target_value
= 0;
651 /* This function is just a straight passthrough to the real
652 function in linker.c. Its prupose is so that its address
653 can be compared inside the avr_link_hash_table macro. */
655 static struct bfd_hash_entry
*
656 elf32_avr_link_hash_newfunc (struct bfd_hash_entry
* entry
,
657 struct bfd_hash_table
* table
,
660 return _bfd_elf_link_hash_newfunc (entry
, table
, string
);
663 /* Create the derived linker hash table. The AVR ELF port uses the derived
664 hash table to keep information specific to the AVR ELF linker (without
665 using static variables). */
667 static struct bfd_link_hash_table
*
668 elf32_avr_link_hash_table_create (bfd
*abfd
)
670 struct elf32_avr_link_hash_table
*htab
;
671 bfd_size_type amt
= sizeof (*htab
);
673 htab
= bfd_zmalloc (amt
);
677 if (!_bfd_elf_link_hash_table_init (&htab
->etab
, abfd
,
678 elf32_avr_link_hash_newfunc
,
679 sizeof (struct elf_link_hash_entry
),
686 /* Init the stub hash table too. */
687 if (!bfd_hash_table_init (&htab
->bstab
, stub_hash_newfunc
,
688 sizeof (struct elf32_avr_stub_hash_entry
)))
691 return &htab
->etab
.root
;
694 /* Free the derived linker hash table. */
697 elf32_avr_link_hash_table_free (struct bfd_link_hash_table
*btab
)
699 struct elf32_avr_link_hash_table
*htab
700 = (struct elf32_avr_link_hash_table
*) btab
;
702 /* Free the address mapping table. */
703 if (htab
->amt_stub_offsets
!= NULL
)
704 free (htab
->amt_stub_offsets
);
705 if (htab
->amt_destination_addr
!= NULL
)
706 free (htab
->amt_destination_addr
);
708 bfd_hash_table_free (&htab
->bstab
);
709 _bfd_elf_link_hash_table_free (btab
);
712 /* Calculates the effective distance of a pc relative jump/call. */
715 avr_relative_distance_considering_wrap_around (unsigned int distance
)
717 unsigned int wrap_around_mask
= avr_pc_wrap_around
- 1;
718 int dist_with_wrap_around
= distance
& wrap_around_mask
;
720 if (dist_with_wrap_around
> ((int) (avr_pc_wrap_around
>> 1)))
721 dist_with_wrap_around
-= avr_pc_wrap_around
;
723 return dist_with_wrap_around
;
727 static reloc_howto_type
*
728 bfd_elf32_bfd_reloc_type_lookup (bfd
*abfd ATTRIBUTE_UNUSED
,
729 bfd_reloc_code_real_type code
)
734 i
< sizeof (avr_reloc_map
) / sizeof (struct avr_reloc_map
);
736 if (avr_reloc_map
[i
].bfd_reloc_val
== code
)
737 return &elf_avr_howto_table
[avr_reloc_map
[i
].elf_reloc_val
];
742 static reloc_howto_type
*
743 bfd_elf32_bfd_reloc_name_lookup (bfd
*abfd ATTRIBUTE_UNUSED
,
749 i
< sizeof (elf_avr_howto_table
) / sizeof (elf_avr_howto_table
[0]);
751 if (elf_avr_howto_table
[i
].name
!= NULL
752 && strcasecmp (elf_avr_howto_table
[i
].name
, r_name
) == 0)
753 return &elf_avr_howto_table
[i
];
758 /* Set the howto pointer for an AVR ELF reloc. */
761 avr_info_to_howto_rela (bfd
*abfd ATTRIBUTE_UNUSED
,
763 Elf_Internal_Rela
*dst
)
767 r_type
= ELF32_R_TYPE (dst
->r_info
);
768 BFD_ASSERT (r_type
< (unsigned int) R_AVR_max
);
769 cache_ptr
->howto
= &elf_avr_howto_table
[r_type
];
773 avr_stub_is_required_for_16_bit_reloc (bfd_vma relocation
)
775 return (relocation
>= 0x020000);
778 /* Returns the address of the corresponding stub if there is one.
779 Returns otherwise an address above 0x020000. This function
780 could also be used, if there is no knowledge on the section where
781 the destination is found. */
784 avr_get_stub_addr (bfd_vma srel
,
785 struct elf32_avr_link_hash_table
*htab
)
788 bfd_vma stub_sec_addr
=
789 (htab
->stub_sec
->output_section
->vma
+
790 htab
->stub_sec
->output_offset
);
792 for (sindex
= 0; sindex
< htab
->amt_max_entry_cnt
; sindex
++)
793 if (htab
->amt_destination_addr
[sindex
] == srel
)
794 return htab
->amt_stub_offsets
[sindex
] + stub_sec_addr
;
796 /* Return an address that could not be reached by 16 bit relocs. */
800 /* Perform a single relocation. By default we use the standard BFD
801 routines, but a few relocs, we have to do them ourselves. */
803 static bfd_reloc_status_type
804 avr_final_link_relocate (reloc_howto_type
* howto
,
806 asection
* input_section
,
808 Elf_Internal_Rela
* rel
,
810 struct elf32_avr_link_hash_table
* htab
)
812 bfd_reloc_status_type r
= bfd_reloc_ok
;
815 bfd_signed_vma reloc_addr
;
816 bfd_boolean use_stubs
= FALSE
;
817 /* Usually is 0, unless we are generating code for a bootloader. */
818 bfd_signed_vma base_addr
= htab
->vector_base
;
820 /* Absolute addr of the reloc in the final excecutable. */
821 reloc_addr
= rel
->r_offset
+ input_section
->output_section
->vma
822 + input_section
->output_offset
;
827 contents
+= rel
->r_offset
;
828 srel
= (bfd_signed_vma
) relocation
;
829 srel
+= rel
->r_addend
;
830 srel
-= rel
->r_offset
;
831 srel
-= 2; /* Branch instructions add 2 to the PC... */
832 srel
-= (input_section
->output_section
->vma
+
833 input_section
->output_offset
);
836 return bfd_reloc_outofrange
;
837 if (srel
> ((1 << 7) - 1) || (srel
< - (1 << 7)))
838 return bfd_reloc_overflow
;
839 x
= bfd_get_16 (input_bfd
, contents
);
840 x
= (x
& 0xfc07) | (((srel
>> 1) << 3) & 0x3f8);
841 bfd_put_16 (input_bfd
, x
, contents
);
845 contents
+= rel
->r_offset
;
846 srel
= (bfd_signed_vma
) relocation
;
847 srel
+= rel
->r_addend
;
848 srel
-= rel
->r_offset
;
849 srel
-= 2; /* Branch instructions add 2 to the PC... */
850 srel
-= (input_section
->output_section
->vma
+
851 input_section
->output_offset
);
854 return bfd_reloc_outofrange
;
856 srel
= avr_relative_distance_considering_wrap_around (srel
);
858 /* AVR addresses commands as words. */
861 /* Check for overflow. */
862 if (srel
< -2048 || srel
> 2047)
864 /* Relative distance is too large. */
866 /* Always apply WRAPAROUND for avr2, avr25, and avr4. */
867 switch (bfd_get_mach (input_bfd
))
875 return bfd_reloc_overflow
;
879 x
= bfd_get_16 (input_bfd
, contents
);
880 x
= (x
& 0xf000) | (srel
& 0xfff);
881 bfd_put_16 (input_bfd
, x
, contents
);
885 contents
+= rel
->r_offset
;
886 srel
= (bfd_signed_vma
) relocation
+ rel
->r_addend
;
887 x
= bfd_get_16 (input_bfd
, contents
);
888 x
= (x
& 0xf0f0) | (srel
& 0xf) | ((srel
<< 4) & 0xf00);
889 bfd_put_16 (input_bfd
, x
, contents
);
893 contents
+= rel
->r_offset
;
894 srel
= (bfd_signed_vma
) relocation
+ rel
->r_addend
;
895 if (((srel
> 0) && (srel
& 0xffff) > 255)
896 || ((srel
< 0) && ((-srel
) & 0xffff) > 128))
897 /* Remove offset for data/eeprom section. */
898 return bfd_reloc_overflow
;
900 x
= bfd_get_16 (input_bfd
, contents
);
901 x
= (x
& 0xf0f0) | (srel
& 0xf) | ((srel
<< 4) & 0xf00);
902 bfd_put_16 (input_bfd
, x
, contents
);
906 contents
+= rel
->r_offset
;
907 srel
= (bfd_signed_vma
) relocation
+ rel
->r_addend
;
908 if (((srel
& 0xffff) > 63) || (srel
< 0))
909 /* Remove offset for data/eeprom section. */
910 return bfd_reloc_overflow
;
911 x
= bfd_get_16 (input_bfd
, contents
);
912 x
= (x
& 0xd3f8) | ((srel
& 7) | ((srel
& (3 << 3)) << 7)
913 | ((srel
& (1 << 5)) << 8));
914 bfd_put_16 (input_bfd
, x
, contents
);
918 contents
+= rel
->r_offset
;
919 srel
= (bfd_signed_vma
) relocation
+ rel
->r_addend
;
920 if (((srel
& 0xffff) > 63) || (srel
< 0))
921 /* Remove offset for data/eeprom section. */
922 return bfd_reloc_overflow
;
923 x
= bfd_get_16 (input_bfd
, contents
);
924 x
= (x
& 0xff30) | (srel
& 0xf) | ((srel
& 0x30) << 2);
925 bfd_put_16 (input_bfd
, x
, contents
);
929 contents
+= rel
->r_offset
;
930 srel
= (bfd_signed_vma
) relocation
+ rel
->r_addend
;
931 srel
= (srel
>> 8) & 0xff;
932 x
= bfd_get_16 (input_bfd
, contents
);
933 x
= (x
& 0xf0f0) | (srel
& 0xf) | ((srel
<< 4) & 0xf00);
934 bfd_put_16 (input_bfd
, x
, contents
);
938 contents
+= rel
->r_offset
;
939 srel
= (bfd_signed_vma
) relocation
+ rel
->r_addend
;
940 srel
= (srel
>> 16) & 0xff;
941 x
= bfd_get_16 (input_bfd
, contents
);
942 x
= (x
& 0xf0f0) | (srel
& 0xf) | ((srel
<< 4) & 0xf00);
943 bfd_put_16 (input_bfd
, x
, contents
);
947 contents
+= rel
->r_offset
;
948 srel
= (bfd_signed_vma
) relocation
+ rel
->r_addend
;
949 srel
= (srel
>> 24) & 0xff;
950 x
= bfd_get_16 (input_bfd
, contents
);
951 x
= (x
& 0xf0f0) | (srel
& 0xf) | ((srel
<< 4) & 0xf00);
952 bfd_put_16 (input_bfd
, x
, contents
);
955 case R_AVR_LO8_LDI_NEG
:
956 contents
+= rel
->r_offset
;
957 srel
= (bfd_signed_vma
) relocation
+ rel
->r_addend
;
959 x
= bfd_get_16 (input_bfd
, contents
);
960 x
= (x
& 0xf0f0) | (srel
& 0xf) | ((srel
<< 4) & 0xf00);
961 bfd_put_16 (input_bfd
, x
, contents
);
964 case R_AVR_HI8_LDI_NEG
:
965 contents
+= rel
->r_offset
;
966 srel
= (bfd_signed_vma
) relocation
+ rel
->r_addend
;
968 srel
= (srel
>> 8) & 0xff;
969 x
= bfd_get_16 (input_bfd
, contents
);
970 x
= (x
& 0xf0f0) | (srel
& 0xf) | ((srel
<< 4) & 0xf00);
971 bfd_put_16 (input_bfd
, x
, contents
);
974 case R_AVR_HH8_LDI_NEG
:
975 contents
+= rel
->r_offset
;
976 srel
= (bfd_signed_vma
) relocation
+ rel
->r_addend
;
978 srel
= (srel
>> 16) & 0xff;
979 x
= bfd_get_16 (input_bfd
, contents
);
980 x
= (x
& 0xf0f0) | (srel
& 0xf) | ((srel
<< 4) & 0xf00);
981 bfd_put_16 (input_bfd
, x
, contents
);
984 case R_AVR_MS8_LDI_NEG
:
985 contents
+= rel
->r_offset
;
986 srel
= (bfd_signed_vma
) relocation
+ rel
->r_addend
;
988 srel
= (srel
>> 24) & 0xff;
989 x
= bfd_get_16 (input_bfd
, contents
);
990 x
= (x
& 0xf0f0) | (srel
& 0xf) | ((srel
<< 4) & 0xf00);
991 bfd_put_16 (input_bfd
, x
, contents
);
994 case R_AVR_LO8_LDI_GS
:
995 use_stubs
= (!htab
->no_stubs
);
997 case R_AVR_LO8_LDI_PM
:
998 contents
+= rel
->r_offset
;
999 srel
= (bfd_signed_vma
) relocation
+ rel
->r_addend
;
1002 && avr_stub_is_required_for_16_bit_reloc (srel
- base_addr
))
1004 bfd_vma old_srel
= srel
;
1006 /* We need to use the address of the stub instead. */
1007 srel
= avr_get_stub_addr (srel
, htab
);
1009 printf ("LD: Using jump stub (at 0x%x) with destination 0x%x for "
1010 "reloc at address 0x%x.\n",
1011 (unsigned int) srel
,
1012 (unsigned int) old_srel
,
1013 (unsigned int) reloc_addr
);
1015 if (avr_stub_is_required_for_16_bit_reloc (srel
- base_addr
))
1016 return bfd_reloc_outofrange
;
1020 return bfd_reloc_outofrange
;
1022 x
= bfd_get_16 (input_bfd
, contents
);
1023 x
= (x
& 0xf0f0) | (srel
& 0xf) | ((srel
<< 4) & 0xf00);
1024 bfd_put_16 (input_bfd
, x
, contents
);
1027 case R_AVR_HI8_LDI_GS
:
1028 use_stubs
= (!htab
->no_stubs
);
1030 case R_AVR_HI8_LDI_PM
:
1031 contents
+= rel
->r_offset
;
1032 srel
= (bfd_signed_vma
) relocation
+ rel
->r_addend
;
1035 && avr_stub_is_required_for_16_bit_reloc (srel
- base_addr
))
1037 bfd_vma old_srel
= srel
;
1039 /* We need to use the address of the stub instead. */
1040 srel
= avr_get_stub_addr (srel
, htab
);
1042 printf ("LD: Using jump stub (at 0x%x) with destination 0x%x for "
1043 "reloc at address 0x%x.\n",
1044 (unsigned int) srel
,
1045 (unsigned int) old_srel
,
1046 (unsigned int) reloc_addr
);
1048 if (avr_stub_is_required_for_16_bit_reloc (srel
- base_addr
))
1049 return bfd_reloc_outofrange
;
1053 return bfd_reloc_outofrange
;
1055 srel
= (srel
>> 8) & 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_HH8_LDI_PM
:
1062 contents
+= rel
->r_offset
;
1063 srel
= (bfd_signed_vma
) relocation
+ rel
->r_addend
;
1065 return bfd_reloc_outofrange
;
1067 srel
= (srel
>> 16) & 0xff;
1068 x
= bfd_get_16 (input_bfd
, contents
);
1069 x
= (x
& 0xf0f0) | (srel
& 0xf) | ((srel
<< 4) & 0xf00);
1070 bfd_put_16 (input_bfd
, x
, contents
);
1073 case R_AVR_LO8_LDI_PM_NEG
:
1074 contents
+= rel
->r_offset
;
1075 srel
= (bfd_signed_vma
) relocation
+ rel
->r_addend
;
1078 return bfd_reloc_outofrange
;
1080 x
= bfd_get_16 (input_bfd
, contents
);
1081 x
= (x
& 0xf0f0) | (srel
& 0xf) | ((srel
<< 4) & 0xf00);
1082 bfd_put_16 (input_bfd
, x
, contents
);
1085 case R_AVR_HI8_LDI_PM_NEG
:
1086 contents
+= rel
->r_offset
;
1087 srel
= (bfd_signed_vma
) relocation
+ rel
->r_addend
;
1090 return bfd_reloc_outofrange
;
1092 srel
= (srel
>> 8) & 0xff;
1093 x
= bfd_get_16 (input_bfd
, contents
);
1094 x
= (x
& 0xf0f0) | (srel
& 0xf) | ((srel
<< 4) & 0xf00);
1095 bfd_put_16 (input_bfd
, x
, contents
);
1098 case R_AVR_HH8_LDI_PM_NEG
:
1099 contents
+= rel
->r_offset
;
1100 srel
= (bfd_signed_vma
) relocation
+ rel
->r_addend
;
1103 return bfd_reloc_outofrange
;
1105 srel
= (srel
>> 16) & 0xff;
1106 x
= bfd_get_16 (input_bfd
, contents
);
1107 x
= (x
& 0xf0f0) | (srel
& 0xf) | ((srel
<< 4) & 0xf00);
1108 bfd_put_16 (input_bfd
, x
, contents
);
1112 contents
+= rel
->r_offset
;
1113 srel
= (bfd_signed_vma
) relocation
+ rel
->r_addend
;
1115 return bfd_reloc_outofrange
;
1117 x
= bfd_get_16 (input_bfd
, contents
);
1118 x
|= ((srel
& 0x10000) | ((srel
<< 3) & 0x1f00000)) >> 16;
1119 bfd_put_16 (input_bfd
, x
, contents
);
1120 bfd_put_16 (input_bfd
, (bfd_vma
) srel
& 0xffff, contents
+2);
1124 use_stubs
= (!htab
->no_stubs
);
1125 contents
+= rel
->r_offset
;
1126 srel
= (bfd_signed_vma
) relocation
+ rel
->r_addend
;
1129 && avr_stub_is_required_for_16_bit_reloc (srel
- base_addr
))
1131 bfd_vma old_srel
= srel
;
1133 /* We need to use the address of the stub instead. */
1134 srel
= avr_get_stub_addr (srel
,htab
);
1136 printf ("LD: Using jump stub (at 0x%x) with destination 0x%x for "
1137 "reloc at address 0x%x.\n",
1138 (unsigned int) srel
,
1139 (unsigned int) old_srel
,
1140 (unsigned int) reloc_addr
);
1142 if (avr_stub_is_required_for_16_bit_reloc (srel
- base_addr
))
1143 return bfd_reloc_outofrange
;
1147 return bfd_reloc_outofrange
;
1149 bfd_put_16 (input_bfd
, (bfd_vma
) srel
&0x00ffff, contents
);
1153 r
= _bfd_final_link_relocate (howto
, input_bfd
, input_section
,
1154 contents
, rel
->r_offset
,
1155 relocation
, rel
->r_addend
);
1161 /* Relocate an AVR ELF section. */
1164 elf32_avr_relocate_section (bfd
*output_bfd ATTRIBUTE_UNUSED
,
1165 struct bfd_link_info
*info
,
1167 asection
*input_section
,
1169 Elf_Internal_Rela
*relocs
,
1170 Elf_Internal_Sym
*local_syms
,
1171 asection
**local_sections
)
1173 Elf_Internal_Shdr
* symtab_hdr
;
1174 struct elf_link_hash_entry
** sym_hashes
;
1175 Elf_Internal_Rela
* rel
;
1176 Elf_Internal_Rela
* relend
;
1177 struct elf32_avr_link_hash_table
* htab
= avr_link_hash_table (info
);
1182 symtab_hdr
= & elf_tdata (input_bfd
)->symtab_hdr
;
1183 sym_hashes
= elf_sym_hashes (input_bfd
);
1184 relend
= relocs
+ input_section
->reloc_count
;
1186 for (rel
= relocs
; rel
< relend
; rel
++)
1188 reloc_howto_type
* howto
;
1189 unsigned long r_symndx
;
1190 Elf_Internal_Sym
* sym
;
1192 struct elf_link_hash_entry
* h
;
1194 bfd_reloc_status_type r
;
1198 r_type
= ELF32_R_TYPE (rel
->r_info
);
1199 r_symndx
= ELF32_R_SYM (rel
->r_info
);
1200 howto
= elf_avr_howto_table
+ r_type
;
1205 if (r_symndx
< symtab_hdr
->sh_info
)
1207 sym
= local_syms
+ r_symndx
;
1208 sec
= local_sections
[r_symndx
];
1209 relocation
= _bfd_elf_rela_local_sym (output_bfd
, sym
, &sec
, rel
);
1211 name
= bfd_elf_string_from_elf_section
1212 (input_bfd
, symtab_hdr
->sh_link
, sym
->st_name
);
1213 name
= (name
== NULL
) ? bfd_section_name (input_bfd
, sec
) : name
;
1217 bfd_boolean unresolved_reloc
, warned
, ignored
;
1219 RELOC_FOR_GLOBAL_SYMBOL (info
, input_bfd
, input_section
, rel
,
1220 r_symndx
, symtab_hdr
, sym_hashes
,
1222 unresolved_reloc
, warned
, ignored
);
1224 name
= h
->root
.root
.string
;
1227 if (sec
!= NULL
&& discarded_section (sec
))
1228 RELOC_AGAINST_DISCARDED_SECTION (info
, input_bfd
, input_section
,
1229 rel
, 1, relend
, howto
, 0, contents
);
1231 if (info
->relocatable
)
1234 r
= avr_final_link_relocate (howto
, input_bfd
, input_section
,
1235 contents
, rel
, relocation
, htab
);
1237 if (r
!= bfd_reloc_ok
)
1239 const char * msg
= (const char *) NULL
;
1243 case bfd_reloc_overflow
:
1244 r
= info
->callbacks
->reloc_overflow
1245 (info
, (h
? &h
->root
: NULL
),
1246 name
, howto
->name
, (bfd_vma
) 0,
1247 input_bfd
, input_section
, rel
->r_offset
);
1250 case bfd_reloc_undefined
:
1251 r
= info
->callbacks
->undefined_symbol
1252 (info
, name
, input_bfd
, input_section
, rel
->r_offset
, TRUE
);
1255 case bfd_reloc_outofrange
:
1256 msg
= _("internal error: out of range error");
1259 case bfd_reloc_notsupported
:
1260 msg
= _("internal error: unsupported relocation error");
1263 case bfd_reloc_dangerous
:
1264 msg
= _("internal error: dangerous relocation");
1268 msg
= _("internal error: unknown error");
1273 r
= info
->callbacks
->warning
1274 (info
, msg
, name
, input_bfd
, input_section
, rel
->r_offset
);
1284 /* The final processing done just before writing out a AVR ELF object
1285 file. This gets the AVR architecture right based on the machine
1289 bfd_elf_avr_final_write_processing (bfd
*abfd
,
1290 bfd_boolean linker ATTRIBUTE_UNUSED
)
1294 switch (bfd_get_mach (abfd
))
1298 val
= E_AVR_MACH_AVR2
;
1302 val
= E_AVR_MACH_AVR1
;
1305 case bfd_mach_avr25
:
1306 val
= E_AVR_MACH_AVR25
;
1310 val
= E_AVR_MACH_AVR3
;
1313 case bfd_mach_avr31
:
1314 val
= E_AVR_MACH_AVR31
;
1317 case bfd_mach_avr35
:
1318 val
= E_AVR_MACH_AVR35
;
1322 val
= E_AVR_MACH_AVR4
;
1326 val
= E_AVR_MACH_AVR5
;
1329 case bfd_mach_avr51
:
1330 val
= E_AVR_MACH_AVR51
;
1334 val
= E_AVR_MACH_AVR6
;
1337 case bfd_mach_avrxmega1
:
1338 val
= E_AVR_MACH_XMEGA1
;
1341 case bfd_mach_avrxmega2
:
1342 val
= E_AVR_MACH_XMEGA2
;
1345 case bfd_mach_avrxmega3
:
1346 val
= E_AVR_MACH_XMEGA3
;
1349 case bfd_mach_avrxmega4
:
1350 val
= E_AVR_MACH_XMEGA4
;
1353 case bfd_mach_avrxmega5
:
1354 val
= E_AVR_MACH_XMEGA5
;
1357 case bfd_mach_avrxmega6
:
1358 val
= E_AVR_MACH_XMEGA6
;
1361 case bfd_mach_avrxmega7
:
1362 val
= E_AVR_MACH_XMEGA7
;
1366 elf_elfheader (abfd
)->e_machine
= EM_AVR
;
1367 elf_elfheader (abfd
)->e_flags
&= ~ EF_AVR_MACH
;
1368 elf_elfheader (abfd
)->e_flags
|= val
;
1369 elf_elfheader (abfd
)->e_flags
|= EF_AVR_LINKRELAX_PREPARED
;
1372 /* Set the right machine number. */
1375 elf32_avr_object_p (bfd
*abfd
)
1377 unsigned int e_set
= bfd_mach_avr2
;
1379 if (elf_elfheader (abfd
)->e_machine
== EM_AVR
1380 || elf_elfheader (abfd
)->e_machine
== EM_AVR_OLD
)
1382 int e_mach
= elf_elfheader (abfd
)->e_flags
& EF_AVR_MACH
;
1387 case E_AVR_MACH_AVR2
:
1388 e_set
= bfd_mach_avr2
;
1391 case E_AVR_MACH_AVR1
:
1392 e_set
= bfd_mach_avr1
;
1395 case E_AVR_MACH_AVR25
:
1396 e_set
= bfd_mach_avr25
;
1399 case E_AVR_MACH_AVR3
:
1400 e_set
= bfd_mach_avr3
;
1403 case E_AVR_MACH_AVR31
:
1404 e_set
= bfd_mach_avr31
;
1407 case E_AVR_MACH_AVR35
:
1408 e_set
= bfd_mach_avr35
;
1411 case E_AVR_MACH_AVR4
:
1412 e_set
= bfd_mach_avr4
;
1415 case E_AVR_MACH_AVR5
:
1416 e_set
= bfd_mach_avr5
;
1419 case E_AVR_MACH_AVR51
:
1420 e_set
= bfd_mach_avr51
;
1423 case E_AVR_MACH_AVR6
:
1424 e_set
= bfd_mach_avr6
;
1427 case E_AVR_MACH_XMEGA1
:
1428 e_set
= bfd_mach_avrxmega1
;
1431 case E_AVR_MACH_XMEGA2
:
1432 e_set
= bfd_mach_avrxmega2
;
1435 case E_AVR_MACH_XMEGA3
:
1436 e_set
= bfd_mach_avrxmega3
;
1439 case E_AVR_MACH_XMEGA4
:
1440 e_set
= bfd_mach_avrxmega4
;
1443 case E_AVR_MACH_XMEGA5
:
1444 e_set
= bfd_mach_avrxmega5
;
1447 case E_AVR_MACH_XMEGA6
:
1448 e_set
= bfd_mach_avrxmega6
;
1451 case E_AVR_MACH_XMEGA7
:
1452 e_set
= bfd_mach_avrxmega7
;
1456 return bfd_default_set_arch_mach (abfd
, bfd_arch_avr
,
1461 /* Delete some bytes from a section while changing the size of an instruction.
1462 The parameter "addr" denotes the section-relative offset pointing just
1463 behind the shrinked instruction. "addr+count" point at the first
1464 byte just behind the original unshrinked instruction. */
1467 elf32_avr_relax_delete_bytes (bfd
*abfd
,
1472 Elf_Internal_Shdr
*symtab_hdr
;
1473 unsigned int sec_shndx
;
1475 Elf_Internal_Rela
*irel
, *irelend
;
1476 Elf_Internal_Sym
*isym
;
1477 Elf_Internal_Sym
*isymbuf
= NULL
;
1479 struct elf_link_hash_entry
**sym_hashes
;
1480 struct elf_link_hash_entry
**end_hashes
;
1481 unsigned int symcount
;
1483 symtab_hdr
= &elf_tdata (abfd
)->symtab_hdr
;
1484 sec_shndx
= _bfd_elf_section_from_bfd_section (abfd
, sec
);
1485 contents
= elf_section_data (sec
)->this_hdr
.contents
;
1489 irel
= elf_section_data (sec
)->relocs
;
1490 irelend
= irel
+ sec
->reloc_count
;
1492 /* Actually delete the bytes. */
1493 if (toaddr
- addr
- count
> 0)
1494 memmove (contents
+ addr
, contents
+ addr
+ count
,
1495 (size_t) (toaddr
- addr
- count
));
1498 /* Adjust all the reloc addresses. */
1499 for (irel
= elf_section_data (sec
)->relocs
; irel
< irelend
; irel
++)
1501 bfd_vma old_reloc_address
;
1503 old_reloc_address
= (sec
->output_section
->vma
1504 + sec
->output_offset
+ irel
->r_offset
);
1506 /* Get the new reloc address. */
1507 if ((irel
->r_offset
> addr
1508 && irel
->r_offset
< toaddr
))
1511 printf ("Relocation at address 0x%x needs to be moved.\n"
1512 "Old section offset: 0x%x, New section offset: 0x%x \n",
1513 (unsigned int) old_reloc_address
,
1514 (unsigned int) irel
->r_offset
,
1515 (unsigned int) ((irel
->r_offset
) - count
));
1517 irel
->r_offset
-= count
;
1522 /* The reloc's own addresses are now ok. However, we need to readjust
1523 the reloc's addend, i.e. the reloc's value if two conditions are met:
1524 1.) the reloc is relative to a symbol in this section that
1525 is located in front of the shrinked instruction
1526 2.) symbol plus addend end up behind the shrinked instruction.
1528 The most common case where this happens are relocs relative to
1529 the section-start symbol.
1531 This step needs to be done for all of the sections of the bfd. */
1534 struct bfd_section
*isec
;
1536 for (isec
= abfd
->sections
; isec
; isec
= isec
->next
)
1539 bfd_vma shrinked_insn_address
;
1541 if (isec
->reloc_count
== 0)
1544 shrinked_insn_address
= (sec
->output_section
->vma
1545 + sec
->output_offset
+ addr
- count
);
1547 irel
= elf_section_data (isec
)->relocs
;
1548 /* PR 12161: Read in the relocs for this section if necessary. */
1550 irel
= _bfd_elf_link_read_relocs (abfd
, isec
, NULL
, NULL
, TRUE
);
1552 for (irelend
= irel
+ isec
->reloc_count
;
1556 /* Read this BFD's local symbols if we haven't done
1558 if (isymbuf
== NULL
&& symtab_hdr
->sh_info
!= 0)
1560 isymbuf
= (Elf_Internal_Sym
*) symtab_hdr
->contents
;
1561 if (isymbuf
== NULL
)
1562 isymbuf
= bfd_elf_get_elf_syms (abfd
, symtab_hdr
,
1563 symtab_hdr
->sh_info
, 0,
1565 if (isymbuf
== NULL
)
1569 /* Get the value of the symbol referred to by the reloc. */
1570 if (ELF32_R_SYM (irel
->r_info
) < symtab_hdr
->sh_info
)
1572 /* A local symbol. */
1575 isym
= isymbuf
+ ELF32_R_SYM (irel
->r_info
);
1576 sym_sec
= bfd_section_from_elf_index (abfd
, isym
->st_shndx
);
1577 symval
= isym
->st_value
;
1578 /* If the reloc is absolute, it will not have
1579 a symbol or section associated with it. */
1582 symval
+= sym_sec
->output_section
->vma
1583 + sym_sec
->output_offset
;
1586 printf ("Checking if the relocation's "
1587 "addend needs corrections.\n"
1588 "Address of anchor symbol: 0x%x \n"
1589 "Address of relocation target: 0x%x \n"
1590 "Address of relaxed insn: 0x%x \n",
1591 (unsigned int) symval
,
1592 (unsigned int) (symval
+ irel
->r_addend
),
1593 (unsigned int) shrinked_insn_address
);
1595 if (symval
<= shrinked_insn_address
1596 && (symval
+ irel
->r_addend
) > shrinked_insn_address
)
1598 irel
->r_addend
-= count
;
1601 printf ("Relocation's addend needed to be fixed \n");
1604 /* else...Reference symbol is absolute. No adjustment needed. */
1606 /* else...Reference symbol is extern. No need for adjusting
1612 /* Adjust the local symbols defined in this section. */
1613 isym
= (Elf_Internal_Sym
*) symtab_hdr
->contents
;
1614 /* Fix PR 9841, there may be no local symbols. */
1617 Elf_Internal_Sym
*isymend
;
1619 isymend
= isym
+ symtab_hdr
->sh_info
;
1620 for (; isym
< isymend
; isym
++)
1622 if (isym
->st_shndx
== sec_shndx
1623 && isym
->st_value
> addr
1624 && isym
->st_value
< toaddr
)
1625 isym
->st_value
-= count
;
1629 /* Now adjust the global symbols defined in this section. */
1630 symcount
= (symtab_hdr
->sh_size
/ sizeof (Elf32_External_Sym
)
1631 - symtab_hdr
->sh_info
);
1632 sym_hashes
= elf_sym_hashes (abfd
);
1633 end_hashes
= sym_hashes
+ symcount
;
1634 for (; sym_hashes
< end_hashes
; sym_hashes
++)
1636 struct elf_link_hash_entry
*sym_hash
= *sym_hashes
;
1637 if ((sym_hash
->root
.type
== bfd_link_hash_defined
1638 || sym_hash
->root
.type
== bfd_link_hash_defweak
)
1639 && sym_hash
->root
.u
.def
.section
== sec
1640 && sym_hash
->root
.u
.def
.value
> addr
1641 && sym_hash
->root
.u
.def
.value
< toaddr
)
1643 sym_hash
->root
.u
.def
.value
-= count
;
1650 /* This function handles relaxing for the avr.
1651 Many important relaxing opportunities within functions are already
1652 realized by the compiler itself.
1653 Here we try to replace call (4 bytes) -> rcall (2 bytes)
1654 and jump -> rjmp (safes also 2 bytes).
1655 As well we now optimize seqences of
1656 - call/rcall function
1661 . In case that within a sequence
1664 the ret could no longer be reached it is optimized away. In order
1665 to check if the ret is no longer needed, it is checked that the ret's address
1666 is not the target of a branch or jump within the same section, it is checked
1667 that there is no skip instruction before the jmp/rjmp and that there
1668 is no local or global label place at the address of the ret.
1670 We refrain from relaxing within sections ".vectors" and
1671 ".jumptables" in order to maintain the position of the instructions.
1672 There, however, we substitute jmp/call by a sequence rjmp,nop/rcall,nop
1673 if possible. (In future one could possibly use the space of the nop
1674 for the first instruction of the irq service function.
1676 The .jumptables sections is meant to be used for a future tablejump variant
1677 for the devices with 3-byte program counter where the table itself
1678 contains 4-byte jump instructions whose relative offset must not
1682 elf32_avr_relax_section (bfd
*abfd
,
1684 struct bfd_link_info
*link_info
,
1687 Elf_Internal_Shdr
*symtab_hdr
;
1688 Elf_Internal_Rela
*internal_relocs
;
1689 Elf_Internal_Rela
*irel
, *irelend
;
1690 bfd_byte
*contents
= NULL
;
1691 Elf_Internal_Sym
*isymbuf
= NULL
;
1692 struct elf32_avr_link_hash_table
*htab
;
1694 /* If 'shrinkable' is FALSE, do not shrink by deleting bytes while
1695 relaxing. Such shrinking can cause issues for the sections such
1696 as .vectors and .jumptables. Instead the unused bytes should be
1697 filled with nop instructions. */
1698 bfd_boolean shrinkable
= TRUE
;
1700 if (!strcmp (sec
->name
,".vectors")
1701 || !strcmp (sec
->name
,".jumptables"))
1704 if (link_info
->relocatable
)
1705 (*link_info
->callbacks
->einfo
)
1706 (_("%P%F: --relax and -r may not be used together\n"));
1708 htab
= avr_link_hash_table (link_info
);
1712 /* Assume nothing changes. */
1715 if ((!htab
->no_stubs
) && (sec
== htab
->stub_sec
))
1717 /* We are just relaxing the stub section.
1718 Let's calculate the size needed again. */
1719 bfd_size_type last_estimated_stub_section_size
= htab
->stub_sec
->size
;
1722 printf ("Relaxing the stub section. Size prior to this pass: %i\n",
1723 (int) last_estimated_stub_section_size
);
1725 elf32_avr_size_stubs (htab
->stub_sec
->output_section
->owner
,
1728 /* Check if the number of trampolines changed. */
1729 if (last_estimated_stub_section_size
!= htab
->stub_sec
->size
)
1733 printf ("Size of stub section after this pass: %i\n",
1734 (int) htab
->stub_sec
->size
);
1739 /* We don't have to do anything for a relocatable link, if
1740 this section does not have relocs, or if this is not a
1742 if (link_info
->relocatable
1743 || (sec
->flags
& SEC_RELOC
) == 0
1744 || sec
->reloc_count
== 0
1745 || (sec
->flags
& SEC_CODE
) == 0)
1748 /* Check if the object file to relax uses internal symbols so that we
1749 could fix up the relocations. */
1750 if (!(elf_elfheader (abfd
)->e_flags
& EF_AVR_LINKRELAX_PREPARED
))
1753 symtab_hdr
= &elf_tdata (abfd
)->symtab_hdr
;
1755 /* Get a copy of the native relocations. */
1756 internal_relocs
= (_bfd_elf_link_read_relocs
1757 (abfd
, sec
, NULL
, NULL
, link_info
->keep_memory
));
1758 if (internal_relocs
== NULL
)
1761 /* Walk through the relocs looking for relaxing opportunities. */
1762 irelend
= internal_relocs
+ sec
->reloc_count
;
1763 for (irel
= internal_relocs
; irel
< irelend
; irel
++)
1767 if ( ELF32_R_TYPE (irel
->r_info
) != R_AVR_13_PCREL
1768 && ELF32_R_TYPE (irel
->r_info
) != R_AVR_7_PCREL
1769 && ELF32_R_TYPE (irel
->r_info
) != R_AVR_CALL
)
1772 /* Get the section contents if we haven't done so already. */
1773 if (contents
== NULL
)
1775 /* Get cached copy if it exists. */
1776 if (elf_section_data (sec
)->this_hdr
.contents
!= NULL
)
1777 contents
= elf_section_data (sec
)->this_hdr
.contents
;
1780 /* Go get them off disk. */
1781 if (! bfd_malloc_and_get_section (abfd
, sec
, &contents
))
1786 /* Read this BFD's local symbols if we haven't done so already. */
1787 if (isymbuf
== NULL
&& symtab_hdr
->sh_info
!= 0)
1789 isymbuf
= (Elf_Internal_Sym
*) symtab_hdr
->contents
;
1790 if (isymbuf
== NULL
)
1791 isymbuf
= bfd_elf_get_elf_syms (abfd
, symtab_hdr
,
1792 symtab_hdr
->sh_info
, 0,
1794 if (isymbuf
== NULL
)
1799 /* Get the value of the symbol referred to by the reloc. */
1800 if (ELF32_R_SYM (irel
->r_info
) < symtab_hdr
->sh_info
)
1802 /* A local symbol. */
1803 Elf_Internal_Sym
*isym
;
1806 isym
= isymbuf
+ ELF32_R_SYM (irel
->r_info
);
1807 sym_sec
= bfd_section_from_elf_index (abfd
, isym
->st_shndx
);
1808 symval
= isym
->st_value
;
1809 /* If the reloc is absolute, it will not have
1810 a symbol or section associated with it. */
1812 symval
+= sym_sec
->output_section
->vma
1813 + sym_sec
->output_offset
;
1818 struct elf_link_hash_entry
*h
;
1820 /* An external symbol. */
1821 indx
= ELF32_R_SYM (irel
->r_info
) - symtab_hdr
->sh_info
;
1822 h
= elf_sym_hashes (abfd
)[indx
];
1823 BFD_ASSERT (h
!= NULL
);
1824 if (h
->root
.type
!= bfd_link_hash_defined
1825 && h
->root
.type
!= bfd_link_hash_defweak
)
1826 /* This appears to be a reference to an undefined
1827 symbol. Just ignore it--it will be caught by the
1828 regular reloc processing. */
1831 symval
= (h
->root
.u
.def
.value
1832 + h
->root
.u
.def
.section
->output_section
->vma
1833 + h
->root
.u
.def
.section
->output_offset
);
1836 /* For simplicity of coding, we are going to modify the section
1837 contents, the section relocs, and the BFD symbol table. We
1838 must tell the rest of the code not to free up this
1839 information. It would be possible to instead create a table
1840 of changes which have to be made, as is done in coff-mips.c;
1841 that would be more work, but would require less memory when
1842 the linker is run. */
1843 switch (ELF32_R_TYPE (irel
->r_info
))
1845 /* Try to turn a 22-bit absolute call/jump into an 13-bit
1846 pc-relative rcall/rjmp. */
1849 bfd_vma value
= symval
+ irel
->r_addend
;
1851 int distance_short_enough
= 0;
1853 /* Get the address of this instruction. */
1854 dot
= (sec
->output_section
->vma
1855 + sec
->output_offset
+ irel
->r_offset
);
1857 /* Compute the distance from this insn to the branch target. */
1860 /* Check if the gap falls in the range that can be accommodated
1861 in 13bits signed (It is 12bits when encoded, as we deal with
1862 word addressing). */
1863 if (!shrinkable
&& ((int) gap
>= -4096 && (int) gap
<= 4095))
1864 distance_short_enough
= 1;
1865 /* If shrinkable, then we can check for a range of distance which
1866 is two bytes farther on both the directions because the call
1867 or jump target will be closer by two bytes after the
1869 else if (shrinkable
&& ((int) gap
>= -4094 && (int) gap
<= 4097))
1870 distance_short_enough
= 1;
1872 /* Here we handle the wrap-around case. E.g. for a 16k device
1873 we could use a rjmp to jump from address 0x100 to 0x3d00!
1874 In order to make this work properly, we need to fill the
1875 vaiable avr_pc_wrap_around with the appropriate value.
1876 I.e. 0x4000 for a 16k device. */
1878 /* Shrinking the code size makes the gaps larger in the
1879 case of wrap-arounds. So we use a heuristical safety
1880 margin to avoid that during relax the distance gets
1881 again too large for the short jumps. Let's assume
1882 a typical code-size reduction due to relax for a
1883 16k device of 600 bytes. So let's use twice the
1884 typical value as safety margin. */
1888 int assumed_shrink
= 600;
1889 if (avr_pc_wrap_around
> 0x4000)
1890 assumed_shrink
= 900;
1892 safety_margin
= 2 * assumed_shrink
;
1894 rgap
= avr_relative_distance_considering_wrap_around (gap
);
1896 if (rgap
>= (-4092 + safety_margin
)
1897 && rgap
<= (4094 - safety_margin
))
1898 distance_short_enough
= 1;
1901 if (distance_short_enough
)
1903 unsigned char code_msb
;
1904 unsigned char code_lsb
;
1907 printf ("shrinking jump/call instruction at address 0x%x"
1908 " in section %s\n\n",
1909 (int) dot
, sec
->name
);
1911 /* Note that we've changed the relocs, section contents,
1913 elf_section_data (sec
)->relocs
= internal_relocs
;
1914 elf_section_data (sec
)->this_hdr
.contents
= contents
;
1915 symtab_hdr
->contents
= (unsigned char *) isymbuf
;
1917 /* Get the instruction code for relaxing. */
1918 code_lsb
= bfd_get_8 (abfd
, contents
+ irel
->r_offset
);
1919 code_msb
= bfd_get_8 (abfd
, contents
+ irel
->r_offset
+ 1);
1921 /* Mask out the relocation bits. */
1924 if (code_msb
== 0x94 && code_lsb
== 0x0E)
1926 /* we are changing call -> rcall . */
1927 bfd_put_8 (abfd
, 0x00, contents
+ irel
->r_offset
);
1928 bfd_put_8 (abfd
, 0xD0, contents
+ irel
->r_offset
+ 1);
1930 else if (code_msb
== 0x94 && code_lsb
== 0x0C)
1932 /* we are changeing jump -> rjmp. */
1933 bfd_put_8 (abfd
, 0x00, contents
+ irel
->r_offset
);
1934 bfd_put_8 (abfd
, 0xC0, contents
+ irel
->r_offset
+ 1);
1939 /* Fix the relocation's type. */
1940 irel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
),
1943 /* We should not modify the ordering if 'shrinkable' is
1947 /* Let's insert a nop. */
1948 bfd_put_8 (abfd
, 0x00, contents
+ irel
->r_offset
+ 2);
1949 bfd_put_8 (abfd
, 0x00, contents
+ irel
->r_offset
+ 3);
1953 /* Delete two bytes of data. */
1954 if (!elf32_avr_relax_delete_bytes (abfd
, sec
,
1955 irel
->r_offset
+ 2, 2))
1958 /* That will change things, so, we should relax again.
1959 Note that this is not required, and it may be slow. */
1967 unsigned char code_msb
;
1968 unsigned char code_lsb
;
1971 code_msb
= bfd_get_8 (abfd
, contents
+ irel
->r_offset
+ 1);
1972 code_lsb
= bfd_get_8 (abfd
, contents
+ irel
->r_offset
+ 0);
1974 /* Get the address of this instruction. */
1975 dot
= (sec
->output_section
->vma
1976 + sec
->output_offset
+ irel
->r_offset
);
1978 /* Here we look for rcall/ret or call/ret sequences that could be
1979 safely replaced by rjmp/ret or jmp/ret. */
1980 if (((code_msb
& 0xf0) == 0xd0)
1981 && avr_replace_call_ret_sequences
)
1983 /* This insn is a rcall. */
1984 unsigned char next_insn_msb
= 0;
1985 unsigned char next_insn_lsb
= 0;
1987 if (irel
->r_offset
+ 3 < sec
->size
)
1990 bfd_get_8 (abfd
, contents
+ irel
->r_offset
+ 3);
1992 bfd_get_8 (abfd
, contents
+ irel
->r_offset
+ 2);
1995 if ((0x95 == next_insn_msb
) && (0x08 == next_insn_lsb
))
1997 /* The next insn is a ret. We now convert the rcall insn
1998 into a rjmp instruction. */
2000 bfd_put_8 (abfd
, code_msb
, contents
+ irel
->r_offset
+ 1);
2002 printf ("converted rcall/ret sequence at address 0x%x"
2003 " into rjmp/ret sequence. Section is %s\n\n",
2004 (int) dot
, sec
->name
);
2009 else if ((0x94 == (code_msb
& 0xfe))
2010 && (0x0e == (code_lsb
& 0x0e))
2011 && avr_replace_call_ret_sequences
)
2013 /* This insn is a call. */
2014 unsigned char next_insn_msb
= 0;
2015 unsigned char next_insn_lsb
= 0;
2017 if (irel
->r_offset
+ 5 < sec
->size
)
2020 bfd_get_8 (abfd
, contents
+ irel
->r_offset
+ 5);
2022 bfd_get_8 (abfd
, contents
+ irel
->r_offset
+ 4);
2025 if ((0x95 == next_insn_msb
) && (0x08 == next_insn_lsb
))
2027 /* The next insn is a ret. We now convert the call insn
2028 into a jmp instruction. */
2031 bfd_put_8 (abfd
, code_lsb
, contents
+ irel
->r_offset
);
2033 printf ("converted call/ret sequence at address 0x%x"
2034 " into jmp/ret sequence. Section is %s\n\n",
2035 (int) dot
, sec
->name
);
2040 else if ((0xc0 == (code_msb
& 0xf0))
2041 || ((0x94 == (code_msb
& 0xfe))
2042 && (0x0c == (code_lsb
& 0x0e))))
2044 /* This insn is a rjmp or a jmp. */
2045 unsigned char next_insn_msb
= 0;
2046 unsigned char next_insn_lsb
= 0;
2049 if (0xc0 == (code_msb
& 0xf0))
2050 insn_size
= 2; /* rjmp insn */
2052 insn_size
= 4; /* jmp insn */
2054 if (irel
->r_offset
+ insn_size
+ 1 < sec
->size
)
2057 bfd_get_8 (abfd
, contents
+ irel
->r_offset
2060 bfd_get_8 (abfd
, contents
+ irel
->r_offset
2064 if ((0x95 == next_insn_msb
) && (0x08 == next_insn_lsb
))
2066 /* The next insn is a ret. We possibly could delete
2067 this ret. First we need to check for preceding
2068 sbis/sbic/sbrs or cpse "skip" instructions. */
2070 int there_is_preceding_non_skip_insn
= 1;
2071 bfd_vma address_of_ret
;
2073 address_of_ret
= dot
+ insn_size
;
2075 if (debug_relax
&& (insn_size
== 2))
2076 printf ("found rjmp / ret sequence at address 0x%x\n",
2078 if (debug_relax
&& (insn_size
== 4))
2079 printf ("found jmp / ret sequence at address 0x%x\n",
2082 /* We have to make sure that there is a preceding insn. */
2083 if (irel
->r_offset
>= 2)
2085 unsigned char preceding_msb
;
2086 unsigned char preceding_lsb
;
2089 bfd_get_8 (abfd
, contents
+ irel
->r_offset
- 1);
2091 bfd_get_8 (abfd
, contents
+ irel
->r_offset
- 2);
2094 if (0x99 == preceding_msb
)
2095 there_is_preceding_non_skip_insn
= 0;
2098 if (0x9b == preceding_msb
)
2099 there_is_preceding_non_skip_insn
= 0;
2102 if ((0xfc == (preceding_msb
& 0xfe)
2103 && (0x00 == (preceding_lsb
& 0x08))))
2104 there_is_preceding_non_skip_insn
= 0;
2107 if ((0xfe == (preceding_msb
& 0xfe)
2108 && (0x00 == (preceding_lsb
& 0x08))))
2109 there_is_preceding_non_skip_insn
= 0;
2112 if (0x10 == (preceding_msb
& 0xfc))
2113 there_is_preceding_non_skip_insn
= 0;
2115 if (there_is_preceding_non_skip_insn
== 0)
2117 printf ("preceding skip insn prevents deletion of"
2118 " ret insn at Addy 0x%x in section %s\n",
2119 (int) dot
+ 2, sec
->name
);
2123 /* There is no previous instruction. */
2124 there_is_preceding_non_skip_insn
= 0;
2127 if (there_is_preceding_non_skip_insn
)
2129 /* We now only have to make sure that there is no
2130 local label defined at the address of the ret
2131 instruction and that there is no local relocation
2132 in this section pointing to the ret. */
2134 int deleting_ret_is_safe
= 1;
2135 unsigned int section_offset_of_ret_insn
=
2136 irel
->r_offset
+ insn_size
;
2137 Elf_Internal_Sym
*isym
, *isymend
;
2138 unsigned int sec_shndx
;
2139 struct bfd_section
*isec
;
2142 _bfd_elf_section_from_bfd_section (abfd
, sec
);
2144 /* Check for local symbols. */
2145 isym
= (Elf_Internal_Sym
*) symtab_hdr
->contents
;
2146 isymend
= isym
+ symtab_hdr
->sh_info
;
2147 /* PR 6019: There may not be any local symbols. */
2148 for (; isym
!= NULL
&& isym
< isymend
; isym
++)
2150 if (isym
->st_value
== section_offset_of_ret_insn
2151 && isym
->st_shndx
== sec_shndx
)
2153 deleting_ret_is_safe
= 0;
2155 printf ("local label prevents deletion of ret "
2156 "insn at address 0x%x\n",
2157 (int) dot
+ insn_size
);
2161 /* Now check for global symbols. */
2164 struct elf_link_hash_entry
**sym_hashes
;
2165 struct elf_link_hash_entry
**end_hashes
;
2167 symcount
= (symtab_hdr
->sh_size
2168 / sizeof (Elf32_External_Sym
)
2169 - symtab_hdr
->sh_info
);
2170 sym_hashes
= elf_sym_hashes (abfd
);
2171 end_hashes
= sym_hashes
+ symcount
;
2172 for (; sym_hashes
< end_hashes
; sym_hashes
++)
2174 struct elf_link_hash_entry
*sym_hash
=
2176 if ((sym_hash
->root
.type
== bfd_link_hash_defined
2177 || sym_hash
->root
.type
==
2178 bfd_link_hash_defweak
)
2179 && sym_hash
->root
.u
.def
.section
== sec
2180 && sym_hash
->root
.u
.def
.value
== section_offset_of_ret_insn
)
2182 deleting_ret_is_safe
= 0;
2184 printf ("global label prevents deletion of "
2185 "ret insn at address 0x%x\n",
2186 (int) dot
+ insn_size
);
2191 /* Now we check for relocations pointing to ret. */
2192 for (isec
= abfd
->sections
; isec
&& deleting_ret_is_safe
; isec
= isec
->next
)
2194 Elf_Internal_Rela
*rel
;
2195 Elf_Internal_Rela
*relend
;
2197 rel
= elf_section_data (isec
)->relocs
;
2199 rel
= _bfd_elf_link_read_relocs (abfd
, isec
, NULL
, NULL
, TRUE
);
2201 relend
= rel
+ isec
->reloc_count
;
2203 for (; rel
&& rel
< relend
; rel
++)
2205 bfd_vma reloc_target
= 0;
2207 /* Read this BFD's local symbols if we haven't
2209 if (isymbuf
== NULL
&& symtab_hdr
->sh_info
!= 0)
2211 isymbuf
= (Elf_Internal_Sym
*)
2212 symtab_hdr
->contents
;
2213 if (isymbuf
== NULL
)
2214 isymbuf
= bfd_elf_get_elf_syms
2217 symtab_hdr
->sh_info
, 0,
2219 if (isymbuf
== NULL
)
2223 /* Get the value of the symbol referred to
2225 if (ELF32_R_SYM (rel
->r_info
)
2226 < symtab_hdr
->sh_info
)
2228 /* A local symbol. */
2232 + ELF32_R_SYM (rel
->r_info
);
2233 sym_sec
= bfd_section_from_elf_index
2234 (abfd
, isym
->st_shndx
);
2235 symval
= isym
->st_value
;
2237 /* If the reloc is absolute, it will not
2238 have a symbol or section associated
2244 sym_sec
->output_section
->vma
2245 + sym_sec
->output_offset
;
2246 reloc_target
= symval
+ rel
->r_addend
;
2250 reloc_target
= symval
+ rel
->r_addend
;
2251 /* Reference symbol is absolute. */
2254 /* else ... reference symbol is extern. */
2256 if (address_of_ret
== reloc_target
)
2258 deleting_ret_is_safe
= 0;
2261 "rjmp/jmp ret sequence at address"
2262 " 0x%x could not be deleted. ret"
2263 " is target of a relocation.\n",
2264 (int) address_of_ret
);
2270 if (deleting_ret_is_safe
)
2273 printf ("unreachable ret instruction "
2274 "at address 0x%x deleted.\n",
2275 (int) dot
+ insn_size
);
2277 /* Delete two bytes of data. */
2278 if (!elf32_avr_relax_delete_bytes (abfd
, sec
,
2279 irel
->r_offset
+ insn_size
, 2))
2282 /* That will change things, so, we should relax
2283 again. Note that this is not required, and it
2296 if (contents
!= NULL
2297 && elf_section_data (sec
)->this_hdr
.contents
!= contents
)
2299 if (! link_info
->keep_memory
)
2303 /* Cache the section contents for elf_link_input_bfd. */
2304 elf_section_data (sec
)->this_hdr
.contents
= contents
;
2308 if (internal_relocs
!= NULL
2309 && elf_section_data (sec
)->relocs
!= internal_relocs
)
2310 free (internal_relocs
);
2316 && symtab_hdr
->contents
!= (unsigned char *) isymbuf
)
2318 if (contents
!= NULL
2319 && elf_section_data (sec
)->this_hdr
.contents
!= contents
)
2321 if (internal_relocs
!= NULL
2322 && elf_section_data (sec
)->relocs
!= internal_relocs
)
2323 free (internal_relocs
);
2328 /* This is a version of bfd_generic_get_relocated_section_contents
2329 which uses elf32_avr_relocate_section.
2331 For avr it's essentially a cut and paste taken from the H8300 port.
2332 The author of the relaxation support patch for avr had absolutely no
2333 clue what is happening here but found out that this part of the code
2334 seems to be important. */
2337 elf32_avr_get_relocated_section_contents (bfd
*output_bfd
,
2338 struct bfd_link_info
*link_info
,
2339 struct bfd_link_order
*link_order
,
2341 bfd_boolean relocatable
,
2344 Elf_Internal_Shdr
*symtab_hdr
;
2345 asection
*input_section
= link_order
->u
.indirect
.section
;
2346 bfd
*input_bfd
= input_section
->owner
;
2347 asection
**sections
= NULL
;
2348 Elf_Internal_Rela
*internal_relocs
= NULL
;
2349 Elf_Internal_Sym
*isymbuf
= NULL
;
2351 /* We only need to handle the case of relaxing, or of having a
2352 particular set of section contents, specially. */
2354 || elf_section_data (input_section
)->this_hdr
.contents
== NULL
)
2355 return bfd_generic_get_relocated_section_contents (output_bfd
, link_info
,
2359 symtab_hdr
= &elf_tdata (input_bfd
)->symtab_hdr
;
2361 memcpy (data
, elf_section_data (input_section
)->this_hdr
.contents
,
2362 (size_t) input_section
->size
);
2364 if ((input_section
->flags
& SEC_RELOC
) != 0
2365 && input_section
->reloc_count
> 0)
2368 Elf_Internal_Sym
*isym
, *isymend
;
2371 internal_relocs
= (_bfd_elf_link_read_relocs
2372 (input_bfd
, input_section
, NULL
, NULL
, FALSE
));
2373 if (internal_relocs
== NULL
)
2376 if (symtab_hdr
->sh_info
!= 0)
2378 isymbuf
= (Elf_Internal_Sym
*) symtab_hdr
->contents
;
2379 if (isymbuf
== NULL
)
2380 isymbuf
= bfd_elf_get_elf_syms (input_bfd
, symtab_hdr
,
2381 symtab_hdr
->sh_info
, 0,
2383 if (isymbuf
== NULL
)
2387 amt
= symtab_hdr
->sh_info
;
2388 amt
*= sizeof (asection
*);
2389 sections
= bfd_malloc (amt
);
2390 if (sections
== NULL
&& amt
!= 0)
2393 isymend
= isymbuf
+ symtab_hdr
->sh_info
;
2394 for (isym
= isymbuf
, secpp
= sections
; isym
< isymend
; ++isym
, ++secpp
)
2398 if (isym
->st_shndx
== SHN_UNDEF
)
2399 isec
= bfd_und_section_ptr
;
2400 else if (isym
->st_shndx
== SHN_ABS
)
2401 isec
= bfd_abs_section_ptr
;
2402 else if (isym
->st_shndx
== SHN_COMMON
)
2403 isec
= bfd_com_section_ptr
;
2405 isec
= bfd_section_from_elf_index (input_bfd
, isym
->st_shndx
);
2410 if (! elf32_avr_relocate_section (output_bfd
, link_info
, input_bfd
,
2411 input_section
, data
, internal_relocs
,
2415 if (sections
!= NULL
)
2418 && symtab_hdr
->contents
!= (unsigned char *) isymbuf
)
2420 if (elf_section_data (input_section
)->relocs
!= internal_relocs
)
2421 free (internal_relocs
);
2427 if (sections
!= NULL
)
2430 && symtab_hdr
->contents
!= (unsigned char *) isymbuf
)
2432 if (internal_relocs
!= NULL
2433 && elf_section_data (input_section
)->relocs
!= internal_relocs
)
2434 free (internal_relocs
);
2439 /* Determines the hash entry name for a particular reloc. It consists of
2440 the identifier of the symbol section and the added reloc addend and
2441 symbol offset relative to the section the symbol is attached to. */
2444 avr_stub_name (const asection
*symbol_section
,
2445 const bfd_vma symbol_offset
,
2446 const Elf_Internal_Rela
*rela
)
2451 len
= 8 + 1 + 8 + 1 + 1;
2452 stub_name
= bfd_malloc (len
);
2454 sprintf (stub_name
, "%08x+%08x",
2455 symbol_section
->id
& 0xffffffff,
2456 (unsigned int) ((rela
->r_addend
& 0xffffffff) + symbol_offset
));
2462 /* Add a new stub entry to the stub hash. Not all fields of the new
2463 stub entry are initialised. */
2465 static struct elf32_avr_stub_hash_entry
*
2466 avr_add_stub (const char *stub_name
,
2467 struct elf32_avr_link_hash_table
*htab
)
2469 struct elf32_avr_stub_hash_entry
*hsh
;
2471 /* Enter this entry into the linker stub hash table. */
2472 hsh
= avr_stub_hash_lookup (&htab
->bstab
, stub_name
, TRUE
, FALSE
);
2476 (*_bfd_error_handler
) (_("%B: cannot create stub entry %s"),
2481 hsh
->stub_offset
= 0;
2485 /* We assume that there is already space allocated for the stub section
2486 contents and that before building the stubs the section size is
2487 initialized to 0. We assume that within the stub hash table entry,
2488 the absolute position of the jmp target has been written in the
2489 target_value field. We write here the offset of the generated jmp insn
2490 relative to the trampoline section start to the stub_offset entry in
2491 the stub hash table entry. */
2494 avr_build_one_stub (struct bfd_hash_entry
*bh
, void *in_arg
)
2496 struct elf32_avr_stub_hash_entry
*hsh
;
2497 struct bfd_link_info
*info
;
2498 struct elf32_avr_link_hash_table
*htab
;
2505 bfd_vma jmp_insn
= 0x0000940c;
2507 /* Massage our args to the form they really have. */
2508 hsh
= avr_stub_hash_entry (bh
);
2510 if (!hsh
->is_actually_needed
)
2513 info
= (struct bfd_link_info
*) in_arg
;
2515 htab
= avr_link_hash_table (info
);
2519 target
= hsh
->target_value
;
2521 /* Make a note of the offset within the stubs for this entry. */
2522 hsh
->stub_offset
= htab
->stub_sec
->size
;
2523 loc
= htab
->stub_sec
->contents
+ hsh
->stub_offset
;
2525 stub_bfd
= htab
->stub_sec
->owner
;
2528 printf ("Building one Stub. Address: 0x%x, Offset: 0x%x\n",
2529 (unsigned int) target
,
2530 (unsigned int) hsh
->stub_offset
);
2532 /* We now have to add the information on the jump target to the bare
2533 opcode bits already set in jmp_insn. */
2535 /* Check for the alignment of the address. */
2539 starget
= target
>> 1;
2540 jmp_insn
|= ((starget
& 0x10000) | ((starget
<< 3) & 0x1f00000)) >> 16;
2541 bfd_put_16 (stub_bfd
, jmp_insn
, loc
);
2542 bfd_put_16 (stub_bfd
, (bfd_vma
) starget
& 0xffff, loc
+ 2);
2544 htab
->stub_sec
->size
+= 4;
2546 /* Now add the entries in the address mapping table if there is still
2551 nr
= htab
->amt_entry_cnt
+ 1;
2552 if (nr
<= htab
->amt_max_entry_cnt
)
2554 htab
->amt_entry_cnt
= nr
;
2556 htab
->amt_stub_offsets
[nr
- 1] = hsh
->stub_offset
;
2557 htab
->amt_destination_addr
[nr
- 1] = target
;
2565 avr_mark_stub_not_to_be_necessary (struct bfd_hash_entry
*bh
,
2566 void *in_arg ATTRIBUTE_UNUSED
)
2568 struct elf32_avr_stub_hash_entry
*hsh
;
2570 hsh
= avr_stub_hash_entry (bh
);
2571 hsh
->is_actually_needed
= FALSE
;
2577 avr_size_one_stub (struct bfd_hash_entry
*bh
, void *in_arg
)
2579 struct elf32_avr_stub_hash_entry
*hsh
;
2580 struct elf32_avr_link_hash_table
*htab
;
2583 /* Massage our args to the form they really have. */
2584 hsh
= avr_stub_hash_entry (bh
);
2587 if (hsh
->is_actually_needed
)
2592 htab
->stub_sec
->size
+= size
;
2597 elf32_avr_setup_params (struct bfd_link_info
*info
,
2599 asection
*avr_stub_section
,
2600 bfd_boolean no_stubs
,
2601 bfd_boolean deb_stubs
,
2602 bfd_boolean deb_relax
,
2603 bfd_vma pc_wrap_around
,
2604 bfd_boolean call_ret_replacement
)
2606 struct elf32_avr_link_hash_table
*htab
= avr_link_hash_table (info
);
2610 htab
->stub_sec
= avr_stub_section
;
2611 htab
->stub_bfd
= avr_stub_bfd
;
2612 htab
->no_stubs
= no_stubs
;
2614 debug_relax
= deb_relax
;
2615 debug_stubs
= deb_stubs
;
2616 avr_pc_wrap_around
= pc_wrap_around
;
2617 avr_replace_call_ret_sequences
= call_ret_replacement
;
2621 /* Set up various things so that we can make a list of input sections
2622 for each output section included in the link. Returns -1 on error,
2623 0 when no stubs will be needed, and 1 on success. It also sets
2624 information on the stubs bfd and the stub section in the info
2628 elf32_avr_setup_section_lists (bfd
*output_bfd
,
2629 struct bfd_link_info
*info
)
2632 unsigned int bfd_count
;
2633 int top_id
, top_index
;
2635 asection
**input_list
, **list
;
2637 struct elf32_avr_link_hash_table
*htab
= avr_link_hash_table (info
);
2639 if (htab
== NULL
|| htab
->no_stubs
)
2642 /* Count the number of input BFDs and find the top input section id. */
2643 for (input_bfd
= info
->input_bfds
, bfd_count
= 0, top_id
= 0;
2645 input_bfd
= input_bfd
->link_next
)
2648 for (section
= input_bfd
->sections
;
2650 section
= section
->next
)
2651 if (top_id
< section
->id
)
2652 top_id
= section
->id
;
2655 htab
->bfd_count
= bfd_count
;
2657 /* We can't use output_bfd->section_count here to find the top output
2658 section index as some sections may have been removed, and
2659 strip_excluded_output_sections doesn't renumber the indices. */
2660 for (section
= output_bfd
->sections
, top_index
= 0;
2662 section
= section
->next
)
2663 if (top_index
< section
->index
)
2664 top_index
= section
->index
;
2666 htab
->top_index
= top_index
;
2667 amt
= sizeof (asection
*) * (top_index
+ 1);
2668 input_list
= bfd_malloc (amt
);
2669 htab
->input_list
= input_list
;
2670 if (input_list
== NULL
)
2673 /* For sections we aren't interested in, mark their entries with a
2674 value we can check later. */
2675 list
= input_list
+ top_index
;
2677 *list
= bfd_abs_section_ptr
;
2678 while (list
-- != input_list
);
2680 for (section
= output_bfd
->sections
;
2682 section
= section
->next
)
2683 if ((section
->flags
& SEC_CODE
) != 0)
2684 input_list
[section
->index
] = NULL
;
2690 /* Read in all local syms for all input bfds, and create hash entries
2691 for export stubs if we are building a multi-subspace shared lib.
2692 Returns -1 on error, 0 otherwise. */
2695 get_local_syms (bfd
*input_bfd
, struct bfd_link_info
*info
)
2697 unsigned int bfd_indx
;
2698 Elf_Internal_Sym
*local_syms
, **all_local_syms
;
2699 struct elf32_avr_link_hash_table
*htab
= avr_link_hash_table (info
);
2705 /* We want to read in symbol extension records only once. To do this
2706 we need to read in the local symbols in parallel and save them for
2707 later use; so hold pointers to the local symbols in an array. */
2708 amt
= sizeof (Elf_Internal_Sym
*) * htab
->bfd_count
;
2709 all_local_syms
= bfd_zmalloc (amt
);
2710 htab
->all_local_syms
= all_local_syms
;
2711 if (all_local_syms
== NULL
)
2714 /* Walk over all the input BFDs, swapping in local symbols.
2715 If we are creating a shared library, create hash entries for the
2719 input_bfd
= input_bfd
->link_next
, bfd_indx
++)
2721 Elf_Internal_Shdr
*symtab_hdr
;
2723 /* We'll need the symbol table in a second. */
2724 symtab_hdr
= &elf_tdata (input_bfd
)->symtab_hdr
;
2725 if (symtab_hdr
->sh_info
== 0)
2728 /* We need an array of the local symbols attached to the input bfd. */
2729 local_syms
= (Elf_Internal_Sym
*) symtab_hdr
->contents
;
2730 if (local_syms
== NULL
)
2732 local_syms
= bfd_elf_get_elf_syms (input_bfd
, symtab_hdr
,
2733 symtab_hdr
->sh_info
, 0,
2735 /* Cache them for elf_link_input_bfd. */
2736 symtab_hdr
->contents
= (unsigned char *) local_syms
;
2738 if (local_syms
== NULL
)
2741 all_local_syms
[bfd_indx
] = local_syms
;
2747 #define ADD_DUMMY_STUBS_FOR_DEBUGGING 0
2750 elf32_avr_size_stubs (bfd
*output_bfd
,
2751 struct bfd_link_info
*info
,
2752 bfd_boolean is_prealloc_run
)
2754 struct elf32_avr_link_hash_table
*htab
;
2755 int stub_changed
= 0;
2757 htab
= avr_link_hash_table (info
);
2761 /* At this point we initialize htab->vector_base
2762 To the start of the text output section. */
2763 htab
->vector_base
= htab
->stub_sec
->output_section
->vma
;
2765 if (get_local_syms (info
->input_bfds
, info
))
2767 if (htab
->all_local_syms
)
2768 goto error_ret_free_local
;
2772 if (ADD_DUMMY_STUBS_FOR_DEBUGGING
)
2774 struct elf32_avr_stub_hash_entry
*test
;
2776 test
= avr_add_stub ("Hugo",htab
);
2777 test
->target_value
= 0x123456;
2778 test
->stub_offset
= 13;
2780 test
= avr_add_stub ("Hugo2",htab
);
2781 test
->target_value
= 0x84210;
2782 test
->stub_offset
= 14;
2788 unsigned int bfd_indx
;
2790 /* We will have to re-generate the stub hash table each time anything
2791 in memory has changed. */
2793 bfd_hash_traverse (&htab
->bstab
, avr_mark_stub_not_to_be_necessary
, htab
);
2794 for (input_bfd
= info
->input_bfds
, bfd_indx
= 0;
2796 input_bfd
= input_bfd
->link_next
, bfd_indx
++)
2798 Elf_Internal_Shdr
*symtab_hdr
;
2800 Elf_Internal_Sym
*local_syms
;
2802 /* We'll need the symbol table in a second. */
2803 symtab_hdr
= &elf_tdata (input_bfd
)->symtab_hdr
;
2804 if (symtab_hdr
->sh_info
== 0)
2807 local_syms
= htab
->all_local_syms
[bfd_indx
];
2809 /* Walk over each section attached to the input bfd. */
2810 for (section
= input_bfd
->sections
;
2812 section
= section
->next
)
2814 Elf_Internal_Rela
*internal_relocs
, *irelaend
, *irela
;
2816 /* If there aren't any relocs, then there's nothing more
2818 if ((section
->flags
& SEC_RELOC
) == 0
2819 || section
->reloc_count
== 0)
2822 /* If this section is a link-once section that will be
2823 discarded, then don't create any stubs. */
2824 if (section
->output_section
== NULL
2825 || section
->output_section
->owner
!= output_bfd
)
2828 /* Get the relocs. */
2830 = _bfd_elf_link_read_relocs (input_bfd
, section
, NULL
, NULL
,
2832 if (internal_relocs
== NULL
)
2833 goto error_ret_free_local
;
2835 /* Now examine each relocation. */
2836 irela
= internal_relocs
;
2837 irelaend
= irela
+ section
->reloc_count
;
2838 for (; irela
< irelaend
; irela
++)
2840 unsigned int r_type
, r_indx
;
2841 struct elf32_avr_stub_hash_entry
*hsh
;
2844 bfd_vma destination
;
2845 struct elf_link_hash_entry
*hh
;
2848 r_type
= ELF32_R_TYPE (irela
->r_info
);
2849 r_indx
= ELF32_R_SYM (irela
->r_info
);
2851 /* Only look for 16 bit GS relocs. No other reloc will need a
2853 if (!((r_type
== R_AVR_16_PM
)
2854 || (r_type
== R_AVR_LO8_LDI_GS
)
2855 || (r_type
== R_AVR_HI8_LDI_GS
)))
2858 /* Now determine the call target, its name, value,
2864 if (r_indx
< symtab_hdr
->sh_info
)
2866 /* It's a local symbol. */
2867 Elf_Internal_Sym
*sym
;
2868 Elf_Internal_Shdr
*hdr
;
2871 sym
= local_syms
+ r_indx
;
2872 if (ELF_ST_TYPE (sym
->st_info
) != STT_SECTION
)
2873 sym_value
= sym
->st_value
;
2874 shndx
= sym
->st_shndx
;
2875 if (shndx
< elf_numsections (input_bfd
))
2877 hdr
= elf_elfsections (input_bfd
)[shndx
];
2878 sym_sec
= hdr
->bfd_section
;
2879 destination
= (sym_value
+ irela
->r_addend
2880 + sym_sec
->output_offset
2881 + sym_sec
->output_section
->vma
);
2886 /* It's an external symbol. */
2889 e_indx
= r_indx
- symtab_hdr
->sh_info
;
2890 hh
= elf_sym_hashes (input_bfd
)[e_indx
];
2892 while (hh
->root
.type
== bfd_link_hash_indirect
2893 || hh
->root
.type
== bfd_link_hash_warning
)
2894 hh
= (struct elf_link_hash_entry
*)
2895 (hh
->root
.u
.i
.link
);
2897 if (hh
->root
.type
== bfd_link_hash_defined
2898 || hh
->root
.type
== bfd_link_hash_defweak
)
2900 sym_sec
= hh
->root
.u
.def
.section
;
2901 sym_value
= hh
->root
.u
.def
.value
;
2902 if (sym_sec
->output_section
!= NULL
)
2903 destination
= (sym_value
+ irela
->r_addend
2904 + sym_sec
->output_offset
2905 + sym_sec
->output_section
->vma
);
2907 else if (hh
->root
.type
== bfd_link_hash_undefweak
)
2912 else if (hh
->root
.type
== bfd_link_hash_undefined
)
2914 if (! (info
->unresolved_syms_in_objects
== RM_IGNORE
2915 && (ELF_ST_VISIBILITY (hh
->other
)
2921 bfd_set_error (bfd_error_bad_value
);
2923 error_ret_free_internal
:
2924 if (elf_section_data (section
)->relocs
== NULL
)
2925 free (internal_relocs
);
2926 goto error_ret_free_local
;
2930 if (! avr_stub_is_required_for_16_bit_reloc
2931 (destination
- htab
->vector_base
))
2933 if (!is_prealloc_run
)
2934 /* We are having a reloc that does't need a stub. */
2937 /* We don't right now know if a stub will be needed.
2938 Let's rather be on the safe side. */
2941 /* Get the name of this stub. */
2942 stub_name
= avr_stub_name (sym_sec
, sym_value
, irela
);
2945 goto error_ret_free_internal
;
2948 hsh
= avr_stub_hash_lookup (&htab
->bstab
,
2953 /* The proper stub has already been created. Mark it
2954 to be used and write the possibly changed destination
2956 hsh
->is_actually_needed
= TRUE
;
2957 hsh
->target_value
= destination
;
2962 hsh
= avr_add_stub (stub_name
, htab
);
2966 goto error_ret_free_internal
;
2969 hsh
->is_actually_needed
= TRUE
;
2970 hsh
->target_value
= destination
;
2973 printf ("Adding stub with destination 0x%x to the"
2974 " hash table.\n", (unsigned int) destination
);
2976 printf ("(Pre-Alloc run: %i)\n", is_prealloc_run
);
2978 stub_changed
= TRUE
;
2981 /* We're done with the internal relocs, free them. */
2982 if (elf_section_data (section
)->relocs
== NULL
)
2983 free (internal_relocs
);
2987 /* Re-Calculate the number of needed stubs. */
2988 htab
->stub_sec
->size
= 0;
2989 bfd_hash_traverse (&htab
->bstab
, avr_size_one_stub
, htab
);
2994 stub_changed
= FALSE
;
2997 free (htab
->all_local_syms
);
3000 error_ret_free_local
:
3001 free (htab
->all_local_syms
);
3006 /* Build all the stubs associated with the current output file. The
3007 stubs are kept in a hash table attached to the main linker hash
3008 table. We also set up the .plt entries for statically linked PIC
3009 functions here. This function is called via hppaelf_finish in the
3013 elf32_avr_build_stubs (struct bfd_link_info
*info
)
3016 struct bfd_hash_table
*table
;
3017 struct elf32_avr_link_hash_table
*htab
;
3018 bfd_size_type total_size
= 0;
3020 htab
= avr_link_hash_table (info
);
3024 /* In case that there were several stub sections: */
3025 for (stub_sec
= htab
->stub_bfd
->sections
;
3027 stub_sec
= stub_sec
->next
)
3031 /* Allocate memory to hold the linker stubs. */
3032 size
= stub_sec
->size
;
3035 stub_sec
->contents
= bfd_zalloc (htab
->stub_bfd
, size
);
3036 if (stub_sec
->contents
== NULL
&& size
!= 0)
3041 /* Allocate memory for the adress mapping table. */
3042 htab
->amt_entry_cnt
= 0;
3043 htab
->amt_max_entry_cnt
= total_size
/ 4;
3044 htab
->amt_stub_offsets
= bfd_malloc (sizeof (bfd_vma
)
3045 * htab
->amt_max_entry_cnt
);
3046 htab
->amt_destination_addr
= bfd_malloc (sizeof (bfd_vma
)
3047 * htab
->amt_max_entry_cnt
);
3050 printf ("Allocating %i entries in the AMT\n", htab
->amt_max_entry_cnt
);
3052 /* Build the stubs as directed by the stub hash table. */
3053 table
= &htab
->bstab
;
3054 bfd_hash_traverse (table
, avr_build_one_stub
, info
);
3057 printf ("Final Stub section Size: %i\n", (int) htab
->stub_sec
->size
);
3062 #define ELF_ARCH bfd_arch_avr
3063 #define ELF_TARGET_ID AVR_ELF_DATA
3064 #define ELF_MACHINE_CODE EM_AVR
3065 #define ELF_MACHINE_ALT1 EM_AVR_OLD
3066 #define ELF_MAXPAGESIZE 1
3068 #define TARGET_LITTLE_SYM bfd_elf32_avr_vec
3069 #define TARGET_LITTLE_NAME "elf32-avr"
3071 #define bfd_elf32_bfd_link_hash_table_create elf32_avr_link_hash_table_create
3072 #define bfd_elf32_bfd_link_hash_table_free elf32_avr_link_hash_table_free
3074 #define elf_info_to_howto avr_info_to_howto_rela
3075 #define elf_info_to_howto_rel NULL
3076 #define elf_backend_relocate_section elf32_avr_relocate_section
3077 #define elf_backend_can_gc_sections 1
3078 #define elf_backend_rela_normal 1
3079 #define elf_backend_final_write_processing \
3080 bfd_elf_avr_final_write_processing
3081 #define elf_backend_object_p elf32_avr_object_p
3083 #define bfd_elf32_bfd_relax_section elf32_avr_relax_section
3084 #define bfd_elf32_bfd_get_relocated_section_contents \
3085 elf32_avr_get_relocated_section_contents
3087 #include "elf32-target.h"