1 /* 32-bit ELF support for Nios II.
2 Copyright (C) 2012-2016 Free Software Foundation, Inc.
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. */
1827 /* GOT pointer symbol _gp_got. */
1828 struct elf_link_hash_entry *h_gp_got;
1831 bfd_signed_vma refcount;
1835 /* Small local sym cache. */
1836 struct sym_cache sym_cache;
1841 struct nios2_elf32_obj_tdata
1843 struct elf_obj_tdata root;
1845 /* tls_type for each local got entry. */
1846 char *local_got_tls_type;
1848 /* TRUE if TLS GD relocs have been seen for this object. */
1849 bfd_boolean has_tlsgd;
1852 #define elf32_nios2_tdata(abfd) \
1853 ((struct nios2_elf32_obj_tdata *) (abfd)->tdata.any)
1855 #define elf32_nios2_local_got_tls_type(abfd) \
1856 (elf32_nios2_tdata (abfd)->local_got_tls_type)
1858 /* The name of the dynamic interpreter. This is put in the .interp
1860 #define ELF_DYNAMIC_INTERPRETER "/lib/ld.so.1"
1862 /* PLT implementation for position-dependent code. */
1863 static const bfd_vma nios2_plt_entry[] = { /* .PLTn: */
1864 0x03c00034, /* movhi r15, %hiadj(plt_got_slot_address) */
1865 0x7bc00017, /* ldw r15, %lo(plt_got_slot_address)(r15) */
1866 0x7800683a /* jmp r15 */
1869 static const bfd_vma nios2_plt0_entry[] = { /* .PLTresolve */
1870 0x03800034, /* movhi r14, %hiadj(res_0) */
1871 0x73800004, /* addi r14, r14, %lo(res_0) */
1872 0x7b9fc83a, /* sub r15, r15, r14 */
1873 0x03400034, /* movhi r13, %hiadj(_GLOBAL_OFFSET_TABLE_) */
1874 0x6b800017, /* ldw r14, %lo(_GLOBAL_OFFSET_TABLE_+4)(r13) */
1875 0x6b400017, /* ldw r13, %lo(_GLOBAL_OFFSET_TABLE_+8)(r13) */
1876 0x6800683a /* jmp r13 */
1879 /* PLT implementation for position-independent code. */
1880 static const bfd_vma nios2_so_plt_entry[] = { /* .PLTn */
1881 0x03c00034, /* movhi r15, %hiadj(index * 4) */
1882 0x7bc00004, /* addi r15, r15, %lo(index * 4) */
1883 0x00000006 /* br .PLTresolve */
1886 static const bfd_vma nios2_so_plt0_entry[] = { /* .PLTresolve */
1887 0x001ce03a, /* nextpc r14 */
1888 0x03400034, /* movhi r13, %hiadj(_GLOBAL_OFFSET_TABLE_) */
1889 0x6b9b883a, /* add r13, r13, r14 */
1890 0x6b800017, /* ldw r14, %lo(_GLOBAL_OFFSET_TABLE_+4)(r13) */
1891 0x6b400017, /* ldw r13, %lo(_GLOBAL_OFFSET_TABLE_+8)(r13) */
1892 0x6800683a /* jmp r13 */
1896 static const bfd_vma nios2_call26_stub_entry[] = {
1897 0x00400034, /* orhi at, r0, %hiadj(dest) */
1898 0x08400004, /* addi at, at, %lo(dest) */
1899 0x0800683a /* jmp at */
1902 /* Install 16-bit immediate value VALUE at offset OFFSET into section SEC. */
1904 nios2_elf32_install_imm16 (asection *sec, bfd_vma offset, bfd_vma value)
1906 bfd_vma word = bfd_get_32 (sec->owner, sec->contents + offset);
1908 BFD_ASSERT (value <= 0xffff || ((bfd_signed_vma) value) >= -0xffff);
1910 bfd_put_32 (sec->owner, word | ((value & 0xffff) << 6),
1911 sec->contents + offset);
1914 /* Install COUNT 32-bit values DATA starting at offset OFFSET into
1917 nios2_elf32_install_data (asection *sec, const bfd_vma *data, bfd_vma offset,
1922 bfd_put_32 (sec->owner, *data, sec->contents + offset);
1928 /* The usual way of loading a 32-bit constant into a Nios II register is to
1929 load the high 16 bits in one instruction and then add the low 16 bits with
1930 a signed add. This means that the high halfword needs to be adjusted to
1931 compensate for the sign bit of the low halfword. This function returns the
1932 adjusted high halfword for a given 32-bit constant. */
1934 bfd_vma hiadj (bfd_vma symbol_value)
1936 return ((symbol_value + 0x8000) >> 16) & 0xffff;
1939 /* Implement elf_backend_grok_prstatus:
1940 Support for core dump NOTE sections. */
1942 nios2_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
1947 switch (note->descsz)
1952 case 212: /* Linux/Nios II */
1954 elf_tdata (abfd)->core->signal = bfd_get_16 (abfd, note->descdata + 12);
1957 elf_tdata (abfd)->core->pid = bfd_get_32 (abfd, note->descdata + 24);
1966 /* Make a ".reg/999" section. */
1967 return _bfd_elfcore_make_pseudosection (abfd, ".reg",
1968 size, note->descpos + offset);
1971 /* Implement elf_backend_grok_psinfo. */
1973 nios2_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
1975 switch (note->descsz)
1980 case 124: /* Linux/Nios II elf_prpsinfo */
1981 elf_tdata (abfd)->core->program
1982 = _bfd_elfcore_strndup (abfd, note->descdata + 28, 16);
1983 elf_tdata (abfd)->core->command
1984 = _bfd_elfcore_strndup (abfd, note->descdata + 44, 80);
1987 /* Note that for some reason, a spurious space is tacked
1988 onto the end of the args in some (at least one anyway)
1989 implementations, so strip it off if it exists. */
1992 char *command = elf_tdata (abfd)->core->command;
1993 int n = strlen (command);
1995 if (0 < n && command[n - 1] == ' ')
1996 command[n - 1] = '\0';
2002 /* Assorted hash table functions. */
2004 /* Initialize an entry in the stub hash table. */
2005 static struct bfd_hash_entry *
2006 stub_hash_newfunc (struct bfd_hash_entry *entry,
2007 struct bfd_hash_table *table,
2010 /* Allocate the structure if it has not already been allocated by a
2014 entry = bfd_hash_allocate (table,
2015 sizeof (struct elf32_nios2_stub_hash_entry));
2020 /* Call the allocation method of the superclass. */
2021 entry = bfd_hash_newfunc (entry, table, string);
2024 struct elf32_nios2_stub_hash_entry *hsh;
2026 /* Initialize the local fields. */
2027 hsh = (struct elf32_nios2_stub_hash_entry *) entry;
2028 hsh->stub_sec = NULL;
2029 hsh->stub_offset = 0;
2030 hsh->target_value = 0;
2031 hsh->target_section = NULL;
2032 hsh->stub_type = nios2_stub_none;
2040 /* Create an entry in a Nios II ELF linker hash table. */
2041 static struct bfd_hash_entry *
2042 link_hash_newfunc (struct bfd_hash_entry *entry,
2043 struct bfd_hash_table *table, const char *string)
2045 /* Allocate the structure if it has not already been allocated by a
2049 entry = bfd_hash_allocate (table,
2050 sizeof (struct elf32_nios2_link_hash_entry));
2055 /* Call the allocation method of the superclass. */
2056 entry = _bfd_elf_link_hash_newfunc (entry, table, string);
2059 struct elf32_nios2_link_hash_entry *eh;
2061 eh = (struct elf32_nios2_link_hash_entry *) entry;
2062 eh->hsh_cache = NULL;
2063 eh->dyn_relocs = NULL;
2064 eh->tls_type = GOT_UNKNOWN;
2065 eh->got_types_used = 0;
2071 /* Section name for stubs is the associated section name plus this
2073 #define STUB_SUFFIX ".stub"
2075 /* Build a name for an entry in the stub hash table. */
2077 nios2_stub_name (const asection *input_section,
2078 const asection *sym_sec,
2079 const struct elf32_nios2_link_hash_entry *hh,
2080 const Elf_Internal_Rela *rel,
2081 enum elf32_nios2_stub_type stub_type)
2085 char stubpos = (stub_type == nios2_stub_call26_before) ? 'b' : 'a';
2089 len = 8 + 1 + 1 + 1+ strlen (hh->root.root.root.string) + 1 + 8 + 1;
2090 stub_name = bfd_malloc (len);
2091 if (stub_name != NULL)
2093 sprintf (stub_name, "%08x_%c_%s+%x",
2094 input_section->id & 0xffffffff,
2096 hh->root.root.root.string,
2097 (int) rel->r_addend & 0xffffffff);
2102 len = 8 + 1 + 1 + 1+ 8 + 1 + 8 + 1 + 8 + 1;
2103 stub_name = bfd_malloc (len);
2104 if (stub_name != NULL)
2106 sprintf (stub_name, "%08x_%c_%x:%x+%x",
2107 input_section->id & 0xffffffff,
2109 sym_sec->id & 0xffffffff,
2110 (int) ELF32_R_SYM (rel->r_info) & 0xffffffff,
2111 (int) rel->r_addend & 0xffffffff);
2117 /* Look up an entry in the stub hash. Stub entries are cached because
2118 creating the stub name takes a bit of time. */
2119 static struct elf32_nios2_stub_hash_entry *
2120 nios2_get_stub_entry (const asection *input_section,
2121 const asection *sym_sec,
2122 struct elf32_nios2_link_hash_entry *hh,
2123 const Elf_Internal_Rela *rel,
2124 struct elf32_nios2_link_hash_table *htab,
2125 enum elf32_nios2_stub_type stub_type)
2127 struct elf32_nios2_stub_hash_entry *hsh;
2128 const asection *id_sec;
2130 /* If this input section is part of a group of sections sharing one
2131 stub section, then use the id of the first/last section in the group,
2132 depending on the stub section placement relative to the group.
2133 Stub names need to include a section id, as there may well be
2134 more than one stub used to reach say, printf, and we need to
2135 distinguish between them. */
2136 if (stub_type == nios2_stub_call26_before)
2137 id_sec = htab->stub_group[input_section->id].first_sec;
2139 id_sec = htab->stub_group[input_section->id].last_sec;
2141 if (hh != NULL && hh->hsh_cache != NULL
2142 && hh->hsh_cache->hh == hh
2143 && hh->hsh_cache->id_sec == id_sec
2144 && hh->hsh_cache->stub_type == stub_type)
2146 hsh = hh->hsh_cache;
2152 stub_name = nios2_stub_name (id_sec, sym_sec, hh, rel, stub_type);
2153 if (stub_name == NULL)
2156 hsh = nios2_stub_hash_lookup (&htab->bstab,
2157 stub_name, FALSE, FALSE);
2160 hh->hsh_cache = hsh;
2168 /* Add a new stub entry to the stub hash. Not all fields of the new
2169 stub entry are initialised. */
2170 static struct elf32_nios2_stub_hash_entry *
2171 nios2_add_stub (const char *stub_name,
2173 struct elf32_nios2_link_hash_table *htab,
2174 enum elf32_nios2_stub_type stub_type)
2178 asection **secptr, **linkptr;
2179 struct elf32_nios2_stub_hash_entry *hsh;
2182 if (stub_type == nios2_stub_call26_before)
2184 link_sec = htab->stub_group[section->id].first_sec;
2185 secptr = &(htab->stub_group[section->id].first_stub_sec);
2186 linkptr = &(htab->stub_group[link_sec->id].first_stub_sec);
2191 link_sec = htab->stub_group[section->id].last_sec;
2192 secptr = &(htab->stub_group[section->id].last_stub_sec);
2193 linkptr = &(htab->stub_group[link_sec->id].last_stub_sec);
2197 if (stub_sec == NULL)
2199 stub_sec = *linkptr;
2200 if (stub_sec == NULL)
2206 namelen = strlen (link_sec->name);
2207 len = namelen + sizeof (STUB_SUFFIX);
2208 s_name = bfd_alloc (htab->stub_bfd, len);
2212 memcpy (s_name, link_sec->name, namelen);
2213 memcpy (s_name + namelen, STUB_SUFFIX, sizeof (STUB_SUFFIX));
2215 stub_sec = (*htab->add_stub_section) (s_name, link_sec, afterp);
2216 if (stub_sec == NULL)
2218 *linkptr = stub_sec;
2223 /* Enter this entry into the linker stub hash table. */
2224 hsh = nios2_stub_hash_lookup (&htab->bstab, stub_name,
2228 /* xgettext:c-format */
2229 _bfd_error_handler (_("%B: cannot create stub entry %s"),
2235 hsh->stub_sec = stub_sec;
2236 hsh->stub_offset = 0;
2237 hsh->id_sec = link_sec;
2241 /* Set up various things so that we can make a list of input sections
2242 for each output section included in the link. Returns -1 on error,
2243 0 when no stubs will be needed, and 1 on success. */
2245 nios2_elf32_setup_section_lists (bfd *output_bfd, struct bfd_link_info *info)
2248 unsigned int bfd_count;
2249 unsigned int top_id, top_index;
2251 asection **input_list, **list;
2253 struct elf32_nios2_link_hash_table *htab = elf32_nios2_hash_table (info);
2255 /* Count the number of input BFDs and find the top input section id. */
2256 for (input_bfd = info->input_bfds, bfd_count = 0, top_id = 0;
2258 input_bfd = input_bfd->link.next)
2261 for (section = input_bfd->sections;
2263 section = section->next)
2265 if (top_id < section->id)
2266 top_id = section->id;
2270 htab->bfd_count = bfd_count;
2272 amt = sizeof (struct map_stub) * (top_id + 1);
2273 htab->stub_group = bfd_zmalloc (amt);
2274 if (htab->stub_group == NULL)
2277 /* We can't use output_bfd->section_count here to find the top output
2278 section index as some sections may have been removed, and
2279 strip_excluded_output_sections doesn't renumber the indices. */
2280 for (section = output_bfd->sections, top_index = 0;
2282 section = section->next)
2284 if (top_index < section->index)
2285 top_index = section->index;
2288 htab->top_index = top_index;
2289 amt = sizeof (asection *) * (top_index + 1);
2290 input_list = bfd_malloc (amt);
2291 htab->input_list = input_list;
2292 if (input_list == NULL)
2295 /* For sections we aren't interested in, mark their entries with a
2296 value we can check later. */
2297 list = input_list + top_index;
2299 *list = bfd_abs_section_ptr;
2300 while (list-- != input_list);
2302 for (section = output_bfd->sections;
2304 section = section->next)
2306 /* FIXME: This is a bit of hack. Currently our .ctors and .dtors
2307 * have PC relative relocs in them but no code flag set. */
2308 if (((section->flags & SEC_CODE) != 0) ||
2309 strcmp(".ctors", section->name) ||
2310 strcmp(".dtors", section->name))
2311 input_list[section->index] = NULL;
2317 /* The linker repeatedly calls this function for each input section,
2318 in the order that input sections are linked into output sections.
2319 Build lists of input sections to determine groupings between which
2320 we may insert linker stubs. */
2322 nios2_elf32_next_input_section (struct bfd_link_info *info, asection *isec)
2324 struct elf32_nios2_link_hash_table *htab = elf32_nios2_hash_table (info);
2326 if (isec->output_section->index <= htab->top_index)
2328 asection **list = htab->input_list + isec->output_section->index;
2329 if (*list != bfd_abs_section_ptr)
2331 /* Steal the last_sec pointer for our list.
2332 This happens to make the list in reverse order,
2333 which is what we want. */
2334 htab->stub_group[isec->id].last_sec = *list;
2340 /* Segment mask for CALL26 relocation relaxation. */
2341 #define CALL26_SEGMENT(x) ((x) & 0xf0000000)
2343 /* Fudge factor for approximate maximum size of all stubs that might
2344 be inserted by the linker. This does not actually limit the number
2345 of stubs that might be inserted, and only affects strategy for grouping
2346 and placement of stubs. Perhaps this should be computed based on number
2347 of relocations seen, or be specifiable on the command line. */
2348 #define MAX_STUB_SECTION_SIZE 0xffff
2350 /* See whether we can group stub sections together. Grouping stub
2351 sections may result in fewer stubs. More importantly, we need to
2352 put all .init* and .fini* stubs at the end of the .init or
2353 .fini output sections respectively, because glibc splits the
2354 _init and _fini functions into multiple parts. Putting a stub in
2355 the middle of a function is not a good idea.
2356 Rather than computing groups of a maximum fixed size, for Nios II
2357 CALL26 relaxation it makes more sense to compute the groups based on
2358 sections that fit within a 256MB address segment. Also do not allow
2359 a group to span more than one output section, since different output
2360 sections might correspond to different memory banks on a bare-metal
2363 group_sections (struct elf32_nios2_link_hash_table *htab)
2365 asection **list = htab->input_list + htab->top_index;
2368 /* The list is in reverse order so we'll search backwards looking
2369 for the first section that begins in the same memory segment,
2370 marking sections along the way to point at the tail for this
2372 asection *tail = *list;
2373 if (tail == bfd_abs_section_ptr)
2375 while (tail != NULL)
2377 bfd_vma start = tail->output_section->vma + tail->output_offset;
2378 bfd_vma end = start + tail->size;
2379 bfd_vma segment = CALL26_SEGMENT (end);
2382 if (segment != CALL26_SEGMENT (start)
2383 || segment != CALL26_SEGMENT (end + MAX_STUB_SECTION_SIZE))
2384 /* This section spans more than one memory segment, or is
2385 close enough to the end of the segment that adding stub
2386 sections before it might cause it to move so that it
2387 spans memory segments, or that stubs added at the end of
2388 this group might overflow into the next memory segment.
2389 Put it in a group by itself to localize the effects. */
2391 prev = htab->stub_group[tail->id].last_sec;
2392 htab->stub_group[tail->id].last_sec = tail;
2393 htab->stub_group[tail->id].first_sec = tail;
2396 /* Collect more sections for this group. */
2398 asection *curr, *first;
2399 for (curr = tail; ; curr = prev)
2401 prev = htab->stub_group[curr->id].last_sec;
2403 || tail->output_section != prev->output_section
2404 || (CALL26_SEGMENT (prev->output_section->vma
2405 + prev->output_offset)
2410 for (curr = tail; ; curr = prev)
2412 prev = htab->stub_group[curr->id].last_sec;
2413 htab->stub_group[curr->id].last_sec = tail;
2414 htab->stub_group[curr->id].first_sec = first;
2420 /* Reset tail for the next group. */
2424 while (list-- != htab->input_list);
2425 free (htab->input_list);
2428 /* Determine the type of stub needed, if any, for a call. */
2429 static enum elf32_nios2_stub_type
2430 nios2_type_of_stub (asection *input_sec,
2431 const Elf_Internal_Rela *rel,
2432 struct elf32_nios2_link_hash_entry *hh,
2433 struct elf32_nios2_link_hash_table *htab,
2434 bfd_vma destination,
2435 struct bfd_link_info *info ATTRIBUTE_UNUSED)
2437 bfd_vma location, segment, start, end;
2438 asection *s0, *s1, *s;
2441 !(hh->root.root.type == bfd_link_hash_defined
2442 || hh->root.root.type == bfd_link_hash_defweak))
2443 return nios2_stub_none;
2445 /* Determine where the call point is. */
2446 location = (input_sec->output_section->vma
2447 + input_sec->output_offset + rel->r_offset);
2448 segment = CALL26_SEGMENT (location);
2450 /* Nios II CALL and JMPI instructions can transfer control to addresses
2451 within the same 256MB segment as the PC. */
2452 if (segment == CALL26_SEGMENT (destination))
2453 return nios2_stub_none;
2455 /* Find the start and end addresses of the stub group. Also account for
2456 any already-created stub sections for this group. Note that for stubs
2457 in the end section, only the first instruction of the last stub
2458 (12 bytes long) needs to be within range. */
2459 s0 = htab->stub_group[input_sec->id].first_sec;
2460 s = htab->stub_group[s0->id].first_stub_sec;
2461 if (s != NULL && s->size > 0)
2462 start = s->output_section->vma + s->output_offset;
2464 start = s0->output_section->vma + s0->output_offset;
2466 s1 = htab->stub_group[input_sec->id].last_sec;
2467 s = htab->stub_group[s1->id].last_stub_sec;
2468 if (s != NULL && s->size > 0)
2469 end = s->output_section->vma + s->output_offset + s->size - 8;
2471 end = s1->output_section->vma + s1->output_offset + s1->size;
2473 BFD_ASSERT (start < end);
2474 BFD_ASSERT (start <= location);
2475 BFD_ASSERT (location < end);
2477 /* Put stubs at the end of the group unless that is not a valid
2478 location and the beginning of the group is. It might be that
2479 neither the beginning nor end works if we have an input section
2480 so large that it spans multiple segment boundaries. In that
2481 case, punt; the end result will be a relocation overflow error no
2482 matter what we do here.
2484 Note that adding stubs pushes up the addresses of all subsequent
2485 sections, so that stubs allocated on one pass through the
2486 relaxation loop may not be valid on the next pass. (E.g., we may
2487 allocate a stub at the beginning of the section on one pass and
2488 find that the call site has been bumped into the next memory
2489 segment on the next pass.) The important thing to note is that
2490 we never try to reclaim the space allocated to such unused stubs,
2491 so code size and section addresses can only increase with each
2492 iteration. Accounting for the start and end addresses of the
2493 already-created stub sections ensures that when the algorithm
2494 converges, it converges accurately, with the entire appropriate
2495 stub section accessible from the call site and not just the
2496 address at the start or end of the stub group proper. */
2498 if (segment == CALL26_SEGMENT (end))
2499 return nios2_stub_call26_after;
2500 else if (segment == CALL26_SEGMENT (start))
2501 return nios2_stub_call26_before;
2503 /* Perhaps this should be a dedicated error code. */
2504 return nios2_stub_none;
2508 nios2_build_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg ATTRIBUTE_UNUSED)
2510 struct elf32_nios2_stub_hash_entry *hsh
2511 = (struct elf32_nios2_stub_hash_entry *) gen_entry;
2512 asection *stub_sec = hsh->stub_sec;
2515 /* Make a note of the offset within the stubs for this entry. */
2516 hsh->stub_offset = stub_sec->size;
2518 switch (hsh->stub_type)
2520 case nios2_stub_call26_before:
2521 case nios2_stub_call26_after:
2522 /* A call26 stub looks like:
2523 orhi at, %hiadj(dest)
2524 addi at, at, %lo(dest)
2526 Note that call/jmpi instructions can't be used in PIC code
2527 so there is no reason for the stub to be PIC, either. */
2528 sym_value = (hsh->target_value
2529 + hsh->target_section->output_offset
2530 + hsh->target_section->output_section->vma
2533 nios2_elf32_install_data (stub_sec, nios2_call26_stub_entry,
2534 hsh->stub_offset, 3);
2535 nios2_elf32_install_imm16 (stub_sec, hsh->stub_offset,
2537 nios2_elf32_install_imm16 (stub_sec, hsh->stub_offset + 4,
2538 (sym_value & 0xffff));
2539 stub_sec->size += 12;
2549 /* As above, but don't actually build the stub. Just bump offset so
2550 we know stub section sizes. */
2552 nios2_size_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg ATTRIBUTE_UNUSED)
2554 struct elf32_nios2_stub_hash_entry *hsh
2555 = (struct elf32_nios2_stub_hash_entry *) gen_entry;
2557 switch (hsh->stub_type)
2559 case nios2_stub_call26_before:
2560 case nios2_stub_call26_after:
2561 hsh->stub_sec->size += 12;
2570 /* Read in all local syms for all input bfds.
2571 Returns -1 on error, 0 otherwise. */
2574 get_local_syms (bfd *output_bfd ATTRIBUTE_UNUSED, bfd *input_bfd,
2575 struct bfd_link_info *info)
2577 unsigned int bfd_indx;
2578 Elf_Internal_Sym *local_syms, **all_local_syms;
2579 struct elf32_nios2_link_hash_table *htab = elf32_nios2_hash_table (info);
2581 /* We want to read in symbol extension records only once. To do this
2582 we need to read in the local symbols in parallel and save them for
2583 later use; so hold pointers to the local symbols in an array. */
2584 bfd_size_type amt = sizeof (Elf_Internal_Sym *) * htab->bfd_count;
2585 all_local_syms = bfd_zmalloc (amt);
2586 htab->all_local_syms = all_local_syms;
2587 if (all_local_syms == NULL)
2590 /* Walk over all the input BFDs, swapping in local symbols. */
2593 input_bfd = input_bfd->link.next, bfd_indx++)
2595 Elf_Internal_Shdr *symtab_hdr;
2597 /* We'll need the symbol table in a second. */
2598 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
2599 if (symtab_hdr->sh_info == 0)
2602 /* We need an array of the local symbols attached to the input bfd. */
2603 local_syms = (Elf_Internal_Sym *) symtab_hdr->contents;
2604 if (local_syms == NULL)
2606 local_syms = bfd_elf_get_elf_syms (input_bfd, symtab_hdr,
2607 symtab_hdr->sh_info, 0,
2609 /* Cache them for elf_link_input_bfd. */
2610 symtab_hdr->contents = (unsigned char *) local_syms;
2612 if (local_syms == NULL)
2615 all_local_syms[bfd_indx] = local_syms;
2621 /* Determine and set the size of the stub section for a final link. */
2623 nios2_elf32_size_stubs (bfd *output_bfd, bfd *stub_bfd,
2624 struct bfd_link_info *info,
2625 asection *(*add_stub_section) (const char *,
2626 asection *, bfd_boolean),
2627 void (*layout_sections_again) (void))
2629 bfd_boolean stub_changed = FALSE;
2630 struct elf32_nios2_link_hash_table *htab = elf32_nios2_hash_table (info);
2632 /* Stash our params away. */
2633 htab->stub_bfd = stub_bfd;
2634 htab->add_stub_section = add_stub_section;
2635 htab->layout_sections_again = layout_sections_again;
2637 /* FIXME: We only compute the section groups once. This could cause
2638 problems if adding a large stub section causes following sections,
2639 or parts of them, to move into another segment. However, this seems
2640 to be consistent with the way other back ends handle this.... */
2641 group_sections (htab);
2643 if (get_local_syms (output_bfd, info->input_bfds, info))
2645 if (htab->all_local_syms)
2646 goto error_ret_free_local;
2653 unsigned int bfd_indx;
2656 for (input_bfd = info->input_bfds, bfd_indx = 0;
2658 input_bfd = input_bfd->link.next, bfd_indx++)
2660 Elf_Internal_Shdr *symtab_hdr;
2662 Elf_Internal_Sym *local_syms;
2664 /* We'll need the symbol table in a second. */
2665 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
2666 if (symtab_hdr->sh_info == 0)
2669 local_syms = htab->all_local_syms[bfd_indx];
2671 /* Walk over each section attached to the input bfd. */
2672 for (section = input_bfd->sections;
2674 section = section->next)
2676 Elf_Internal_Rela *internal_relocs, *irelaend, *irela;
2678 /* If there aren't any relocs, then there's nothing more
2680 if ((section->flags & SEC_RELOC) == 0
2681 || section->reloc_count == 0)
2684 /* If this section is a link-once section that will be
2685 discarded, then don't create any stubs. */
2686 if (section->output_section == NULL
2687 || section->output_section->owner != output_bfd)
2690 /* Get the relocs. */
2692 = _bfd_elf_link_read_relocs (input_bfd, section, NULL, NULL,
2694 if (internal_relocs == NULL)
2695 goto error_ret_free_local;
2697 /* Now examine each relocation. */
2698 irela = internal_relocs;
2699 irelaend = irela + section->reloc_count;
2700 for (; irela < irelaend; irela++)
2702 unsigned int r_type, r_indx;
2703 enum elf32_nios2_stub_type stub_type;
2704 struct elf32_nios2_stub_hash_entry *hsh;
2707 bfd_vma destination;
2708 struct elf32_nios2_link_hash_entry *hh;
2710 const asection *id_sec;
2712 r_type = ELF32_R_TYPE (irela->r_info);
2713 r_indx = ELF32_R_SYM (irela->r_info);
2715 if (r_type >= (unsigned int) R_NIOS2_ILLEGAL)
2717 bfd_set_error (bfd_error_bad_value);
2718 error_ret_free_internal:
2719 if (elf_section_data (section)->relocs == NULL)
2720 free (internal_relocs);
2721 goto error_ret_free_local;
2724 /* Only look for stubs on CALL and JMPI instructions. */
2725 if (r_type != (unsigned int) R_NIOS2_CALL26)
2728 /* Now determine the call target, its name, value,
2734 if (r_indx < symtab_hdr->sh_info)
2736 /* It's a local symbol. */
2737 Elf_Internal_Sym *sym;
2738 Elf_Internal_Shdr *hdr;
2741 sym = local_syms + r_indx;
2742 if (ELF_ST_TYPE (sym->st_info) != STT_SECTION)
2743 sym_value = sym->st_value;
2744 shndx = sym->st_shndx;
2745 if (shndx < elf_numsections (input_bfd))
2747 hdr = elf_elfsections (input_bfd)[shndx];
2748 sym_sec = hdr->bfd_section;
2749 destination = (sym_value + irela->r_addend
2750 + sym_sec->output_offset
2751 + sym_sec->output_section->vma);
2756 /* It's an external symbol. */
2759 e_indx = r_indx - symtab_hdr->sh_info;
2760 hh = ((struct elf32_nios2_link_hash_entry *)
2761 elf_sym_hashes (input_bfd)[e_indx]);
2763 while (hh->root.root.type == bfd_link_hash_indirect
2764 || hh->root.root.type == bfd_link_hash_warning)
2765 hh = ((struct elf32_nios2_link_hash_entry *)
2766 hh->root.root.u.i.link);
2768 if (hh->root.root.type == bfd_link_hash_defined
2769 || hh->root.root.type == bfd_link_hash_defweak)
2771 sym_sec = hh->root.root.u.def.section;
2772 sym_value = hh->root.root.u.def.value;
2774 if (sym_sec->output_section != NULL)
2775 destination = (sym_value + irela->r_addend
2776 + sym_sec->output_offset
2777 + sym_sec->output_section->vma);
2781 else if (hh->root.root.type == bfd_link_hash_undefweak)
2783 if (! bfd_link_pic (info))
2786 else if (hh->root.root.type == bfd_link_hash_undefined)
2788 if (! (info->unresolved_syms_in_objects == RM_IGNORE
2789 && (ELF_ST_VISIBILITY (hh->root.other)
2795 bfd_set_error (bfd_error_bad_value);
2796 goto error_ret_free_internal;
2800 /* Determine what (if any) linker stub is needed. */
2801 stub_type = nios2_type_of_stub (section, irela, hh, htab,
2803 if (stub_type == nios2_stub_none)
2806 /* Support for grouping stub sections. */
2807 if (stub_type == nios2_stub_call26_before)
2808 id_sec = htab->stub_group[section->id].first_sec;
2810 id_sec = htab->stub_group[section->id].last_sec;
2812 /* Get the name of this stub. */
2813 stub_name = nios2_stub_name (id_sec, sym_sec, hh, irela,
2816 goto error_ret_free_internal;
2818 hsh = nios2_stub_hash_lookup (&htab->bstab,
2823 /* The proper stub has already been created. */
2828 hsh = nios2_add_stub (stub_name, section, htab, stub_type);
2832 goto error_ret_free_internal;
2834 hsh->target_value = sym_value;
2835 hsh->target_section = sym_sec;
2836 hsh->stub_type = stub_type;
2838 hsh->addend = irela->r_addend;
2839 stub_changed = TRUE;
2842 /* We're done with the internal relocs, free them. */
2843 if (elf_section_data (section)->relocs == NULL)
2844 free (internal_relocs);
2851 /* OK, we've added some stubs. Find out the new size of the
2853 for (stub_sec = htab->stub_bfd->sections;
2855 stub_sec = stub_sec->next)
2858 bfd_hash_traverse (&htab->bstab, nios2_size_one_stub, htab);
2860 /* Ask the linker to do its stuff. */
2861 (*htab->layout_sections_again) ();
2862 stub_changed = FALSE;
2865 free (htab->all_local_syms);
2868 error_ret_free_local:
2869 free (htab->all_local_syms);
2873 /* Build all the stubs associated with the current output file. The
2874 stubs are kept in a hash table attached to the main linker hash
2875 table. This function is called via nios2elf_finish in the linker. */
2877 nios2_elf32_build_stubs (struct bfd_link_info *info)
2880 struct bfd_hash_table *table;
2881 struct elf32_nios2_link_hash_table *htab;
2883 htab = elf32_nios2_hash_table (info);
2885 for (stub_sec = htab->stub_bfd->sections;
2887 stub_sec = stub_sec->next)
2888 /* The stub_bfd may contain non-stub sections if it is also the
2889 dynobj. Any such non-stub sections are created with the
2890 SEC_LINKER_CREATED flag set, while stub sections do not
2891 have that flag. Ignore any non-stub sections here. */
2892 if ((stub_sec->flags & SEC_LINKER_CREATED) == 0)
2896 /* Allocate memory to hold the linker stubs. */
2897 size = stub_sec->size;
2898 stub_sec->contents = bfd_zalloc (htab->stub_bfd, size);
2899 if (stub_sec->contents == NULL && size != 0)
2904 /* Build the stubs as directed by the stub hash table. */
2905 table = &htab->bstab;
2906 bfd_hash_traverse (table, nios2_build_one_stub, info);
2912 #define is_nios2_elf(bfd) \
2913 (bfd_get_flavour (bfd) == bfd_target_elf_flavour \
2914 && elf_object_id (bfd) == NIOS2_ELF_DATA)
2916 /* Merge backend specific data from an object file to the output
2917 object file when linking. */
2920 nios2_elf32_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
2922 bfd *obfd = info->output_bfd;
2926 if (!is_nios2_elf (ibfd) || !is_nios2_elf (obfd))
2929 /* Check if we have the same endianness. */
2930 if (! _bfd_generic_verify_endian_match (ibfd, info))
2933 new_flags = elf_elfheader (ibfd)->e_flags;
2934 old_flags = elf_elfheader (obfd)->e_flags;
2935 if (!elf_flags_init (obfd))
2937 /* First call, no flags set. */
2938 elf_flags_init (obfd) = TRUE;
2939 elf_elfheader (obfd)->e_flags = new_flags;
2944 case EF_NIOS2_ARCH_R1:
2945 bfd_default_set_arch_mach (obfd, bfd_arch_nios2, bfd_mach_nios2r1);
2947 case EF_NIOS2_ARCH_R2:
2948 if (bfd_big_endian (ibfd))
2951 (_("error: %B: Big-endian R2 is not supported."), ibfd);
2952 bfd_set_error (bfd_error_bad_value);
2955 bfd_default_set_arch_mach (obfd, bfd_arch_nios2, bfd_mach_nios2r2);
2960 /* Incompatible flags. */
2961 else if (new_flags != old_flags)
2963 /* So far, the only incompatible flags denote incompatible
2966 /* xgettext:c-format */
2967 (_("error: %B: Conflicting CPU architectures %d/%d"),
2968 ibfd, new_flags, old_flags);
2969 bfd_set_error (bfd_error_bad_value);
2973 /* Merge Tag_compatibility attributes and any common GNU ones. */
2974 _bfd_elf_merge_object_attributes (ibfd, info);
2980 /* Implement bfd_elf32_bfd_reloc_type_lookup:
2981 Given a BFD reloc type, return a howto structure. */
2982 static reloc_howto_type *
2983 nios2_elf32_bfd_reloc_type_lookup (bfd *abfd,
2984 bfd_reloc_code_real_type code)
2989 i < (int) (sizeof (nios2_reloc_map) / sizeof (struct elf_reloc_map));
2991 if (nios2_reloc_map[i].bfd_val == code)
2992 return lookup_howto (nios2_reloc_map[i].elf_val, abfd);
2996 /* Implement bfd_elf32_bfd_reloc_name_lookup:
2997 Given a reloc name, return a howto structure. */
2998 static reloc_howto_type *
2999 nios2_elf32_bfd_reloc_name_lookup (bfd *abfd,
3003 reloc_howto_type *howto_tbl;
3006 if (BFD_IS_R2 (abfd))
3008 howto_tbl = elf_nios2_r2_howto_table_rel;
3009 howto_tbl_size = (int) (sizeof (elf_nios2_r2_howto_table_rel)
3010 / sizeof (elf_nios2_r2_howto_table_rel[0]));
3014 howto_tbl = elf_nios2_r1_howto_table_rel;
3015 howto_tbl_size = (int) (sizeof (elf_nios2_r1_howto_table_rel)
3016 / sizeof (elf_nios2_r1_howto_table_rel[0]));
3019 for (i = 0; i < howto_tbl_size; i++)
3020 if (howto_tbl[i].name && strcasecmp (howto_tbl[i].name, r_name) == 0)
3021 return howto_tbl + i;
3025 /* Implement elf_info_to_howto:
3026 Given a ELF32 relocation, fill in a arelent structure. */
3028 nios2_elf32_info_to_howto (bfd *abfd, arelent *cache_ptr,
3029 Elf_Internal_Rela *dst)
3031 unsigned int r_type;
3033 r_type = ELF32_R_TYPE (dst->r_info);
3034 cache_ptr->howto = lookup_howto (r_type, abfd);
3037 /* Return the base VMA address which should be subtracted from real addresses
3038 when resolving @dtpoff relocation.
3039 This is PT_TLS segment p_vaddr. */
3041 dtpoff_base (struct bfd_link_info *info)
3043 /* If tls_sec is NULL, we should have signalled an error already. */
3044 if (elf_hash_table (info)->tls_sec == NULL)
3046 return elf_hash_table (info)->tls_sec->vma;
3049 /* Return the relocation value for @tpoff relocation
3050 if STT_TLS virtual address is ADDRESS. */
3052 tpoff (struct bfd_link_info *info, bfd_vma address)
3054 struct elf_link_hash_table *htab = elf_hash_table (info);
3056 /* If tls_sec is NULL, we should have signalled an error already. */
3057 if (htab->tls_sec == NULL)
3059 return address - htab->tls_sec->vma;
3062 /* Set the GP value for OUTPUT_BFD. Returns FALSE if this is a
3063 dangerous relocation. */
3065 nios2_elf_assign_gp (bfd *output_bfd, bfd_vma *pgp, struct bfd_link_info *info)
3068 bfd_boolean gp_found;
3069 struct bfd_hash_entry *h;
3070 struct bfd_link_hash_entry *lh;
3072 /* If we've already figured out what GP will be, just return it. */
3073 *pgp = _bfd_get_gp_value (output_bfd);
3077 h = bfd_hash_lookup (&info->hash->table, "_gp", FALSE, FALSE);
3078 lh = (struct bfd_link_hash_entry *) h;
3084 case bfd_link_hash_undefined:
3085 case bfd_link_hash_undefweak:
3086 case bfd_link_hash_common:
3089 case bfd_link_hash_defined:
3090 case bfd_link_hash_defweak:
3093 asection *sym_sec = lh->u.def.section;
3094 bfd_vma sym_value = lh->u.def.value;
3096 if (sym_sec->output_section)
3097 sym_value = (sym_value + sym_sec->output_offset
3098 + sym_sec->output_section->vma);
3102 case bfd_link_hash_indirect:
3103 case bfd_link_hash_warning:
3105 /* @@FIXME ignoring warning for now */
3107 case bfd_link_hash_new:
3117 /* Only get the error once. */
3119 _bfd_set_gp_value (output_bfd, *pgp);
3123 _bfd_set_gp_value (output_bfd, *pgp);
3128 /* Retrieve the previously cached _gp pointer, returning bfd_reloc_dangerous
3129 if it's not available as we don't have a link_info pointer available here
3130 to look it up in the output symbol table. We don't need to adjust the
3131 symbol value for an external symbol if we are producing relocatable
3133 static bfd_reloc_status_type
3134 nios2_elf_final_gp (bfd *output_bfd, asymbol *symbol, bfd_boolean relocatable,
3135 char **error_message, bfd_vma *pgp)
3137 if (bfd_is_und_section (symbol->section) && !relocatable)
3140 return bfd_reloc_undefined;
3143 *pgp = _bfd_get_gp_value (output_bfd);
3144 if (*pgp == 0 && (!relocatable || (symbol->flags & BSF_SECTION_SYM) != 0))
3148 /* Make up a value. */
3149 *pgp = symbol->section->output_section->vma + 0x4000;
3150 _bfd_set_gp_value (output_bfd, *pgp);
3155 = (char *) _("global pointer relative relocation when _gp not defined");
3156 return bfd_reloc_dangerous;
3160 return bfd_reloc_ok;
3163 /* Do the relocations that require special handling. */
3164 static bfd_reloc_status_type
3165 nios2_elf32_do_hi16_relocate (bfd *abfd, reloc_howto_type *howto,
3166 asection *input_section,
3167 bfd_byte *data, bfd_vma offset,
3168 bfd_vma symbol_value, bfd_vma addend)
3170 symbol_value = symbol_value + addend;
3172 symbol_value = (symbol_value >> 16) & 0xffff;
3173 return _bfd_final_link_relocate (howto, abfd, input_section,
3174 data, offset, symbol_value, addend);
3177 static bfd_reloc_status_type
3178 nios2_elf32_do_lo16_relocate (bfd *abfd, reloc_howto_type *howto,
3179 asection *input_section,
3180 bfd_byte *data, bfd_vma offset,
3181 bfd_vma symbol_value, bfd_vma addend)
3183 symbol_value = symbol_value + addend;
3185 symbol_value = symbol_value & 0xffff;
3186 return _bfd_final_link_relocate (howto, abfd, input_section,
3187 data, offset, symbol_value, addend);
3190 static bfd_reloc_status_type
3191 nios2_elf32_do_hiadj16_relocate (bfd *abfd, reloc_howto_type *howto,
3192 asection *input_section,
3193 bfd_byte *data, bfd_vma offset,
3194 bfd_vma symbol_value, bfd_vma addend)
3196 symbol_value = symbol_value + addend;
3198 symbol_value = hiadj(symbol_value);
3199 return _bfd_final_link_relocate (howto, abfd, input_section, data, offset,
3200 symbol_value, addend);
3203 static bfd_reloc_status_type
3204 nios2_elf32_do_pcrel_lo16_relocate (bfd *abfd, reloc_howto_type *howto,
3205 asection *input_section,
3206 bfd_byte *data, bfd_vma offset,
3207 bfd_vma symbol_value, bfd_vma addend)
3209 symbol_value = symbol_value + addend;
3211 symbol_value = symbol_value & 0xffff;
3212 return _bfd_final_link_relocate (howto, abfd, input_section,
3213 data, offset, symbol_value, addend);
3216 static bfd_reloc_status_type
3217 nios2_elf32_do_pcrel_hiadj16_relocate (bfd *abfd, reloc_howto_type *howto,
3218 asection *input_section,
3219 bfd_byte *data, bfd_vma offset,
3220 bfd_vma symbol_value, bfd_vma addend)
3222 symbol_value = symbol_value + addend;
3223 symbol_value -= (input_section->output_section->vma
3224 + input_section->output_offset);
3225 symbol_value -= offset;
3227 symbol_value = hiadj(symbol_value);
3228 return _bfd_final_link_relocate (howto, abfd, input_section, data, offset,
3229 symbol_value, addend);
3232 static bfd_reloc_status_type
3233 nios2_elf32_do_pcrel16_relocate (bfd *abfd, reloc_howto_type *howto,
3234 asection *input_section,
3235 bfd_byte *data, bfd_vma offset,
3236 bfd_vma symbol_value, bfd_vma addend)
3238 /* NIOS2 pc relative relocations are relative to the next 32-bit instruction
3239 so we need to subtract 4 before doing a final_link_relocate. */
3240 symbol_value = symbol_value + addend - 4;
3242 return _bfd_final_link_relocate (howto, abfd, input_section,
3243 data, offset, symbol_value, addend);
3246 static bfd_reloc_status_type
3247 nios2_elf32_do_call26_relocate (bfd *abfd, reloc_howto_type *howto,
3248 asection *input_section,
3249 bfd_byte *data, bfd_vma offset,
3250 bfd_vma symbol_value, bfd_vma addend)
3252 /* Check that the relocation is in the same page as the current address. */
3253 if (CALL26_SEGMENT (symbol_value + addend)
3254 != CALL26_SEGMENT (input_section->output_section->vma
3255 + input_section->output_offset
3257 return bfd_reloc_overflow;
3259 /* Check that the target address is correctly aligned on a 4-byte
3261 if ((symbol_value + addend) & 0x3)
3262 return bfd_reloc_overflow;
3264 return _bfd_final_link_relocate (howto, abfd, input_section,
3265 data, offset, symbol_value, addend);
3268 static bfd_reloc_status_type
3269 nios2_elf32_do_gprel_relocate (bfd *abfd, reloc_howto_type *howto,
3270 asection *input_section,
3271 bfd_byte *data, bfd_vma offset,
3272 bfd_vma symbol_value, bfd_vma addend)
3274 /* Because we need the output_bfd, the special handling is done
3275 in nios2_elf32_relocate_section or in nios2_elf32_gprel_relocate. */
3276 return _bfd_final_link_relocate (howto, abfd, input_section,
3277 data, offset, symbol_value, addend);
3280 static bfd_reloc_status_type
3281 nios2_elf32_do_ujmp_relocate (bfd *abfd, reloc_howto_type *howto,
3282 asection *input_section,
3283 bfd_byte *data, bfd_vma offset,
3284 bfd_vma symbol_value, bfd_vma addend)
3286 bfd_vma symbol_lo16, symbol_hi16;
3287 bfd_reloc_status_type r;
3288 symbol_value = symbol_value + addend;
3290 symbol_hi16 = (symbol_value >> 16) & 0xffff;
3291 symbol_lo16 = symbol_value & 0xffff;
3293 r = _bfd_final_link_relocate (howto, abfd, input_section,
3294 data, offset, symbol_hi16, addend);
3296 if (r == bfd_reloc_ok)
3297 return _bfd_final_link_relocate (howto, abfd, input_section,
3298 data, offset + 4, symbol_lo16, addend);
3303 static bfd_reloc_status_type
3304 nios2_elf32_do_cjmp_relocate (bfd *abfd, reloc_howto_type *howto,
3305 asection *input_section,
3306 bfd_byte *data, bfd_vma offset,
3307 bfd_vma symbol_value, bfd_vma addend)
3309 bfd_vma symbol_lo16, symbol_hi16;
3310 bfd_reloc_status_type r;
3311 symbol_value = symbol_value + addend;
3313 symbol_hi16 = (symbol_value >> 16) & 0xffff;
3314 symbol_lo16 = symbol_value & 0xffff;
3316 r = _bfd_final_link_relocate (howto, abfd, input_section,
3317 data, offset, symbol_hi16, addend);
3319 if (r == bfd_reloc_ok)
3320 return _bfd_final_link_relocate (howto, abfd, input_section,
3321 data, offset + 4, symbol_lo16, addend);
3326 static bfd_reloc_status_type
3327 nios2_elf32_do_callr_relocate (bfd *abfd, reloc_howto_type *howto,
3328 asection *input_section,
3329 bfd_byte *data, bfd_vma offset,
3330 bfd_vma symbol_value, bfd_vma addend)
3332 bfd_vma symbol_lo16, symbol_hi16;
3333 bfd_reloc_status_type r;
3334 symbol_value = symbol_value + addend;
3336 symbol_hi16 = (symbol_value >> 16) & 0xffff;
3337 symbol_lo16 = symbol_value & 0xffff;
3339 r = _bfd_final_link_relocate (howto, abfd, input_section,
3340 data, offset, symbol_hi16, addend);
3342 if (r == bfd_reloc_ok)
3343 return _bfd_final_link_relocate (howto, abfd, input_section,
3344 data, offset + 4, symbol_lo16, addend);
3349 /* HOWTO handlers for relocations that require special handling. */
3351 /* This is for relocations used only when relaxing to ensure
3352 changes in size of section don't screw up .align. */
3353 static bfd_reloc_status_type
3354 nios2_elf32_ignore_reloc (bfd *abfd ATTRIBUTE_UNUSED, arelent *reloc_entry,
3355 asymbol *symbol ATTRIBUTE_UNUSED,
3356 void *data ATTRIBUTE_UNUSED, asection *input_section,
3358 char **error_message ATTRIBUTE_UNUSED)
3360 if (output_bfd != NULL)
3361 reloc_entry->address += input_section->output_offset;
3362 return bfd_reloc_ok;
3365 static bfd_reloc_status_type
3366 nios2_elf32_hi16_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
3367 void *data, asection *input_section,
3369 char **error_message ATTRIBUTE_UNUSED)
3371 /* This part is from bfd_elf_generic_reloc. */
3372 if (output_bfd != NULL
3373 && (symbol->flags & BSF_SECTION_SYM) == 0
3374 && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
3376 reloc_entry->address += input_section->output_offset;
3377 return bfd_reloc_ok;
3380 if (output_bfd != NULL)
3381 /* FIXME: See bfd_perform_relocation. Is this right? */
3382 return bfd_reloc_continue;
3384 return nios2_elf32_do_hi16_relocate (abfd, reloc_entry->howto,
3386 data, reloc_entry->address,
3388 + symbol->section->output_section->vma
3389 + symbol->section->output_offset),
3390 reloc_entry->addend);
3393 static bfd_reloc_status_type
3394 nios2_elf32_lo16_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
3395 void *data, asection *input_section,
3397 char **error_message ATTRIBUTE_UNUSED)
3399 /* This part is from bfd_elf_generic_reloc. */
3400 if (output_bfd != NULL
3401 && (symbol->flags & BSF_SECTION_SYM) == 0
3402 && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
3404 reloc_entry->address += input_section->output_offset;
3405 return bfd_reloc_ok;
3408 if (output_bfd != NULL)
3409 /* FIXME: See bfd_perform_relocation. Is this right? */
3410 return bfd_reloc_continue;
3412 return nios2_elf32_do_lo16_relocate (abfd, reloc_entry->howto,
3414 data, reloc_entry->address,
3416 + symbol->section->output_section->vma
3417 + symbol->section->output_offset),
3418 reloc_entry->addend);
3421 static bfd_reloc_status_type
3422 nios2_elf32_hiadj16_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
3423 void *data, asection *input_section,
3425 char **error_message ATTRIBUTE_UNUSED)
3427 /* This part is from bfd_elf_generic_reloc. */
3428 if (output_bfd != NULL
3429 && (symbol->flags & BSF_SECTION_SYM) == 0
3430 && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
3432 reloc_entry->address += input_section->output_offset;
3433 return bfd_reloc_ok;
3436 if (output_bfd != NULL)
3437 /* FIXME: See bfd_perform_relocation. Is this right? */
3438 return bfd_reloc_continue;
3440 return nios2_elf32_do_hiadj16_relocate (abfd, reloc_entry->howto,
3442 data, reloc_entry->address,
3444 + symbol->section->output_section->vma
3445 + symbol->section->output_offset),
3446 reloc_entry->addend);
3449 static bfd_reloc_status_type
3450 nios2_elf32_pcrel_lo16_relocate (bfd *abfd, arelent *reloc_entry,
3451 asymbol *symbol, void *data,
3452 asection *input_section, bfd *output_bfd,
3453 char **error_message ATTRIBUTE_UNUSED)
3455 /* This part is from bfd_elf_generic_reloc. */
3456 if (output_bfd != NULL
3457 && (symbol->flags & BSF_SECTION_SYM) == 0
3458 && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
3460 reloc_entry->address += input_section->output_offset;
3461 return bfd_reloc_ok;
3464 if (output_bfd != NULL)
3465 /* FIXME: See bfd_perform_relocation. Is this right? */
3466 return bfd_reloc_continue;
3468 return nios2_elf32_do_pcrel_lo16_relocate (
3469 abfd, reloc_entry->howto, input_section, data, reloc_entry->address,
3470 (symbol->value + symbol->section->output_section->vma
3471 + symbol->section->output_offset),
3472 reloc_entry->addend);
3475 static bfd_reloc_status_type
3476 nios2_elf32_pcrel_hiadj16_relocate (bfd *abfd, arelent *reloc_entry,
3477 asymbol *symbol, void *data,
3478 asection *input_section, bfd *output_bfd,
3479 char **error_message ATTRIBUTE_UNUSED)
3481 /* This part is from bfd_elf_generic_reloc. */
3482 if (output_bfd != NULL
3483 && (symbol->flags & BSF_SECTION_SYM) == 0
3484 && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
3486 reloc_entry->address += input_section->output_offset;
3487 return bfd_reloc_ok;
3490 if (output_bfd != NULL)
3491 /* FIXME: See bfd_perform_relocation. Is this right? */
3492 return bfd_reloc_continue;
3494 return nios2_elf32_do_pcrel_hiadj16_relocate (
3495 abfd, reloc_entry->howto, input_section, data, reloc_entry->address,
3496 (symbol->value + symbol->section->output_section->vma
3497 + symbol->section->output_offset),
3498 reloc_entry->addend);
3501 static bfd_reloc_status_type
3502 nios2_elf32_pcrel16_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
3503 void *data, asection *input_section,
3505 char **error_message ATTRIBUTE_UNUSED)
3507 /* This part is from bfd_elf_generic_reloc. */
3508 if (output_bfd != NULL
3509 && (symbol->flags & BSF_SECTION_SYM) == 0
3510 && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
3512 reloc_entry->address += input_section->output_offset;
3513 return bfd_reloc_ok;
3516 if (output_bfd != NULL)
3517 /* FIXME: See bfd_perform_relocation. Is this right? */
3518 return bfd_reloc_continue;
3520 return nios2_elf32_do_pcrel16_relocate (abfd, reloc_entry->howto,
3522 data, reloc_entry->address,
3524 + symbol->section->output_section->vma
3525 + symbol->section->output_offset),
3526 reloc_entry->addend);
3529 static bfd_reloc_status_type
3530 nios2_elf32_call26_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
3531 void *data, asection *input_section,
3533 char **error_message ATTRIBUTE_UNUSED)
3535 /* This part is from bfd_elf_generic_reloc. */
3536 if (output_bfd != NULL
3537 && (symbol->flags & BSF_SECTION_SYM) == 0
3538 && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
3540 reloc_entry->address += input_section->output_offset;
3541 return bfd_reloc_ok;
3544 if (output_bfd != NULL)
3545 /* FIXME: See bfd_perform_relocation. Is this right? */
3546 return bfd_reloc_continue;
3548 return nios2_elf32_do_call26_relocate (abfd, reloc_entry->howto,
3550 data, reloc_entry->address,
3552 + symbol->section->output_section->vma
3553 + symbol->section->output_offset),
3554 reloc_entry->addend);
3557 static bfd_reloc_status_type
3558 nios2_elf32_gprel_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
3559 void *data, asection *input_section,
3560 bfd *output_bfd, char **msg)
3564 bfd_reloc_status_type r;
3567 /* This part is from bfd_elf_generic_reloc. */
3568 if (output_bfd != NULL
3569 && (symbol->flags & BSF_SECTION_SYM) == 0
3570 && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
3572 reloc_entry->address += input_section->output_offset;
3573 return bfd_reloc_ok;
3576 if (output_bfd != NULL)
3577 /* FIXME: See bfd_perform_relocation. Is this right? */
3578 return bfd_reloc_continue;
3580 relocation = (symbol->value
3581 + symbol->section->output_section->vma
3582 + symbol->section->output_offset);
3584 /* This assumes we've already cached the _gp symbol. */
3585 r = nios2_elf_final_gp (abfd, symbol, FALSE, msg, &gp);
3586 if (r == bfd_reloc_ok)
3588 relocation = relocation + reloc_entry->addend - gp;
3589 reloc_entry->addend = 0;
3590 if ((signed) relocation < -32768 || (signed) relocation > 32767)
3592 *msg = _("global pointer relative address out of range");
3593 r = bfd_reloc_outofrange;
3596 r = nios2_elf32_do_gprel_relocate (abfd, reloc_entry->howto,
3598 data, reloc_entry->address,
3599 relocation, reloc_entry->addend);
3605 static bfd_reloc_status_type
3606 nios2_elf32_ujmp_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
3607 void *data, asection *input_section,
3608 bfd *output_bfd, char **msg ATTRIBUTE_UNUSED)
3610 /* This part is from bfd_elf_generic_reloc. */
3611 if (output_bfd != NULL
3612 && (symbol->flags & BSF_SECTION_SYM) == 0
3613 && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
3615 reloc_entry->address += input_section->output_offset;
3616 return bfd_reloc_ok;
3619 if (output_bfd != NULL)
3620 /* FIXME: See bfd_perform_relocation. Is this right? */
3621 return bfd_reloc_continue;
3623 return nios2_elf32_do_ujmp_relocate (abfd, reloc_entry->howto,
3625 data, reloc_entry->address,
3627 + symbol->section->output_section->vma
3628 + symbol->section->output_offset),
3629 reloc_entry->addend);
3632 static bfd_reloc_status_type
3633 nios2_elf32_cjmp_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
3634 void *data, asection *input_section,
3635 bfd *output_bfd, char **msg ATTRIBUTE_UNUSED)
3637 /* This part is from bfd_elf_generic_reloc. */
3638 if (output_bfd != NULL
3639 && (symbol->flags & BSF_SECTION_SYM) == 0
3640 && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
3642 reloc_entry->address += input_section->output_offset;
3643 return bfd_reloc_ok;
3646 if (output_bfd != NULL)
3647 /* FIXME: See bfd_perform_relocation. Is this right? */
3648 return bfd_reloc_continue;
3650 return nios2_elf32_do_cjmp_relocate (abfd, reloc_entry->howto,
3652 data, reloc_entry->address,
3654 + symbol->section->output_section->vma
3655 + symbol->section->output_offset),
3656 reloc_entry->addend);
3659 static bfd_reloc_status_type
3660 nios2_elf32_callr_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
3661 void *data, asection *input_section,
3662 bfd *output_bfd, char **msg ATTRIBUTE_UNUSED)
3664 /* This part is from bfd_elf_generic_reloc. */
3665 if (output_bfd != NULL
3666 && (symbol->flags & BSF_SECTION_SYM) == 0
3667 && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
3669 reloc_entry->address += input_section->output_offset;
3670 return bfd_reloc_ok;
3673 if (output_bfd != NULL)
3674 /* FIXME: See bfd_perform_relocation. Is this right? */
3675 return bfd_reloc_continue;
3677 return nios2_elf32_do_callr_relocate (abfd, reloc_entry->howto,
3679 data, reloc_entry->address,
3681 + symbol->section->output_section->vma
3682 + symbol->section->output_offset),
3683 reloc_entry->addend);
3687 /* Implement elf_backend_relocate_section. */
3689 nios2_elf32_relocate_section (bfd *output_bfd,
3690 struct bfd_link_info *info,
3692 asection *input_section,
3694 Elf_Internal_Rela *relocs,
3695 Elf_Internal_Sym *local_syms,
3696 asection **local_sections)
3698 Elf_Internal_Shdr *symtab_hdr;
3699 struct elf_link_hash_entry **sym_hashes;
3700 Elf_Internal_Rela *rel;
3701 Elf_Internal_Rela *relend;
3702 struct elf32_nios2_link_hash_table *htab;
3705 asection *sreloc = NULL;
3706 bfd_vma *local_got_offsets;
3709 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
3710 sym_hashes = elf_sym_hashes (input_bfd);
3711 relend = relocs + input_section->reloc_count;
3713 htab = elf32_nios2_hash_table (info);
3714 sgot = htab->root.sgot;
3715 splt = htab->root.splt;
3716 local_got_offsets = elf_local_got_offsets (input_bfd);
3718 if (elf32_nios2_hash_table (info)->h_gp_got == NULL)
3721 got_base = elf32_nios2_hash_table (info)->h_gp_got->root.u.def.value;
3723 for (rel = relocs; rel < relend; rel++)
3725 reloc_howto_type *howto;
3726 unsigned long r_symndx;
3727 Elf_Internal_Sym *sym;
3729 struct elf_link_hash_entry *h;
3730 struct elf32_nios2_link_hash_entry *eh;
3733 bfd_reloc_status_type r = bfd_reloc_ok;
3734 const char *name = NULL;
3738 const char* msg = (const char*) NULL;
3739 bfd_boolean unresolved_reloc;
3743 r_type = ELF32_R_TYPE (rel->r_info);
3744 r_symndx = ELF32_R_SYM (rel->r_info);
3746 howto = lookup_howto ((unsigned) ELF32_R_TYPE (rel->r_info), output_bfd);
3751 if (r_symndx < symtab_hdr->sh_info)
3753 sym = local_syms + r_symndx;
3754 sec = local_sections[r_symndx];
3755 relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
3759 bfd_boolean warned, ignored;
3761 RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
3762 r_symndx, symtab_hdr, sym_hashes,
3764 unresolved_reloc, warned, ignored);
3767 if (sec && discarded_section (sec))
3768 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
3769 rel, 1, relend, howto, 0, contents);
3771 /* Nothing more to do unless this is a final link. */
3772 if (bfd_link_relocatable (info))
3777 switch (howto->type)
3780 r = nios2_elf32_do_hi16_relocate (input_bfd, howto,
3782 contents, rel->r_offset,
3783 relocation, rel->r_addend);
3786 r = nios2_elf32_do_lo16_relocate (input_bfd, howto,
3788 contents, rel->r_offset,
3789 relocation, rel->r_addend);
3791 case R_NIOS2_PCREL_LO:
3792 r = nios2_elf32_do_pcrel_lo16_relocate (input_bfd, howto,
3799 case R_NIOS2_HIADJ16:
3800 r = nios2_elf32_do_hiadj16_relocate (input_bfd, howto,
3801 input_section, contents,
3802 rel->r_offset, relocation,
3805 case R_NIOS2_PCREL_HA:
3806 r = nios2_elf32_do_pcrel_hiadj16_relocate (input_bfd, howto,
3813 case R_NIOS2_PCREL16:
3814 r = nios2_elf32_do_pcrel16_relocate (input_bfd, howto,
3815 input_section, contents,
3816 rel->r_offset, relocation,
3820 /* Turns an absolute address into a gp-relative address. */
3821 if (!nios2_elf_assign_gp (output_bfd, &gp, info))
3823 bfd_vma reloc_address;
3825 if (sec && sec->output_section)
3826 reloc_address = (sec->output_section->vma
3827 + sec->output_offset
3832 format = _("global pointer relative relocation at address "
3833 "0x%08x when _gp not defined\n");
3834 sprintf (msgbuf, format, reloc_address);
3836 r = bfd_reloc_dangerous;
3840 bfd_vma symbol_address = rel->r_addend + relocation;
3841 relocation = symbol_address - gp;
3843 if (((signed) relocation < -32768
3844 || (signed) relocation > 32767)
3846 || h->root.type == bfd_link_hash_defined
3847 || h->root.type == bfd_link_hash_defweak))
3850 name = h->root.root.string;
3851 /* xgettext:c-format */
3852 format = _("Unable to reach %s (at 0x%08x) from the "
3853 "global pointer (at 0x%08x) because the "
3854 "offset (%d) is out of the allowed range, "
3855 "-32678 to 32767.\n" );
3856 sprintf (msgbuf, format, name, symbol_address, gp,
3857 (signed)relocation);
3859 r = bfd_reloc_outofrange;
3862 r = _bfd_final_link_relocate (howto, input_bfd,
3863 input_section, contents,
3864 rel->r_offset, relocation,
3869 r = nios2_elf32_do_ujmp_relocate (input_bfd, howto,
3871 contents, rel->r_offset,
3872 relocation, rel->r_addend);
3875 r = nios2_elf32_do_cjmp_relocate (input_bfd, howto,
3877 contents, rel->r_offset,
3878 relocation, rel->r_addend);
3881 r = nios2_elf32_do_callr_relocate (input_bfd, howto,
3882 input_section, contents,
3883 rel->r_offset, relocation,
3886 case R_NIOS2_CALL26:
3887 case R_NIOS2_CALL26_NOAT:
3888 /* If we have a call to an undefined weak symbol, we just want
3889 to stuff a zero in the bits of the call instruction and
3890 bypass the normal call26 relocation handling, because it'll
3891 diagnose an overflow error if address 0 isn't in the same
3892 256MB segment as the call site. Presumably the call
3893 should be guarded by a null check anyway. */
3894 if (h != NULL && h->root.type == bfd_link_hash_undefweak)
3896 BFD_ASSERT (relocation == 0 && rel->r_addend == 0);
3897 r = _bfd_final_link_relocate (howto, input_bfd,
3898 input_section, contents,
3899 rel->r_offset, relocation,
3903 /* Handle relocations which should use the PLT entry.
3904 NIOS2_BFD_RELOC_32 relocations will use the symbol's value,
3905 which may point to a PLT entry, but we don't need to handle
3906 that here. If we created a PLT entry, all branches in this
3907 object should go to it. */
3908 if (h != NULL && splt != NULL && h->plt.offset != (bfd_vma) -1)
3910 /* If we've created a .plt section, and assigned a PLT entry
3911 to this function, it should not be known to bind locally.
3912 If it were, we would have cleared the PLT entry. */
3913 BFD_ASSERT (!SYMBOL_CALLS_LOCAL (info, h));
3915 relocation = (splt->output_section->vma
3916 + splt->output_offset
3919 unresolved_reloc = FALSE;
3921 /* Detect R_NIOS2_CALL26 relocations that would overflow the
3922 256MB segment. Replace the target with a reference to a
3924 Note that htab->stub_group is null if relaxation has been
3925 disabled by the --no-relax linker command-line option, so
3926 we can use that to skip this processing entirely. */
3927 if (howto->type == R_NIOS2_CALL26 && htab->stub_group)
3929 bfd_vma dest = relocation + rel->r_addend;
3930 enum elf32_nios2_stub_type stub_type;
3932 eh = (struct elf32_nios2_link_hash_entry *)h;
3933 stub_type = nios2_type_of_stub (input_section, rel, eh,
3936 if (stub_type != nios2_stub_none)
3938 struct elf32_nios2_stub_hash_entry *hsh;
3940 hsh = nios2_get_stub_entry (input_section, sec,
3941 eh, rel, htab, stub_type);
3944 r = bfd_reloc_undefined;
3948 dest = (hsh->stub_offset
3949 + hsh->stub_sec->output_offset
3950 + hsh->stub_sec->output_section->vma);
3951 r = nios2_elf32_do_call26_relocate (input_bfd, howto,
3961 r = nios2_elf32_do_call26_relocate (input_bfd, howto,
3962 input_section, contents,
3963 rel->r_offset, relocation,
3968 /* For symmetry this would be
3969 r = nios2_elf32_do_ignore_reloc (input_bfd, howto,
3970 input_section, contents,
3971 rel->r_offset, relocation,
3973 but do_ignore_reloc would do no more than return
3978 case R_NIOS2_CALL16:
3979 case R_NIOS2_GOT_LO:
3980 case R_NIOS2_GOT_HA:
3981 case R_NIOS2_CALL_LO:
3982 case R_NIOS2_CALL_HA:
3983 /* Relocation is to the entry for this symbol in the
3984 global offset table. */
3987 r = bfd_reloc_notsupported;
3997 eh = (struct elf32_nios2_link_hash_entry *)h;
3998 use_plt = (eh->got_types_used == CALL_USED
3999 && h->plt.offset != (bfd_vma) -1);
4001 off = h->got.offset;
4002 BFD_ASSERT (off != (bfd_vma) -1);
4003 dyn = elf_hash_table (info)->dynamic_sections_created;
4004 if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn,
4005 bfd_link_pic (info),
4007 || (bfd_link_pic (info)
4008 && SYMBOL_REFERENCES_LOCAL (info, h))
4009 || (ELF_ST_VISIBILITY (h->other)
4010 && h->root.type == bfd_link_hash_undefweak))
4012 /* This is actually a static link, or it is a -Bsymbolic
4013 link and the symbol is defined locally. We must
4014 initialize this entry in the global offset table.
4015 Since the offset must always be a multiple of 4, we
4016 use the least significant bit to record whether we
4017 have initialized it already.
4019 When doing a dynamic link, we create a .rela.got
4020 relocation entry to initialize the value. This is
4021 done in the finish_dynamic_symbol routine. */
4026 bfd_put_32 (output_bfd, relocation,
4027 sgot->contents + off);
4032 unresolved_reloc = FALSE;
4036 BFD_ASSERT (local_got_offsets != NULL
4037 && local_got_offsets[r_symndx] != (bfd_vma) -1);
4039 off = local_got_offsets[r_symndx];
4041 /* The offset must always be a multiple of 4. We use the
4042 least significant bit to record whether we have already
4043 generated the necessary reloc. */
4048 bfd_put_32 (output_bfd, relocation,
4049 sgot->contents + off);
4051 if (bfd_link_pic (info))
4054 Elf_Internal_Rela outrel;
4057 srelgot = htab->root.srelgot;
4058 BFD_ASSERT (srelgot != NULL);
4060 outrel.r_addend = relocation;
4061 outrel.r_offset = (sgot->output_section->vma
4062 + sgot->output_offset
4064 outrel.r_info = ELF32_R_INFO (0, R_NIOS2_RELATIVE);
4065 loc = srelgot->contents;
4066 loc += (srelgot->reloc_count++ *
4067 sizeof (Elf32_External_Rela));
4068 bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
4071 local_got_offsets[r_symndx] |= 1;
4075 if (use_plt && bfd_link_pic (info))
4077 off = ((h->plt.offset - 24) / 12 + 3) * 4;
4078 relocation = (htab->root.sgotplt->output_offset + off
4082 relocation = sgot->output_offset + off - got_base;
4084 /* This relocation does not use the addend. */
4087 switch (howto->type)
4089 case R_NIOS2_GOT_LO:
4090 case R_NIOS2_CALL_LO:
4091 r = nios2_elf32_do_lo16_relocate (input_bfd, howto,
4092 input_section, contents,
4093 rel->r_offset, relocation,
4096 case R_NIOS2_GOT_HA:
4097 case R_NIOS2_CALL_HA:
4098 r = nios2_elf32_do_hiadj16_relocate (input_bfd, howto,
4099 input_section, contents,
4105 r = _bfd_final_link_relocate (howto, input_bfd,
4106 input_section, contents,
4107 rel->r_offset, relocation,
4113 case R_NIOS2_GOTOFF_LO:
4114 case R_NIOS2_GOTOFF_HA:
4115 case R_NIOS2_GOTOFF:
4116 /* Relocation is relative to the global offset table pointer. */
4118 BFD_ASSERT (sgot != NULL);
4121 r = bfd_reloc_notsupported;
4125 /* Note that sgot->output_offset is not involved in this
4126 calculation. We always want the start of .got. */
4127 relocation -= sgot->output_section->vma;
4129 /* Now we adjust the relocation to be relative to the GOT pointer
4130 (the _gp_got symbol), which possibly contains the 0x8000 bias. */
4131 relocation -= got_base;
4133 switch (howto->type)
4135 case R_NIOS2_GOTOFF_LO:
4136 r = nios2_elf32_do_lo16_relocate (input_bfd, howto,
4137 input_section, contents,
4138 rel->r_offset, relocation,
4141 case R_NIOS2_GOTOFF_HA:
4142 r = nios2_elf32_do_hiadj16_relocate (input_bfd, howto,
4143 input_section, contents,
4149 r = _bfd_final_link_relocate (howto, input_bfd,
4150 input_section, contents,
4151 rel->r_offset, relocation,
4157 case R_NIOS2_TLS_LDO16:
4158 relocation -= dtpoff_base (info) + DTP_OFFSET;
4160 r = _bfd_final_link_relocate (howto, input_bfd, input_section,
4161 contents, rel->r_offset,
4162 relocation, rel->r_addend);
4164 case R_NIOS2_TLS_LDM16:
4165 if (htab->root.sgot == NULL)
4168 off = htab->tls_ldm_got.offset;
4174 /* If we don't know the module number, create a relocation
4176 if (bfd_link_pic (info))
4178 Elf_Internal_Rela outrel;
4181 if (htab->root.srelgot == NULL)
4184 outrel.r_addend = 0;
4185 outrel.r_offset = (htab->root.sgot->output_section->vma
4186 + htab->root.sgot->output_offset
4188 outrel.r_info = ELF32_R_INFO (0, R_NIOS2_TLS_DTPMOD);
4190 loc = htab->root.srelgot->contents;
4191 loc += (htab->root.srelgot->reloc_count++
4192 * sizeof (Elf32_External_Rela));
4193 bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
4196 bfd_put_32 (output_bfd, 1,
4197 htab->root.sgot->contents + off);
4199 htab->tls_ldm_got.offset |= 1;
4202 relocation = htab->root.sgot->output_offset + off - got_base;
4204 r = _bfd_final_link_relocate (howto, input_bfd, input_section,
4205 contents, rel->r_offset,
4206 relocation, rel->r_addend);
4209 case R_NIOS2_TLS_GD16:
4210 case R_NIOS2_TLS_IE16:
4215 if (htab->root.sgot == NULL)
4222 dyn = htab->root.dynamic_sections_created;
4223 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn,
4224 bfd_link_pic (info),
4226 && (!bfd_link_pic (info)
4227 || !SYMBOL_REFERENCES_LOCAL (info, h)))
4229 unresolved_reloc = FALSE;
4232 off = h->got.offset;
4233 tls_type = (((struct elf32_nios2_link_hash_entry *) h)
4238 if (local_got_offsets == NULL)
4240 off = local_got_offsets[r_symndx];
4241 tls_type = (elf32_nios2_local_got_tls_type (input_bfd)
4245 if (tls_type == GOT_UNKNOWN)
4252 bfd_boolean need_relocs = FALSE;
4253 Elf_Internal_Rela outrel;
4254 bfd_byte *loc = NULL;
4257 /* The GOT entries have not been initialized yet. Do it
4258 now, and emit any relocations. If both an IE GOT and a
4259 GD GOT are necessary, we emit the GD first. */
4261 if ((bfd_link_pic (info) || indx != 0)
4263 || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
4264 || h->root.type != bfd_link_hash_undefweak))
4267 if (htab->root.srelgot == NULL)
4269 loc = htab->root.srelgot->contents;
4270 loc += (htab->root.srelgot->reloc_count *
4271 sizeof (Elf32_External_Rela));
4274 if (tls_type & GOT_TLS_GD)
4278 outrel.r_addend = 0;
4279 outrel.r_offset = (htab->root.sgot->output_section->vma
4280 + htab->root.sgot->output_offset
4282 outrel.r_info = ELF32_R_INFO (indx,
4283 R_NIOS2_TLS_DTPMOD);
4285 bfd_elf32_swap_reloca_out (output_bfd, &outrel,
4287 htab->root.srelgot->reloc_count++;
4288 loc += sizeof (Elf32_External_Rela);
4291 bfd_put_32 (output_bfd,
4292 (relocation - dtpoff_base (info) -
4294 htab->root.sgot->contents + cur_off + 4);
4297 outrel.r_addend = 0;
4298 outrel.r_info = ELF32_R_INFO (indx,
4299 R_NIOS2_TLS_DTPREL);
4300 outrel.r_offset += 4;
4302 bfd_elf32_swap_reloca_out (output_bfd, &outrel,
4304 htab->root.srelgot->reloc_count++;
4305 loc += sizeof (Elf32_External_Rela);
4310 /* If we are not emitting relocations for a
4311 general dynamic reference, then we must be in a
4312 static link or an executable link with the
4313 symbol binding locally. Mark it as belonging
4314 to module 1, the executable. */
4315 bfd_put_32 (output_bfd, 1,
4316 htab->root.sgot->contents + cur_off);
4317 bfd_put_32 (output_bfd, (relocation -
4318 dtpoff_base (info) -
4320 htab->root.sgot->contents + cur_off + 4);
4326 if (tls_type & GOT_TLS_IE)
4331 outrel.r_addend = (relocation -
4332 dtpoff_base (info));
4334 outrel.r_addend = 0;
4335 outrel.r_offset = (htab->root.sgot->output_section->vma
4336 + htab->root.sgot->output_offset
4338 outrel.r_info = ELF32_R_INFO (indx,
4341 bfd_elf32_swap_reloca_out (output_bfd, &outrel,
4343 htab->root.srelgot->reloc_count++;
4344 loc += sizeof (Elf32_External_Rela);
4347 bfd_put_32 (output_bfd, (tpoff (info, relocation)
4349 htab->root.sgot->contents + cur_off);
4356 local_got_offsets[r_symndx] |= 1;
4359 if ((tls_type & GOT_TLS_GD) && r_type != R_NIOS2_TLS_GD16)
4361 relocation = htab->root.sgot->output_offset + off - got_base;
4363 r = _bfd_final_link_relocate (howto, input_bfd, input_section,
4364 contents, rel->r_offset,
4365 relocation, rel->r_addend);
4369 case R_NIOS2_TLS_LE16:
4370 if (bfd_link_dll (info))
4373 /* xgettext:c-format */
4374 (_("%B(%A+0x%lx): R_NIOS2_TLS_LE16 relocation not "
4375 "permitted in shared object"),
4376 input_bfd, input_section,
4377 (long) rel->r_offset, howto->name);
4381 relocation = tpoff (info, relocation) - TP_OFFSET;
4383 r = _bfd_final_link_relocate (howto, input_bfd, input_section,
4384 contents, rel->r_offset,
4385 relocation, rel->r_addend);
4388 case R_NIOS2_BFD_RELOC_32:
4389 if (bfd_link_pic (info)
4390 && (input_section->flags & SEC_ALLOC) != 0
4392 || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
4393 || h->root.type != bfd_link_hash_undefweak))
4395 Elf_Internal_Rela outrel;
4397 bfd_boolean skip, relocate;
4399 /* When generating a shared object, these relocations
4400 are copied into the output file to be resolved at run
4407 = _bfd_elf_section_offset (output_bfd, info,
4408 input_section, rel->r_offset);
4409 if (outrel.r_offset == (bfd_vma) -1)
4411 else if (outrel.r_offset == (bfd_vma) -2)
4412 skip = TRUE, relocate = TRUE;
4413 outrel.r_offset += (input_section->output_section->vma
4414 + input_section->output_offset);
4417 memset (&outrel, 0, sizeof outrel);
4420 && (!bfd_link_pic (info)
4421 || !SYMBOLIC_BIND (info, h)
4422 || !h->def_regular))
4424 outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
4425 outrel.r_addend = rel->r_addend;
4429 /* This symbol is local, or marked to become local. */
4430 outrel.r_addend = relocation + rel->r_addend;
4432 outrel.r_info = ELF32_R_INFO (0, R_NIOS2_RELATIVE);
4435 sreloc = elf_section_data (input_section)->sreloc;
4439 loc = sreloc->contents;
4440 loc += sreloc->reloc_count++ * sizeof (Elf32_External_Rela);
4441 bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
4443 /* This reloc will be computed at runtime, so there's no
4444 need to do anything now, except for R_NIOS2_BFD_RELOC_32
4445 relocations that have been turned into
4446 R_NIOS2_RELATIVE. */
4451 r = _bfd_final_link_relocate (howto, input_bfd,
4452 input_section, contents,
4453 rel->r_offset, relocation,
4457 case R_NIOS2_TLS_DTPREL:
4458 relocation -= dtpoff_base (info);
4462 r = _bfd_final_link_relocate (howto, input_bfd,
4463 input_section, contents,
4464 rel->r_offset, relocation,
4470 r = bfd_reloc_notsupported;
4472 if (r != bfd_reloc_ok)
4475 name = h->root.root.string;
4478 name = bfd_elf_string_from_elf_section (input_bfd,
4479 symtab_hdr->sh_link,
4481 if (name == NULL || *name == '\0')
4482 name = bfd_section_name (input_bfd, sec);
4487 case bfd_reloc_overflow:
4488 (*info->callbacks->reloc_overflow) (info, NULL, name,
4489 howto->name, (bfd_vma) 0,
4490 input_bfd, input_section,
4494 case bfd_reloc_undefined:
4495 (*info->callbacks->undefined_symbol) (info, name, input_bfd,
4497 rel->r_offset, TRUE);
4500 case bfd_reloc_outofrange:
4502 msg = _("relocation out of range");
4505 case bfd_reloc_notsupported:
4507 msg = _("unsupported relocation");
4510 case bfd_reloc_dangerous:
4512 msg = _("dangerous relocation");
4517 msg = _("unknown error");
4523 (*info->callbacks->warning) (info, msg, name, input_bfd,
4524 input_section, rel->r_offset);
4532 /* Implement elf-backend_section_flags:
4533 Convert NIOS2 specific section flags to bfd internal section flags. */
4535 nios2_elf32_section_flags (flagword *flags, const Elf_Internal_Shdr *hdr)
4537 if (hdr->sh_flags & SHF_NIOS2_GPREL)
4538 *flags |= SEC_SMALL_DATA;
4543 /* Implement elf_backend_fake_sections:
4544 Set the correct type for an NIOS2 ELF section. We do this by the
4545 section name, which is a hack, but ought to work. */
4547 nios2_elf32_fake_sections (bfd *abfd ATTRIBUTE_UNUSED,
4548 Elf_Internal_Shdr *hdr, asection *sec)
4550 register const char *name = bfd_get_section_name (abfd, sec);
4552 if ((sec->flags & SEC_SMALL_DATA)
4553 || strcmp (name, ".sdata") == 0
4554 || strcmp (name, ".sbss") == 0
4555 || strcmp (name, ".lit4") == 0 || strcmp (name, ".lit8") == 0)
4556 hdr->sh_flags |= SHF_NIOS2_GPREL;
4561 /* Create .got, .gotplt, and .rela.got sections in DYNOBJ, and set up
4562 shortcuts to them in our hash table. */
4564 create_got_section (bfd *dynobj, struct bfd_link_info *info)
4566 struct elf32_nios2_link_hash_table *htab;
4567 struct elf_link_hash_entry *h;
4569 htab = elf32_nios2_hash_table (info);
4571 if (! _bfd_elf_create_got_section (dynobj, info))
4574 /* In order for the two loads in .PLTresolve to share the same %hiadj,
4575 _GLOBAL_OFFSET_TABLE_ must be aligned to a 16-byte boundary. */
4576 if (!bfd_set_section_alignment (dynobj, htab->root.sgotplt, 4))
4579 /* The Nios II ABI specifies that GOT-relative relocations are relative
4580 to the linker-created symbol _gp_got, rather than using
4581 _GLOBAL_OFFSET_TABLE_ directly. In particular, the latter always
4582 points to the base of the GOT while _gp_got may include a bias. */
4583 h = _bfd_elf_define_linkage_sym (dynobj, info, htab->root.sgotplt,
4585 elf32_nios2_hash_table (info)->h_gp_got = h;
4592 /* Implement elf_backend_create_dynamic_sections:
4593 Create .plt, .rela.plt, .got, .got.plt, .rela.got, .dynbss, and
4594 .rela.bss sections in DYNOBJ, and set up shortcuts to them in our
4597 nios2_elf32_create_dynamic_sections (bfd *dynobj, struct bfd_link_info *info)
4599 struct elf32_nios2_link_hash_table *htab;
4601 htab = elf32_nios2_hash_table (info);
4602 if (!htab->root.sgot && !create_got_section (dynobj, info))
4605 _bfd_elf_create_dynamic_sections (dynobj, info);
4607 /* In order for the two loads in a shared object .PLTresolve to share the
4608 same %hiadj, the start of the PLT (as well as the GOT) must be aligned
4609 to a 16-byte boundary. This is because the addresses for these loads
4610 include the -(.plt+4) PIC correction. */
4611 if (!bfd_set_section_alignment (dynobj, htab->root.splt, 4))
4614 htab->sdynbss = bfd_get_linker_section (dynobj, ".dynbss");
4617 if (!bfd_link_pic (info))
4619 htab->srelbss = bfd_get_linker_section (dynobj, ".rela.bss");
4627 /* Implement elf_backend_copy_indirect_symbol:
4628 Copy the extra info we tack onto an elf_link_hash_entry. */
4630 nios2_elf32_copy_indirect_symbol (struct bfd_link_info *info,
4631 struct elf_link_hash_entry *dir,
4632 struct elf_link_hash_entry *ind)
4634 struct elf32_nios2_link_hash_entry *edir, *eind;
4636 edir = (struct elf32_nios2_link_hash_entry *) dir;
4637 eind = (struct elf32_nios2_link_hash_entry *) ind;
4639 if (eind->dyn_relocs != NULL)
4641 if (edir->dyn_relocs != NULL)
4643 struct elf32_nios2_dyn_relocs **pp;
4644 struct elf32_nios2_dyn_relocs *p;
4646 /* Add reloc counts against the indirect sym to the direct sym
4647 list. Merge any entries against the same section. */
4648 for (pp = &eind->dyn_relocs; (p = *pp) != NULL; )
4650 struct elf32_nios2_dyn_relocs *q;
4652 for (q = edir->dyn_relocs; q != NULL; q = q->next)
4653 if (q->sec == p->sec)
4655 q->pc_count += p->pc_count;
4656 q->count += p->count;
4663 *pp = edir->dyn_relocs;
4666 edir->dyn_relocs = eind->dyn_relocs;
4667 eind->dyn_relocs = NULL;
4670 if (ind->root.type == bfd_link_hash_indirect
4671 && dir->got.refcount <= 0)
4673 edir->tls_type = eind->tls_type;
4674 eind->tls_type = GOT_UNKNOWN;
4677 edir->got_types_used |= eind->got_types_used;
4679 _bfd_elf_link_hash_copy_indirect (info, dir, ind);
4682 /* Set the right machine number for a NIOS2 ELF file. */
4685 nios2_elf32_object_p (bfd *abfd)
4689 mach = elf_elfheader (abfd)->e_flags;
4694 case EF_NIOS2_ARCH_R1:
4695 bfd_default_set_arch_mach (abfd, bfd_arch_nios2, bfd_mach_nios2r1);
4697 case EF_NIOS2_ARCH_R2:
4698 bfd_default_set_arch_mach (abfd, bfd_arch_nios2, bfd_mach_nios2r2);
4705 /* Implement elf_backend_check_relocs:
4706 Look through the relocs for a section during the first phase. */
4708 nios2_elf32_check_relocs (bfd *abfd, struct bfd_link_info *info,
4709 asection *sec, const Elf_Internal_Rela *relocs)
4712 Elf_Internal_Shdr *symtab_hdr;
4713 struct elf_link_hash_entry **sym_hashes, **sym_hashes_end;
4714 const Elf_Internal_Rela *rel;
4715 const Elf_Internal_Rela *rel_end;
4716 struct elf32_nios2_link_hash_table *htab;
4719 asection *sreloc = NULL;
4720 bfd_signed_vma *local_got_refcounts;
4722 if (bfd_link_relocatable (info))
4725 dynobj = elf_hash_table (info)->dynobj;
4726 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
4727 sym_hashes = elf_sym_hashes (abfd);
4728 sym_hashes_end = (sym_hashes
4729 + symtab_hdr->sh_size / sizeof (Elf32_External_Sym));
4730 if (!elf_bad_symtab (abfd))
4731 sym_hashes_end -= symtab_hdr->sh_info;
4732 local_got_refcounts = elf_local_got_refcounts (abfd);
4734 htab = elf32_nios2_hash_table (info);
4735 sgot = htab->root.sgot;
4736 srelgot = htab->root.srelgot;
4738 rel_end = relocs + sec->reloc_count;
4739 for (rel = relocs; rel < rel_end; rel++)
4741 unsigned int r_type;
4742 struct elf_link_hash_entry *h;
4743 unsigned long r_symndx;
4745 r_symndx = ELF32_R_SYM (rel->r_info);
4746 if (r_symndx < symtab_hdr->sh_info)
4750 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
4751 while (h->root.type == bfd_link_hash_indirect
4752 || h->root.type == bfd_link_hash_warning)
4753 h = (struct elf_link_hash_entry *) h->root.u.i.link;
4755 /* PR15323, ref flags aren't set for references in the same
4757 h->root.non_ir_ref = 1;
4760 r_type = ELF32_R_TYPE (rel->r_info);
4765 case R_NIOS2_GOT_LO:
4766 case R_NIOS2_GOT_HA:
4767 case R_NIOS2_CALL16:
4768 case R_NIOS2_CALL_LO:
4769 case R_NIOS2_CALL_HA:
4770 case R_NIOS2_TLS_GD16:
4771 case R_NIOS2_TLS_IE16:
4772 /* This symbol requires a global offset table entry. */
4774 int tls_type, old_tls_type;
4780 case R_NIOS2_GOT_LO:
4781 case R_NIOS2_GOT_HA:
4782 case R_NIOS2_CALL16:
4783 case R_NIOS2_CALL_LO:
4784 case R_NIOS2_CALL_HA:
4785 tls_type = GOT_NORMAL;
4787 case R_NIOS2_TLS_GD16:
4788 tls_type = GOT_TLS_GD;
4790 case R_NIOS2_TLS_IE16:
4791 tls_type = GOT_TLS_IE;
4797 /* Create the .got section. */
4798 elf_hash_table (info)->dynobj = dynobj = abfd;
4799 nios2_elf32_create_dynamic_sections (dynobj, info);
4804 sgot = htab->root.sgot;
4805 BFD_ASSERT (sgot != NULL);
4809 && (h != NULL || bfd_link_pic (info)))
4811 srelgot = htab->root.srelgot;
4812 BFD_ASSERT (srelgot != NULL);
4817 struct elf32_nios2_link_hash_entry *eh
4818 = (struct elf32_nios2_link_hash_entry *)h;
4820 old_tls_type = elf32_nios2_hash_entry(h)->tls_type;
4821 if (r_type == R_NIOS2_CALL16
4822 || r_type == R_NIOS2_CALL_LO
4823 || r_type == R_NIOS2_CALL_HA)
4825 /* Make sure a plt entry is created for this symbol if
4826 it turns out to be a function defined by a dynamic
4831 eh->got_types_used |= CALL_USED;
4834 eh->got_types_used |= GOT_USED;
4838 /* This is a global offset table entry for a local symbol. */
4839 if (local_got_refcounts == NULL)
4843 size = symtab_hdr->sh_info;
4844 size *= (sizeof (bfd_signed_vma) + sizeof (char));
4846 = ((bfd_signed_vma *) bfd_zalloc (abfd, size));
4847 if (local_got_refcounts == NULL)
4849 elf_local_got_refcounts (abfd) = local_got_refcounts;
4850 elf32_nios2_local_got_tls_type (abfd)
4851 = (char *) (local_got_refcounts + symtab_hdr->sh_info);
4853 local_got_refcounts[r_symndx]++;
4854 old_tls_type = elf32_nios2_local_got_tls_type (abfd) [r_symndx];
4857 /* We will already have issued an error message if there is a
4858 TLS / non-TLS mismatch, based on the symbol type. We don't
4859 support any linker relaxations. So just combine any TLS
4861 if (old_tls_type != GOT_UNKNOWN && old_tls_type != GOT_NORMAL
4862 && tls_type != GOT_NORMAL)
4863 tls_type |= old_tls_type;
4865 if (old_tls_type != tls_type)
4868 elf32_nios2_hash_entry (h)->tls_type = tls_type;
4870 elf32_nios2_local_got_tls_type (abfd) [r_symndx] = tls_type;
4874 case R_NIOS2_TLS_LDM16:
4875 if (r_type == R_NIOS2_TLS_LDM16)
4876 htab->tls_ldm_got.refcount++;
4878 if (htab->root.sgot == NULL)
4880 if (htab->root.dynobj == NULL)
4881 htab->root.dynobj = abfd;
4882 if (!create_got_section (htab->root.dynobj, info))
4887 /* This relocation describes the C++ object vtable hierarchy.
4888 Reconstruct it for later use during GC. */
4889 case R_NIOS2_GNU_VTINHERIT:
4890 if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
4894 /* This relocation describes which C++ vtable entries are actually
4895 used. Record for later use during GC. */
4896 case R_NIOS2_GNU_VTENTRY:
4897 if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
4901 case R_NIOS2_BFD_RELOC_32:
4902 case R_NIOS2_CALL26:
4903 case R_NIOS2_CALL26_NOAT:
4904 case R_NIOS2_HIADJ16:
4909 /* If this reloc is in a read-only section, we might
4910 need a copy reloc. We can't check reliably at this
4911 stage whether the section is read-only, as input
4912 sections have not yet been mapped to output sections.
4913 Tentatively set the flag for now, and correct in
4914 adjust_dynamic_symbol. */
4915 if (!bfd_link_pic (info))
4918 /* Make sure a plt entry is created for this symbol if it
4919 turns out to be a function defined by a dynamic object. */
4922 if (r_type == R_NIOS2_CALL26 || r_type == R_NIOS2_CALL26_NOAT)
4926 /* If we are creating a shared library, we need to copy the
4927 reloc into the shared library. */
4928 if (bfd_link_pic (info)
4929 && (sec->flags & SEC_ALLOC) != 0
4930 && (r_type == R_NIOS2_BFD_RELOC_32
4931 || (h != NULL && ! h->needs_plt
4932 && (! SYMBOLIC_BIND (info, h) || ! h->def_regular))))
4934 struct elf32_nios2_dyn_relocs *p;
4935 struct elf32_nios2_dyn_relocs **head;
4937 /* When creating a shared object, we must copy these
4938 reloc types into the output file. We create a reloc
4939 section in dynobj and make room for this reloc. */
4942 sreloc = _bfd_elf_make_dynamic_reloc_section
4943 (sec, dynobj, 2, abfd, TRUE);
4948 /* If this is a global symbol, we count the number of
4949 relocations we need for this symbol. */
4951 head = &((struct elf32_nios2_link_hash_entry *) h)->dyn_relocs;
4954 /* Track dynamic relocs needed for local syms too.
4955 We really need local syms available to do this
4960 Elf_Internal_Sym *isym;
4962 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
4967 s = bfd_section_from_elf_index (abfd, isym->st_shndx);
4971 vpp = &elf_section_data (s)->local_dynrel;
4972 head = (struct elf32_nios2_dyn_relocs **) vpp;
4976 if (p == NULL || p->sec != sec)
4978 bfd_size_type amt = sizeof *p;
4979 p = ((struct elf32_nios2_dyn_relocs *)
4980 bfd_alloc (htab->root.dynobj, amt));
5001 /* Implement elf_backend_gc_mark_hook:
5002 Return the section that should be marked against GC for a given
5005 nios2_elf32_gc_mark_hook (asection *sec,
5006 struct bfd_link_info *info,
5007 Elf_Internal_Rela *rel,
5008 struct elf_link_hash_entry *h,
5009 Elf_Internal_Sym *sym)
5012 switch (ELF32_R_TYPE (rel->r_info))
5014 case R_NIOS2_GNU_VTINHERIT:
5015 case R_NIOS2_GNU_VTENTRY:
5018 return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
5021 /* Implement elf_backend_gc_sweep_hook:
5022 Update the got entry reference counts for the section being removed. */
5024 nios2_elf32_gc_sweep_hook (bfd *abfd,
5025 struct bfd_link_info *info,
5027 const Elf_Internal_Rela *relocs)
5029 Elf_Internal_Shdr *symtab_hdr;
5030 struct elf_link_hash_entry **sym_hashes;
5031 bfd_signed_vma *local_got_refcounts;
5032 const Elf_Internal_Rela *rel, *relend;
5035 if (bfd_link_relocatable (info))
5038 elf_section_data (sec)->local_dynrel = NULL;
5040 dynobj = elf_hash_table (info)->dynobj;
5044 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
5045 sym_hashes = elf_sym_hashes (abfd);
5046 local_got_refcounts = elf_local_got_refcounts (abfd);
5048 relend = relocs + sec->reloc_count;
5049 for (rel = relocs; rel < relend; rel++)
5051 unsigned long r_symndx;
5052 struct elf_link_hash_entry *h = NULL;
5055 r_symndx = ELF32_R_SYM (rel->r_info);
5056 if (r_symndx >= symtab_hdr->sh_info)
5058 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
5059 while (h->root.type == bfd_link_hash_indirect
5060 || h->root.type == bfd_link_hash_warning)
5061 h = (struct elf_link_hash_entry *) h->root.u.i.link;
5064 r_type = ELF32_R_TYPE (rel->r_info);
5068 case R_NIOS2_GOT_LO:
5069 case R_NIOS2_GOT_HA:
5070 case R_NIOS2_CALL16:
5071 case R_NIOS2_CALL_LO:
5072 case R_NIOS2_CALL_HA:
5075 if (h->got.refcount > 0)
5078 else if (local_got_refcounts != NULL)
5080 if (local_got_refcounts[r_symndx] > 0)
5081 --local_got_refcounts[r_symndx];
5085 case R_NIOS2_PCREL_LO:
5086 case R_NIOS2_PCREL_HA:
5087 case R_NIOS2_BFD_RELOC_32:
5088 case R_NIOS2_CALL26:
5089 case R_NIOS2_CALL26_NOAT:
5092 struct elf32_nios2_link_hash_entry *eh;
5093 struct elf32_nios2_dyn_relocs **pp;
5094 struct elf32_nios2_dyn_relocs *p;
5096 eh = (struct elf32_nios2_link_hash_entry *) h;
5098 if (h->plt.refcount > 0)
5101 if (r_type == R_NIOS2_PCREL_LO || r_type == R_NIOS2_PCREL_HA
5102 || r_type == R_NIOS2_BFD_RELOC_32)
5104 for (pp = &eh->dyn_relocs; (p = *pp) != NULL;
5125 /* Implement elf_backend_finish_dynamic_symbols:
5126 Finish up dynamic symbol handling. We set the contents of various
5127 dynamic sections here. */
5129 nios2_elf32_finish_dynamic_symbol (bfd *output_bfd,
5130 struct bfd_link_info *info,
5131 struct elf_link_hash_entry *h,
5132 Elf_Internal_Sym *sym)
5134 struct elf32_nios2_link_hash_table *htab;
5135 struct elf32_nios2_link_hash_entry *eh
5136 = (struct elf32_nios2_link_hash_entry *)h;
5139 htab = elf32_nios2_hash_table (info);
5141 if (h->plt.offset != (bfd_vma) -1)
5148 Elf_Internal_Rela rela;
5150 bfd_vma got_address;
5152 /* This symbol has an entry in the procedure linkage table. Set
5154 BFD_ASSERT (h->dynindx != -1);
5155 splt = htab->root.splt;
5156 sgotplt = htab->root.sgotplt;
5157 srela = htab->root.srelplt;
5158 BFD_ASSERT (splt != NULL && sgotplt != NULL && srela != NULL);
5160 /* Emit the PLT entry. */
5161 if (bfd_link_pic (info))
5163 nios2_elf32_install_data (splt, nios2_so_plt_entry, h->plt.offset,
5165 plt_index = (h->plt.offset - 24) / 12;
5166 got_offset = (plt_index + 3) * 4;
5167 nios2_elf32_install_imm16 (splt, h->plt.offset,
5168 hiadj(plt_index * 4));
5169 nios2_elf32_install_imm16 (splt, h->plt.offset + 4,
5170 (plt_index * 4) & 0xffff);
5171 nios2_elf32_install_imm16 (splt, h->plt.offset + 8,
5172 0xfff4 - h->plt.offset);
5173 got_address = (sgotplt->output_section->vma + sgotplt->output_offset
5176 /* Fill in the entry in the global offset table. There are no
5177 res_n slots for a shared object PLT, instead the .got.plt entries
5178 point to the PLT entries. */
5179 bfd_put_32 (output_bfd,
5180 splt->output_section->vma + splt->output_offset
5181 + h->plt.offset, sgotplt->contents + got_offset);
5185 plt_index = (h->plt.offset - 28 - htab->res_n_size) / 12;
5186 got_offset = (plt_index + 3) * 4;
5188 nios2_elf32_install_data (splt, nios2_plt_entry, h->plt.offset, 3);
5189 got_address = (sgotplt->output_section->vma + sgotplt->output_offset
5191 nios2_elf32_install_imm16 (splt, h->plt.offset, hiadj(got_address));
5192 nios2_elf32_install_imm16 (splt, h->plt.offset + 4,
5193 got_address & 0xffff);
5195 /* Fill in the entry in the global offset table. */
5196 bfd_put_32 (output_bfd,
5197 splt->output_section->vma + splt->output_offset
5198 + plt_index * 4, sgotplt->contents + got_offset);
5201 /* Fill in the entry in the .rela.plt section. */
5202 rela.r_offset = got_address;
5203 rela.r_info = ELF32_R_INFO (h->dynindx, R_NIOS2_JUMP_SLOT);
5205 loc = srela->contents + plt_index * sizeof (Elf32_External_Rela);
5206 bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
5208 if (!h->def_regular)
5210 /* Mark the symbol as undefined, rather than as defined in
5211 the .plt section. Leave the value alone. */
5212 sym->st_shndx = SHN_UNDEF;
5213 /* If the symbol is weak, we do need to clear the value.
5214 Otherwise, the PLT entry would provide a definition for
5215 the symbol even if the symbol wasn't defined anywhere,
5216 and so the symbol would never be NULL. */
5217 if (!h->ref_regular_nonweak)
5222 use_plt = (eh->got_types_used == CALL_USED
5223 && h->plt.offset != (bfd_vma) -1);
5225 if (!use_plt && h->got.offset != (bfd_vma) -1
5226 && (elf32_nios2_hash_entry (h)->tls_type & GOT_TLS_GD) == 0
5227 && (elf32_nios2_hash_entry (h)->tls_type & GOT_TLS_IE) == 0)
5231 Elf_Internal_Rela rela;
5235 /* This symbol has an entry in the global offset table. Set it
5237 sgot = htab->root.sgot;
5238 srela = htab->root.srelgot;
5239 BFD_ASSERT (sgot != NULL && srela != NULL);
5241 offset = (h->got.offset & ~(bfd_vma) 1);
5242 rela.r_offset = (sgot->output_section->vma
5243 + sgot->output_offset + offset);
5245 /* If this is a -Bsymbolic link, and the symbol is defined
5246 locally, we just want to emit a RELATIVE reloc. Likewise if
5247 the symbol was forced to be local because of a version file.
5248 The entry in the global offset table will already have been
5249 initialized in the relocate_section function. */
5251 if (bfd_link_pic (info) && SYMBOL_REFERENCES_LOCAL (info, h))
5253 rela.r_info = ELF32_R_INFO (0, R_NIOS2_RELATIVE);
5254 rela.r_addend = bfd_get_signed_32 (output_bfd,
5255 (sgot->contents + offset));
5256 bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + offset);
5260 bfd_put_32 (output_bfd, (bfd_vma) 0,
5261 sgot->contents + offset);
5262 rela.r_info = ELF32_R_INFO (h->dynindx, R_NIOS2_GLOB_DAT);
5266 loc = srela->contents;
5267 loc += srela->reloc_count++ * sizeof (Elf32_External_Rela);
5268 bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
5271 if (use_plt && h->got.offset != (bfd_vma) -1)
5273 bfd_vma offset = (h->got.offset & ~(bfd_vma) 1);
5274 asection *sgot = htab->root.sgot;
5275 asection *splt = htab->root.splt;
5276 bfd_put_32 (output_bfd, (splt->output_section->vma + splt->output_offset
5278 sgot->contents + offset);
5284 Elf_Internal_Rela rela;
5287 /* This symbol needs a copy reloc. Set it up. */
5288 BFD_ASSERT (h->dynindx != -1
5289 && (h->root.type == bfd_link_hash_defined
5290 || h->root.type == bfd_link_hash_defweak));
5293 BFD_ASSERT (s != NULL);
5295 rela.r_offset = (h->root.u.def.value
5296 + h->root.u.def.section->output_section->vma
5297 + h->root.u.def.section->output_offset);
5298 rela.r_info = ELF32_R_INFO (h->dynindx, R_NIOS2_COPY);
5300 loc = s->contents + s->reloc_count++ * sizeof (Elf32_External_Rela);
5301 bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
5304 /* Mark _DYNAMIC, _GLOBAL_OFFSET_TABLE_, and _gp_got as absolute. */
5305 if (strcmp (h->root.root.string, "_DYNAMIC") == 0
5306 || h == elf_hash_table (info)->hgot
5307 || h == elf32_nios2_hash_table (info)->h_gp_got)
5308 sym->st_shndx = SHN_ABS;
5313 /* Implement elf_backend_finish_dynamic_sections. */
5315 nios2_elf32_finish_dynamic_sections (bfd *output_bfd,
5316 struct bfd_link_info *info)
5321 struct elf32_nios2_link_hash_table *htab;
5323 htab = elf32_nios2_hash_table (info);
5324 dynobj = elf_hash_table (info)->dynobj;
5325 sgotplt = htab->root.sgotplt;
5326 BFD_ASSERT (sgotplt != NULL);
5327 sdyn = bfd_get_linker_section (dynobj, ".dynamic");
5329 if (elf_hash_table (info)->dynamic_sections_created)
5332 Elf32_External_Dyn *dyncon, *dynconend;
5334 splt = htab->root.splt;
5335 BFD_ASSERT (splt != NULL && sdyn != NULL);
5337 dyncon = (Elf32_External_Dyn *) sdyn->contents;
5338 dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
5339 for (; dyncon < dynconend; dyncon++)
5341 Elf_Internal_Dyn dyn;
5344 bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
5352 s = htab->root.sgotplt;
5353 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
5354 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
5358 s = htab->root.srelplt;
5359 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
5360 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
5364 s = htab->root.srelplt;
5365 dyn.d_un.d_val = s->size;
5366 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
5370 s = htab->root.sgotplt;
5372 = s->output_section->vma + s->output_offset + 0x7ff0;
5373 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
5378 /* Fill in the first entry in the procedure linkage table. */
5381 bfd_vma got_address = (sgotplt->output_section->vma
5382 + sgotplt->output_offset);
5383 if (bfd_link_pic (info))
5385 bfd_vma got_pcrel = got_address - (splt->output_section->vma
5386 + splt->output_offset);
5387 /* Both GOT and PLT must be aligned to a 16-byte boundary
5388 for the two loads to share the %hiadj part. The 4-byte
5389 offset for nextpc is accounted for in the %lo offsets
5391 BFD_ASSERT ((got_pcrel & 0xf) == 0);
5392 nios2_elf32_install_data (splt, nios2_so_plt0_entry, 0, 6);
5393 nios2_elf32_install_imm16 (splt, 4, hiadj (got_pcrel));
5394 nios2_elf32_install_imm16 (splt, 12, got_pcrel & 0xffff);
5395 nios2_elf32_install_imm16 (splt, 16, (got_pcrel + 4) & 0xffff);
5399 /* Divide by 4 here, not 3 because we already corrected for the
5401 bfd_vma res_size = (splt->size - 28) / 4;
5402 bfd_vma res_start = (splt->output_section->vma
5403 + splt->output_offset);
5406 for (res_offset = 0; res_offset < res_size; res_offset += 4)
5407 bfd_put_32 (output_bfd,
5408 6 | ((res_size - (res_offset + 4)) << 6),
5409 splt->contents + res_offset);
5411 /* The GOT must be aligned to a 16-byte boundary for the
5412 two loads to share the same %hiadj part. */
5413 BFD_ASSERT ((got_address & 0xf) == 0);
5415 nios2_elf32_install_data (splt, nios2_plt0_entry, res_size, 7);
5416 nios2_elf32_install_imm16 (splt, res_size, hiadj (res_start));
5417 nios2_elf32_install_imm16 (splt, res_size + 4,
5418 res_start & 0xffff);
5419 nios2_elf32_install_imm16 (splt, res_size + 12,
5420 hiadj (got_address));
5421 nios2_elf32_install_imm16 (splt, res_size + 16,
5422 (got_address + 4) & 0xffff);
5423 nios2_elf32_install_imm16 (splt, res_size + 20,
5424 (got_address + 8) & 0xffff);
5428 /* Fill in the first three entries in the global offset table. */
5429 if (sgotplt->size > 0)
5432 bfd_put_32 (output_bfd, (bfd_vma) 0, sgotplt->contents);
5434 bfd_put_32 (output_bfd,
5435 sdyn->output_section->vma + sdyn->output_offset,
5437 bfd_put_32 (output_bfd, (bfd_vma) 0, sgotplt->contents + 4);
5438 bfd_put_32 (output_bfd, (bfd_vma) 0, sgotplt->contents + 8);
5441 elf_section_data (sgotplt->output_section)->this_hdr.sh_entsize = 4;
5446 /* Implement elf_backend_adjust_dynamic_symbol:
5447 Adjust a symbol defined by a dynamic object and referenced by a
5448 regular object. The current definition is in some section of the
5449 dynamic object, but we're not including those sections. We have to
5450 change the definition to something the rest of the link can
5453 nios2_elf32_adjust_dynamic_symbol (struct bfd_link_info *info,
5454 struct elf_link_hash_entry *h)
5456 struct elf32_nios2_link_hash_table *htab;
5461 htab = elf32_nios2_hash_table (info);
5462 dynobj = elf_hash_table (info)->dynobj;
5464 /* Make sure we know what is going on here. */
5465 BFD_ASSERT (dynobj != NULL
5467 || h->u.weakdef != NULL
5470 && !h->def_regular)));
5472 /* If this is a function, put it in the procedure linkage table. We
5473 will fill in the contents of the procedure linkage table later,
5474 when we know the address of the .got section. */
5475 if (h->type == STT_FUNC || h->needs_plt)
5477 if (h->plt.refcount <= 0
5478 || SYMBOL_CALLS_LOCAL (info, h)
5479 || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
5480 && h->root.type == bfd_link_hash_undefweak))
5482 /* This case can occur if we saw a PLT reloc in an input
5483 file, but the symbol was never referred to by a dynamic
5484 object, or if all references were garbage collected. In
5485 such a case, we don't actually need to build a procedure
5486 linkage table, and we can just do a PCREL reloc instead. */
5487 h->plt.offset = (bfd_vma) -1;
5494 /* Reinitialize the plt offset now that it is not used as a reference
5496 h->plt.offset = (bfd_vma) -1;
5498 /* If this is a weak symbol, and there is a real definition, the
5499 processor independent code will have arranged for us to see the
5500 real definition first, and we can just use the same value. */
5501 if (h->u.weakdef != NULL)
5503 BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
5504 || h->u.weakdef->root.type == bfd_link_hash_defweak);
5505 h->root.u.def.section = h->u.weakdef->root.u.def.section;
5506 h->root.u.def.value = h->u.weakdef->root.u.def.value;
5510 /* If there are no non-GOT references, we do not need a copy
5512 if (!h->non_got_ref)
5515 /* This is a reference to a symbol defined by a dynamic object which
5517 If we are creating a shared library, we must presume that the
5518 only references to the symbol are via the global offset table.
5519 For such cases we need not do anything here; the relocations will
5520 be handled correctly by relocate_section. */
5521 if (bfd_link_pic (info))
5526 _bfd_error_handler (_("dynamic variable `%s' is zero size"),
5527 h->root.root.string);
5531 /* We must allocate the symbol in our .dynbss section, which will
5532 become part of the .bss section of the executable. There will be
5533 an entry for this symbol in the .dynsym section. The dynamic
5534 object will contain position independent code, so all references
5535 from the dynamic object to this symbol will go through the global
5536 offset table. The dynamic linker will use the .dynsym entry to
5537 determine the address it must put in the global offset table, so
5538 both the dynamic object and the regular object will refer to the
5539 same memory location for the variable. */
5541 BFD_ASSERT (s != NULL);
5543 /* We must generate a R_NIOS2_COPY reloc to tell the dynamic linker to
5544 copy the initial value out of the dynamic object and into the
5545 runtime process image. We need to remember the offset into the
5546 .rela.bss section we are going to use. */
5547 if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
5551 srel = htab->srelbss;
5552 BFD_ASSERT (srel != NULL);
5553 srel->size += sizeof (Elf32_External_Rela);
5557 align2 = bfd_log2 (h->size);
5558 if (align2 > h->root.u.def.section->alignment_power)
5559 align2 = h->root.u.def.section->alignment_power;
5562 s->size = BFD_ALIGN (s->size, (bfd_size_type)1 << align2);
5563 if (align2 > bfd_get_section_alignment (dynobj, s)
5564 && !bfd_set_section_alignment (dynobj, s, align2))
5567 /* Define the symbol as being at this point in the section. */
5568 h->root.u.def.section = s;
5569 h->root.u.def.value = s->size;
5571 /* Increment the section size to make room for the symbol. */
5577 /* Worker function for nios2_elf32_size_dynamic_sections. */
5579 adjust_dynrelocs (struct elf_link_hash_entry *h, PTR inf)
5581 struct bfd_link_info *info;
5582 struct elf32_nios2_link_hash_table *htab;
5584 if (h->root.type == bfd_link_hash_indirect)
5587 if (h->root.type == bfd_link_hash_warning)
5588 /* When warning symbols are created, they **replace** the "real"
5589 entry in the hash table, thus we never get to see the real
5590 symbol in a hash traversal. So look at it now. */
5591 h = (struct elf_link_hash_entry *) h->root.u.i.link;
5593 info = (struct bfd_link_info *) inf;
5594 htab = elf32_nios2_hash_table (info);
5596 if (h->plt.offset != (bfd_vma)-1)
5597 h->plt.offset += htab->res_n_size;
5598 if (htab->root.splt == h->root.u.def.section)
5599 h->root.u.def.value += htab->res_n_size;
5604 /* Another worker function for nios2_elf32_size_dynamic_sections.
5605 Allocate space in .plt, .got and associated reloc sections for
5608 allocate_dynrelocs (struct elf_link_hash_entry *h, PTR inf)
5610 struct bfd_link_info *info;
5611 struct elf32_nios2_link_hash_table *htab;
5612 struct elf32_nios2_link_hash_entry *eh;
5613 struct elf32_nios2_dyn_relocs *p;
5616 if (h->root.type == bfd_link_hash_indirect)
5619 if (h->root.type == bfd_link_hash_warning)
5620 /* When warning symbols are created, they **replace** the "real"
5621 entry in the hash table, thus we never get to see the real
5622 symbol in a hash traversal. So look at it now. */
5623 h = (struct elf_link_hash_entry *) h->root.u.i.link;
5625 info = (struct bfd_link_info *) inf;
5626 htab = elf32_nios2_hash_table (info);
5628 if (htab->root.dynamic_sections_created
5629 && h->plt.refcount > 0)
5631 /* Make sure this symbol is output as a dynamic symbol.
5632 Undefined weak syms won't yet be marked as dynamic. */
5633 if (h->dynindx == -1
5635 && !bfd_elf_link_record_dynamic_symbol (info, h))
5638 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, bfd_link_pic (info), h))
5640 asection *s = htab->root.splt;
5642 /* Allocate room for the header. */
5645 if (bfd_link_pic (info))
5651 h->plt.offset = s->size;
5653 /* If this symbol is not defined in a regular file, and we are
5654 not generating a shared library, then set the symbol to this
5655 location in the .plt. This is required to make function
5656 pointers compare as equal between the normal executable and
5657 the shared library. */
5658 if (! bfd_link_pic (info)
5661 h->root.u.def.section = s;
5662 h->root.u.def.value = h->plt.offset;
5665 /* Make room for this entry. */
5668 /* We also need to make an entry in the .rela.plt section. */
5669 htab->root.srelplt->size += sizeof (Elf32_External_Rela);
5671 /* And the .got.plt section. */
5672 htab->root.sgotplt->size += 4;
5676 h->plt.offset = (bfd_vma) -1;
5682 h->plt.offset = (bfd_vma) -1;
5686 eh = (struct elf32_nios2_link_hash_entry *) h;
5687 use_plt = (eh->got_types_used == CALL_USED
5688 && h->plt.offset != (bfd_vma) -1);
5690 if (h->got.refcount > 0)
5694 int tls_type = eh->tls_type;
5697 /* Make sure this symbol is output as a dynamic symbol.
5698 Undefined weak syms won't yet be marked as dynamic. */
5699 if (h->dynindx == -1
5701 && !bfd_elf_link_record_dynamic_symbol (info, h))
5704 s = htab->root.sgot;
5705 h->got.offset = s->size;
5707 if (tls_type == GOT_UNKNOWN)
5710 if (tls_type == GOT_NORMAL)
5711 /* Non-TLS symbols need one GOT slot. */
5715 if (tls_type & GOT_TLS_GD)
5716 /* R_NIOS2_TLS_GD16 needs 2 consecutive GOT slots. */
5718 if (tls_type & GOT_TLS_IE)
5719 /* R_NIOS2_TLS_IE16 needs one GOT slot. */
5723 dyn = htab->root.dynamic_sections_created;
5726 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, bfd_link_pic (info), h)
5727 && (!bfd_link_pic (info)
5728 || !SYMBOL_REFERENCES_LOCAL (info, h)))
5731 if (tls_type != GOT_NORMAL
5732 && (bfd_link_pic (info) || indx != 0)
5733 && (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
5734 || h->root.type != bfd_link_hash_undefweak))
5736 if (tls_type & GOT_TLS_IE)
5737 htab->root.srelgot->size += sizeof (Elf32_External_Rela);
5739 if (tls_type & GOT_TLS_GD)
5740 htab->root.srelgot->size += sizeof (Elf32_External_Rela);
5742 if ((tls_type & GOT_TLS_GD) && indx != 0)
5743 htab->root.srelgot->size += sizeof (Elf32_External_Rela);
5745 else if ((ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
5746 || h->root.type != bfd_link_hash_undefweak)
5748 && (bfd_link_pic (info)
5749 || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h)))
5750 htab->root.srelgot->size += sizeof (Elf32_External_Rela);
5753 h->got.offset = (bfd_vma) -1;
5755 if (eh->dyn_relocs == NULL)
5758 /* In the shared -Bsymbolic case, discard space allocated for
5759 dynamic pc-relative relocs against symbols which turn out to be
5760 defined in regular objects. For the normal shared case, discard
5761 space for pc-relative relocs that have become local due to symbol
5762 visibility changes. */
5764 if (bfd_link_pic (info))
5767 && (h->forced_local || SYMBOLIC_BIND (info, h)))
5769 struct elf32_nios2_dyn_relocs **pp;
5771 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
5773 p->count -= p->pc_count;
5782 /* Also discard relocs on undefined weak syms with non-default
5784 if (eh->dyn_relocs != NULL
5785 && h->root.type == bfd_link_hash_undefweak)
5787 if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
5788 eh->dyn_relocs = NULL;
5790 /* Make sure undefined weak symbols are output as a dynamic
5792 else if (h->dynindx == -1
5794 && !bfd_elf_link_record_dynamic_symbol (info, h))
5800 /* For the non-shared case, discard space for relocs against
5801 symbols which turn out to need copy relocs or are not
5805 && ((h->def_dynamic && !h->def_regular)
5806 || (htab->root.dynamic_sections_created
5807 && (h->root.type == bfd_link_hash_undefweak
5808 || h->root.type == bfd_link_hash_undefined))))
5810 /* Make sure this symbol is output as a dynamic symbol.
5811 Undefined weak syms won't yet be marked as dynamic. */
5812 if (h->dynindx == -1
5814 && !bfd_elf_link_record_dynamic_symbol (info, h))
5817 /* If that succeeded, we know we'll be keeping all the
5819 if (h->dynindx != -1)
5823 eh->dyn_relocs = NULL;
5828 /* Finally, allocate space. */
5829 for (p = eh->dyn_relocs; p != NULL; p = p->next)
5831 asection *sreloc = elf_section_data (p->sec)->sreloc;
5832 sreloc->size += p->count * sizeof (Elf32_External_Rela);
5838 /* Implement elf_backend_size_dynamic_sections:
5839 Set the sizes of the dynamic sections. */
5841 nios2_elf32_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
5842 struct bfd_link_info *info)
5850 struct elf32_nios2_link_hash_table *htab;
5852 htab = elf32_nios2_hash_table (info);
5853 dynobj = elf_hash_table (info)->dynobj;
5854 BFD_ASSERT (dynobj != NULL);
5856 htab->res_n_size = 0;
5857 if (elf_hash_table (info)->dynamic_sections_created)
5859 /* Set the contents of the .interp section to the interpreter. */
5860 if (bfd_link_executable (info) && !info->nointerp)
5862 s = bfd_get_linker_section (dynobj, ".interp");
5863 BFD_ASSERT (s != NULL);
5864 s->size = sizeof ELF_DYNAMIC_INTERPRETER;
5865 s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
5870 /* We may have created entries in the .rela.got section.
5871 However, if we are not creating the dynamic sections, we will
5872 not actually use these entries. Reset the size of .rela.got,
5873 which will cause it to get stripped from the output file
5875 s = htab->root.srelgot;
5880 /* Set up .got offsets for local syms, and space for local dynamic
5882 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
5884 bfd_signed_vma *local_got;
5885 bfd_signed_vma *end_local_got;
5886 char *local_tls_type;
5887 bfd_size_type locsymcount;
5888 Elf_Internal_Shdr *symtab_hdr;
5891 if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour)
5894 for (s = ibfd->sections; s != NULL; s = s->next)
5896 struct elf32_nios2_dyn_relocs *p;
5898 for (p = elf_section_data (s)->local_dynrel; p != NULL; p = p->next)
5900 if (!bfd_is_abs_section (p->sec)
5901 && bfd_is_abs_section (p->sec->output_section))
5903 /* Input section has been discarded, either because
5904 it is a copy of a linkonce section or due to
5905 linker script /DISCARD/, so we'll be discarding
5908 else if (p->count != 0)
5910 srel = elf_section_data (p->sec)->sreloc;
5911 srel->size += p->count * sizeof (Elf32_External_Rela);
5912 if ((p->sec->output_section->flags & SEC_READONLY) != 0)
5913 info->flags |= DF_TEXTREL;
5918 local_got = elf_local_got_refcounts (ibfd);
5922 symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
5923 locsymcount = symtab_hdr->sh_info;
5924 end_local_got = local_got + locsymcount;
5925 local_tls_type = elf32_nios2_local_got_tls_type (ibfd);
5926 s = htab->root.sgot;
5927 srel = htab->root.srelgot;
5928 for (; local_got < end_local_got; ++local_got, ++local_tls_type)
5932 *local_got = s->size;
5933 if (*local_tls_type & GOT_TLS_GD)
5934 /* TLS_GD relocs need an 8-byte structure in the GOT. */
5936 if (*local_tls_type & GOT_TLS_IE)
5938 if (*local_tls_type == GOT_NORMAL)
5941 if (bfd_link_pic (info) || *local_tls_type == GOT_TLS_GD)
5942 srel->size += sizeof (Elf32_External_Rela);
5945 *local_got = (bfd_vma) -1;
5949 if (htab->tls_ldm_got.refcount > 0)
5951 /* Allocate two GOT entries and one dynamic relocation (if necessary)
5952 for R_NIOS2_TLS_LDM16 relocations. */
5953 htab->tls_ldm_got.offset = htab->root.sgot->size;
5954 htab->root.sgot->size += 8;
5955 if (bfd_link_pic (info))
5956 htab->root.srelgot->size += sizeof (Elf32_External_Rela);
5959 htab->tls_ldm_got.offset = -1;
5961 /* Allocate global sym .plt and .got entries, and space for global
5962 sym dynamic relocs. */
5963 elf_link_hash_traverse (& htab->root, allocate_dynrelocs, info);
5965 if (elf_hash_table (info)->dynamic_sections_created)
5967 /* If the .got section is more than 0x8000 bytes, we add
5968 0x8000 to the value of _gp_got, so that 16-bit relocations
5969 have a greater chance of working. */
5970 if (htab->root.sgot->size >= 0x8000
5971 && elf32_nios2_hash_table (info)->h_gp_got->root.u.def.value == 0)
5972 elf32_nios2_hash_table (info)->h_gp_got->root.u.def.value = 0x8000;
5975 /* The check_relocs and adjust_dynamic_symbol entry points have
5976 determined the sizes of the various dynamic sections. Allocate
5981 for (s = dynobj->sections; s != NULL; s = s->next)
5985 if ((s->flags & SEC_LINKER_CREATED) == 0)
5988 /* It's OK to base decisions on the section name, because none
5989 of the dynobj section names depend upon the input files. */
5990 name = bfd_get_section_name (dynobj, s);
5992 if (strcmp (name, ".plt") == 0)
5994 /* Remember whether there is a PLT. */
5997 /* Correct for the number of res_N branches. */
5998 if (plt && !bfd_link_pic (info))
6000 htab->res_n_size = (s->size-28) / 3;
6001 s->size += htab->res_n_size;
6004 else if (CONST_STRNEQ (name, ".rela"))
6010 /* We use the reloc_count field as a counter if we need
6011 to copy relocs into the output file. */
6015 else if (CONST_STRNEQ (name, ".got"))
6017 else if (strcmp (name, ".dynbss") != 0)
6018 /* It's not one of our sections, so don't allocate space. */
6023 /* If we don't need this section, strip it from the
6024 output file. This is mostly to handle .rela.bss and
6025 .rela.plt. We must create both sections in
6026 create_dynamic_sections, because they must be created
6027 before the linker maps input sections to output
6028 sections. The linker does that before
6029 adjust_dynamic_symbol is called, and it is that
6030 function which decides whether anything needs to go
6031 into these sections. */
6032 s->flags |= SEC_EXCLUDE;
6036 if ((s->flags & SEC_HAS_CONTENTS) == 0)
6039 /* Allocate memory for the section contents. */
6040 /* FIXME: This should be a call to bfd_alloc not bfd_zalloc.
6041 Unused entries should be reclaimed before the section's contents
6042 are written out, but at the moment this does not happen. Thus in
6043 order to prevent writing out garbage, we initialize the section's
6044 contents to zero. */
6045 s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->size);
6046 if (s->contents == NULL)
6050 /* Adjust dynamic symbols that point to the plt to account for the
6051 now-known number of resN slots. */
6052 if (htab->res_n_size)
6053 elf_link_hash_traverse (& htab->root, adjust_dynrelocs, info);
6055 if (elf_hash_table (info)->dynamic_sections_created)
6057 /* Add some entries to the .dynamic section. We fill in the
6058 values later, in elf_nios2_finish_dynamic_sections, but we
6059 must add the entries now so that we get the correct size for
6060 the .dynamic section. The DT_DEBUG entry is filled in by the
6061 dynamic linker and used by the debugger. */
6062 #define add_dynamic_entry(TAG, VAL) \
6063 _bfd_elf_add_dynamic_entry (info, TAG, VAL)
6065 if (!bfd_link_pic (info) && !add_dynamic_entry (DT_DEBUG, 0))
6068 if (got && !add_dynamic_entry (DT_PLTGOT, 0))
6072 && (!add_dynamic_entry (DT_PLTRELSZ, 0)
6073 || !add_dynamic_entry (DT_PLTREL, DT_RELA)
6074 || !add_dynamic_entry (DT_JMPREL, 0)))
6078 && (!add_dynamic_entry (DT_RELA, 0)
6079 || !add_dynamic_entry (DT_RELASZ, 0)
6080 || !add_dynamic_entry (DT_RELAENT, sizeof (Elf32_External_Rela))))
6083 if (!bfd_link_pic (info) && !add_dynamic_entry (DT_NIOS2_GP, 0))
6086 if ((info->flags & DF_TEXTREL) != 0
6087 && !add_dynamic_entry (DT_TEXTREL, 0))
6090 #undef add_dynamic_entry
6095 /* Free the derived linker hash table. */
6097 nios2_elf32_link_hash_table_free (bfd *obfd)
6099 struct elf32_nios2_link_hash_table *htab
6100 = (struct elf32_nios2_link_hash_table *) obfd->link.hash;
6102 bfd_hash_table_free (&htab->bstab);
6103 _bfd_elf_link_hash_table_free (obfd);
6106 /* Implement bfd_elf32_bfd_link_hash_table_create. */
6107 static struct bfd_link_hash_table *
6108 nios2_elf32_link_hash_table_create (bfd *abfd)
6110 struct elf32_nios2_link_hash_table *ret;
6111 bfd_size_type amt = sizeof (struct elf32_nios2_link_hash_table);
6113 ret = bfd_zmalloc (amt);
6117 if (!_bfd_elf_link_hash_table_init (&ret->root, abfd,
6120 elf32_nios2_link_hash_entry),
6127 /* Init the stub hash table too. */
6128 if (!bfd_hash_table_init (&ret->bstab, stub_hash_newfunc,
6129 sizeof (struct elf32_nios2_stub_hash_entry)))
6131 _bfd_elf_link_hash_table_free (abfd);
6134 ret->root.root.hash_table_free = nios2_elf32_link_hash_table_free;
6136 return &ret->root.root;
6139 /* Implement elf_backend_reloc_type_class. */
6140 static enum elf_reloc_type_class
6141 nios2_elf32_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED,
6142 const asection *rel_sec ATTRIBUTE_UNUSED,
6143 const Elf_Internal_Rela *rela)
6145 switch ((int) ELF32_R_TYPE (rela->r_info))
6147 case R_NIOS2_RELATIVE:
6148 return reloc_class_relative;
6149 case R_NIOS2_JUMP_SLOT:
6150 return reloc_class_plt;
6152 return reloc_class_copy;
6154 return reloc_class_normal;
6158 /* Return 1 if target is one of ours. */
6160 is_nios2_elf_target (const struct bfd_target *targ)
6162 return (targ == &nios2_elf32_le_vec
6163 || targ == &nios2_elf32_be_vec);
6166 /* Implement elf_backend_add_symbol_hook.
6167 This hook is called by the linker when adding symbols from an object
6168 file. We use it to put .comm items in .sbss, and not .bss. */
6170 nios2_elf_add_symbol_hook (bfd *abfd,
6171 struct bfd_link_info *info,
6172 Elf_Internal_Sym *sym,
6173 const char **namep ATTRIBUTE_UNUSED,
6174 flagword *flagsp ATTRIBUTE_UNUSED,
6180 if (sym->st_shndx == SHN_COMMON
6181 && !bfd_link_relocatable (info)
6182 && sym->st_size <= elf_gp_size (abfd)
6183 && is_nios2_elf_target (info->output_bfd->xvec))
6185 /* Common symbols less than or equal to -G nn bytes are automatically
6187 struct elf32_nios2_link_hash_table *htab;
6189 htab = elf32_nios2_hash_table (info);
6190 if (htab->sbss == NULL)
6192 flagword flags = SEC_IS_COMMON | SEC_LINKER_CREATED;
6194 dynobj = elf_hash_table (info)->dynobj;
6198 htab->sbss = bfd_make_section_anyway_with_flags (dynobj, ".sbss",
6200 if (htab->sbss == NULL)
6205 *valp = sym->st_size;
6211 /* Implement elf_backend_can_make_relative_eh_frame:
6212 Decide whether to attempt to turn absptr or lsda encodings in
6213 shared libraries into pcrel within the given input section. */
6215 nios2_elf32_can_make_relative_eh_frame (bfd *input_bfd ATTRIBUTE_UNUSED,
6216 struct bfd_link_info *info
6218 asection *eh_frame_section
6221 /* We can't use PC-relative encodings in the .eh_frame section. */
6225 /* Implement elf_backend_special_sections. */
6226 const struct bfd_elf_special_section elf32_nios2_special_sections[] =
6228 { STRING_COMMA_LEN (".sbss"), -2, SHT_NOBITS,
6229 SHF_ALLOC + SHF_WRITE + SHF_NIOS2_GPREL },
6230 { STRING_COMMA_LEN (".sdata"), -2, SHT_PROGBITS,
6231 SHF_ALLOC + SHF_WRITE + SHF_NIOS2_GPREL },
6232 { NULL, 0, 0, 0, 0 }
6235 #define ELF_ARCH bfd_arch_nios2
6236 #define ELF_TARGET_ID NIOS2_ELF_DATA
6237 #define ELF_MACHINE_CODE EM_ALTERA_NIOS2
6239 /* The Nios II MMU uses a 4K page size. */
6241 #define ELF_MAXPAGESIZE 0x1000
6243 #define bfd_elf32_bfd_link_hash_table_create \
6244 nios2_elf32_link_hash_table_create
6246 #define bfd_elf32_bfd_merge_private_bfd_data \
6247 nios2_elf32_merge_private_bfd_data
6249 /* Relocation table lookup macros. */
6251 #define bfd_elf32_bfd_reloc_type_lookup nios2_elf32_bfd_reloc_type_lookup
6252 #define bfd_elf32_bfd_reloc_name_lookup nios2_elf32_bfd_reloc_name_lookup
6254 /* JUMP_TABLE_LINK macros. */
6256 /* elf_info_to_howto (using RELA relocations). */
6258 #define elf_info_to_howto nios2_elf32_info_to_howto
6260 /* elf backend functions. */
6262 #define elf_backend_can_gc_sections 1
6263 #define elf_backend_can_refcount 1
6264 #define elf_backend_plt_readonly 1
6265 #define elf_backend_want_got_plt 1
6266 #define elf_backend_rela_normal 1
6267 #define elf_backend_dtrel_excludes_plt 1
6269 #define elf_backend_relocate_section nios2_elf32_relocate_section
6270 #define elf_backend_section_flags nios2_elf32_section_flags
6271 #define elf_backend_fake_sections nios2_elf32_fake_sections
6272 #define elf_backend_check_relocs nios2_elf32_check_relocs
6274 #define elf_backend_gc_mark_hook nios2_elf32_gc_mark_hook
6275 #define elf_backend_gc_sweep_hook nios2_elf32_gc_sweep_hook
6276 #define elf_backend_create_dynamic_sections \
6277 nios2_elf32_create_dynamic_sections
6278 #define elf_backend_finish_dynamic_symbol nios2_elf32_finish_dynamic_symbol
6279 #define elf_backend_finish_dynamic_sections \
6280 nios2_elf32_finish_dynamic_sections
6281 #define elf_backend_adjust_dynamic_symbol nios2_elf32_adjust_dynamic_symbol
6282 #define elf_backend_reloc_type_class nios2_elf32_reloc_type_class
6283 #define elf_backend_size_dynamic_sections nios2_elf32_size_dynamic_sections
6284 #define elf_backend_add_symbol_hook nios2_elf_add_symbol_hook
6285 #define elf_backend_copy_indirect_symbol nios2_elf32_copy_indirect_symbol
6286 #define elf_backend_object_p nios2_elf32_object_p
6288 #define elf_backend_grok_prstatus nios2_grok_prstatus
6289 #define elf_backend_grok_psinfo nios2_grok_psinfo
6291 #undef elf_backend_can_make_relative_eh_frame
6292 #define elf_backend_can_make_relative_eh_frame \
6293 nios2_elf32_can_make_relative_eh_frame
6295 #define elf_backend_special_sections elf32_nios2_special_sections
6297 #define TARGET_LITTLE_SYM nios2_elf32_le_vec
6298 #define TARGET_LITTLE_NAME "elf32-littlenios2"
6299 #define TARGET_BIG_SYM nios2_elf32_be_vec
6300 #define TARGET_BIG_NAME "elf32-bignios2"
6302 #define elf_backend_got_header_size 12
6303 #define elf_backend_default_execstack 0
6305 #include "elf32-target.h"