a7547e8cfb3df5d3d0f6bbf7fd28bdcc77a99c67
[deliverable/binutils-gdb.git] / bfd / elf32-nios2.c
1 /* 32-bit ELF support for Nios II.
2 Copyright (C) 2012, 2013 Free Software Foundation, Inc.
3 Contributed by Nigel Gray (ngray@altera.com).
4 Contributed by Mentor Graphics, Inc.
5
6 This file is part of BFD, the Binary File Descriptor library.
7
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3 of the License, or
11 (at your option) any later version.
12
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
21 MA 02110-1301, USA. */
22
23 /* This file handles Altera Nios II ELF targets. */
24
25 #include "sysdep.h"
26 #include "bfd.h"
27 #include "libbfd.h"
28 #include "bfdlink.h"
29 #include "genlink.h"
30 #include "elf-bfd.h"
31 #include "elf/nios2.h"
32 #include "opcode/nios2.h"
33 #include "elf32-nios2.h"
34
35 /* Use RELA relocations. */
36 #ifndef USE_RELA
37 #define USE_RELA
38 #endif
39
40 #ifdef USE_REL
41 #undef USE_REL
42 #endif
43
44 /* Forward declarations. */
45 static bfd_reloc_status_type nios2_elf32_ignore_reloc
46 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
47 static bfd_reloc_status_type nios2_elf32_hi16_relocate
48 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
49 static bfd_reloc_status_type nios2_elf32_lo16_relocate
50 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
51 static bfd_reloc_status_type nios2_elf32_hiadj16_relocate
52 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
53 static bfd_reloc_status_type nios2_elf32_pcrel_lo16_relocate
54 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
55 static bfd_reloc_status_type nios2_elf32_pcrel_hiadj16_relocate
56 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
57 static bfd_reloc_status_type nios2_elf32_pcrel16_relocate
58 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
59 static bfd_reloc_status_type nios2_elf32_call26_relocate
60 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
61 static bfd_reloc_status_type nios2_elf32_gprel_relocate
62 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
63 static bfd_reloc_status_type nios2_elf32_ujmp_relocate
64 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
65 static bfd_reloc_status_type nios2_elf32_cjmp_relocate
66 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
67 static bfd_reloc_status_type nios2_elf32_callr_relocate
68 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
69
70 /* Target vector. */
71 extern const bfd_target bfd_elf32_littlenios2_vec;
72 extern const bfd_target bfd_elf32_bignios2_vec;
73
74 /* Offset of tp and dtp pointers from start of TLS block. */
75 #define TP_OFFSET 0x7000
76 #define DTP_OFFSET 0x8000
77
78 /* The relocation table used for SHT_REL sections. */
79 static reloc_howto_type elf_nios2_howto_table_rel[] = {
80 /* No relocation. */
81 HOWTO (R_NIOS2_NONE, /* type */
82 0, /* rightshift */
83 0, /* size (0 = byte, 1 = short, 2 = long) */
84 0, /* bitsize */
85 FALSE, /* pc_relative */
86 0, /* bitpos */
87 complain_overflow_dont, /* complain_on_overflow */
88 bfd_elf_generic_reloc, /* special_function */
89 "R_NIOS2_NONE", /* name */
90 FALSE, /* partial_inplace */
91 0, /* src_mask */
92 0, /* dst_mask */
93 FALSE), /* pcrel_offset */
94
95 /* 16-bit signed immediate relocation. */
96 HOWTO (R_NIOS2_S16, /* type */
97 0, /* rightshift */
98 2, /* size (0 = byte, 1 = short, 2 = long) */
99 16, /* bitsize */
100 FALSE, /* pc_relative */
101 6, /* bitpos */
102 complain_overflow_signed, /* complain on overflow */
103 bfd_elf_generic_reloc, /* special function */
104 "R_NIOS2_S16", /* name */
105 FALSE, /* partial_inplace */
106 0x003fffc0, /* src_mask */
107 0x003fffc0, /* dest_mask */
108 FALSE), /* pcrel_offset */
109
110 /* 16-bit unsigned immediate relocation. */
111 HOWTO (R_NIOS2_U16, /* type */
112 0, /* rightshift */
113 2, /* size (0 = byte, 1 = short, 2 = long) */
114 16, /* bitsize */
115 FALSE, /* pc_relative */
116 6, /* bitpos */
117 complain_overflow_unsigned, /* complain on overflow */
118 bfd_elf_generic_reloc, /* special function */
119 "R_NIOS2_U16", /* name */
120 FALSE, /* partial_inplace */
121 0x003fffc0, /* src_mask */
122 0x003fffc0, /* dest_mask */
123 FALSE), /* pcrel_offset */
124
125 HOWTO (R_NIOS2_PCREL16, /* type */
126 0, /* rightshift */
127 2, /* size (0 = byte, 1 = short, 2 = long) */
128 16, /* bitsize */
129 TRUE, /* pc_relative */
130 6, /* bitpos */
131 complain_overflow_signed, /* complain on overflow */
132 nios2_elf32_pcrel16_relocate, /* special function */
133 "R_NIOS2_PCREL16", /* name */
134 FALSE, /* partial_inplace */
135 0x003fffc0, /* src_mask */
136 0x003fffc0, /* dest_mask */
137 TRUE), /* pcrel_offset */
138
139 HOWTO (R_NIOS2_CALL26, /* type */
140 2, /* rightshift */
141 2, /* size (0 = byte, 1 = short, 2 = long) */
142 26, /* bitsize */
143 FALSE, /* pc_relative */
144 6, /* bitpos */
145 complain_overflow_dont, /* complain on overflow */
146 nios2_elf32_call26_relocate, /* special function */
147 "R_NIOS2_CALL26", /* name */
148 FALSE, /* partial_inplace */
149 0xffffffc0, /* src_mask */
150 0xffffffc0, /* dst_mask */
151 FALSE), /* pcrel_offset */
152
153 HOWTO (R_NIOS2_IMM5,
154 0,
155 2,
156 5,
157 FALSE,
158 6,
159 complain_overflow_bitfield,
160 bfd_elf_generic_reloc,
161 "R_NIOS2_IMM5",
162 FALSE,
163 0x000007c0,
164 0x000007c0,
165 FALSE),
166
167 HOWTO (R_NIOS2_CACHE_OPX,
168 0,
169 2,
170 5,
171 FALSE,
172 22,
173 complain_overflow_bitfield,
174 bfd_elf_generic_reloc,
175 "R_NIOS2_CACHE_OPX",
176 FALSE,
177 0x07c00000,
178 0x07c00000,
179 FALSE),
180
181 HOWTO (R_NIOS2_IMM6,
182 0,
183 2,
184 6,
185 FALSE,
186 6,
187 complain_overflow_bitfield,
188 bfd_elf_generic_reloc,
189 "R_NIOS2_IMM6",
190 FALSE,
191 0x00000fc0,
192 0x00000fc0,
193 FALSE),
194
195 HOWTO (R_NIOS2_IMM8,
196 0,
197 2,
198 8,
199 FALSE,
200 6,
201 complain_overflow_bitfield,
202 bfd_elf_generic_reloc,
203 "R_NIOS2_IMM8",
204 FALSE,
205 0x00003fc0,
206 0x00003fc0,
207 FALSE),
208
209 HOWTO (R_NIOS2_HI16,
210 0,
211 2,
212 32,
213 FALSE,
214 6,
215 complain_overflow_dont,
216 nios2_elf32_hi16_relocate,
217 "R_NIOS2_HI16",
218 FALSE,
219 0x003fffc0,
220 0x003fffc0,
221 FALSE),
222
223 HOWTO (R_NIOS2_LO16,
224 0,
225 2,
226 32,
227 FALSE,
228 6,
229 complain_overflow_dont,
230 nios2_elf32_lo16_relocate,
231 "R_NIOS2_LO16",
232 FALSE,
233 0x003fffc0,
234 0x003fffc0,
235 FALSE),
236
237 HOWTO (R_NIOS2_HIADJ16,
238 0,
239 2,
240 32,
241 FALSE,
242 6,
243 complain_overflow_dont,
244 nios2_elf32_hiadj16_relocate,
245 "R_NIOS2_HIADJ16",
246 FALSE,
247 0x003fffc0,
248 0x003fffc0,
249 FALSE),
250
251 HOWTO (R_NIOS2_BFD_RELOC_32,
252 0,
253 2, /* long */
254 32,
255 FALSE,
256 0,
257 complain_overflow_dont,
258 bfd_elf_generic_reloc,
259 "R_NIOS2_BFD_RELOC32",
260 FALSE,
261 0xffffffff,
262 0xffffffff,
263 FALSE),
264
265 HOWTO (R_NIOS2_BFD_RELOC_16,
266 0,
267 1, /* short */
268 16,
269 FALSE,
270 0,
271 complain_overflow_bitfield,
272 bfd_elf_generic_reloc,
273 "R_NIOS2_BFD_RELOC16",
274 FALSE,
275 0x0000ffff,
276 0x0000ffff,
277 FALSE),
278
279 HOWTO (R_NIOS2_BFD_RELOC_8,
280 0,
281 0, /* byte */
282 8,
283 FALSE,
284 0,
285 complain_overflow_bitfield,
286 bfd_elf_generic_reloc,
287 "R_NIOS2_BFD_RELOC8",
288 FALSE,
289 0x000000ff,
290 0x000000ff,
291 FALSE),
292
293 HOWTO (R_NIOS2_GPREL,
294 0,
295 2,
296 32,
297 FALSE,
298 6,
299 complain_overflow_dont,
300 nios2_elf32_gprel_relocate,
301 "R_NIOS2_GPREL",
302 FALSE,
303 0x003fffc0,
304 0x003fffc0,
305 FALSE),
306
307 HOWTO (R_NIOS2_GNU_VTINHERIT,
308 0,
309 2, /* short */
310 0,
311 FALSE,
312 0,
313 complain_overflow_dont,
314 NULL,
315 "R_NIOS2_GNU_VTINHERIT",
316 FALSE,
317 0,
318 0,
319 FALSE),
320
321 HOWTO (R_NIOS2_GNU_VTENTRY,
322 0,
323 2, /* byte */
324 0,
325 FALSE,
326 0,
327 complain_overflow_dont,
328 _bfd_elf_rel_vtable_reloc_fn,
329 "R_NIOS2_GNU_VTENTRY",
330 FALSE,
331 0,
332 0,
333 FALSE),
334
335 HOWTO (R_NIOS2_UJMP,
336 0,
337 2,
338 32,
339 FALSE,
340 6,
341 complain_overflow_dont,
342 nios2_elf32_ujmp_relocate,
343 "R_NIOS2_UJMP",
344 FALSE,
345 0x003fffc0,
346 0x003fffc0,
347 FALSE),
348
349 HOWTO (R_NIOS2_CJMP,
350 0,
351 2,
352 32,
353 FALSE,
354 6,
355 complain_overflow_dont,
356 nios2_elf32_cjmp_relocate,
357 "R_NIOS2_CJMP",
358 FALSE,
359 0x003fffc0,
360 0x003fffc0,
361 FALSE),
362
363 HOWTO (R_NIOS2_CALLR,
364 0,
365 2,
366 32,
367 FALSE,
368 6,
369 complain_overflow_dont,
370 nios2_elf32_callr_relocate,
371 "R_NIOS2_CALLR",
372 FALSE,
373 0x003fffc0,
374 0x003fffc0,
375 FALSE),
376
377 HOWTO (R_NIOS2_ALIGN,
378 0,
379 2,
380 0,
381 FALSE,
382 0,
383 complain_overflow_dont,
384 nios2_elf32_ignore_reloc,
385 "R_NIOS2_ALIGN",
386 FALSE,
387 0,
388 0,
389 TRUE),
390
391
392 HOWTO (R_NIOS2_GOT16,
393 0,
394 2,
395 16,
396 FALSE,
397 6,
398 complain_overflow_bitfield,
399 bfd_elf_generic_reloc,
400 "R_NIOS2_GOT16",
401 FALSE,
402 0x003fffc0,
403 0x003fffc0,
404 FALSE),
405
406 HOWTO (R_NIOS2_CALL16,
407 0,
408 2,
409 16,
410 FALSE,
411 6,
412 complain_overflow_bitfield,
413 bfd_elf_generic_reloc,
414 "R_NIOS2_CALL16",
415 FALSE,
416 0x003fffc0,
417 0x003fffc0,
418 FALSE),
419
420 HOWTO (R_NIOS2_GOTOFF_LO,
421 0,
422 2,
423 16,
424 FALSE,
425 6,
426 complain_overflow_dont,
427 bfd_elf_generic_reloc,
428 "R_NIOS2_GOTOFF_LO",
429 FALSE,
430 0x003fffc0,
431 0x003fffc0,
432 FALSE),
433
434 HOWTO (R_NIOS2_GOTOFF_HA,
435 0,
436 2,
437 16,
438 FALSE,
439 6,
440 complain_overflow_dont,
441 bfd_elf_generic_reloc,
442 "R_NIOS2_GOTOFF_HA",
443 FALSE,
444 0x003fffc0,
445 0x003fffc0,
446 FALSE),
447
448 HOWTO (R_NIOS2_PCREL_LO,
449 0,
450 2,
451 16,
452 TRUE,
453 6,
454 complain_overflow_dont,
455 nios2_elf32_pcrel_lo16_relocate,
456 "R_NIOS2_PCREL_LO",
457 FALSE,
458 0x003fffc0,
459 0x003fffc0,
460 TRUE),
461
462 HOWTO (R_NIOS2_PCREL_HA,
463 0,
464 2,
465 16,
466 FALSE, /* This is a PC-relative relocation, but we need to subtract
467 PC ourselves before the HIADJ. */
468 6,
469 complain_overflow_dont,
470 nios2_elf32_pcrel_hiadj16_relocate,
471 "R_NIOS2_PCREL_HA",
472 FALSE,
473 0x003fffc0,
474 0x003fffc0,
475 TRUE),
476
477 HOWTO (R_NIOS2_TLS_GD16,
478 0,
479 2,
480 16,
481 FALSE,
482 6,
483 complain_overflow_bitfield,
484 bfd_elf_generic_reloc,
485 "R_NIOS2_TLS_GD16",
486 FALSE,
487 0x003fffc0,
488 0x003fffc0,
489 FALSE),
490
491 HOWTO (R_NIOS2_TLS_LDM16,
492 0,
493 2,
494 16,
495 FALSE,
496 6,
497 complain_overflow_bitfield,
498 bfd_elf_generic_reloc,
499 "R_NIOS2_TLS_LDM16",
500 FALSE,
501 0x003fffc0,
502 0x003fffc0,
503 FALSE),
504
505 HOWTO (R_NIOS2_TLS_LDO16,
506 0,
507 2,
508 16,
509 FALSE,
510 6,
511 complain_overflow_bitfield,
512 bfd_elf_generic_reloc,
513 "R_NIOS2_TLS_LDO16",
514 FALSE,
515 0x003fffc0,
516 0x003fffc0,
517 FALSE),
518
519 HOWTO (R_NIOS2_TLS_IE16,
520 0,
521 2,
522 16,
523 FALSE,
524 6,
525 complain_overflow_bitfield,
526 bfd_elf_generic_reloc,
527 "R_NIOS2_TLS_IE16",
528 FALSE,
529 0x003fffc0,
530 0x003fffc0,
531 FALSE),
532
533 HOWTO (R_NIOS2_TLS_LE16,
534 0,
535 2,
536 16,
537 FALSE,
538 6,
539 complain_overflow_bitfield,
540 bfd_elf_generic_reloc,
541 "R_NIOS2_TLS_LE16",
542 FALSE,
543 0x003fffc0,
544 0x003fffc0,
545 FALSE),
546
547 HOWTO (R_NIOS2_TLS_DTPMOD,
548 0,
549 2,
550 32,
551 FALSE,
552 0,
553 complain_overflow_dont,
554 bfd_elf_generic_reloc,
555 "R_NIOS2_TLS_DTPMOD",
556 FALSE,
557 0xffffffff,
558 0xffffffff,
559 FALSE),
560
561 HOWTO (R_NIOS2_TLS_DTPREL,
562 0,
563 2,
564 32,
565 FALSE,
566 0,
567 complain_overflow_dont,
568 bfd_elf_generic_reloc,
569 "R_NIOS2_TLS_DTPREL",
570 FALSE,
571 0xffffffff,
572 0xffffffff,
573 FALSE),
574
575 HOWTO (R_NIOS2_TLS_TPREL,
576 0,
577 2,
578 32,
579 FALSE,
580 0,
581 complain_overflow_dont,
582 bfd_elf_generic_reloc,
583 "R_NIOS2_TLS_TPREL",
584 FALSE,
585 0xffffffff,
586 0xffffffff,
587 FALSE),
588
589 HOWTO (R_NIOS2_COPY,
590 0,
591 2,
592 32,
593 FALSE,
594 0,
595 complain_overflow_dont,
596 bfd_elf_generic_reloc,
597 "R_NIOS2_COPY",
598 FALSE,
599 0,
600 0,
601 FALSE),
602
603 HOWTO (R_NIOS2_GLOB_DAT,
604 0,
605 2,
606 32,
607 FALSE,
608 0,
609 complain_overflow_dont,
610 bfd_elf_generic_reloc,
611 "R_NIOS2_GLOB_DAT",
612 FALSE,
613 0xffffffff,
614 0xffffffff,
615 FALSE),
616
617 HOWTO (R_NIOS2_JUMP_SLOT,
618 0,
619 2,
620 32,
621 FALSE,
622 0,
623 complain_overflow_dont,
624 bfd_elf_generic_reloc,
625 "R_NIOS2_JUMP_SLOT",
626 FALSE,
627 0xffffffff,
628 0xffffffff,
629 FALSE),
630
631 HOWTO (R_NIOS2_RELATIVE,
632 0,
633 2,
634 32,
635 FALSE,
636 0,
637 complain_overflow_dont,
638 bfd_elf_generic_reloc,
639 "R_NIOS2_RELATIVE",
640 FALSE,
641 0xffffffff,
642 0xffffffff,
643 FALSE),
644
645 HOWTO (R_NIOS2_GOTOFF,
646 0,
647 2,
648 32,
649 FALSE,
650 0,
651 complain_overflow_dont,
652 bfd_elf_generic_reloc,
653 "R_NIOS2_GOTOFF",
654 FALSE,
655 0xffffffff,
656 0xffffffff,
657 FALSE),
658
659 HOWTO (R_NIOS2_CALL26_NOAT, /* type */
660 2, /* rightshift */
661 2, /* size (0 = byte, 1 = short, 2 = long) */
662 26, /* bitsize */
663 FALSE, /* pc_relative */
664 6, /* bitpos */
665 complain_overflow_dont, /* complain on overflow */
666 nios2_elf32_call26_relocate, /* special function */
667 "R_NIOS2_CALL26_NOAT", /* name */
668 FALSE, /* partial_inplace */
669 0xffffffc0, /* src_mask */
670 0xffffffc0, /* dst_mask */
671 FALSE), /* pcrel_offset */
672
673 HOWTO (R_NIOS2_GOT_LO,
674 0,
675 2,
676 16,
677 FALSE,
678 6,
679 complain_overflow_dont,
680 bfd_elf_generic_reloc,
681 "R_NIOS2_GOT_LO",
682 FALSE,
683 0x003fffc0,
684 0x003fffc0,
685 FALSE),
686
687 HOWTO (R_NIOS2_GOT_HA,
688 0,
689 2,
690 16,
691 FALSE,
692 6,
693 complain_overflow_dont,
694 bfd_elf_generic_reloc,
695 "R_NIOS2_GOT_HA",
696 FALSE,
697 0x003fffc0,
698 0x003fffc0,
699 FALSE),
700
701 HOWTO (R_NIOS2_CALL_LO,
702 0,
703 2,
704 16,
705 FALSE,
706 6,
707 complain_overflow_dont,
708 bfd_elf_generic_reloc,
709 "R_NIOS2_CALL_LO",
710 FALSE,
711 0x003fffc0,
712 0x003fffc0,
713 FALSE),
714
715 HOWTO (R_NIOS2_CALL_HA,
716 0,
717 2,
718 16,
719 FALSE,
720 6,
721 complain_overflow_dont,
722 bfd_elf_generic_reloc,
723 "R_NIOS2_CALL_HA",
724 FALSE,
725 0x003fffc0,
726 0x003fffc0,
727 FALSE),
728
729 /* Add other relocations here. */
730 };
731
732 static unsigned char elf_code_to_howto_index[R_NIOS2_ILLEGAL + 1];
733
734 /* Return the howto for relocation RTYPE. */
735 static reloc_howto_type *
736 lookup_howto (unsigned int rtype)
737 {
738 static int initialized = 0;
739 int i;
740 int howto_tbl_size = (int) (sizeof (elf_nios2_howto_table_rel)
741 / sizeof (elf_nios2_howto_table_rel[0]));
742
743 if (!initialized)
744 {
745 initialized = 1;
746 memset (elf_code_to_howto_index, 0xff,
747 sizeof (elf_code_to_howto_index));
748 for (i = 0; i < howto_tbl_size; i++)
749 elf_code_to_howto_index[elf_nios2_howto_table_rel[i].type] = i;
750 }
751
752 BFD_ASSERT (rtype <= R_NIOS2_ILLEGAL);
753 i = elf_code_to_howto_index[rtype];
754 if (i >= howto_tbl_size)
755 return 0;
756 return elf_nios2_howto_table_rel + i;
757 }
758
759 /* Map for converting BFD reloc types to Nios II reloc types. */
760 struct elf_reloc_map
761 {
762 bfd_reloc_code_real_type bfd_val;
763 enum elf_nios2_reloc_type elf_val;
764 };
765
766 static const struct elf_reloc_map nios2_reloc_map[] = {
767 {BFD_RELOC_NIOS2_S16, R_NIOS2_S16},
768 {BFD_RELOC_NIOS2_U16, R_NIOS2_U16},
769 {BFD_RELOC_16_PCREL, R_NIOS2_PCREL16},
770 {BFD_RELOC_NIOS2_CALL26, R_NIOS2_CALL26},
771 {BFD_RELOC_NIOS2_IMM5, R_NIOS2_IMM5},
772 {BFD_RELOC_NIOS2_CACHE_OPX, R_NIOS2_CACHE_OPX},
773 {BFD_RELOC_NIOS2_IMM6, R_NIOS2_IMM6},
774 {BFD_RELOC_NIOS2_IMM8, R_NIOS2_IMM8},
775 {BFD_RELOC_NIOS2_HI16, R_NIOS2_HI16},
776 {BFD_RELOC_NIOS2_LO16, R_NIOS2_LO16},
777 {BFD_RELOC_NIOS2_HIADJ16, R_NIOS2_HIADJ16},
778 {BFD_RELOC_32, R_NIOS2_BFD_RELOC_32},
779 {BFD_RELOC_16, R_NIOS2_BFD_RELOC_16},
780 {BFD_RELOC_8, R_NIOS2_BFD_RELOC_8},
781 {BFD_RELOC_NIOS2_GPREL, R_NIOS2_GPREL},
782 {BFD_RELOC_VTABLE_INHERIT, R_NIOS2_GNU_VTINHERIT},
783 {BFD_RELOC_VTABLE_ENTRY, R_NIOS2_GNU_VTENTRY},
784 {BFD_RELOC_NIOS2_UJMP, R_NIOS2_UJMP},
785 {BFD_RELOC_NIOS2_CJMP, R_NIOS2_CJMP},
786 {BFD_RELOC_NIOS2_CALLR, R_NIOS2_CALLR},
787 {BFD_RELOC_NIOS2_ALIGN, R_NIOS2_ALIGN},
788 {BFD_RELOC_NIOS2_GOT16, R_NIOS2_GOT16},
789 {BFD_RELOC_NIOS2_CALL16, R_NIOS2_CALL16},
790 {BFD_RELOC_NIOS2_GOTOFF_LO, R_NIOS2_GOTOFF_LO},
791 {BFD_RELOC_NIOS2_GOTOFF_HA, R_NIOS2_GOTOFF_HA},
792 {BFD_RELOC_NIOS2_PCREL_LO, R_NIOS2_PCREL_LO},
793 {BFD_RELOC_NIOS2_PCREL_HA, R_NIOS2_PCREL_HA},
794 {BFD_RELOC_NIOS2_TLS_GD16, R_NIOS2_TLS_GD16},
795 {BFD_RELOC_NIOS2_TLS_LDM16, R_NIOS2_TLS_LDM16},
796 {BFD_RELOC_NIOS2_TLS_LDO16, R_NIOS2_TLS_LDO16},
797 {BFD_RELOC_NIOS2_TLS_IE16, R_NIOS2_TLS_IE16},
798 {BFD_RELOC_NIOS2_TLS_LE16, R_NIOS2_TLS_LE16},
799 {BFD_RELOC_NIOS2_TLS_DTPMOD, R_NIOS2_TLS_DTPMOD},
800 {BFD_RELOC_NIOS2_TLS_DTPREL, R_NIOS2_TLS_DTPREL},
801 {BFD_RELOC_NIOS2_TLS_TPREL, R_NIOS2_TLS_TPREL},
802 {BFD_RELOC_NIOS2_COPY, R_NIOS2_COPY},
803 {BFD_RELOC_NIOS2_GLOB_DAT, R_NIOS2_GLOB_DAT},
804 {BFD_RELOC_NIOS2_JUMP_SLOT, R_NIOS2_JUMP_SLOT},
805 {BFD_RELOC_NIOS2_RELATIVE, R_NIOS2_RELATIVE},
806 {BFD_RELOC_NIOS2_GOTOFF, R_NIOS2_GOTOFF},
807 {BFD_RELOC_NIOS2_CALL26_NOAT, R_NIOS2_CALL26_NOAT},
808 {BFD_RELOC_NIOS2_GOT_LO, R_NIOS2_GOT_LO},
809 {BFD_RELOC_NIOS2_GOT_HA, R_NIOS2_GOT_HA},
810 {BFD_RELOC_NIOS2_CALL_LO, R_NIOS2_CALL_LO},
811 {BFD_RELOC_NIOS2_CALL_HA, R_NIOS2_CALL_HA},
812 };
813
814 enum elf32_nios2_stub_type
815 {
816 nios2_stub_call26_before,
817 nios2_stub_call26_after,
818 nios2_stub_none
819 };
820
821 struct elf32_nios2_stub_hash_entry
822 {
823 /* Base hash table entry structure. */
824 struct bfd_hash_entry bh_root;
825
826 /* The stub section. */
827 asection *stub_sec;
828
829 /* Offset within stub_sec of the beginning of this stub. */
830 bfd_vma stub_offset;
831
832 /* Given the symbol's value and its section we can determine its final
833 value when building the stubs (so the stub knows where to jump. */
834 bfd_vma target_value;
835 asection *target_section;
836
837 enum elf32_nios2_stub_type stub_type;
838
839 /* The symbol table entry, if any, that this was derived from. */
840 struct elf32_nios2_link_hash_entry *hh;
841
842 /* And the reloc addend that this was derived from. */
843 bfd_vma addend;
844
845 /* Where this stub is being called from, or, in the case of combined
846 stub sections, the first input section in the group. */
847 asection *id_sec;
848 };
849
850 #define nios2_stub_hash_entry(ent) \
851 ((struct elf32_nios2_stub_hash_entry *)(ent))
852
853 #define nios2_stub_hash_lookup(table, string, create, copy) \
854 ((struct elf32_nios2_stub_hash_entry *) \
855 bfd_hash_lookup ((table), (string), (create), (copy)))
856
857
858 /* The Nios II linker needs to keep track of the number of relocs that it
859 decides to copy as dynamic relocs in check_relocs for each symbol.
860 This is so that it can later discard them if they are found to be
861 unnecessary. We store the information in a field extending the
862 regular ELF linker hash table. */
863
864 struct elf32_nios2_dyn_relocs
865 {
866 struct elf32_nios2_dyn_relocs *next;
867
868 /* The input section of the reloc. */
869 asection *sec;
870
871 /* Total number of relocs copied for the input section. */
872 bfd_size_type count;
873
874 /* Number of pc-relative relocs copied for the input section. */
875 bfd_size_type pc_count;
876 };
877
878 /* Nios II ELF linker hash entry. */
879
880 struct elf32_nios2_link_hash_entry
881 {
882 struct elf_link_hash_entry root;
883
884 /* A pointer to the most recently used stub hash entry against this
885 symbol. */
886 struct elf32_nios2_stub_hash_entry *hsh_cache;
887
888 /* Track dynamic relocs copied for this symbol. */
889 struct elf32_nios2_dyn_relocs *dyn_relocs;
890
891 #define GOT_UNKNOWN 0
892 #define GOT_NORMAL 1
893 #define GOT_TLS_GD 2
894 #define GOT_TLS_IE 4
895 unsigned char tls_type;
896
897 /* We need to detect and take special action for symbols which are only
898 referenced with %call() and not with %got(). Such symbols do not need
899 a dynamic GOT reloc in shared objects, only a dynamic PLT reloc. Lazy
900 linking will not work if the dynamic GOT reloc exists.
901 To check for this condition efficiently, we compare got_types_used against
902 CALL_USED, meaning
903 (got_types_used & (GOT_USED | CALL_USED)) == CALL_USED.
904 */
905 #define GOT_USED 1
906 #define CALL_USED 2
907 unsigned char got_types_used;
908 };
909
910 #define elf32_nios2_hash_entry(ent) \
911 ((struct elf32_nios2_link_hash_entry *) (ent))
912
913 /* Get the Nios II elf linker hash table from a link_info structure. */
914 #define elf32_nios2_hash_table(info) \
915 ((struct elf32_nios2_link_hash_table *) ((info)->hash))
916
917 /* Nios II ELF linker hash table. */
918 struct elf32_nios2_link_hash_table
919 {
920 /* The main hash table. */
921 struct elf_link_hash_table root;
922
923 /* The stub hash table. */
924 struct bfd_hash_table bstab;
925
926 /* Linker stub bfd. */
927 bfd *stub_bfd;
928
929 /* Linker call-backs. */
930 asection * (*add_stub_section) (const char *, asection *, bfd_boolean);
931 void (*layout_sections_again) (void);
932
933 /* Array to keep track of which stub sections have been created, and
934 information on stub grouping. */
935 struct map_stub
936 {
937 /* These are the section to which stubs in the group will be
938 attached. */
939 asection *first_sec, *last_sec;
940 /* The stub sections. There might be stubs inserted either before
941 or after the real section.*/
942 asection *first_stub_sec, *last_stub_sec;
943 } *stub_group;
944
945 /* Assorted information used by nios2_elf32_size_stubs. */
946 unsigned int bfd_count;
947 int top_index;
948 asection **input_list;
949 Elf_Internal_Sym **all_local_syms;
950
951 /* Short-cuts to get to dynamic linker sections. */
952 asection *sdynbss;
953 asection *srelbss;
954 asection *sbss;
955
956 /* GOT pointer symbol _gp_got. */
957 struct elf_link_hash_entry *h_gp_got;
958
959 union {
960 bfd_signed_vma refcount;
961 bfd_vma offset;
962 } tls_ldm_got;
963
964 /* Small local sym cache. */
965 struct sym_cache sym_cache;
966
967 bfd_vma res_n_size;
968 };
969
970 struct nios2_elf32_obj_tdata
971 {
972 struct elf_obj_tdata root;
973
974 /* tls_type for each local got entry. */
975 char *local_got_tls_type;
976
977 /* TRUE if TLS GD relocs have been seen for this object. */
978 bfd_boolean has_tlsgd;
979 };
980
981 #define elf32_nios2_tdata(abfd) \
982 ((struct nios2_elf32_obj_tdata *) (abfd)->tdata.any)
983
984 #define elf32_nios2_local_got_tls_type(abfd) \
985 (elf32_nios2_tdata (abfd)->local_got_tls_type)
986
987 /* The name of the dynamic interpreter. This is put in the .interp
988 section. */
989 #define ELF_DYNAMIC_INTERPRETER "/lib/ld.so.1"
990
991 /* PLT implementation for position-dependent code. */
992 static const bfd_vma nios2_plt_entry[] = { /* .PLTn: */
993 0x03c00034, /* movhi r15, %hiadj(plt_got_slot_address) */
994 0x7bc00017, /* ldw r15, %lo(plt_got_slot_address)(r15) */
995 0x7800683a /* jmp r15 */
996 };
997
998 static const bfd_vma nios2_plt0_entry[] = { /* .PLTresolve */
999 0x03800034, /* movhi r14, %hiadj(res_0) */
1000 0x73800004, /* addi r14, r14, %lo(res_0) */
1001 0x7b9fc83a, /* sub r15, r15, r14 */
1002 0x03400034, /* movhi r13, %hiadj(_GLOBAL_OFFSET_TABLE_) */
1003 0x6b800017, /* ldw r14, %lo(_GLOBAL_OFFSET_TABLE_+4)(r13) */
1004 0x6b400017, /* ldw r13, %lo(_GLOBAL_OFFSET_TABLE_+8)(r13) */
1005 0x6800683a /* jmp r13 */
1006 };
1007
1008 /* PLT implementation for position-independent code. */
1009 static const bfd_vma nios2_so_plt_entry[] = { /* .PLTn */
1010 0x03c00034, /* movhi r15, %hiadj(index * 4) */
1011 0x7bc00004, /* addi r15, r15, %lo(index * 4) */
1012 0x00000006 /* br .PLTresolve */
1013 };
1014
1015 static const bfd_vma nios2_so_plt0_entry[] = { /* .PLTresolve */
1016 0x001ce03a, /* nextpc r14 */
1017 0x03400034, /* movhi r13, %hiadj(_GLOBAL_OFFSET_TABLE_) */
1018 0x6b9b883a, /* add r13, r13, r14 */
1019 0x6b800017, /* ldw r14, %lo(_GLOBAL_OFFSET_TABLE_+4)(r13) */
1020 0x6b400017, /* ldw r13, %lo(_GLOBAL_OFFSET_TABLE_+8)(r13) */
1021 0x6800683a /* jmp r13 */
1022 };
1023
1024 /* CALL26 stub. */
1025 static const bfd_vma nios2_call26_stub_entry[] = {
1026 0x00400034, /* orhi at, r0, %hiadj(dest) */
1027 0x08400004, /* addi at, at, %lo(dest) */
1028 0x0800683a /* jmp at */
1029 };
1030
1031 /* Install 16-bit immediate value VALUE at offset OFFSET into section SEC. */
1032 static void
1033 nios2_elf32_install_imm16 (asection *sec, bfd_vma offset, bfd_vma value)
1034 {
1035 bfd_vma word = bfd_get_32 (sec->owner, sec->contents + offset);
1036
1037 BFD_ASSERT(value <= 0xffff);
1038
1039 bfd_put_32 (sec->owner, word | ((value & 0xffff) << 6),
1040 sec->contents + offset);
1041 }
1042
1043 /* Install COUNT 32-bit values DATA starting at offset OFFSET into
1044 section SEC. */
1045 static void
1046 nios2_elf32_install_data (asection *sec, const bfd_vma *data, bfd_vma offset,
1047 int count)
1048 {
1049 while (count--)
1050 {
1051 bfd_put_32 (sec->owner, *data, sec->contents + offset);
1052 offset += 4;
1053 ++data;
1054 }
1055 }
1056
1057 /* The usual way of loading a 32-bit constant into a Nios II register is to
1058 load the high 16 bits in one instruction and then add the low 16 bits with
1059 a signed add. This means that the high halfword needs to be adjusted to
1060 compensate for the sign bit of the low halfword. This function returns the
1061 adjusted high halfword for a given 32-bit constant. */
1062 static
1063 bfd_vma hiadj (bfd_vma symbol_value)
1064 {
1065 return ((symbol_value + 0x8000) >> 16) & 0xffff;
1066 }
1067
1068 /* Implement elf_backend_grok_prstatus:
1069 Support for core dump NOTE sections. */
1070 static bfd_boolean
1071 nios2_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
1072 {
1073 int offset;
1074 size_t size;
1075
1076 switch (note->descsz)
1077 {
1078 default:
1079 return FALSE;
1080
1081 case 212: /* Linux/Nios II */
1082 /* pr_cursig */
1083 elf_tdata (abfd)->core->signal = bfd_get_16 (abfd, note->descdata + 12);
1084
1085 /* pr_pid */
1086 elf_tdata (abfd)->core->pid = bfd_get_32 (abfd, note->descdata + 24);
1087
1088 /* pr_reg */
1089 offset = 72;
1090 size = 136;
1091
1092 break;
1093 }
1094
1095 /* Make a ".reg/999" section. */
1096 return _bfd_elfcore_make_pseudosection (abfd, ".reg",
1097 size, note->descpos + offset);
1098 }
1099
1100 /* Implement elf_backend_grok_psinfo. */
1101 static bfd_boolean
1102 nios2_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
1103 {
1104 switch (note->descsz)
1105 {
1106 default:
1107 return FALSE;
1108
1109 case 124: /* Linux/Nios II elf_prpsinfo */
1110 elf_tdata (abfd)->core->program
1111 = _bfd_elfcore_strndup (abfd, note->descdata + 28, 16);
1112 elf_tdata (abfd)->core->command
1113 = _bfd_elfcore_strndup (abfd, note->descdata + 44, 80);
1114 }
1115
1116 /* Note that for some reason, a spurious space is tacked
1117 onto the end of the args in some (at least one anyway)
1118 implementations, so strip it off if it exists. */
1119
1120 {
1121 char *command = elf_tdata (abfd)->core->command;
1122 int n = strlen (command);
1123
1124 if (0 < n && command[n - 1] == ' ')
1125 command[n - 1] = '\0';
1126 }
1127
1128 return TRUE;
1129 }
1130
1131 /* Assorted hash table functions. */
1132
1133 /* Initialize an entry in the stub hash table. */
1134 static struct bfd_hash_entry *
1135 stub_hash_newfunc (struct bfd_hash_entry *entry,
1136 struct bfd_hash_table *table,
1137 const char *string)
1138 {
1139 /* Allocate the structure if it has not already been allocated by a
1140 subclass. */
1141 if (entry == NULL)
1142 {
1143 entry = bfd_hash_allocate (table,
1144 sizeof (struct elf32_nios2_stub_hash_entry));
1145 if (entry == NULL)
1146 return entry;
1147 }
1148
1149 /* Call the allocation method of the superclass. */
1150 entry = bfd_hash_newfunc (entry, table, string);
1151 if (entry != NULL)
1152 {
1153 struct elf32_nios2_stub_hash_entry *hsh;
1154
1155 /* Initialize the local fields. */
1156 hsh = (struct elf32_nios2_stub_hash_entry *) entry;
1157 hsh->stub_sec = NULL;
1158 hsh->stub_offset = 0;
1159 hsh->target_value = 0;
1160 hsh->target_section = NULL;
1161 hsh->stub_type = nios2_stub_none;
1162 hsh->hh = NULL;
1163 hsh->id_sec = NULL;
1164 }
1165
1166 return entry;
1167 }
1168
1169 /* Create an entry in a Nios II ELF linker hash table. */
1170 static struct bfd_hash_entry *
1171 link_hash_newfunc (struct bfd_hash_entry *entry,
1172 struct bfd_hash_table *table, const char *string)
1173 {
1174 /* Allocate the structure if it has not already been allocated by a
1175 subclass. */
1176 if (entry == NULL)
1177 {
1178 entry = bfd_hash_allocate (table,
1179 sizeof (struct elf32_nios2_link_hash_entry));
1180 if (entry == NULL)
1181 return entry;
1182 }
1183
1184 /* Call the allocation method of the superclass. */
1185 entry = _bfd_elf_link_hash_newfunc (entry, table, string);
1186 if (entry)
1187 {
1188 struct elf32_nios2_link_hash_entry *eh;
1189
1190 eh = (struct elf32_nios2_link_hash_entry *) entry;
1191 eh->hsh_cache = NULL;
1192 eh->dyn_relocs = NULL;
1193 eh->tls_type = GOT_UNKNOWN;
1194 eh->got_types_used = 0;
1195 }
1196
1197 return entry;
1198 }
1199
1200 /* Section name for stubs is the associated section name plus this
1201 string. */
1202 #define STUB_SUFFIX ".stub"
1203
1204 /* Build a name for an entry in the stub hash table. */
1205 static char *
1206 nios2_stub_name (const asection *input_section,
1207 const asection *sym_sec,
1208 const struct elf32_nios2_link_hash_entry *hh,
1209 const Elf_Internal_Rela *rel,
1210 enum elf32_nios2_stub_type stub_type)
1211 {
1212 char *stub_name;
1213 bfd_size_type len;
1214 char stubpos = (stub_type == nios2_stub_call26_before) ? 'b' : 'a';
1215
1216 if (hh)
1217 {
1218 len = 8 + 1 + 1 + 1+ strlen (hh->root.root.root.string) + 1 + 8 + 1;
1219 stub_name = bfd_malloc (len);
1220 if (stub_name != NULL)
1221 {
1222 sprintf (stub_name, "%08x_%c_%s+%x",
1223 input_section->id & 0xffffffff,
1224 stubpos,
1225 hh->root.root.root.string,
1226 (int) rel->r_addend & 0xffffffff);
1227 }
1228 }
1229 else
1230 {
1231 len = 8 + 1 + 1 + 1+ 8 + 1 + 8 + 1 + 8 + 1;
1232 stub_name = bfd_malloc (len);
1233 if (stub_name != NULL)
1234 {
1235 sprintf (stub_name, "%08x_%c_%x:%x+%x",
1236 input_section->id & 0xffffffff,
1237 stubpos,
1238 sym_sec->id & 0xffffffff,
1239 (int) ELF32_R_SYM (rel->r_info) & 0xffffffff,
1240 (int) rel->r_addend & 0xffffffff);
1241 }
1242 }
1243 return stub_name;
1244 }
1245
1246 /* Look up an entry in the stub hash. Stub entries are cached because
1247 creating the stub name takes a bit of time. */
1248 static struct elf32_nios2_stub_hash_entry *
1249 nios2_get_stub_entry (const asection *input_section,
1250 const asection *sym_sec,
1251 struct elf32_nios2_link_hash_entry *hh,
1252 const Elf_Internal_Rela *rel,
1253 struct elf32_nios2_link_hash_table *htab,
1254 enum elf32_nios2_stub_type stub_type)
1255 {
1256 struct elf32_nios2_stub_hash_entry *hsh;
1257 const asection *id_sec;
1258
1259 /* If this input section is part of a group of sections sharing one
1260 stub section, then use the id of the first/last section in the group,
1261 depending on the stub section placement relative to the group.
1262 Stub names need to include a section id, as there may well be
1263 more than one stub used to reach say, printf, and we need to
1264 distinguish between them. */
1265 if (stub_type == nios2_stub_call26_before)
1266 id_sec = htab->stub_group[input_section->id].first_sec;
1267 else
1268 id_sec = htab->stub_group[input_section->id].last_sec;
1269
1270 if (hh != NULL && hh->hsh_cache != NULL
1271 && hh->hsh_cache->hh == hh
1272 && hh->hsh_cache->id_sec == id_sec
1273 && hh->hsh_cache->stub_type == stub_type)
1274 {
1275 hsh = hh->hsh_cache;
1276 }
1277 else
1278 {
1279 char *stub_name;
1280
1281 stub_name = nios2_stub_name (id_sec, sym_sec, hh, rel, stub_type);
1282 if (stub_name == NULL)
1283 return NULL;
1284
1285 hsh = nios2_stub_hash_lookup (&htab->bstab,
1286 stub_name, FALSE, FALSE);
1287
1288 if (hh != NULL)
1289 hh->hsh_cache = hsh;
1290
1291 free (stub_name);
1292 }
1293
1294 return hsh;
1295 }
1296
1297 /* Add a new stub entry to the stub hash. Not all fields of the new
1298 stub entry are initialised. */
1299 static struct elf32_nios2_stub_hash_entry *
1300 nios2_add_stub (const char *stub_name,
1301 asection *section,
1302 struct elf32_nios2_link_hash_table *htab,
1303 enum elf32_nios2_stub_type stub_type)
1304 {
1305 asection *link_sec;
1306 asection *stub_sec;
1307 asection **secptr, **linkptr;
1308 struct elf32_nios2_stub_hash_entry *hsh;
1309 bfd_boolean afterp;
1310
1311 if (stub_type == nios2_stub_call26_before)
1312 {
1313 link_sec = htab->stub_group[section->id].first_sec;
1314 secptr = &(htab->stub_group[section->id].first_stub_sec);
1315 linkptr = &(htab->stub_group[link_sec->id].first_stub_sec);
1316 afterp = FALSE;
1317 }
1318 else
1319 {
1320 link_sec = htab->stub_group[section->id].last_sec;
1321 secptr = &(htab->stub_group[section->id].last_stub_sec);
1322 linkptr = &(htab->stub_group[link_sec->id].last_stub_sec);
1323 afterp = TRUE;
1324 }
1325 stub_sec = *secptr;
1326 if (stub_sec == NULL)
1327 {
1328 stub_sec = *linkptr;
1329 if (stub_sec == NULL)
1330 {
1331 size_t namelen;
1332 bfd_size_type len;
1333 char *s_name;
1334
1335 namelen = strlen (link_sec->name);
1336 len = namelen + sizeof (STUB_SUFFIX);
1337 s_name = bfd_alloc (htab->stub_bfd, len);
1338 if (s_name == NULL)
1339 return NULL;
1340
1341 memcpy (s_name, link_sec->name, namelen);
1342 memcpy (s_name + namelen, STUB_SUFFIX, sizeof (STUB_SUFFIX));
1343
1344 stub_sec = (*htab->add_stub_section) (s_name, link_sec, afterp);
1345 if (stub_sec == NULL)
1346 return NULL;
1347 *linkptr = stub_sec;
1348 }
1349 *secptr = stub_sec;
1350 }
1351
1352 /* Enter this entry into the linker stub hash table. */
1353 hsh = nios2_stub_hash_lookup (&htab->bstab, stub_name,
1354 TRUE, FALSE);
1355 if (hsh == NULL)
1356 {
1357 (*_bfd_error_handler) (_("%B: cannot create stub entry %s"),
1358 section->owner,
1359 stub_name);
1360 return NULL;
1361 }
1362
1363 hsh->stub_sec = stub_sec;
1364 hsh->stub_offset = 0;
1365 hsh->id_sec = link_sec;
1366 return hsh;
1367 }
1368
1369 /* Set up various things so that we can make a list of input sections
1370 for each output section included in the link. Returns -1 on error,
1371 0 when no stubs will be needed, and 1 on success. */
1372 int
1373 nios2_elf32_setup_section_lists (bfd *output_bfd, struct bfd_link_info *info)
1374 {
1375 bfd *input_bfd;
1376 unsigned int bfd_count;
1377 int top_id, top_index;
1378 asection *section;
1379 asection **input_list, **list;
1380 bfd_size_type amt;
1381 struct elf32_nios2_link_hash_table *htab = elf32_nios2_hash_table (info);
1382
1383 /* Count the number of input BFDs and find the top input section id. */
1384 for (input_bfd = info->input_bfds, bfd_count = 0, top_id = 0;
1385 input_bfd != NULL;
1386 input_bfd = input_bfd->link_next)
1387 {
1388 bfd_count += 1;
1389 for (section = input_bfd->sections;
1390 section != NULL;
1391 section = section->next)
1392 {
1393 if (top_id < section->id)
1394 top_id = section->id;
1395 }
1396 }
1397
1398 htab->bfd_count = bfd_count;
1399
1400 amt = sizeof (struct map_stub) * (top_id + 1);
1401 htab->stub_group = bfd_zmalloc (amt);
1402 if (htab->stub_group == NULL)
1403 return -1;
1404
1405 /* We can't use output_bfd->section_count here to find the top output
1406 section index as some sections may have been removed, and
1407 strip_excluded_output_sections doesn't renumber the indices. */
1408 for (section = output_bfd->sections, top_index = 0;
1409 section != NULL;
1410 section = section->next)
1411 {
1412 if (top_index < section->index)
1413 top_index = section->index;
1414 }
1415
1416 htab->top_index = top_index;
1417 amt = sizeof (asection *) * (top_index + 1);
1418 input_list = bfd_malloc (amt);
1419 htab->input_list = input_list;
1420 if (input_list == NULL)
1421 return -1;
1422
1423 /* For sections we aren't interested in, mark their entries with a
1424 value we can check later. */
1425 list = input_list + top_index;
1426 do
1427 *list = bfd_abs_section_ptr;
1428 while (list-- != input_list);
1429
1430 for (section = output_bfd->sections;
1431 section != NULL;
1432 section = section->next)
1433 {
1434 /* FIXME: This is a bit of hack. Currently our .ctors and .dtors
1435 * have PC relative relocs in them but no code flag set. */
1436 if (((section->flags & SEC_CODE) != 0) ||
1437 strcmp(".ctors", section->name) ||
1438 strcmp(".dtors", section->name))
1439 input_list[section->index] = NULL;
1440 }
1441
1442 return 1;
1443 }
1444
1445 /* The linker repeatedly calls this function for each input section,
1446 in the order that input sections are linked into output sections.
1447 Build lists of input sections to determine groupings between which
1448 we may insert linker stubs. */
1449 void
1450 nios2_elf32_next_input_section (struct bfd_link_info *info, asection *isec)
1451 {
1452 struct elf32_nios2_link_hash_table *htab = elf32_nios2_hash_table (info);
1453
1454 if (isec->output_section->index <= htab->top_index)
1455 {
1456 asection **list = htab->input_list + isec->output_section->index;
1457 if (*list != bfd_abs_section_ptr)
1458 {
1459 /* Steal the last_sec pointer for our list.
1460 This happens to make the list in reverse order,
1461 which is what we want. */
1462 htab->stub_group[isec->id].last_sec = *list;
1463 *list = isec;
1464 }
1465 }
1466 }
1467
1468 /* Segment mask for CALL26 relocation relaxation. */
1469 #define CALL26_SEGMENT(x) ((x) & 0xf0000000)
1470
1471 /* Fudge factor for approximate maximum size of all stubs that might
1472 be inserted by the linker. This does not actually limit the number
1473 of stubs that might be inserted, and only affects strategy for grouping
1474 and placement of stubs. Perhaps this should be computed based on number
1475 of relocations seen, or be specifiable on the command line. */
1476 #define MAX_STUB_SECTION_SIZE 0xffff
1477
1478 /* See whether we can group stub sections together. Grouping stub
1479 sections may result in fewer stubs. More importantly, we need to
1480 put all .init* and .fini* stubs at the end of the .init or
1481 .fini output sections respectively, because glibc splits the
1482 _init and _fini functions into multiple parts. Putting a stub in
1483 the middle of a function is not a good idea.
1484 Rather than computing groups of a maximum fixed size, for Nios II
1485 CALL26 relaxation it makes more sense to compute the groups based on
1486 sections that fit within a 256MB address segment. Also do not allow
1487 a group to span more than one output section, since different output
1488 sections might correspond to different memory banks on a bare-metal
1489 target, etc. */
1490 static void
1491 group_sections (struct elf32_nios2_link_hash_table *htab)
1492 {
1493 asection **list = htab->input_list + htab->top_index;
1494 do
1495 {
1496 /* The list is in reverse order so we'll search backwards looking
1497 for the first section that begins in the same memory segment,
1498 marking sections along the way to point at the tail for this
1499 group. */
1500 asection *tail = *list;
1501 if (tail == bfd_abs_section_ptr)
1502 continue;
1503 while (tail != NULL)
1504 {
1505 bfd_vma start = tail->output_section->vma + tail->output_offset;
1506 bfd_vma end = start + tail->size;
1507 bfd_vma segment = CALL26_SEGMENT (end);
1508 asection *prev;
1509
1510 if (segment != CALL26_SEGMENT (start)
1511 || segment != CALL26_SEGMENT (end + MAX_STUB_SECTION_SIZE))
1512 /* This section spans more than one memory segment, or is
1513 close enough to the end of the segment that adding stub
1514 sections before it might cause it to move so that it
1515 spans memory segments, or that stubs added at the end of
1516 this group might overflow into the next memory segment.
1517 Put it in a group by itself to localize the effects. */
1518 {
1519 prev = htab->stub_group[tail->id].last_sec;
1520 htab->stub_group[tail->id].last_sec = tail;
1521 htab->stub_group[tail->id].first_sec = tail;
1522 }
1523 else
1524 /* Collect more sections for this group. */
1525 {
1526 asection *curr, *first;
1527 for (curr = tail; ; curr = prev)
1528 {
1529 prev = htab->stub_group[curr->id].last_sec;
1530 if (!prev
1531 || tail->output_section != prev->output_section
1532 || (CALL26_SEGMENT (prev->output_section->vma
1533 + prev->output_offset)
1534 != segment))
1535 break;
1536 }
1537 first = curr;
1538 for (curr = tail; ; curr = prev)
1539 {
1540 prev = htab->stub_group[curr->id].last_sec;
1541 htab->stub_group[curr->id].last_sec = tail;
1542 htab->stub_group[curr->id].first_sec = first;
1543 if (curr == first)
1544 break;
1545 }
1546 }
1547
1548 /* Reset tail for the next group. */
1549 tail = prev;
1550 }
1551 }
1552 while (list-- != htab->input_list);
1553 free (htab->input_list);
1554 }
1555
1556 /* Determine the type of stub needed, if any, for a call. */
1557 static enum elf32_nios2_stub_type
1558 nios2_type_of_stub (asection *input_sec,
1559 const Elf_Internal_Rela *rel,
1560 struct elf32_nios2_link_hash_entry *hh,
1561 struct elf32_nios2_link_hash_table *htab,
1562 bfd_vma destination,
1563 struct bfd_link_info *info ATTRIBUTE_UNUSED)
1564 {
1565 bfd_vma location, segment, start, end;
1566 asection *s0, *s1, *s;
1567
1568 if (hh != NULL &&
1569 !(hh->root.root.type == bfd_link_hash_defined
1570 || hh->root.root.type == bfd_link_hash_defweak))
1571 return nios2_stub_none;
1572
1573 /* Determine where the call point is. */
1574 location = (input_sec->output_section->vma
1575 + input_sec->output_offset + rel->r_offset);
1576 segment = CALL26_SEGMENT (location);
1577
1578 /* Nios II CALL and JMPI instructions can transfer control to addresses
1579 within the same 256MB segment as the PC. */
1580 if (segment == CALL26_SEGMENT (destination))
1581 return nios2_stub_none;
1582
1583 /* Find the start and end addresses of the stub group. Also account for
1584 any already-created stub sections for this group. Note that for stubs
1585 in the end section, only the first instruction of the last stub
1586 (12 bytes long) needs to be within range. */
1587 s0 = htab->stub_group[input_sec->id].first_sec;
1588 s = htab->stub_group[s0->id].first_stub_sec;
1589 if (s != NULL && s->size > 0)
1590 start = s->output_section->vma + s->output_offset;
1591 else
1592 start = s0->output_section->vma + s0->output_offset;
1593
1594 s1 = htab->stub_group[input_sec->id].last_sec;
1595 s = htab->stub_group[s1->id].last_stub_sec;
1596 if (s != NULL && s->size > 0)
1597 end = s->output_section->vma + s->output_offset + s->size - 8;
1598 else
1599 end = s1->output_section->vma + s1->output_offset + s1->size;
1600
1601 BFD_ASSERT (start < end);
1602 BFD_ASSERT (start <= location);
1603 BFD_ASSERT (location < end);
1604
1605 /* Put stubs at the end of the group unless that is not a valid
1606 location and the beginning of the group is. It might be that
1607 neither the beginning nor end works if we have an input section
1608 so large that it spans multiple segment boundaries. In that
1609 case, punt; the end result will be a relocation overflow error no
1610 matter what we do here.
1611
1612 Note that adding stubs pushes up the addresses of all subsequent
1613 sections, so that stubs allocated on one pass through the
1614 relaxation loop may not be valid on the next pass. (E.g., we may
1615 allocate a stub at the beginning of the section on one pass and
1616 find that the call site has been bumped into the next memory
1617 segment on the next pass.) The important thing to note is that
1618 we never try to reclaim the space allocated to such unused stubs,
1619 so code size and section addresses can only increase with each
1620 iteration. Accounting for the start and end addresses of the
1621 already-created stub sections ensures that when the algorithm
1622 converges, it converges accurately, with the entire appropriate
1623 stub section accessible from the call site and not just the
1624 address at the start or end of the stub group proper. */
1625
1626 if (segment == CALL26_SEGMENT (end))
1627 return nios2_stub_call26_after;
1628 else if (segment == CALL26_SEGMENT (start))
1629 return nios2_stub_call26_before;
1630 else
1631 /* Perhaps this should be a dedicated error code. */
1632 return nios2_stub_none;
1633 }
1634
1635 static bfd_boolean
1636 nios2_build_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg ATTRIBUTE_UNUSED)
1637 {
1638 struct elf32_nios2_stub_hash_entry *hsh
1639 = (struct elf32_nios2_stub_hash_entry *) gen_entry;
1640 asection *stub_sec = hsh->stub_sec;
1641 bfd_vma sym_value;
1642
1643 /* Make a note of the offset within the stubs for this entry. */
1644 hsh->stub_offset = stub_sec->size;
1645
1646 switch (hsh->stub_type)
1647 {
1648 case nios2_stub_call26_before:
1649 case nios2_stub_call26_after:
1650 /* A call26 stub looks like:
1651 orhi at, %hiadj(dest)
1652 addi at, at, %lo(dest)
1653 jmp at
1654 Note that call/jmpi instructions can't be used in PIC code
1655 so there is no reason for the stub to be PIC, either. */
1656 sym_value = (hsh->target_value
1657 + hsh->target_section->output_offset
1658 + hsh->target_section->output_section->vma
1659 + hsh->addend);
1660
1661 nios2_elf32_install_data (stub_sec, nios2_call26_stub_entry,
1662 hsh->stub_offset, 3);
1663 nios2_elf32_install_imm16 (stub_sec, hsh->stub_offset,
1664 hiadj (sym_value));
1665 nios2_elf32_install_imm16 (stub_sec, hsh->stub_offset + 4,
1666 (sym_value & 0xffff));
1667 stub_sec->size += 12;
1668 break;
1669 default:
1670 BFD_FAIL ();
1671 return FALSE;
1672 }
1673
1674 return TRUE;
1675 }
1676
1677 /* As above, but don't actually build the stub. Just bump offset so
1678 we know stub section sizes. */
1679 static bfd_boolean
1680 nios2_size_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg ATTRIBUTE_UNUSED)
1681 {
1682 struct elf32_nios2_stub_hash_entry *hsh
1683 = (struct elf32_nios2_stub_hash_entry *) gen_entry;
1684
1685 switch (hsh->stub_type)
1686 {
1687 case nios2_stub_call26_before:
1688 case nios2_stub_call26_after:
1689 hsh->stub_sec->size += 12;
1690 break;
1691 default:
1692 BFD_FAIL ();
1693 return FALSE;
1694 }
1695 return TRUE;
1696 }
1697
1698 /* Read in all local syms for all input bfds.
1699 Returns -1 on error, 0 otherwise. */
1700
1701 static int
1702 get_local_syms (bfd *output_bfd ATTRIBUTE_UNUSED, bfd *input_bfd,
1703 struct bfd_link_info *info)
1704 {
1705 unsigned int bfd_indx;
1706 Elf_Internal_Sym *local_syms, **all_local_syms;
1707 struct elf32_nios2_link_hash_table *htab = elf32_nios2_hash_table (info);
1708
1709 /* We want to read in symbol extension records only once. To do this
1710 we need to read in the local symbols in parallel and save them for
1711 later use; so hold pointers to the local symbols in an array. */
1712 bfd_size_type amt = sizeof (Elf_Internal_Sym *) * htab->bfd_count;
1713 all_local_syms = bfd_zmalloc (amt);
1714 htab->all_local_syms = all_local_syms;
1715 if (all_local_syms == NULL)
1716 return -1;
1717
1718 /* Walk over all the input BFDs, swapping in local symbols. */
1719 for (bfd_indx = 0;
1720 input_bfd != NULL;
1721 input_bfd = input_bfd->link_next, bfd_indx++)
1722 {
1723 Elf_Internal_Shdr *symtab_hdr;
1724
1725 /* We'll need the symbol table in a second. */
1726 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
1727 if (symtab_hdr->sh_info == 0)
1728 continue;
1729
1730 /* We need an array of the local symbols attached to the input bfd. */
1731 local_syms = (Elf_Internal_Sym *) symtab_hdr->contents;
1732 if (local_syms == NULL)
1733 {
1734 local_syms = bfd_elf_get_elf_syms (input_bfd, symtab_hdr,
1735 symtab_hdr->sh_info, 0,
1736 NULL, NULL, NULL);
1737 /* Cache them for elf_link_input_bfd. */
1738 symtab_hdr->contents = (unsigned char *) local_syms;
1739 }
1740 if (local_syms == NULL)
1741 return -1;
1742
1743 all_local_syms[bfd_indx] = local_syms;
1744 }
1745
1746 return 0;
1747 }
1748
1749 /* Determine and set the size of the stub section for a final link. */
1750 bfd_boolean
1751 nios2_elf32_size_stubs (bfd *output_bfd, bfd *stub_bfd,
1752 struct bfd_link_info *info,
1753 asection *(*add_stub_section) (const char *,
1754 asection *, bfd_boolean),
1755 void (*layout_sections_again) (void))
1756 {
1757 bfd_boolean stub_changed = FALSE;
1758 struct elf32_nios2_link_hash_table *htab = elf32_nios2_hash_table (info);
1759
1760 /* Stash our params away. */
1761 htab->stub_bfd = stub_bfd;
1762 htab->add_stub_section = add_stub_section;
1763 htab->layout_sections_again = layout_sections_again;
1764
1765 /* FIXME: We only compute the section groups once. This could cause
1766 problems if adding a large stub section causes following sections,
1767 or parts of them, to move into another segment. However, this seems
1768 to be consistent with the way other back ends handle this.... */
1769 group_sections (htab);
1770
1771 if (get_local_syms (output_bfd, info->input_bfds, info))
1772 {
1773 if (htab->all_local_syms)
1774 goto error_ret_free_local;
1775 return FALSE;
1776 }
1777
1778 while (1)
1779 {
1780 bfd *input_bfd;
1781 unsigned int bfd_indx;
1782 asection *stub_sec;
1783
1784 for (input_bfd = info->input_bfds, bfd_indx = 0;
1785 input_bfd != NULL;
1786 input_bfd = input_bfd->link_next, bfd_indx++)
1787 {
1788 Elf_Internal_Shdr *symtab_hdr;
1789 asection *section;
1790 Elf_Internal_Sym *local_syms;
1791
1792 /* We'll need the symbol table in a second. */
1793 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
1794 if (symtab_hdr->sh_info == 0)
1795 continue;
1796
1797 local_syms = htab->all_local_syms[bfd_indx];
1798
1799 /* Walk over each section attached to the input bfd. */
1800 for (section = input_bfd->sections;
1801 section != NULL;
1802 section = section->next)
1803 {
1804 Elf_Internal_Rela *internal_relocs, *irelaend, *irela;
1805
1806 /* If there aren't any relocs, then there's nothing more
1807 to do. */
1808 if ((section->flags & SEC_RELOC) == 0
1809 || section->reloc_count == 0)
1810 continue;
1811
1812 /* If this section is a link-once section that will be
1813 discarded, then don't create any stubs. */
1814 if (section->output_section == NULL
1815 || section->output_section->owner != output_bfd)
1816 continue;
1817
1818 /* Get the relocs. */
1819 internal_relocs
1820 = _bfd_elf_link_read_relocs (input_bfd, section, NULL, NULL,
1821 info->keep_memory);
1822 if (internal_relocs == NULL)
1823 goto error_ret_free_local;
1824
1825 /* Now examine each relocation. */
1826 irela = internal_relocs;
1827 irelaend = irela + section->reloc_count;
1828 for (; irela < irelaend; irela++)
1829 {
1830 unsigned int r_type, r_indx;
1831 enum elf32_nios2_stub_type stub_type;
1832 struct elf32_nios2_stub_hash_entry *hsh;
1833 asection *sym_sec;
1834 bfd_vma sym_value;
1835 bfd_vma destination;
1836 struct elf32_nios2_link_hash_entry *hh;
1837 char *stub_name;
1838 const asection *id_sec;
1839
1840 r_type = ELF32_R_TYPE (irela->r_info);
1841 r_indx = ELF32_R_SYM (irela->r_info);
1842
1843 if (r_type >= (unsigned int) R_NIOS2_ILLEGAL)
1844 {
1845 bfd_set_error (bfd_error_bad_value);
1846 error_ret_free_internal:
1847 if (elf_section_data (section)->relocs == NULL)
1848 free (internal_relocs);
1849 goto error_ret_free_local;
1850 }
1851
1852 /* Only look for stubs on CALL and JMPI instructions. */
1853 if (r_type != (unsigned int) R_NIOS2_CALL26)
1854 continue;
1855
1856 /* Now determine the call target, its name, value,
1857 section. */
1858 sym_sec = NULL;
1859 sym_value = 0;
1860 destination = 0;
1861 hh = NULL;
1862 if (r_indx < symtab_hdr->sh_info)
1863 {
1864 /* It's a local symbol. */
1865 Elf_Internal_Sym *sym;
1866 Elf_Internal_Shdr *hdr;
1867 unsigned int shndx;
1868
1869 sym = local_syms + r_indx;
1870 if (ELF_ST_TYPE (sym->st_info) != STT_SECTION)
1871 sym_value = sym->st_value;
1872 shndx = sym->st_shndx;
1873 if (shndx < elf_numsections (input_bfd))
1874 {
1875 hdr = elf_elfsections (input_bfd)[shndx];
1876 sym_sec = hdr->bfd_section;
1877 destination = (sym_value + irela->r_addend
1878 + sym_sec->output_offset
1879 + sym_sec->output_section->vma);
1880 }
1881 }
1882 else
1883 {
1884 /* It's an external symbol. */
1885 int e_indx;
1886
1887 e_indx = r_indx - symtab_hdr->sh_info;
1888 hh = ((struct elf32_nios2_link_hash_entry *)
1889 elf_sym_hashes (input_bfd)[e_indx]);
1890
1891 while (hh->root.root.type == bfd_link_hash_indirect
1892 || hh->root.root.type == bfd_link_hash_warning)
1893 hh = ((struct elf32_nios2_link_hash_entry *)
1894 hh->root.root.u.i.link);
1895
1896 if (hh->root.root.type == bfd_link_hash_defined
1897 || hh->root.root.type == bfd_link_hash_defweak)
1898 {
1899 sym_sec = hh->root.root.u.def.section;
1900 sym_value = hh->root.root.u.def.value;
1901
1902 if (sym_sec->output_section != NULL)
1903 destination = (sym_value + irela->r_addend
1904 + sym_sec->output_offset
1905 + sym_sec->output_section->vma);
1906 else
1907 continue;
1908 }
1909 else if (hh->root.root.type == bfd_link_hash_undefweak)
1910 {
1911 if (! info->shared)
1912 continue;
1913 }
1914 else if (hh->root.root.type == bfd_link_hash_undefined)
1915 {
1916 if (! (info->unresolved_syms_in_objects == RM_IGNORE
1917 && (ELF_ST_VISIBILITY (hh->root.other)
1918 == STV_DEFAULT)))
1919 continue;
1920 }
1921 else
1922 {
1923 bfd_set_error (bfd_error_bad_value);
1924 goto error_ret_free_internal;
1925 }
1926 }
1927
1928 /* Determine what (if any) linker stub is needed. */
1929 stub_type = nios2_type_of_stub (section, irela, hh, htab,
1930 destination, info);
1931 if (stub_type == nios2_stub_none)
1932 continue;
1933
1934 /* Support for grouping stub sections. */
1935 if (stub_type == nios2_stub_call26_before)
1936 id_sec = htab->stub_group[section->id].first_sec;
1937 else
1938 id_sec = htab->stub_group[section->id].last_sec;
1939
1940 /* Get the name of this stub. */
1941 stub_name = nios2_stub_name (id_sec, sym_sec, hh, irela,
1942 stub_type);
1943 if (!stub_name)
1944 goto error_ret_free_internal;
1945
1946 hsh = nios2_stub_hash_lookup (&htab->bstab,
1947 stub_name,
1948 FALSE, FALSE);
1949 if (hsh != NULL)
1950 {
1951 /* The proper stub has already been created. */
1952 free (stub_name);
1953 continue;
1954 }
1955
1956 hsh = nios2_add_stub (stub_name, section, htab, stub_type);
1957 if (hsh == NULL)
1958 {
1959 free (stub_name);
1960 goto error_ret_free_internal;
1961 }
1962 hsh->target_value = sym_value;
1963 hsh->target_section = sym_sec;
1964 hsh->stub_type = stub_type;
1965 hsh->hh = hh;
1966 hsh->addend = irela->r_addend;
1967 stub_changed = TRUE;
1968 }
1969
1970 /* We're done with the internal relocs, free them. */
1971 if (elf_section_data (section)->relocs == NULL)
1972 free (internal_relocs);
1973 }
1974 }
1975
1976 if (!stub_changed)
1977 break;
1978
1979 /* OK, we've added some stubs. Find out the new size of the
1980 stub sections. */
1981 for (stub_sec = htab->stub_bfd->sections;
1982 stub_sec != NULL;
1983 stub_sec = stub_sec->next)
1984 stub_sec->size = 0;
1985
1986 bfd_hash_traverse (&htab->bstab, nios2_size_one_stub, htab);
1987
1988 /* Ask the linker to do its stuff. */
1989 (*htab->layout_sections_again) ();
1990 stub_changed = FALSE;
1991 }
1992
1993 free (htab->all_local_syms);
1994 return TRUE;
1995
1996 error_ret_free_local:
1997 free (htab->all_local_syms);
1998 return FALSE;
1999 }
2000
2001 /* Build all the stubs associated with the current output file. The
2002 stubs are kept in a hash table attached to the main linker hash
2003 table. This function is called via nios2elf_finish in the linker. */
2004 bfd_boolean
2005 nios2_elf32_build_stubs (struct bfd_link_info *info)
2006 {
2007 asection *stub_sec;
2008 struct bfd_hash_table *table;
2009 struct elf32_nios2_link_hash_table *htab;
2010
2011 htab = elf32_nios2_hash_table (info);
2012
2013 for (stub_sec = htab->stub_bfd->sections;
2014 stub_sec != NULL;
2015 stub_sec = stub_sec->next)
2016 {
2017 bfd_size_type size;
2018
2019 /* Allocate memory to hold the linker stubs. */
2020 size = stub_sec->size;
2021 stub_sec->contents = bfd_zalloc (htab->stub_bfd, size);
2022 if (stub_sec->contents == NULL && size != 0)
2023 return FALSE;
2024 stub_sec->size = 0;
2025 }
2026
2027 /* Build the stubs as directed by the stub hash table. */
2028 table = &htab->bstab;
2029 bfd_hash_traverse (table, nios2_build_one_stub, info);
2030
2031 return TRUE;
2032 }
2033
2034
2035 /* Implement bfd_elf32_bfd_reloc_type_lookup:
2036 Given a BFD reloc type, return a howto structure. */
2037 static reloc_howto_type *
2038 nios2_elf32_bfd_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
2039 bfd_reloc_code_real_type code)
2040 {
2041 int i;
2042 for (i = 0;
2043 i < (int) (sizeof (nios2_reloc_map) / sizeof (struct elf_reloc_map));
2044 ++i)
2045 if (nios2_reloc_map[i].bfd_val == code)
2046 return &elf_nios2_howto_table_rel[(int) nios2_reloc_map[i].elf_val];
2047 return NULL;
2048 }
2049
2050 /* Implement bfd_elf32_bfd_reloc_name_lookup:
2051 Given a reloc name, return a howto structure. */
2052 static reloc_howto_type *
2053 nios2_elf32_bfd_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
2054 const char *r_name)
2055 {
2056 unsigned int i;
2057 for (i = 0;
2058 i < (sizeof (elf_nios2_howto_table_rel)
2059 / sizeof (elf_nios2_howto_table_rel[0]));
2060 i++)
2061 if (elf_nios2_howto_table_rel[i].name
2062 && strcasecmp (elf_nios2_howto_table_rel[i].name, r_name) == 0)
2063 return &elf_nios2_howto_table_rel[i];
2064
2065 return NULL;
2066 }
2067
2068 /* Implement elf_info_to_howto:
2069 Given a ELF32 relocation, fill in a arelent structure. */
2070 static void
2071 nios2_elf32_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED, arelent *cache_ptr,
2072 Elf_Internal_Rela *dst)
2073 {
2074 unsigned int r_type;
2075
2076 r_type = ELF32_R_TYPE (dst->r_info);
2077 BFD_ASSERT (r_type < R_NIOS2_ILLEGAL);
2078 cache_ptr->howto = &elf_nios2_howto_table_rel[r_type];
2079 }
2080
2081 /* Return the base VMA address which should be subtracted from real addresses
2082 when resolving @dtpoff relocation.
2083 This is PT_TLS segment p_vaddr. */
2084 static bfd_vma
2085 dtpoff_base (struct bfd_link_info *info)
2086 {
2087 /* If tls_sec is NULL, we should have signalled an error already. */
2088 if (elf_hash_table (info)->tls_sec == NULL)
2089 return 0;
2090 return elf_hash_table (info)->tls_sec->vma;
2091 }
2092
2093 /* Return the relocation value for @tpoff relocation
2094 if STT_TLS virtual address is ADDRESS. */
2095 static bfd_vma
2096 tpoff (struct bfd_link_info *info, bfd_vma address)
2097 {
2098 struct elf_link_hash_table *htab = elf_hash_table (info);
2099
2100 /* If tls_sec is NULL, we should have signalled an error already. */
2101 if (htab->tls_sec == NULL)
2102 return 0;
2103 return address - htab->tls_sec->vma;
2104 }
2105
2106 /* Set the GP value for OUTPUT_BFD. Returns FALSE if this is a
2107 dangerous relocation. */
2108 static bfd_boolean
2109 nios2_elf_assign_gp (bfd *output_bfd, bfd_vma *pgp, struct bfd_link_info *info)
2110 {
2111
2112 bfd_boolean gp_found;
2113 struct bfd_hash_entry *h;
2114 struct bfd_link_hash_entry *lh;
2115
2116 /* If we've already figured out what GP will be, just return it. */
2117 *pgp = _bfd_get_gp_value (output_bfd);
2118 if (*pgp)
2119 return TRUE;
2120
2121 h = bfd_hash_lookup (&info->hash->table, "_gp", FALSE, FALSE);
2122 lh = (struct bfd_link_hash_entry *) h;
2123 lookup:
2124 if (lh)
2125 {
2126 switch (lh->type)
2127 {
2128 case bfd_link_hash_undefined:
2129 case bfd_link_hash_undefweak:
2130 case bfd_link_hash_common:
2131 gp_found = FALSE;
2132 break;
2133 case bfd_link_hash_defined:
2134 case bfd_link_hash_defweak:
2135 gp_found = TRUE;
2136 *pgp = lh->u.def.value;
2137 break;
2138 case bfd_link_hash_indirect:
2139 case bfd_link_hash_warning:
2140 lh = lh->u.i.link;
2141 /* @@FIXME ignoring warning for now */
2142 goto lookup;
2143 case bfd_link_hash_new:
2144 default:
2145 abort ();
2146 }
2147 }
2148 else
2149 gp_found = FALSE;
2150
2151 if (!gp_found)
2152 {
2153 /* Only get the error once. */
2154 *pgp = 4;
2155 _bfd_set_gp_value (output_bfd, *pgp);
2156 return FALSE;
2157 }
2158
2159 _bfd_set_gp_value (output_bfd, *pgp);
2160
2161 return TRUE;
2162 }
2163
2164 /* Retrieve the previously cached _gp pointer, returning bfd_reloc_dangerous
2165 if it's not available as we don't have a link_info pointer available here
2166 to look it up in the output symbol table. We don't need to adjust the
2167 symbol value for an external symbol if we are producing relocatable
2168 output. */
2169 static bfd_reloc_status_type
2170 nios2_elf_final_gp (bfd *output_bfd, asymbol *symbol, bfd_boolean relocatable,
2171 char **error_message, bfd_vma *pgp)
2172 {
2173 if (bfd_is_und_section (symbol->section) && !relocatable)
2174 {
2175 *pgp = 0;
2176 return bfd_reloc_undefined;
2177 }
2178
2179 *pgp = _bfd_get_gp_value (output_bfd);
2180 if (*pgp == 0 && (!relocatable || (symbol->flags & BSF_SECTION_SYM) != 0))
2181 {
2182 if (relocatable)
2183 {
2184 /* Make up a value. */
2185 *pgp = symbol->section->output_section->vma + 0x4000;
2186 _bfd_set_gp_value (output_bfd, *pgp);
2187 }
2188 else
2189 {
2190 *error_message
2191 = (char *) _("global pointer relative relocation when _gp not defined");
2192 return bfd_reloc_dangerous;
2193 }
2194 }
2195
2196 return bfd_reloc_ok;
2197 }
2198
2199 /* Do the relocations that require special handling. */
2200 static bfd_reloc_status_type
2201 nios2_elf32_do_hi16_relocate (bfd *abfd, reloc_howto_type *howto,
2202 asection *input_section,
2203 bfd_byte *data, bfd_vma offset,
2204 bfd_vma symbol_value, bfd_vma addend)
2205 {
2206 symbol_value = symbol_value + addend;
2207 addend = 0;
2208 symbol_value = (symbol_value >> 16) & 0xffff;
2209 return _bfd_final_link_relocate (howto, abfd, input_section,
2210 data, offset, symbol_value, addend);
2211 }
2212
2213 static bfd_reloc_status_type
2214 nios2_elf32_do_lo16_relocate (bfd *abfd, reloc_howto_type *howto,
2215 asection *input_section,
2216 bfd_byte *data, bfd_vma offset,
2217 bfd_vma symbol_value, bfd_vma addend)
2218 {
2219 symbol_value = symbol_value + addend;
2220 addend = 0;
2221 symbol_value = symbol_value & 0xffff;
2222 return _bfd_final_link_relocate (howto, abfd, input_section,
2223 data, offset, symbol_value, addend);
2224 }
2225
2226 static bfd_reloc_status_type
2227 nios2_elf32_do_hiadj16_relocate (bfd *abfd, reloc_howto_type *howto,
2228 asection *input_section,
2229 bfd_byte *data, bfd_vma offset,
2230 bfd_vma symbol_value, bfd_vma addend)
2231 {
2232 symbol_value = symbol_value + addend;
2233 addend = 0;
2234 symbol_value = hiadj(symbol_value);
2235 return _bfd_final_link_relocate (howto, abfd, input_section, data, offset,
2236 symbol_value, addend);
2237 }
2238
2239 static bfd_reloc_status_type
2240 nios2_elf32_do_pcrel_lo16_relocate (bfd *abfd, reloc_howto_type *howto,
2241 asection *input_section,
2242 bfd_byte *data, bfd_vma offset,
2243 bfd_vma symbol_value, bfd_vma addend)
2244 {
2245 symbol_value = symbol_value + addend;
2246 addend = 0;
2247 symbol_value = symbol_value & 0xffff;
2248 return _bfd_final_link_relocate (howto, abfd, input_section,
2249 data, offset, symbol_value, addend);
2250 }
2251
2252 static bfd_reloc_status_type
2253 nios2_elf32_do_pcrel_hiadj16_relocate (bfd *abfd, reloc_howto_type *howto,
2254 asection *input_section,
2255 bfd_byte *data, bfd_vma offset,
2256 bfd_vma symbol_value, bfd_vma addend)
2257 {
2258 symbol_value = symbol_value + addend;
2259 symbol_value -= (input_section->output_section->vma
2260 + input_section->output_offset);
2261 symbol_value -= offset;
2262 addend = 0;
2263 symbol_value = hiadj(symbol_value);
2264 return _bfd_final_link_relocate (howto, abfd, input_section, data, offset,
2265 symbol_value, addend);
2266 }
2267
2268 static bfd_reloc_status_type
2269 nios2_elf32_do_pcrel16_relocate (bfd *abfd, reloc_howto_type *howto,
2270 asection *input_section,
2271 bfd_byte *data, bfd_vma offset,
2272 bfd_vma symbol_value, bfd_vma addend)
2273 {
2274 /* NIOS2 pc relative relocations are relative to the next 32-bit instruction
2275 so we need to subtract 4 before doing a final_link_relocate. */
2276 symbol_value = symbol_value + addend - 4;
2277 addend = 0;
2278 return _bfd_final_link_relocate (howto, abfd, input_section,
2279 data, offset, symbol_value, addend);
2280 }
2281
2282 static bfd_reloc_status_type
2283 nios2_elf32_do_call26_relocate (bfd *abfd, reloc_howto_type *howto,
2284 asection *input_section,
2285 bfd_byte *data, bfd_vma offset,
2286 bfd_vma symbol_value, bfd_vma addend)
2287 {
2288 /* Check that the relocation is in the same page as the current address. */
2289 if (CALL26_SEGMENT (symbol_value + addend)
2290 != CALL26_SEGMENT (input_section->output_section->vma
2291 + input_section->output_offset
2292 + offset))
2293 return bfd_reloc_overflow;
2294
2295 return _bfd_final_link_relocate (howto, abfd, input_section,
2296 data, offset, symbol_value, addend);
2297 }
2298
2299 static bfd_reloc_status_type
2300 nios2_elf32_do_gprel_relocate (bfd *abfd, reloc_howto_type *howto,
2301 asection *input_section,
2302 bfd_byte *data, bfd_vma offset,
2303 bfd_vma symbol_value, bfd_vma addend)
2304 {
2305 /* Because we need the output_bfd, the special handling is done
2306 in nios2_elf32_relocate_section or in nios2_elf32_gprel_relocate. */
2307 return _bfd_final_link_relocate (howto, abfd, input_section,
2308 data, offset, symbol_value, addend);
2309 }
2310
2311 static bfd_reloc_status_type
2312 nios2_elf32_do_ujmp_relocate (bfd *abfd, reloc_howto_type *howto,
2313 asection *input_section,
2314 bfd_byte *data, bfd_vma offset,
2315 bfd_vma symbol_value, bfd_vma addend)
2316 {
2317 bfd_vma symbol_lo16, symbol_hi16;
2318 bfd_reloc_status_type r;
2319 symbol_value = symbol_value + addend;
2320 addend = 0;
2321 symbol_hi16 = (symbol_value >> 16) & 0xffff;
2322 symbol_lo16 = symbol_value & 0xffff;
2323
2324 r = _bfd_final_link_relocate (howto, abfd, input_section,
2325 data, offset, symbol_hi16, addend);
2326
2327 if (r == bfd_reloc_ok)
2328 return _bfd_final_link_relocate (howto, abfd, input_section,
2329 data, offset + 4, symbol_lo16, addend);
2330
2331 return r;
2332 }
2333
2334 static bfd_reloc_status_type
2335 nios2_elf32_do_cjmp_relocate (bfd *abfd, reloc_howto_type *howto,
2336 asection *input_section,
2337 bfd_byte *data, bfd_vma offset,
2338 bfd_vma symbol_value, bfd_vma addend)
2339 {
2340 bfd_vma symbol_lo16, symbol_hi16;
2341 bfd_reloc_status_type r;
2342 symbol_value = symbol_value + addend;
2343 addend = 0;
2344 symbol_hi16 = (symbol_value >> 16) & 0xffff;
2345 symbol_lo16 = symbol_value & 0xffff;
2346
2347 r = _bfd_final_link_relocate (howto, abfd, input_section,
2348 data, offset, symbol_hi16, addend);
2349
2350 if (r == bfd_reloc_ok)
2351 return _bfd_final_link_relocate (howto, abfd, input_section,
2352 data, offset + 4, symbol_lo16, addend);
2353
2354 return r;
2355 }
2356
2357 static bfd_reloc_status_type
2358 nios2_elf32_do_callr_relocate (bfd *abfd, reloc_howto_type *howto,
2359 asection *input_section,
2360 bfd_byte *data, bfd_vma offset,
2361 bfd_vma symbol_value, bfd_vma addend)
2362 {
2363 bfd_vma symbol_lo16, symbol_hi16;
2364 bfd_reloc_status_type r;
2365 symbol_value = symbol_value + addend;
2366 addend = 0;
2367 symbol_hi16 = (symbol_value >> 16) & 0xffff;
2368 symbol_lo16 = symbol_value & 0xffff;
2369
2370 r = _bfd_final_link_relocate (howto, abfd, input_section,
2371 data, offset, symbol_hi16, addend);
2372
2373 if (r == bfd_reloc_ok)
2374 return _bfd_final_link_relocate (howto, abfd, input_section,
2375 data, offset + 4, symbol_lo16, addend);
2376
2377 return r;
2378 }
2379
2380 /* HOWTO handlers for relocations that require special handling. */
2381
2382 /* This is for relocations used only when relaxing to ensure
2383 changes in size of section don't screw up .align. */
2384 static bfd_reloc_status_type
2385 nios2_elf32_ignore_reloc (bfd *abfd ATTRIBUTE_UNUSED, arelent *reloc_entry,
2386 asymbol *symbol ATTRIBUTE_UNUSED,
2387 void *data ATTRIBUTE_UNUSED, asection *input_section,
2388 bfd *output_bfd,
2389 char **error_message ATTRIBUTE_UNUSED)
2390 {
2391 if (output_bfd != NULL)
2392 reloc_entry->address += input_section->output_offset;
2393 return bfd_reloc_ok;
2394 }
2395
2396 static bfd_reloc_status_type
2397 nios2_elf32_hi16_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2398 void *data, asection *input_section,
2399 bfd *output_bfd,
2400 char **error_message ATTRIBUTE_UNUSED)
2401 {
2402 /* This part is from bfd_elf_generic_reloc. */
2403 if (output_bfd != NULL
2404 && (symbol->flags & BSF_SECTION_SYM) == 0
2405 && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
2406 {
2407 reloc_entry->address += input_section->output_offset;
2408 return bfd_reloc_ok;
2409 }
2410
2411 if (output_bfd != NULL)
2412 /* FIXME: See bfd_perform_relocation. Is this right? */
2413 return bfd_reloc_continue;
2414
2415 return nios2_elf32_do_hi16_relocate (abfd, reloc_entry->howto,
2416 input_section,
2417 data, reloc_entry->address,
2418 (symbol->value
2419 + symbol->section->output_section->vma
2420 + symbol->section->output_offset),
2421 reloc_entry->addend);
2422 }
2423
2424 static bfd_reloc_status_type
2425 nios2_elf32_lo16_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2426 void *data, asection *input_section,
2427 bfd *output_bfd,
2428 char **error_message ATTRIBUTE_UNUSED)
2429 {
2430 /* This part is from bfd_elf_generic_reloc. */
2431 if (output_bfd != NULL
2432 && (symbol->flags & BSF_SECTION_SYM) == 0
2433 && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
2434 {
2435 reloc_entry->address += input_section->output_offset;
2436 return bfd_reloc_ok;
2437 }
2438
2439 if (output_bfd != NULL)
2440 /* FIXME: See bfd_perform_relocation. Is this right? */
2441 return bfd_reloc_continue;
2442
2443 return nios2_elf32_do_lo16_relocate (abfd, reloc_entry->howto,
2444 input_section,
2445 data, reloc_entry->address,
2446 (symbol->value
2447 + symbol->section->output_section->vma
2448 + symbol->section->output_offset),
2449 reloc_entry->addend);
2450 }
2451
2452 static bfd_reloc_status_type
2453 nios2_elf32_hiadj16_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2454 void *data, asection *input_section,
2455 bfd *output_bfd,
2456 char **error_message ATTRIBUTE_UNUSED)
2457 {
2458 /* This part is from bfd_elf_generic_reloc. */
2459 if (output_bfd != NULL
2460 && (symbol->flags & BSF_SECTION_SYM) == 0
2461 && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
2462 {
2463 reloc_entry->address += input_section->output_offset;
2464 return bfd_reloc_ok;
2465 }
2466
2467 if (output_bfd != NULL)
2468 /* FIXME: See bfd_perform_relocation. Is this right? */
2469 return bfd_reloc_continue;
2470
2471 return nios2_elf32_do_hiadj16_relocate (abfd, reloc_entry->howto,
2472 input_section,
2473 data, reloc_entry->address,
2474 (symbol->value
2475 + symbol->section->output_section->vma
2476 + symbol->section->output_offset),
2477 reloc_entry->addend);
2478 }
2479
2480 static bfd_reloc_status_type
2481 nios2_elf32_pcrel_lo16_relocate (bfd *abfd, arelent *reloc_entry,
2482 asymbol *symbol, void *data,
2483 asection *input_section, bfd *output_bfd,
2484 char **error_message ATTRIBUTE_UNUSED)
2485 {
2486 /* This part is from bfd_elf_generic_reloc. */
2487 if (output_bfd != NULL
2488 && (symbol->flags & BSF_SECTION_SYM) == 0
2489 && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
2490 {
2491 reloc_entry->address += input_section->output_offset;
2492 return bfd_reloc_ok;
2493 }
2494
2495 if (output_bfd != NULL)
2496 /* FIXME: See bfd_perform_relocation. Is this right? */
2497 return bfd_reloc_continue;
2498
2499 return nios2_elf32_do_pcrel_lo16_relocate (
2500 abfd, reloc_entry->howto, input_section, data, reloc_entry->address,
2501 (symbol->value + symbol->section->output_section->vma
2502 + symbol->section->output_offset),
2503 reloc_entry->addend);
2504 }
2505
2506 static bfd_reloc_status_type
2507 nios2_elf32_pcrel_hiadj16_relocate (bfd *abfd, arelent *reloc_entry,
2508 asymbol *symbol, void *data,
2509 asection *input_section, bfd *output_bfd,
2510 char **error_message ATTRIBUTE_UNUSED)
2511 {
2512 /* This part is from bfd_elf_generic_reloc. */
2513 if (output_bfd != NULL
2514 && (symbol->flags & BSF_SECTION_SYM) == 0
2515 && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
2516 {
2517 reloc_entry->address += input_section->output_offset;
2518 return bfd_reloc_ok;
2519 }
2520
2521 if (output_bfd != NULL)
2522 /* FIXME: See bfd_perform_relocation. Is this right? */
2523 return bfd_reloc_continue;
2524
2525 return nios2_elf32_do_pcrel_hiadj16_relocate (
2526 abfd, reloc_entry->howto, input_section, data, reloc_entry->address,
2527 (symbol->value + symbol->section->output_section->vma
2528 + symbol->section->output_offset),
2529 reloc_entry->addend);
2530 }
2531
2532 static bfd_reloc_status_type
2533 nios2_elf32_pcrel16_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2534 void *data, asection *input_section,
2535 bfd *output_bfd,
2536 char **error_message ATTRIBUTE_UNUSED)
2537 {
2538 /* This part is from bfd_elf_generic_reloc. */
2539 if (output_bfd != NULL
2540 && (symbol->flags & BSF_SECTION_SYM) == 0
2541 && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
2542 {
2543 reloc_entry->address += input_section->output_offset;
2544 return bfd_reloc_ok;
2545 }
2546
2547 if (output_bfd != NULL)
2548 /* FIXME: See bfd_perform_relocation. Is this right? */
2549 return bfd_reloc_continue;
2550
2551 return nios2_elf32_do_pcrel16_relocate (abfd, reloc_entry->howto,
2552 input_section,
2553 data, reloc_entry->address,
2554 (symbol->value
2555 + symbol->section->output_section->vma
2556 + symbol->section->output_offset),
2557 reloc_entry->addend);
2558 }
2559
2560 static bfd_reloc_status_type
2561 nios2_elf32_call26_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2562 void *data, asection *input_section,
2563 bfd *output_bfd,
2564 char **error_message ATTRIBUTE_UNUSED)
2565 {
2566 /* This part is from bfd_elf_generic_reloc. */
2567 if (output_bfd != NULL
2568 && (symbol->flags & BSF_SECTION_SYM) == 0
2569 && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
2570 {
2571 reloc_entry->address += input_section->output_offset;
2572 return bfd_reloc_ok;
2573 }
2574
2575 if (output_bfd != NULL)
2576 /* FIXME: See bfd_perform_relocation. Is this right? */
2577 return bfd_reloc_continue;
2578
2579 return nios2_elf32_do_call26_relocate (abfd, reloc_entry->howto,
2580 input_section,
2581 data, reloc_entry->address,
2582 (symbol->value
2583 + symbol->section->output_section->vma
2584 + symbol->section->output_offset),
2585 reloc_entry->addend);
2586 }
2587
2588 static bfd_reloc_status_type
2589 nios2_elf32_gprel_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2590 void *data, asection *input_section,
2591 bfd *output_bfd, char **msg)
2592 {
2593 bfd_vma relocation;
2594 bfd_vma gp;
2595 bfd_reloc_status_type r;
2596
2597
2598 /* This part is from bfd_elf_generic_reloc. */
2599 if (output_bfd != NULL
2600 && (symbol->flags & BSF_SECTION_SYM) == 0
2601 && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
2602 {
2603 reloc_entry->address += input_section->output_offset;
2604 return bfd_reloc_ok;
2605 }
2606
2607 if (output_bfd != NULL)
2608 /* FIXME: See bfd_perform_relocation. Is this right? */
2609 return bfd_reloc_continue;
2610
2611 relocation = (symbol->value
2612 + symbol->section->output_section->vma
2613 + symbol->section->output_offset);
2614
2615 /* This assumes we've already cached the _gp symbol. */
2616 r = nios2_elf_final_gp (abfd, symbol, FALSE, msg, &gp);
2617 if (r == bfd_reloc_ok)
2618 {
2619 relocation = relocation + reloc_entry->addend - gp;
2620 reloc_entry->addend = 0;
2621 if ((signed) relocation < -32768 || (signed) relocation > 32767)
2622 {
2623 *msg = _("global pointer relative address out of range");
2624 r = bfd_reloc_outofrange;
2625 }
2626 else
2627 r = nios2_elf32_do_gprel_relocate (abfd, reloc_entry->howto,
2628 input_section,
2629 data, reloc_entry->address,
2630 relocation, reloc_entry->addend);
2631 }
2632
2633 return r;
2634 }
2635
2636 static bfd_reloc_status_type
2637 nios2_elf32_ujmp_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2638 void *data, asection *input_section,
2639 bfd *output_bfd, char **msg ATTRIBUTE_UNUSED)
2640 {
2641 /* This part is from bfd_elf_generic_reloc. */
2642 if (output_bfd != NULL
2643 && (symbol->flags & BSF_SECTION_SYM) == 0
2644 && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
2645 {
2646 reloc_entry->address += input_section->output_offset;
2647 return bfd_reloc_ok;
2648 }
2649
2650 if (output_bfd != NULL)
2651 /* FIXME: See bfd_perform_relocation. Is this right? */
2652 return bfd_reloc_continue;
2653
2654 return nios2_elf32_do_ujmp_relocate (abfd, reloc_entry->howto,
2655 input_section,
2656 data, reloc_entry->address,
2657 (symbol->value
2658 + symbol->section->output_section->vma
2659 + symbol->section->output_offset),
2660 reloc_entry->addend);
2661 }
2662
2663 static bfd_reloc_status_type
2664 nios2_elf32_cjmp_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2665 void *data, asection *input_section,
2666 bfd *output_bfd, char **msg ATTRIBUTE_UNUSED)
2667 {
2668 /* This part is from bfd_elf_generic_reloc. */
2669 if (output_bfd != NULL
2670 && (symbol->flags & BSF_SECTION_SYM) == 0
2671 && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
2672 {
2673 reloc_entry->address += input_section->output_offset;
2674 return bfd_reloc_ok;
2675 }
2676
2677 if (output_bfd != NULL)
2678 /* FIXME: See bfd_perform_relocation. Is this right? */
2679 return bfd_reloc_continue;
2680
2681 return nios2_elf32_do_cjmp_relocate (abfd, reloc_entry->howto,
2682 input_section,
2683 data, reloc_entry->address,
2684 (symbol->value
2685 + symbol->section->output_section->vma
2686 + symbol->section->output_offset),
2687 reloc_entry->addend);
2688 }
2689
2690 static bfd_reloc_status_type
2691 nios2_elf32_callr_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2692 void *data, asection *input_section,
2693 bfd *output_bfd, char **msg ATTRIBUTE_UNUSED)
2694 {
2695 /* This part is from bfd_elf_generic_reloc. */
2696 if (output_bfd != NULL
2697 && (symbol->flags & BSF_SECTION_SYM) == 0
2698 && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
2699 {
2700 reloc_entry->address += input_section->output_offset;
2701 return bfd_reloc_ok;
2702 }
2703
2704 if (output_bfd != NULL)
2705 /* FIXME: See bfd_perform_relocation. Is this right? */
2706 return bfd_reloc_continue;
2707
2708 return nios2_elf32_do_callr_relocate (abfd, reloc_entry->howto,
2709 input_section,
2710 data, reloc_entry->address,
2711 (symbol->value
2712 + symbol->section->output_section->vma
2713 + symbol->section->output_offset),
2714 reloc_entry->addend);
2715 }
2716
2717
2718 /* Implement elf_backend_relocate_section. */
2719 static bfd_boolean
2720 nios2_elf32_relocate_section (bfd *output_bfd,
2721 struct bfd_link_info *info,
2722 bfd *input_bfd,
2723 asection *input_section,
2724 bfd_byte *contents,
2725 Elf_Internal_Rela *relocs,
2726 Elf_Internal_Sym *local_syms,
2727 asection **local_sections)
2728 {
2729 Elf_Internal_Shdr *symtab_hdr;
2730 struct elf_link_hash_entry **sym_hashes;
2731 Elf_Internal_Rela *rel;
2732 Elf_Internal_Rela *relend;
2733 struct elf32_nios2_link_hash_table *htab;
2734 asection *sgot;
2735 asection *splt;
2736 asection *sreloc = NULL;
2737 bfd_vma *local_got_offsets;
2738 bfd_vma got_base;
2739
2740 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
2741 sym_hashes = elf_sym_hashes (input_bfd);
2742 relend = relocs + input_section->reloc_count;
2743
2744 htab = elf32_nios2_hash_table (info);
2745 sgot = htab->root.sgot;
2746 splt = htab->root.splt;
2747 local_got_offsets = elf_local_got_offsets (input_bfd);
2748
2749 if (elf32_nios2_hash_table (info)->h_gp_got == NULL)
2750 got_base = 0;
2751 else
2752 got_base = elf32_nios2_hash_table (info)->h_gp_got->root.u.def.value;
2753
2754 for (rel = relocs; rel < relend; rel++)
2755 {
2756 reloc_howto_type *howto;
2757 unsigned long r_symndx;
2758 Elf_Internal_Sym *sym;
2759 asection *sec;
2760 struct elf_link_hash_entry *h;
2761 struct elf32_nios2_link_hash_entry *eh;
2762 bfd_vma relocation;
2763 bfd_vma gp;
2764 bfd_vma reloc_address;
2765 bfd_reloc_status_type r = bfd_reloc_ok;
2766 const char *name = NULL;
2767 int r_type;
2768 const char *format;
2769 char msgbuf[256];
2770 const char* msg = (const char*) NULL;
2771 bfd_boolean unresolved_reloc;
2772 bfd_vma off;
2773 int use_plt;
2774
2775 r_type = ELF32_R_TYPE (rel->r_info);
2776 r_symndx = ELF32_R_SYM (rel->r_info);
2777
2778 howto = lookup_howto ((unsigned) ELF32_R_TYPE (rel->r_info));
2779 h = NULL;
2780 sym = NULL;
2781 sec = NULL;
2782
2783 if (r_symndx < symtab_hdr->sh_info)
2784 {
2785 sym = local_syms + r_symndx;
2786 sec = local_sections[r_symndx];
2787 relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
2788 }
2789 else
2790 {
2791 bfd_boolean warned, ignored;
2792
2793 RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
2794 r_symndx, symtab_hdr, sym_hashes,
2795 h, sec, relocation,
2796 unresolved_reloc, warned, ignored);
2797 }
2798
2799 if (sec && discarded_section (sec))
2800 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
2801 rel, 1, relend, howto, 0, contents);
2802
2803 /* Nothing more to do unless this is a final link. */
2804 if (info->relocatable)
2805 continue;
2806
2807 if (sec && sec->output_section)
2808 reloc_address = (sec->output_section->vma + sec->output_offset
2809 + rel->r_offset);
2810 else
2811 reloc_address = 0;
2812
2813 if (howto)
2814 {
2815 switch (howto->type)
2816 {
2817 case R_NIOS2_HI16:
2818 r = nios2_elf32_do_hi16_relocate (input_bfd, howto,
2819 input_section,
2820 contents, rel->r_offset,
2821 relocation, rel->r_addend);
2822 break;
2823 case R_NIOS2_LO16:
2824 r = nios2_elf32_do_lo16_relocate (input_bfd, howto,
2825 input_section,
2826 contents, rel->r_offset,
2827 relocation, rel->r_addend);
2828 break;
2829 case R_NIOS2_PCREL_LO:
2830 r = nios2_elf32_do_pcrel_lo16_relocate (input_bfd, howto,
2831 input_section,
2832 contents,
2833 rel->r_offset,
2834 relocation,
2835 rel->r_addend);
2836 break;
2837 case R_NIOS2_HIADJ16:
2838 r = nios2_elf32_do_hiadj16_relocate (input_bfd, howto,
2839 input_section, contents,
2840 rel->r_offset, relocation,
2841 rel->r_addend);
2842 break;
2843 case R_NIOS2_PCREL_HA:
2844 r = nios2_elf32_do_pcrel_hiadj16_relocate (input_bfd, howto,
2845 input_section,
2846 contents,
2847 rel->r_offset,
2848 relocation,
2849 rel->r_addend);
2850 break;
2851 case R_NIOS2_PCREL16:
2852 r = nios2_elf32_do_pcrel16_relocate (input_bfd, howto,
2853 input_section, contents,
2854 rel->r_offset, relocation,
2855 rel->r_addend);
2856 break;
2857 case R_NIOS2_GPREL:
2858 /* Turns an absolute address into a gp-relative address. */
2859 if (!nios2_elf_assign_gp (output_bfd, &gp, info))
2860 {
2861 format = _("global pointer relative relocation at address "
2862 "0x%08x when _gp not defined\n");
2863 sprintf (msgbuf, format, reloc_address);
2864 msg = msgbuf;
2865 r = bfd_reloc_dangerous;
2866 }
2867 else
2868 {
2869 bfd_vma symbol_address = rel->r_addend + relocation;
2870 relocation = relocation + rel->r_addend - gp;
2871 rel->r_addend = 0;
2872 if (((signed) relocation < -32768
2873 || (signed) relocation > 32767)
2874 && (!h
2875 || h->root.type == bfd_link_hash_defined
2876 || h->root.type == bfd_link_hash_defweak))
2877 {
2878 format = _("Unable to reach %s (at 0x%08x) from the "
2879 "global pointer (at 0x%08x) because the "
2880 "offset (%d) is out of the allowed range, "
2881 "-32678 to 32767.\n" );
2882 sprintf (msgbuf, format, name, symbol_address, gp,
2883 (signed)relocation);
2884 msg = msgbuf;
2885 r = bfd_reloc_outofrange;
2886 }
2887 else
2888 r = _bfd_final_link_relocate (howto, input_bfd,
2889 input_section, contents,
2890 rel->r_offset, relocation,
2891 rel->r_addend);
2892 }
2893
2894 break;
2895 case R_NIOS2_UJMP:
2896 r = nios2_elf32_do_ujmp_relocate (input_bfd, howto,
2897 input_section,
2898 contents, rel->r_offset,
2899 relocation, rel->r_addend);
2900 break;
2901 case R_NIOS2_CJMP:
2902 r = nios2_elf32_do_cjmp_relocate (input_bfd, howto,
2903 input_section,
2904 contents, rel->r_offset,
2905 relocation, rel->r_addend);
2906 break;
2907 case R_NIOS2_CALLR:
2908 r = nios2_elf32_do_callr_relocate (input_bfd, howto,
2909 input_section, contents,
2910 rel->r_offset, relocation,
2911 rel->r_addend);
2912 break;
2913 case R_NIOS2_CALL26:
2914 case R_NIOS2_CALL26_NOAT:
2915 /* If we have a call to an undefined weak symbol, we just want
2916 to stuff a zero in the bits of the call instruction and
2917 bypass the normal call26 relocation handling, because it'll
2918 diagnose an overflow error if address 0 isn't in the same
2919 256MB segment as the call site. Presumably the call
2920 should be guarded by a null check anyway. */
2921 if (h != NULL && h->root.type == bfd_link_hash_undefweak)
2922 {
2923 BFD_ASSERT (relocation == 0 && rel->r_addend == 0);
2924 r = _bfd_final_link_relocate (howto, input_bfd,
2925 input_section, contents,
2926 rel->r_offset, relocation,
2927 rel->r_addend);
2928 break;
2929 }
2930 /* Handle relocations which should use the PLT entry.
2931 NIOS2_BFD_RELOC_32 relocations will use the symbol's value,
2932 which may point to a PLT entry, but we don't need to handle
2933 that here. If we created a PLT entry, all branches in this
2934 object should go to it. */
2935 if (h != NULL && splt != NULL && h->plt.offset != (bfd_vma) -1)
2936 {
2937 /* If we've created a .plt section, and assigned a PLT entry
2938 to this function, it should not be known to bind locally.
2939 If it were, we would have cleared the PLT entry. */
2940 BFD_ASSERT (!SYMBOL_CALLS_LOCAL (info, h));
2941
2942 relocation = (splt->output_section->vma
2943 + splt->output_offset
2944 + h->plt.offset);
2945
2946 unresolved_reloc = FALSE;
2947 }
2948 /* Detect R_NIOS2_CALL26 relocations that would overflow the
2949 256MB segment. Replace the target with a reference to a
2950 trampoline instead.
2951 Note that htab->stub_group is null if relaxation has been
2952 disabled by the --no-relax linker command-line option, so
2953 we can use that to skip this processing entirely. */
2954 if (howto->type == R_NIOS2_CALL26 && htab->stub_group)
2955 {
2956 bfd_vma dest = relocation + rel->r_addend;
2957 enum elf32_nios2_stub_type stub_type;
2958
2959 eh = (struct elf32_nios2_link_hash_entry *)h;
2960 stub_type = nios2_type_of_stub (input_section, rel, eh,
2961 htab, dest, NULL);
2962
2963 if (stub_type != nios2_stub_none)
2964 {
2965 struct elf32_nios2_stub_hash_entry *hsh;
2966
2967 hsh = nios2_get_stub_entry (input_section, sec,
2968 eh, rel, htab, stub_type);
2969 if (hsh == NULL)
2970 {
2971 r = bfd_reloc_undefined;
2972 break;
2973 }
2974
2975 dest = (hsh->stub_offset
2976 + hsh->stub_sec->output_offset
2977 + hsh->stub_sec->output_section->vma);
2978 r = nios2_elf32_do_call26_relocate (input_bfd, howto,
2979 input_section,
2980 contents,
2981 rel->r_offset,
2982 dest, 0);
2983 break;
2984 }
2985 }
2986
2987 /* Normal case. */
2988 r = nios2_elf32_do_call26_relocate (input_bfd, howto,
2989 input_section, contents,
2990 rel->r_offset, relocation,
2991 rel->r_addend);
2992 break;
2993 case R_NIOS2_ALIGN:
2994 r = bfd_reloc_ok;
2995 /* For symmetry this would be
2996 r = nios2_elf32_do_ignore_reloc (input_bfd, howto,
2997 input_section, contents,
2998 rel->r_offset, relocation,
2999 rel->r_addend);
3000 but do_ignore_reloc would do no more than return
3001 bfd_reloc_ok. */
3002 break;
3003
3004 case R_NIOS2_GOT16:
3005 case R_NIOS2_CALL16:
3006 case R_NIOS2_GOT_LO:
3007 case R_NIOS2_GOT_HA:
3008 case R_NIOS2_CALL_LO:
3009 case R_NIOS2_CALL_HA:
3010 /* Relocation is to the entry for this symbol in the
3011 global offset table. */
3012 if (sgot == NULL)
3013 {
3014 r = bfd_reloc_notsupported;
3015 break;
3016 }
3017
3018 use_plt = 0;
3019
3020 if (h != NULL)
3021 {
3022 bfd_boolean dyn;
3023
3024 eh = (struct elf32_nios2_link_hash_entry *)h;
3025 use_plt = (eh->got_types_used == CALL_USED
3026 && h->plt.offset != (bfd_vma) -1);
3027
3028 off = h->got.offset;
3029 BFD_ASSERT (off != (bfd_vma) -1);
3030 dyn = elf_hash_table (info)->dynamic_sections_created;
3031 if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
3032 || (info->shared
3033 && SYMBOL_REFERENCES_LOCAL (info, h))
3034 || (ELF_ST_VISIBILITY (h->other)
3035 && h->root.type == bfd_link_hash_undefweak))
3036 {
3037 /* This is actually a static link, or it is a -Bsymbolic
3038 link and the symbol is defined locally. We must
3039 initialize this entry in the global offset table.
3040 Since the offset must always be a multiple of 4, we
3041 use the least significant bit to record whether we
3042 have initialized it already.
3043
3044 When doing a dynamic link, we create a .rela.got
3045 relocation entry to initialize the value. This is
3046 done in the finish_dynamic_symbol routine. */
3047 if ((off & 1) != 0)
3048 off &= ~1;
3049 else
3050 {
3051 bfd_put_32 (output_bfd, relocation,
3052 sgot->contents + off);
3053 h->got.offset |= 1;
3054 }
3055 }
3056 else
3057 unresolved_reloc = FALSE;
3058 }
3059 else
3060 {
3061 BFD_ASSERT (local_got_offsets != NULL
3062 && local_got_offsets[r_symndx] != (bfd_vma) -1);
3063
3064 off = local_got_offsets[r_symndx];
3065
3066 /* The offset must always be a multiple of 4. We use the
3067 least significant bit to record whether we have already
3068 generated the necessary reloc. */
3069 if ((off & 1) != 0)
3070 off &= ~1;
3071 else
3072 {
3073 bfd_put_32 (output_bfd, relocation,
3074 sgot->contents + off);
3075
3076 if (info->shared)
3077 {
3078 asection *srelgot;
3079 Elf_Internal_Rela outrel;
3080 bfd_byte *loc;
3081
3082 srelgot = htab->root.srelgot;
3083 BFD_ASSERT (srelgot != NULL);
3084
3085 outrel.r_addend = relocation;
3086 outrel.r_offset = (sgot->output_section->vma
3087 + sgot->output_offset
3088 + off);
3089 outrel.r_info = ELF32_R_INFO (0, R_NIOS2_RELATIVE);
3090 loc = srelgot->contents;
3091 loc += (srelgot->reloc_count++ *
3092 sizeof (Elf32_External_Rela));
3093 bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
3094 }
3095
3096 local_got_offsets[r_symndx] |= 1;
3097 }
3098 }
3099
3100 if (use_plt && info->shared)
3101 {
3102 off = ((h->plt.offset - 24) / 12 + 3) * 4;
3103 relocation = (htab->root.sgotplt->output_offset + off
3104 - got_base);
3105 }
3106 else
3107 relocation = sgot->output_offset + off - got_base;
3108
3109 /* This relocation does not use the addend. */
3110 rel->r_addend = 0;
3111
3112 switch (howto->type)
3113 {
3114 case R_NIOS2_GOT_LO:
3115 case R_NIOS2_CALL_LO:
3116 r = nios2_elf32_do_lo16_relocate (input_bfd, howto,
3117 input_section, contents,
3118 rel->r_offset, relocation,
3119 rel->r_addend);
3120 break;
3121 case R_NIOS2_GOT_HA:
3122 case R_NIOS2_CALL_HA:
3123 r = nios2_elf32_do_hiadj16_relocate (input_bfd, howto,
3124 input_section, contents,
3125 rel->r_offset,
3126 relocation,
3127 rel->r_addend);
3128 break;
3129 default:
3130 r = _bfd_final_link_relocate (howto, input_bfd,
3131 input_section, contents,
3132 rel->r_offset, relocation,
3133 rel->r_addend);
3134 break;
3135 }
3136 break;
3137
3138 case R_NIOS2_GOTOFF_LO:
3139 case R_NIOS2_GOTOFF_HA:
3140 case R_NIOS2_GOTOFF:
3141 /* Relocation is relative to the global offset table pointer. */
3142
3143 BFD_ASSERT (sgot != NULL);
3144 if (sgot == NULL)
3145 {
3146 r = bfd_reloc_notsupported;
3147 break;
3148 }
3149
3150 /* Note that sgot->output_offset is not involved in this
3151 calculation. We always want the start of .got. */
3152 relocation -= sgot->output_section->vma;
3153
3154 /* Now we adjust the relocation to be relative to the GOT pointer
3155 (the _gp_got symbol), which possibly contains the 0x8000 bias. */
3156 relocation -= got_base;
3157
3158 switch (howto->type)
3159 {
3160 case R_NIOS2_GOTOFF_LO:
3161 r = nios2_elf32_do_lo16_relocate (input_bfd, howto,
3162 input_section, contents,
3163 rel->r_offset, relocation,
3164 rel->r_addend);
3165 break;
3166 case R_NIOS2_GOTOFF_HA:
3167 r = nios2_elf32_do_hiadj16_relocate (input_bfd, howto,
3168 input_section, contents,
3169 rel->r_offset,
3170 relocation,
3171 rel->r_addend);
3172 break;
3173 default:
3174 r = _bfd_final_link_relocate (howto, input_bfd,
3175 input_section, contents,
3176 rel->r_offset, relocation,
3177 rel->r_addend);
3178 break;
3179 }
3180 break;
3181
3182 case R_NIOS2_TLS_LDO16:
3183 relocation -= dtpoff_base (info) + DTP_OFFSET;
3184
3185 r = _bfd_final_link_relocate (howto, input_bfd, input_section,
3186 contents, rel->r_offset,
3187 relocation, rel->r_addend);
3188 break;
3189 case R_NIOS2_TLS_LDM16:
3190 if (htab->root.sgot == NULL)
3191 abort ();
3192
3193 off = htab->tls_ldm_got.offset;
3194
3195 if ((off & 1) != 0)
3196 off &= ~1;
3197 else
3198 {
3199 /* If we don't know the module number, create a relocation
3200 for it. */
3201 if (info->shared)
3202 {
3203 Elf_Internal_Rela outrel;
3204 bfd_byte *loc;
3205
3206 if (htab->root.srelgot == NULL)
3207 abort ();
3208
3209 outrel.r_addend = 0;
3210 outrel.r_offset = (htab->root.sgot->output_section->vma
3211 + htab->root.sgot->output_offset
3212 + off);
3213 outrel.r_info = ELF32_R_INFO (0, R_NIOS2_TLS_DTPMOD);
3214
3215 loc = htab->root.srelgot->contents;
3216 loc += (htab->root.srelgot->reloc_count++
3217 * sizeof (Elf32_External_Rela));
3218 bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
3219 }
3220 else
3221 bfd_put_32 (output_bfd, 1,
3222 htab->root.sgot->contents + off);
3223
3224 htab->tls_ldm_got.offset |= 1;
3225 }
3226
3227 relocation = htab->root.sgot->output_offset + off - got_base;
3228
3229 r = _bfd_final_link_relocate (howto, input_bfd, input_section,
3230 contents, rel->r_offset,
3231 relocation, rel->r_addend);
3232
3233 break;
3234 case R_NIOS2_TLS_GD16:
3235 case R_NIOS2_TLS_IE16:
3236 {
3237 int indx;
3238 char tls_type;
3239
3240 if (htab->root.sgot == NULL)
3241 abort ();
3242
3243 indx = 0;
3244 if (h != NULL)
3245 {
3246 bfd_boolean dyn;
3247 dyn = htab->root.dynamic_sections_created;
3248 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
3249 && (!info->shared
3250 || !SYMBOL_REFERENCES_LOCAL (info, h)))
3251 {
3252 unresolved_reloc = FALSE;
3253 indx = h->dynindx;
3254 }
3255 off = h->got.offset;
3256 tls_type = (((struct elf32_nios2_link_hash_entry *) h)
3257 ->tls_type);
3258 }
3259 else
3260 {
3261 if (local_got_offsets == NULL)
3262 abort ();
3263 off = local_got_offsets[r_symndx];
3264 tls_type = (elf32_nios2_local_got_tls_type (input_bfd)
3265 [r_symndx]);
3266 }
3267
3268 if (tls_type == GOT_UNKNOWN)
3269 abort ();
3270
3271 if ((off & 1) != 0)
3272 off &= ~1;
3273 else
3274 {
3275 bfd_boolean need_relocs = FALSE;
3276 Elf_Internal_Rela outrel;
3277 bfd_byte *loc = NULL;
3278 int cur_off = off;
3279
3280 /* The GOT entries have not been initialized yet. Do it
3281 now, and emit any relocations. If both an IE GOT and a
3282 GD GOT are necessary, we emit the GD first. */
3283
3284 if ((info->shared || indx != 0)
3285 && (h == NULL
3286 || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
3287 || h->root.type != bfd_link_hash_undefweak))
3288 {
3289 need_relocs = TRUE;
3290 if (htab->root.srelgot == NULL)
3291 abort ();
3292 loc = htab->root.srelgot->contents;
3293 loc += (htab->root.srelgot->reloc_count *
3294 sizeof (Elf32_External_Rela));
3295 }
3296
3297 if (tls_type & GOT_TLS_GD)
3298 {
3299 if (need_relocs)
3300 {
3301 outrel.r_addend = 0;
3302 outrel.r_offset = (htab->root.sgot->output_section->vma
3303 + htab->root.sgot->output_offset
3304 + cur_off);
3305 outrel.r_info = ELF32_R_INFO (indx,
3306 R_NIOS2_TLS_DTPMOD);
3307
3308 bfd_elf32_swap_reloca_out (output_bfd, &outrel,
3309 loc);
3310 htab->root.srelgot->reloc_count++;
3311 loc += sizeof (Elf32_External_Rela);
3312
3313 if (indx == 0)
3314 bfd_put_32 (output_bfd,
3315 (relocation - dtpoff_base (info) -
3316 DTP_OFFSET),
3317 htab->root.sgot->contents + cur_off + 4);
3318 else
3319 {
3320 outrel.r_addend = 0;
3321 outrel.r_info = ELF32_R_INFO (indx,
3322 R_NIOS2_TLS_DTPREL);
3323 outrel.r_offset += 4;
3324
3325 bfd_elf32_swap_reloca_out (output_bfd, &outrel,
3326 loc);
3327 htab->root.srelgot->reloc_count++;
3328 loc += sizeof (Elf32_External_Rela);
3329 }
3330 }
3331 else
3332 {
3333 /* If we are not emitting relocations for a
3334 general dynamic reference, then we must be in a
3335 static link or an executable link with the
3336 symbol binding locally. Mark it as belonging
3337 to module 1, the executable. */
3338 bfd_put_32 (output_bfd, 1,
3339 htab->root.sgot->contents + cur_off);
3340 bfd_put_32 (output_bfd, (relocation -
3341 dtpoff_base (info) -
3342 DTP_OFFSET),
3343 htab->root.sgot->contents + cur_off + 4);
3344 }
3345
3346 cur_off += 8;
3347 }
3348
3349 if (tls_type & GOT_TLS_IE)
3350 {
3351 if (need_relocs)
3352 {
3353 if (indx == 0)
3354 outrel.r_addend = (relocation -
3355 dtpoff_base (info));
3356 else
3357 outrel.r_addend = 0;
3358 outrel.r_offset = (htab->root.sgot->output_section->vma
3359 + htab->root.sgot->output_offset
3360 + cur_off);
3361 outrel.r_info = ELF32_R_INFO (indx,
3362 R_NIOS2_TLS_TPREL);
3363
3364 bfd_elf32_swap_reloca_out (output_bfd, &outrel,
3365 loc);
3366 htab->root.srelgot->reloc_count++;
3367 loc += sizeof (Elf32_External_Rela);
3368 }
3369 else
3370 bfd_put_32 (output_bfd, (tpoff (info, relocation)
3371 - TP_OFFSET),
3372 htab->root.sgot->contents + cur_off);
3373 cur_off += 4;
3374 }
3375
3376 if (h != NULL)
3377 h->got.offset |= 1;
3378 else
3379 local_got_offsets[r_symndx] |= 1;
3380 }
3381
3382 if ((tls_type & GOT_TLS_GD) && r_type != R_NIOS2_TLS_GD16)
3383 off += 8;
3384 relocation = htab->root.sgot->output_offset + off - got_base;
3385
3386 r = _bfd_final_link_relocate (howto, input_bfd, input_section,
3387 contents, rel->r_offset,
3388 relocation, rel->r_addend);
3389 }
3390
3391 break;
3392 case R_NIOS2_TLS_LE16:
3393 if (info->shared && !info->pie)
3394 {
3395 (*_bfd_error_handler)
3396 (_("%B(%A+0x%lx): R_NIOS2_TLS_LE16 relocation not "
3397 "permitted in shared object"),
3398 input_bfd, input_section,
3399 (long) rel->r_offset, howto->name);
3400 return FALSE;
3401 }
3402 else
3403 relocation = tpoff (info, relocation) - TP_OFFSET;
3404
3405 r = _bfd_final_link_relocate (howto, input_bfd, input_section,
3406 contents, rel->r_offset,
3407 relocation, rel->r_addend);
3408 break;
3409
3410 case R_NIOS2_BFD_RELOC_32:
3411 if (info->shared
3412 && (input_section->flags & SEC_ALLOC) != 0
3413 && (h == NULL
3414 || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
3415 || h->root.type != bfd_link_hash_undefweak))
3416 {
3417 Elf_Internal_Rela outrel;
3418 bfd_byte *loc;
3419 bfd_boolean skip, relocate;
3420
3421 /* When generating a shared object, these relocations
3422 are copied into the output file to be resolved at run
3423 time. */
3424
3425 skip = FALSE;
3426 relocate = FALSE;
3427
3428 outrel.r_offset
3429 = _bfd_elf_section_offset (output_bfd, info,
3430 input_section, rel->r_offset);
3431 if (outrel.r_offset == (bfd_vma) -1)
3432 skip = TRUE;
3433 else if (outrel.r_offset == (bfd_vma) -2)
3434 skip = TRUE, relocate = TRUE;
3435 outrel.r_offset += (input_section->output_section->vma
3436 + input_section->output_offset);
3437
3438 if (skip)
3439 memset (&outrel, 0, sizeof outrel);
3440 else if (h != NULL
3441 && h->dynindx != -1
3442 && (!info->shared
3443 || !info->symbolic
3444 || !h->def_regular))
3445 {
3446 outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
3447 outrel.r_addend = rel->r_addend;
3448 }
3449 else
3450 {
3451 /* This symbol is local, or marked to become local. */
3452 outrel.r_addend = relocation + rel->r_addend;
3453 relocate = TRUE;
3454 outrel.r_info = ELF32_R_INFO (0, R_NIOS2_RELATIVE);
3455 }
3456
3457 sreloc = elf_section_data (input_section)->sreloc;
3458 if (sreloc == NULL)
3459 abort ();
3460
3461 loc = sreloc->contents;
3462 loc += sreloc->reloc_count++ * sizeof (Elf32_External_Rela);
3463 bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
3464
3465 /* This reloc will be computed at runtime, so there's no
3466 need to do anything now, except for R_NIOS2_BFD_RELOC_32
3467 relocations that have been turned into
3468 R_NIOS2_RELATIVE. */
3469 if (!relocate)
3470 break;
3471 }
3472
3473 r = _bfd_final_link_relocate (howto, input_bfd,
3474 input_section, contents,
3475 rel->r_offset, relocation,
3476 rel->r_addend);
3477 break;
3478
3479 case R_NIOS2_TLS_DTPREL:
3480 relocation -= dtpoff_base (info);
3481 /* Fall through. */
3482
3483 default:
3484 r = _bfd_final_link_relocate (howto, input_bfd,
3485 input_section, contents,
3486 rel->r_offset, relocation,
3487 rel->r_addend);
3488 break;
3489 }
3490 }
3491 else
3492 r = bfd_reloc_notsupported;
3493
3494 if (r != bfd_reloc_ok)
3495 {
3496 if (h != NULL)
3497 name = h->root.root.string;
3498 else
3499 {
3500 name = bfd_elf_string_from_elf_section (input_bfd,
3501 symtab_hdr->sh_link,
3502 sym->st_name);
3503 if (name == NULL || *name == '\0')
3504 name = bfd_section_name (input_bfd, sec);
3505 }
3506
3507 switch (r)
3508 {
3509 case bfd_reloc_overflow:
3510 r = info->callbacks->reloc_overflow (info, NULL, name,
3511 howto->name, (bfd_vma) 0,
3512 input_bfd, input_section,
3513 rel->r_offset);
3514 break;
3515
3516 case bfd_reloc_undefined:
3517 r = info->callbacks->undefined_symbol (info, name, input_bfd,
3518 input_section,
3519 rel->r_offset, TRUE);
3520 break;
3521
3522 case bfd_reloc_outofrange:
3523 if (msg == NULL)
3524 msg = _("relocation out of range");
3525 break;
3526
3527 case bfd_reloc_notsupported:
3528 if (msg == NULL)
3529 msg = _("unsupported relocation");
3530 break;
3531
3532 case bfd_reloc_dangerous:
3533 if (msg == NULL)
3534 msg = _("dangerous relocation");
3535 break;
3536
3537 default:
3538 if (msg == NULL)
3539 msg = _("unknown error");
3540 break;
3541 }
3542
3543 if (msg)
3544 {
3545 r = info->callbacks->warning
3546 (info, msg, name, input_bfd, input_section, rel->r_offset);
3547 return FALSE;
3548 }
3549 }
3550 }
3551 return TRUE;
3552 }
3553
3554 /* Implement elf-backend_section_flags:
3555 Convert NIOS2 specific section flags to bfd internal section flags. */
3556 static bfd_boolean
3557 nios2_elf32_section_flags (flagword *flags, const Elf_Internal_Shdr *hdr)
3558 {
3559 if (hdr->sh_flags & SHF_NIOS2_GPREL)
3560 *flags |= SEC_SMALL_DATA;
3561
3562 return TRUE;
3563 }
3564
3565 /* Implement elf_backend_fake_sections:
3566 Set the correct type for an NIOS2 ELF section. We do this by the
3567 section name, which is a hack, but ought to work. */
3568 static bfd_boolean
3569 nios2_elf32_fake_sections (bfd *abfd ATTRIBUTE_UNUSED,
3570 Elf_Internal_Shdr *hdr, asection *sec)
3571 {
3572 register const char *name = bfd_get_section_name (abfd, sec);
3573
3574 if ((sec->flags & SEC_SMALL_DATA)
3575 || strcmp (name, ".sdata") == 0
3576 || strcmp (name, ".sbss") == 0
3577 || strcmp (name, ".lit4") == 0 || strcmp (name, ".lit8") == 0)
3578 hdr->sh_flags |= SHF_NIOS2_GPREL;
3579
3580 return TRUE;
3581 }
3582
3583 /* Create .got, .gotplt, and .rela.got sections in DYNOBJ, and set up
3584 shortcuts to them in our hash table. */
3585 static bfd_boolean
3586 create_got_section (bfd *dynobj, struct bfd_link_info *info)
3587 {
3588 struct elf32_nios2_link_hash_table *htab;
3589 struct elf_link_hash_entry *h;
3590
3591 htab = elf32_nios2_hash_table (info);
3592
3593 if (! _bfd_elf_create_got_section (dynobj, info))
3594 return FALSE;
3595
3596 /* In order for the two loads in .PLTresolve to share the same %hiadj,
3597 _GLOBAL_OFFSET_TABLE_ must be aligned to a 16-byte boundary. */
3598 if (!bfd_set_section_alignment (dynobj, htab->root.sgotplt, 4))
3599 return FALSE;
3600
3601 /* The Nios II ABI specifies that GOT-relative relocations are relative
3602 to the linker-created symbol _gp_got, rather than using
3603 _GLOBAL_OFFSET_TABLE_ directly. In particular, the latter always
3604 points to the base of the GOT while _gp_got may include a bias. */
3605 h = _bfd_elf_define_linkage_sym (dynobj, info, htab->root.sgotplt,
3606 "_gp_got");
3607 elf32_nios2_hash_table (info)->h_gp_got = h;
3608 if (h == NULL)
3609 return FALSE;
3610
3611 return TRUE;
3612 }
3613
3614 /* Implement elf_backend_create_dynamic_sections:
3615 Create .plt, .rela.plt, .got, .got.plt, .rela.got, .dynbss, and
3616 .rela.bss sections in DYNOBJ, and set up shortcuts to them in our
3617 hash table. */
3618 static bfd_boolean
3619 nios2_elf32_create_dynamic_sections (bfd *dynobj, struct bfd_link_info *info)
3620 {
3621 struct elf32_nios2_link_hash_table *htab;
3622
3623 htab = elf32_nios2_hash_table (info);
3624 if (!htab->root.sgot && !create_got_section (dynobj, info))
3625 return FALSE;
3626
3627 _bfd_elf_create_dynamic_sections (dynobj, info);
3628
3629 /* In order for the two loads in a shared object .PLTresolve to share the
3630 same %hiadj, the start of the PLT (as well as the GOT) must be aligned
3631 to a 16-byte boundary. This is because the addresses for these loads
3632 include the -(.plt+4) PIC correction. */
3633 if (!bfd_set_section_alignment (dynobj, htab->root.splt, 4))
3634 return FALSE;
3635
3636 htab->sdynbss = bfd_get_linker_section (dynobj, ".dynbss");
3637 if (!htab->sdynbss)
3638 return FALSE;
3639 if (!info->shared)
3640 {
3641 htab->srelbss = bfd_get_linker_section (dynobj, ".rela.bss");
3642 if (!htab->srelbss)
3643 return FALSE;
3644 }
3645
3646 return TRUE;
3647 }
3648
3649 /* Implement elf_backend_copy_indirect_symbol:
3650 Copy the extra info we tack onto an elf_link_hash_entry. */
3651 static void
3652 nios2_elf32_copy_indirect_symbol (struct bfd_link_info *info,
3653 struct elf_link_hash_entry *dir,
3654 struct elf_link_hash_entry *ind)
3655 {
3656 struct elf32_nios2_link_hash_entry *edir, *eind;
3657
3658 edir = (struct elf32_nios2_link_hash_entry *) dir;
3659 eind = (struct elf32_nios2_link_hash_entry *) ind;
3660
3661 if (eind->dyn_relocs != NULL)
3662 {
3663 if (edir->dyn_relocs != NULL)
3664 {
3665 struct elf32_nios2_dyn_relocs **pp;
3666 struct elf32_nios2_dyn_relocs *p;
3667
3668 /* Add reloc counts against the indirect sym to the direct sym
3669 list. Merge any entries against the same section. */
3670 for (pp = &eind->dyn_relocs; (p = *pp) != NULL; )
3671 {
3672 struct elf32_nios2_dyn_relocs *q;
3673
3674 for (q = edir->dyn_relocs; q != NULL; q = q->next)
3675 if (q->sec == p->sec)
3676 {
3677 q->pc_count += p->pc_count;
3678 q->count += p->count;
3679 *pp = p->next;
3680 break;
3681 }
3682 if (q == NULL)
3683 pp = &p->next;
3684 }
3685 *pp = edir->dyn_relocs;
3686 }
3687
3688 edir->dyn_relocs = eind->dyn_relocs;
3689 eind->dyn_relocs = NULL;
3690 }
3691
3692 if (ind->root.type == bfd_link_hash_indirect
3693 && dir->got.refcount <= 0)
3694 {
3695 edir->tls_type = eind->tls_type;
3696 eind->tls_type = GOT_UNKNOWN;
3697 }
3698
3699 edir->got_types_used |= eind->got_types_used;
3700
3701 _bfd_elf_link_hash_copy_indirect (info, dir, ind);
3702 }
3703
3704 /* Implement elf_backend_check_relocs:
3705 Look through the relocs for a section during the first phase. */
3706 static bfd_boolean
3707 nios2_elf32_check_relocs (bfd *abfd, struct bfd_link_info *info,
3708 asection *sec, const Elf_Internal_Rela *relocs)
3709 {
3710 bfd *dynobj;
3711 Elf_Internal_Shdr *symtab_hdr;
3712 struct elf_link_hash_entry **sym_hashes, **sym_hashes_end;
3713 const Elf_Internal_Rela *rel;
3714 const Elf_Internal_Rela *rel_end;
3715 struct elf32_nios2_link_hash_table *htab;
3716 asection *sgot;
3717 asection *srelgot;
3718 asection *sreloc = NULL;
3719 bfd_signed_vma *local_got_refcounts;
3720
3721 if (info->relocatable)
3722 return TRUE;
3723
3724 dynobj = elf_hash_table (info)->dynobj;
3725 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
3726 sym_hashes = elf_sym_hashes (abfd);
3727 sym_hashes_end = (sym_hashes
3728 + symtab_hdr->sh_size / sizeof (Elf32_External_Sym));
3729 if (!elf_bad_symtab (abfd))
3730 sym_hashes_end -= symtab_hdr->sh_info;
3731 local_got_refcounts = elf_local_got_refcounts (abfd);
3732
3733 htab = elf32_nios2_hash_table (info);
3734 sgot = htab->root.sgot;
3735 srelgot = htab->root.srelgot;
3736
3737 rel_end = relocs + sec->reloc_count;
3738 for (rel = relocs; rel < rel_end; rel++)
3739 {
3740 unsigned int r_type;
3741 struct elf_link_hash_entry *h;
3742 unsigned long r_symndx;
3743
3744 r_symndx = ELF32_R_SYM (rel->r_info);
3745 if (r_symndx < symtab_hdr->sh_info)
3746 h = NULL;
3747 else
3748 {
3749 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
3750 while (h->root.type == bfd_link_hash_indirect
3751 || h->root.type == bfd_link_hash_warning)
3752 h = (struct elf_link_hash_entry *) h->root.u.i.link;
3753
3754 /* PR15323, ref flags aren't set for references in the same
3755 object. */
3756 h->root.non_ir_ref = 1;
3757 }
3758
3759 r_type = ELF32_R_TYPE (rel->r_info);
3760
3761 switch (r_type)
3762 {
3763 case R_NIOS2_GOT16:
3764 case R_NIOS2_GOT_LO:
3765 case R_NIOS2_GOT_HA:
3766 case R_NIOS2_CALL16:
3767 case R_NIOS2_CALL_LO:
3768 case R_NIOS2_CALL_HA:
3769 case R_NIOS2_TLS_GD16:
3770 case R_NIOS2_TLS_IE16:
3771 /* This symbol requires a global offset table entry. */
3772 {
3773 int tls_type, old_tls_type;
3774
3775 switch (r_type)
3776 {
3777 default:
3778 case R_NIOS2_GOT16:
3779 case R_NIOS2_GOT_LO:
3780 case R_NIOS2_GOT_HA:
3781 case R_NIOS2_CALL16:
3782 case R_NIOS2_CALL_LO:
3783 case R_NIOS2_CALL_HA:
3784 tls_type = GOT_NORMAL;
3785 break;
3786 case R_NIOS2_TLS_GD16:
3787 tls_type = GOT_TLS_GD;
3788 break;
3789 case R_NIOS2_TLS_IE16:
3790 tls_type = GOT_TLS_IE;
3791 break;
3792 }
3793
3794 if (dynobj == NULL)
3795 {
3796 /* Create the .got section. */
3797 elf_hash_table (info)->dynobj = dynobj = abfd;
3798 nios2_elf32_create_dynamic_sections (dynobj, info);
3799 }
3800
3801 if (sgot == NULL)
3802 {
3803 sgot = htab->root.sgot;
3804 BFD_ASSERT (sgot != NULL);
3805 }
3806
3807 if (srelgot == NULL
3808 && (h != NULL || info->shared))
3809 {
3810 srelgot = htab->root.srelgot;
3811 BFD_ASSERT (srelgot != NULL);
3812 }
3813
3814 if (h != NULL)
3815 {
3816 struct elf32_nios2_link_hash_entry *eh
3817 = (struct elf32_nios2_link_hash_entry *)h;
3818 h->got.refcount++;
3819 old_tls_type = elf32_nios2_hash_entry(h)->tls_type;
3820 if (r_type == R_NIOS2_CALL16
3821 || r_type == R_NIOS2_CALL_LO
3822 || r_type == R_NIOS2_CALL_HA)
3823 {
3824 /* Make sure a plt entry is created for this symbol if
3825 it turns out to be a function defined by a dynamic
3826 object. */
3827 h->plt.refcount++;
3828 h->needs_plt = 1;
3829 h->type = STT_FUNC;
3830 eh->got_types_used |= CALL_USED;
3831 }
3832 else
3833 eh->got_types_used |= GOT_USED;
3834 }
3835 else
3836 {
3837 /* This is a global offset table entry for a local symbol. */
3838 if (local_got_refcounts == NULL)
3839 {
3840 bfd_size_type size;
3841
3842 size = symtab_hdr->sh_info;
3843 size *= (sizeof (bfd_signed_vma) + sizeof (char));
3844 local_got_refcounts
3845 = ((bfd_signed_vma *) bfd_zalloc (abfd, size));
3846 if (local_got_refcounts == NULL)
3847 return FALSE;
3848 elf_local_got_refcounts (abfd) = local_got_refcounts;
3849 elf32_nios2_local_got_tls_type (abfd)
3850 = (char *) (local_got_refcounts + symtab_hdr->sh_info);
3851 }
3852 local_got_refcounts[r_symndx]++;
3853 old_tls_type = elf32_nios2_local_got_tls_type (abfd) [r_symndx];
3854 }
3855
3856 /* We will already have issued an error message if there is a
3857 TLS / non-TLS mismatch, based on the symbol type. We don't
3858 support any linker relaxations. So just combine any TLS
3859 types needed. */
3860 if (old_tls_type != GOT_UNKNOWN && old_tls_type != GOT_NORMAL
3861 && tls_type != GOT_NORMAL)
3862 tls_type |= old_tls_type;
3863
3864 if (old_tls_type != tls_type)
3865 {
3866 if (h != NULL)
3867 elf32_nios2_hash_entry (h)->tls_type = tls_type;
3868 else
3869 elf32_nios2_local_got_tls_type (abfd) [r_symndx] = tls_type;
3870 }
3871 }
3872 /* Fall through */
3873 case R_NIOS2_TLS_LDM16:
3874 if (r_type == R_NIOS2_TLS_LDM16)
3875 htab->tls_ldm_got.refcount++;
3876
3877 if (htab->root.sgot == NULL)
3878 {
3879 if (htab->root.dynobj == NULL)
3880 htab->root.dynobj = abfd;
3881 if (!create_got_section (htab->root.dynobj, info))
3882 return FALSE;
3883 }
3884 break;
3885
3886 /* This relocation describes the C++ object vtable hierarchy.
3887 Reconstruct it for later use during GC. */
3888 case R_NIOS2_GNU_VTINHERIT:
3889 if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
3890 return FALSE;
3891 break;
3892
3893 /* This relocation describes which C++ vtable entries are actually
3894 used. Record for later use during GC. */
3895 case R_NIOS2_GNU_VTENTRY:
3896 if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
3897 return FALSE;
3898 break;
3899
3900 case R_NIOS2_BFD_RELOC_32:
3901 case R_NIOS2_CALL26:
3902 case R_NIOS2_CALL26_NOAT:
3903 case R_NIOS2_HIADJ16:
3904 case R_NIOS2_LO16:
3905
3906 if (h != NULL)
3907 {
3908 /* If this reloc is in a read-only section, we might
3909 need a copy reloc. We can't check reliably at this
3910 stage whether the section is read-only, as input
3911 sections have not yet been mapped to output sections.
3912 Tentatively set the flag for now, and correct in
3913 adjust_dynamic_symbol. */
3914 if (!info->shared)
3915 h->non_got_ref = 1;
3916
3917 /* Make sure a plt entry is created for this symbol if it
3918 turns out to be a function defined by a dynamic object. */
3919 h->plt.refcount++;
3920
3921 if (r_type == R_NIOS2_CALL26 || r_type == R_NIOS2_CALL26_NOAT)
3922 h->needs_plt = 1;
3923 }
3924
3925 /* If we are creating a shared library, we need to copy the
3926 reloc into the shared library. */
3927 if (info->shared
3928 && (sec->flags & SEC_ALLOC) != 0
3929 && (r_type == R_NIOS2_BFD_RELOC_32
3930 || (h != NULL && ! h->needs_plt
3931 && (! info->symbolic || ! h->def_regular))))
3932 {
3933 struct elf32_nios2_dyn_relocs *p;
3934 struct elf32_nios2_dyn_relocs **head;
3935
3936 /* When creating a shared object, we must copy these
3937 reloc types into the output file. We create a reloc
3938 section in dynobj and make room for this reloc. */
3939 if (sreloc == NULL)
3940 {
3941 sreloc = _bfd_elf_make_dynamic_reloc_section
3942 (sec, dynobj, 2, abfd, TRUE);
3943 if (sreloc == NULL)
3944 return FALSE;
3945 }
3946
3947 /* If this is a global symbol, we count the number of
3948 relocations we need for this symbol. */
3949 if (h != NULL)
3950 head = &((struct elf32_nios2_link_hash_entry *) h)->dyn_relocs;
3951 else
3952 {
3953 /* Track dynamic relocs needed for local syms too.
3954 We really need local syms available to do this
3955 easily. Oh well. */
3956
3957 asection *s;
3958 void *vpp;
3959 Elf_Internal_Sym *isym;
3960
3961 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
3962 abfd, r_symndx);
3963 if (isym == NULL)
3964 return FALSE;
3965
3966 s = bfd_section_from_elf_index (abfd, isym->st_shndx);
3967 if (s == NULL)
3968 s = sec;
3969
3970 vpp = &elf_section_data (s)->local_dynrel;
3971 head = (struct elf32_nios2_dyn_relocs **) vpp;
3972 }
3973
3974 p = *head;
3975 if (p == NULL || p->sec != sec)
3976 {
3977 bfd_size_type amt = sizeof *p;
3978 p = ((struct elf32_nios2_dyn_relocs *)
3979 bfd_alloc (htab->root.dynobj, amt));
3980 if (p == NULL)
3981 return FALSE;
3982 p->next = *head;
3983 *head = p;
3984 p->sec = sec;
3985 p->count = 0;
3986 p->pc_count = 0;
3987 }
3988
3989 p->count += 1;
3990
3991 }
3992 break;
3993 }
3994 }
3995
3996 return TRUE;
3997 }
3998
3999
4000 /* Implement elf_backend_gc_mark_hook:
4001 Return the section that should be marked against GC for a given
4002 relocation. */
4003 static asection *
4004 nios2_elf32_gc_mark_hook (asection *sec,
4005 struct bfd_link_info *info,
4006 Elf_Internal_Rela *rel,
4007 struct elf_link_hash_entry *h,
4008 Elf_Internal_Sym *sym)
4009 {
4010 if (h != NULL)
4011 switch (ELF32_R_TYPE (rel->r_info))
4012 {
4013 case R_NIOS2_GNU_VTINHERIT:
4014 case R_NIOS2_GNU_VTENTRY:
4015 return NULL;
4016 }
4017 return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
4018 }
4019
4020 /* Implement elf_backend_gc_sweep_hook:
4021 Update the got entry reference counts for the section being removed. */
4022 static bfd_boolean
4023 nios2_elf32_gc_sweep_hook (bfd *abfd,
4024 struct bfd_link_info *info,
4025 asection *sec,
4026 const Elf_Internal_Rela *relocs)
4027 {
4028 Elf_Internal_Shdr *symtab_hdr;
4029 struct elf_link_hash_entry **sym_hashes;
4030 bfd_signed_vma *local_got_refcounts;
4031 const Elf_Internal_Rela *rel, *relend;
4032 bfd *dynobj;
4033
4034 if (info->relocatable)
4035 return TRUE;
4036
4037 elf_section_data (sec)->local_dynrel = NULL;
4038
4039 dynobj = elf_hash_table (info)->dynobj;
4040 if (dynobj == NULL)
4041 return TRUE;
4042
4043 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
4044 sym_hashes = elf_sym_hashes (abfd);
4045 local_got_refcounts = elf_local_got_refcounts (abfd);
4046
4047 relend = relocs + sec->reloc_count;
4048 for (rel = relocs; rel < relend; rel++)
4049 {
4050 unsigned long r_symndx;
4051 struct elf_link_hash_entry *h = NULL;
4052 int r_type;
4053
4054 r_symndx = ELF32_R_SYM (rel->r_info);
4055 if (r_symndx >= symtab_hdr->sh_info)
4056 {
4057 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
4058 while (h->root.type == bfd_link_hash_indirect
4059 || h->root.type == bfd_link_hash_warning)
4060 h = (struct elf_link_hash_entry *) h->root.u.i.link;
4061 }
4062
4063 r_type = ELF32_R_TYPE (rel->r_info);
4064 switch (r_type)
4065 {
4066 case R_NIOS2_GOT16:
4067 case R_NIOS2_GOT_LO:
4068 case R_NIOS2_GOT_HA:
4069 case R_NIOS2_CALL16:
4070 case R_NIOS2_CALL_LO:
4071 case R_NIOS2_CALL_HA:
4072 if (h != NULL)
4073 {
4074 if (h->got.refcount > 0)
4075 --h->got.refcount;
4076 }
4077 else if (local_got_refcounts != NULL)
4078 {
4079 if (local_got_refcounts[r_symndx] > 0)
4080 --local_got_refcounts[r_symndx];
4081 }
4082 break;
4083
4084 case R_NIOS2_PCREL_LO:
4085 case R_NIOS2_PCREL_HA:
4086 case R_NIOS2_BFD_RELOC_32:
4087 case R_NIOS2_CALL26:
4088 case R_NIOS2_CALL26_NOAT:
4089 if (h != NULL)
4090 {
4091 struct elf32_nios2_link_hash_entry *eh;
4092 struct elf32_nios2_dyn_relocs **pp;
4093 struct elf32_nios2_dyn_relocs *p;
4094
4095 eh = (struct elf32_nios2_link_hash_entry *) h;
4096
4097 if (h->plt.refcount > 0)
4098 --h->plt.refcount;
4099
4100 if (r_type == R_NIOS2_PCREL_LO || r_type == R_NIOS2_PCREL_HA
4101 || r_type == R_NIOS2_BFD_RELOC_32)
4102 {
4103 for (pp = &eh->dyn_relocs; (p = *pp) != NULL;
4104 pp = &p->next)
4105 if (p->sec == sec)
4106 {
4107 p->count -= 1;
4108 if (p->count == 0)
4109 *pp = p->next;
4110 break;
4111 }
4112 }
4113 }
4114 break;
4115
4116 default:
4117 break;
4118 }
4119 }
4120
4121 return TRUE;
4122 }
4123
4124 /* Implement elf_backend_finish_dynamic_symbols:
4125 Finish up dynamic symbol handling. We set the contents of various
4126 dynamic sections here. */
4127 static bfd_boolean
4128 nios2_elf32_finish_dynamic_symbol (bfd *output_bfd,
4129 struct bfd_link_info *info,
4130 struct elf_link_hash_entry *h,
4131 Elf_Internal_Sym *sym)
4132 {
4133 struct elf32_nios2_link_hash_table *htab;
4134 struct elf32_nios2_link_hash_entry *eh
4135 = (struct elf32_nios2_link_hash_entry *)h;
4136 int use_plt;
4137
4138 htab = elf32_nios2_hash_table (info);
4139
4140 if (h->plt.offset != (bfd_vma) -1)
4141 {
4142 asection *splt;
4143 asection *sgotplt;
4144 asection *srela;
4145 bfd_vma plt_index;
4146 bfd_vma got_offset;
4147 Elf_Internal_Rela rela;
4148 bfd_byte *loc;
4149 bfd_vma got_address;
4150
4151 /* This symbol has an entry in the procedure linkage table. Set
4152 it up. */
4153 BFD_ASSERT (h->dynindx != -1);
4154 splt = htab->root.splt;
4155 sgotplt = htab->root.sgotplt;
4156 srela = htab->root.srelplt;
4157 BFD_ASSERT (splt != NULL && sgotplt != NULL && srela != NULL);
4158
4159 /* Emit the PLT entry. */
4160 if (info->shared)
4161 {
4162 nios2_elf32_install_data (splt, nios2_so_plt_entry, h->plt.offset,
4163 3);
4164 plt_index = (h->plt.offset - 24) / 12;
4165 got_offset = (plt_index + 3) * 4;
4166 nios2_elf32_install_imm16 (splt, h->plt.offset,
4167 hiadj(plt_index * 4));
4168 nios2_elf32_install_imm16 (splt, h->plt.offset + 4,
4169 (plt_index * 4) & 0xffff);
4170 nios2_elf32_install_imm16 (splt, h->plt.offset + 8,
4171 0xfff4 - h->plt.offset);
4172 got_address = (sgotplt->output_section->vma + sgotplt->output_offset
4173 + got_offset);
4174
4175 /* Fill in the entry in the global offset table. There are no
4176 res_n slots for a shared object PLT, instead the .got.plt entries
4177 point to the PLT entries. */
4178 bfd_put_32 (output_bfd,
4179 splt->output_section->vma + splt->output_offset
4180 + h->plt.offset, sgotplt->contents + got_offset);
4181 }
4182 else
4183 {
4184 plt_index = (h->plt.offset - 28 - htab->res_n_size) / 12;
4185 got_offset = (plt_index + 3) * 4;
4186
4187 nios2_elf32_install_data (splt, nios2_plt_entry, h->plt.offset, 3);
4188 got_address = (sgotplt->output_section->vma + sgotplt->output_offset
4189 + got_offset);
4190 nios2_elf32_install_imm16 (splt, h->plt.offset, hiadj(got_address));
4191 nios2_elf32_install_imm16 (splt, h->plt.offset + 4,
4192 got_address & 0xffff);
4193
4194 /* Fill in the entry in the global offset table. */
4195 bfd_put_32 (output_bfd,
4196 splt->output_section->vma + splt->output_offset
4197 + plt_index * 4, sgotplt->contents + got_offset);
4198 }
4199
4200 /* Fill in the entry in the .rela.plt section. */
4201 rela.r_offset = got_address;
4202 rela.r_info = ELF32_R_INFO (h->dynindx, R_NIOS2_JUMP_SLOT);
4203 rela.r_addend = 0;
4204 loc = srela->contents + plt_index * sizeof (Elf32_External_Rela);
4205 bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
4206
4207 if (!h->def_regular)
4208 {
4209 /* Mark the symbol as undefined, rather than as defined in
4210 the .plt section. Leave the value alone. */
4211 sym->st_shndx = SHN_UNDEF;
4212 /* If the symbol is weak, we do need to clear the value.
4213 Otherwise, the PLT entry would provide a definition for
4214 the symbol even if the symbol wasn't defined anywhere,
4215 and so the symbol would never be NULL. */
4216 if (!h->ref_regular_nonweak)
4217 sym->st_value = 0;
4218 }
4219 }
4220
4221 use_plt = (eh->got_types_used == CALL_USED
4222 && h->plt.offset != (bfd_vma) -1);
4223
4224 if (!use_plt && h->got.offset != (bfd_vma) -1
4225 && (elf32_nios2_hash_entry (h)->tls_type & GOT_TLS_GD) == 0
4226 && (elf32_nios2_hash_entry (h)->tls_type & GOT_TLS_IE) == 0)
4227 {
4228 asection *sgot;
4229 asection *srela;
4230 Elf_Internal_Rela rela;
4231 bfd_byte *loc;
4232 bfd_vma offset;
4233
4234 /* This symbol has an entry in the global offset table. Set it
4235 up. */
4236 sgot = htab->root.sgot;
4237 srela = htab->root.srelgot;
4238 BFD_ASSERT (sgot != NULL && srela != NULL);
4239
4240 offset = (h->got.offset & ~(bfd_vma) 1);
4241 rela.r_offset = (sgot->output_section->vma
4242 + sgot->output_offset + offset);
4243
4244 /* If this is a -Bsymbolic link, and the symbol is defined
4245 locally, we just want to emit a RELATIVE reloc. Likewise if
4246 the symbol was forced to be local because of a version file.
4247 The entry in the global offset table will already have been
4248 initialized in the relocate_section function. */
4249
4250 if (info->shared && SYMBOL_REFERENCES_LOCAL (info, h))
4251 {
4252 rela.r_info = ELF32_R_INFO (0, R_NIOS2_RELATIVE);
4253 rela.r_addend = bfd_get_signed_32 (output_bfd,
4254 (sgot->contents + offset));
4255 bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + offset);
4256 }
4257 else
4258 {
4259 bfd_put_32 (output_bfd, (bfd_vma) 0,
4260 sgot->contents + offset);
4261 rela.r_info = ELF32_R_INFO (h->dynindx, R_NIOS2_GLOB_DAT);
4262 rela.r_addend = 0;
4263 }
4264
4265 loc = srela->contents;
4266 loc += srela->reloc_count++ * sizeof (Elf32_External_Rela);
4267 bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
4268 }
4269
4270 if (use_plt && h->got.offset != (bfd_vma) -1)
4271 {
4272 bfd_vma offset = (h->got.offset & ~(bfd_vma) 1);
4273 asection *sgot = htab->root.sgot;
4274 asection *splt = htab->root.splt;
4275 bfd_put_32 (output_bfd, (splt->output_section->vma + splt->output_offset
4276 + h->plt.offset),
4277 sgot->contents + offset);
4278 }
4279
4280 if (h->needs_copy)
4281 {
4282 asection *s;
4283 Elf_Internal_Rela rela;
4284 bfd_byte *loc;
4285
4286 /* This symbol needs a copy reloc. Set it up. */
4287 BFD_ASSERT (h->dynindx != -1
4288 && (h->root.type == bfd_link_hash_defined
4289 || h->root.type == bfd_link_hash_defweak));
4290
4291 s = htab->srelbss;
4292 BFD_ASSERT (s != NULL);
4293
4294 rela.r_offset = (h->root.u.def.value
4295 + h->root.u.def.section->output_section->vma
4296 + h->root.u.def.section->output_offset);
4297 rela.r_info = ELF32_R_INFO (h->dynindx, R_NIOS2_COPY);
4298 rela.r_addend = 0;
4299 loc = s->contents + s->reloc_count++ * sizeof (Elf32_External_Rela);
4300 bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
4301 }
4302
4303 /* Mark _DYNAMIC, _GLOBAL_OFFSET_TABLE_, and _gp_got as absolute. */
4304 if (strcmp (h->root.root.string, "_DYNAMIC") == 0
4305 || h == elf_hash_table (info)->hgot
4306 || h == elf32_nios2_hash_table (info)->h_gp_got)
4307 sym->st_shndx = SHN_ABS;
4308
4309 return TRUE;
4310 }
4311
4312 /* Implement elf_backend_finish_dynamic_sections. */
4313 static bfd_boolean
4314 nios2_elf32_finish_dynamic_sections (bfd *output_bfd,
4315 struct bfd_link_info *info)
4316 {
4317 bfd *dynobj;
4318 asection *sgotplt;
4319 asection *sdyn;
4320 struct elf32_nios2_link_hash_table *htab;
4321
4322 htab = elf32_nios2_hash_table (info);
4323 dynobj = elf_hash_table (info)->dynobj;
4324 sgotplt = htab->root.sgotplt;
4325 BFD_ASSERT (sgotplt != NULL);
4326 sdyn = bfd_get_linker_section (dynobj, ".dynamic");
4327
4328 if (elf_hash_table (info)->dynamic_sections_created)
4329 {
4330 asection *splt;
4331 Elf32_External_Dyn *dyncon, *dynconend;
4332
4333 splt = htab->root.splt;
4334 BFD_ASSERT (splt != NULL && sdyn != NULL);
4335
4336 dyncon = (Elf32_External_Dyn *) sdyn->contents;
4337 dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
4338 for (; dyncon < dynconend; dyncon++)
4339 {
4340 Elf_Internal_Dyn dyn;
4341 asection *s;
4342
4343 bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
4344
4345 switch (dyn.d_tag)
4346 {
4347 default:
4348 break;
4349
4350 case DT_PLTGOT:
4351 s = htab->root.sgot;
4352 BFD_ASSERT (s != NULL);
4353 dyn.d_un.d_ptr = s->output_section->vma;
4354 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
4355 break;
4356
4357 case DT_JMPREL:
4358 s = htab->root.srelplt;
4359 BFD_ASSERT (s != NULL);
4360 dyn.d_un.d_ptr = s->output_section->vma;
4361 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
4362 break;
4363
4364 case DT_PLTRELSZ:
4365 s = htab->root.srelplt;
4366 BFD_ASSERT (s != NULL);
4367 dyn.d_un.d_val = s->size;
4368 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
4369 break;
4370
4371 case DT_RELASZ:
4372 /* The procedure linkage table relocs (DT_JMPREL) should
4373 not be included in the overall relocs (DT_RELA).
4374 Therefore, we override the DT_RELASZ entry here to
4375 make it not include the JMPREL relocs. Since the
4376 linker script arranges for .rela.plt to follow all
4377 other relocation sections, we don't have to worry
4378 about changing the DT_RELA entry. */
4379 s = htab->root.srelplt;
4380 if (s != NULL)
4381 dyn.d_un.d_val -= s->size;
4382 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
4383 break;
4384
4385 case DT_NIOS2_GP:
4386 s = htab->root.sgot;
4387 BFD_ASSERT (s != NULL);
4388 dyn.d_un.d_ptr = s->output_section->vma + 0x7ff0;
4389 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
4390 break;
4391 }
4392 }
4393
4394 /* Fill in the first entry in the procedure linkage table. */
4395 if (splt->size > 0)
4396 {
4397 bfd_vma got_address = (sgotplt->output_section->vma
4398 + sgotplt->output_offset);
4399 if (info->shared)
4400 {
4401 bfd_vma corrected = got_address - (splt->output_section->vma
4402 + splt->output_offset + 4);
4403 nios2_elf32_install_data (splt, nios2_so_plt0_entry, 0, 6);
4404 nios2_elf32_install_imm16 (splt, 4, hiadj (corrected));
4405 nios2_elf32_install_imm16 (splt, 12, (corrected & 0xffff) + 4);
4406 nios2_elf32_install_imm16 (splt, 16, (corrected & 0xffff) + 8);
4407 }
4408 else
4409 {
4410 /* Divide by 4 here, not 3 because we already corrected for the
4411 res_N branches. */
4412 bfd_vma res_size = (splt->size - 28) / 4;
4413 bfd_vma res_start = (splt->output_section->vma
4414 + splt->output_offset);
4415 bfd_vma res_offset;
4416
4417 for (res_offset = 0; res_offset < res_size; res_offset += 4)
4418 bfd_put_32 (output_bfd,
4419 6 | ((res_size - (res_offset + 4)) << 6),
4420 splt->contents + res_offset);
4421
4422 nios2_elf32_install_data (splt, nios2_plt0_entry, res_size, 7);
4423 nios2_elf32_install_imm16 (splt, res_size, hiadj (res_start));
4424 nios2_elf32_install_imm16 (splt, res_size + 4,
4425 res_start & 0xffff);
4426 nios2_elf32_install_imm16 (splt, res_size + 12,
4427 hiadj (got_address));
4428 nios2_elf32_install_imm16 (splt, res_size + 16,
4429 (got_address & 0xffff) + 4);
4430 nios2_elf32_install_imm16 (splt, res_size + 20,
4431 (got_address & 0xffff) + 8);
4432 }
4433 }
4434 }
4435 /* Fill in the first three entries in the global offset table. */
4436 if (sgotplt->size > 0)
4437 {
4438 if (sdyn == NULL)
4439 bfd_put_32 (output_bfd, (bfd_vma) 0, sgotplt->contents);
4440 else
4441 bfd_put_32 (output_bfd,
4442 sdyn->output_section->vma + sdyn->output_offset,
4443 sgotplt->contents);
4444 bfd_put_32 (output_bfd, (bfd_vma) 0, sgotplt->contents + 4);
4445 bfd_put_32 (output_bfd, (bfd_vma) 0, sgotplt->contents + 8);
4446 }
4447
4448 elf_section_data (sgotplt->output_section)->this_hdr.sh_entsize = 4;
4449
4450 return TRUE;
4451 }
4452
4453 /* Implement elf_backend_adjust_dynamic_symbol:
4454 Adjust a symbol defined by a dynamic object and referenced by a
4455 regular object. The current definition is in some section of the
4456 dynamic object, but we're not including those sections. We have to
4457 change the definition to something the rest of the link can
4458 understand. */
4459 static bfd_boolean
4460 nios2_elf32_adjust_dynamic_symbol (struct bfd_link_info *info,
4461 struct elf_link_hash_entry *h)
4462 {
4463 struct elf32_nios2_link_hash_table *htab;
4464 bfd *dynobj;
4465 asection *s;
4466 unsigned align2;
4467
4468 htab = elf32_nios2_hash_table (info);
4469 dynobj = elf_hash_table (info)->dynobj;
4470
4471 /* Make sure we know what is going on here. */
4472 BFD_ASSERT (dynobj != NULL
4473 && (h->needs_plt
4474 || h->u.weakdef != NULL
4475 || (h->def_dynamic
4476 && h->ref_regular
4477 && !h->def_regular)));
4478
4479 /* If this is a function, put it in the procedure linkage table. We
4480 will fill in the contents of the procedure linkage table later,
4481 when we know the address of the .got section. */
4482 if (h->type == STT_FUNC || h->needs_plt)
4483 {
4484 if (h->plt.refcount <= 0
4485 || SYMBOL_CALLS_LOCAL (info, h)
4486 || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
4487 && h->root.type == bfd_link_hash_undefweak))
4488 {
4489 /* This case can occur if we saw a PLT reloc in an input
4490 file, but the symbol was never referred to by a dynamic
4491 object, or if all references were garbage collected. In
4492 such a case, we don't actually need to build a procedure
4493 linkage table, and we can just do a PCREL reloc instead. */
4494 h->plt.offset = (bfd_vma) -1;
4495 h->needs_plt = 0;
4496 }
4497
4498 return TRUE;
4499 }
4500
4501 /* Reinitialize the plt offset now that it is not used as a reference
4502 count any more. */
4503 h->plt.offset = (bfd_vma) -1;
4504
4505 /* If this is a weak symbol, and there is a real definition, the
4506 processor independent code will have arranged for us to see the
4507 real definition first, and we can just use the same value. */
4508 if (h->u.weakdef != NULL)
4509 {
4510 BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
4511 || h->u.weakdef->root.type == bfd_link_hash_defweak);
4512 h->root.u.def.section = h->u.weakdef->root.u.def.section;
4513 h->root.u.def.value = h->u.weakdef->root.u.def.value;
4514 return TRUE;
4515 }
4516
4517 /* If there are no non-GOT references, we do not need a copy
4518 relocation. */
4519 if (!h->non_got_ref)
4520 return TRUE;
4521
4522 /* This is a reference to a symbol defined by a dynamic object which
4523 is not a function.
4524 If we are creating a shared library, we must presume that the
4525 only references to the symbol are via the global offset table.
4526 For such cases we need not do anything here; the relocations will
4527 be handled correctly by relocate_section. */
4528 if (info->shared)
4529 return TRUE;
4530
4531 if (h->size == 0)
4532 {
4533 (*_bfd_error_handler) (_("dynamic variable `%s' is zero size"),
4534 h->root.root.string);
4535 return TRUE;
4536 }
4537
4538 /* We must allocate the symbol in our .dynbss section, which will
4539 become part of the .bss section of the executable. There will be
4540 an entry for this symbol in the .dynsym section. The dynamic
4541 object will contain position independent code, so all references
4542 from the dynamic object to this symbol will go through the global
4543 offset table. The dynamic linker will use the .dynsym entry to
4544 determine the address it must put in the global offset table, so
4545 both the dynamic object and the regular object will refer to the
4546 same memory location for the variable. */
4547 s = htab->sdynbss;
4548 BFD_ASSERT (s != NULL);
4549
4550 /* We must generate a R_NIOS2_COPY reloc to tell the dynamic linker to
4551 copy the initial value out of the dynamic object and into the
4552 runtime process image. We need to remember the offset into the
4553 .rela.bss section we are going to use. */
4554 if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
4555 {
4556 asection *srel;
4557
4558 srel = htab->srelbss;
4559 BFD_ASSERT (srel != NULL);
4560 srel->size += sizeof (Elf32_External_Rela);
4561 h->needs_copy = 1;
4562 }
4563
4564 align2 = bfd_log2 (h->size);
4565 if (align2 > h->root.u.def.section->alignment_power)
4566 align2 = h->root.u.def.section->alignment_power;
4567
4568 /* Align dynbss. */
4569 s->size = BFD_ALIGN (s->size, (bfd_size_type)1 << align2);
4570 if (align2 > bfd_get_section_alignment (dynobj, s)
4571 && !bfd_set_section_alignment (dynobj, s, align2))
4572 return FALSE;
4573
4574 /* Define the symbol as being at this point in the section. */
4575 h->root.u.def.section = s;
4576 h->root.u.def.value = s->size;
4577
4578 /* Increment the section size to make room for the symbol. */
4579 s->size += h->size;
4580
4581 return TRUE;
4582 }
4583
4584 /* Worker function for nios2_elf32_size_dynamic_sections. */
4585 static bfd_boolean
4586 adjust_dynrelocs (struct elf_link_hash_entry *h, PTR inf)
4587 {
4588 struct bfd_link_info *info;
4589 struct elf32_nios2_link_hash_table *htab;
4590
4591 if (h->root.type == bfd_link_hash_indirect)
4592 return TRUE;
4593
4594 if (h->root.type == bfd_link_hash_warning)
4595 /* When warning symbols are created, they **replace** the "real"
4596 entry in the hash table, thus we never get to see the real
4597 symbol in a hash traversal. So look at it now. */
4598 h = (struct elf_link_hash_entry *) h->root.u.i.link;
4599
4600 info = (struct bfd_link_info *) inf;
4601 htab = elf32_nios2_hash_table (info);
4602
4603 if (h->plt.offset != (bfd_vma)-1)
4604 h->plt.offset += htab->res_n_size;
4605 if (htab->root.splt == h->root.u.def.section)
4606 h->root.u.def.value += htab->res_n_size;
4607
4608 return TRUE;
4609 }
4610
4611 /* Another worker function for nios2_elf32_size_dynamic_sections.
4612 Allocate space in .plt, .got and associated reloc sections for
4613 dynamic relocs. */
4614 static bfd_boolean
4615 allocate_dynrelocs (struct elf_link_hash_entry *h, PTR inf)
4616 {
4617 struct bfd_link_info *info;
4618 struct elf32_nios2_link_hash_table *htab;
4619 struct elf32_nios2_link_hash_entry *eh;
4620 struct elf32_nios2_dyn_relocs *p;
4621 int use_plt;
4622
4623 if (h->root.type == bfd_link_hash_indirect)
4624 return TRUE;
4625
4626 if (h->root.type == bfd_link_hash_warning)
4627 /* When warning symbols are created, they **replace** the "real"
4628 entry in the hash table, thus we never get to see the real
4629 symbol in a hash traversal. So look at it now. */
4630 h = (struct elf_link_hash_entry *) h->root.u.i.link;
4631
4632 info = (struct bfd_link_info *) inf;
4633 htab = elf32_nios2_hash_table (info);
4634
4635 if (htab->root.dynamic_sections_created
4636 && h->plt.refcount > 0)
4637 {
4638 /* Make sure this symbol is output as a dynamic symbol.
4639 Undefined weak syms won't yet be marked as dynamic. */
4640 if (h->dynindx == -1
4641 && !h->forced_local
4642 && !bfd_elf_link_record_dynamic_symbol (info, h))
4643 return FALSE;
4644
4645 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, info->shared, h))
4646 {
4647 asection *s = htab->root.splt;
4648
4649 /* Allocate room for the header. */
4650 if (s->size == 0)
4651 {
4652 if (info->shared)
4653 s->size = 24;
4654 else
4655 s->size = 28;
4656 }
4657
4658 h->plt.offset = s->size;
4659
4660 /* If this symbol is not defined in a regular file, and we are
4661 not generating a shared library, then set the symbol to this
4662 location in the .plt. This is required to make function
4663 pointers compare as equal between the normal executable and
4664 the shared library. */
4665 if (! info->shared
4666 && !h->def_regular)
4667 {
4668 h->root.u.def.section = s;
4669 h->root.u.def.value = h->plt.offset;
4670 }
4671
4672 /* Make room for this entry. */
4673 s->size += 12;
4674
4675 /* We also need to make an entry in the .rela.plt section. */
4676 htab->root.srelplt->size += sizeof (Elf32_External_Rela);
4677
4678 /* And the .got.plt section. */
4679 htab->root.sgotplt->size += 4;
4680 }
4681 else
4682 {
4683 h->plt.offset = (bfd_vma) -1;
4684 h->needs_plt = 0;
4685 }
4686 }
4687 else
4688 {
4689 h->plt.offset = (bfd_vma) -1;
4690 h->needs_plt = 0;
4691 }
4692
4693 eh = (struct elf32_nios2_link_hash_entry *) h;
4694 use_plt = (eh->got_types_used == CALL_USED
4695 && h->plt.offset != (bfd_vma) -1);
4696
4697 if (h->got.refcount > 0)
4698 {
4699 asection *s;
4700 bfd_boolean dyn;
4701 int tls_type = eh->tls_type;
4702 int indx;
4703
4704 /* Make sure this symbol is output as a dynamic symbol.
4705 Undefined weak syms won't yet be marked as dynamic. */
4706 if (h->dynindx == -1
4707 && !h->forced_local
4708 && !bfd_elf_link_record_dynamic_symbol (info, h))
4709 return FALSE;
4710
4711 s = htab->root.sgot;
4712 h->got.offset = s->size;
4713
4714 if (tls_type == GOT_UNKNOWN)
4715 abort ();
4716
4717 if (tls_type == GOT_NORMAL)
4718 /* Non-TLS symbols need one GOT slot. */
4719 s->size += 4;
4720 else
4721 {
4722 if (tls_type & GOT_TLS_GD)
4723 /* R_NIOS2_TLS_GD16 needs 2 consecutive GOT slots. */
4724 s->size += 8;
4725 if (tls_type & GOT_TLS_IE)
4726 /* R_NIOS2_TLS_IE16 needs one GOT slot. */
4727 s->size += 4;
4728 }
4729
4730 dyn = htab->root.dynamic_sections_created;
4731
4732 indx = 0;
4733 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
4734 && (!info->shared
4735 || !SYMBOL_REFERENCES_LOCAL (info, h)))
4736 indx = h->dynindx;
4737
4738 if (tls_type != GOT_NORMAL
4739 && (info->shared || indx != 0)
4740 && (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
4741 || h->root.type != bfd_link_hash_undefweak))
4742 {
4743 if (tls_type & GOT_TLS_IE)
4744 htab->root.srelgot->size += sizeof (Elf32_External_Rela);
4745
4746 if (tls_type & GOT_TLS_GD)
4747 htab->root.srelgot->size += sizeof (Elf32_External_Rela);
4748
4749 if ((tls_type & GOT_TLS_GD) && indx != 0)
4750 htab->root.srelgot->size += sizeof (Elf32_External_Rela);
4751 }
4752 else if ((ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
4753 || h->root.type != bfd_link_hash_undefweak)
4754 && !use_plt
4755 && (info->shared
4756 || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h)))
4757 htab->root.srelgot->size += sizeof (Elf32_External_Rela);
4758 }
4759 else
4760 h->got.offset = (bfd_vma) -1;
4761
4762 if (eh->dyn_relocs == NULL)
4763 return TRUE;
4764
4765 /* In the shared -Bsymbolic case, discard space allocated for
4766 dynamic pc-relative relocs against symbols which turn out to be
4767 defined in regular objects. For the normal shared case, discard
4768 space for pc-relative relocs that have become local due to symbol
4769 visibility changes. */
4770
4771 if (info->shared)
4772 {
4773 if (h->def_regular
4774 && (h->forced_local || info->symbolic))
4775 {
4776 struct elf32_nios2_dyn_relocs **pp;
4777
4778 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
4779 {
4780 p->count -= p->pc_count;
4781 p->pc_count = 0;
4782 if (p->count == 0)
4783 *pp = p->next;
4784 else
4785 pp = &p->next;
4786 }
4787 }
4788
4789 /* Also discard relocs on undefined weak syms with non-default
4790 visibility. */
4791 if (eh->dyn_relocs != NULL
4792 && h->root.type == bfd_link_hash_undefweak)
4793 {
4794 if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
4795 eh->dyn_relocs = NULL;
4796
4797 /* Make sure undefined weak symbols are output as a dynamic
4798 symbol in PIEs. */
4799 else if (h->dynindx == -1
4800 && !h->forced_local
4801 && !bfd_elf_link_record_dynamic_symbol (info, h))
4802 return FALSE;
4803 }
4804 }
4805 else
4806 {
4807 /* For the non-shared case, discard space for relocs against
4808 symbols which turn out to need copy relocs or are not
4809 dynamic. */
4810
4811 if (!h->non_got_ref
4812 && ((h->def_dynamic && !h->def_regular)
4813 || (htab->root.dynamic_sections_created
4814 && (h->root.type == bfd_link_hash_undefweak
4815 || h->root.type == bfd_link_hash_undefined))))
4816 {
4817 /* Make sure this symbol is output as a dynamic symbol.
4818 Undefined weak syms won't yet be marked as dynamic. */
4819 if (h->dynindx == -1
4820 && !h->forced_local
4821 && !bfd_elf_link_record_dynamic_symbol (info, h))
4822 return FALSE;
4823
4824 /* If that succeeded, we know we'll be keeping all the
4825 relocs. */
4826 if (h->dynindx != -1)
4827 goto keep;
4828 }
4829
4830 eh->dyn_relocs = NULL;
4831
4832 keep: ;
4833 }
4834
4835 /* Finally, allocate space. */
4836 for (p = eh->dyn_relocs; p != NULL; p = p->next)
4837 {
4838 asection *sreloc = elf_section_data (p->sec)->sreloc;
4839 sreloc->size += p->count * sizeof (Elf32_External_Rela);
4840 }
4841
4842 return TRUE;
4843 }
4844
4845 /* Implement elf_backend_size_dynamic_sections:
4846 Set the sizes of the dynamic sections. */
4847 static bfd_boolean
4848 nios2_elf32_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
4849 struct bfd_link_info *info)
4850 {
4851 bfd *dynobj;
4852 asection *s;
4853 bfd_boolean plt;
4854 bfd_boolean got;
4855 bfd_boolean relocs;
4856 bfd *ibfd;
4857 struct elf32_nios2_link_hash_table *htab;
4858
4859 htab = elf32_nios2_hash_table (info);
4860 dynobj = elf_hash_table (info)->dynobj;
4861 BFD_ASSERT (dynobj != NULL);
4862
4863 htab->res_n_size = 0;
4864 if (elf_hash_table (info)->dynamic_sections_created)
4865 {
4866 /* Set the contents of the .interp section to the interpreter. */
4867 if (info->executable)
4868 {
4869 s = bfd_get_linker_section (dynobj, ".interp");
4870 BFD_ASSERT (s != NULL);
4871 s->size = sizeof ELF_DYNAMIC_INTERPRETER;
4872 s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
4873 }
4874 }
4875 else
4876 {
4877 /* We may have created entries in the .rela.got section.
4878 However, if we are not creating the dynamic sections, we will
4879 not actually use these entries. Reset the size of .rela.got,
4880 which will cause it to get stripped from the output file
4881 below. */
4882 s = htab->root.srelgot;
4883 if (s != NULL)
4884 s->size = 0;
4885 }
4886
4887 /* Set up .got offsets for local syms, and space for local dynamic
4888 relocs. */
4889 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
4890 {
4891 bfd_signed_vma *local_got;
4892 bfd_signed_vma *end_local_got;
4893 char *local_tls_type;
4894 bfd_size_type locsymcount;
4895 Elf_Internal_Shdr *symtab_hdr;
4896 asection *srel;
4897
4898 if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour)
4899 continue;
4900
4901 for (s = ibfd->sections; s != NULL; s = s->next)
4902 {
4903 struct elf32_nios2_dyn_relocs *p;
4904
4905 for (p = elf_section_data (s)->local_dynrel; p != NULL; p = p->next)
4906 {
4907 if (!bfd_is_abs_section (p->sec)
4908 && bfd_is_abs_section (p->sec->output_section))
4909 {
4910 /* Input section has been discarded, either because
4911 it is a copy of a linkonce section or due to
4912 linker script /DISCARD/, so we'll be discarding
4913 the relocs too. */
4914 }
4915 else if (p->count != 0)
4916 {
4917 srel = elf_section_data (p->sec)->sreloc;
4918 srel->size += p->count * sizeof (Elf32_External_Rela);
4919 if ((p->sec->output_section->flags & SEC_READONLY) != 0)
4920 info->flags |= DF_TEXTREL;
4921 }
4922 }
4923 }
4924
4925 local_got = elf_local_got_refcounts (ibfd);
4926 if (!local_got)
4927 continue;
4928
4929 symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
4930 locsymcount = symtab_hdr->sh_info;
4931 end_local_got = local_got + locsymcount;
4932 local_tls_type = elf32_nios2_local_got_tls_type (ibfd);
4933 s = htab->root.sgot;
4934 srel = htab->root.srelgot;
4935 for (; local_got < end_local_got; ++local_got, ++local_tls_type)
4936 {
4937 if (*local_got > 0)
4938 {
4939 *local_got = s->size;
4940 if (*local_tls_type & GOT_TLS_GD)
4941 /* TLS_GD relocs need an 8-byte structure in the GOT. */
4942 s->size += 8;
4943 if (*local_tls_type & GOT_TLS_IE)
4944 s->size += 4;
4945 if (*local_tls_type == GOT_NORMAL)
4946 s->size += 4;
4947
4948 if (info->shared || *local_tls_type == GOT_TLS_GD)
4949 srel->size += sizeof (Elf32_External_Rela);
4950 }
4951 else
4952 *local_got = (bfd_vma) -1;
4953 }
4954 }
4955
4956 if (htab->tls_ldm_got.refcount > 0)
4957 {
4958 /* Allocate two GOT entries and one dynamic relocation (if necessary)
4959 for R_NIOS2_TLS_LDM16 relocations. */
4960 htab->tls_ldm_got.offset = htab->root.sgot->size;
4961 htab->root.sgot->size += 8;
4962 if (info->shared)
4963 htab->root.srelgot->size += sizeof (Elf32_External_Rela);
4964 }
4965 else
4966 htab->tls_ldm_got.offset = -1;
4967
4968 /* Allocate global sym .plt and .got entries, and space for global
4969 sym dynamic relocs. */
4970 elf_link_hash_traverse (& htab->root, allocate_dynrelocs, info);
4971
4972 if (elf_hash_table (info)->dynamic_sections_created)
4973 {
4974 /* If the .got section is more than 0x8000 bytes, we add
4975 0x8000 to the value of _gp_got, so that 16-bit relocations
4976 have a greater chance of working. */
4977 if (htab->root.sgot->size >= 0x8000
4978 && elf32_nios2_hash_table (info)->h_gp_got->root.u.def.value == 0)
4979 elf32_nios2_hash_table (info)->h_gp_got->root.u.def.value = 0x8000;
4980 }
4981
4982 /* The check_relocs and adjust_dynamic_symbol entry points have
4983 determined the sizes of the various dynamic sections. Allocate
4984 memory for them. */
4985 plt = FALSE;
4986 got = FALSE;
4987 relocs = FALSE;
4988 for (s = dynobj->sections; s != NULL; s = s->next)
4989 {
4990 const char *name;
4991
4992 if ((s->flags & SEC_LINKER_CREATED) == 0)
4993 continue;
4994
4995 /* It's OK to base decisions on the section name, because none
4996 of the dynobj section names depend upon the input files. */
4997 name = bfd_get_section_name (dynobj, s);
4998
4999 if (strcmp (name, ".plt") == 0)
5000 {
5001 /* Remember whether there is a PLT. */
5002 plt = s->size != 0;
5003
5004 /* Correct for the number of res_N branches. */
5005 if (plt && !info->shared)
5006 {
5007 htab->res_n_size = (s->size-28) / 3;
5008 s->size += htab->res_n_size;
5009 }
5010 }
5011 else if (CONST_STRNEQ (name, ".rela"))
5012 {
5013 if (s->size != 0)
5014 {
5015 relocs = TRUE;
5016
5017 /* We use the reloc_count field as a counter if we need
5018 to copy relocs into the output file. */
5019 s->reloc_count = 0;
5020 }
5021 }
5022 else if (CONST_STRNEQ (name, ".got"))
5023 got = s->size != 0;
5024 else if (strcmp (name, ".dynbss") != 0)
5025 /* It's not one of our sections, so don't allocate space. */
5026 continue;
5027
5028 if (s->size == 0)
5029 {
5030 /* If we don't need this section, strip it from the
5031 output file. This is mostly to handle .rela.bss and
5032 .rela.plt. We must create both sections in
5033 create_dynamic_sections, because they must be created
5034 before the linker maps input sections to output
5035 sections. The linker does that before
5036 adjust_dynamic_symbol is called, and it is that
5037 function which decides whether anything needs to go
5038 into these sections. */
5039 s->flags |= SEC_EXCLUDE;
5040 continue;
5041 }
5042
5043 if ((s->flags & SEC_HAS_CONTENTS) == 0)
5044 continue;
5045
5046 /* Allocate memory for the section contents. */
5047 /* FIXME: This should be a call to bfd_alloc not bfd_zalloc.
5048 Unused entries should be reclaimed before the section's contents
5049 are written out, but at the moment this does not happen. Thus in
5050 order to prevent writing out garbage, we initialize the section's
5051 contents to zero. */
5052 s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->size);
5053 if (s->contents == NULL)
5054 return FALSE;
5055 }
5056
5057 /* Adjust dynamic symbols that point to the plt to account for the
5058 now-known number of resN slots. */
5059 if (htab->res_n_size)
5060 elf_link_hash_traverse (& htab->root, adjust_dynrelocs, info);
5061
5062 if (elf_hash_table (info)->dynamic_sections_created)
5063 {
5064 /* Add some entries to the .dynamic section. We fill in the
5065 values later, in elf_nios2_finish_dynamic_sections, but we
5066 must add the entries now so that we get the correct size for
5067 the .dynamic section. The DT_DEBUG entry is filled in by the
5068 dynamic linker and used by the debugger. */
5069 #define add_dynamic_entry(TAG, VAL) \
5070 _bfd_elf_add_dynamic_entry (info, TAG, VAL)
5071
5072 if (!info->shared && !add_dynamic_entry (DT_DEBUG, 0))
5073 return FALSE;
5074
5075 if (got && !add_dynamic_entry (DT_PLTGOT, 0))
5076 return FALSE;
5077
5078 if (plt
5079 && (!add_dynamic_entry (DT_PLTRELSZ, 0)
5080 || !add_dynamic_entry (DT_PLTREL, DT_RELA)
5081 || !add_dynamic_entry (DT_JMPREL, 0)))
5082 return FALSE;
5083
5084 if (relocs
5085 && (!add_dynamic_entry (DT_RELA, 0)
5086 || !add_dynamic_entry (DT_RELASZ, 0)
5087 || !add_dynamic_entry (DT_RELAENT, sizeof (Elf32_External_Rela))))
5088 return FALSE;
5089
5090 if (!info->shared && !add_dynamic_entry (DT_NIOS2_GP, 0))
5091 return FALSE;
5092
5093 if ((info->flags & DF_TEXTREL) != 0
5094 && !add_dynamic_entry (DT_TEXTREL, 0))
5095 return FALSE;
5096 }
5097 #undef add_dynamic_entry
5098
5099 return TRUE;
5100 }
5101
5102 /* Implement bfd_elf32_bfd_link_hash_table_create. */
5103 static struct bfd_link_hash_table *
5104 nios2_elf32_link_hash_table_create (bfd *abfd)
5105 {
5106 struct elf32_nios2_link_hash_table *ret;
5107 bfd_size_type amt = sizeof (struct elf32_nios2_link_hash_table);
5108
5109 ret = bfd_zmalloc (amt);
5110 if (ret == NULL)
5111 return NULL;
5112
5113 if (!_bfd_elf_link_hash_table_init (&ret->root, abfd,
5114 link_hash_newfunc,
5115 sizeof (struct
5116 elf32_nios2_link_hash_entry),
5117 NIOS2_ELF_DATA))
5118 {
5119 free (ret);
5120 return NULL;
5121 }
5122
5123 /* Init the stub hash table too. */
5124 if (!bfd_hash_table_init (&ret->bstab, stub_hash_newfunc,
5125 sizeof (struct elf32_nios2_stub_hash_entry)))
5126 return NULL;
5127
5128 return &ret->root.root;
5129 }
5130
5131 /* Free the derived linker hash table. */
5132 static void
5133 nios2_elf32_link_hash_table_free (struct bfd_link_hash_table *btab)
5134 {
5135 struct elf32_nios2_link_hash_table *htab
5136 = (struct elf32_nios2_link_hash_table *) btab;
5137
5138 bfd_hash_table_free (&htab->bstab);
5139 _bfd_elf_link_hash_table_free (btab);
5140 }
5141
5142 /* Implement elf_backend_reloc_type_class. */
5143 static enum elf_reloc_type_class
5144 nios2_elf32_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED,
5145 const asection *rel_sec ATTRIBUTE_UNUSED,
5146 const Elf_Internal_Rela *rela)
5147 {
5148 switch ((int) ELF32_R_TYPE (rela->r_info))
5149 {
5150 case R_NIOS2_RELATIVE:
5151 return reloc_class_relative;
5152 case R_NIOS2_JUMP_SLOT:
5153 return reloc_class_plt;
5154 case R_NIOS2_COPY:
5155 return reloc_class_copy;
5156 default:
5157 return reloc_class_normal;
5158 }
5159 }
5160
5161 /* Return 1 if target is one of ours. */
5162 static bfd_boolean
5163 is_nios2_elf_target (const struct bfd_target *targ)
5164 {
5165 return (targ == &bfd_elf32_littlenios2_vec
5166 || targ == &bfd_elf32_bignios2_vec);
5167 }
5168
5169 /* Implement elf_backend_add_symbol_hook.
5170 This hook is called by the linker when adding symbols from an object
5171 file. We use it to put .comm items in .sbss, and not .bss. */
5172 static bfd_boolean
5173 nios2_elf_add_symbol_hook (bfd *abfd,
5174 struct bfd_link_info *info,
5175 Elf_Internal_Sym *sym,
5176 const char **namep ATTRIBUTE_UNUSED,
5177 flagword *flagsp ATTRIBUTE_UNUSED,
5178 asection **secp,
5179 bfd_vma *valp)
5180 {
5181 bfd *dynobj;
5182
5183 if (sym->st_shndx == SHN_COMMON
5184 && !info->relocatable
5185 && sym->st_size <= elf_gp_size (abfd)
5186 && is_nios2_elf_target (info->output_bfd->xvec))
5187 {
5188 /* Common symbols less than or equal to -G nn bytes are automatically
5189 put into .sbss. */
5190 struct elf32_nios2_link_hash_table *htab;
5191
5192 htab = elf32_nios2_hash_table (info);
5193 if (htab->sbss == NULL)
5194 {
5195 flagword flags = SEC_IS_COMMON | SEC_LINKER_CREATED;
5196
5197 dynobj = elf_hash_table (info)->dynobj;
5198 if (!dynobj)
5199 dynobj = abfd;
5200
5201 htab->sbss = bfd_make_section_anyway_with_flags (dynobj, ".sbss",
5202 flags);
5203 if (htab->sbss == NULL)
5204 return FALSE;
5205 }
5206
5207 *secp = htab->sbss;
5208 *valp = sym->st_size;
5209 }
5210
5211 return TRUE;
5212 }
5213
5214 /* Implement elf_backend_can_make_relative_eh_frame:
5215 Decide whether to attempt to turn absptr or lsda encodings in
5216 shared libraries into pcrel within the given input section. */
5217 static bfd_boolean
5218 nios2_elf32_can_make_relative_eh_frame (bfd *input_bfd ATTRIBUTE_UNUSED,
5219 struct bfd_link_info *info
5220 ATTRIBUTE_UNUSED,
5221 asection *eh_frame_section
5222 ATTRIBUTE_UNUSED)
5223 {
5224 /* We can't use PC-relative encodings in the .eh_frame section. */
5225 return FALSE;
5226 }
5227
5228 /* Implement elf_backend_special_sections. */
5229 const struct bfd_elf_special_section elf32_nios2_special_sections[] =
5230 {
5231 { STRING_COMMA_LEN (".sbss"), -2, SHT_NOBITS,
5232 SHF_ALLOC + SHF_WRITE + SHF_NIOS2_GPREL },
5233 { STRING_COMMA_LEN (".sdata"), -2, SHT_PROGBITS,
5234 SHF_ALLOC + SHF_WRITE + SHF_NIOS2_GPREL },
5235 { NULL, 0, 0, 0, 0 }
5236 };
5237
5238 #define ELF_ARCH bfd_arch_nios2
5239 #define ELF_TARGET_ID NIOS2_ELF_DATA
5240 #define ELF_MACHINE_CODE EM_ALTERA_NIOS2
5241
5242 /* The Nios II MMU uses a 4K page size. */
5243
5244 #define ELF_MAXPAGESIZE 0x1000
5245
5246 #define bfd_elf32_bfd_link_hash_table_create \
5247 nios2_elf32_link_hash_table_create
5248 #define bfd_elf32_bfd_link_hash_table_free \
5249 nios2_elf32_link_hash_table_free
5250
5251 /* Relocation table lookup macros. */
5252
5253 #define bfd_elf32_bfd_reloc_type_lookup nios2_elf32_bfd_reloc_type_lookup
5254 #define bfd_elf32_bfd_reloc_name_lookup nios2_elf32_bfd_reloc_name_lookup
5255
5256 /* JUMP_TABLE_LINK macros. */
5257
5258 /* elf_info_to_howto (using RELA relocations). */
5259
5260 #define elf_info_to_howto nios2_elf32_info_to_howto
5261
5262 /* elf backend functions. */
5263
5264 #define elf_backend_can_gc_sections 1
5265 #define elf_backend_can_refcount 1
5266 #define elf_backend_plt_readonly 1
5267 #define elf_backend_want_got_plt 1
5268 #define elf_backend_rela_normal 1
5269
5270 #define elf_backend_relocate_section nios2_elf32_relocate_section
5271 #define elf_backend_section_flags nios2_elf32_section_flags
5272 #define elf_backend_fake_sections nios2_elf32_fake_sections
5273 #define elf_backend_check_relocs nios2_elf32_check_relocs
5274
5275 #define elf_backend_gc_mark_hook nios2_elf32_gc_mark_hook
5276 #define elf_backend_gc_sweep_hook nios2_elf32_gc_sweep_hook
5277 #define elf_backend_create_dynamic_sections \
5278 nios2_elf32_create_dynamic_sections
5279 #define elf_backend_finish_dynamic_symbol nios2_elf32_finish_dynamic_symbol
5280 #define elf_backend_finish_dynamic_sections \
5281 nios2_elf32_finish_dynamic_sections
5282 #define elf_backend_adjust_dynamic_symbol nios2_elf32_adjust_dynamic_symbol
5283 #define elf_backend_reloc_type_class nios2_elf32_reloc_type_class
5284 #define elf_backend_size_dynamic_sections nios2_elf32_size_dynamic_sections
5285 #define elf_backend_add_symbol_hook nios2_elf_add_symbol_hook
5286 #define elf_backend_copy_indirect_symbol nios2_elf32_copy_indirect_symbol
5287
5288 #define elf_backend_grok_prstatus nios2_grok_prstatus
5289 #define elf_backend_grok_psinfo nios2_grok_psinfo
5290
5291 #undef elf_backend_can_make_relative_eh_frame
5292 #define elf_backend_can_make_relative_eh_frame \
5293 nios2_elf32_can_make_relative_eh_frame
5294
5295 #define elf_backend_special_sections elf32_nios2_special_sections
5296
5297 #define TARGET_LITTLE_SYM bfd_elf32_littlenios2_vec
5298 #define TARGET_LITTLE_NAME "elf32-littlenios2"
5299 #define TARGET_BIG_SYM bfd_elf32_bignios2_vec
5300 #define TARGET_BIG_NAME "elf32-bignios2"
5301
5302 #define elf_backend_got_header_size 12
5303
5304 #include "elf32-target.h"
This page took 0.130308 seconds and 3 git commands to generate.