1 /* 32-bit ELF support for Nios II.
2 Copyright (C) 2012-2016 Free Software Foundation, Inc.
3 Contributed by Nigel Gray (ngray@altera.com).
4 Contributed by Mentor Graphics, Inc.
6 This file is part of BFD, the Binary File Descriptor library.
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.
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.
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. */
23 /* This file handles Altera Nios II ELF targets. */
31 #include "elf/nios2.h"
32 #include "opcode/nios2.h"
33 #include "elf32-nios2.h"
35 /* Use RELA relocations. */
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 **);
71 extern const bfd_target nios2_elf32_le_vec;
72 extern const bfd_target nios2_elf32_be_vec;
74 /* Offset of tp and dtp pointers from start of TLS block. */
75 #define TP_OFFSET 0x7000
76 #define DTP_OFFSET 0x8000
78 /* The relocation tables used for SHT_REL sections. There are separate
79 tables for R1 and R2 encodings. */
80 static reloc_howto_type elf_nios2_r1_howto_table_rel[] = {
82 HOWTO (R_NIOS2_NONE, /* type */
84 3, /* size (0 = byte, 1 = short, 2 = long) */
86 FALSE, /* pc_relative */
88 complain_overflow_dont, /* complain_on_overflow */
89 bfd_elf_generic_reloc, /* special_function */
90 "R_NIOS2_NONE", /* name */
91 FALSE, /* partial_inplace */
94 FALSE), /* pcrel_offset */
96 /* 16-bit signed immediate relocation. */
97 HOWTO (R_NIOS2_S16, /* type */
99 2, /* size (0 = byte, 1 = short, 2 = long) */
101 FALSE, /* pc_relative */
103 complain_overflow_signed, /* complain on overflow */
104 bfd_elf_generic_reloc, /* special function */
105 "R_NIOS2_S16", /* name */
106 FALSE, /* partial_inplace */
107 0x003fffc0, /* src_mask */
108 0x003fffc0, /* dest_mask */
109 FALSE), /* pcrel_offset */
111 /* 16-bit unsigned immediate relocation. */
112 HOWTO (R_NIOS2_U16, /* type */
114 2, /* size (0 = byte, 1 = short, 2 = long) */
116 FALSE, /* pc_relative */
118 complain_overflow_unsigned, /* complain on overflow */
119 bfd_elf_generic_reloc, /* special function */
120 "R_NIOS2_U16", /* name */
121 FALSE, /* partial_inplace */
122 0x003fffc0, /* src_mask */
123 0x003fffc0, /* dest_mask */
124 FALSE), /* pcrel_offset */
126 HOWTO (R_NIOS2_PCREL16, /* type */
128 2, /* size (0 = byte, 1 = short, 2 = long) */
130 TRUE, /* pc_relative */
132 complain_overflow_signed, /* complain on overflow */
133 nios2_elf32_pcrel16_relocate, /* special function */
134 "R_NIOS2_PCREL16", /* name */
135 FALSE, /* partial_inplace */
136 0x003fffc0, /* src_mask */
137 0x003fffc0, /* dest_mask */
138 TRUE), /* pcrel_offset */
140 HOWTO (R_NIOS2_CALL26, /* type */
142 2, /* size (0 = byte, 1 = short, 2 = long) */
144 FALSE, /* pc_relative */
146 complain_overflow_dont, /* complain on overflow */
147 nios2_elf32_call26_relocate, /* special function */
148 "R_NIOS2_CALL26", /* name */
149 FALSE, /* partial_inplace */
150 0xffffffc0, /* src_mask */
151 0xffffffc0, /* dst_mask */
152 FALSE), /* pcrel_offset */
160 complain_overflow_bitfield,
161 bfd_elf_generic_reloc,
168 HOWTO (R_NIOS2_CACHE_OPX,
174 complain_overflow_bitfield,
175 bfd_elf_generic_reloc,
188 complain_overflow_bitfield,
189 bfd_elf_generic_reloc,
202 complain_overflow_bitfield,
203 bfd_elf_generic_reloc,
216 complain_overflow_dont,
217 nios2_elf32_hi16_relocate,
230 complain_overflow_dont,
231 nios2_elf32_lo16_relocate,
238 HOWTO (R_NIOS2_HIADJ16,
244 complain_overflow_dont,
245 nios2_elf32_hiadj16_relocate,
252 HOWTO (R_NIOS2_BFD_RELOC_32,
258 complain_overflow_dont,
259 bfd_elf_generic_reloc,
260 "R_NIOS2_BFD_RELOC32",
266 HOWTO (R_NIOS2_BFD_RELOC_16,
272 complain_overflow_bitfield,
273 bfd_elf_generic_reloc,
274 "R_NIOS2_BFD_RELOC16",
280 HOWTO (R_NIOS2_BFD_RELOC_8,
286 complain_overflow_bitfield,
287 bfd_elf_generic_reloc,
288 "R_NIOS2_BFD_RELOC8",
294 HOWTO (R_NIOS2_GPREL,
300 complain_overflow_dont,
301 nios2_elf32_gprel_relocate,
308 HOWTO (R_NIOS2_GNU_VTINHERIT,
314 complain_overflow_dont,
316 "R_NIOS2_GNU_VTINHERIT",
322 HOWTO (R_NIOS2_GNU_VTENTRY,
328 complain_overflow_dont,
329 _bfd_elf_rel_vtable_reloc_fn,
330 "R_NIOS2_GNU_VTENTRY",
342 complain_overflow_dont,
343 nios2_elf32_ujmp_relocate,
356 complain_overflow_dont,
357 nios2_elf32_cjmp_relocate,
364 HOWTO (R_NIOS2_CALLR,
370 complain_overflow_dont,
371 nios2_elf32_callr_relocate,
378 HOWTO (R_NIOS2_ALIGN,
384 complain_overflow_dont,
385 nios2_elf32_ignore_reloc,
393 HOWTO (R_NIOS2_GOT16,
399 complain_overflow_bitfield,
400 bfd_elf_generic_reloc,
407 HOWTO (R_NIOS2_CALL16,
413 complain_overflow_bitfield,
414 bfd_elf_generic_reloc,
421 HOWTO (R_NIOS2_GOTOFF_LO,
427 complain_overflow_dont,
428 bfd_elf_generic_reloc,
435 HOWTO (R_NIOS2_GOTOFF_HA,
441 complain_overflow_dont,
442 bfd_elf_generic_reloc,
449 HOWTO (R_NIOS2_PCREL_LO,
455 complain_overflow_dont,
456 nios2_elf32_pcrel_lo16_relocate,
463 HOWTO (R_NIOS2_PCREL_HA,
467 FALSE, /* This is a PC-relative relocation, but we need to subtract
468 PC ourselves before the HIADJ. */
470 complain_overflow_dont,
471 nios2_elf32_pcrel_hiadj16_relocate,
478 HOWTO (R_NIOS2_TLS_GD16,
484 complain_overflow_bitfield,
485 bfd_elf_generic_reloc,
492 HOWTO (R_NIOS2_TLS_LDM16,
498 complain_overflow_bitfield,
499 bfd_elf_generic_reloc,
506 HOWTO (R_NIOS2_TLS_LDO16,
512 complain_overflow_bitfield,
513 bfd_elf_generic_reloc,
520 HOWTO (R_NIOS2_TLS_IE16,
526 complain_overflow_bitfield,
527 bfd_elf_generic_reloc,
534 HOWTO (R_NIOS2_TLS_LE16,
540 complain_overflow_bitfield,
541 bfd_elf_generic_reloc,
548 HOWTO (R_NIOS2_TLS_DTPMOD,
554 complain_overflow_dont,
555 bfd_elf_generic_reloc,
556 "R_NIOS2_TLS_DTPMOD",
562 HOWTO (R_NIOS2_TLS_DTPREL,
568 complain_overflow_dont,
569 bfd_elf_generic_reloc,
570 "R_NIOS2_TLS_DTPREL",
576 HOWTO (R_NIOS2_TLS_TPREL,
582 complain_overflow_dont,
583 bfd_elf_generic_reloc,
596 complain_overflow_dont,
597 bfd_elf_generic_reloc,
604 HOWTO (R_NIOS2_GLOB_DAT,
610 complain_overflow_dont,
611 bfd_elf_generic_reloc,
618 HOWTO (R_NIOS2_JUMP_SLOT,
624 complain_overflow_dont,
625 bfd_elf_generic_reloc,
632 HOWTO (R_NIOS2_RELATIVE,
638 complain_overflow_dont,
639 bfd_elf_generic_reloc,
646 HOWTO (R_NIOS2_GOTOFF,
652 complain_overflow_dont,
653 bfd_elf_generic_reloc,
660 HOWTO (R_NIOS2_CALL26_NOAT, /* type */
662 2, /* size (0 = byte, 1 = short, 2 = long) */
664 FALSE, /* pc_relative */
666 complain_overflow_dont, /* complain on overflow */
667 nios2_elf32_call26_relocate, /* special function */
668 "R_NIOS2_CALL26_NOAT", /* name */
669 FALSE, /* partial_inplace */
670 0xffffffc0, /* src_mask */
671 0xffffffc0, /* dst_mask */
672 FALSE), /* pcrel_offset */
674 HOWTO (R_NIOS2_GOT_LO,
680 complain_overflow_dont,
681 bfd_elf_generic_reloc,
688 HOWTO (R_NIOS2_GOT_HA,
694 complain_overflow_dont,
695 bfd_elf_generic_reloc,
702 HOWTO (R_NIOS2_CALL_LO,
708 complain_overflow_dont,
709 bfd_elf_generic_reloc,
716 HOWTO (R_NIOS2_CALL_HA,
722 complain_overflow_dont,
723 bfd_elf_generic_reloc,
730 /* Add other relocations here. */
733 static reloc_howto_type elf_nios2_r2_howto_table_rel[] = {
735 HOWTO (R_NIOS2_NONE, /* type */
737 0, /* size (0 = byte, 1 = short, 2 = long) */
739 FALSE, /* pc_relative */
741 complain_overflow_dont, /* complain_on_overflow */
742 bfd_elf_generic_reloc, /* special_function */
743 "R_NIOS2_NONE", /* name */
744 FALSE, /* partial_inplace */
747 FALSE), /* pcrel_offset */
749 /* 16-bit signed immediate relocation. */
750 HOWTO (R_NIOS2_S16, /* type */
752 2, /* size (0 = byte, 1 = short, 2 = long) */
754 FALSE, /* pc_relative */
756 complain_overflow_signed, /* complain on overflow */
757 bfd_elf_generic_reloc, /* special function */
758 "R_NIOS2_S16", /* name */
759 FALSE, /* partial_inplace */
760 0xffff0000, /* src_mask */
761 0xffff0000, /* dest_mask */
762 FALSE), /* pcrel_offset */
764 /* 16-bit unsigned immediate relocation. */
765 HOWTO (R_NIOS2_U16, /* type */
767 2, /* size (0 = byte, 1 = short, 2 = long) */
769 FALSE, /* pc_relative */
771 complain_overflow_unsigned, /* complain on overflow */
772 bfd_elf_generic_reloc, /* special function */
773 "R_NIOS2_U16", /* name */
774 FALSE, /* partial_inplace */
775 0xffff0000, /* src_mask */
776 0xffff0000, /* dest_mask */
777 FALSE), /* pcrel_offset */
779 HOWTO (R_NIOS2_PCREL16, /* type */
781 2, /* size (0 = byte, 1 = short, 2 = long) */
783 TRUE, /* pc_relative */
785 complain_overflow_signed, /* complain on overflow */
786 nios2_elf32_pcrel16_relocate, /* special function */
787 "R_NIOS2_PCREL16", /* name */
788 FALSE, /* partial_inplace */
789 0xffff0000, /* src_mask */
790 0xffff0000, /* dest_mask */
791 TRUE), /* pcrel_offset */
793 HOWTO (R_NIOS2_CALL26, /* type */
795 2, /* size (0 = byte, 1 = short, 2 = long) */
797 FALSE, /* pc_relative */
799 complain_overflow_dont, /* complain on overflow */
800 nios2_elf32_call26_relocate, /* special function */
801 "R_NIOS2_CALL26", /* name */
802 FALSE, /* partial_inplace */
803 0xffffffc0, /* src_mask */
804 0xffffffc0, /* dst_mask */
805 FALSE), /* pcrel_offset */
813 complain_overflow_bitfield,
814 bfd_elf_generic_reloc,
821 HOWTO (R_NIOS2_CACHE_OPX,
827 complain_overflow_bitfield,
828 bfd_elf_generic_reloc,
841 complain_overflow_bitfield,
842 bfd_elf_generic_reloc,
855 complain_overflow_bitfield,
856 bfd_elf_generic_reloc,
869 complain_overflow_dont,
870 nios2_elf32_hi16_relocate,
883 complain_overflow_dont,
884 nios2_elf32_lo16_relocate,
891 HOWTO (R_NIOS2_HIADJ16,
897 complain_overflow_dont,
898 nios2_elf32_hiadj16_relocate,
905 HOWTO (R_NIOS2_BFD_RELOC_32,
911 complain_overflow_dont,
912 bfd_elf_generic_reloc,
913 "R_NIOS2_BFD_RELOC32",
919 HOWTO (R_NIOS2_BFD_RELOC_16,
925 complain_overflow_bitfield,
926 bfd_elf_generic_reloc,
927 "R_NIOS2_BFD_RELOC16",
933 HOWTO (R_NIOS2_BFD_RELOC_8,
939 complain_overflow_bitfield,
940 bfd_elf_generic_reloc,
941 "R_NIOS2_BFD_RELOC8",
947 HOWTO (R_NIOS2_GPREL,
953 complain_overflow_dont,
954 nios2_elf32_gprel_relocate,
961 HOWTO (R_NIOS2_GNU_VTINHERIT,
967 complain_overflow_dont,
969 "R_NIOS2_GNU_VTINHERIT",
975 HOWTO (R_NIOS2_GNU_VTENTRY,
981 complain_overflow_dont,
982 _bfd_elf_rel_vtable_reloc_fn,
983 "R_NIOS2_GNU_VTENTRY",
995 complain_overflow_dont,
996 nios2_elf32_ujmp_relocate,
1003 HOWTO (R_NIOS2_CJMP,
1009 complain_overflow_dont,
1010 nios2_elf32_cjmp_relocate,
1017 HOWTO (R_NIOS2_CALLR,
1023 complain_overflow_dont,
1024 nios2_elf32_callr_relocate,
1031 HOWTO (R_NIOS2_ALIGN,
1037 complain_overflow_dont,
1038 nios2_elf32_ignore_reloc,
1045 HOWTO (R_NIOS2_GOT16,
1051 complain_overflow_bitfield,
1052 bfd_elf_generic_reloc,
1059 HOWTO (R_NIOS2_CALL16,
1065 complain_overflow_bitfield,
1066 bfd_elf_generic_reloc,
1073 HOWTO (R_NIOS2_GOTOFF_LO,
1079 complain_overflow_dont,
1080 bfd_elf_generic_reloc,
1081 "R_NIOS2_GOTOFF_LO",
1087 HOWTO (R_NIOS2_GOTOFF_HA,
1093 complain_overflow_dont,
1094 bfd_elf_generic_reloc,
1095 "R_NIOS2_GOTOFF_HA",
1101 HOWTO (R_NIOS2_PCREL_LO,
1107 complain_overflow_dont,
1108 nios2_elf32_pcrel_lo16_relocate,
1115 HOWTO (R_NIOS2_PCREL_HA,
1119 FALSE, /* This is a PC-relative relocation, but we need to subtract
1120 PC ourselves before the HIADJ. */
1122 complain_overflow_dont,
1123 nios2_elf32_pcrel_hiadj16_relocate,
1130 HOWTO (R_NIOS2_TLS_GD16,
1136 complain_overflow_bitfield,
1137 bfd_elf_generic_reloc,
1144 HOWTO (R_NIOS2_TLS_LDM16,
1150 complain_overflow_bitfield,
1151 bfd_elf_generic_reloc,
1152 "R_NIOS2_TLS_LDM16",
1158 HOWTO (R_NIOS2_TLS_LDO16,
1164 complain_overflow_bitfield,
1165 bfd_elf_generic_reloc,
1166 "R_NIOS2_TLS_LDO16",
1172 HOWTO (R_NIOS2_TLS_IE16,
1178 complain_overflow_bitfield,
1179 bfd_elf_generic_reloc,
1186 HOWTO (R_NIOS2_TLS_LE16,
1192 complain_overflow_bitfield,
1193 bfd_elf_generic_reloc,
1200 HOWTO (R_NIOS2_TLS_DTPMOD,
1206 complain_overflow_dont,
1207 bfd_elf_generic_reloc,
1208 "R_NIOS2_TLS_DTPMOD",
1214 HOWTO (R_NIOS2_TLS_DTPREL,
1220 complain_overflow_dont,
1221 bfd_elf_generic_reloc,
1222 "R_NIOS2_TLS_DTPREL",
1228 HOWTO (R_NIOS2_TLS_TPREL,
1234 complain_overflow_dont,
1235 bfd_elf_generic_reloc,
1236 "R_NIOS2_TLS_TPREL",
1242 HOWTO (R_NIOS2_COPY,
1248 complain_overflow_dont,
1249 bfd_elf_generic_reloc,
1256 HOWTO (R_NIOS2_GLOB_DAT,
1262 complain_overflow_dont,
1263 bfd_elf_generic_reloc,
1270 HOWTO (R_NIOS2_JUMP_SLOT,
1276 complain_overflow_dont,
1277 bfd_elf_generic_reloc,
1278 "R_NIOS2_JUMP_SLOT",
1284 HOWTO (R_NIOS2_RELATIVE,
1290 complain_overflow_dont,
1291 bfd_elf_generic_reloc,
1298 HOWTO (R_NIOS2_GOTOFF,
1304 complain_overflow_dont,
1305 bfd_elf_generic_reloc,
1312 HOWTO (R_NIOS2_CALL26_NOAT, /* type */
1314 2, /* size (0 = byte, 1 = short, 2 = long) */
1316 FALSE, /* pc_relative */
1318 complain_overflow_dont, /* complain on overflow */
1319 nios2_elf32_call26_relocate, /* special function */
1320 "R_NIOS2_CALL26_NOAT", /* name */
1321 FALSE, /* partial_inplace */
1322 0xffffffc0, /* src_mask */
1323 0xffffffc0, /* dst_mask */
1324 FALSE), /* pcrel_offset */
1326 HOWTO (R_NIOS2_GOT_LO,
1332 complain_overflow_dont,
1333 bfd_elf_generic_reloc,
1340 HOWTO (R_NIOS2_GOT_HA,
1346 complain_overflow_dont,
1347 bfd_elf_generic_reloc,
1354 HOWTO (R_NIOS2_CALL_LO,
1360 complain_overflow_dont,
1361 bfd_elf_generic_reloc,
1368 HOWTO (R_NIOS2_CALL_HA,
1374 complain_overflow_dont,
1375 bfd_elf_generic_reloc,
1382 HOWTO (R_NIOS2_R2_S12,
1388 complain_overflow_signed,
1389 bfd_elf_generic_reloc,
1396 HOWTO (R_NIOS2_R2_I10_1_PCREL,
1402 complain_overflow_signed,
1403 bfd_elf_generic_reloc, /* FIXME? */
1404 "R_NIOS2_R2_I10_1_PCREL",
1410 HOWTO (R_NIOS2_R2_T1I7_1_PCREL,
1416 complain_overflow_signed,
1417 bfd_elf_generic_reloc, /* FIXME? */
1418 "R_NIOS2_R2_T1I7_1_PCREL",
1424 HOWTO (R_NIOS2_R2_T1I7_2,
1430 complain_overflow_unsigned,
1431 bfd_elf_generic_reloc,
1432 "R_NIOS2_R2_T1I7_2",
1438 HOWTO (R_NIOS2_R2_T2I4,
1444 complain_overflow_unsigned,
1445 bfd_elf_generic_reloc,
1452 HOWTO (R_NIOS2_R2_T2I4_1,
1458 complain_overflow_unsigned,
1459 bfd_elf_generic_reloc,
1460 "R_NIOS2_R2_T2I4_1",
1466 HOWTO (R_NIOS2_R2_T2I4_2,
1472 complain_overflow_unsigned,
1473 bfd_elf_generic_reloc,
1474 "R_NIOS2_R2_T2I4_2",
1480 HOWTO (R_NIOS2_R2_X1I7_2,
1486 complain_overflow_unsigned,
1487 bfd_elf_generic_reloc,
1488 "R_NIOS2_R2_X1I7_2",
1494 HOWTO (R_NIOS2_R2_X2L5,
1500 complain_overflow_unsigned,
1501 bfd_elf_generic_reloc,
1508 HOWTO (R_NIOS2_R2_F1I5_2,
1514 complain_overflow_unsigned,
1515 bfd_elf_generic_reloc,
1516 "R_NIOS2_R2_F1L5_2",
1522 HOWTO (R_NIOS2_R2_L5I4X1,
1528 complain_overflow_unsigned,
1529 bfd_elf_generic_reloc,
1530 "R_NIOS2_R2_L5I4X1",
1536 HOWTO (R_NIOS2_R2_T1X1I6,
1542 complain_overflow_unsigned,
1543 bfd_elf_generic_reloc,
1544 "R_NIOS2_R2_T1X1I6",
1550 HOWTO (R_NIOS2_R2_T1X1I6_2,
1556 complain_overflow_unsigned,
1557 bfd_elf_generic_reloc,
1558 "R_NIOS2_R2_T1I1X6_2",
1564 /* Add other relocations here. */
1567 static unsigned char elf_code_to_howto_index[R_NIOS2_ILLEGAL + 1];
1570 /* Return true if producing output for a R2 BFD. */
1571 #define BFD_IS_R2(abfd) (bfd_get_mach (abfd) == bfd_mach_nios2r2)
1573 /* Return the howto for relocation RTYPE. */
1574 static reloc_howto_type *
1575 lookup_howto (unsigned int rtype, bfd *abfd)
1577 static int initialized = 0;
1579 /* R2 relocations are a superset of R1, so use that for the lookup
1581 int r1_howto_tbl_size = (int) (sizeof (elf_nios2_r1_howto_table_rel)
1582 / sizeof (elf_nios2_r1_howto_table_rel[0]));
1583 int r2_howto_tbl_size = (int) (sizeof (elf_nios2_r2_howto_table_rel)
1584 / sizeof (elf_nios2_r2_howto_table_rel[0]));
1589 memset (elf_code_to_howto_index, 0xff,
1590 sizeof (elf_code_to_howto_index));
1591 for (i = 0; i < r2_howto_tbl_size; i++)
1593 elf_code_to_howto_index[elf_nios2_r2_howto_table_rel[i].type] = i;
1594 if (i < r1_howto_tbl_size)
1595 BFD_ASSERT (elf_nios2_r2_howto_table_rel[i].type
1596 == elf_nios2_r1_howto_table_rel[i].type);
1600 BFD_ASSERT (rtype <= R_NIOS2_ILLEGAL);
1601 i = elf_code_to_howto_index[rtype];
1602 if (BFD_IS_R2 (abfd))
1604 if (i >= r2_howto_tbl_size)
1606 return elf_nios2_r2_howto_table_rel + i;
1610 if (i >= r1_howto_tbl_size)
1612 return elf_nios2_r1_howto_table_rel + i;
1616 /* Map for converting BFD reloc types to Nios II reloc types. */
1617 struct elf_reloc_map
1619 bfd_reloc_code_real_type bfd_val;
1620 enum elf_nios2_reloc_type elf_val;
1623 static const struct elf_reloc_map nios2_reloc_map[] = {
1624 {BFD_RELOC_NONE, R_NIOS2_NONE},
1625 {BFD_RELOC_NIOS2_S16, R_NIOS2_S16},
1626 {BFD_RELOC_NIOS2_U16, R_NIOS2_U16},
1627 {BFD_RELOC_16_PCREL, R_NIOS2_PCREL16},
1628 {BFD_RELOC_NIOS2_CALL26, R_NIOS2_CALL26},
1629 {BFD_RELOC_NIOS2_IMM5, R_NIOS2_IMM5},
1630 {BFD_RELOC_NIOS2_CACHE_OPX, R_NIOS2_CACHE_OPX},
1631 {BFD_RELOC_NIOS2_IMM6, R_NIOS2_IMM6},
1632 {BFD_RELOC_NIOS2_IMM8, R_NIOS2_IMM8},
1633 {BFD_RELOC_NIOS2_HI16, R_NIOS2_HI16},
1634 {BFD_RELOC_NIOS2_LO16, R_NIOS2_LO16},
1635 {BFD_RELOC_NIOS2_HIADJ16, R_NIOS2_HIADJ16},
1636 {BFD_RELOC_32, R_NIOS2_BFD_RELOC_32},
1637 {BFD_RELOC_16, R_NIOS2_BFD_RELOC_16},
1638 {BFD_RELOC_8, R_NIOS2_BFD_RELOC_8},
1639 {BFD_RELOC_NIOS2_GPREL, R_NIOS2_GPREL},
1640 {BFD_RELOC_VTABLE_INHERIT, R_NIOS2_GNU_VTINHERIT},
1641 {BFD_RELOC_VTABLE_ENTRY, R_NIOS2_GNU_VTENTRY},
1642 {BFD_RELOC_NIOS2_UJMP, R_NIOS2_UJMP},
1643 {BFD_RELOC_NIOS2_CJMP, R_NIOS2_CJMP},
1644 {BFD_RELOC_NIOS2_CALLR, R_NIOS2_CALLR},
1645 {BFD_RELOC_NIOS2_ALIGN, R_NIOS2_ALIGN},
1646 {BFD_RELOC_NIOS2_GOT16, R_NIOS2_GOT16},
1647 {BFD_RELOC_NIOS2_CALL16, R_NIOS2_CALL16},
1648 {BFD_RELOC_NIOS2_GOTOFF_LO, R_NIOS2_GOTOFF_LO},
1649 {BFD_RELOC_NIOS2_GOTOFF_HA, R_NIOS2_GOTOFF_HA},
1650 {BFD_RELOC_NIOS2_PCREL_LO, R_NIOS2_PCREL_LO},
1651 {BFD_RELOC_NIOS2_PCREL_HA, R_NIOS2_PCREL_HA},
1652 {BFD_RELOC_NIOS2_TLS_GD16, R_NIOS2_TLS_GD16},
1653 {BFD_RELOC_NIOS2_TLS_LDM16, R_NIOS2_TLS_LDM16},
1654 {BFD_RELOC_NIOS2_TLS_LDO16, R_NIOS2_TLS_LDO16},
1655 {BFD_RELOC_NIOS2_TLS_IE16, R_NIOS2_TLS_IE16},
1656 {BFD_RELOC_NIOS2_TLS_LE16, R_NIOS2_TLS_LE16},
1657 {BFD_RELOC_NIOS2_TLS_DTPMOD, R_NIOS2_TLS_DTPMOD},
1658 {BFD_RELOC_NIOS2_TLS_DTPREL, R_NIOS2_TLS_DTPREL},
1659 {BFD_RELOC_NIOS2_TLS_TPREL, R_NIOS2_TLS_TPREL},
1660 {BFD_RELOC_NIOS2_COPY, R_NIOS2_COPY},
1661 {BFD_RELOC_NIOS2_GLOB_DAT, R_NIOS2_GLOB_DAT},
1662 {BFD_RELOC_NIOS2_JUMP_SLOT, R_NIOS2_JUMP_SLOT},
1663 {BFD_RELOC_NIOS2_RELATIVE, R_NIOS2_RELATIVE},
1664 {BFD_RELOC_NIOS2_GOTOFF, R_NIOS2_GOTOFF},
1665 {BFD_RELOC_NIOS2_CALL26_NOAT, R_NIOS2_CALL26_NOAT},
1666 {BFD_RELOC_NIOS2_GOT_LO, R_NIOS2_GOT_LO},
1667 {BFD_RELOC_NIOS2_GOT_HA, R_NIOS2_GOT_HA},
1668 {BFD_RELOC_NIOS2_CALL_LO, R_NIOS2_CALL_LO},
1669 {BFD_RELOC_NIOS2_CALL_HA, R_NIOS2_CALL_HA},
1670 {BFD_RELOC_NIOS2_R2_S12, R_NIOS2_R2_S12},
1671 {BFD_RELOC_NIOS2_R2_I10_1_PCREL, R_NIOS2_R2_I10_1_PCREL},
1672 {BFD_RELOC_NIOS2_R2_T1I7_1_PCREL, R_NIOS2_R2_T1I7_1_PCREL},
1673 {BFD_RELOC_NIOS2_R2_T1I7_2, R_NIOS2_R2_T1I7_2},
1674 {BFD_RELOC_NIOS2_R2_T2I4, R_NIOS2_R2_T2I4},
1675 {BFD_RELOC_NIOS2_R2_T2I4_1, R_NIOS2_R2_T2I4_1},
1676 {BFD_RELOC_NIOS2_R2_T2I4_2, R_NIOS2_R2_T2I4_2},
1677 {BFD_RELOC_NIOS2_R2_X1I7_2, R_NIOS2_R2_X1I7_2},
1678 {BFD_RELOC_NIOS2_R2_X2L5, R_NIOS2_R2_X2L5},
1679 {BFD_RELOC_NIOS2_R2_F1I5_2, R_NIOS2_R2_F1I5_2},
1680 {BFD_RELOC_NIOS2_R2_L5I4X1, R_NIOS2_R2_L5I4X1},
1681 {BFD_RELOC_NIOS2_R2_T1X1I6, R_NIOS2_R2_T1X1I6},
1682 {BFD_RELOC_NIOS2_R2_T1X1I6_2, R_NIOS2_R2_T1X1I6_2},
1685 enum elf32_nios2_stub_type
1687 nios2_stub_call26_before,
1688 nios2_stub_call26_after,
1692 struct elf32_nios2_stub_hash_entry
1694 /* Base hash table entry structure. */
1695 struct bfd_hash_entry bh_root;
1697 /* The stub section. */
1700 /* Offset within stub_sec of the beginning of this stub. */
1701 bfd_vma stub_offset;
1703 /* Given the symbol's value and its section we can determine its final
1704 value when building the stubs (so the stub knows where to jump. */
1705 bfd_vma target_value;
1706 asection *target_section;
1708 enum elf32_nios2_stub_type stub_type;
1710 /* The symbol table entry, if any, that this was derived from. */
1711 struct elf32_nios2_link_hash_entry *hh;
1713 /* And the reloc addend that this was derived from. */
1716 /* Where this stub is being called from, or, in the case of combined
1717 stub sections, the first input section in the group. */
1721 #define nios2_stub_hash_entry(ent) \
1722 ((struct elf32_nios2_stub_hash_entry *)(ent))
1724 #define nios2_stub_hash_lookup(table, string, create, copy) \
1725 ((struct elf32_nios2_stub_hash_entry *) \
1726 bfd_hash_lookup ((table), (string), (create), (copy)))
1729 /* The Nios II linker needs to keep track of the number of relocs that it
1730 decides to copy as dynamic relocs in check_relocs for each symbol.
1731 This is so that it can later discard them if they are found to be
1732 unnecessary. We store the information in a field extending the
1733 regular ELF linker hash table. */
1735 struct elf32_nios2_dyn_relocs
1737 struct elf32_nios2_dyn_relocs *next;
1739 /* The input section of the reloc. */
1742 /* Total number of relocs copied for the input section. */
1743 bfd_size_type count;
1745 /* Number of pc-relative relocs copied for the input section. */
1746 bfd_size_type pc_count;
1749 /* Nios II ELF linker hash entry. */
1751 struct elf32_nios2_link_hash_entry
1753 struct elf_link_hash_entry root;
1755 /* A pointer to the most recently used stub hash entry against this
1757 struct elf32_nios2_stub_hash_entry *hsh_cache;
1759 /* Track dynamic relocs copied for this symbol. */
1760 struct elf32_nios2_dyn_relocs *dyn_relocs;
1762 #define GOT_UNKNOWN 0
1763 #define GOT_NORMAL 1
1764 #define GOT_TLS_GD 2
1765 #define GOT_TLS_IE 4
1766 unsigned char tls_type;
1768 /* We need to detect and take special action for symbols which are only
1769 referenced with %call() and not with %got(). Such symbols do not need
1770 a dynamic GOT reloc in shared objects, only a dynamic PLT reloc. Lazy
1771 linking will not work if the dynamic GOT reloc exists.
1772 To check for this condition efficiently, we compare got_types_used against
1774 (got_types_used & (GOT_USED | CALL_USED)) == CALL_USED.
1778 unsigned char got_types_used;
1781 #define elf32_nios2_hash_entry(ent) \
1782 ((struct elf32_nios2_link_hash_entry *) (ent))
1784 /* Get the Nios II elf linker hash table from a link_info structure. */
1785 #define elf32_nios2_hash_table(info) \
1786 ((struct elf32_nios2_link_hash_table *) ((info)->hash))
1788 /* Nios II ELF linker hash table. */
1789 struct elf32_nios2_link_hash_table
1791 /* The main hash table. */
1792 struct elf_link_hash_table root;
1794 /* The stub hash table. */
1795 struct bfd_hash_table bstab;
1797 /* Linker stub bfd. */
1800 /* Linker call-backs. */
1801 asection * (*add_stub_section) (const char *, asection *, bfd_boolean);
1802 void (*layout_sections_again) (void);
1804 /* Array to keep track of which stub sections have been created, and
1805 information on stub grouping. */
1808 /* These are the section to which stubs in the group will be
1810 asection *first_sec, *last_sec;
1811 /* The stub sections. There might be stubs inserted either before
1812 or after the real section.*/
1813 asection *first_stub_sec, *last_stub_sec;
1816 /* Assorted information used by nios2_elf32_size_stubs. */
1817 unsigned int bfd_count;
1818 unsigned int top_index;
1819 asection **input_list;
1820 Elf_Internal_Sym **all_local_syms;
1822 /* Short-cuts to get to dynamic linker sections. */
1825 /* GOT pointer symbol _gp_got. */
1826 struct elf_link_hash_entry *h_gp_got;
1829 bfd_signed_vma refcount;
1833 /* Small local sym cache. */
1834 struct sym_cache sym_cache;
1839 struct nios2_elf32_obj_tdata
1841 struct elf_obj_tdata root;
1843 /* tls_type for each local got entry. */
1844 char *local_got_tls_type;
1846 /* TRUE if TLS GD relocs have been seen for this object. */
1847 bfd_boolean has_tlsgd;
1850 #define elf32_nios2_tdata(abfd) \
1851 ((struct nios2_elf32_obj_tdata *) (abfd)->tdata.any)
1853 #define elf32_nios2_local_got_tls_type(abfd) \
1854 (elf32_nios2_tdata (abfd)->local_got_tls_type)
1856 /* The name of the dynamic interpreter. This is put in the .interp
1858 #define ELF_DYNAMIC_INTERPRETER "/lib/ld.so.1"
1860 /* PLT implementation for position-dependent code. */
1861 static const bfd_vma nios2_plt_entry[] = { /* .PLTn: */
1862 0x03c00034, /* movhi r15, %hiadj(plt_got_slot_address) */
1863 0x7bc00017, /* ldw r15, %lo(plt_got_slot_address)(r15) */
1864 0x7800683a /* jmp r15 */
1867 static const bfd_vma nios2_plt0_entry[] = { /* .PLTresolve */
1868 0x03800034, /* movhi r14, %hiadj(res_0) */
1869 0x73800004, /* addi r14, r14, %lo(res_0) */
1870 0x7b9fc83a, /* sub r15, r15, r14 */
1871 0x03400034, /* movhi r13, %hiadj(_GLOBAL_OFFSET_TABLE_) */
1872 0x6b800017, /* ldw r14, %lo(_GLOBAL_OFFSET_TABLE_+4)(r13) */
1873 0x6b400017, /* ldw r13, %lo(_GLOBAL_OFFSET_TABLE_+8)(r13) */
1874 0x6800683a /* jmp r13 */
1877 /* PLT implementation for position-independent code. */
1878 static const bfd_vma nios2_so_plt_entry[] = { /* .PLTn */
1879 0x03c00034, /* movhi r15, %hiadj(index * 4) */
1880 0x7bc00004, /* addi r15, r15, %lo(index * 4) */
1881 0x00000006 /* br .PLTresolve */
1884 static const bfd_vma nios2_so_plt0_entry[] = { /* .PLTresolve */
1885 0x001ce03a, /* nextpc r14 */
1886 0x03400034, /* movhi r13, %hiadj(_GLOBAL_OFFSET_TABLE_) */
1887 0x6b9b883a, /* add r13, r13, r14 */
1888 0x6b800017, /* ldw r14, %lo(_GLOBAL_OFFSET_TABLE_+4)(r13) */
1889 0x6b400017, /* ldw r13, %lo(_GLOBAL_OFFSET_TABLE_+8)(r13) */
1890 0x6800683a /* jmp r13 */
1894 static const bfd_vma nios2_call26_stub_entry[] = {
1895 0x00400034, /* orhi at, r0, %hiadj(dest) */
1896 0x08400004, /* addi at, at, %lo(dest) */
1897 0x0800683a /* jmp at */
1900 /* Install 16-bit immediate value VALUE at offset OFFSET into section SEC. */
1902 nios2_elf32_install_imm16 (asection *sec, bfd_vma offset, bfd_vma value)
1904 bfd_vma word = bfd_get_32 (sec->owner, sec->contents + offset);
1906 BFD_ASSERT (value <= 0xffff || ((bfd_signed_vma) value) >= -0xffff);
1908 bfd_put_32 (sec->owner, word | ((value & 0xffff) << 6),
1909 sec->contents + offset);
1912 /* Install COUNT 32-bit values DATA starting at offset OFFSET into
1915 nios2_elf32_install_data (asection *sec, const bfd_vma *data, bfd_vma offset,
1920 bfd_put_32 (sec->owner, *data, sec->contents + offset);
1926 /* The usual way of loading a 32-bit constant into a Nios II register is to
1927 load the high 16 bits in one instruction and then add the low 16 bits with
1928 a signed add. This means that the high halfword needs to be adjusted to
1929 compensate for the sign bit of the low halfword. This function returns the
1930 adjusted high halfword for a given 32-bit constant. */
1932 bfd_vma hiadj (bfd_vma symbol_value)
1934 return ((symbol_value + 0x8000) >> 16) & 0xffff;
1937 /* Implement elf_backend_grok_prstatus:
1938 Support for core dump NOTE sections. */
1940 nios2_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
1945 switch (note->descsz)
1950 case 212: /* Linux/Nios II */
1952 elf_tdata (abfd)->core->signal = bfd_get_16 (abfd, note->descdata + 12);
1955 elf_tdata (abfd)->core->pid = bfd_get_32 (abfd, note->descdata + 24);
1964 /* Make a ".reg/999" section. */
1965 return _bfd_elfcore_make_pseudosection (abfd, ".reg",
1966 size, note->descpos + offset);
1969 /* Implement elf_backend_grok_psinfo. */
1971 nios2_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
1973 switch (note->descsz)
1978 case 124: /* Linux/Nios II elf_prpsinfo */
1979 elf_tdata (abfd)->core->program
1980 = _bfd_elfcore_strndup (abfd, note->descdata + 28, 16);
1981 elf_tdata (abfd)->core->command
1982 = _bfd_elfcore_strndup (abfd, note->descdata + 44, 80);
1985 /* Note that for some reason, a spurious space is tacked
1986 onto the end of the args in some (at least one anyway)
1987 implementations, so strip it off if it exists. */
1990 char *command = elf_tdata (abfd)->core->command;
1991 int n = strlen (command);
1993 if (0 < n && command[n - 1] == ' ')
1994 command[n - 1] = '\0';
2000 /* Assorted hash table functions. */
2002 /* Initialize an entry in the stub hash table. */
2003 static struct bfd_hash_entry *
2004 stub_hash_newfunc (struct bfd_hash_entry *entry,
2005 struct bfd_hash_table *table,
2008 /* Allocate the structure if it has not already been allocated by a
2012 entry = bfd_hash_allocate (table,
2013 sizeof (struct elf32_nios2_stub_hash_entry));
2018 /* Call the allocation method of the superclass. */
2019 entry = bfd_hash_newfunc (entry, table, string);
2022 struct elf32_nios2_stub_hash_entry *hsh;
2024 /* Initialize the local fields. */
2025 hsh = (struct elf32_nios2_stub_hash_entry *) entry;
2026 hsh->stub_sec = NULL;
2027 hsh->stub_offset = 0;
2028 hsh->target_value = 0;
2029 hsh->target_section = NULL;
2030 hsh->stub_type = nios2_stub_none;
2038 /* Create an entry in a Nios II ELF linker hash table. */
2039 static struct bfd_hash_entry *
2040 link_hash_newfunc (struct bfd_hash_entry *entry,
2041 struct bfd_hash_table *table, const char *string)
2043 /* Allocate the structure if it has not already been allocated by a
2047 entry = bfd_hash_allocate (table,
2048 sizeof (struct elf32_nios2_link_hash_entry));
2053 /* Call the allocation method of the superclass. */
2054 entry = _bfd_elf_link_hash_newfunc (entry, table, string);
2057 struct elf32_nios2_link_hash_entry *eh;
2059 eh = (struct elf32_nios2_link_hash_entry *) entry;
2060 eh->hsh_cache = NULL;
2061 eh->dyn_relocs = NULL;
2062 eh->tls_type = GOT_UNKNOWN;
2063 eh->got_types_used = 0;
2069 /* Section name for stubs is the associated section name plus this
2071 #define STUB_SUFFIX ".stub"
2073 /* Build a name for an entry in the stub hash table. */
2075 nios2_stub_name (const asection *input_section,
2076 const asection *sym_sec,
2077 const struct elf32_nios2_link_hash_entry *hh,
2078 const Elf_Internal_Rela *rel,
2079 enum elf32_nios2_stub_type stub_type)
2083 char stubpos = (stub_type == nios2_stub_call26_before) ? 'b' : 'a';
2087 len = 8 + 1 + 1 + 1+ strlen (hh->root.root.root.string) + 1 + 8 + 1;
2088 stub_name = bfd_malloc (len);
2089 if (stub_name != NULL)
2091 sprintf (stub_name, "%08x_%c_%s+%x",
2092 input_section->id & 0xffffffff,
2094 hh->root.root.root.string,
2095 (int) rel->r_addend & 0xffffffff);
2100 len = 8 + 1 + 1 + 1+ 8 + 1 + 8 + 1 + 8 + 1;
2101 stub_name = bfd_malloc (len);
2102 if (stub_name != NULL)
2104 sprintf (stub_name, "%08x_%c_%x:%x+%x",
2105 input_section->id & 0xffffffff,
2107 sym_sec->id & 0xffffffff,
2108 (int) ELF32_R_SYM (rel->r_info) & 0xffffffff,
2109 (int) rel->r_addend & 0xffffffff);
2115 /* Look up an entry in the stub hash. Stub entries are cached because
2116 creating the stub name takes a bit of time. */
2117 static struct elf32_nios2_stub_hash_entry *
2118 nios2_get_stub_entry (const asection *input_section,
2119 const asection *sym_sec,
2120 struct elf32_nios2_link_hash_entry *hh,
2121 const Elf_Internal_Rela *rel,
2122 struct elf32_nios2_link_hash_table *htab,
2123 enum elf32_nios2_stub_type stub_type)
2125 struct elf32_nios2_stub_hash_entry *hsh;
2126 const asection *id_sec;
2128 /* If this input section is part of a group of sections sharing one
2129 stub section, then use the id of the first/last section in the group,
2130 depending on the stub section placement relative to the group.
2131 Stub names need to include a section id, as there may well be
2132 more than one stub used to reach say, printf, and we need to
2133 distinguish between them. */
2134 if (stub_type == nios2_stub_call26_before)
2135 id_sec = htab->stub_group[input_section->id].first_sec;
2137 id_sec = htab->stub_group[input_section->id].last_sec;
2139 if (hh != NULL && hh->hsh_cache != NULL
2140 && hh->hsh_cache->hh == hh
2141 && hh->hsh_cache->id_sec == id_sec
2142 && hh->hsh_cache->stub_type == stub_type)
2144 hsh = hh->hsh_cache;
2150 stub_name = nios2_stub_name (id_sec, sym_sec, hh, rel, stub_type);
2151 if (stub_name == NULL)
2154 hsh = nios2_stub_hash_lookup (&htab->bstab,
2155 stub_name, FALSE, FALSE);
2158 hh->hsh_cache = hsh;
2166 /* Add a new stub entry to the stub hash. Not all fields of the new
2167 stub entry are initialised. */
2168 static struct elf32_nios2_stub_hash_entry *
2169 nios2_add_stub (const char *stub_name,
2171 struct elf32_nios2_link_hash_table *htab,
2172 enum elf32_nios2_stub_type stub_type)
2176 asection **secptr, **linkptr;
2177 struct elf32_nios2_stub_hash_entry *hsh;
2180 if (stub_type == nios2_stub_call26_before)
2182 link_sec = htab->stub_group[section->id].first_sec;
2183 secptr = &(htab->stub_group[section->id].first_stub_sec);
2184 linkptr = &(htab->stub_group[link_sec->id].first_stub_sec);
2189 link_sec = htab->stub_group[section->id].last_sec;
2190 secptr = &(htab->stub_group[section->id].last_stub_sec);
2191 linkptr = &(htab->stub_group[link_sec->id].last_stub_sec);
2195 if (stub_sec == NULL)
2197 stub_sec = *linkptr;
2198 if (stub_sec == NULL)
2204 namelen = strlen (link_sec->name);
2205 len = namelen + sizeof (STUB_SUFFIX);
2206 s_name = bfd_alloc (htab->stub_bfd, len);
2210 memcpy (s_name, link_sec->name, namelen);
2211 memcpy (s_name + namelen, STUB_SUFFIX, sizeof (STUB_SUFFIX));
2213 stub_sec = (*htab->add_stub_section) (s_name, link_sec, afterp);
2214 if (stub_sec == NULL)
2216 *linkptr = stub_sec;
2221 /* Enter this entry into the linker stub hash table. */
2222 hsh = nios2_stub_hash_lookup (&htab->bstab, stub_name,
2226 /* xgettext:c-format */
2227 _bfd_error_handler (_("%B: cannot create stub entry %s"),
2233 hsh->stub_sec = stub_sec;
2234 hsh->stub_offset = 0;
2235 hsh->id_sec = link_sec;
2239 /* Set up various things so that we can make a list of input sections
2240 for each output section included in the link. Returns -1 on error,
2241 0 when no stubs will be needed, and 1 on success. */
2243 nios2_elf32_setup_section_lists (bfd *output_bfd, struct bfd_link_info *info)
2246 unsigned int bfd_count;
2247 unsigned int top_id, top_index;
2249 asection **input_list, **list;
2251 struct elf32_nios2_link_hash_table *htab = elf32_nios2_hash_table (info);
2253 /* Count the number of input BFDs and find the top input section id. */
2254 for (input_bfd = info->input_bfds, bfd_count = 0, top_id = 0;
2256 input_bfd = input_bfd->link.next)
2259 for (section = input_bfd->sections;
2261 section = section->next)
2263 if (top_id < section->id)
2264 top_id = section->id;
2268 htab->bfd_count = bfd_count;
2270 amt = sizeof (struct map_stub) * (top_id + 1);
2271 htab->stub_group = bfd_zmalloc (amt);
2272 if (htab->stub_group == NULL)
2275 /* We can't use output_bfd->section_count here to find the top output
2276 section index as some sections may have been removed, and
2277 strip_excluded_output_sections doesn't renumber the indices. */
2278 for (section = output_bfd->sections, top_index = 0;
2280 section = section->next)
2282 if (top_index < section->index)
2283 top_index = section->index;
2286 htab->top_index = top_index;
2287 amt = sizeof (asection *) * (top_index + 1);
2288 input_list = bfd_malloc (amt);
2289 htab->input_list = input_list;
2290 if (input_list == NULL)
2293 /* For sections we aren't interested in, mark their entries with a
2294 value we can check later. */
2295 list = input_list + top_index;
2297 *list = bfd_abs_section_ptr;
2298 while (list-- != input_list);
2300 for (section = output_bfd->sections;
2302 section = section->next)
2304 /* FIXME: This is a bit of hack. Currently our .ctors and .dtors
2305 * have PC relative relocs in them but no code flag set. */
2306 if (((section->flags & SEC_CODE) != 0) ||
2307 strcmp(".ctors", section->name) ||
2308 strcmp(".dtors", section->name))
2309 input_list[section->index] = NULL;
2315 /* The linker repeatedly calls this function for each input section,
2316 in the order that input sections are linked into output sections.
2317 Build lists of input sections to determine groupings between which
2318 we may insert linker stubs. */
2320 nios2_elf32_next_input_section (struct bfd_link_info *info, asection *isec)
2322 struct elf32_nios2_link_hash_table *htab = elf32_nios2_hash_table (info);
2324 if (isec->output_section->index <= htab->top_index)
2326 asection **list = htab->input_list + isec->output_section->index;
2327 if (*list != bfd_abs_section_ptr)
2329 /* Steal the last_sec pointer for our list.
2330 This happens to make the list in reverse order,
2331 which is what we want. */
2332 htab->stub_group[isec->id].last_sec = *list;
2338 /* Segment mask for CALL26 relocation relaxation. */
2339 #define CALL26_SEGMENT(x) ((x) & 0xf0000000)
2341 /* Fudge factor for approximate maximum size of all stubs that might
2342 be inserted by the linker. This does not actually limit the number
2343 of stubs that might be inserted, and only affects strategy for grouping
2344 and placement of stubs. Perhaps this should be computed based on number
2345 of relocations seen, or be specifiable on the command line. */
2346 #define MAX_STUB_SECTION_SIZE 0xffff
2348 /* See whether we can group stub sections together. Grouping stub
2349 sections may result in fewer stubs. More importantly, we need to
2350 put all .init* and .fini* stubs at the end of the .init or
2351 .fini output sections respectively, because glibc splits the
2352 _init and _fini functions into multiple parts. Putting a stub in
2353 the middle of a function is not a good idea.
2354 Rather than computing groups of a maximum fixed size, for Nios II
2355 CALL26 relaxation it makes more sense to compute the groups based on
2356 sections that fit within a 256MB address segment. Also do not allow
2357 a group to span more than one output section, since different output
2358 sections might correspond to different memory banks on a bare-metal
2361 group_sections (struct elf32_nios2_link_hash_table *htab)
2363 asection **list = htab->input_list + htab->top_index;
2366 /* The list is in reverse order so we'll search backwards looking
2367 for the first section that begins in the same memory segment,
2368 marking sections along the way to point at the tail for this
2370 asection *tail = *list;
2371 if (tail == bfd_abs_section_ptr)
2373 while (tail != NULL)
2375 bfd_vma start = tail->output_section->vma + tail->output_offset;
2376 bfd_vma end = start + tail->size;
2377 bfd_vma segment = CALL26_SEGMENT (end);
2380 if (segment != CALL26_SEGMENT (start)
2381 || segment != CALL26_SEGMENT (end + MAX_STUB_SECTION_SIZE))
2382 /* This section spans more than one memory segment, or is
2383 close enough to the end of the segment that adding stub
2384 sections before it might cause it to move so that it
2385 spans memory segments, or that stubs added at the end of
2386 this group might overflow into the next memory segment.
2387 Put it in a group by itself to localize the effects. */
2389 prev = htab->stub_group[tail->id].last_sec;
2390 htab->stub_group[tail->id].last_sec = tail;
2391 htab->stub_group[tail->id].first_sec = tail;
2394 /* Collect more sections for this group. */
2396 asection *curr, *first;
2397 for (curr = tail; ; curr = prev)
2399 prev = htab->stub_group[curr->id].last_sec;
2401 || tail->output_section != prev->output_section
2402 || (CALL26_SEGMENT (prev->output_section->vma
2403 + prev->output_offset)
2408 for (curr = tail; ; curr = prev)
2410 prev = htab->stub_group[curr->id].last_sec;
2411 htab->stub_group[curr->id].last_sec = tail;
2412 htab->stub_group[curr->id].first_sec = first;
2418 /* Reset tail for the next group. */
2422 while (list-- != htab->input_list);
2423 free (htab->input_list);
2426 /* Determine the type of stub needed, if any, for a call. */
2427 static enum elf32_nios2_stub_type
2428 nios2_type_of_stub (asection *input_sec,
2429 const Elf_Internal_Rela *rel,
2430 struct elf32_nios2_link_hash_entry *hh,
2431 struct elf32_nios2_link_hash_table *htab,
2432 bfd_vma destination,
2433 struct bfd_link_info *info ATTRIBUTE_UNUSED)
2435 bfd_vma location, segment, start, end;
2436 asection *s0, *s1, *s;
2439 !(hh->root.root.type == bfd_link_hash_defined
2440 || hh->root.root.type == bfd_link_hash_defweak))
2441 return nios2_stub_none;
2443 /* Determine where the call point is. */
2444 location = (input_sec->output_section->vma
2445 + input_sec->output_offset + rel->r_offset);
2446 segment = CALL26_SEGMENT (location);
2448 /* Nios II CALL and JMPI instructions can transfer control to addresses
2449 within the same 256MB segment as the PC. */
2450 if (segment == CALL26_SEGMENT (destination))
2451 return nios2_stub_none;
2453 /* Find the start and end addresses of the stub group. Also account for
2454 any already-created stub sections for this group. Note that for stubs
2455 in the end section, only the first instruction of the last stub
2456 (12 bytes long) needs to be within range. */
2457 s0 = htab->stub_group[input_sec->id].first_sec;
2458 s = htab->stub_group[s0->id].first_stub_sec;
2459 if (s != NULL && s->size > 0)
2460 start = s->output_section->vma + s->output_offset;
2462 start = s0->output_section->vma + s0->output_offset;
2464 s1 = htab->stub_group[input_sec->id].last_sec;
2465 s = htab->stub_group[s1->id].last_stub_sec;
2466 if (s != NULL && s->size > 0)
2467 end = s->output_section->vma + s->output_offset + s->size - 8;
2469 end = s1->output_section->vma + s1->output_offset + s1->size;
2471 BFD_ASSERT (start < end);
2472 BFD_ASSERT (start <= location);
2473 BFD_ASSERT (location < end);
2475 /* Put stubs at the end of the group unless that is not a valid
2476 location and the beginning of the group is. It might be that
2477 neither the beginning nor end works if we have an input section
2478 so large that it spans multiple segment boundaries. In that
2479 case, punt; the end result will be a relocation overflow error no
2480 matter what we do here.
2482 Note that adding stubs pushes up the addresses of all subsequent
2483 sections, so that stubs allocated on one pass through the
2484 relaxation loop may not be valid on the next pass. (E.g., we may
2485 allocate a stub at the beginning of the section on one pass and
2486 find that the call site has been bumped into the next memory
2487 segment on the next pass.) The important thing to note is that
2488 we never try to reclaim the space allocated to such unused stubs,
2489 so code size and section addresses can only increase with each
2490 iteration. Accounting for the start and end addresses of the
2491 already-created stub sections ensures that when the algorithm
2492 converges, it converges accurately, with the entire appropriate
2493 stub section accessible from the call site and not just the
2494 address at the start or end of the stub group proper. */
2496 if (segment == CALL26_SEGMENT (end))
2497 return nios2_stub_call26_after;
2498 else if (segment == CALL26_SEGMENT (start))
2499 return nios2_stub_call26_before;
2501 /* Perhaps this should be a dedicated error code. */
2502 return nios2_stub_none;
2506 nios2_build_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg ATTRIBUTE_UNUSED)
2508 struct elf32_nios2_stub_hash_entry *hsh
2509 = (struct elf32_nios2_stub_hash_entry *) gen_entry;
2510 asection *stub_sec = hsh->stub_sec;
2513 /* Make a note of the offset within the stubs for this entry. */
2514 hsh->stub_offset = stub_sec->size;
2516 switch (hsh->stub_type)
2518 case nios2_stub_call26_before:
2519 case nios2_stub_call26_after:
2520 /* A call26 stub looks like:
2521 orhi at, %hiadj(dest)
2522 addi at, at, %lo(dest)
2524 Note that call/jmpi instructions can't be used in PIC code
2525 so there is no reason for the stub to be PIC, either. */
2526 sym_value = (hsh->target_value
2527 + hsh->target_section->output_offset
2528 + hsh->target_section->output_section->vma
2531 nios2_elf32_install_data (stub_sec, nios2_call26_stub_entry,
2532 hsh->stub_offset, 3);
2533 nios2_elf32_install_imm16 (stub_sec, hsh->stub_offset,
2535 nios2_elf32_install_imm16 (stub_sec, hsh->stub_offset + 4,
2536 (sym_value & 0xffff));
2537 stub_sec->size += 12;
2547 /* As above, but don't actually build the stub. Just bump offset so
2548 we know stub section sizes. */
2550 nios2_size_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg ATTRIBUTE_UNUSED)
2552 struct elf32_nios2_stub_hash_entry *hsh
2553 = (struct elf32_nios2_stub_hash_entry *) gen_entry;
2555 switch (hsh->stub_type)
2557 case nios2_stub_call26_before:
2558 case nios2_stub_call26_after:
2559 hsh->stub_sec->size += 12;
2568 /* Read in all local syms for all input bfds.
2569 Returns -1 on error, 0 otherwise. */
2572 get_local_syms (bfd *output_bfd ATTRIBUTE_UNUSED, bfd *input_bfd,
2573 struct bfd_link_info *info)
2575 unsigned int bfd_indx;
2576 Elf_Internal_Sym *local_syms, **all_local_syms;
2577 struct elf32_nios2_link_hash_table *htab = elf32_nios2_hash_table (info);
2579 /* We want to read in symbol extension records only once. To do this
2580 we need to read in the local symbols in parallel and save them for
2581 later use; so hold pointers to the local symbols in an array. */
2582 bfd_size_type amt = sizeof (Elf_Internal_Sym *) * htab->bfd_count;
2583 all_local_syms = bfd_zmalloc (amt);
2584 htab->all_local_syms = all_local_syms;
2585 if (all_local_syms == NULL)
2588 /* Walk over all the input BFDs, swapping in local symbols. */
2591 input_bfd = input_bfd->link.next, bfd_indx++)
2593 Elf_Internal_Shdr *symtab_hdr;
2595 /* We'll need the symbol table in a second. */
2596 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
2597 if (symtab_hdr->sh_info == 0)
2600 /* We need an array of the local symbols attached to the input bfd. */
2601 local_syms = (Elf_Internal_Sym *) symtab_hdr->contents;
2602 if (local_syms == NULL)
2604 local_syms = bfd_elf_get_elf_syms (input_bfd, symtab_hdr,
2605 symtab_hdr->sh_info, 0,
2607 /* Cache them for elf_link_input_bfd. */
2608 symtab_hdr->contents = (unsigned char *) local_syms;
2610 if (local_syms == NULL)
2613 all_local_syms[bfd_indx] = local_syms;
2619 /* Determine and set the size of the stub section for a final link. */
2621 nios2_elf32_size_stubs (bfd *output_bfd, bfd *stub_bfd,
2622 struct bfd_link_info *info,
2623 asection *(*add_stub_section) (const char *,
2624 asection *, bfd_boolean),
2625 void (*layout_sections_again) (void))
2627 bfd_boolean stub_changed = FALSE;
2628 struct elf32_nios2_link_hash_table *htab = elf32_nios2_hash_table (info);
2630 /* Stash our params away. */
2631 htab->stub_bfd = stub_bfd;
2632 htab->add_stub_section = add_stub_section;
2633 htab->layout_sections_again = layout_sections_again;
2635 /* FIXME: We only compute the section groups once. This could cause
2636 problems if adding a large stub section causes following sections,
2637 or parts of them, to move into another segment. However, this seems
2638 to be consistent with the way other back ends handle this.... */
2639 group_sections (htab);
2641 if (get_local_syms (output_bfd, info->input_bfds, info))
2643 if (htab->all_local_syms)
2644 goto error_ret_free_local;
2651 unsigned int bfd_indx;
2654 for (input_bfd = info->input_bfds, bfd_indx = 0;
2656 input_bfd = input_bfd->link.next, bfd_indx++)
2658 Elf_Internal_Shdr *symtab_hdr;
2660 Elf_Internal_Sym *local_syms;
2662 /* We'll need the symbol table in a second. */
2663 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
2664 if (symtab_hdr->sh_info == 0)
2667 local_syms = htab->all_local_syms[bfd_indx];
2669 /* Walk over each section attached to the input bfd. */
2670 for (section = input_bfd->sections;
2672 section = section->next)
2674 Elf_Internal_Rela *internal_relocs, *irelaend, *irela;
2676 /* If there aren't any relocs, then there's nothing more
2678 if ((section->flags & SEC_RELOC) == 0
2679 || section->reloc_count == 0)
2682 /* If this section is a link-once section that will be
2683 discarded, then don't create any stubs. */
2684 if (section->output_section == NULL
2685 || section->output_section->owner != output_bfd)
2688 /* Get the relocs. */
2690 = _bfd_elf_link_read_relocs (input_bfd, section, NULL, NULL,
2692 if (internal_relocs == NULL)
2693 goto error_ret_free_local;
2695 /* Now examine each relocation. */
2696 irela = internal_relocs;
2697 irelaend = irela + section->reloc_count;
2698 for (; irela < irelaend; irela++)
2700 unsigned int r_type, r_indx;
2701 enum elf32_nios2_stub_type stub_type;
2702 struct elf32_nios2_stub_hash_entry *hsh;
2705 bfd_vma destination;
2706 struct elf32_nios2_link_hash_entry *hh;
2708 const asection *id_sec;
2710 r_type = ELF32_R_TYPE (irela->r_info);
2711 r_indx = ELF32_R_SYM (irela->r_info);
2713 if (r_type >= (unsigned int) R_NIOS2_ILLEGAL)
2715 bfd_set_error (bfd_error_bad_value);
2716 error_ret_free_internal:
2717 if (elf_section_data (section)->relocs == NULL)
2718 free (internal_relocs);
2719 goto error_ret_free_local;
2722 /* Only look for stubs on CALL and JMPI instructions. */
2723 if (r_type != (unsigned int) R_NIOS2_CALL26)
2726 /* Now determine the call target, its name, value,
2732 if (r_indx < symtab_hdr->sh_info)
2734 /* It's a local symbol. */
2735 Elf_Internal_Sym *sym;
2736 Elf_Internal_Shdr *hdr;
2739 sym = local_syms + r_indx;
2740 if (ELF_ST_TYPE (sym->st_info) != STT_SECTION)
2741 sym_value = sym->st_value;
2742 shndx = sym->st_shndx;
2743 if (shndx < elf_numsections (input_bfd))
2745 hdr = elf_elfsections (input_bfd)[shndx];
2746 sym_sec = hdr->bfd_section;
2747 destination = (sym_value + irela->r_addend
2748 + sym_sec->output_offset
2749 + sym_sec->output_section->vma);
2754 /* It's an external symbol. */
2757 e_indx = r_indx - symtab_hdr->sh_info;
2758 hh = ((struct elf32_nios2_link_hash_entry *)
2759 elf_sym_hashes (input_bfd)[e_indx]);
2761 while (hh->root.root.type == bfd_link_hash_indirect
2762 || hh->root.root.type == bfd_link_hash_warning)
2763 hh = ((struct elf32_nios2_link_hash_entry *)
2764 hh->root.root.u.i.link);
2766 if (hh->root.root.type == bfd_link_hash_defined
2767 || hh->root.root.type == bfd_link_hash_defweak)
2769 sym_sec = hh->root.root.u.def.section;
2770 sym_value = hh->root.root.u.def.value;
2772 if (sym_sec->output_section != NULL)
2773 destination = (sym_value + irela->r_addend
2774 + sym_sec->output_offset
2775 + sym_sec->output_section->vma);
2779 else if (hh->root.root.type == bfd_link_hash_undefweak)
2781 if (! bfd_link_pic (info))
2784 else if (hh->root.root.type == bfd_link_hash_undefined)
2786 if (! (info->unresolved_syms_in_objects == RM_IGNORE
2787 && (ELF_ST_VISIBILITY (hh->root.other)
2793 bfd_set_error (bfd_error_bad_value);
2794 goto error_ret_free_internal;
2798 /* Determine what (if any) linker stub is needed. */
2799 stub_type = nios2_type_of_stub (section, irela, hh, htab,
2801 if (stub_type == nios2_stub_none)
2804 /* Support for grouping stub sections. */
2805 if (stub_type == nios2_stub_call26_before)
2806 id_sec = htab->stub_group[section->id].first_sec;
2808 id_sec = htab->stub_group[section->id].last_sec;
2810 /* Get the name of this stub. */
2811 stub_name = nios2_stub_name (id_sec, sym_sec, hh, irela,
2814 goto error_ret_free_internal;
2816 hsh = nios2_stub_hash_lookup (&htab->bstab,
2821 /* The proper stub has already been created. */
2826 hsh = nios2_add_stub (stub_name, section, htab, stub_type);
2830 goto error_ret_free_internal;
2832 hsh->target_value = sym_value;
2833 hsh->target_section = sym_sec;
2834 hsh->stub_type = stub_type;
2836 hsh->addend = irela->r_addend;
2837 stub_changed = TRUE;
2840 /* We're done with the internal relocs, free them. */
2841 if (elf_section_data (section)->relocs == NULL)
2842 free (internal_relocs);
2849 /* OK, we've added some stubs. Find out the new size of the
2851 for (stub_sec = htab->stub_bfd->sections;
2853 stub_sec = stub_sec->next)
2856 bfd_hash_traverse (&htab->bstab, nios2_size_one_stub, htab);
2858 /* Ask the linker to do its stuff. */
2859 (*htab->layout_sections_again) ();
2860 stub_changed = FALSE;
2863 free (htab->all_local_syms);
2866 error_ret_free_local:
2867 free (htab->all_local_syms);
2871 /* Build all the stubs associated with the current output file. The
2872 stubs are kept in a hash table attached to the main linker hash
2873 table. This function is called via nios2elf_finish in the linker. */
2875 nios2_elf32_build_stubs (struct bfd_link_info *info)
2878 struct bfd_hash_table *table;
2879 struct elf32_nios2_link_hash_table *htab;
2881 htab = elf32_nios2_hash_table (info);
2883 for (stub_sec = htab->stub_bfd->sections;
2885 stub_sec = stub_sec->next)
2886 /* The stub_bfd may contain non-stub sections if it is also the
2887 dynobj. Any such non-stub sections are created with the
2888 SEC_LINKER_CREATED flag set, while stub sections do not
2889 have that flag. Ignore any non-stub sections here. */
2890 if ((stub_sec->flags & SEC_LINKER_CREATED) == 0)
2894 /* Allocate memory to hold the linker stubs. */
2895 size = stub_sec->size;
2896 stub_sec->contents = bfd_zalloc (htab->stub_bfd, size);
2897 if (stub_sec->contents == NULL && size != 0)
2902 /* Build the stubs as directed by the stub hash table. */
2903 table = &htab->bstab;
2904 bfd_hash_traverse (table, nios2_build_one_stub, info);
2910 #define is_nios2_elf(bfd) \
2911 (bfd_get_flavour (bfd) == bfd_target_elf_flavour \
2912 && elf_object_id (bfd) == NIOS2_ELF_DATA)
2914 /* Merge backend specific data from an object file to the output
2915 object file when linking. */
2918 nios2_elf32_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
2920 bfd *obfd = info->output_bfd;
2924 if (!is_nios2_elf (ibfd) || !is_nios2_elf (obfd))
2927 /* Check if we have the same endianness. */
2928 if (! _bfd_generic_verify_endian_match (ibfd, info))
2931 new_flags = elf_elfheader (ibfd)->e_flags;
2932 old_flags = elf_elfheader (obfd)->e_flags;
2933 if (!elf_flags_init (obfd))
2935 /* First call, no flags set. */
2936 elf_flags_init (obfd) = TRUE;
2937 elf_elfheader (obfd)->e_flags = new_flags;
2942 case EF_NIOS2_ARCH_R1:
2943 bfd_default_set_arch_mach (obfd, bfd_arch_nios2, bfd_mach_nios2r1);
2945 case EF_NIOS2_ARCH_R2:
2946 if (bfd_big_endian (ibfd))
2949 (_("error: %B: Big-endian R2 is not supported."), ibfd);
2950 bfd_set_error (bfd_error_bad_value);
2953 bfd_default_set_arch_mach (obfd, bfd_arch_nios2, bfd_mach_nios2r2);
2958 /* Incompatible flags. */
2959 else if (new_flags != old_flags)
2961 /* So far, the only incompatible flags denote incompatible
2964 /* xgettext:c-format */
2965 (_("error: %B: Conflicting CPU architectures %d/%d"),
2966 ibfd, new_flags, old_flags);
2967 bfd_set_error (bfd_error_bad_value);
2971 /* Merge Tag_compatibility attributes and any common GNU ones. */
2972 _bfd_elf_merge_object_attributes (ibfd, info);
2978 /* Implement bfd_elf32_bfd_reloc_type_lookup:
2979 Given a BFD reloc type, return a howto structure. */
2980 static reloc_howto_type *
2981 nios2_elf32_bfd_reloc_type_lookup (bfd *abfd,
2982 bfd_reloc_code_real_type code)
2987 i < (int) (sizeof (nios2_reloc_map) / sizeof (struct elf_reloc_map));
2989 if (nios2_reloc_map[i].bfd_val == code)
2990 return lookup_howto (nios2_reloc_map[i].elf_val, abfd);
2994 /* Implement bfd_elf32_bfd_reloc_name_lookup:
2995 Given a reloc name, return a howto structure. */
2996 static reloc_howto_type *
2997 nios2_elf32_bfd_reloc_name_lookup (bfd *abfd,
3001 reloc_howto_type *howto_tbl;
3004 if (BFD_IS_R2 (abfd))
3006 howto_tbl = elf_nios2_r2_howto_table_rel;
3007 howto_tbl_size = (int) (sizeof (elf_nios2_r2_howto_table_rel)
3008 / sizeof (elf_nios2_r2_howto_table_rel[0]));
3012 howto_tbl = elf_nios2_r1_howto_table_rel;
3013 howto_tbl_size = (int) (sizeof (elf_nios2_r1_howto_table_rel)
3014 / sizeof (elf_nios2_r1_howto_table_rel[0]));
3017 for (i = 0; i < howto_tbl_size; i++)
3018 if (howto_tbl[i].name && strcasecmp (howto_tbl[i].name, r_name) == 0)
3019 return howto_tbl + i;
3023 /* Implement elf_info_to_howto:
3024 Given a ELF32 relocation, fill in a arelent structure. */
3026 nios2_elf32_info_to_howto (bfd *abfd, arelent *cache_ptr,
3027 Elf_Internal_Rela *dst)
3029 unsigned int r_type;
3031 r_type = ELF32_R_TYPE (dst->r_info);
3032 cache_ptr->howto = lookup_howto (r_type, abfd);
3035 /* Return the base VMA address which should be subtracted from real addresses
3036 when resolving @dtpoff relocation.
3037 This is PT_TLS segment p_vaddr. */
3039 dtpoff_base (struct bfd_link_info *info)
3041 /* If tls_sec is NULL, we should have signalled an error already. */
3042 if (elf_hash_table (info)->tls_sec == NULL)
3044 return elf_hash_table (info)->tls_sec->vma;
3047 /* Return the relocation value for @tpoff relocation
3048 if STT_TLS virtual address is ADDRESS. */
3050 tpoff (struct bfd_link_info *info, bfd_vma address)
3052 struct elf_link_hash_table *htab = elf_hash_table (info);
3054 /* If tls_sec is NULL, we should have signalled an error already. */
3055 if (htab->tls_sec == NULL)
3057 return address - htab->tls_sec->vma;
3060 /* Set the GP value for OUTPUT_BFD. Returns FALSE if this is a
3061 dangerous relocation. */
3063 nios2_elf_assign_gp (bfd *output_bfd, bfd_vma *pgp, struct bfd_link_info *info)
3066 bfd_boolean gp_found;
3067 struct bfd_hash_entry *h;
3068 struct bfd_link_hash_entry *lh;
3070 /* If we've already figured out what GP will be, just return it. */
3071 *pgp = _bfd_get_gp_value (output_bfd);
3075 h = bfd_hash_lookup (&info->hash->table, "_gp", FALSE, FALSE);
3076 lh = (struct bfd_link_hash_entry *) h;
3082 case bfd_link_hash_undefined:
3083 case bfd_link_hash_undefweak:
3084 case bfd_link_hash_common:
3087 case bfd_link_hash_defined:
3088 case bfd_link_hash_defweak:
3091 asection *sym_sec = lh->u.def.section;
3092 bfd_vma sym_value = lh->u.def.value;
3094 if (sym_sec->output_section)
3095 sym_value = (sym_value + sym_sec->output_offset
3096 + sym_sec->output_section->vma);
3100 case bfd_link_hash_indirect:
3101 case bfd_link_hash_warning:
3103 /* @@FIXME ignoring warning for now */
3105 case bfd_link_hash_new:
3115 /* Only get the error once. */
3117 _bfd_set_gp_value (output_bfd, *pgp);
3121 _bfd_set_gp_value (output_bfd, *pgp);
3126 /* Retrieve the previously cached _gp pointer, returning bfd_reloc_dangerous
3127 if it's not available as we don't have a link_info pointer available here
3128 to look it up in the output symbol table. We don't need to adjust the
3129 symbol value for an external symbol if we are producing relocatable
3131 static bfd_reloc_status_type
3132 nios2_elf_final_gp (bfd *output_bfd, asymbol *symbol, bfd_boolean relocatable,
3133 char **error_message, bfd_vma *pgp)
3135 if (bfd_is_und_section (symbol->section) && !relocatable)
3138 return bfd_reloc_undefined;
3141 *pgp = _bfd_get_gp_value (output_bfd);
3142 if (*pgp == 0 && (!relocatable || (symbol->flags & BSF_SECTION_SYM) != 0))
3146 /* Make up a value. */
3147 *pgp = symbol->section->output_section->vma + 0x4000;
3148 _bfd_set_gp_value (output_bfd, *pgp);
3153 = (char *) _("global pointer relative relocation when _gp not defined");
3154 return bfd_reloc_dangerous;
3158 return bfd_reloc_ok;
3161 /* Do the relocations that require special handling. */
3162 static bfd_reloc_status_type
3163 nios2_elf32_do_hi16_relocate (bfd *abfd, reloc_howto_type *howto,
3164 asection *input_section,
3165 bfd_byte *data, bfd_vma offset,
3166 bfd_vma symbol_value, bfd_vma addend)
3168 symbol_value = symbol_value + addend;
3170 symbol_value = (symbol_value >> 16) & 0xffff;
3171 return _bfd_final_link_relocate (howto, abfd, input_section,
3172 data, offset, symbol_value, addend);
3175 static bfd_reloc_status_type
3176 nios2_elf32_do_lo16_relocate (bfd *abfd, reloc_howto_type *howto,
3177 asection *input_section,
3178 bfd_byte *data, bfd_vma offset,
3179 bfd_vma symbol_value, bfd_vma addend)
3181 symbol_value = symbol_value + addend;
3183 symbol_value = symbol_value & 0xffff;
3184 return _bfd_final_link_relocate (howto, abfd, input_section,
3185 data, offset, symbol_value, addend);
3188 static bfd_reloc_status_type
3189 nios2_elf32_do_hiadj16_relocate (bfd *abfd, reloc_howto_type *howto,
3190 asection *input_section,
3191 bfd_byte *data, bfd_vma offset,
3192 bfd_vma symbol_value, bfd_vma addend)
3194 symbol_value = symbol_value + addend;
3196 symbol_value = hiadj(symbol_value);
3197 return _bfd_final_link_relocate (howto, abfd, input_section, data, offset,
3198 symbol_value, addend);
3201 static bfd_reloc_status_type
3202 nios2_elf32_do_pcrel_lo16_relocate (bfd *abfd, reloc_howto_type *howto,
3203 asection *input_section,
3204 bfd_byte *data, bfd_vma offset,
3205 bfd_vma symbol_value, bfd_vma addend)
3207 symbol_value = symbol_value + addend;
3209 symbol_value = symbol_value & 0xffff;
3210 return _bfd_final_link_relocate (howto, abfd, input_section,
3211 data, offset, symbol_value, addend);
3214 static bfd_reloc_status_type
3215 nios2_elf32_do_pcrel_hiadj16_relocate (bfd *abfd, reloc_howto_type *howto,
3216 asection *input_section,
3217 bfd_byte *data, bfd_vma offset,
3218 bfd_vma symbol_value, bfd_vma addend)
3220 symbol_value = symbol_value + addend;
3221 symbol_value -= (input_section->output_section->vma
3222 + input_section->output_offset);
3223 symbol_value -= offset;
3225 symbol_value = hiadj(symbol_value);
3226 return _bfd_final_link_relocate (howto, abfd, input_section, data, offset,
3227 symbol_value, addend);
3230 static bfd_reloc_status_type
3231 nios2_elf32_do_pcrel16_relocate (bfd *abfd, reloc_howto_type *howto,
3232 asection *input_section,
3233 bfd_byte *data, bfd_vma offset,
3234 bfd_vma symbol_value, bfd_vma addend)
3236 /* NIOS2 pc relative relocations are relative to the next 32-bit instruction
3237 so we need to subtract 4 before doing a final_link_relocate. */
3238 symbol_value = symbol_value + addend - 4;
3240 return _bfd_final_link_relocate (howto, abfd, input_section,
3241 data, offset, symbol_value, addend);
3244 static bfd_reloc_status_type
3245 nios2_elf32_do_call26_relocate (bfd *abfd, reloc_howto_type *howto,
3246 asection *input_section,
3247 bfd_byte *data, bfd_vma offset,
3248 bfd_vma symbol_value, bfd_vma addend)
3250 /* Check that the relocation is in the same page as the current address. */
3251 if (CALL26_SEGMENT (symbol_value + addend)
3252 != CALL26_SEGMENT (input_section->output_section->vma
3253 + input_section->output_offset
3255 return bfd_reloc_overflow;
3257 /* Check that the target address is correctly aligned on a 4-byte
3259 if ((symbol_value + addend) & 0x3)
3260 return bfd_reloc_overflow;
3262 return _bfd_final_link_relocate (howto, abfd, input_section,
3263 data, offset, symbol_value, addend);
3266 static bfd_reloc_status_type
3267 nios2_elf32_do_gprel_relocate (bfd *abfd, reloc_howto_type *howto,
3268 asection *input_section,
3269 bfd_byte *data, bfd_vma offset,
3270 bfd_vma symbol_value, bfd_vma addend)
3272 /* Because we need the output_bfd, the special handling is done
3273 in nios2_elf32_relocate_section or in nios2_elf32_gprel_relocate. */
3274 return _bfd_final_link_relocate (howto, abfd, input_section,
3275 data, offset, symbol_value, addend);
3278 static bfd_reloc_status_type
3279 nios2_elf32_do_ujmp_relocate (bfd *abfd, reloc_howto_type *howto,
3280 asection *input_section,
3281 bfd_byte *data, bfd_vma offset,
3282 bfd_vma symbol_value, bfd_vma addend)
3284 bfd_vma symbol_lo16, symbol_hi16;
3285 bfd_reloc_status_type r;
3286 symbol_value = symbol_value + addend;
3288 symbol_hi16 = (symbol_value >> 16) & 0xffff;
3289 symbol_lo16 = symbol_value & 0xffff;
3291 r = _bfd_final_link_relocate (howto, abfd, input_section,
3292 data, offset, symbol_hi16, addend);
3294 if (r == bfd_reloc_ok)
3295 return _bfd_final_link_relocate (howto, abfd, input_section,
3296 data, offset + 4, symbol_lo16, addend);
3301 static bfd_reloc_status_type
3302 nios2_elf32_do_cjmp_relocate (bfd *abfd, reloc_howto_type *howto,
3303 asection *input_section,
3304 bfd_byte *data, bfd_vma offset,
3305 bfd_vma symbol_value, bfd_vma addend)
3307 bfd_vma symbol_lo16, symbol_hi16;
3308 bfd_reloc_status_type r;
3309 symbol_value = symbol_value + addend;
3311 symbol_hi16 = (symbol_value >> 16) & 0xffff;
3312 symbol_lo16 = symbol_value & 0xffff;
3314 r = _bfd_final_link_relocate (howto, abfd, input_section,
3315 data, offset, symbol_hi16, addend);
3317 if (r == bfd_reloc_ok)
3318 return _bfd_final_link_relocate (howto, abfd, input_section,
3319 data, offset + 4, symbol_lo16, addend);
3324 static bfd_reloc_status_type
3325 nios2_elf32_do_callr_relocate (bfd *abfd, reloc_howto_type *howto,
3326 asection *input_section,
3327 bfd_byte *data, bfd_vma offset,
3328 bfd_vma symbol_value, bfd_vma addend)
3330 bfd_vma symbol_lo16, symbol_hi16;
3331 bfd_reloc_status_type r;
3332 symbol_value = symbol_value + addend;
3334 symbol_hi16 = (symbol_value >> 16) & 0xffff;
3335 symbol_lo16 = symbol_value & 0xffff;
3337 r = _bfd_final_link_relocate (howto, abfd, input_section,
3338 data, offset, symbol_hi16, addend);
3340 if (r == bfd_reloc_ok)
3341 return _bfd_final_link_relocate (howto, abfd, input_section,
3342 data, offset + 4, symbol_lo16, addend);
3347 /* HOWTO handlers for relocations that require special handling. */
3349 /* This is for relocations used only when relaxing to ensure
3350 changes in size of section don't screw up .align. */
3351 static bfd_reloc_status_type
3352 nios2_elf32_ignore_reloc (bfd *abfd ATTRIBUTE_UNUSED, arelent *reloc_entry,
3353 asymbol *symbol ATTRIBUTE_UNUSED,
3354 void *data ATTRIBUTE_UNUSED, asection *input_section,
3356 char **error_message ATTRIBUTE_UNUSED)
3358 if (output_bfd != NULL)
3359 reloc_entry->address += input_section->output_offset;
3360 return bfd_reloc_ok;
3363 static bfd_reloc_status_type
3364 nios2_elf32_hi16_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
3365 void *data, asection *input_section,
3367 char **error_message ATTRIBUTE_UNUSED)
3369 /* This part is from bfd_elf_generic_reloc. */
3370 if (output_bfd != NULL
3371 && (symbol->flags & BSF_SECTION_SYM) == 0
3372 && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
3374 reloc_entry->address += input_section->output_offset;
3375 return bfd_reloc_ok;
3378 if (output_bfd != NULL)
3379 /* FIXME: See bfd_perform_relocation. Is this right? */
3380 return bfd_reloc_continue;
3382 return nios2_elf32_do_hi16_relocate (abfd, reloc_entry->howto,
3384 data, reloc_entry->address,
3386 + symbol->section->output_section->vma
3387 + symbol->section->output_offset),
3388 reloc_entry->addend);
3391 static bfd_reloc_status_type
3392 nios2_elf32_lo16_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
3393 void *data, asection *input_section,
3395 char **error_message ATTRIBUTE_UNUSED)
3397 /* This part is from bfd_elf_generic_reloc. */
3398 if (output_bfd != NULL
3399 && (symbol->flags & BSF_SECTION_SYM) == 0
3400 && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
3402 reloc_entry->address += input_section->output_offset;
3403 return bfd_reloc_ok;
3406 if (output_bfd != NULL)
3407 /* FIXME: See bfd_perform_relocation. Is this right? */
3408 return bfd_reloc_continue;
3410 return nios2_elf32_do_lo16_relocate (abfd, reloc_entry->howto,
3412 data, reloc_entry->address,
3414 + symbol->section->output_section->vma
3415 + symbol->section->output_offset),
3416 reloc_entry->addend);
3419 static bfd_reloc_status_type
3420 nios2_elf32_hiadj16_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
3421 void *data, asection *input_section,
3423 char **error_message ATTRIBUTE_UNUSED)
3425 /* This part is from bfd_elf_generic_reloc. */
3426 if (output_bfd != NULL
3427 && (symbol->flags & BSF_SECTION_SYM) == 0
3428 && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
3430 reloc_entry->address += input_section->output_offset;
3431 return bfd_reloc_ok;
3434 if (output_bfd != NULL)
3435 /* FIXME: See bfd_perform_relocation. Is this right? */
3436 return bfd_reloc_continue;
3438 return nios2_elf32_do_hiadj16_relocate (abfd, reloc_entry->howto,
3440 data, reloc_entry->address,
3442 + symbol->section->output_section->vma
3443 + symbol->section->output_offset),
3444 reloc_entry->addend);
3447 static bfd_reloc_status_type
3448 nios2_elf32_pcrel_lo16_relocate (bfd *abfd, arelent *reloc_entry,
3449 asymbol *symbol, void *data,
3450 asection *input_section, bfd *output_bfd,
3451 char **error_message ATTRIBUTE_UNUSED)
3453 /* This part is from bfd_elf_generic_reloc. */
3454 if (output_bfd != NULL
3455 && (symbol->flags & BSF_SECTION_SYM) == 0
3456 && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
3458 reloc_entry->address += input_section->output_offset;
3459 return bfd_reloc_ok;
3462 if (output_bfd != NULL)
3463 /* FIXME: See bfd_perform_relocation. Is this right? */
3464 return bfd_reloc_continue;
3466 return nios2_elf32_do_pcrel_lo16_relocate (
3467 abfd, reloc_entry->howto, input_section, data, reloc_entry->address,
3468 (symbol->value + symbol->section->output_section->vma
3469 + symbol->section->output_offset),
3470 reloc_entry->addend);
3473 static bfd_reloc_status_type
3474 nios2_elf32_pcrel_hiadj16_relocate (bfd *abfd, arelent *reloc_entry,
3475 asymbol *symbol, void *data,
3476 asection *input_section, bfd *output_bfd,
3477 char **error_message ATTRIBUTE_UNUSED)
3479 /* This part is from bfd_elf_generic_reloc. */
3480 if (output_bfd != NULL
3481 && (symbol->flags & BSF_SECTION_SYM) == 0
3482 && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
3484 reloc_entry->address += input_section->output_offset;
3485 return bfd_reloc_ok;
3488 if (output_bfd != NULL)
3489 /* FIXME: See bfd_perform_relocation. Is this right? */
3490 return bfd_reloc_continue;
3492 return nios2_elf32_do_pcrel_hiadj16_relocate (
3493 abfd, reloc_entry->howto, input_section, data, reloc_entry->address,
3494 (symbol->value + symbol->section->output_section->vma
3495 + symbol->section->output_offset),
3496 reloc_entry->addend);
3499 static bfd_reloc_status_type
3500 nios2_elf32_pcrel16_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
3501 void *data, asection *input_section,
3503 char **error_message ATTRIBUTE_UNUSED)
3505 /* This part is from bfd_elf_generic_reloc. */
3506 if (output_bfd != NULL
3507 && (symbol->flags & BSF_SECTION_SYM) == 0
3508 && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
3510 reloc_entry->address += input_section->output_offset;
3511 return bfd_reloc_ok;
3514 if (output_bfd != NULL)
3515 /* FIXME: See bfd_perform_relocation. Is this right? */
3516 return bfd_reloc_continue;
3518 return nios2_elf32_do_pcrel16_relocate (abfd, reloc_entry->howto,
3520 data, reloc_entry->address,
3522 + symbol->section->output_section->vma
3523 + symbol->section->output_offset),
3524 reloc_entry->addend);
3527 static bfd_reloc_status_type
3528 nios2_elf32_call26_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
3529 void *data, asection *input_section,
3531 char **error_message ATTRIBUTE_UNUSED)
3533 /* This part is from bfd_elf_generic_reloc. */
3534 if (output_bfd != NULL
3535 && (symbol->flags & BSF_SECTION_SYM) == 0
3536 && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
3538 reloc_entry->address += input_section->output_offset;
3539 return bfd_reloc_ok;
3542 if (output_bfd != NULL)
3543 /* FIXME: See bfd_perform_relocation. Is this right? */
3544 return bfd_reloc_continue;
3546 return nios2_elf32_do_call26_relocate (abfd, reloc_entry->howto,
3548 data, reloc_entry->address,
3550 + symbol->section->output_section->vma
3551 + symbol->section->output_offset),
3552 reloc_entry->addend);
3555 static bfd_reloc_status_type
3556 nios2_elf32_gprel_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
3557 void *data, asection *input_section,
3558 bfd *output_bfd, char **msg)
3562 bfd_reloc_status_type r;
3565 /* This part is from bfd_elf_generic_reloc. */
3566 if (output_bfd != NULL
3567 && (symbol->flags & BSF_SECTION_SYM) == 0
3568 && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
3570 reloc_entry->address += input_section->output_offset;
3571 return bfd_reloc_ok;
3574 if (output_bfd != NULL)
3575 /* FIXME: See bfd_perform_relocation. Is this right? */
3576 return bfd_reloc_continue;
3578 relocation = (symbol->value
3579 + symbol->section->output_section->vma
3580 + symbol->section->output_offset);
3582 /* This assumes we've already cached the _gp symbol. */
3583 r = nios2_elf_final_gp (abfd, symbol, FALSE, msg, &gp);
3584 if (r == bfd_reloc_ok)
3586 relocation = relocation + reloc_entry->addend - gp;
3587 reloc_entry->addend = 0;
3588 if ((signed) relocation < -32768 || (signed) relocation > 32767)
3590 *msg = _("global pointer relative address out of range");
3591 r = bfd_reloc_outofrange;
3594 r = nios2_elf32_do_gprel_relocate (abfd, reloc_entry->howto,
3596 data, reloc_entry->address,
3597 relocation, reloc_entry->addend);
3603 static bfd_reloc_status_type
3604 nios2_elf32_ujmp_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
3605 void *data, asection *input_section,
3606 bfd *output_bfd, char **msg ATTRIBUTE_UNUSED)
3608 /* This part is from bfd_elf_generic_reloc. */
3609 if (output_bfd != NULL
3610 && (symbol->flags & BSF_SECTION_SYM) == 0
3611 && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
3613 reloc_entry->address += input_section->output_offset;
3614 return bfd_reloc_ok;
3617 if (output_bfd != NULL)
3618 /* FIXME: See bfd_perform_relocation. Is this right? */
3619 return bfd_reloc_continue;
3621 return nios2_elf32_do_ujmp_relocate (abfd, reloc_entry->howto,
3623 data, reloc_entry->address,
3625 + symbol->section->output_section->vma
3626 + symbol->section->output_offset),
3627 reloc_entry->addend);
3630 static bfd_reloc_status_type
3631 nios2_elf32_cjmp_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
3632 void *data, asection *input_section,
3633 bfd *output_bfd, char **msg ATTRIBUTE_UNUSED)
3635 /* This part is from bfd_elf_generic_reloc. */
3636 if (output_bfd != NULL
3637 && (symbol->flags & BSF_SECTION_SYM) == 0
3638 && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
3640 reloc_entry->address += input_section->output_offset;
3641 return bfd_reloc_ok;
3644 if (output_bfd != NULL)
3645 /* FIXME: See bfd_perform_relocation. Is this right? */
3646 return bfd_reloc_continue;
3648 return nios2_elf32_do_cjmp_relocate (abfd, reloc_entry->howto,
3650 data, reloc_entry->address,
3652 + symbol->section->output_section->vma
3653 + symbol->section->output_offset),
3654 reloc_entry->addend);
3657 static bfd_reloc_status_type
3658 nios2_elf32_callr_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
3659 void *data, asection *input_section,
3660 bfd *output_bfd, char **msg ATTRIBUTE_UNUSED)
3662 /* This part is from bfd_elf_generic_reloc. */
3663 if (output_bfd != NULL
3664 && (symbol->flags & BSF_SECTION_SYM) == 0
3665 && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
3667 reloc_entry->address += input_section->output_offset;
3668 return bfd_reloc_ok;
3671 if (output_bfd != NULL)
3672 /* FIXME: See bfd_perform_relocation. Is this right? */
3673 return bfd_reloc_continue;
3675 return nios2_elf32_do_callr_relocate (abfd, reloc_entry->howto,
3677 data, reloc_entry->address,
3679 + symbol->section->output_section->vma
3680 + symbol->section->output_offset),
3681 reloc_entry->addend);
3685 /* Implement elf_backend_relocate_section. */
3687 nios2_elf32_relocate_section (bfd *output_bfd,
3688 struct bfd_link_info *info,
3690 asection *input_section,
3692 Elf_Internal_Rela *relocs,
3693 Elf_Internal_Sym *local_syms,
3694 asection **local_sections)
3696 Elf_Internal_Shdr *symtab_hdr;
3697 struct elf_link_hash_entry **sym_hashes;
3698 Elf_Internal_Rela *rel;
3699 Elf_Internal_Rela *relend;
3700 struct elf32_nios2_link_hash_table *htab;
3703 asection *sreloc = NULL;
3704 bfd_vma *local_got_offsets;
3707 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
3708 sym_hashes = elf_sym_hashes (input_bfd);
3709 relend = relocs + input_section->reloc_count;
3711 htab = elf32_nios2_hash_table (info);
3712 sgot = htab->root.sgot;
3713 splt = htab->root.splt;
3714 local_got_offsets = elf_local_got_offsets (input_bfd);
3716 if (elf32_nios2_hash_table (info)->h_gp_got == NULL)
3719 got_base = elf32_nios2_hash_table (info)->h_gp_got->root.u.def.value;
3721 for (rel = relocs; rel < relend; rel++)
3723 reloc_howto_type *howto;
3724 unsigned long r_symndx;
3725 Elf_Internal_Sym *sym;
3727 struct elf_link_hash_entry *h;
3728 struct elf32_nios2_link_hash_entry *eh;
3731 bfd_reloc_status_type r = bfd_reloc_ok;
3732 const char *name = NULL;
3736 const char* msg = (const char*) NULL;
3737 bfd_boolean unresolved_reloc;
3741 r_type = ELF32_R_TYPE (rel->r_info);
3742 r_symndx = ELF32_R_SYM (rel->r_info);
3744 howto = lookup_howto ((unsigned) ELF32_R_TYPE (rel->r_info), output_bfd);
3749 if (r_symndx < symtab_hdr->sh_info)
3751 sym = local_syms + r_symndx;
3752 sec = local_sections[r_symndx];
3753 relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
3757 bfd_boolean warned, ignored;
3759 RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
3760 r_symndx, symtab_hdr, sym_hashes,
3762 unresolved_reloc, warned, ignored);
3765 if (sec && discarded_section (sec))
3766 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
3767 rel, 1, relend, howto, 0, contents);
3769 /* Nothing more to do unless this is a final link. */
3770 if (bfd_link_relocatable (info))
3775 switch (howto->type)
3778 r = nios2_elf32_do_hi16_relocate (input_bfd, howto,
3780 contents, rel->r_offset,
3781 relocation, rel->r_addend);
3784 r = nios2_elf32_do_lo16_relocate (input_bfd, howto,
3786 contents, rel->r_offset,
3787 relocation, rel->r_addend);
3789 case R_NIOS2_PCREL_LO:
3790 r = nios2_elf32_do_pcrel_lo16_relocate (input_bfd, howto,
3797 case R_NIOS2_HIADJ16:
3798 r = nios2_elf32_do_hiadj16_relocate (input_bfd, howto,
3799 input_section, contents,
3800 rel->r_offset, relocation,
3803 case R_NIOS2_PCREL_HA:
3804 r = nios2_elf32_do_pcrel_hiadj16_relocate (input_bfd, howto,
3811 case R_NIOS2_PCREL16:
3812 r = nios2_elf32_do_pcrel16_relocate (input_bfd, howto,
3813 input_section, contents,
3814 rel->r_offset, relocation,
3818 /* Turns an absolute address into a gp-relative address. */
3819 if (!nios2_elf_assign_gp (output_bfd, &gp, info))
3821 bfd_vma reloc_address;
3823 if (sec && sec->output_section)
3824 reloc_address = (sec->output_section->vma
3825 + sec->output_offset
3830 format = _("global pointer relative relocation at address "
3831 "0x%08x when _gp not defined\n");
3832 sprintf (msgbuf, format, reloc_address);
3834 r = bfd_reloc_dangerous;
3838 bfd_vma symbol_address = rel->r_addend + relocation;
3839 relocation = symbol_address - gp;
3841 if (((signed) relocation < -32768
3842 || (signed) relocation > 32767)
3844 || h->root.type == bfd_link_hash_defined
3845 || h->root.type == bfd_link_hash_defweak))
3848 name = h->root.root.string;
3849 /* xgettext:c-format */
3850 format = _("Unable to reach %s (at 0x%08x) from the "
3851 "global pointer (at 0x%08x) because the "
3852 "offset (%d) is out of the allowed range, "
3853 "-32678 to 32767.\n" );
3854 sprintf (msgbuf, format, name, symbol_address, gp,
3855 (signed)relocation);
3857 r = bfd_reloc_outofrange;
3860 r = _bfd_final_link_relocate (howto, input_bfd,
3861 input_section, contents,
3862 rel->r_offset, relocation,
3867 r = nios2_elf32_do_ujmp_relocate (input_bfd, howto,
3869 contents, rel->r_offset,
3870 relocation, rel->r_addend);
3873 r = nios2_elf32_do_cjmp_relocate (input_bfd, howto,
3875 contents, rel->r_offset,
3876 relocation, rel->r_addend);
3879 r = nios2_elf32_do_callr_relocate (input_bfd, howto,
3880 input_section, contents,
3881 rel->r_offset, relocation,
3884 case R_NIOS2_CALL26:
3885 case R_NIOS2_CALL26_NOAT:
3886 /* If we have a call to an undefined weak symbol, we just want
3887 to stuff a zero in the bits of the call instruction and
3888 bypass the normal call26 relocation handling, because it'll
3889 diagnose an overflow error if address 0 isn't in the same
3890 256MB segment as the call site. Presumably the call
3891 should be guarded by a null check anyway. */
3892 if (h != NULL && h->root.type == bfd_link_hash_undefweak)
3894 BFD_ASSERT (relocation == 0 && rel->r_addend == 0);
3895 r = _bfd_final_link_relocate (howto, input_bfd,
3896 input_section, contents,
3897 rel->r_offset, relocation,
3901 /* Handle relocations which should use the PLT entry.
3902 NIOS2_BFD_RELOC_32 relocations will use the symbol's value,
3903 which may point to a PLT entry, but we don't need to handle
3904 that here. If we created a PLT entry, all branches in this
3905 object should go to it. */
3906 if (h != NULL && splt != NULL && h->plt.offset != (bfd_vma) -1)
3908 /* If we've created a .plt section, and assigned a PLT entry
3909 to this function, it should not be known to bind locally.
3910 If it were, we would have cleared the PLT entry. */
3911 BFD_ASSERT (!SYMBOL_CALLS_LOCAL (info, h));
3913 relocation = (splt->output_section->vma
3914 + splt->output_offset
3917 unresolved_reloc = FALSE;
3919 /* Detect R_NIOS2_CALL26 relocations that would overflow the
3920 256MB segment. Replace the target with a reference to a
3922 Note that htab->stub_group is null if relaxation has been
3923 disabled by the --no-relax linker command-line option, so
3924 we can use that to skip this processing entirely. */
3925 if (howto->type == R_NIOS2_CALL26 && htab->stub_group)
3927 bfd_vma dest = relocation + rel->r_addend;
3928 enum elf32_nios2_stub_type stub_type;
3930 eh = (struct elf32_nios2_link_hash_entry *)h;
3931 stub_type = nios2_type_of_stub (input_section, rel, eh,
3934 if (stub_type != nios2_stub_none)
3936 struct elf32_nios2_stub_hash_entry *hsh;
3938 hsh = nios2_get_stub_entry (input_section, sec,
3939 eh, rel, htab, stub_type);
3942 r = bfd_reloc_undefined;
3946 dest = (hsh->stub_offset
3947 + hsh->stub_sec->output_offset
3948 + hsh->stub_sec->output_section->vma);
3949 r = nios2_elf32_do_call26_relocate (input_bfd, howto,
3959 r = nios2_elf32_do_call26_relocate (input_bfd, howto,
3960 input_section, contents,
3961 rel->r_offset, relocation,
3966 /* For symmetry this would be
3967 r = nios2_elf32_do_ignore_reloc (input_bfd, howto,
3968 input_section, contents,
3969 rel->r_offset, relocation,
3971 but do_ignore_reloc would do no more than return
3976 case R_NIOS2_CALL16:
3977 case R_NIOS2_GOT_LO:
3978 case R_NIOS2_GOT_HA:
3979 case R_NIOS2_CALL_LO:
3980 case R_NIOS2_CALL_HA:
3981 /* Relocation is to the entry for this symbol in the
3982 global offset table. */
3985 r = bfd_reloc_notsupported;
3995 eh = (struct elf32_nios2_link_hash_entry *)h;
3996 use_plt = (eh->got_types_used == CALL_USED
3997 && h->plt.offset != (bfd_vma) -1);
3999 off = h->got.offset;
4000 BFD_ASSERT (off != (bfd_vma) -1);
4001 dyn = elf_hash_table (info)->dynamic_sections_created;
4002 if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn,
4003 bfd_link_pic (info),
4005 || (bfd_link_pic (info)
4006 && SYMBOL_REFERENCES_LOCAL (info, h))
4007 || (ELF_ST_VISIBILITY (h->other)
4008 && h->root.type == bfd_link_hash_undefweak))
4010 /* This is actually a static link, or it is a -Bsymbolic
4011 link and the symbol is defined locally. We must
4012 initialize this entry in the global offset table.
4013 Since the offset must always be a multiple of 4, we
4014 use the least significant bit to record whether we
4015 have initialized it already.
4017 When doing a dynamic link, we create a .rela.got
4018 relocation entry to initialize the value. This is
4019 done in the finish_dynamic_symbol routine. */
4024 bfd_put_32 (output_bfd, relocation,
4025 sgot->contents + off);
4030 unresolved_reloc = FALSE;
4034 BFD_ASSERT (local_got_offsets != NULL
4035 && local_got_offsets[r_symndx] != (bfd_vma) -1);
4037 off = local_got_offsets[r_symndx];
4039 /* The offset must always be a multiple of 4. We use the
4040 least significant bit to record whether we have already
4041 generated the necessary reloc. */
4046 bfd_put_32 (output_bfd, relocation,
4047 sgot->contents + off);
4049 if (bfd_link_pic (info))
4052 Elf_Internal_Rela outrel;
4055 srelgot = htab->root.srelgot;
4056 BFD_ASSERT (srelgot != NULL);
4058 outrel.r_addend = relocation;
4059 outrel.r_offset = (sgot->output_section->vma
4060 + sgot->output_offset
4062 outrel.r_info = ELF32_R_INFO (0, R_NIOS2_RELATIVE);
4063 loc = srelgot->contents;
4064 loc += (srelgot->reloc_count++ *
4065 sizeof (Elf32_External_Rela));
4066 bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
4069 local_got_offsets[r_symndx] |= 1;
4073 if (use_plt && bfd_link_pic (info))
4075 off = ((h->plt.offset - 24) / 12 + 3) * 4;
4076 relocation = (htab->root.sgotplt->output_offset + off
4080 relocation = sgot->output_offset + off - got_base;
4082 /* This relocation does not use the addend. */
4085 switch (howto->type)
4087 case R_NIOS2_GOT_LO:
4088 case R_NIOS2_CALL_LO:
4089 r = nios2_elf32_do_lo16_relocate (input_bfd, howto,
4090 input_section, contents,
4091 rel->r_offset, relocation,
4094 case R_NIOS2_GOT_HA:
4095 case R_NIOS2_CALL_HA:
4096 r = nios2_elf32_do_hiadj16_relocate (input_bfd, howto,
4097 input_section, contents,
4103 r = _bfd_final_link_relocate (howto, input_bfd,
4104 input_section, contents,
4105 rel->r_offset, relocation,
4111 case R_NIOS2_GOTOFF_LO:
4112 case R_NIOS2_GOTOFF_HA:
4113 case R_NIOS2_GOTOFF:
4114 /* Relocation is relative to the global offset table pointer. */
4116 BFD_ASSERT (sgot != NULL);
4119 r = bfd_reloc_notsupported;
4123 /* Note that sgot->output_offset is not involved in this
4124 calculation. We always want the start of .got. */
4125 relocation -= sgot->output_section->vma;
4127 /* Now we adjust the relocation to be relative to the GOT pointer
4128 (the _gp_got symbol), which possibly contains the 0x8000 bias. */
4129 relocation -= got_base;
4131 switch (howto->type)
4133 case R_NIOS2_GOTOFF_LO:
4134 r = nios2_elf32_do_lo16_relocate (input_bfd, howto,
4135 input_section, contents,
4136 rel->r_offset, relocation,
4139 case R_NIOS2_GOTOFF_HA:
4140 r = nios2_elf32_do_hiadj16_relocate (input_bfd, howto,
4141 input_section, contents,
4147 r = _bfd_final_link_relocate (howto, input_bfd,
4148 input_section, contents,
4149 rel->r_offset, relocation,
4155 case R_NIOS2_TLS_LDO16:
4156 relocation -= dtpoff_base (info) + DTP_OFFSET;
4158 r = _bfd_final_link_relocate (howto, input_bfd, input_section,
4159 contents, rel->r_offset,
4160 relocation, rel->r_addend);
4162 case R_NIOS2_TLS_LDM16:
4163 if (htab->root.sgot == NULL)
4166 off = htab->tls_ldm_got.offset;
4172 /* If we don't know the module number, create a relocation
4174 if (bfd_link_pic (info))
4176 Elf_Internal_Rela outrel;
4179 if (htab->root.srelgot == NULL)
4182 outrel.r_addend = 0;
4183 outrel.r_offset = (htab->root.sgot->output_section->vma
4184 + htab->root.sgot->output_offset
4186 outrel.r_info = ELF32_R_INFO (0, R_NIOS2_TLS_DTPMOD);
4188 loc = htab->root.srelgot->contents;
4189 loc += (htab->root.srelgot->reloc_count++
4190 * sizeof (Elf32_External_Rela));
4191 bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
4194 bfd_put_32 (output_bfd, 1,
4195 htab->root.sgot->contents + off);
4197 htab->tls_ldm_got.offset |= 1;
4200 relocation = htab->root.sgot->output_offset + off - got_base;
4202 r = _bfd_final_link_relocate (howto, input_bfd, input_section,
4203 contents, rel->r_offset,
4204 relocation, rel->r_addend);
4207 case R_NIOS2_TLS_GD16:
4208 case R_NIOS2_TLS_IE16:
4213 if (htab->root.sgot == NULL)
4220 dyn = htab->root.dynamic_sections_created;
4221 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn,
4222 bfd_link_pic (info),
4224 && (!bfd_link_pic (info)
4225 || !SYMBOL_REFERENCES_LOCAL (info, h)))
4227 unresolved_reloc = FALSE;
4230 off = h->got.offset;
4231 tls_type = (((struct elf32_nios2_link_hash_entry *) h)
4236 if (local_got_offsets == NULL)
4238 off = local_got_offsets[r_symndx];
4239 tls_type = (elf32_nios2_local_got_tls_type (input_bfd)
4243 if (tls_type == GOT_UNKNOWN)
4250 bfd_boolean need_relocs = FALSE;
4251 Elf_Internal_Rela outrel;
4252 bfd_byte *loc = NULL;
4255 /* The GOT entries have not been initialized yet. Do it
4256 now, and emit any relocations. If both an IE GOT and a
4257 GD GOT are necessary, we emit the GD first. */
4259 if ((bfd_link_pic (info) || indx != 0)
4261 || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
4262 || h->root.type != bfd_link_hash_undefweak))
4265 if (htab->root.srelgot == NULL)
4267 loc = htab->root.srelgot->contents;
4268 loc += (htab->root.srelgot->reloc_count *
4269 sizeof (Elf32_External_Rela));
4272 if (tls_type & GOT_TLS_GD)
4276 outrel.r_addend = 0;
4277 outrel.r_offset = (htab->root.sgot->output_section->vma
4278 + htab->root.sgot->output_offset
4280 outrel.r_info = ELF32_R_INFO (indx,
4281 R_NIOS2_TLS_DTPMOD);
4283 bfd_elf32_swap_reloca_out (output_bfd, &outrel,
4285 htab->root.srelgot->reloc_count++;
4286 loc += sizeof (Elf32_External_Rela);
4289 bfd_put_32 (output_bfd,
4290 (relocation - dtpoff_base (info) -
4292 htab->root.sgot->contents + cur_off + 4);
4295 outrel.r_addend = 0;
4296 outrel.r_info = ELF32_R_INFO (indx,
4297 R_NIOS2_TLS_DTPREL);
4298 outrel.r_offset += 4;
4300 bfd_elf32_swap_reloca_out (output_bfd, &outrel,
4302 htab->root.srelgot->reloc_count++;
4303 loc += sizeof (Elf32_External_Rela);
4308 /* If we are not emitting relocations for a
4309 general dynamic reference, then we must be in a
4310 static link or an executable link with the
4311 symbol binding locally. Mark it as belonging
4312 to module 1, the executable. */
4313 bfd_put_32 (output_bfd, 1,
4314 htab->root.sgot->contents + cur_off);
4315 bfd_put_32 (output_bfd, (relocation -
4316 dtpoff_base (info) -
4318 htab->root.sgot->contents + cur_off + 4);
4324 if (tls_type & GOT_TLS_IE)
4329 outrel.r_addend = (relocation -
4330 dtpoff_base (info));
4332 outrel.r_addend = 0;
4333 outrel.r_offset = (htab->root.sgot->output_section->vma
4334 + htab->root.sgot->output_offset
4336 outrel.r_info = ELF32_R_INFO (indx,
4339 bfd_elf32_swap_reloca_out (output_bfd, &outrel,
4341 htab->root.srelgot->reloc_count++;
4342 loc += sizeof (Elf32_External_Rela);
4345 bfd_put_32 (output_bfd, (tpoff (info, relocation)
4347 htab->root.sgot->contents + cur_off);
4354 local_got_offsets[r_symndx] |= 1;
4357 if ((tls_type & GOT_TLS_GD) && r_type != R_NIOS2_TLS_GD16)
4359 relocation = htab->root.sgot->output_offset + off - got_base;
4361 r = _bfd_final_link_relocate (howto, input_bfd, input_section,
4362 contents, rel->r_offset,
4363 relocation, rel->r_addend);
4367 case R_NIOS2_TLS_LE16:
4368 if (bfd_link_dll (info))
4371 /* xgettext:c-format */
4372 (_("%B(%A+0x%lx): R_NIOS2_TLS_LE16 relocation not "
4373 "permitted in shared object"),
4374 input_bfd, input_section,
4375 (long) rel->r_offset, howto->name);
4379 relocation = tpoff (info, relocation) - TP_OFFSET;
4381 r = _bfd_final_link_relocate (howto, input_bfd, input_section,
4382 contents, rel->r_offset,
4383 relocation, rel->r_addend);
4386 case R_NIOS2_BFD_RELOC_32:
4387 if (bfd_link_pic (info)
4388 && (input_section->flags & SEC_ALLOC) != 0
4390 || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
4391 || h->root.type != bfd_link_hash_undefweak))
4393 Elf_Internal_Rela outrel;
4395 bfd_boolean skip, relocate;
4397 /* When generating a shared object, these relocations
4398 are copied into the output file to be resolved at run
4405 = _bfd_elf_section_offset (output_bfd, info,
4406 input_section, rel->r_offset);
4407 if (outrel.r_offset == (bfd_vma) -1)
4409 else if (outrel.r_offset == (bfd_vma) -2)
4410 skip = TRUE, relocate = TRUE;
4411 outrel.r_offset += (input_section->output_section->vma
4412 + input_section->output_offset);
4415 memset (&outrel, 0, sizeof outrel);
4418 && (!bfd_link_pic (info)
4419 || !SYMBOLIC_BIND (info, h)
4420 || !h->def_regular))
4422 outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
4423 outrel.r_addend = rel->r_addend;
4427 /* This symbol is local, or marked to become local. */
4428 outrel.r_addend = relocation + rel->r_addend;
4430 outrel.r_info = ELF32_R_INFO (0, R_NIOS2_RELATIVE);
4433 sreloc = elf_section_data (input_section)->sreloc;
4437 loc = sreloc->contents;
4438 loc += sreloc->reloc_count++ * sizeof (Elf32_External_Rela);
4439 bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
4441 /* This reloc will be computed at runtime, so there's no
4442 need to do anything now, except for R_NIOS2_BFD_RELOC_32
4443 relocations that have been turned into
4444 R_NIOS2_RELATIVE. */
4449 r = _bfd_final_link_relocate (howto, input_bfd,
4450 input_section, contents,
4451 rel->r_offset, relocation,
4455 case R_NIOS2_TLS_DTPREL:
4456 relocation -= dtpoff_base (info);
4460 r = _bfd_final_link_relocate (howto, input_bfd,
4461 input_section, contents,
4462 rel->r_offset, relocation,
4468 r = bfd_reloc_notsupported;
4470 if (r != bfd_reloc_ok)
4473 name = h->root.root.string;
4476 name = bfd_elf_string_from_elf_section (input_bfd,
4477 symtab_hdr->sh_link,
4479 if (name == NULL || *name == '\0')
4480 name = bfd_section_name (input_bfd, sec);
4485 case bfd_reloc_overflow:
4486 (*info->callbacks->reloc_overflow) (info, NULL, name,
4487 howto->name, (bfd_vma) 0,
4488 input_bfd, input_section,
4492 case bfd_reloc_undefined:
4493 (*info->callbacks->undefined_symbol) (info, name, input_bfd,
4495 rel->r_offset, TRUE);
4498 case bfd_reloc_outofrange:
4500 msg = _("relocation out of range");
4503 case bfd_reloc_notsupported:
4505 msg = _("unsupported relocation");
4508 case bfd_reloc_dangerous:
4510 msg = _("dangerous relocation");
4515 msg = _("unknown error");
4521 (*info->callbacks->warning) (info, msg, name, input_bfd,
4522 input_section, rel->r_offset);
4530 /* Implement elf-backend_section_flags:
4531 Convert NIOS2 specific section flags to bfd internal section flags. */
4533 nios2_elf32_section_flags (flagword *flags, const Elf_Internal_Shdr *hdr)
4535 if (hdr->sh_flags & SHF_NIOS2_GPREL)
4536 *flags |= SEC_SMALL_DATA;
4541 /* Implement elf_backend_fake_sections:
4542 Set the correct type for an NIOS2 ELF section. We do this by the
4543 section name, which is a hack, but ought to work. */
4545 nios2_elf32_fake_sections (bfd *abfd ATTRIBUTE_UNUSED,
4546 Elf_Internal_Shdr *hdr, asection *sec)
4548 register const char *name = bfd_get_section_name (abfd, sec);
4550 if ((sec->flags & SEC_SMALL_DATA)
4551 || strcmp (name, ".sdata") == 0
4552 || strcmp (name, ".sbss") == 0
4553 || strcmp (name, ".lit4") == 0 || strcmp (name, ".lit8") == 0)
4554 hdr->sh_flags |= SHF_NIOS2_GPREL;
4559 /* Create .got, .gotplt, and .rela.got sections in DYNOBJ, and set up
4560 shortcuts to them in our hash table. */
4562 create_got_section (bfd *dynobj, struct bfd_link_info *info)
4564 struct elf32_nios2_link_hash_table *htab;
4565 struct elf_link_hash_entry *h;
4567 htab = elf32_nios2_hash_table (info);
4569 if (! _bfd_elf_create_got_section (dynobj, info))
4572 /* In order for the two loads in .PLTresolve to share the same %hiadj,
4573 _GLOBAL_OFFSET_TABLE_ must be aligned to a 16-byte boundary. */
4574 if (!bfd_set_section_alignment (dynobj, htab->root.sgotplt, 4))
4577 /* The Nios II ABI specifies that GOT-relative relocations are relative
4578 to the linker-created symbol _gp_got, rather than using
4579 _GLOBAL_OFFSET_TABLE_ directly. In particular, the latter always
4580 points to the base of the GOT while _gp_got may include a bias. */
4581 h = _bfd_elf_define_linkage_sym (dynobj, info, htab->root.sgotplt,
4583 elf32_nios2_hash_table (info)->h_gp_got = h;
4590 /* Implement elf_backend_create_dynamic_sections:
4591 Create .plt, .rela.plt, .got, .got.plt, .rela.got, .dynbss, and
4592 .rela.bss sections in DYNOBJ, and set up shortcuts to them in our
4595 nios2_elf32_create_dynamic_sections (bfd *dynobj, struct bfd_link_info *info)
4597 struct elf32_nios2_link_hash_table *htab;
4599 htab = elf32_nios2_hash_table (info);
4600 if (!htab->root.sgot && !create_got_section (dynobj, info))
4603 if (!_bfd_elf_create_dynamic_sections (dynobj, info))
4606 /* In order for the two loads in a shared object .PLTresolve to share the
4607 same %hiadj, the start of the PLT (as well as the GOT) must be aligned
4608 to a 16-byte boundary. This is because the addresses for these loads
4609 include the -(.plt+4) PIC correction. */
4610 return bfd_set_section_alignment (dynobj, htab->root.splt, 4);
4613 /* Implement elf_backend_copy_indirect_symbol:
4614 Copy the extra info we tack onto an elf_link_hash_entry. */
4616 nios2_elf32_copy_indirect_symbol (struct bfd_link_info *info,
4617 struct elf_link_hash_entry *dir,
4618 struct elf_link_hash_entry *ind)
4620 struct elf32_nios2_link_hash_entry *edir, *eind;
4622 edir = (struct elf32_nios2_link_hash_entry *) dir;
4623 eind = (struct elf32_nios2_link_hash_entry *) ind;
4625 if (eind->dyn_relocs != NULL)
4627 if (edir->dyn_relocs != NULL)
4629 struct elf32_nios2_dyn_relocs **pp;
4630 struct elf32_nios2_dyn_relocs *p;
4632 /* Add reloc counts against the indirect sym to the direct sym
4633 list. Merge any entries against the same section. */
4634 for (pp = &eind->dyn_relocs; (p = *pp) != NULL; )
4636 struct elf32_nios2_dyn_relocs *q;
4638 for (q = edir->dyn_relocs; q != NULL; q = q->next)
4639 if (q->sec == p->sec)
4641 q->pc_count += p->pc_count;
4642 q->count += p->count;
4649 *pp = edir->dyn_relocs;
4652 edir->dyn_relocs = eind->dyn_relocs;
4653 eind->dyn_relocs = NULL;
4656 if (ind->root.type == bfd_link_hash_indirect
4657 && dir->got.refcount <= 0)
4659 edir->tls_type = eind->tls_type;
4660 eind->tls_type = GOT_UNKNOWN;
4663 edir->got_types_used |= eind->got_types_used;
4665 _bfd_elf_link_hash_copy_indirect (info, dir, ind);
4668 /* Set the right machine number for a NIOS2 ELF file. */
4671 nios2_elf32_object_p (bfd *abfd)
4675 mach = elf_elfheader (abfd)->e_flags;
4680 case EF_NIOS2_ARCH_R1:
4681 bfd_default_set_arch_mach (abfd, bfd_arch_nios2, bfd_mach_nios2r1);
4683 case EF_NIOS2_ARCH_R2:
4684 bfd_default_set_arch_mach (abfd, bfd_arch_nios2, bfd_mach_nios2r2);
4691 /* Implement elf_backend_check_relocs:
4692 Look through the relocs for a section during the first phase. */
4694 nios2_elf32_check_relocs (bfd *abfd, struct bfd_link_info *info,
4695 asection *sec, const Elf_Internal_Rela *relocs)
4698 Elf_Internal_Shdr *symtab_hdr;
4699 struct elf_link_hash_entry **sym_hashes, **sym_hashes_end;
4700 const Elf_Internal_Rela *rel;
4701 const Elf_Internal_Rela *rel_end;
4702 struct elf32_nios2_link_hash_table *htab;
4705 asection *sreloc = NULL;
4706 bfd_signed_vma *local_got_refcounts;
4708 if (bfd_link_relocatable (info))
4711 dynobj = elf_hash_table (info)->dynobj;
4712 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
4713 sym_hashes = elf_sym_hashes (abfd);
4714 sym_hashes_end = (sym_hashes
4715 + symtab_hdr->sh_size / sizeof (Elf32_External_Sym));
4716 if (!elf_bad_symtab (abfd))
4717 sym_hashes_end -= symtab_hdr->sh_info;
4718 local_got_refcounts = elf_local_got_refcounts (abfd);
4720 htab = elf32_nios2_hash_table (info);
4721 sgot = htab->root.sgot;
4722 srelgot = htab->root.srelgot;
4724 rel_end = relocs + sec->reloc_count;
4725 for (rel = relocs; rel < rel_end; rel++)
4727 unsigned int r_type;
4728 struct elf_link_hash_entry *h;
4729 unsigned long r_symndx;
4731 r_symndx = ELF32_R_SYM (rel->r_info);
4732 if (r_symndx < symtab_hdr->sh_info)
4736 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
4737 while (h->root.type == bfd_link_hash_indirect
4738 || h->root.type == bfd_link_hash_warning)
4739 h = (struct elf_link_hash_entry *) h->root.u.i.link;
4741 /* PR15323, ref flags aren't set for references in the same
4743 h->root.non_ir_ref = 1;
4746 r_type = ELF32_R_TYPE (rel->r_info);
4751 case R_NIOS2_GOT_LO:
4752 case R_NIOS2_GOT_HA:
4753 case R_NIOS2_CALL16:
4754 case R_NIOS2_CALL_LO:
4755 case R_NIOS2_CALL_HA:
4756 case R_NIOS2_TLS_GD16:
4757 case R_NIOS2_TLS_IE16:
4758 /* This symbol requires a global offset table entry. */
4760 int tls_type, old_tls_type;
4766 case R_NIOS2_GOT_LO:
4767 case R_NIOS2_GOT_HA:
4768 case R_NIOS2_CALL16:
4769 case R_NIOS2_CALL_LO:
4770 case R_NIOS2_CALL_HA:
4771 tls_type = GOT_NORMAL;
4773 case R_NIOS2_TLS_GD16:
4774 tls_type = GOT_TLS_GD;
4776 case R_NIOS2_TLS_IE16:
4777 tls_type = GOT_TLS_IE;
4783 /* Create the .got section. */
4784 elf_hash_table (info)->dynobj = dynobj = abfd;
4785 nios2_elf32_create_dynamic_sections (dynobj, info);
4790 sgot = htab->root.sgot;
4791 BFD_ASSERT (sgot != NULL);
4795 && (h != NULL || bfd_link_pic (info)))
4797 srelgot = htab->root.srelgot;
4798 BFD_ASSERT (srelgot != NULL);
4803 struct elf32_nios2_link_hash_entry *eh
4804 = (struct elf32_nios2_link_hash_entry *)h;
4806 old_tls_type = elf32_nios2_hash_entry(h)->tls_type;
4807 if (r_type == R_NIOS2_CALL16
4808 || r_type == R_NIOS2_CALL_LO
4809 || r_type == R_NIOS2_CALL_HA)
4811 /* Make sure a plt entry is created for this symbol if
4812 it turns out to be a function defined by a dynamic
4817 eh->got_types_used |= CALL_USED;
4820 eh->got_types_used |= GOT_USED;
4824 /* This is a global offset table entry for a local symbol. */
4825 if (local_got_refcounts == NULL)
4829 size = symtab_hdr->sh_info;
4830 size *= (sizeof (bfd_signed_vma) + sizeof (char));
4832 = ((bfd_signed_vma *) bfd_zalloc (abfd, size));
4833 if (local_got_refcounts == NULL)
4835 elf_local_got_refcounts (abfd) = local_got_refcounts;
4836 elf32_nios2_local_got_tls_type (abfd)
4837 = (char *) (local_got_refcounts + symtab_hdr->sh_info);
4839 local_got_refcounts[r_symndx]++;
4840 old_tls_type = elf32_nios2_local_got_tls_type (abfd) [r_symndx];
4843 /* We will already have issued an error message if there is a
4844 TLS / non-TLS mismatch, based on the symbol type. We don't
4845 support any linker relaxations. So just combine any TLS
4847 if (old_tls_type != GOT_UNKNOWN && old_tls_type != GOT_NORMAL
4848 && tls_type != GOT_NORMAL)
4849 tls_type |= old_tls_type;
4851 if (old_tls_type != tls_type)
4854 elf32_nios2_hash_entry (h)->tls_type = tls_type;
4856 elf32_nios2_local_got_tls_type (abfd) [r_symndx] = tls_type;
4860 case R_NIOS2_TLS_LDM16:
4861 if (r_type == R_NIOS2_TLS_LDM16)
4862 htab->tls_ldm_got.refcount++;
4864 if (htab->root.sgot == NULL)
4866 if (htab->root.dynobj == NULL)
4867 htab->root.dynobj = abfd;
4868 if (!create_got_section (htab->root.dynobj, info))
4873 /* This relocation describes the C++ object vtable hierarchy.
4874 Reconstruct it for later use during GC. */
4875 case R_NIOS2_GNU_VTINHERIT:
4876 if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
4880 /* This relocation describes which C++ vtable entries are actually
4881 used. Record for later use during GC. */
4882 case R_NIOS2_GNU_VTENTRY:
4883 if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
4887 case R_NIOS2_BFD_RELOC_32:
4888 case R_NIOS2_CALL26:
4889 case R_NIOS2_CALL26_NOAT:
4890 case R_NIOS2_HIADJ16:
4895 /* If this reloc is in a read-only section, we might
4896 need a copy reloc. We can't check reliably at this
4897 stage whether the section is read-only, as input
4898 sections have not yet been mapped to output sections.
4899 Tentatively set the flag for now, and correct in
4900 adjust_dynamic_symbol. */
4901 if (!bfd_link_pic (info))
4904 /* Make sure a plt entry is created for this symbol if it
4905 turns out to be a function defined by a dynamic object. */
4908 if (r_type == R_NIOS2_CALL26 || r_type == R_NIOS2_CALL26_NOAT)
4912 /* If we are creating a shared library, we need to copy the
4913 reloc into the shared library. */
4914 if (bfd_link_pic (info)
4915 && (sec->flags & SEC_ALLOC) != 0
4916 && (r_type == R_NIOS2_BFD_RELOC_32
4917 || (h != NULL && ! h->needs_plt
4918 && (! SYMBOLIC_BIND (info, h) || ! h->def_regular))))
4920 struct elf32_nios2_dyn_relocs *p;
4921 struct elf32_nios2_dyn_relocs **head;
4923 /* When creating a shared object, we must copy these
4924 reloc types into the output file. We create a reloc
4925 section in dynobj and make room for this reloc. */
4928 sreloc = _bfd_elf_make_dynamic_reloc_section
4929 (sec, dynobj, 2, abfd, TRUE);
4934 /* If this is a global symbol, we count the number of
4935 relocations we need for this symbol. */
4937 head = &((struct elf32_nios2_link_hash_entry *) h)->dyn_relocs;
4940 /* Track dynamic relocs needed for local syms too.
4941 We really need local syms available to do this
4946 Elf_Internal_Sym *isym;
4948 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
4953 s = bfd_section_from_elf_index (abfd, isym->st_shndx);
4957 vpp = &elf_section_data (s)->local_dynrel;
4958 head = (struct elf32_nios2_dyn_relocs **) vpp;
4962 if (p == NULL || p->sec != sec)
4964 bfd_size_type amt = sizeof *p;
4965 p = ((struct elf32_nios2_dyn_relocs *)
4966 bfd_alloc (htab->root.dynobj, amt));
4987 /* Implement elf_backend_gc_mark_hook:
4988 Return the section that should be marked against GC for a given
4991 nios2_elf32_gc_mark_hook (asection *sec,
4992 struct bfd_link_info *info,
4993 Elf_Internal_Rela *rel,
4994 struct elf_link_hash_entry *h,
4995 Elf_Internal_Sym *sym)
4998 switch (ELF32_R_TYPE (rel->r_info))
5000 case R_NIOS2_GNU_VTINHERIT:
5001 case R_NIOS2_GNU_VTENTRY:
5004 return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
5007 /* Implement elf_backend_gc_sweep_hook:
5008 Update the got entry reference counts for the section being removed. */
5010 nios2_elf32_gc_sweep_hook (bfd *abfd,
5011 struct bfd_link_info *info,
5013 const Elf_Internal_Rela *relocs)
5015 Elf_Internal_Shdr *symtab_hdr;
5016 struct elf_link_hash_entry **sym_hashes;
5017 bfd_signed_vma *local_got_refcounts;
5018 const Elf_Internal_Rela *rel, *relend;
5021 if (bfd_link_relocatable (info))
5024 elf_section_data (sec)->local_dynrel = NULL;
5026 dynobj = elf_hash_table (info)->dynobj;
5030 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
5031 sym_hashes = elf_sym_hashes (abfd);
5032 local_got_refcounts = elf_local_got_refcounts (abfd);
5034 relend = relocs + sec->reloc_count;
5035 for (rel = relocs; rel < relend; rel++)
5037 unsigned long r_symndx;
5038 struct elf_link_hash_entry *h = NULL;
5041 r_symndx = ELF32_R_SYM (rel->r_info);
5042 if (r_symndx >= symtab_hdr->sh_info)
5044 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
5045 while (h->root.type == bfd_link_hash_indirect
5046 || h->root.type == bfd_link_hash_warning)
5047 h = (struct elf_link_hash_entry *) h->root.u.i.link;
5050 r_type = ELF32_R_TYPE (rel->r_info);
5054 case R_NIOS2_GOT_LO:
5055 case R_NIOS2_GOT_HA:
5056 case R_NIOS2_CALL16:
5057 case R_NIOS2_CALL_LO:
5058 case R_NIOS2_CALL_HA:
5061 if (h->got.refcount > 0)
5064 else if (local_got_refcounts != NULL)
5066 if (local_got_refcounts[r_symndx] > 0)
5067 --local_got_refcounts[r_symndx];
5071 case R_NIOS2_PCREL_LO:
5072 case R_NIOS2_PCREL_HA:
5073 case R_NIOS2_BFD_RELOC_32:
5074 case R_NIOS2_CALL26:
5075 case R_NIOS2_CALL26_NOAT:
5078 struct elf32_nios2_link_hash_entry *eh;
5079 struct elf32_nios2_dyn_relocs **pp;
5080 struct elf32_nios2_dyn_relocs *p;
5082 eh = (struct elf32_nios2_link_hash_entry *) h;
5084 if (h->plt.refcount > 0)
5087 if (r_type == R_NIOS2_PCREL_LO || r_type == R_NIOS2_PCREL_HA
5088 || r_type == R_NIOS2_BFD_RELOC_32)
5090 for (pp = &eh->dyn_relocs; (p = *pp) != NULL;
5111 /* Implement elf_backend_finish_dynamic_symbols:
5112 Finish up dynamic symbol handling. We set the contents of various
5113 dynamic sections here. */
5115 nios2_elf32_finish_dynamic_symbol (bfd *output_bfd,
5116 struct bfd_link_info *info,
5117 struct elf_link_hash_entry *h,
5118 Elf_Internal_Sym *sym)
5120 struct elf32_nios2_link_hash_table *htab;
5121 struct elf32_nios2_link_hash_entry *eh
5122 = (struct elf32_nios2_link_hash_entry *)h;
5125 htab = elf32_nios2_hash_table (info);
5127 if (h->plt.offset != (bfd_vma) -1)
5134 Elf_Internal_Rela rela;
5136 bfd_vma got_address;
5138 /* This symbol has an entry in the procedure linkage table. Set
5140 BFD_ASSERT (h->dynindx != -1);
5141 splt = htab->root.splt;
5142 sgotplt = htab->root.sgotplt;
5143 srela = htab->root.srelplt;
5144 BFD_ASSERT (splt != NULL && sgotplt != NULL && srela != NULL);
5146 /* Emit the PLT entry. */
5147 if (bfd_link_pic (info))
5149 nios2_elf32_install_data (splt, nios2_so_plt_entry, h->plt.offset,
5151 plt_index = (h->plt.offset - 24) / 12;
5152 got_offset = (plt_index + 3) * 4;
5153 nios2_elf32_install_imm16 (splt, h->plt.offset,
5154 hiadj(plt_index * 4));
5155 nios2_elf32_install_imm16 (splt, h->plt.offset + 4,
5156 (plt_index * 4) & 0xffff);
5157 nios2_elf32_install_imm16 (splt, h->plt.offset + 8,
5158 0xfff4 - h->plt.offset);
5159 got_address = (sgotplt->output_section->vma + sgotplt->output_offset
5162 /* Fill in the entry in the global offset table. There are no
5163 res_n slots for a shared object PLT, instead the .got.plt entries
5164 point to the PLT entries. */
5165 bfd_put_32 (output_bfd,
5166 splt->output_section->vma + splt->output_offset
5167 + h->plt.offset, sgotplt->contents + got_offset);
5171 plt_index = (h->plt.offset - 28 - htab->res_n_size) / 12;
5172 got_offset = (plt_index + 3) * 4;
5174 nios2_elf32_install_data (splt, nios2_plt_entry, h->plt.offset, 3);
5175 got_address = (sgotplt->output_section->vma + sgotplt->output_offset
5177 nios2_elf32_install_imm16 (splt, h->plt.offset, hiadj(got_address));
5178 nios2_elf32_install_imm16 (splt, h->plt.offset + 4,
5179 got_address & 0xffff);
5181 /* Fill in the entry in the global offset table. */
5182 bfd_put_32 (output_bfd,
5183 splt->output_section->vma + splt->output_offset
5184 + plt_index * 4, sgotplt->contents + got_offset);
5187 /* Fill in the entry in the .rela.plt section. */
5188 rela.r_offset = got_address;
5189 rela.r_info = ELF32_R_INFO (h->dynindx, R_NIOS2_JUMP_SLOT);
5191 loc = srela->contents + plt_index * sizeof (Elf32_External_Rela);
5192 bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
5194 if (!h->def_regular)
5196 /* Mark the symbol as undefined, rather than as defined in
5197 the .plt section. Leave the value alone. */
5198 sym->st_shndx = SHN_UNDEF;
5199 /* If the symbol is weak, we do need to clear the value.
5200 Otherwise, the PLT entry would provide a definition for
5201 the symbol even if the symbol wasn't defined anywhere,
5202 and so the symbol would never be NULL. */
5203 if (!h->ref_regular_nonweak)
5208 use_plt = (eh->got_types_used == CALL_USED
5209 && h->plt.offset != (bfd_vma) -1);
5211 if (!use_plt && h->got.offset != (bfd_vma) -1
5212 && (elf32_nios2_hash_entry (h)->tls_type & GOT_TLS_GD) == 0
5213 && (elf32_nios2_hash_entry (h)->tls_type & GOT_TLS_IE) == 0)
5217 Elf_Internal_Rela rela;
5221 /* This symbol has an entry in the global offset table. Set it
5223 sgot = htab->root.sgot;
5224 srela = htab->root.srelgot;
5225 BFD_ASSERT (sgot != NULL && srela != NULL);
5227 offset = (h->got.offset & ~(bfd_vma) 1);
5228 rela.r_offset = (sgot->output_section->vma
5229 + sgot->output_offset + offset);
5231 /* If this is a -Bsymbolic link, and the symbol is defined
5232 locally, we just want to emit a RELATIVE reloc. Likewise if
5233 the symbol was forced to be local because of a version file.
5234 The entry in the global offset table will already have been
5235 initialized in the relocate_section function. */
5237 if (bfd_link_pic (info) && SYMBOL_REFERENCES_LOCAL (info, h))
5239 rela.r_info = ELF32_R_INFO (0, R_NIOS2_RELATIVE);
5240 rela.r_addend = bfd_get_signed_32 (output_bfd,
5241 (sgot->contents + offset));
5242 bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + offset);
5246 bfd_put_32 (output_bfd, (bfd_vma) 0,
5247 sgot->contents + offset);
5248 rela.r_info = ELF32_R_INFO (h->dynindx, R_NIOS2_GLOB_DAT);
5252 loc = srela->contents;
5253 loc += srela->reloc_count++ * sizeof (Elf32_External_Rela);
5254 bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
5257 if (use_plt && h->got.offset != (bfd_vma) -1)
5259 bfd_vma offset = (h->got.offset & ~(bfd_vma) 1);
5260 asection *sgot = htab->root.sgot;
5261 asection *splt = htab->root.splt;
5262 bfd_put_32 (output_bfd, (splt->output_section->vma + splt->output_offset
5264 sgot->contents + offset);
5270 Elf_Internal_Rela rela;
5273 /* This symbol needs a copy reloc. Set it up. */
5274 BFD_ASSERT (h->dynindx != -1
5275 && (h->root.type == bfd_link_hash_defined
5276 || h->root.type == bfd_link_hash_defweak));
5278 rela.r_offset = (h->root.u.def.value
5279 + h->root.u.def.section->output_section->vma
5280 + h->root.u.def.section->output_offset);
5281 rela.r_info = ELF32_R_INFO (h->dynindx, R_NIOS2_COPY);
5283 if ((h->root.u.def.section->flags & SEC_READONLY) != 0)
5284 s = htab->root.sreldynrelro;
5286 s = htab->root.srelbss;
5287 BFD_ASSERT (s != NULL);
5288 loc = s->contents + s->reloc_count++ * sizeof (Elf32_External_Rela);
5289 bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
5292 /* Mark _DYNAMIC, _GLOBAL_OFFSET_TABLE_, and _gp_got as absolute. */
5293 if (strcmp (h->root.root.string, "_DYNAMIC") == 0
5294 || h == elf_hash_table (info)->hgot
5295 || h == elf32_nios2_hash_table (info)->h_gp_got)
5296 sym->st_shndx = SHN_ABS;
5301 /* Implement elf_backend_finish_dynamic_sections. */
5303 nios2_elf32_finish_dynamic_sections (bfd *output_bfd,
5304 struct bfd_link_info *info)
5309 struct elf32_nios2_link_hash_table *htab;
5311 htab = elf32_nios2_hash_table (info);
5312 dynobj = elf_hash_table (info)->dynobj;
5313 sgotplt = htab->root.sgotplt;
5314 BFD_ASSERT (sgotplt != NULL);
5315 sdyn = bfd_get_linker_section (dynobj, ".dynamic");
5317 if (elf_hash_table (info)->dynamic_sections_created)
5320 Elf32_External_Dyn *dyncon, *dynconend;
5322 splt = htab->root.splt;
5323 BFD_ASSERT (splt != NULL && sdyn != NULL);
5325 dyncon = (Elf32_External_Dyn *) sdyn->contents;
5326 dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
5327 for (; dyncon < dynconend; dyncon++)
5329 Elf_Internal_Dyn dyn;
5332 bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
5340 s = htab->root.sgotplt;
5341 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
5342 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
5346 s = htab->root.srelplt;
5347 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
5348 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
5352 s = htab->root.srelplt;
5353 dyn.d_un.d_val = s->size;
5354 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
5358 s = htab->root.sgotplt;
5360 = s->output_section->vma + s->output_offset + 0x7ff0;
5361 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
5366 /* Fill in the first entry in the procedure linkage table. */
5369 bfd_vma got_address = (sgotplt->output_section->vma
5370 + sgotplt->output_offset);
5371 if (bfd_link_pic (info))
5373 bfd_vma got_pcrel = got_address - (splt->output_section->vma
5374 + splt->output_offset);
5375 /* Both GOT and PLT must be aligned to a 16-byte boundary
5376 for the two loads to share the %hiadj part. The 4-byte
5377 offset for nextpc is accounted for in the %lo offsets
5379 BFD_ASSERT ((got_pcrel & 0xf) == 0);
5380 nios2_elf32_install_data (splt, nios2_so_plt0_entry, 0, 6);
5381 nios2_elf32_install_imm16 (splt, 4, hiadj (got_pcrel));
5382 nios2_elf32_install_imm16 (splt, 12, got_pcrel & 0xffff);
5383 nios2_elf32_install_imm16 (splt, 16, (got_pcrel + 4) & 0xffff);
5387 /* Divide by 4 here, not 3 because we already corrected for the
5389 bfd_vma res_size = (splt->size - 28) / 4;
5390 bfd_vma res_start = (splt->output_section->vma
5391 + splt->output_offset);
5394 for (res_offset = 0; res_offset < res_size; res_offset += 4)
5395 bfd_put_32 (output_bfd,
5396 6 | ((res_size - (res_offset + 4)) << 6),
5397 splt->contents + res_offset);
5399 /* The GOT must be aligned to a 16-byte boundary for the
5400 two loads to share the same %hiadj part. */
5401 BFD_ASSERT ((got_address & 0xf) == 0);
5403 nios2_elf32_install_data (splt, nios2_plt0_entry, res_size, 7);
5404 nios2_elf32_install_imm16 (splt, res_size, hiadj (res_start));
5405 nios2_elf32_install_imm16 (splt, res_size + 4,
5406 res_start & 0xffff);
5407 nios2_elf32_install_imm16 (splt, res_size + 12,
5408 hiadj (got_address));
5409 nios2_elf32_install_imm16 (splt, res_size + 16,
5410 (got_address + 4) & 0xffff);
5411 nios2_elf32_install_imm16 (splt, res_size + 20,
5412 (got_address + 8) & 0xffff);
5416 /* Fill in the first three entries in the global offset table. */
5417 if (sgotplt->size > 0)
5420 bfd_put_32 (output_bfd, (bfd_vma) 0, sgotplt->contents);
5422 bfd_put_32 (output_bfd,
5423 sdyn->output_section->vma + sdyn->output_offset,
5425 bfd_put_32 (output_bfd, (bfd_vma) 0, sgotplt->contents + 4);
5426 bfd_put_32 (output_bfd, (bfd_vma) 0, sgotplt->contents + 8);
5429 elf_section_data (sgotplt->output_section)->this_hdr.sh_entsize = 4;
5434 /* Implement elf_backend_adjust_dynamic_symbol:
5435 Adjust a symbol defined by a dynamic object and referenced by a
5436 regular object. The current definition is in some section of the
5437 dynamic object, but we're not including those sections. We have to
5438 change the definition to something the rest of the link can
5441 nios2_elf32_adjust_dynamic_symbol (struct bfd_link_info *info,
5442 struct elf_link_hash_entry *h)
5444 struct elf32_nios2_link_hash_table *htab;
5449 htab = elf32_nios2_hash_table (info);
5450 dynobj = elf_hash_table (info)->dynobj;
5452 /* Make sure we know what is going on here. */
5453 BFD_ASSERT (dynobj != NULL
5455 || h->u.weakdef != NULL
5458 && !h->def_regular)));
5460 /* If this is a function, put it in the procedure linkage table. We
5461 will fill in the contents of the procedure linkage table later,
5462 when we know the address of the .got section. */
5463 if (h->type == STT_FUNC || h->needs_plt)
5465 if (h->plt.refcount <= 0
5466 || SYMBOL_CALLS_LOCAL (info, h)
5467 || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
5468 && h->root.type == bfd_link_hash_undefweak))
5470 /* This case can occur if we saw a PLT reloc in an input
5471 file, but the symbol was never referred to by a dynamic
5472 object, or if all references were garbage collected. In
5473 such a case, we don't actually need to build a procedure
5474 linkage table, and we can just do a PCREL reloc instead. */
5475 h->plt.offset = (bfd_vma) -1;
5482 /* Reinitialize the plt offset now that it is not used as a reference
5484 h->plt.offset = (bfd_vma) -1;
5486 /* If this is a weak symbol, and there is a real definition, the
5487 processor independent code will have arranged for us to see the
5488 real definition first, and we can just use the same value. */
5489 if (h->u.weakdef != NULL)
5491 BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
5492 || h->u.weakdef->root.type == bfd_link_hash_defweak);
5493 h->root.u.def.section = h->u.weakdef->root.u.def.section;
5494 h->root.u.def.value = h->u.weakdef->root.u.def.value;
5498 /* If there are no non-GOT references, we do not need a copy
5500 if (!h->non_got_ref)
5503 /* This is a reference to a symbol defined by a dynamic object which
5505 If we are creating a shared library, we must presume that the
5506 only references to the symbol are via the global offset table.
5507 For such cases we need not do anything here; the relocations will
5508 be handled correctly by relocate_section. */
5509 if (bfd_link_pic (info))
5514 _bfd_error_handler (_("dynamic variable `%s' is zero size"),
5515 h->root.root.string);
5519 /* We must allocate the symbol in our .dynbss section, which will
5520 become part of the .bss section of the executable. There will be
5521 an entry for this symbol in the .dynsym section. The dynamic
5522 object will contain position independent code, so all references
5523 from the dynamic object to this symbol will go through the global
5524 offset table. The dynamic linker will use the .dynsym entry to
5525 determine the address it must put in the global offset table, so
5526 both the dynamic object and the regular object will refer to the
5527 same memory location for the variable. */
5528 /* We must generate a R_NIOS2_COPY reloc to tell the dynamic linker to
5529 copy the initial value out of the dynamic object and into the
5530 runtime process image. We need to remember the offset into the
5531 .rela.bss section we are going to use. */
5532 if ((h->root.u.def.section->flags & SEC_READONLY) != 0)
5534 s = htab->root.sdynrelro;
5535 srel = htab->root.sreldynrelro;
5539 s = htab->root.sdynbss;
5540 srel = htab->root.srelbss;
5542 if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
5544 srel->size += sizeof (Elf32_External_Rela);
5548 align2 = bfd_log2 (h->size);
5549 if (align2 > h->root.u.def.section->alignment_power)
5550 align2 = h->root.u.def.section->alignment_power;
5553 s->size = BFD_ALIGN (s->size, (bfd_size_type)1 << align2);
5554 if (align2 > bfd_get_section_alignment (dynobj, s)
5555 && !bfd_set_section_alignment (dynobj, s, align2))
5558 /* Define the symbol as being at this point in the section. */
5559 h->root.u.def.section = s;
5560 h->root.u.def.value = s->size;
5562 /* Increment the section size to make room for the symbol. */
5568 /* Worker function for nios2_elf32_size_dynamic_sections. */
5570 adjust_dynrelocs (struct elf_link_hash_entry *h, PTR inf)
5572 struct bfd_link_info *info;
5573 struct elf32_nios2_link_hash_table *htab;
5575 if (h->root.type == bfd_link_hash_indirect)
5578 if (h->root.type == bfd_link_hash_warning)
5579 /* When warning symbols are created, they **replace** the "real"
5580 entry in the hash table, thus we never get to see the real
5581 symbol in a hash traversal. So look at it now. */
5582 h = (struct elf_link_hash_entry *) h->root.u.i.link;
5584 info = (struct bfd_link_info *) inf;
5585 htab = elf32_nios2_hash_table (info);
5587 if (h->plt.offset != (bfd_vma)-1)
5588 h->plt.offset += htab->res_n_size;
5589 if (htab->root.splt == h->root.u.def.section)
5590 h->root.u.def.value += htab->res_n_size;
5595 /* Another worker function for nios2_elf32_size_dynamic_sections.
5596 Allocate space in .plt, .got and associated reloc sections for
5599 allocate_dynrelocs (struct elf_link_hash_entry *h, PTR inf)
5601 struct bfd_link_info *info;
5602 struct elf32_nios2_link_hash_table *htab;
5603 struct elf32_nios2_link_hash_entry *eh;
5604 struct elf32_nios2_dyn_relocs *p;
5607 if (h->root.type == bfd_link_hash_indirect)
5610 if (h->root.type == bfd_link_hash_warning)
5611 /* When warning symbols are created, they **replace** the "real"
5612 entry in the hash table, thus we never get to see the real
5613 symbol in a hash traversal. So look at it now. */
5614 h = (struct elf_link_hash_entry *) h->root.u.i.link;
5616 info = (struct bfd_link_info *) inf;
5617 htab = elf32_nios2_hash_table (info);
5619 if (htab->root.dynamic_sections_created
5620 && h->plt.refcount > 0)
5622 /* Make sure this symbol is output as a dynamic symbol.
5623 Undefined weak syms won't yet be marked as dynamic. */
5624 if (h->dynindx == -1
5626 && !bfd_elf_link_record_dynamic_symbol (info, h))
5629 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, bfd_link_pic (info), h))
5631 asection *s = htab->root.splt;
5633 /* Allocate room for the header. */
5636 if (bfd_link_pic (info))
5642 h->plt.offset = s->size;
5644 /* If this symbol is not defined in a regular file, and we are
5645 not generating a shared library, then set the symbol to this
5646 location in the .plt. This is required to make function
5647 pointers compare as equal between the normal executable and
5648 the shared library. */
5649 if (! bfd_link_pic (info)
5652 h->root.u.def.section = s;
5653 h->root.u.def.value = h->plt.offset;
5656 /* Make room for this entry. */
5659 /* We also need to make an entry in the .rela.plt section. */
5660 htab->root.srelplt->size += sizeof (Elf32_External_Rela);
5662 /* And the .got.plt section. */
5663 htab->root.sgotplt->size += 4;
5667 h->plt.offset = (bfd_vma) -1;
5673 h->plt.offset = (bfd_vma) -1;
5677 eh = (struct elf32_nios2_link_hash_entry *) h;
5678 use_plt = (eh->got_types_used == CALL_USED
5679 && h->plt.offset != (bfd_vma) -1);
5681 if (h->got.refcount > 0)
5685 int tls_type = eh->tls_type;
5688 /* Make sure this symbol is output as a dynamic symbol.
5689 Undefined weak syms won't yet be marked as dynamic. */
5690 if (h->dynindx == -1
5692 && !bfd_elf_link_record_dynamic_symbol (info, h))
5695 s = htab->root.sgot;
5696 h->got.offset = s->size;
5698 if (tls_type == GOT_UNKNOWN)
5701 if (tls_type == GOT_NORMAL)
5702 /* Non-TLS symbols need one GOT slot. */
5706 if (tls_type & GOT_TLS_GD)
5707 /* R_NIOS2_TLS_GD16 needs 2 consecutive GOT slots. */
5709 if (tls_type & GOT_TLS_IE)
5710 /* R_NIOS2_TLS_IE16 needs one GOT slot. */
5714 dyn = htab->root.dynamic_sections_created;
5717 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, bfd_link_pic (info), h)
5718 && (!bfd_link_pic (info)
5719 || !SYMBOL_REFERENCES_LOCAL (info, h)))
5722 if (tls_type != GOT_NORMAL
5723 && (bfd_link_pic (info) || indx != 0)
5724 && (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
5725 || h->root.type != bfd_link_hash_undefweak))
5727 if (tls_type & GOT_TLS_IE)
5728 htab->root.srelgot->size += sizeof (Elf32_External_Rela);
5730 if (tls_type & GOT_TLS_GD)
5731 htab->root.srelgot->size += sizeof (Elf32_External_Rela);
5733 if ((tls_type & GOT_TLS_GD) && indx != 0)
5734 htab->root.srelgot->size += sizeof (Elf32_External_Rela);
5736 else if ((ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
5737 || h->root.type != bfd_link_hash_undefweak)
5739 && (bfd_link_pic (info)
5740 || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h)))
5741 htab->root.srelgot->size += sizeof (Elf32_External_Rela);
5744 h->got.offset = (bfd_vma) -1;
5746 if (eh->dyn_relocs == NULL)
5749 /* In the shared -Bsymbolic case, discard space allocated for
5750 dynamic pc-relative relocs against symbols which turn out to be
5751 defined in regular objects. For the normal shared case, discard
5752 space for pc-relative relocs that have become local due to symbol
5753 visibility changes. */
5755 if (bfd_link_pic (info))
5758 && (h->forced_local || SYMBOLIC_BIND (info, h)))
5760 struct elf32_nios2_dyn_relocs **pp;
5762 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
5764 p->count -= p->pc_count;
5773 /* Also discard relocs on undefined weak syms with non-default
5775 if (eh->dyn_relocs != NULL
5776 && h->root.type == bfd_link_hash_undefweak)
5778 if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
5779 eh->dyn_relocs = NULL;
5781 /* Make sure undefined weak symbols are output as a dynamic
5783 else if (h->dynindx == -1
5785 && !bfd_elf_link_record_dynamic_symbol (info, h))
5791 /* For the non-shared case, discard space for relocs against
5792 symbols which turn out to need copy relocs or are not
5796 && ((h->def_dynamic && !h->def_regular)
5797 || (htab->root.dynamic_sections_created
5798 && (h->root.type == bfd_link_hash_undefweak
5799 || h->root.type == bfd_link_hash_undefined))))
5801 /* Make sure this symbol is output as a dynamic symbol.
5802 Undefined weak syms won't yet be marked as dynamic. */
5803 if (h->dynindx == -1
5805 && !bfd_elf_link_record_dynamic_symbol (info, h))
5808 /* If that succeeded, we know we'll be keeping all the
5810 if (h->dynindx != -1)
5814 eh->dyn_relocs = NULL;
5819 /* Finally, allocate space. */
5820 for (p = eh->dyn_relocs; p != NULL; p = p->next)
5822 asection *sreloc = elf_section_data (p->sec)->sreloc;
5823 sreloc->size += p->count * sizeof (Elf32_External_Rela);
5829 /* Implement elf_backend_size_dynamic_sections:
5830 Set the sizes of the dynamic sections. */
5832 nios2_elf32_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
5833 struct bfd_link_info *info)
5841 struct elf32_nios2_link_hash_table *htab;
5843 htab = elf32_nios2_hash_table (info);
5844 dynobj = elf_hash_table (info)->dynobj;
5845 BFD_ASSERT (dynobj != NULL);
5847 htab->res_n_size = 0;
5848 if (elf_hash_table (info)->dynamic_sections_created)
5850 /* Set the contents of the .interp section to the interpreter. */
5851 if (bfd_link_executable (info) && !info->nointerp)
5853 s = bfd_get_linker_section (dynobj, ".interp");
5854 BFD_ASSERT (s != NULL);
5855 s->size = sizeof ELF_DYNAMIC_INTERPRETER;
5856 s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
5861 /* We may have created entries in the .rela.got section.
5862 However, if we are not creating the dynamic sections, we will
5863 not actually use these entries. Reset the size of .rela.got,
5864 which will cause it to get stripped from the output file
5866 s = htab->root.srelgot;
5871 /* Set up .got offsets for local syms, and space for local dynamic
5873 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
5875 bfd_signed_vma *local_got;
5876 bfd_signed_vma *end_local_got;
5877 char *local_tls_type;
5878 bfd_size_type locsymcount;
5879 Elf_Internal_Shdr *symtab_hdr;
5882 if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour)
5885 for (s = ibfd->sections; s != NULL; s = s->next)
5887 struct elf32_nios2_dyn_relocs *p;
5889 for (p = elf_section_data (s)->local_dynrel; p != NULL; p = p->next)
5891 if (!bfd_is_abs_section (p->sec)
5892 && bfd_is_abs_section (p->sec->output_section))
5894 /* Input section has been discarded, either because
5895 it is a copy of a linkonce section or due to
5896 linker script /DISCARD/, so we'll be discarding
5899 else if (p->count != 0)
5901 srel = elf_section_data (p->sec)->sreloc;
5902 srel->size += p->count * sizeof (Elf32_External_Rela);
5903 if ((p->sec->output_section->flags & SEC_READONLY) != 0)
5904 info->flags |= DF_TEXTREL;
5909 local_got = elf_local_got_refcounts (ibfd);
5913 symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
5914 locsymcount = symtab_hdr->sh_info;
5915 end_local_got = local_got + locsymcount;
5916 local_tls_type = elf32_nios2_local_got_tls_type (ibfd);
5917 s = htab->root.sgot;
5918 srel = htab->root.srelgot;
5919 for (; local_got < end_local_got; ++local_got, ++local_tls_type)
5923 *local_got = s->size;
5924 if (*local_tls_type & GOT_TLS_GD)
5925 /* TLS_GD relocs need an 8-byte structure in the GOT. */
5927 if (*local_tls_type & GOT_TLS_IE)
5929 if (*local_tls_type == GOT_NORMAL)
5932 if (bfd_link_pic (info) || *local_tls_type == GOT_TLS_GD)
5933 srel->size += sizeof (Elf32_External_Rela);
5936 *local_got = (bfd_vma) -1;
5940 if (htab->tls_ldm_got.refcount > 0)
5942 /* Allocate two GOT entries and one dynamic relocation (if necessary)
5943 for R_NIOS2_TLS_LDM16 relocations. */
5944 htab->tls_ldm_got.offset = htab->root.sgot->size;
5945 htab->root.sgot->size += 8;
5946 if (bfd_link_pic (info))
5947 htab->root.srelgot->size += sizeof (Elf32_External_Rela);
5950 htab->tls_ldm_got.offset = -1;
5952 /* Allocate global sym .plt and .got entries, and space for global
5953 sym dynamic relocs. */
5954 elf_link_hash_traverse (& htab->root, allocate_dynrelocs, info);
5956 if (elf_hash_table (info)->dynamic_sections_created)
5958 /* If the .got section is more than 0x8000 bytes, we add
5959 0x8000 to the value of _gp_got, so that 16-bit relocations
5960 have a greater chance of working. */
5961 if (htab->root.sgot->size >= 0x8000
5962 && elf32_nios2_hash_table (info)->h_gp_got->root.u.def.value == 0)
5963 elf32_nios2_hash_table (info)->h_gp_got->root.u.def.value = 0x8000;
5966 /* The check_relocs and adjust_dynamic_symbol entry points have
5967 determined the sizes of the various dynamic sections. Allocate
5972 for (s = dynobj->sections; s != NULL; s = s->next)
5976 if ((s->flags & SEC_LINKER_CREATED) == 0)
5979 /* It's OK to base decisions on the section name, because none
5980 of the dynobj section names depend upon the input files. */
5981 name = bfd_get_section_name (dynobj, s);
5983 if (s == htab->root.splt)
5985 /* Remember whether there is a PLT. */
5988 /* Correct for the number of res_N branches. */
5989 if (plt && !bfd_link_pic (info))
5991 htab->res_n_size = (s->size-28) / 3;
5992 s->size += htab->res_n_size;
5995 else if (CONST_STRNEQ (name, ".rela"))
6001 /* We use the reloc_count field as a counter if we need
6002 to copy relocs into the output file. */
6006 else if (s == htab->root.sgot
6007 || s == htab->root.sgotplt)
6012 else if (s != htab->root.sdynbss
6013 && s != htab->root.sdynrelro)
6014 /* It's not one of our sections, so don't allocate space. */
6019 /* If we don't need this section, strip it from the
6020 output file. This is mostly to handle .rela.bss and
6021 .rela.plt. We must create both sections in
6022 create_dynamic_sections, because they must be created
6023 before the linker maps input sections to output
6024 sections. The linker does that before
6025 adjust_dynamic_symbol is called, and it is that
6026 function which decides whether anything needs to go
6027 into these sections. */
6028 s->flags |= SEC_EXCLUDE;
6032 if ((s->flags & SEC_HAS_CONTENTS) == 0)
6035 /* Allocate memory for the section contents. */
6036 /* FIXME: This should be a call to bfd_alloc not bfd_zalloc.
6037 Unused entries should be reclaimed before the section's contents
6038 are written out, but at the moment this does not happen. Thus in
6039 order to prevent writing out garbage, we initialize the section's
6040 contents to zero. */
6041 s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->size);
6042 if (s->contents == NULL)
6046 /* Adjust dynamic symbols that point to the plt to account for the
6047 now-known number of resN slots. */
6048 if (htab->res_n_size)
6049 elf_link_hash_traverse (& htab->root, adjust_dynrelocs, info);
6051 if (elf_hash_table (info)->dynamic_sections_created)
6053 /* Add some entries to the .dynamic section. We fill in the
6054 values later, in elf_nios2_finish_dynamic_sections, but we
6055 must add the entries now so that we get the correct size for
6056 the .dynamic section. The DT_DEBUG entry is filled in by the
6057 dynamic linker and used by the debugger. */
6058 #define add_dynamic_entry(TAG, VAL) \
6059 _bfd_elf_add_dynamic_entry (info, TAG, VAL)
6061 if (!bfd_link_pic (info) && !add_dynamic_entry (DT_DEBUG, 0))
6064 if (got && !add_dynamic_entry (DT_PLTGOT, 0))
6068 && (!add_dynamic_entry (DT_PLTRELSZ, 0)
6069 || !add_dynamic_entry (DT_PLTREL, DT_RELA)
6070 || !add_dynamic_entry (DT_JMPREL, 0)))
6074 && (!add_dynamic_entry (DT_RELA, 0)
6075 || !add_dynamic_entry (DT_RELASZ, 0)
6076 || !add_dynamic_entry (DT_RELAENT, sizeof (Elf32_External_Rela))))
6079 if (!bfd_link_pic (info) && !add_dynamic_entry (DT_NIOS2_GP, 0))
6082 if ((info->flags & DF_TEXTREL) != 0
6083 && !add_dynamic_entry (DT_TEXTREL, 0))
6086 #undef add_dynamic_entry
6091 /* Free the derived linker hash table. */
6093 nios2_elf32_link_hash_table_free (bfd *obfd)
6095 struct elf32_nios2_link_hash_table *htab
6096 = (struct elf32_nios2_link_hash_table *) obfd->link.hash;
6098 bfd_hash_table_free (&htab->bstab);
6099 _bfd_elf_link_hash_table_free (obfd);
6102 /* Implement bfd_elf32_bfd_link_hash_table_create. */
6103 static struct bfd_link_hash_table *
6104 nios2_elf32_link_hash_table_create (bfd *abfd)
6106 struct elf32_nios2_link_hash_table *ret;
6107 bfd_size_type amt = sizeof (struct elf32_nios2_link_hash_table);
6109 ret = bfd_zmalloc (amt);
6113 if (!_bfd_elf_link_hash_table_init (&ret->root, abfd,
6116 elf32_nios2_link_hash_entry),
6123 /* Init the stub hash table too. */
6124 if (!bfd_hash_table_init (&ret->bstab, stub_hash_newfunc,
6125 sizeof (struct elf32_nios2_stub_hash_entry)))
6127 _bfd_elf_link_hash_table_free (abfd);
6130 ret->root.root.hash_table_free = nios2_elf32_link_hash_table_free;
6132 return &ret->root.root;
6135 /* Implement elf_backend_reloc_type_class. */
6136 static enum elf_reloc_type_class
6137 nios2_elf32_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED,
6138 const asection *rel_sec ATTRIBUTE_UNUSED,
6139 const Elf_Internal_Rela *rela)
6141 switch ((int) ELF32_R_TYPE (rela->r_info))
6143 case R_NIOS2_RELATIVE:
6144 return reloc_class_relative;
6145 case R_NIOS2_JUMP_SLOT:
6146 return reloc_class_plt;
6148 return reloc_class_copy;
6150 return reloc_class_normal;
6154 /* Return 1 if target is one of ours. */
6156 is_nios2_elf_target (const struct bfd_target *targ)
6158 return (targ == &nios2_elf32_le_vec
6159 || targ == &nios2_elf32_be_vec);
6162 /* Implement elf_backend_add_symbol_hook.
6163 This hook is called by the linker when adding symbols from an object
6164 file. We use it to put .comm items in .sbss, and not .bss. */
6166 nios2_elf_add_symbol_hook (bfd *abfd,
6167 struct bfd_link_info *info,
6168 Elf_Internal_Sym *sym,
6169 const char **namep ATTRIBUTE_UNUSED,
6170 flagword *flagsp ATTRIBUTE_UNUSED,
6176 if (sym->st_shndx == SHN_COMMON
6177 && !bfd_link_relocatable (info)
6178 && sym->st_size <= elf_gp_size (abfd)
6179 && is_nios2_elf_target (info->output_bfd->xvec))
6181 /* Common symbols less than or equal to -G nn bytes are automatically
6183 struct elf32_nios2_link_hash_table *htab;
6185 htab = elf32_nios2_hash_table (info);
6186 if (htab->sbss == NULL)
6188 flagword flags = SEC_IS_COMMON | SEC_LINKER_CREATED;
6190 dynobj = elf_hash_table (info)->dynobj;
6194 htab->sbss = bfd_make_section_anyway_with_flags (dynobj, ".sbss",
6196 if (htab->sbss == NULL)
6201 *valp = sym->st_size;
6207 /* Implement elf_backend_can_make_relative_eh_frame:
6208 Decide whether to attempt to turn absptr or lsda encodings in
6209 shared libraries into pcrel within the given input section. */
6211 nios2_elf32_can_make_relative_eh_frame (bfd *input_bfd ATTRIBUTE_UNUSED,
6212 struct bfd_link_info *info
6214 asection *eh_frame_section
6217 /* We can't use PC-relative encodings in the .eh_frame section. */
6221 /* Implement elf_backend_special_sections. */
6222 const struct bfd_elf_special_section elf32_nios2_special_sections[] =
6224 { STRING_COMMA_LEN (".sbss"), -2, SHT_NOBITS,
6225 SHF_ALLOC + SHF_WRITE + SHF_NIOS2_GPREL },
6226 { STRING_COMMA_LEN (".sdata"), -2, SHT_PROGBITS,
6227 SHF_ALLOC + SHF_WRITE + SHF_NIOS2_GPREL },
6228 { NULL, 0, 0, 0, 0 }
6231 #define ELF_ARCH bfd_arch_nios2
6232 #define ELF_TARGET_ID NIOS2_ELF_DATA
6233 #define ELF_MACHINE_CODE EM_ALTERA_NIOS2
6235 /* The Nios II MMU uses a 4K page size. */
6237 #define ELF_MAXPAGESIZE 0x1000
6239 #define bfd_elf32_bfd_link_hash_table_create \
6240 nios2_elf32_link_hash_table_create
6242 #define bfd_elf32_bfd_merge_private_bfd_data \
6243 nios2_elf32_merge_private_bfd_data
6245 /* Relocation table lookup macros. */
6247 #define bfd_elf32_bfd_reloc_type_lookup nios2_elf32_bfd_reloc_type_lookup
6248 #define bfd_elf32_bfd_reloc_name_lookup nios2_elf32_bfd_reloc_name_lookup
6250 /* JUMP_TABLE_LINK macros. */
6252 /* elf_info_to_howto (using RELA relocations). */
6254 #define elf_info_to_howto nios2_elf32_info_to_howto
6256 /* elf backend functions. */
6258 #define elf_backend_can_gc_sections 1
6259 #define elf_backend_can_refcount 1
6260 #define elf_backend_plt_readonly 1
6261 #define elf_backend_want_got_plt 1
6262 #define elf_backend_want_dynrelro 1
6263 #define elf_backend_rela_normal 1
6264 #define elf_backend_dtrel_excludes_plt 1
6266 #define elf_backend_relocate_section nios2_elf32_relocate_section
6267 #define elf_backend_section_flags nios2_elf32_section_flags
6268 #define elf_backend_fake_sections nios2_elf32_fake_sections
6269 #define elf_backend_check_relocs nios2_elf32_check_relocs
6271 #define elf_backend_gc_mark_hook nios2_elf32_gc_mark_hook
6272 #define elf_backend_gc_sweep_hook nios2_elf32_gc_sweep_hook
6273 #define elf_backend_create_dynamic_sections \
6274 nios2_elf32_create_dynamic_sections
6275 #define elf_backend_finish_dynamic_symbol nios2_elf32_finish_dynamic_symbol
6276 #define elf_backend_finish_dynamic_sections \
6277 nios2_elf32_finish_dynamic_sections
6278 #define elf_backend_adjust_dynamic_symbol nios2_elf32_adjust_dynamic_symbol
6279 #define elf_backend_reloc_type_class nios2_elf32_reloc_type_class
6280 #define elf_backend_size_dynamic_sections nios2_elf32_size_dynamic_sections
6281 #define elf_backend_add_symbol_hook nios2_elf_add_symbol_hook
6282 #define elf_backend_copy_indirect_symbol nios2_elf32_copy_indirect_symbol
6283 #define elf_backend_object_p nios2_elf32_object_p
6285 #define elf_backend_grok_prstatus nios2_grok_prstatus
6286 #define elf_backend_grok_psinfo nios2_grok_psinfo
6288 #undef elf_backend_can_make_relative_eh_frame
6289 #define elf_backend_can_make_relative_eh_frame \
6290 nios2_elf32_can_make_relative_eh_frame
6292 #define elf_backend_special_sections elf32_nios2_special_sections
6294 #define TARGET_LITTLE_SYM nios2_elf32_le_vec
6295 #define TARGET_LITTLE_NAME "elf32-littlenios2"
6296 #define TARGET_BIG_SYM nios2_elf32_be_vec
6297 #define TARGET_BIG_NAME "elf32-bignios2"
6299 #define elf_backend_got_header_size 12
6300 #define elf_backend_default_execstack 0
6302 #include "elf32-target.h"