1 /* 32-bit ELF support for Nios II.
2 Copyright (C) 2012-2015 Free Software Foundation, Inc.
3 Contributed by Nigel Gray (ngray@altera.com).
4 Contributed by Mentor Graphics, Inc.
6 This file is part of BFD, the Binary File Descriptor library.
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
21 MA 02110-1301, USA. */
23 /* This file handles Altera Nios II ELF targets. */
31 #include "elf/nios2.h"
32 #include "opcode/nios2.h"
33 #include "elf32-nios2.h"
35 /* Use RELA relocations. */
44 /* Forward declarations. */
45 static bfd_reloc_status_type nios2_elf32_ignore_reloc
46 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
47 static bfd_reloc_status_type nios2_elf32_hi16_relocate
48 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
49 static bfd_reloc_status_type nios2_elf32_lo16_relocate
50 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
51 static bfd_reloc_status_type nios2_elf32_hiadj16_relocate
52 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
53 static bfd_reloc_status_type nios2_elf32_pcrel_lo16_relocate
54 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
55 static bfd_reloc_status_type nios2_elf32_pcrel_hiadj16_relocate
56 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
57 static bfd_reloc_status_type nios2_elf32_pcrel16_relocate
58 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
59 static bfd_reloc_status_type nios2_elf32_call26_relocate
60 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
61 static bfd_reloc_status_type nios2_elf32_gprel_relocate
62 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
63 static bfd_reloc_status_type nios2_elf32_ujmp_relocate
64 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
65 static bfd_reloc_status_type nios2_elf32_cjmp_relocate
66 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
67 static bfd_reloc_status_type nios2_elf32_callr_relocate
68 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
71 extern const bfd_target nios2_elf32_le_vec;
72 extern const bfd_target nios2_elf32_be_vec;
74 /* Offset of tp and dtp pointers from start of TLS block. */
75 #define TP_OFFSET 0x7000
76 #define DTP_OFFSET 0x8000
78 /* The relocation tables used for SHT_REL sections. There are separate
79 tables for R1 and R2 encodings. */
80 static reloc_howto_type elf_nios2_r1_howto_table_rel[] = {
82 HOWTO (R_NIOS2_NONE, /* type */
84 3, /* size (0 = byte, 1 = short, 2 = long) */
86 FALSE, /* pc_relative */
88 complain_overflow_dont, /* complain_on_overflow */
89 bfd_elf_generic_reloc, /* special_function */
90 "R_NIOS2_NONE", /* name */
91 FALSE, /* partial_inplace */
94 FALSE), /* pcrel_offset */
96 /* 16-bit signed immediate relocation. */
97 HOWTO (R_NIOS2_S16, /* type */
99 2, /* size (0 = byte, 1 = short, 2 = long) */
101 FALSE, /* pc_relative */
103 complain_overflow_signed, /* complain on overflow */
104 bfd_elf_generic_reloc, /* special function */
105 "R_NIOS2_S16", /* name */
106 FALSE, /* partial_inplace */
107 0x003fffc0, /* src_mask */
108 0x003fffc0, /* dest_mask */
109 FALSE), /* pcrel_offset */
111 /* 16-bit unsigned immediate relocation. */
112 HOWTO (R_NIOS2_U16, /* type */
114 2, /* size (0 = byte, 1 = short, 2 = long) */
116 FALSE, /* pc_relative */
118 complain_overflow_unsigned, /* complain on overflow */
119 bfd_elf_generic_reloc, /* special function */
120 "R_NIOS2_U16", /* name */
121 FALSE, /* partial_inplace */
122 0x003fffc0, /* src_mask */
123 0x003fffc0, /* dest_mask */
124 FALSE), /* pcrel_offset */
126 HOWTO (R_NIOS2_PCREL16, /* type */
128 2, /* size (0 = byte, 1 = short, 2 = long) */
130 TRUE, /* pc_relative */
132 complain_overflow_signed, /* complain on overflow */
133 nios2_elf32_pcrel16_relocate, /* special function */
134 "R_NIOS2_PCREL16", /* name */
135 FALSE, /* partial_inplace */
136 0x003fffc0, /* src_mask */
137 0x003fffc0, /* dest_mask */
138 TRUE), /* pcrel_offset */
140 HOWTO (R_NIOS2_CALL26, /* type */
142 2, /* size (0 = byte, 1 = short, 2 = long) */
144 FALSE, /* pc_relative */
146 complain_overflow_dont, /* complain on overflow */
147 nios2_elf32_call26_relocate, /* special function */
148 "R_NIOS2_CALL26", /* name */
149 FALSE, /* partial_inplace */
150 0xffffffc0, /* src_mask */
151 0xffffffc0, /* dst_mask */
152 FALSE), /* pcrel_offset */
160 complain_overflow_bitfield,
161 bfd_elf_generic_reloc,
168 HOWTO (R_NIOS2_CACHE_OPX,
174 complain_overflow_bitfield,
175 bfd_elf_generic_reloc,
188 complain_overflow_bitfield,
189 bfd_elf_generic_reloc,
202 complain_overflow_bitfield,
203 bfd_elf_generic_reloc,
216 complain_overflow_dont,
217 nios2_elf32_hi16_relocate,
230 complain_overflow_dont,
231 nios2_elf32_lo16_relocate,
238 HOWTO (R_NIOS2_HIADJ16,
244 complain_overflow_dont,
245 nios2_elf32_hiadj16_relocate,
252 HOWTO (R_NIOS2_BFD_RELOC_32,
258 complain_overflow_dont,
259 bfd_elf_generic_reloc,
260 "R_NIOS2_BFD_RELOC32",
266 HOWTO (R_NIOS2_BFD_RELOC_16,
272 complain_overflow_bitfield,
273 bfd_elf_generic_reloc,
274 "R_NIOS2_BFD_RELOC16",
280 HOWTO (R_NIOS2_BFD_RELOC_8,
286 complain_overflow_bitfield,
287 bfd_elf_generic_reloc,
288 "R_NIOS2_BFD_RELOC8",
294 HOWTO (R_NIOS2_GPREL,
300 complain_overflow_dont,
301 nios2_elf32_gprel_relocate,
308 HOWTO (R_NIOS2_GNU_VTINHERIT,
314 complain_overflow_dont,
316 "R_NIOS2_GNU_VTINHERIT",
322 HOWTO (R_NIOS2_GNU_VTENTRY,
328 complain_overflow_dont,
329 _bfd_elf_rel_vtable_reloc_fn,
330 "R_NIOS2_GNU_VTENTRY",
342 complain_overflow_dont,
343 nios2_elf32_ujmp_relocate,
356 complain_overflow_dont,
357 nios2_elf32_cjmp_relocate,
364 HOWTO (R_NIOS2_CALLR,
370 complain_overflow_dont,
371 nios2_elf32_callr_relocate,
378 HOWTO (R_NIOS2_ALIGN,
384 complain_overflow_dont,
385 nios2_elf32_ignore_reloc,
393 HOWTO (R_NIOS2_GOT16,
399 complain_overflow_bitfield,
400 bfd_elf_generic_reloc,
407 HOWTO (R_NIOS2_CALL16,
413 complain_overflow_bitfield,
414 bfd_elf_generic_reloc,
421 HOWTO (R_NIOS2_GOTOFF_LO,
427 complain_overflow_dont,
428 bfd_elf_generic_reloc,
435 HOWTO (R_NIOS2_GOTOFF_HA,
441 complain_overflow_dont,
442 bfd_elf_generic_reloc,
449 HOWTO (R_NIOS2_PCREL_LO,
455 complain_overflow_dont,
456 nios2_elf32_pcrel_lo16_relocate,
463 HOWTO (R_NIOS2_PCREL_HA,
467 FALSE, /* This is a PC-relative relocation, but we need to subtract
468 PC ourselves before the HIADJ. */
470 complain_overflow_dont,
471 nios2_elf32_pcrel_hiadj16_relocate,
478 HOWTO (R_NIOS2_TLS_GD16,
484 complain_overflow_bitfield,
485 bfd_elf_generic_reloc,
492 HOWTO (R_NIOS2_TLS_LDM16,
498 complain_overflow_bitfield,
499 bfd_elf_generic_reloc,
506 HOWTO (R_NIOS2_TLS_LDO16,
512 complain_overflow_bitfield,
513 bfd_elf_generic_reloc,
520 HOWTO (R_NIOS2_TLS_IE16,
526 complain_overflow_bitfield,
527 bfd_elf_generic_reloc,
534 HOWTO (R_NIOS2_TLS_LE16,
540 complain_overflow_bitfield,
541 bfd_elf_generic_reloc,
548 HOWTO (R_NIOS2_TLS_DTPMOD,
554 complain_overflow_dont,
555 bfd_elf_generic_reloc,
556 "R_NIOS2_TLS_DTPMOD",
562 HOWTO (R_NIOS2_TLS_DTPREL,
568 complain_overflow_dont,
569 bfd_elf_generic_reloc,
570 "R_NIOS2_TLS_DTPREL",
576 HOWTO (R_NIOS2_TLS_TPREL,
582 complain_overflow_dont,
583 bfd_elf_generic_reloc,
596 complain_overflow_dont,
597 bfd_elf_generic_reloc,
604 HOWTO (R_NIOS2_GLOB_DAT,
610 complain_overflow_dont,
611 bfd_elf_generic_reloc,
618 HOWTO (R_NIOS2_JUMP_SLOT,
624 complain_overflow_dont,
625 bfd_elf_generic_reloc,
632 HOWTO (R_NIOS2_RELATIVE,
638 complain_overflow_dont,
639 bfd_elf_generic_reloc,
646 HOWTO (R_NIOS2_GOTOFF,
652 complain_overflow_dont,
653 bfd_elf_generic_reloc,
660 HOWTO (R_NIOS2_CALL26_NOAT, /* type */
662 2, /* size (0 = byte, 1 = short, 2 = long) */
664 FALSE, /* pc_relative */
666 complain_overflow_dont, /* complain on overflow */
667 nios2_elf32_call26_relocate, /* special function */
668 "R_NIOS2_CALL26_NOAT", /* name */
669 FALSE, /* partial_inplace */
670 0xffffffc0, /* src_mask */
671 0xffffffc0, /* dst_mask */
672 FALSE), /* pcrel_offset */
674 HOWTO (R_NIOS2_GOT_LO,
680 complain_overflow_dont,
681 bfd_elf_generic_reloc,
688 HOWTO (R_NIOS2_GOT_HA,
694 complain_overflow_dont,
695 bfd_elf_generic_reloc,
702 HOWTO (R_NIOS2_CALL_LO,
708 complain_overflow_dont,
709 bfd_elf_generic_reloc,
716 HOWTO (R_NIOS2_CALL_HA,
722 complain_overflow_dont,
723 bfd_elf_generic_reloc,
730 /* Add other relocations here. */
733 static reloc_howto_type elf_nios2_r2_howto_table_rel[] = {
735 HOWTO (R_NIOS2_NONE, /* type */
737 0, /* size (0 = byte, 1 = short, 2 = long) */
739 FALSE, /* pc_relative */
741 complain_overflow_dont, /* complain_on_overflow */
742 bfd_elf_generic_reloc, /* special_function */
743 "R_NIOS2_NONE", /* name */
744 FALSE, /* partial_inplace */
747 FALSE), /* pcrel_offset */
749 /* 16-bit signed immediate relocation. */
750 HOWTO (R_NIOS2_S16, /* type */
752 2, /* size (0 = byte, 1 = short, 2 = long) */
754 FALSE, /* pc_relative */
756 complain_overflow_signed, /* complain on overflow */
757 bfd_elf_generic_reloc, /* special function */
758 "R_NIOS2_S16", /* name */
759 FALSE, /* partial_inplace */
760 0xffff0000, /* src_mask */
761 0xffff0000, /* dest_mask */
762 FALSE), /* pcrel_offset */
764 /* 16-bit unsigned immediate relocation. */
765 HOWTO (R_NIOS2_U16, /* type */
767 2, /* size (0 = byte, 1 = short, 2 = long) */
769 FALSE, /* pc_relative */
771 complain_overflow_unsigned, /* complain on overflow */
772 bfd_elf_generic_reloc, /* special function */
773 "R_NIOS2_U16", /* name */
774 FALSE, /* partial_inplace */
775 0xffff0000, /* src_mask */
776 0xffff0000, /* dest_mask */
777 FALSE), /* pcrel_offset */
779 HOWTO (R_NIOS2_PCREL16, /* type */
781 2, /* size (0 = byte, 1 = short, 2 = long) */
783 TRUE, /* pc_relative */
785 complain_overflow_signed, /* complain on overflow */
786 nios2_elf32_pcrel16_relocate, /* special function */
787 "R_NIOS2_PCREL16", /* name */
788 FALSE, /* partial_inplace */
789 0xffff0000, /* src_mask */
790 0xffff0000, /* dest_mask */
791 TRUE), /* pcrel_offset */
793 HOWTO (R_NIOS2_CALL26, /* type */
795 2, /* size (0 = byte, 1 = short, 2 = long) */
797 FALSE, /* pc_relative */
799 complain_overflow_dont, /* complain on overflow */
800 nios2_elf32_call26_relocate, /* special function */
801 "R_NIOS2_CALL26", /* name */
802 FALSE, /* partial_inplace */
803 0xffffffc0, /* src_mask */
804 0xffffffc0, /* dst_mask */
805 FALSE), /* pcrel_offset */
813 complain_overflow_bitfield,
814 bfd_elf_generic_reloc,
821 HOWTO (R_NIOS2_CACHE_OPX,
827 complain_overflow_bitfield,
828 bfd_elf_generic_reloc,
841 complain_overflow_bitfield,
842 bfd_elf_generic_reloc,
855 complain_overflow_bitfield,
856 bfd_elf_generic_reloc,
869 complain_overflow_dont,
870 nios2_elf32_hi16_relocate,
883 complain_overflow_dont,
884 nios2_elf32_lo16_relocate,
891 HOWTO (R_NIOS2_HIADJ16,
897 complain_overflow_dont,
898 nios2_elf32_hiadj16_relocate,
905 HOWTO (R_NIOS2_BFD_RELOC_32,
911 complain_overflow_dont,
912 bfd_elf_generic_reloc,
913 "R_NIOS2_BFD_RELOC32",
919 HOWTO (R_NIOS2_BFD_RELOC_16,
925 complain_overflow_bitfield,
926 bfd_elf_generic_reloc,
927 "R_NIOS2_BFD_RELOC16",
933 HOWTO (R_NIOS2_BFD_RELOC_8,
939 complain_overflow_bitfield,
940 bfd_elf_generic_reloc,
941 "R_NIOS2_BFD_RELOC8",
947 HOWTO (R_NIOS2_GPREL,
953 complain_overflow_dont,
954 nios2_elf32_gprel_relocate,
961 HOWTO (R_NIOS2_GNU_VTINHERIT,
967 complain_overflow_dont,
969 "R_NIOS2_GNU_VTINHERIT",
975 HOWTO (R_NIOS2_GNU_VTENTRY,
981 complain_overflow_dont,
982 _bfd_elf_rel_vtable_reloc_fn,
983 "R_NIOS2_GNU_VTENTRY",
995 complain_overflow_dont,
996 nios2_elf32_ujmp_relocate,
1003 HOWTO (R_NIOS2_CJMP,
1009 complain_overflow_dont,
1010 nios2_elf32_cjmp_relocate,
1017 HOWTO (R_NIOS2_CALLR,
1023 complain_overflow_dont,
1024 nios2_elf32_callr_relocate,
1031 HOWTO (R_NIOS2_ALIGN,
1037 complain_overflow_dont,
1038 nios2_elf32_ignore_reloc,
1045 HOWTO (R_NIOS2_GOT16,
1051 complain_overflow_bitfield,
1052 bfd_elf_generic_reloc,
1059 HOWTO (R_NIOS2_CALL16,
1065 complain_overflow_bitfield,
1066 bfd_elf_generic_reloc,
1073 HOWTO (R_NIOS2_GOTOFF_LO,
1079 complain_overflow_dont,
1080 bfd_elf_generic_reloc,
1081 "R_NIOS2_GOTOFF_LO",
1087 HOWTO (R_NIOS2_GOTOFF_HA,
1093 complain_overflow_dont,
1094 bfd_elf_generic_reloc,
1095 "R_NIOS2_GOTOFF_HA",
1101 HOWTO (R_NIOS2_PCREL_LO,
1107 complain_overflow_dont,
1108 nios2_elf32_pcrel_lo16_relocate,
1115 HOWTO (R_NIOS2_PCREL_HA,
1119 FALSE, /* This is a PC-relative relocation, but we need to subtract
1120 PC ourselves before the HIADJ. */
1122 complain_overflow_dont,
1123 nios2_elf32_pcrel_hiadj16_relocate,
1130 HOWTO (R_NIOS2_TLS_GD16,
1136 complain_overflow_bitfield,
1137 bfd_elf_generic_reloc,
1144 HOWTO (R_NIOS2_TLS_LDM16,
1150 complain_overflow_bitfield,
1151 bfd_elf_generic_reloc,
1152 "R_NIOS2_TLS_LDM16",
1158 HOWTO (R_NIOS2_TLS_LDO16,
1164 complain_overflow_bitfield,
1165 bfd_elf_generic_reloc,
1166 "R_NIOS2_TLS_LDO16",
1172 HOWTO (R_NIOS2_TLS_IE16,
1178 complain_overflow_bitfield,
1179 bfd_elf_generic_reloc,
1186 HOWTO (R_NIOS2_TLS_LE16,
1192 complain_overflow_bitfield,
1193 bfd_elf_generic_reloc,
1200 HOWTO (R_NIOS2_TLS_DTPMOD,
1206 complain_overflow_dont,
1207 bfd_elf_generic_reloc,
1208 "R_NIOS2_TLS_DTPMOD",
1214 HOWTO (R_NIOS2_TLS_DTPREL,
1220 complain_overflow_dont,
1221 bfd_elf_generic_reloc,
1222 "R_NIOS2_TLS_DTPREL",
1228 HOWTO (R_NIOS2_TLS_TPREL,
1234 complain_overflow_dont,
1235 bfd_elf_generic_reloc,
1236 "R_NIOS2_TLS_TPREL",
1242 HOWTO (R_NIOS2_COPY,
1248 complain_overflow_dont,
1249 bfd_elf_generic_reloc,
1256 HOWTO (R_NIOS2_GLOB_DAT,
1262 complain_overflow_dont,
1263 bfd_elf_generic_reloc,
1270 HOWTO (R_NIOS2_JUMP_SLOT,
1276 complain_overflow_dont,
1277 bfd_elf_generic_reloc,
1278 "R_NIOS2_JUMP_SLOT",
1284 HOWTO (R_NIOS2_RELATIVE,
1290 complain_overflow_dont,
1291 bfd_elf_generic_reloc,
1298 HOWTO (R_NIOS2_GOTOFF,
1304 complain_overflow_dont,
1305 bfd_elf_generic_reloc,
1312 HOWTO (R_NIOS2_CALL26_NOAT, /* type */
1314 2, /* size (0 = byte, 1 = short, 2 = long) */
1316 FALSE, /* pc_relative */
1318 complain_overflow_dont, /* complain on overflow */
1319 nios2_elf32_call26_relocate, /* special function */
1320 "R_NIOS2_CALL26_NOAT", /* name */
1321 FALSE, /* partial_inplace */
1322 0xffffffc0, /* src_mask */
1323 0xffffffc0, /* dst_mask */
1324 FALSE), /* pcrel_offset */
1326 HOWTO (R_NIOS2_GOT_LO,
1332 complain_overflow_dont,
1333 bfd_elf_generic_reloc,
1340 HOWTO (R_NIOS2_GOT_HA,
1346 complain_overflow_dont,
1347 bfd_elf_generic_reloc,
1354 HOWTO (R_NIOS2_CALL_LO,
1360 complain_overflow_dont,
1361 bfd_elf_generic_reloc,
1368 HOWTO (R_NIOS2_CALL_HA,
1374 complain_overflow_dont,
1375 bfd_elf_generic_reloc,
1382 HOWTO (R_NIOS2_R2_S12,
1388 complain_overflow_signed,
1389 bfd_elf_generic_reloc,
1396 HOWTO (R_NIOS2_R2_I10_1_PCREL,
1402 complain_overflow_signed,
1403 bfd_elf_generic_reloc, /* FIXME? */
1404 "R_NIOS2_R2_I10_1_PCREL",
1410 HOWTO (R_NIOS2_R2_T1I7_1_PCREL,
1416 complain_overflow_signed,
1417 bfd_elf_generic_reloc, /* FIXME? */
1418 "R_NIOS2_R2_T1I7_1_PCREL",
1424 HOWTO (R_NIOS2_R2_T1I7_2,
1430 complain_overflow_unsigned,
1431 bfd_elf_generic_reloc,
1432 "R_NIOS2_R2_T1I7_2",
1438 HOWTO (R_NIOS2_R2_T2I4,
1444 complain_overflow_unsigned,
1445 bfd_elf_generic_reloc,
1452 HOWTO (R_NIOS2_R2_T2I4_1,
1458 complain_overflow_unsigned,
1459 bfd_elf_generic_reloc,
1460 "R_NIOS2_R2_T2I4_1",
1466 HOWTO (R_NIOS2_R2_T2I4_2,
1472 complain_overflow_unsigned,
1473 bfd_elf_generic_reloc,
1474 "R_NIOS2_R2_T2I4_2",
1480 HOWTO (R_NIOS2_R2_X1I7_2,
1486 complain_overflow_unsigned,
1487 bfd_elf_generic_reloc,
1488 "R_NIOS2_R2_X1I7_2",
1494 HOWTO (R_NIOS2_R2_X2L5,
1500 complain_overflow_unsigned,
1501 bfd_elf_generic_reloc,
1508 HOWTO (R_NIOS2_R2_F1I5_2,
1514 complain_overflow_unsigned,
1515 bfd_elf_generic_reloc,
1516 "R_NIOS2_R2_F1L5_2",
1522 HOWTO (R_NIOS2_R2_L5I4X1,
1528 complain_overflow_unsigned,
1529 bfd_elf_generic_reloc,
1530 "R_NIOS2_R2_L5I4X1",
1536 HOWTO (R_NIOS2_R2_T1X1I6,
1542 complain_overflow_unsigned,
1543 bfd_elf_generic_reloc,
1544 "R_NIOS2_R2_T1X1I6",
1550 HOWTO (R_NIOS2_R2_T1X1I6_2,
1556 complain_overflow_unsigned,
1557 bfd_elf_generic_reloc,
1558 "R_NIOS2_R2_T1I1X6_2",
1564 /* Add other relocations here. */
1567 static unsigned char elf_code_to_howto_index[R_NIOS2_ILLEGAL + 1];
1570 /* Return true if producing output for a R2 BFD. */
1571 #define BFD_IS_R2(abfd) (bfd_get_mach (abfd) == bfd_mach_nios2r2)
1573 /* Return the howto for relocation RTYPE. */
1574 static reloc_howto_type *
1575 lookup_howto (unsigned int rtype, bfd *abfd)
1577 static int initialized = 0;
1579 /* R2 relocations are a superset of R1, so use that for the lookup
1581 int r1_howto_tbl_size = (int) (sizeof (elf_nios2_r1_howto_table_rel)
1582 / sizeof (elf_nios2_r1_howto_table_rel[0]));
1583 int r2_howto_tbl_size = (int) (sizeof (elf_nios2_r2_howto_table_rel)
1584 / sizeof (elf_nios2_r2_howto_table_rel[0]));
1589 memset (elf_code_to_howto_index, 0xff,
1590 sizeof (elf_code_to_howto_index));
1591 for (i = 0; i < r2_howto_tbl_size; i++)
1593 elf_code_to_howto_index[elf_nios2_r2_howto_table_rel[i].type] = i;
1594 if (i < r1_howto_tbl_size)
1595 BFD_ASSERT (elf_nios2_r2_howto_table_rel[i].type
1596 == elf_nios2_r1_howto_table_rel[i].type);
1600 BFD_ASSERT (rtype <= R_NIOS2_ILLEGAL);
1601 i = elf_code_to_howto_index[rtype];
1602 if (BFD_IS_R2 (abfd))
1604 if (i >= r2_howto_tbl_size)
1606 return elf_nios2_r2_howto_table_rel + i;
1610 if (i >= r1_howto_tbl_size)
1612 return elf_nios2_r1_howto_table_rel + i;
1616 /* Map for converting BFD reloc types to Nios II reloc types. */
1617 struct elf_reloc_map
1619 bfd_reloc_code_real_type bfd_val;
1620 enum elf_nios2_reloc_type elf_val;
1623 static const struct elf_reloc_map nios2_reloc_map[] = {
1624 {BFD_RELOC_NONE, R_NIOS2_NONE},
1625 {BFD_RELOC_NIOS2_S16, R_NIOS2_S16},
1626 {BFD_RELOC_NIOS2_U16, R_NIOS2_U16},
1627 {BFD_RELOC_16_PCREL, R_NIOS2_PCREL16},
1628 {BFD_RELOC_NIOS2_CALL26, R_NIOS2_CALL26},
1629 {BFD_RELOC_NIOS2_IMM5, R_NIOS2_IMM5},
1630 {BFD_RELOC_NIOS2_CACHE_OPX, R_NIOS2_CACHE_OPX},
1631 {BFD_RELOC_NIOS2_IMM6, R_NIOS2_IMM6},
1632 {BFD_RELOC_NIOS2_IMM8, R_NIOS2_IMM8},
1633 {BFD_RELOC_NIOS2_HI16, R_NIOS2_HI16},
1634 {BFD_RELOC_NIOS2_LO16, R_NIOS2_LO16},
1635 {BFD_RELOC_NIOS2_HIADJ16, R_NIOS2_HIADJ16},
1636 {BFD_RELOC_32, R_NIOS2_BFD_RELOC_32},
1637 {BFD_RELOC_16, R_NIOS2_BFD_RELOC_16},
1638 {BFD_RELOC_8, R_NIOS2_BFD_RELOC_8},
1639 {BFD_RELOC_NIOS2_GPREL, R_NIOS2_GPREL},
1640 {BFD_RELOC_VTABLE_INHERIT, R_NIOS2_GNU_VTINHERIT},
1641 {BFD_RELOC_VTABLE_ENTRY, R_NIOS2_GNU_VTENTRY},
1642 {BFD_RELOC_NIOS2_UJMP, R_NIOS2_UJMP},
1643 {BFD_RELOC_NIOS2_CJMP, R_NIOS2_CJMP},
1644 {BFD_RELOC_NIOS2_CALLR, R_NIOS2_CALLR},
1645 {BFD_RELOC_NIOS2_ALIGN, R_NIOS2_ALIGN},
1646 {BFD_RELOC_NIOS2_GOT16, R_NIOS2_GOT16},
1647 {BFD_RELOC_NIOS2_CALL16, R_NIOS2_CALL16},
1648 {BFD_RELOC_NIOS2_GOTOFF_LO, R_NIOS2_GOTOFF_LO},
1649 {BFD_RELOC_NIOS2_GOTOFF_HA, R_NIOS2_GOTOFF_HA},
1650 {BFD_RELOC_NIOS2_PCREL_LO, R_NIOS2_PCREL_LO},
1651 {BFD_RELOC_NIOS2_PCREL_HA, R_NIOS2_PCREL_HA},
1652 {BFD_RELOC_NIOS2_TLS_GD16, R_NIOS2_TLS_GD16},
1653 {BFD_RELOC_NIOS2_TLS_LDM16, R_NIOS2_TLS_LDM16},
1654 {BFD_RELOC_NIOS2_TLS_LDO16, R_NIOS2_TLS_LDO16},
1655 {BFD_RELOC_NIOS2_TLS_IE16, R_NIOS2_TLS_IE16},
1656 {BFD_RELOC_NIOS2_TLS_LE16, R_NIOS2_TLS_LE16},
1657 {BFD_RELOC_NIOS2_TLS_DTPMOD, R_NIOS2_TLS_DTPMOD},
1658 {BFD_RELOC_NIOS2_TLS_DTPREL, R_NIOS2_TLS_DTPREL},
1659 {BFD_RELOC_NIOS2_TLS_TPREL, R_NIOS2_TLS_TPREL},
1660 {BFD_RELOC_NIOS2_COPY, R_NIOS2_COPY},
1661 {BFD_RELOC_NIOS2_GLOB_DAT, R_NIOS2_GLOB_DAT},
1662 {BFD_RELOC_NIOS2_JUMP_SLOT, R_NIOS2_JUMP_SLOT},
1663 {BFD_RELOC_NIOS2_RELATIVE, R_NIOS2_RELATIVE},
1664 {BFD_RELOC_NIOS2_GOTOFF, R_NIOS2_GOTOFF},
1665 {BFD_RELOC_NIOS2_CALL26_NOAT, R_NIOS2_CALL26_NOAT},
1666 {BFD_RELOC_NIOS2_GOT_LO, R_NIOS2_GOT_LO},
1667 {BFD_RELOC_NIOS2_GOT_HA, R_NIOS2_GOT_HA},
1668 {BFD_RELOC_NIOS2_CALL_LO, R_NIOS2_CALL_LO},
1669 {BFD_RELOC_NIOS2_CALL_HA, R_NIOS2_CALL_HA},
1670 {BFD_RELOC_NIOS2_R2_S12, R_NIOS2_R2_S12},
1671 {BFD_RELOC_NIOS2_R2_I10_1_PCREL, R_NIOS2_R2_I10_1_PCREL},
1672 {BFD_RELOC_NIOS2_R2_T1I7_1_PCREL, R_NIOS2_R2_T1I7_1_PCREL},
1673 {BFD_RELOC_NIOS2_R2_T1I7_2, R_NIOS2_R2_T1I7_2},
1674 {BFD_RELOC_NIOS2_R2_T2I4, R_NIOS2_R2_T2I4},
1675 {BFD_RELOC_NIOS2_R2_T2I4_1, R_NIOS2_R2_T2I4_1},
1676 {BFD_RELOC_NIOS2_R2_T2I4_2, R_NIOS2_R2_T2I4_2},
1677 {BFD_RELOC_NIOS2_R2_X1I7_2, R_NIOS2_R2_X1I7_2},
1678 {BFD_RELOC_NIOS2_R2_X2L5, R_NIOS2_R2_X2L5},
1679 {BFD_RELOC_NIOS2_R2_F1I5_2, R_NIOS2_R2_F1I5_2},
1680 {BFD_RELOC_NIOS2_R2_L5I4X1, R_NIOS2_R2_L5I4X1},
1681 {BFD_RELOC_NIOS2_R2_T1X1I6, R_NIOS2_R2_T1X1I6},
1682 {BFD_RELOC_NIOS2_R2_T1X1I6_2, R_NIOS2_R2_T1X1I6_2},
1685 enum elf32_nios2_stub_type
1687 nios2_stub_call26_before,
1688 nios2_stub_call26_after,
1692 struct elf32_nios2_stub_hash_entry
1694 /* Base hash table entry structure. */
1695 struct bfd_hash_entry bh_root;
1697 /* The stub section. */
1700 /* Offset within stub_sec of the beginning of this stub. */
1701 bfd_vma stub_offset;
1703 /* Given the symbol's value and its section we can determine its final
1704 value when building the stubs (so the stub knows where to jump. */
1705 bfd_vma target_value;
1706 asection *target_section;
1708 enum elf32_nios2_stub_type stub_type;
1710 /* The symbol table entry, if any, that this was derived from. */
1711 struct elf32_nios2_link_hash_entry *hh;
1713 /* And the reloc addend that this was derived from. */
1716 /* Where this stub is being called from, or, in the case of combined
1717 stub sections, the first input section in the group. */
1721 #define nios2_stub_hash_entry(ent) \
1722 ((struct elf32_nios2_stub_hash_entry *)(ent))
1724 #define nios2_stub_hash_lookup(table, string, create, copy) \
1725 ((struct elf32_nios2_stub_hash_entry *) \
1726 bfd_hash_lookup ((table), (string), (create), (copy)))
1729 /* The Nios II linker needs to keep track of the number of relocs that it
1730 decides to copy as dynamic relocs in check_relocs for each symbol.
1731 This is so that it can later discard them if they are found to be
1732 unnecessary. We store the information in a field extending the
1733 regular ELF linker hash table. */
1735 struct elf32_nios2_dyn_relocs
1737 struct elf32_nios2_dyn_relocs *next;
1739 /* The input section of the reloc. */
1742 /* Total number of relocs copied for the input section. */
1743 bfd_size_type count;
1745 /* Number of pc-relative relocs copied for the input section. */
1746 bfd_size_type pc_count;
1749 /* Nios II ELF linker hash entry. */
1751 struct elf32_nios2_link_hash_entry
1753 struct elf_link_hash_entry root;
1755 /* A pointer to the most recently used stub hash entry against this
1757 struct elf32_nios2_stub_hash_entry *hsh_cache;
1759 /* Track dynamic relocs copied for this symbol. */
1760 struct elf32_nios2_dyn_relocs *dyn_relocs;
1762 #define GOT_UNKNOWN 0
1763 #define GOT_NORMAL 1
1764 #define GOT_TLS_GD 2
1765 #define GOT_TLS_IE 4
1766 unsigned char tls_type;
1768 /* We need to detect and take special action for symbols which are only
1769 referenced with %call() and not with %got(). Such symbols do not need
1770 a dynamic GOT reloc in shared objects, only a dynamic PLT reloc. Lazy
1771 linking will not work if the dynamic GOT reloc exists.
1772 To check for this condition efficiently, we compare got_types_used against
1774 (got_types_used & (GOT_USED | CALL_USED)) == CALL_USED.
1778 unsigned char got_types_used;
1781 #define elf32_nios2_hash_entry(ent) \
1782 ((struct elf32_nios2_link_hash_entry *) (ent))
1784 /* Get the Nios II elf linker hash table from a link_info structure. */
1785 #define elf32_nios2_hash_table(info) \
1786 ((struct elf32_nios2_link_hash_table *) ((info)->hash))
1788 /* Nios II ELF linker hash table. */
1789 struct elf32_nios2_link_hash_table
1791 /* The main hash table. */
1792 struct elf_link_hash_table root;
1794 /* The stub hash table. */
1795 struct bfd_hash_table bstab;
1797 /* Linker stub bfd. */
1800 /* Linker call-backs. */
1801 asection * (*add_stub_section) (const char *, asection *, bfd_boolean);
1802 void (*layout_sections_again) (void);
1804 /* Array to keep track of which stub sections have been created, and
1805 information on stub grouping. */
1808 /* These are the section to which stubs in the group will be
1810 asection *first_sec, *last_sec;
1811 /* The stub sections. There might be stubs inserted either before
1812 or after the real section.*/
1813 asection *first_stub_sec, *last_stub_sec;
1816 /* Assorted information used by nios2_elf32_size_stubs. */
1817 unsigned int bfd_count;
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);
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 (*_bfd_error_handler) (_("%B: cannot create stub entry %s"),
2234 hsh->stub_sec = stub_sec;
2235 hsh->stub_offset = 0;
2236 hsh->id_sec = link_sec;
2240 /* Set up various things so that we can make a list of input sections
2241 for each output section included in the link. Returns -1 on error,
2242 0 when no stubs will be needed, and 1 on success. */
2244 nios2_elf32_setup_section_lists (bfd *output_bfd, struct bfd_link_info *info)
2247 unsigned int bfd_count;
2248 int top_id, top_index;
2250 asection **input_list, **list;
2252 struct elf32_nios2_link_hash_table *htab = elf32_nios2_hash_table (info);
2254 /* Count the number of input BFDs and find the top input section id. */
2255 for (input_bfd = info->input_bfds, bfd_count = 0, top_id = 0;
2257 input_bfd = input_bfd->link.next)
2260 for (section = input_bfd->sections;
2262 section = section->next)
2264 if (top_id < section->id)
2265 top_id = section->id;
2269 htab->bfd_count = bfd_count;
2271 amt = sizeof (struct map_stub) * (top_id + 1);
2272 htab->stub_group = bfd_zmalloc (amt);
2273 if (htab->stub_group == NULL)
2276 /* We can't use output_bfd->section_count here to find the top output
2277 section index as some sections may have been removed, and
2278 strip_excluded_output_sections doesn't renumber the indices. */
2279 for (section = output_bfd->sections, top_index = 0;
2281 section = section->next)
2283 if (top_index < section->index)
2284 top_index = section->index;
2287 htab->top_index = top_index;
2288 amt = sizeof (asection *) * (top_index + 1);
2289 input_list = bfd_malloc (amt);
2290 htab->input_list = input_list;
2291 if (input_list == NULL)
2294 /* For sections we aren't interested in, mark their entries with a
2295 value we can check later. */
2296 list = input_list + top_index;
2298 *list = bfd_abs_section_ptr;
2299 while (list-- != input_list);
2301 for (section = output_bfd->sections;
2303 section = section->next)
2305 /* FIXME: This is a bit of hack. Currently our .ctors and .dtors
2306 * have PC relative relocs in them but no code flag set. */
2307 if (((section->flags & SEC_CODE) != 0) ||
2308 strcmp(".ctors", section->name) ||
2309 strcmp(".dtors", section->name))
2310 input_list[section->index] = NULL;
2316 /* The linker repeatedly calls this function for each input section,
2317 in the order that input sections are linked into output sections.
2318 Build lists of input sections to determine groupings between which
2319 we may insert linker stubs. */
2321 nios2_elf32_next_input_section (struct bfd_link_info *info, asection *isec)
2323 struct elf32_nios2_link_hash_table *htab = elf32_nios2_hash_table (info);
2325 if (isec->output_section->index <= htab->top_index)
2327 asection **list = htab->input_list + isec->output_section->index;
2328 if (*list != bfd_abs_section_ptr)
2330 /* Steal the last_sec pointer for our list.
2331 This happens to make the list in reverse order,
2332 which is what we want. */
2333 htab->stub_group[isec->id].last_sec = *list;
2339 /* Segment mask for CALL26 relocation relaxation. */
2340 #define CALL26_SEGMENT(x) ((x) & 0xf0000000)
2342 /* Fudge factor for approximate maximum size of all stubs that might
2343 be inserted by the linker. This does not actually limit the number
2344 of stubs that might be inserted, and only affects strategy for grouping
2345 and placement of stubs. Perhaps this should be computed based on number
2346 of relocations seen, or be specifiable on the command line. */
2347 #define MAX_STUB_SECTION_SIZE 0xffff
2349 /* See whether we can group stub sections together. Grouping stub
2350 sections may result in fewer stubs. More importantly, we need to
2351 put all .init* and .fini* stubs at the end of the .init or
2352 .fini output sections respectively, because glibc splits the
2353 _init and _fini functions into multiple parts. Putting a stub in
2354 the middle of a function is not a good idea.
2355 Rather than computing groups of a maximum fixed size, for Nios II
2356 CALL26 relaxation it makes more sense to compute the groups based on
2357 sections that fit within a 256MB address segment. Also do not allow
2358 a group to span more than one output section, since different output
2359 sections might correspond to different memory banks on a bare-metal
2362 group_sections (struct elf32_nios2_link_hash_table *htab)
2364 asection **list = htab->input_list + htab->top_index;
2367 /* The list is in reverse order so we'll search backwards looking
2368 for the first section that begins in the same memory segment,
2369 marking sections along the way to point at the tail for this
2371 asection *tail = *list;
2372 if (tail == bfd_abs_section_ptr)
2374 while (tail != NULL)
2376 bfd_vma start = tail->output_section->vma + tail->output_offset;
2377 bfd_vma end = start + tail->size;
2378 bfd_vma segment = CALL26_SEGMENT (end);
2381 if (segment != CALL26_SEGMENT (start)
2382 || segment != CALL26_SEGMENT (end + MAX_STUB_SECTION_SIZE))
2383 /* This section spans more than one memory segment, or is
2384 close enough to the end of the segment that adding stub
2385 sections before it might cause it to move so that it
2386 spans memory segments, or that stubs added at the end of
2387 this group might overflow into the next memory segment.
2388 Put it in a group by itself to localize the effects. */
2390 prev = htab->stub_group[tail->id].last_sec;
2391 htab->stub_group[tail->id].last_sec = tail;
2392 htab->stub_group[tail->id].first_sec = tail;
2395 /* Collect more sections for this group. */
2397 asection *curr, *first;
2398 for (curr = tail; ; curr = prev)
2400 prev = htab->stub_group[curr->id].last_sec;
2402 || tail->output_section != prev->output_section
2403 || (CALL26_SEGMENT (prev->output_section->vma
2404 + prev->output_offset)
2409 for (curr = tail; ; curr = prev)
2411 prev = htab->stub_group[curr->id].last_sec;
2412 htab->stub_group[curr->id].last_sec = tail;
2413 htab->stub_group[curr->id].first_sec = first;
2419 /* Reset tail for the next group. */
2423 while (list-- != htab->input_list);
2424 free (htab->input_list);
2427 /* Determine the type of stub needed, if any, for a call. */
2428 static enum elf32_nios2_stub_type
2429 nios2_type_of_stub (asection *input_sec,
2430 const Elf_Internal_Rela *rel,
2431 struct elf32_nios2_link_hash_entry *hh,
2432 struct elf32_nios2_link_hash_table *htab,
2433 bfd_vma destination,
2434 struct bfd_link_info *info ATTRIBUTE_UNUSED)
2436 bfd_vma location, segment, start, end;
2437 asection *s0, *s1, *s;
2440 !(hh->root.root.type == bfd_link_hash_defined
2441 || hh->root.root.type == bfd_link_hash_defweak))
2442 return nios2_stub_none;
2444 /* Determine where the call point is. */
2445 location = (input_sec->output_section->vma
2446 + input_sec->output_offset + rel->r_offset);
2447 segment = CALL26_SEGMENT (location);
2449 /* Nios II CALL and JMPI instructions can transfer control to addresses
2450 within the same 256MB segment as the PC. */
2451 if (segment == CALL26_SEGMENT (destination))
2452 return nios2_stub_none;
2454 /* Find the start and end addresses of the stub group. Also account for
2455 any already-created stub sections for this group. Note that for stubs
2456 in the end section, only the first instruction of the last stub
2457 (12 bytes long) needs to be within range. */
2458 s0 = htab->stub_group[input_sec->id].first_sec;
2459 s = htab->stub_group[s0->id].first_stub_sec;
2460 if (s != NULL && s->size > 0)
2461 start = s->output_section->vma + s->output_offset;
2463 start = s0->output_section->vma + s0->output_offset;
2465 s1 = htab->stub_group[input_sec->id].last_sec;
2466 s = htab->stub_group[s1->id].last_stub_sec;
2467 if (s != NULL && s->size > 0)
2468 end = s->output_section->vma + s->output_offset + s->size - 8;
2470 end = s1->output_section->vma + s1->output_offset + s1->size;
2472 BFD_ASSERT (start < end);
2473 BFD_ASSERT (start <= location);
2474 BFD_ASSERT (location < end);
2476 /* Put stubs at the end of the group unless that is not a valid
2477 location and the beginning of the group is. It might be that
2478 neither the beginning nor end works if we have an input section
2479 so large that it spans multiple segment boundaries. In that
2480 case, punt; the end result will be a relocation overflow error no
2481 matter what we do here.
2483 Note that adding stubs pushes up the addresses of all subsequent
2484 sections, so that stubs allocated on one pass through the
2485 relaxation loop may not be valid on the next pass. (E.g., we may
2486 allocate a stub at the beginning of the section on one pass and
2487 find that the call site has been bumped into the next memory
2488 segment on the next pass.) The important thing to note is that
2489 we never try to reclaim the space allocated to such unused stubs,
2490 so code size and section addresses can only increase with each
2491 iteration. Accounting for the start and end addresses of the
2492 already-created stub sections ensures that when the algorithm
2493 converges, it converges accurately, with the entire appropriate
2494 stub section accessible from the call site and not just the
2495 address at the start or end of the stub group proper. */
2497 if (segment == CALL26_SEGMENT (end))
2498 return nios2_stub_call26_after;
2499 else if (segment == CALL26_SEGMENT (start))
2500 return nios2_stub_call26_before;
2502 /* Perhaps this should be a dedicated error code. */
2503 return nios2_stub_none;
2507 nios2_build_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg ATTRIBUTE_UNUSED)
2509 struct elf32_nios2_stub_hash_entry *hsh
2510 = (struct elf32_nios2_stub_hash_entry *) gen_entry;
2511 asection *stub_sec = hsh->stub_sec;
2514 /* Make a note of the offset within the stubs for this entry. */
2515 hsh->stub_offset = stub_sec->size;
2517 switch (hsh->stub_type)
2519 case nios2_stub_call26_before:
2520 case nios2_stub_call26_after:
2521 /* A call26 stub looks like:
2522 orhi at, %hiadj(dest)
2523 addi at, at, %lo(dest)
2525 Note that call/jmpi instructions can't be used in PIC code
2526 so there is no reason for the stub to be PIC, either. */
2527 sym_value = (hsh->target_value
2528 + hsh->target_section->output_offset
2529 + hsh->target_section->output_section->vma
2532 nios2_elf32_install_data (stub_sec, nios2_call26_stub_entry,
2533 hsh->stub_offset, 3);
2534 nios2_elf32_install_imm16 (stub_sec, hsh->stub_offset,
2536 nios2_elf32_install_imm16 (stub_sec, hsh->stub_offset + 4,
2537 (sym_value & 0xffff));
2538 stub_sec->size += 12;
2548 /* As above, but don't actually build the stub. Just bump offset so
2549 we know stub section sizes. */
2551 nios2_size_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg ATTRIBUTE_UNUSED)
2553 struct elf32_nios2_stub_hash_entry *hsh
2554 = (struct elf32_nios2_stub_hash_entry *) gen_entry;
2556 switch (hsh->stub_type)
2558 case nios2_stub_call26_before:
2559 case nios2_stub_call26_after:
2560 hsh->stub_sec->size += 12;
2569 /* Read in all local syms for all input bfds.
2570 Returns -1 on error, 0 otherwise. */
2573 get_local_syms (bfd *output_bfd ATTRIBUTE_UNUSED, bfd *input_bfd,
2574 struct bfd_link_info *info)
2576 unsigned int bfd_indx;
2577 Elf_Internal_Sym *local_syms, **all_local_syms;
2578 struct elf32_nios2_link_hash_table *htab = elf32_nios2_hash_table (info);
2580 /* We want to read in symbol extension records only once. To do this
2581 we need to read in the local symbols in parallel and save them for
2582 later use; so hold pointers to the local symbols in an array. */
2583 bfd_size_type amt = sizeof (Elf_Internal_Sym *) * htab->bfd_count;
2584 all_local_syms = bfd_zmalloc (amt);
2585 htab->all_local_syms = all_local_syms;
2586 if (all_local_syms == NULL)
2589 /* Walk over all the input BFDs, swapping in local symbols. */
2592 input_bfd = input_bfd->link.next, bfd_indx++)
2594 Elf_Internal_Shdr *symtab_hdr;
2596 /* We'll need the symbol table in a second. */
2597 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
2598 if (symtab_hdr->sh_info == 0)
2601 /* We need an array of the local symbols attached to the input bfd. */
2602 local_syms = (Elf_Internal_Sym *) symtab_hdr->contents;
2603 if (local_syms == NULL)
2605 local_syms = bfd_elf_get_elf_syms (input_bfd, symtab_hdr,
2606 symtab_hdr->sh_info, 0,
2608 /* Cache them for elf_link_input_bfd. */
2609 symtab_hdr->contents = (unsigned char *) local_syms;
2611 if (local_syms == NULL)
2614 all_local_syms[bfd_indx] = local_syms;
2620 /* Determine and set the size of the stub section for a final link. */
2622 nios2_elf32_size_stubs (bfd *output_bfd, bfd *stub_bfd,
2623 struct bfd_link_info *info,
2624 asection *(*add_stub_section) (const char *,
2625 asection *, bfd_boolean),
2626 void (*layout_sections_again) (void))
2628 bfd_boolean stub_changed = FALSE;
2629 struct elf32_nios2_link_hash_table *htab = elf32_nios2_hash_table (info);
2631 /* Stash our params away. */
2632 htab->stub_bfd = stub_bfd;
2633 htab->add_stub_section = add_stub_section;
2634 htab->layout_sections_again = layout_sections_again;
2636 /* FIXME: We only compute the section groups once. This could cause
2637 problems if adding a large stub section causes following sections,
2638 or parts of them, to move into another segment. However, this seems
2639 to be consistent with the way other back ends handle this.... */
2640 group_sections (htab);
2642 if (get_local_syms (output_bfd, info->input_bfds, info))
2644 if (htab->all_local_syms)
2645 goto error_ret_free_local;
2652 unsigned int bfd_indx;
2655 for (input_bfd = info->input_bfds, bfd_indx = 0;
2657 input_bfd = input_bfd->link.next, bfd_indx++)
2659 Elf_Internal_Shdr *symtab_hdr;
2661 Elf_Internal_Sym *local_syms;
2663 /* We'll need the symbol table in a second. */
2664 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
2665 if (symtab_hdr->sh_info == 0)
2668 local_syms = htab->all_local_syms[bfd_indx];
2670 /* Walk over each section attached to the input bfd. */
2671 for (section = input_bfd->sections;
2673 section = section->next)
2675 Elf_Internal_Rela *internal_relocs, *irelaend, *irela;
2677 /* If there aren't any relocs, then there's nothing more
2679 if ((section->flags & SEC_RELOC) == 0
2680 || section->reloc_count == 0)
2683 /* If this section is a link-once section that will be
2684 discarded, then don't create any stubs. */
2685 if (section->output_section == NULL
2686 || section->output_section->owner != output_bfd)
2689 /* Get the relocs. */
2691 = _bfd_elf_link_read_relocs (input_bfd, section, NULL, NULL,
2693 if (internal_relocs == NULL)
2694 goto error_ret_free_local;
2696 /* Now examine each relocation. */
2697 irela = internal_relocs;
2698 irelaend = irela + section->reloc_count;
2699 for (; irela < irelaend; irela++)
2701 unsigned int r_type, r_indx;
2702 enum elf32_nios2_stub_type stub_type;
2703 struct elf32_nios2_stub_hash_entry *hsh;
2706 bfd_vma destination;
2707 struct elf32_nios2_link_hash_entry *hh;
2709 const asection *id_sec;
2711 r_type = ELF32_R_TYPE (irela->r_info);
2712 r_indx = ELF32_R_SYM (irela->r_info);
2714 if (r_type >= (unsigned int) R_NIOS2_ILLEGAL)
2716 bfd_set_error (bfd_error_bad_value);
2717 error_ret_free_internal:
2718 if (elf_section_data (section)->relocs == NULL)
2719 free (internal_relocs);
2720 goto error_ret_free_local;
2723 /* Only look for stubs on CALL and JMPI instructions. */
2724 if (r_type != (unsigned int) R_NIOS2_CALL26)
2727 /* Now determine the call target, its name, value,
2733 if (r_indx < symtab_hdr->sh_info)
2735 /* It's a local symbol. */
2736 Elf_Internal_Sym *sym;
2737 Elf_Internal_Shdr *hdr;
2740 sym = local_syms + r_indx;
2741 if (ELF_ST_TYPE (sym->st_info) != STT_SECTION)
2742 sym_value = sym->st_value;
2743 shndx = sym->st_shndx;
2744 if (shndx < elf_numsections (input_bfd))
2746 hdr = elf_elfsections (input_bfd)[shndx];
2747 sym_sec = hdr->bfd_section;
2748 destination = (sym_value + irela->r_addend
2749 + sym_sec->output_offset
2750 + sym_sec->output_section->vma);
2755 /* It's an external symbol. */
2758 e_indx = r_indx - symtab_hdr->sh_info;
2759 hh = ((struct elf32_nios2_link_hash_entry *)
2760 elf_sym_hashes (input_bfd)[e_indx]);
2762 while (hh->root.root.type == bfd_link_hash_indirect
2763 || hh->root.root.type == bfd_link_hash_warning)
2764 hh = ((struct elf32_nios2_link_hash_entry *)
2765 hh->root.root.u.i.link);
2767 if (hh->root.root.type == bfd_link_hash_defined
2768 || hh->root.root.type == bfd_link_hash_defweak)
2770 sym_sec = hh->root.root.u.def.section;
2771 sym_value = hh->root.root.u.def.value;
2773 if (sym_sec->output_section != NULL)
2774 destination = (sym_value + irela->r_addend
2775 + sym_sec->output_offset
2776 + sym_sec->output_section->vma);
2780 else if (hh->root.root.type == bfd_link_hash_undefweak)
2785 else if (hh->root.root.type == bfd_link_hash_undefined)
2787 if (! (info->unresolved_syms_in_objects == RM_IGNORE
2788 && (ELF_ST_VISIBILITY (hh->root.other)
2794 bfd_set_error (bfd_error_bad_value);
2795 goto error_ret_free_internal;
2799 /* Determine what (if any) linker stub is needed. */
2800 stub_type = nios2_type_of_stub (section, irela, hh, htab,
2802 if (stub_type == nios2_stub_none)
2805 /* Support for grouping stub sections. */
2806 if (stub_type == nios2_stub_call26_before)
2807 id_sec = htab->stub_group[section->id].first_sec;
2809 id_sec = htab->stub_group[section->id].last_sec;
2811 /* Get the name of this stub. */
2812 stub_name = nios2_stub_name (id_sec, sym_sec, hh, irela,
2815 goto error_ret_free_internal;
2817 hsh = nios2_stub_hash_lookup (&htab->bstab,
2822 /* The proper stub has already been created. */
2827 hsh = nios2_add_stub (stub_name, section, htab, stub_type);
2831 goto error_ret_free_internal;
2833 hsh->target_value = sym_value;
2834 hsh->target_section = sym_sec;
2835 hsh->stub_type = stub_type;
2837 hsh->addend = irela->r_addend;
2838 stub_changed = TRUE;
2841 /* We're done with the internal relocs, free them. */
2842 if (elf_section_data (section)->relocs == NULL)
2843 free (internal_relocs);
2850 /* OK, we've added some stubs. Find out the new size of the
2852 for (stub_sec = htab->stub_bfd->sections;
2854 stub_sec = stub_sec->next)
2857 bfd_hash_traverse (&htab->bstab, nios2_size_one_stub, htab);
2859 /* Ask the linker to do its stuff. */
2860 (*htab->layout_sections_again) ();
2861 stub_changed = FALSE;
2864 free (htab->all_local_syms);
2867 error_ret_free_local:
2868 free (htab->all_local_syms);
2872 /* Build all the stubs associated with the current output file. The
2873 stubs are kept in a hash table attached to the main linker hash
2874 table. This function is called via nios2elf_finish in the linker. */
2876 nios2_elf32_build_stubs (struct bfd_link_info *info)
2879 struct bfd_hash_table *table;
2880 struct elf32_nios2_link_hash_table *htab;
2882 htab = elf32_nios2_hash_table (info);
2884 for (stub_sec = htab->stub_bfd->sections;
2886 stub_sec = stub_sec->next)
2887 /* The stub_bfd may contain non-stub sections if it is also the
2888 dynobj. Any such non-stub sections are created with the
2889 SEC_LINKER_CREATED flag set, while stub sections do not
2890 have that flag. Ignore any non-stub sections here. */
2891 if ((stub_sec->flags & SEC_LINKER_CREATED) == 0)
2895 /* Allocate memory to hold the linker stubs. */
2896 size = stub_sec->size;
2897 stub_sec->contents = bfd_zalloc (htab->stub_bfd, size);
2898 if (stub_sec->contents == NULL && size != 0)
2903 /* Build the stubs as directed by the stub hash table. */
2904 table = &htab->bstab;
2905 bfd_hash_traverse (table, nios2_build_one_stub, info);
2911 #define is_nios2_elf(bfd) \
2912 (bfd_get_flavour (bfd) == bfd_target_elf_flavour \
2913 && elf_object_id (bfd) == NIOS2_ELF_DATA)
2915 /* Merge backend specific data from an object file to the output
2916 object file when linking. */
2919 nios2_elf32_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
2924 if (!is_nios2_elf (ibfd) || !is_nios2_elf (obfd))
2927 /* Check if we have the same endianness. */
2928 if (! _bfd_generic_verify_endian_match (ibfd, obfd))
2931 new_flags = elf_elfheader (ibfd)->e_flags;
2932 old_flags = elf_elfheader (obfd)->e_flags;
2933 if (!elf_flags_init (obfd))
2935 /* First call, no flags set. */
2936 elf_flags_init (obfd) = TRUE;
2937 elf_elfheader (obfd)->e_flags = new_flags;
2942 case EF_NIOS2_ARCH_R1:
2943 bfd_default_set_arch_mach (obfd, bfd_arch_nios2, bfd_mach_nios2r1);
2945 case EF_NIOS2_ARCH_R2:
2946 if (bfd_big_endian (ibfd))
2948 (*_bfd_error_handler)
2949 (_("error: %B: Big-endian R2 is not supported."), ibfd);
2950 bfd_set_error (bfd_error_bad_value);
2953 bfd_default_set_arch_mach (obfd, bfd_arch_nios2, bfd_mach_nios2r2);
2958 /* Incompatible flags. */
2959 else if (new_flags != old_flags)
2961 /* So far, the only incompatible flags denote incompatible
2963 (*_bfd_error_handler)
2964 (_("error: %B: Conflicting CPU architectures %d/%d"),
2965 ibfd, new_flags, old_flags);
2966 bfd_set_error (bfd_error_bad_value);
2970 /* Merge Tag_compatibility attributes and any common GNU ones. */
2971 _bfd_elf_merge_object_attributes (ibfd, obfd);
2977 /* Implement bfd_elf32_bfd_reloc_type_lookup:
2978 Given a BFD reloc type, return a howto structure. */
2979 static reloc_howto_type *
2980 nios2_elf32_bfd_reloc_type_lookup (bfd *abfd,
2981 bfd_reloc_code_real_type code)
2986 i < (int) (sizeof (nios2_reloc_map) / sizeof (struct elf_reloc_map));
2988 if (nios2_reloc_map[i].bfd_val == code)
2989 return lookup_howto (nios2_reloc_map[i].elf_val, abfd);
2993 /* Implement bfd_elf32_bfd_reloc_name_lookup:
2994 Given a reloc name, return a howto structure. */
2995 static reloc_howto_type *
2996 nios2_elf32_bfd_reloc_name_lookup (bfd *abfd,
3000 reloc_howto_type *howto_tbl;
3003 if (BFD_IS_R2 (abfd))
3005 howto_tbl = elf_nios2_r2_howto_table_rel;
3006 howto_tbl_size = (int) (sizeof (elf_nios2_r2_howto_table_rel)
3007 / sizeof (elf_nios2_r2_howto_table_rel[0]));
3011 howto_tbl = elf_nios2_r1_howto_table_rel;
3012 howto_tbl_size = (int) (sizeof (elf_nios2_r1_howto_table_rel)
3013 / sizeof (elf_nios2_r1_howto_table_rel[0]));
3016 for (i = 0; i < howto_tbl_size; i++)
3017 if (howto_tbl[i].name && strcasecmp (howto_tbl[i].name, r_name) == 0)
3018 return howto_tbl + i;
3022 /* Implement elf_info_to_howto:
3023 Given a ELF32 relocation, fill in a arelent structure. */
3025 nios2_elf32_info_to_howto (bfd *abfd, arelent *cache_ptr,
3026 Elf_Internal_Rela *dst)
3028 unsigned int r_type;
3030 r_type = ELF32_R_TYPE (dst->r_info);
3031 cache_ptr->howto = lookup_howto (r_type, abfd);
3034 /* Return the base VMA address which should be subtracted from real addresses
3035 when resolving @dtpoff relocation.
3036 This is PT_TLS segment p_vaddr. */
3038 dtpoff_base (struct bfd_link_info *info)
3040 /* If tls_sec is NULL, we should have signalled an error already. */
3041 if (elf_hash_table (info)->tls_sec == NULL)
3043 return elf_hash_table (info)->tls_sec->vma;
3046 /* Return the relocation value for @tpoff relocation
3047 if STT_TLS virtual address is ADDRESS. */
3049 tpoff (struct bfd_link_info *info, bfd_vma address)
3051 struct elf_link_hash_table *htab = elf_hash_table (info);
3053 /* If tls_sec is NULL, we should have signalled an error already. */
3054 if (htab->tls_sec == NULL)
3056 return address - htab->tls_sec->vma;
3059 /* Set the GP value for OUTPUT_BFD. Returns FALSE if this is a
3060 dangerous relocation. */
3062 nios2_elf_assign_gp (bfd *output_bfd, bfd_vma *pgp, struct bfd_link_info *info)
3065 bfd_boolean gp_found;
3066 struct bfd_hash_entry *h;
3067 struct bfd_link_hash_entry *lh;
3069 /* If we've already figured out what GP will be, just return it. */
3070 *pgp = _bfd_get_gp_value (output_bfd);
3074 h = bfd_hash_lookup (&info->hash->table, "_gp", FALSE, FALSE);
3075 lh = (struct bfd_link_hash_entry *) h;
3081 case bfd_link_hash_undefined:
3082 case bfd_link_hash_undefweak:
3083 case bfd_link_hash_common:
3086 case bfd_link_hash_defined:
3087 case bfd_link_hash_defweak:
3089 *pgp = lh->u.def.value;
3091 case bfd_link_hash_indirect:
3092 case bfd_link_hash_warning:
3094 /* @@FIXME ignoring warning for now */
3096 case bfd_link_hash_new:
3106 /* Only get the error once. */
3108 _bfd_set_gp_value (output_bfd, *pgp);
3112 _bfd_set_gp_value (output_bfd, *pgp);
3117 /* Retrieve the previously cached _gp pointer, returning bfd_reloc_dangerous
3118 if it's not available as we don't have a link_info pointer available here
3119 to look it up in the output symbol table. We don't need to adjust the
3120 symbol value for an external symbol if we are producing relocatable
3122 static bfd_reloc_status_type
3123 nios2_elf_final_gp (bfd *output_bfd, asymbol *symbol, bfd_boolean relocatable,
3124 char **error_message, bfd_vma *pgp)
3126 if (bfd_is_und_section (symbol->section) && !relocatable)
3129 return bfd_reloc_undefined;
3132 *pgp = _bfd_get_gp_value (output_bfd);
3133 if (*pgp == 0 && (!relocatable || (symbol->flags & BSF_SECTION_SYM) != 0))
3137 /* Make up a value. */
3138 *pgp = symbol->section->output_section->vma + 0x4000;
3139 _bfd_set_gp_value (output_bfd, *pgp);
3144 = (char *) _("global pointer relative relocation when _gp not defined");
3145 return bfd_reloc_dangerous;
3149 return bfd_reloc_ok;
3152 /* Do the relocations that require special handling. */
3153 static bfd_reloc_status_type
3154 nios2_elf32_do_hi16_relocate (bfd *abfd, reloc_howto_type *howto,
3155 asection *input_section,
3156 bfd_byte *data, bfd_vma offset,
3157 bfd_vma symbol_value, bfd_vma addend)
3159 symbol_value = symbol_value + addend;
3161 symbol_value = (symbol_value >> 16) & 0xffff;
3162 return _bfd_final_link_relocate (howto, abfd, input_section,
3163 data, offset, symbol_value, addend);
3166 static bfd_reloc_status_type
3167 nios2_elf32_do_lo16_relocate (bfd *abfd, reloc_howto_type *howto,
3168 asection *input_section,
3169 bfd_byte *data, bfd_vma offset,
3170 bfd_vma symbol_value, bfd_vma addend)
3172 symbol_value = symbol_value + addend;
3174 symbol_value = symbol_value & 0xffff;
3175 return _bfd_final_link_relocate (howto, abfd, input_section,
3176 data, offset, symbol_value, addend);
3179 static bfd_reloc_status_type
3180 nios2_elf32_do_hiadj16_relocate (bfd *abfd, reloc_howto_type *howto,
3181 asection *input_section,
3182 bfd_byte *data, bfd_vma offset,
3183 bfd_vma symbol_value, bfd_vma addend)
3185 symbol_value = symbol_value + addend;
3187 symbol_value = hiadj(symbol_value);
3188 return _bfd_final_link_relocate (howto, abfd, input_section, data, offset,
3189 symbol_value, addend);
3192 static bfd_reloc_status_type
3193 nios2_elf32_do_pcrel_lo16_relocate (bfd *abfd, reloc_howto_type *howto,
3194 asection *input_section,
3195 bfd_byte *data, bfd_vma offset,
3196 bfd_vma symbol_value, bfd_vma addend)
3198 symbol_value = symbol_value + addend;
3200 symbol_value = symbol_value & 0xffff;
3201 return _bfd_final_link_relocate (howto, abfd, input_section,
3202 data, offset, symbol_value, addend);
3205 static bfd_reloc_status_type
3206 nios2_elf32_do_pcrel_hiadj16_relocate (bfd *abfd, reloc_howto_type *howto,
3207 asection *input_section,
3208 bfd_byte *data, bfd_vma offset,
3209 bfd_vma symbol_value, bfd_vma addend)
3211 symbol_value = symbol_value + addend;
3212 symbol_value -= (input_section->output_section->vma
3213 + input_section->output_offset);
3214 symbol_value -= offset;
3216 symbol_value = hiadj(symbol_value);
3217 return _bfd_final_link_relocate (howto, abfd, input_section, data, offset,
3218 symbol_value, addend);
3221 static bfd_reloc_status_type
3222 nios2_elf32_do_pcrel16_relocate (bfd *abfd, reloc_howto_type *howto,
3223 asection *input_section,
3224 bfd_byte *data, bfd_vma offset,
3225 bfd_vma symbol_value, bfd_vma addend)
3227 /* NIOS2 pc relative relocations are relative to the next 32-bit instruction
3228 so we need to subtract 4 before doing a final_link_relocate. */
3229 symbol_value = symbol_value + addend - 4;
3231 return _bfd_final_link_relocate (howto, abfd, input_section,
3232 data, offset, symbol_value, addend);
3235 static bfd_reloc_status_type
3236 nios2_elf32_do_call26_relocate (bfd *abfd, reloc_howto_type *howto,
3237 asection *input_section,
3238 bfd_byte *data, bfd_vma offset,
3239 bfd_vma symbol_value, bfd_vma addend)
3241 /* Check that the relocation is in the same page as the current address. */
3242 if (CALL26_SEGMENT (symbol_value + addend)
3243 != CALL26_SEGMENT (input_section->output_section->vma
3244 + input_section->output_offset
3246 return bfd_reloc_overflow;
3248 /* Check that the target address is correctly aligned on a 4-byte
3250 if ((symbol_value + addend) & 0x3)
3251 return bfd_reloc_overflow;
3253 return _bfd_final_link_relocate (howto, abfd, input_section,
3254 data, offset, symbol_value, addend);
3257 static bfd_reloc_status_type
3258 nios2_elf32_do_gprel_relocate (bfd *abfd, reloc_howto_type *howto,
3259 asection *input_section,
3260 bfd_byte *data, bfd_vma offset,
3261 bfd_vma symbol_value, bfd_vma addend)
3263 /* Because we need the output_bfd, the special handling is done
3264 in nios2_elf32_relocate_section or in nios2_elf32_gprel_relocate. */
3265 return _bfd_final_link_relocate (howto, abfd, input_section,
3266 data, offset, symbol_value, addend);
3269 static bfd_reloc_status_type
3270 nios2_elf32_do_ujmp_relocate (bfd *abfd, reloc_howto_type *howto,
3271 asection *input_section,
3272 bfd_byte *data, bfd_vma offset,
3273 bfd_vma symbol_value, bfd_vma addend)
3275 bfd_vma symbol_lo16, symbol_hi16;
3276 bfd_reloc_status_type r;
3277 symbol_value = symbol_value + addend;
3279 symbol_hi16 = (symbol_value >> 16) & 0xffff;
3280 symbol_lo16 = symbol_value & 0xffff;
3282 r = _bfd_final_link_relocate (howto, abfd, input_section,
3283 data, offset, symbol_hi16, addend);
3285 if (r == bfd_reloc_ok)
3286 return _bfd_final_link_relocate (howto, abfd, input_section,
3287 data, offset + 4, symbol_lo16, addend);
3292 static bfd_reloc_status_type
3293 nios2_elf32_do_cjmp_relocate (bfd *abfd, reloc_howto_type *howto,
3294 asection *input_section,
3295 bfd_byte *data, bfd_vma offset,
3296 bfd_vma symbol_value, bfd_vma addend)
3298 bfd_vma symbol_lo16, symbol_hi16;
3299 bfd_reloc_status_type r;
3300 symbol_value = symbol_value + addend;
3302 symbol_hi16 = (symbol_value >> 16) & 0xffff;
3303 symbol_lo16 = symbol_value & 0xffff;
3305 r = _bfd_final_link_relocate (howto, abfd, input_section,
3306 data, offset, symbol_hi16, addend);
3308 if (r == bfd_reloc_ok)
3309 return _bfd_final_link_relocate (howto, abfd, input_section,
3310 data, offset + 4, symbol_lo16, addend);
3315 static bfd_reloc_status_type
3316 nios2_elf32_do_callr_relocate (bfd *abfd, reloc_howto_type *howto,
3317 asection *input_section,
3318 bfd_byte *data, bfd_vma offset,
3319 bfd_vma symbol_value, bfd_vma addend)
3321 bfd_vma symbol_lo16, symbol_hi16;
3322 bfd_reloc_status_type r;
3323 symbol_value = symbol_value + addend;
3325 symbol_hi16 = (symbol_value >> 16) & 0xffff;
3326 symbol_lo16 = symbol_value & 0xffff;
3328 r = _bfd_final_link_relocate (howto, abfd, input_section,
3329 data, offset, symbol_hi16, addend);
3331 if (r == bfd_reloc_ok)
3332 return _bfd_final_link_relocate (howto, abfd, input_section,
3333 data, offset + 4, symbol_lo16, addend);
3338 /* HOWTO handlers for relocations that require special handling. */
3340 /* This is for relocations used only when relaxing to ensure
3341 changes in size of section don't screw up .align. */
3342 static bfd_reloc_status_type
3343 nios2_elf32_ignore_reloc (bfd *abfd ATTRIBUTE_UNUSED, arelent *reloc_entry,
3344 asymbol *symbol ATTRIBUTE_UNUSED,
3345 void *data ATTRIBUTE_UNUSED, asection *input_section,
3347 char **error_message ATTRIBUTE_UNUSED)
3349 if (output_bfd != NULL)
3350 reloc_entry->address += input_section->output_offset;
3351 return bfd_reloc_ok;
3354 static bfd_reloc_status_type
3355 nios2_elf32_hi16_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
3356 void *data, asection *input_section,
3358 char **error_message ATTRIBUTE_UNUSED)
3360 /* This part is from bfd_elf_generic_reloc. */
3361 if (output_bfd != NULL
3362 && (symbol->flags & BSF_SECTION_SYM) == 0
3363 && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
3365 reloc_entry->address += input_section->output_offset;
3366 return bfd_reloc_ok;
3369 if (output_bfd != NULL)
3370 /* FIXME: See bfd_perform_relocation. Is this right? */
3371 return bfd_reloc_continue;
3373 return nios2_elf32_do_hi16_relocate (abfd, reloc_entry->howto,
3375 data, reloc_entry->address,
3377 + symbol->section->output_section->vma
3378 + symbol->section->output_offset),
3379 reloc_entry->addend);
3382 static bfd_reloc_status_type
3383 nios2_elf32_lo16_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
3384 void *data, asection *input_section,
3386 char **error_message ATTRIBUTE_UNUSED)
3388 /* This part is from bfd_elf_generic_reloc. */
3389 if (output_bfd != NULL
3390 && (symbol->flags & BSF_SECTION_SYM) == 0
3391 && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
3393 reloc_entry->address += input_section->output_offset;
3394 return bfd_reloc_ok;
3397 if (output_bfd != NULL)
3398 /* FIXME: See bfd_perform_relocation. Is this right? */
3399 return bfd_reloc_continue;
3401 return nios2_elf32_do_lo16_relocate (abfd, reloc_entry->howto,
3403 data, reloc_entry->address,
3405 + symbol->section->output_section->vma
3406 + symbol->section->output_offset),
3407 reloc_entry->addend);
3410 static bfd_reloc_status_type
3411 nios2_elf32_hiadj16_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
3412 void *data, asection *input_section,
3414 char **error_message ATTRIBUTE_UNUSED)
3416 /* This part is from bfd_elf_generic_reloc. */
3417 if (output_bfd != NULL
3418 && (symbol->flags & BSF_SECTION_SYM) == 0
3419 && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
3421 reloc_entry->address += input_section->output_offset;
3422 return bfd_reloc_ok;
3425 if (output_bfd != NULL)
3426 /* FIXME: See bfd_perform_relocation. Is this right? */
3427 return bfd_reloc_continue;
3429 return nios2_elf32_do_hiadj16_relocate (abfd, reloc_entry->howto,
3431 data, reloc_entry->address,
3433 + symbol->section->output_section->vma
3434 + symbol->section->output_offset),
3435 reloc_entry->addend);
3438 static bfd_reloc_status_type
3439 nios2_elf32_pcrel_lo16_relocate (bfd *abfd, arelent *reloc_entry,
3440 asymbol *symbol, void *data,
3441 asection *input_section, bfd *output_bfd,
3442 char **error_message ATTRIBUTE_UNUSED)
3444 /* This part is from bfd_elf_generic_reloc. */
3445 if (output_bfd != NULL
3446 && (symbol->flags & BSF_SECTION_SYM) == 0
3447 && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
3449 reloc_entry->address += input_section->output_offset;
3450 return bfd_reloc_ok;
3453 if (output_bfd != NULL)
3454 /* FIXME: See bfd_perform_relocation. Is this right? */
3455 return bfd_reloc_continue;
3457 return nios2_elf32_do_pcrel_lo16_relocate (
3458 abfd, reloc_entry->howto, input_section, data, reloc_entry->address,
3459 (symbol->value + symbol->section->output_section->vma
3460 + symbol->section->output_offset),
3461 reloc_entry->addend);
3464 static bfd_reloc_status_type
3465 nios2_elf32_pcrel_hiadj16_relocate (bfd *abfd, arelent *reloc_entry,
3466 asymbol *symbol, void *data,
3467 asection *input_section, bfd *output_bfd,
3468 char **error_message ATTRIBUTE_UNUSED)
3470 /* This part is from bfd_elf_generic_reloc. */
3471 if (output_bfd != NULL
3472 && (symbol->flags & BSF_SECTION_SYM) == 0
3473 && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
3475 reloc_entry->address += input_section->output_offset;
3476 return bfd_reloc_ok;
3479 if (output_bfd != NULL)
3480 /* FIXME: See bfd_perform_relocation. Is this right? */
3481 return bfd_reloc_continue;
3483 return nios2_elf32_do_pcrel_hiadj16_relocate (
3484 abfd, reloc_entry->howto, input_section, data, reloc_entry->address,
3485 (symbol->value + symbol->section->output_section->vma
3486 + symbol->section->output_offset),
3487 reloc_entry->addend);
3490 static bfd_reloc_status_type
3491 nios2_elf32_pcrel16_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
3492 void *data, asection *input_section,
3494 char **error_message ATTRIBUTE_UNUSED)
3496 /* This part is from bfd_elf_generic_reloc. */
3497 if (output_bfd != NULL
3498 && (symbol->flags & BSF_SECTION_SYM) == 0
3499 && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
3501 reloc_entry->address += input_section->output_offset;
3502 return bfd_reloc_ok;
3505 if (output_bfd != NULL)
3506 /* FIXME: See bfd_perform_relocation. Is this right? */
3507 return bfd_reloc_continue;
3509 return nios2_elf32_do_pcrel16_relocate (abfd, reloc_entry->howto,
3511 data, reloc_entry->address,
3513 + symbol->section->output_section->vma
3514 + symbol->section->output_offset),
3515 reloc_entry->addend);
3518 static bfd_reloc_status_type
3519 nios2_elf32_call26_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
3520 void *data, asection *input_section,
3522 char **error_message ATTRIBUTE_UNUSED)
3524 /* This part is from bfd_elf_generic_reloc. */
3525 if (output_bfd != NULL
3526 && (symbol->flags & BSF_SECTION_SYM) == 0
3527 && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
3529 reloc_entry->address += input_section->output_offset;
3530 return bfd_reloc_ok;
3533 if (output_bfd != NULL)
3534 /* FIXME: See bfd_perform_relocation. Is this right? */
3535 return bfd_reloc_continue;
3537 return nios2_elf32_do_call26_relocate (abfd, reloc_entry->howto,
3539 data, reloc_entry->address,
3541 + symbol->section->output_section->vma
3542 + symbol->section->output_offset),
3543 reloc_entry->addend);
3546 static bfd_reloc_status_type
3547 nios2_elf32_gprel_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
3548 void *data, asection *input_section,
3549 bfd *output_bfd, char **msg)
3553 bfd_reloc_status_type r;
3556 /* This part is from bfd_elf_generic_reloc. */
3557 if (output_bfd != NULL
3558 && (symbol->flags & BSF_SECTION_SYM) == 0
3559 && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
3561 reloc_entry->address += input_section->output_offset;
3562 return bfd_reloc_ok;
3565 if (output_bfd != NULL)
3566 /* FIXME: See bfd_perform_relocation. Is this right? */
3567 return bfd_reloc_continue;
3569 relocation = (symbol->value
3570 + symbol->section->output_section->vma
3571 + symbol->section->output_offset);
3573 /* This assumes we've already cached the _gp symbol. */
3574 r = nios2_elf_final_gp (abfd, symbol, FALSE, msg, &gp);
3575 if (r == bfd_reloc_ok)
3577 relocation = relocation + reloc_entry->addend - gp;
3578 reloc_entry->addend = 0;
3579 if ((signed) relocation < -32768 || (signed) relocation > 32767)
3581 *msg = _("global pointer relative address out of range");
3582 r = bfd_reloc_outofrange;
3585 r = nios2_elf32_do_gprel_relocate (abfd, reloc_entry->howto,
3587 data, reloc_entry->address,
3588 relocation, reloc_entry->addend);
3594 static bfd_reloc_status_type
3595 nios2_elf32_ujmp_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
3596 void *data, asection *input_section,
3597 bfd *output_bfd, char **msg ATTRIBUTE_UNUSED)
3599 /* This part is from bfd_elf_generic_reloc. */
3600 if (output_bfd != NULL
3601 && (symbol->flags & BSF_SECTION_SYM) == 0
3602 && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
3604 reloc_entry->address += input_section->output_offset;
3605 return bfd_reloc_ok;
3608 if (output_bfd != NULL)
3609 /* FIXME: See bfd_perform_relocation. Is this right? */
3610 return bfd_reloc_continue;
3612 return nios2_elf32_do_ujmp_relocate (abfd, reloc_entry->howto,
3614 data, reloc_entry->address,
3616 + symbol->section->output_section->vma
3617 + symbol->section->output_offset),
3618 reloc_entry->addend);
3621 static bfd_reloc_status_type
3622 nios2_elf32_cjmp_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
3623 void *data, asection *input_section,
3624 bfd *output_bfd, char **msg ATTRIBUTE_UNUSED)
3626 /* This part is from bfd_elf_generic_reloc. */
3627 if (output_bfd != NULL
3628 && (symbol->flags & BSF_SECTION_SYM) == 0
3629 && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
3631 reloc_entry->address += input_section->output_offset;
3632 return bfd_reloc_ok;
3635 if (output_bfd != NULL)
3636 /* FIXME: See bfd_perform_relocation. Is this right? */
3637 return bfd_reloc_continue;
3639 return nios2_elf32_do_cjmp_relocate (abfd, reloc_entry->howto,
3641 data, reloc_entry->address,
3643 + symbol->section->output_section->vma
3644 + symbol->section->output_offset),
3645 reloc_entry->addend);
3648 static bfd_reloc_status_type
3649 nios2_elf32_callr_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
3650 void *data, asection *input_section,
3651 bfd *output_bfd, char **msg ATTRIBUTE_UNUSED)
3653 /* This part is from bfd_elf_generic_reloc. */
3654 if (output_bfd != NULL
3655 && (symbol->flags & BSF_SECTION_SYM) == 0
3656 && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
3658 reloc_entry->address += input_section->output_offset;
3659 return bfd_reloc_ok;
3662 if (output_bfd != NULL)
3663 /* FIXME: See bfd_perform_relocation. Is this right? */
3664 return bfd_reloc_continue;
3666 return nios2_elf32_do_callr_relocate (abfd, reloc_entry->howto,
3668 data, reloc_entry->address,
3670 + symbol->section->output_section->vma
3671 + symbol->section->output_offset),
3672 reloc_entry->addend);
3676 /* Implement elf_backend_relocate_section. */
3678 nios2_elf32_relocate_section (bfd *output_bfd,
3679 struct bfd_link_info *info,
3681 asection *input_section,
3683 Elf_Internal_Rela *relocs,
3684 Elf_Internal_Sym *local_syms,
3685 asection **local_sections)
3687 Elf_Internal_Shdr *symtab_hdr;
3688 struct elf_link_hash_entry **sym_hashes;
3689 Elf_Internal_Rela *rel;
3690 Elf_Internal_Rela *relend;
3691 struct elf32_nios2_link_hash_table *htab;
3694 asection *sreloc = NULL;
3695 bfd_vma *local_got_offsets;
3698 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
3699 sym_hashes = elf_sym_hashes (input_bfd);
3700 relend = relocs + input_section->reloc_count;
3702 htab = elf32_nios2_hash_table (info);
3703 sgot = htab->root.sgot;
3704 splt = htab->root.splt;
3705 local_got_offsets = elf_local_got_offsets (input_bfd);
3707 if (elf32_nios2_hash_table (info)->h_gp_got == NULL)
3710 got_base = elf32_nios2_hash_table (info)->h_gp_got->root.u.def.value;
3712 for (rel = relocs; rel < relend; rel++)
3714 reloc_howto_type *howto;
3715 unsigned long r_symndx;
3716 Elf_Internal_Sym *sym;
3718 struct elf_link_hash_entry *h;
3719 struct elf32_nios2_link_hash_entry *eh;
3722 bfd_vma reloc_address;
3723 bfd_reloc_status_type r = bfd_reloc_ok;
3724 const char *name = NULL;
3728 const char* msg = (const char*) NULL;
3729 bfd_boolean unresolved_reloc;
3733 r_type = ELF32_R_TYPE (rel->r_info);
3734 r_symndx = ELF32_R_SYM (rel->r_info);
3736 howto = lookup_howto ((unsigned) ELF32_R_TYPE (rel->r_info), output_bfd);
3741 if (r_symndx < symtab_hdr->sh_info)
3743 sym = local_syms + r_symndx;
3744 sec = local_sections[r_symndx];
3745 relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
3749 bfd_boolean warned, ignored;
3751 RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
3752 r_symndx, symtab_hdr, sym_hashes,
3754 unresolved_reloc, warned, ignored);
3757 if (sec && discarded_section (sec))
3758 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
3759 rel, 1, relend, howto, 0, contents);
3761 /* Nothing more to do unless this is a final link. */
3762 if (info->relocatable)
3765 if (sec && sec->output_section)
3766 reloc_address = (sec->output_section->vma + sec->output_offset
3773 switch (howto->type)
3776 r = nios2_elf32_do_hi16_relocate (input_bfd, howto,
3778 contents, rel->r_offset,
3779 relocation, rel->r_addend);
3782 r = nios2_elf32_do_lo16_relocate (input_bfd, howto,
3784 contents, rel->r_offset,
3785 relocation, rel->r_addend);
3787 case R_NIOS2_PCREL_LO:
3788 r = nios2_elf32_do_pcrel_lo16_relocate (input_bfd, howto,
3795 case R_NIOS2_HIADJ16:
3796 r = nios2_elf32_do_hiadj16_relocate (input_bfd, howto,
3797 input_section, contents,
3798 rel->r_offset, relocation,
3801 case R_NIOS2_PCREL_HA:
3802 r = nios2_elf32_do_pcrel_hiadj16_relocate (input_bfd, howto,
3809 case R_NIOS2_PCREL16:
3810 r = nios2_elf32_do_pcrel16_relocate (input_bfd, howto,
3811 input_section, contents,
3812 rel->r_offset, relocation,
3816 /* Turns an absolute address into a gp-relative address. */
3817 if (!nios2_elf_assign_gp (output_bfd, &gp, info))
3819 format = _("global pointer relative relocation at address "
3820 "0x%08x when _gp not defined\n");
3821 sprintf (msgbuf, format, reloc_address);
3823 r = bfd_reloc_dangerous;
3827 bfd_vma symbol_address = rel->r_addend + relocation;
3828 relocation = relocation + rel->r_addend - gp;
3830 if (((signed) relocation < -32768
3831 || (signed) relocation > 32767)
3833 || h->root.type == bfd_link_hash_defined
3834 || h->root.type == bfd_link_hash_defweak))
3836 format = _("Unable to reach %s (at 0x%08x) from the "
3837 "global pointer (at 0x%08x) because the "
3838 "offset (%d) is out of the allowed range, "
3839 "-32678 to 32767.\n" );
3840 sprintf (msgbuf, format, name, symbol_address, gp,
3841 (signed)relocation);
3843 r = bfd_reloc_outofrange;
3846 r = _bfd_final_link_relocate (howto, input_bfd,
3847 input_section, contents,
3848 rel->r_offset, relocation,
3854 r = nios2_elf32_do_ujmp_relocate (input_bfd, howto,
3856 contents, rel->r_offset,
3857 relocation, rel->r_addend);
3860 r = nios2_elf32_do_cjmp_relocate (input_bfd, howto,
3862 contents, rel->r_offset,
3863 relocation, rel->r_addend);
3866 r = nios2_elf32_do_callr_relocate (input_bfd, howto,
3867 input_section, contents,
3868 rel->r_offset, relocation,
3871 case R_NIOS2_CALL26:
3872 case R_NIOS2_CALL26_NOAT:
3873 /* If we have a call to an undefined weak symbol, we just want
3874 to stuff a zero in the bits of the call instruction and
3875 bypass the normal call26 relocation handling, because it'll
3876 diagnose an overflow error if address 0 isn't in the same
3877 256MB segment as the call site. Presumably the call
3878 should be guarded by a null check anyway. */
3879 if (h != NULL && h->root.type == bfd_link_hash_undefweak)
3881 BFD_ASSERT (relocation == 0 && rel->r_addend == 0);
3882 r = _bfd_final_link_relocate (howto, input_bfd,
3883 input_section, contents,
3884 rel->r_offset, relocation,
3888 /* Handle relocations which should use the PLT entry.
3889 NIOS2_BFD_RELOC_32 relocations will use the symbol's value,
3890 which may point to a PLT entry, but we don't need to handle
3891 that here. If we created a PLT entry, all branches in this
3892 object should go to it. */
3893 if (h != NULL && splt != NULL && h->plt.offset != (bfd_vma) -1)
3895 /* If we've created a .plt section, and assigned a PLT entry
3896 to this function, it should not be known to bind locally.
3897 If it were, we would have cleared the PLT entry. */
3898 BFD_ASSERT (!SYMBOL_CALLS_LOCAL (info, h));
3900 relocation = (splt->output_section->vma
3901 + splt->output_offset
3904 unresolved_reloc = FALSE;
3906 /* Detect R_NIOS2_CALL26 relocations that would overflow the
3907 256MB segment. Replace the target with a reference to a
3909 Note that htab->stub_group is null if relaxation has been
3910 disabled by the --no-relax linker command-line option, so
3911 we can use that to skip this processing entirely. */
3912 if (howto->type == R_NIOS2_CALL26 && htab->stub_group)
3914 bfd_vma dest = relocation + rel->r_addend;
3915 enum elf32_nios2_stub_type stub_type;
3917 eh = (struct elf32_nios2_link_hash_entry *)h;
3918 stub_type = nios2_type_of_stub (input_section, rel, eh,
3921 if (stub_type != nios2_stub_none)
3923 struct elf32_nios2_stub_hash_entry *hsh;
3925 hsh = nios2_get_stub_entry (input_section, sec,
3926 eh, rel, htab, stub_type);
3929 r = bfd_reloc_undefined;
3933 dest = (hsh->stub_offset
3934 + hsh->stub_sec->output_offset
3935 + hsh->stub_sec->output_section->vma);
3936 r = nios2_elf32_do_call26_relocate (input_bfd, howto,
3946 r = nios2_elf32_do_call26_relocate (input_bfd, howto,
3947 input_section, contents,
3948 rel->r_offset, relocation,
3953 /* For symmetry this would be
3954 r = nios2_elf32_do_ignore_reloc (input_bfd, howto,
3955 input_section, contents,
3956 rel->r_offset, relocation,
3958 but do_ignore_reloc would do no more than return
3963 case R_NIOS2_CALL16:
3964 case R_NIOS2_GOT_LO:
3965 case R_NIOS2_GOT_HA:
3966 case R_NIOS2_CALL_LO:
3967 case R_NIOS2_CALL_HA:
3968 /* Relocation is to the entry for this symbol in the
3969 global offset table. */
3972 r = bfd_reloc_notsupported;
3982 eh = (struct elf32_nios2_link_hash_entry *)h;
3983 use_plt = (eh->got_types_used == CALL_USED
3984 && h->plt.offset != (bfd_vma) -1);
3986 off = h->got.offset;
3987 BFD_ASSERT (off != (bfd_vma) -1);
3988 dyn = elf_hash_table (info)->dynamic_sections_created;
3989 if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
3991 && SYMBOL_REFERENCES_LOCAL (info, h))
3992 || (ELF_ST_VISIBILITY (h->other)
3993 && h->root.type == bfd_link_hash_undefweak))
3995 /* This is actually a static link, or it is a -Bsymbolic
3996 link and the symbol is defined locally. We must
3997 initialize this entry in the global offset table.
3998 Since the offset must always be a multiple of 4, we
3999 use the least significant bit to record whether we
4000 have initialized it already.
4002 When doing a dynamic link, we create a .rela.got
4003 relocation entry to initialize the value. This is
4004 done in the finish_dynamic_symbol routine. */
4009 bfd_put_32 (output_bfd, relocation,
4010 sgot->contents + off);
4015 unresolved_reloc = FALSE;
4019 BFD_ASSERT (local_got_offsets != NULL
4020 && local_got_offsets[r_symndx] != (bfd_vma) -1);
4022 off = local_got_offsets[r_symndx];
4024 /* The offset must always be a multiple of 4. We use the
4025 least significant bit to record whether we have already
4026 generated the necessary reloc. */
4031 bfd_put_32 (output_bfd, relocation,
4032 sgot->contents + off);
4037 Elf_Internal_Rela outrel;
4040 srelgot = htab->root.srelgot;
4041 BFD_ASSERT (srelgot != NULL);
4043 outrel.r_addend = relocation;
4044 outrel.r_offset = (sgot->output_section->vma
4045 + sgot->output_offset
4047 outrel.r_info = ELF32_R_INFO (0, R_NIOS2_RELATIVE);
4048 loc = srelgot->contents;
4049 loc += (srelgot->reloc_count++ *
4050 sizeof (Elf32_External_Rela));
4051 bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
4054 local_got_offsets[r_symndx] |= 1;
4058 if (use_plt && info->shared)
4060 off = ((h->plt.offset - 24) / 12 + 3) * 4;
4061 relocation = (htab->root.sgotplt->output_offset + off
4065 relocation = sgot->output_offset + off - got_base;
4067 /* This relocation does not use the addend. */
4070 switch (howto->type)
4072 case R_NIOS2_GOT_LO:
4073 case R_NIOS2_CALL_LO:
4074 r = nios2_elf32_do_lo16_relocate (input_bfd, howto,
4075 input_section, contents,
4076 rel->r_offset, relocation,
4079 case R_NIOS2_GOT_HA:
4080 case R_NIOS2_CALL_HA:
4081 r = nios2_elf32_do_hiadj16_relocate (input_bfd, howto,
4082 input_section, contents,
4088 r = _bfd_final_link_relocate (howto, input_bfd,
4089 input_section, contents,
4090 rel->r_offset, relocation,
4096 case R_NIOS2_GOTOFF_LO:
4097 case R_NIOS2_GOTOFF_HA:
4098 case R_NIOS2_GOTOFF:
4099 /* Relocation is relative to the global offset table pointer. */
4101 BFD_ASSERT (sgot != NULL);
4104 r = bfd_reloc_notsupported;
4108 /* Note that sgot->output_offset is not involved in this
4109 calculation. We always want the start of .got. */
4110 relocation -= sgot->output_section->vma;
4112 /* Now we adjust the relocation to be relative to the GOT pointer
4113 (the _gp_got symbol), which possibly contains the 0x8000 bias. */
4114 relocation -= got_base;
4116 switch (howto->type)
4118 case R_NIOS2_GOTOFF_LO:
4119 r = nios2_elf32_do_lo16_relocate (input_bfd, howto,
4120 input_section, contents,
4121 rel->r_offset, relocation,
4124 case R_NIOS2_GOTOFF_HA:
4125 r = nios2_elf32_do_hiadj16_relocate (input_bfd, howto,
4126 input_section, contents,
4132 r = _bfd_final_link_relocate (howto, input_bfd,
4133 input_section, contents,
4134 rel->r_offset, relocation,
4140 case R_NIOS2_TLS_LDO16:
4141 relocation -= dtpoff_base (info) + DTP_OFFSET;
4143 r = _bfd_final_link_relocate (howto, input_bfd, input_section,
4144 contents, rel->r_offset,
4145 relocation, rel->r_addend);
4147 case R_NIOS2_TLS_LDM16:
4148 if (htab->root.sgot == NULL)
4151 off = htab->tls_ldm_got.offset;
4157 /* If we don't know the module number, create a relocation
4161 Elf_Internal_Rela outrel;
4164 if (htab->root.srelgot == NULL)
4167 outrel.r_addend = 0;
4168 outrel.r_offset = (htab->root.sgot->output_section->vma
4169 + htab->root.sgot->output_offset
4171 outrel.r_info = ELF32_R_INFO (0, R_NIOS2_TLS_DTPMOD);
4173 loc = htab->root.srelgot->contents;
4174 loc += (htab->root.srelgot->reloc_count++
4175 * sizeof (Elf32_External_Rela));
4176 bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
4179 bfd_put_32 (output_bfd, 1,
4180 htab->root.sgot->contents + off);
4182 htab->tls_ldm_got.offset |= 1;
4185 relocation = htab->root.sgot->output_offset + off - got_base;
4187 r = _bfd_final_link_relocate (howto, input_bfd, input_section,
4188 contents, rel->r_offset,
4189 relocation, rel->r_addend);
4192 case R_NIOS2_TLS_GD16:
4193 case R_NIOS2_TLS_IE16:
4198 if (htab->root.sgot == NULL)
4205 dyn = htab->root.dynamic_sections_created;
4206 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
4208 || !SYMBOL_REFERENCES_LOCAL (info, h)))
4210 unresolved_reloc = FALSE;
4213 off = h->got.offset;
4214 tls_type = (((struct elf32_nios2_link_hash_entry *) h)
4219 if (local_got_offsets == NULL)
4221 off = local_got_offsets[r_symndx];
4222 tls_type = (elf32_nios2_local_got_tls_type (input_bfd)
4226 if (tls_type == GOT_UNKNOWN)
4233 bfd_boolean need_relocs = FALSE;
4234 Elf_Internal_Rela outrel;
4235 bfd_byte *loc = NULL;
4238 /* The GOT entries have not been initialized yet. Do it
4239 now, and emit any relocations. If both an IE GOT and a
4240 GD GOT are necessary, we emit the GD first. */
4242 if ((info->shared || indx != 0)
4244 || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
4245 || h->root.type != bfd_link_hash_undefweak))
4248 if (htab->root.srelgot == NULL)
4250 loc = htab->root.srelgot->contents;
4251 loc += (htab->root.srelgot->reloc_count *
4252 sizeof (Elf32_External_Rela));
4255 if (tls_type & GOT_TLS_GD)
4259 outrel.r_addend = 0;
4260 outrel.r_offset = (htab->root.sgot->output_section->vma
4261 + htab->root.sgot->output_offset
4263 outrel.r_info = ELF32_R_INFO (indx,
4264 R_NIOS2_TLS_DTPMOD);
4266 bfd_elf32_swap_reloca_out (output_bfd, &outrel,
4268 htab->root.srelgot->reloc_count++;
4269 loc += sizeof (Elf32_External_Rela);
4272 bfd_put_32 (output_bfd,
4273 (relocation - dtpoff_base (info) -
4275 htab->root.sgot->contents + cur_off + 4);
4278 outrel.r_addend = 0;
4279 outrel.r_info = ELF32_R_INFO (indx,
4280 R_NIOS2_TLS_DTPREL);
4281 outrel.r_offset += 4;
4283 bfd_elf32_swap_reloca_out (output_bfd, &outrel,
4285 htab->root.srelgot->reloc_count++;
4286 loc += sizeof (Elf32_External_Rela);
4291 /* If we are not emitting relocations for a
4292 general dynamic reference, then we must be in a
4293 static link or an executable link with the
4294 symbol binding locally. Mark it as belonging
4295 to module 1, the executable. */
4296 bfd_put_32 (output_bfd, 1,
4297 htab->root.sgot->contents + cur_off);
4298 bfd_put_32 (output_bfd, (relocation -
4299 dtpoff_base (info) -
4301 htab->root.sgot->contents + cur_off + 4);
4307 if (tls_type & GOT_TLS_IE)
4312 outrel.r_addend = (relocation -
4313 dtpoff_base (info));
4315 outrel.r_addend = 0;
4316 outrel.r_offset = (htab->root.sgot->output_section->vma
4317 + htab->root.sgot->output_offset
4319 outrel.r_info = ELF32_R_INFO (indx,
4322 bfd_elf32_swap_reloca_out (output_bfd, &outrel,
4324 htab->root.srelgot->reloc_count++;
4325 loc += sizeof (Elf32_External_Rela);
4328 bfd_put_32 (output_bfd, (tpoff (info, relocation)
4330 htab->root.sgot->contents + cur_off);
4337 local_got_offsets[r_symndx] |= 1;
4340 if ((tls_type & GOT_TLS_GD) && r_type != R_NIOS2_TLS_GD16)
4342 relocation = htab->root.sgot->output_offset + off - got_base;
4344 r = _bfd_final_link_relocate (howto, input_bfd, input_section,
4345 contents, rel->r_offset,
4346 relocation, rel->r_addend);
4350 case R_NIOS2_TLS_LE16:
4351 if (info->shared && !info->pie)
4353 (*_bfd_error_handler)
4354 (_("%B(%A+0x%lx): R_NIOS2_TLS_LE16 relocation not "
4355 "permitted in shared object"),
4356 input_bfd, input_section,
4357 (long) rel->r_offset, howto->name);
4361 relocation = tpoff (info, relocation) - TP_OFFSET;
4363 r = _bfd_final_link_relocate (howto, input_bfd, input_section,
4364 contents, rel->r_offset,
4365 relocation, rel->r_addend);
4368 case R_NIOS2_BFD_RELOC_32:
4370 && (input_section->flags & SEC_ALLOC) != 0
4372 || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
4373 || h->root.type != bfd_link_hash_undefweak))
4375 Elf_Internal_Rela outrel;
4377 bfd_boolean skip, relocate;
4379 /* When generating a shared object, these relocations
4380 are copied into the output file to be resolved at run
4387 = _bfd_elf_section_offset (output_bfd, info,
4388 input_section, rel->r_offset);
4389 if (outrel.r_offset == (bfd_vma) -1)
4391 else if (outrel.r_offset == (bfd_vma) -2)
4392 skip = TRUE, relocate = TRUE;
4393 outrel.r_offset += (input_section->output_section->vma
4394 + input_section->output_offset);
4397 memset (&outrel, 0, sizeof outrel);
4402 || !h->def_regular))
4404 outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
4405 outrel.r_addend = rel->r_addend;
4409 /* This symbol is local, or marked to become local. */
4410 outrel.r_addend = relocation + rel->r_addend;
4412 outrel.r_info = ELF32_R_INFO (0, R_NIOS2_RELATIVE);
4415 sreloc = elf_section_data (input_section)->sreloc;
4419 loc = sreloc->contents;
4420 loc += sreloc->reloc_count++ * sizeof (Elf32_External_Rela);
4421 bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
4423 /* This reloc will be computed at runtime, so there's no
4424 need to do anything now, except for R_NIOS2_BFD_RELOC_32
4425 relocations that have been turned into
4426 R_NIOS2_RELATIVE. */
4431 r = _bfd_final_link_relocate (howto, input_bfd,
4432 input_section, contents,
4433 rel->r_offset, relocation,
4437 case R_NIOS2_TLS_DTPREL:
4438 relocation -= dtpoff_base (info);
4442 r = _bfd_final_link_relocate (howto, input_bfd,
4443 input_section, contents,
4444 rel->r_offset, relocation,
4450 r = bfd_reloc_notsupported;
4452 if (r != bfd_reloc_ok)
4455 name = h->root.root.string;
4458 name = bfd_elf_string_from_elf_section (input_bfd,
4459 symtab_hdr->sh_link,
4461 if (name == NULL || *name == '\0')
4462 name = bfd_section_name (input_bfd, sec);
4467 case bfd_reloc_overflow:
4468 r = info->callbacks->reloc_overflow (info, NULL, name,
4469 howto->name, (bfd_vma) 0,
4470 input_bfd, input_section,
4474 case bfd_reloc_undefined:
4475 r = info->callbacks->undefined_symbol (info, name, input_bfd,
4477 rel->r_offset, TRUE);
4480 case bfd_reloc_outofrange:
4482 msg = _("relocation out of range");
4485 case bfd_reloc_notsupported:
4487 msg = _("unsupported relocation");
4490 case bfd_reloc_dangerous:
4492 msg = _("dangerous relocation");
4497 msg = _("unknown error");
4503 r = info->callbacks->warning
4504 (info, msg, name, input_bfd, input_section, rel->r_offset);
4512 /* Implement elf-backend_section_flags:
4513 Convert NIOS2 specific section flags to bfd internal section flags. */
4515 nios2_elf32_section_flags (flagword *flags, const Elf_Internal_Shdr *hdr)
4517 if (hdr->sh_flags & SHF_NIOS2_GPREL)
4518 *flags |= SEC_SMALL_DATA;
4523 /* Implement elf_backend_fake_sections:
4524 Set the correct type for an NIOS2 ELF section. We do this by the
4525 section name, which is a hack, but ought to work. */
4527 nios2_elf32_fake_sections (bfd *abfd ATTRIBUTE_UNUSED,
4528 Elf_Internal_Shdr *hdr, asection *sec)
4530 register const char *name = bfd_get_section_name (abfd, sec);
4532 if ((sec->flags & SEC_SMALL_DATA)
4533 || strcmp (name, ".sdata") == 0
4534 || strcmp (name, ".sbss") == 0
4535 || strcmp (name, ".lit4") == 0 || strcmp (name, ".lit8") == 0)
4536 hdr->sh_flags |= SHF_NIOS2_GPREL;
4541 /* Create .got, .gotplt, and .rela.got sections in DYNOBJ, and set up
4542 shortcuts to them in our hash table. */
4544 create_got_section (bfd *dynobj, struct bfd_link_info *info)
4546 struct elf32_nios2_link_hash_table *htab;
4547 struct elf_link_hash_entry *h;
4549 htab = elf32_nios2_hash_table (info);
4551 if (! _bfd_elf_create_got_section (dynobj, info))
4554 /* In order for the two loads in .PLTresolve to share the same %hiadj,
4555 _GLOBAL_OFFSET_TABLE_ must be aligned to a 16-byte boundary. */
4556 if (!bfd_set_section_alignment (dynobj, htab->root.sgotplt, 4))
4559 /* The Nios II ABI specifies that GOT-relative relocations are relative
4560 to the linker-created symbol _gp_got, rather than using
4561 _GLOBAL_OFFSET_TABLE_ directly. In particular, the latter always
4562 points to the base of the GOT while _gp_got may include a bias. */
4563 h = _bfd_elf_define_linkage_sym (dynobj, info, htab->root.sgotplt,
4565 elf32_nios2_hash_table (info)->h_gp_got = h;
4572 /* Implement elf_backend_create_dynamic_sections:
4573 Create .plt, .rela.plt, .got, .got.plt, .rela.got, .dynbss, and
4574 .rela.bss sections in DYNOBJ, and set up shortcuts to them in our
4577 nios2_elf32_create_dynamic_sections (bfd *dynobj, struct bfd_link_info *info)
4579 struct elf32_nios2_link_hash_table *htab;
4581 htab = elf32_nios2_hash_table (info);
4582 if (!htab->root.sgot && !create_got_section (dynobj, info))
4585 _bfd_elf_create_dynamic_sections (dynobj, info);
4587 /* In order for the two loads in a shared object .PLTresolve to share the
4588 same %hiadj, the start of the PLT (as well as the GOT) must be aligned
4589 to a 16-byte boundary. This is because the addresses for these loads
4590 include the -(.plt+4) PIC correction. */
4591 if (!bfd_set_section_alignment (dynobj, htab->root.splt, 4))
4594 htab->sdynbss = bfd_get_linker_section (dynobj, ".dynbss");
4599 htab->srelbss = bfd_get_linker_section (dynobj, ".rela.bss");
4607 /* Implement elf_backend_copy_indirect_symbol:
4608 Copy the extra info we tack onto an elf_link_hash_entry. */
4610 nios2_elf32_copy_indirect_symbol (struct bfd_link_info *info,
4611 struct elf_link_hash_entry *dir,
4612 struct elf_link_hash_entry *ind)
4614 struct elf32_nios2_link_hash_entry *edir, *eind;
4616 edir = (struct elf32_nios2_link_hash_entry *) dir;
4617 eind = (struct elf32_nios2_link_hash_entry *) ind;
4619 if (eind->dyn_relocs != NULL)
4621 if (edir->dyn_relocs != NULL)
4623 struct elf32_nios2_dyn_relocs **pp;
4624 struct elf32_nios2_dyn_relocs *p;
4626 /* Add reloc counts against the indirect sym to the direct sym
4627 list. Merge any entries against the same section. */
4628 for (pp = &eind->dyn_relocs; (p = *pp) != NULL; )
4630 struct elf32_nios2_dyn_relocs *q;
4632 for (q = edir->dyn_relocs; q != NULL; q = q->next)
4633 if (q->sec == p->sec)
4635 q->pc_count += p->pc_count;
4636 q->count += p->count;
4643 *pp = edir->dyn_relocs;
4646 edir->dyn_relocs = eind->dyn_relocs;
4647 eind->dyn_relocs = NULL;
4650 if (ind->root.type == bfd_link_hash_indirect
4651 && dir->got.refcount <= 0)
4653 edir->tls_type = eind->tls_type;
4654 eind->tls_type = GOT_UNKNOWN;
4657 edir->got_types_used |= eind->got_types_used;
4659 _bfd_elf_link_hash_copy_indirect (info, dir, ind);
4662 /* Set the right machine number for a NIOS2 ELF file. */
4665 nios2_elf32_object_p (bfd *abfd)
4669 mach = elf_elfheader (abfd)->e_flags;
4674 case EF_NIOS2_ARCH_R1:
4675 bfd_default_set_arch_mach (abfd, bfd_arch_nios2, bfd_mach_nios2r1);
4677 case EF_NIOS2_ARCH_R2:
4678 bfd_default_set_arch_mach (abfd, bfd_arch_nios2, bfd_mach_nios2r2);
4685 /* Implement elf_backend_check_relocs:
4686 Look through the relocs for a section during the first phase. */
4688 nios2_elf32_check_relocs (bfd *abfd, struct bfd_link_info *info,
4689 asection *sec, const Elf_Internal_Rela *relocs)
4692 Elf_Internal_Shdr *symtab_hdr;
4693 struct elf_link_hash_entry **sym_hashes, **sym_hashes_end;
4694 const Elf_Internal_Rela *rel;
4695 const Elf_Internal_Rela *rel_end;
4696 struct elf32_nios2_link_hash_table *htab;
4699 asection *sreloc = NULL;
4700 bfd_signed_vma *local_got_refcounts;
4702 if (info->relocatable)
4705 dynobj = elf_hash_table (info)->dynobj;
4706 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
4707 sym_hashes = elf_sym_hashes (abfd);
4708 sym_hashes_end = (sym_hashes
4709 + symtab_hdr->sh_size / sizeof (Elf32_External_Sym));
4710 if (!elf_bad_symtab (abfd))
4711 sym_hashes_end -= symtab_hdr->sh_info;
4712 local_got_refcounts = elf_local_got_refcounts (abfd);
4714 htab = elf32_nios2_hash_table (info);
4715 sgot = htab->root.sgot;
4716 srelgot = htab->root.srelgot;
4718 rel_end = relocs + sec->reloc_count;
4719 for (rel = relocs; rel < rel_end; rel++)
4721 unsigned int r_type;
4722 struct elf_link_hash_entry *h;
4723 unsigned long r_symndx;
4725 r_symndx = ELF32_R_SYM (rel->r_info);
4726 if (r_symndx < symtab_hdr->sh_info)
4730 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
4731 while (h->root.type == bfd_link_hash_indirect
4732 || h->root.type == bfd_link_hash_warning)
4733 h = (struct elf_link_hash_entry *) h->root.u.i.link;
4735 /* PR15323, ref flags aren't set for references in the same
4737 h->root.non_ir_ref = 1;
4740 r_type = ELF32_R_TYPE (rel->r_info);
4745 case R_NIOS2_GOT_LO:
4746 case R_NIOS2_GOT_HA:
4747 case R_NIOS2_CALL16:
4748 case R_NIOS2_CALL_LO:
4749 case R_NIOS2_CALL_HA:
4750 case R_NIOS2_TLS_GD16:
4751 case R_NIOS2_TLS_IE16:
4752 /* This symbol requires a global offset table entry. */
4754 int tls_type, old_tls_type;
4760 case R_NIOS2_GOT_LO:
4761 case R_NIOS2_GOT_HA:
4762 case R_NIOS2_CALL16:
4763 case R_NIOS2_CALL_LO:
4764 case R_NIOS2_CALL_HA:
4765 tls_type = GOT_NORMAL;
4767 case R_NIOS2_TLS_GD16:
4768 tls_type = GOT_TLS_GD;
4770 case R_NIOS2_TLS_IE16:
4771 tls_type = GOT_TLS_IE;
4777 /* Create the .got section. */
4778 elf_hash_table (info)->dynobj = dynobj = abfd;
4779 nios2_elf32_create_dynamic_sections (dynobj, info);
4784 sgot = htab->root.sgot;
4785 BFD_ASSERT (sgot != NULL);
4789 && (h != NULL || info->shared))
4791 srelgot = htab->root.srelgot;
4792 BFD_ASSERT (srelgot != NULL);
4797 struct elf32_nios2_link_hash_entry *eh
4798 = (struct elf32_nios2_link_hash_entry *)h;
4800 old_tls_type = elf32_nios2_hash_entry(h)->tls_type;
4801 if (r_type == R_NIOS2_CALL16
4802 || r_type == R_NIOS2_CALL_LO
4803 || r_type == R_NIOS2_CALL_HA)
4805 /* Make sure a plt entry is created for this symbol if
4806 it turns out to be a function defined by a dynamic
4811 eh->got_types_used |= CALL_USED;
4814 eh->got_types_used |= GOT_USED;
4818 /* This is a global offset table entry for a local symbol. */
4819 if (local_got_refcounts == NULL)
4823 size = symtab_hdr->sh_info;
4824 size *= (sizeof (bfd_signed_vma) + sizeof (char));
4826 = ((bfd_signed_vma *) bfd_zalloc (abfd, size));
4827 if (local_got_refcounts == NULL)
4829 elf_local_got_refcounts (abfd) = local_got_refcounts;
4830 elf32_nios2_local_got_tls_type (abfd)
4831 = (char *) (local_got_refcounts + symtab_hdr->sh_info);
4833 local_got_refcounts[r_symndx]++;
4834 old_tls_type = elf32_nios2_local_got_tls_type (abfd) [r_symndx];
4837 /* We will already have issued an error message if there is a
4838 TLS / non-TLS mismatch, based on the symbol type. We don't
4839 support any linker relaxations. So just combine any TLS
4841 if (old_tls_type != GOT_UNKNOWN && old_tls_type != GOT_NORMAL
4842 && tls_type != GOT_NORMAL)
4843 tls_type |= old_tls_type;
4845 if (old_tls_type != tls_type)
4848 elf32_nios2_hash_entry (h)->tls_type = tls_type;
4850 elf32_nios2_local_got_tls_type (abfd) [r_symndx] = tls_type;
4854 case R_NIOS2_TLS_LDM16:
4855 if (r_type == R_NIOS2_TLS_LDM16)
4856 htab->tls_ldm_got.refcount++;
4858 if (htab->root.sgot == NULL)
4860 if (htab->root.dynobj == NULL)
4861 htab->root.dynobj = abfd;
4862 if (!create_got_section (htab->root.dynobj, info))
4867 /* This relocation describes the C++ object vtable hierarchy.
4868 Reconstruct it for later use during GC. */
4869 case R_NIOS2_GNU_VTINHERIT:
4870 if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
4874 /* This relocation describes which C++ vtable entries are actually
4875 used. Record for later use during GC. */
4876 case R_NIOS2_GNU_VTENTRY:
4877 if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
4881 case R_NIOS2_BFD_RELOC_32:
4882 case R_NIOS2_CALL26:
4883 case R_NIOS2_CALL26_NOAT:
4884 case R_NIOS2_HIADJ16:
4889 /* If this reloc is in a read-only section, we might
4890 need a copy reloc. We can't check reliably at this
4891 stage whether the section is read-only, as input
4892 sections have not yet been mapped to output sections.
4893 Tentatively set the flag for now, and correct in
4894 adjust_dynamic_symbol. */
4898 /* Make sure a plt entry is created for this symbol if it
4899 turns out to be a function defined by a dynamic object. */
4902 if (r_type == R_NIOS2_CALL26 || r_type == R_NIOS2_CALL26_NOAT)
4906 /* If we are creating a shared library, we need to copy the
4907 reloc into the shared library. */
4909 && (sec->flags & SEC_ALLOC) != 0
4910 && (r_type == R_NIOS2_BFD_RELOC_32
4911 || (h != NULL && ! h->needs_plt
4912 && (! info->symbolic || ! h->def_regular))))
4914 struct elf32_nios2_dyn_relocs *p;
4915 struct elf32_nios2_dyn_relocs **head;
4917 /* When creating a shared object, we must copy these
4918 reloc types into the output file. We create a reloc
4919 section in dynobj and make room for this reloc. */
4922 sreloc = _bfd_elf_make_dynamic_reloc_section
4923 (sec, dynobj, 2, abfd, TRUE);
4928 /* If this is a global symbol, we count the number of
4929 relocations we need for this symbol. */
4931 head = &((struct elf32_nios2_link_hash_entry *) h)->dyn_relocs;
4934 /* Track dynamic relocs needed for local syms too.
4935 We really need local syms available to do this
4940 Elf_Internal_Sym *isym;
4942 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
4947 s = bfd_section_from_elf_index (abfd, isym->st_shndx);
4951 vpp = &elf_section_data (s)->local_dynrel;
4952 head = (struct elf32_nios2_dyn_relocs **) vpp;
4956 if (p == NULL || p->sec != sec)
4958 bfd_size_type amt = sizeof *p;
4959 p = ((struct elf32_nios2_dyn_relocs *)
4960 bfd_alloc (htab->root.dynobj, amt));
4981 /* Implement elf_backend_gc_mark_hook:
4982 Return the section that should be marked against GC for a given
4985 nios2_elf32_gc_mark_hook (asection *sec,
4986 struct bfd_link_info *info,
4987 Elf_Internal_Rela *rel,
4988 struct elf_link_hash_entry *h,
4989 Elf_Internal_Sym *sym)
4992 switch (ELF32_R_TYPE (rel->r_info))
4994 case R_NIOS2_GNU_VTINHERIT:
4995 case R_NIOS2_GNU_VTENTRY:
4998 return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
5001 /* Implement elf_backend_gc_sweep_hook:
5002 Update the got entry reference counts for the section being removed. */
5004 nios2_elf32_gc_sweep_hook (bfd *abfd,
5005 struct bfd_link_info *info,
5007 const Elf_Internal_Rela *relocs)
5009 Elf_Internal_Shdr *symtab_hdr;
5010 struct elf_link_hash_entry **sym_hashes;
5011 bfd_signed_vma *local_got_refcounts;
5012 const Elf_Internal_Rela *rel, *relend;
5015 if (info->relocatable)
5018 elf_section_data (sec)->local_dynrel = NULL;
5020 dynobj = elf_hash_table (info)->dynobj;
5024 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
5025 sym_hashes = elf_sym_hashes (abfd);
5026 local_got_refcounts = elf_local_got_refcounts (abfd);
5028 relend = relocs + sec->reloc_count;
5029 for (rel = relocs; rel < relend; rel++)
5031 unsigned long r_symndx;
5032 struct elf_link_hash_entry *h = NULL;
5035 r_symndx = ELF32_R_SYM (rel->r_info);
5036 if (r_symndx >= symtab_hdr->sh_info)
5038 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
5039 while (h->root.type == bfd_link_hash_indirect
5040 || h->root.type == bfd_link_hash_warning)
5041 h = (struct elf_link_hash_entry *) h->root.u.i.link;
5044 r_type = ELF32_R_TYPE (rel->r_info);
5048 case R_NIOS2_GOT_LO:
5049 case R_NIOS2_GOT_HA:
5050 case R_NIOS2_CALL16:
5051 case R_NIOS2_CALL_LO:
5052 case R_NIOS2_CALL_HA:
5055 if (h->got.refcount > 0)
5058 else if (local_got_refcounts != NULL)
5060 if (local_got_refcounts[r_symndx] > 0)
5061 --local_got_refcounts[r_symndx];
5065 case R_NIOS2_PCREL_LO:
5066 case R_NIOS2_PCREL_HA:
5067 case R_NIOS2_BFD_RELOC_32:
5068 case R_NIOS2_CALL26:
5069 case R_NIOS2_CALL26_NOAT:
5072 struct elf32_nios2_link_hash_entry *eh;
5073 struct elf32_nios2_dyn_relocs **pp;
5074 struct elf32_nios2_dyn_relocs *p;
5076 eh = (struct elf32_nios2_link_hash_entry *) h;
5078 if (h->plt.refcount > 0)
5081 if (r_type == R_NIOS2_PCREL_LO || r_type == R_NIOS2_PCREL_HA
5082 || r_type == R_NIOS2_BFD_RELOC_32)
5084 for (pp = &eh->dyn_relocs; (p = *pp) != NULL;
5105 /* Implement elf_backend_finish_dynamic_symbols:
5106 Finish up dynamic symbol handling. We set the contents of various
5107 dynamic sections here. */
5109 nios2_elf32_finish_dynamic_symbol (bfd *output_bfd,
5110 struct bfd_link_info *info,
5111 struct elf_link_hash_entry *h,
5112 Elf_Internal_Sym *sym)
5114 struct elf32_nios2_link_hash_table *htab;
5115 struct elf32_nios2_link_hash_entry *eh
5116 = (struct elf32_nios2_link_hash_entry *)h;
5119 htab = elf32_nios2_hash_table (info);
5121 if (h->plt.offset != (bfd_vma) -1)
5128 Elf_Internal_Rela rela;
5130 bfd_vma got_address;
5132 /* This symbol has an entry in the procedure linkage table. Set
5134 BFD_ASSERT (h->dynindx != -1);
5135 splt = htab->root.splt;
5136 sgotplt = htab->root.sgotplt;
5137 srela = htab->root.srelplt;
5138 BFD_ASSERT (splt != NULL && sgotplt != NULL && srela != NULL);
5140 /* Emit the PLT entry. */
5143 nios2_elf32_install_data (splt, nios2_so_plt_entry, h->plt.offset,
5145 plt_index = (h->plt.offset - 24) / 12;
5146 got_offset = (plt_index + 3) * 4;
5147 nios2_elf32_install_imm16 (splt, h->plt.offset,
5148 hiadj(plt_index * 4));
5149 nios2_elf32_install_imm16 (splt, h->plt.offset + 4,
5150 (plt_index * 4) & 0xffff);
5151 nios2_elf32_install_imm16 (splt, h->plt.offset + 8,
5152 0xfff4 - h->plt.offset);
5153 got_address = (sgotplt->output_section->vma + sgotplt->output_offset
5156 /* Fill in the entry in the global offset table. There are no
5157 res_n slots for a shared object PLT, instead the .got.plt entries
5158 point to the PLT entries. */
5159 bfd_put_32 (output_bfd,
5160 splt->output_section->vma + splt->output_offset
5161 + h->plt.offset, sgotplt->contents + got_offset);
5165 plt_index = (h->plt.offset - 28 - htab->res_n_size) / 12;
5166 got_offset = (plt_index + 3) * 4;
5168 nios2_elf32_install_data (splt, nios2_plt_entry, h->plt.offset, 3);
5169 got_address = (sgotplt->output_section->vma + sgotplt->output_offset
5171 nios2_elf32_install_imm16 (splt, h->plt.offset, hiadj(got_address));
5172 nios2_elf32_install_imm16 (splt, h->plt.offset + 4,
5173 got_address & 0xffff);
5175 /* Fill in the entry in the global offset table. */
5176 bfd_put_32 (output_bfd,
5177 splt->output_section->vma + splt->output_offset
5178 + plt_index * 4, sgotplt->contents + got_offset);
5181 /* Fill in the entry in the .rela.plt section. */
5182 rela.r_offset = got_address;
5183 rela.r_info = ELF32_R_INFO (h->dynindx, R_NIOS2_JUMP_SLOT);
5185 loc = srela->contents + plt_index * sizeof (Elf32_External_Rela);
5186 bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
5188 if (!h->def_regular)
5190 /* Mark the symbol as undefined, rather than as defined in
5191 the .plt section. Leave the value alone. */
5192 sym->st_shndx = SHN_UNDEF;
5193 /* If the symbol is weak, we do need to clear the value.
5194 Otherwise, the PLT entry would provide a definition for
5195 the symbol even if the symbol wasn't defined anywhere,
5196 and so the symbol would never be NULL. */
5197 if (!h->ref_regular_nonweak)
5202 use_plt = (eh->got_types_used == CALL_USED
5203 && h->plt.offset != (bfd_vma) -1);
5205 if (!use_plt && h->got.offset != (bfd_vma) -1
5206 && (elf32_nios2_hash_entry (h)->tls_type & GOT_TLS_GD) == 0
5207 && (elf32_nios2_hash_entry (h)->tls_type & GOT_TLS_IE) == 0)
5211 Elf_Internal_Rela rela;
5215 /* This symbol has an entry in the global offset table. Set it
5217 sgot = htab->root.sgot;
5218 srela = htab->root.srelgot;
5219 BFD_ASSERT (sgot != NULL && srela != NULL);
5221 offset = (h->got.offset & ~(bfd_vma) 1);
5222 rela.r_offset = (sgot->output_section->vma
5223 + sgot->output_offset + offset);
5225 /* If this is a -Bsymbolic link, and the symbol is defined
5226 locally, we just want to emit a RELATIVE reloc. Likewise if
5227 the symbol was forced to be local because of a version file.
5228 The entry in the global offset table will already have been
5229 initialized in the relocate_section function. */
5231 if (info->shared && SYMBOL_REFERENCES_LOCAL (info, h))
5233 rela.r_info = ELF32_R_INFO (0, R_NIOS2_RELATIVE);
5234 rela.r_addend = bfd_get_signed_32 (output_bfd,
5235 (sgot->contents + offset));
5236 bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + offset);
5240 bfd_put_32 (output_bfd, (bfd_vma) 0,
5241 sgot->contents + offset);
5242 rela.r_info = ELF32_R_INFO (h->dynindx, R_NIOS2_GLOB_DAT);
5246 loc = srela->contents;
5247 loc += srela->reloc_count++ * sizeof (Elf32_External_Rela);
5248 bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
5251 if (use_plt && h->got.offset != (bfd_vma) -1)
5253 bfd_vma offset = (h->got.offset & ~(bfd_vma) 1);
5254 asection *sgot = htab->root.sgot;
5255 asection *splt = htab->root.splt;
5256 bfd_put_32 (output_bfd, (splt->output_section->vma + splt->output_offset
5258 sgot->contents + offset);
5264 Elf_Internal_Rela rela;
5267 /* This symbol needs a copy reloc. Set it up. */
5268 BFD_ASSERT (h->dynindx != -1
5269 && (h->root.type == bfd_link_hash_defined
5270 || h->root.type == bfd_link_hash_defweak));
5273 BFD_ASSERT (s != NULL);
5275 rela.r_offset = (h->root.u.def.value
5276 + h->root.u.def.section->output_section->vma
5277 + h->root.u.def.section->output_offset);
5278 rela.r_info = ELF32_R_INFO (h->dynindx, R_NIOS2_COPY);
5280 loc = s->contents + s->reloc_count++ * sizeof (Elf32_External_Rela);
5281 bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
5284 /* Mark _DYNAMIC, _GLOBAL_OFFSET_TABLE_, and _gp_got as absolute. */
5285 if (strcmp (h->root.root.string, "_DYNAMIC") == 0
5286 || h == elf_hash_table (info)->hgot
5287 || h == elf32_nios2_hash_table (info)->h_gp_got)
5288 sym->st_shndx = SHN_ABS;
5293 /* Implement elf_backend_finish_dynamic_sections. */
5295 nios2_elf32_finish_dynamic_sections (bfd *output_bfd,
5296 struct bfd_link_info *info)
5301 struct elf32_nios2_link_hash_table *htab;
5303 htab = elf32_nios2_hash_table (info);
5304 dynobj = elf_hash_table (info)->dynobj;
5305 sgotplt = htab->root.sgotplt;
5306 BFD_ASSERT (sgotplt != NULL);
5307 sdyn = bfd_get_linker_section (dynobj, ".dynamic");
5309 if (elf_hash_table (info)->dynamic_sections_created)
5312 Elf32_External_Dyn *dyncon, *dynconend;
5314 splt = htab->root.splt;
5315 BFD_ASSERT (splt != NULL && sdyn != NULL);
5317 dyncon = (Elf32_External_Dyn *) sdyn->contents;
5318 dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
5319 for (; dyncon < dynconend; dyncon++)
5321 Elf_Internal_Dyn dyn;
5324 bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
5332 s = htab->root.sgot;
5333 BFD_ASSERT (s != NULL);
5334 dyn.d_un.d_ptr = s->output_section->vma;
5335 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
5339 s = htab->root.srelplt;
5340 BFD_ASSERT (s != NULL);
5341 dyn.d_un.d_ptr = s->output_section->vma;
5342 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
5346 s = htab->root.srelplt;
5347 BFD_ASSERT (s != NULL);
5348 dyn.d_un.d_val = s->size;
5349 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
5353 /* The procedure linkage table relocs (DT_JMPREL) should
5354 not be included in the overall relocs (DT_RELA).
5355 Therefore, we override the DT_RELASZ entry here to
5356 make it not include the JMPREL relocs. Since the
5357 linker script arranges for .rela.plt to follow all
5358 other relocation sections, we don't have to worry
5359 about changing the DT_RELA entry. */
5360 s = htab->root.srelplt;
5362 dyn.d_un.d_val -= s->size;
5363 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
5367 s = htab->root.sgot;
5368 BFD_ASSERT (s != NULL);
5369 dyn.d_un.d_ptr = s->output_section->vma + 0x7ff0;
5370 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
5375 /* Fill in the first entry in the procedure linkage table. */
5378 bfd_vma got_address = (sgotplt->output_section->vma
5379 + sgotplt->output_offset);
5382 bfd_vma corrected = got_address - (splt->output_section->vma
5383 + splt->output_offset + 4);
5384 nios2_elf32_install_data (splt, nios2_so_plt0_entry, 0, 6);
5385 nios2_elf32_install_imm16 (splt, 4, hiadj (corrected));
5386 nios2_elf32_install_imm16 (splt, 12, (corrected & 0xffff) + 4);
5387 nios2_elf32_install_imm16 (splt, 16, (corrected & 0xffff) + 8);
5391 /* Divide by 4 here, not 3 because we already corrected for the
5393 bfd_vma res_size = (splt->size - 28) / 4;
5394 bfd_vma res_start = (splt->output_section->vma
5395 + splt->output_offset);
5398 for (res_offset = 0; res_offset < res_size; res_offset += 4)
5399 bfd_put_32 (output_bfd,
5400 6 | ((res_size - (res_offset + 4)) << 6),
5401 splt->contents + res_offset);
5403 nios2_elf32_install_data (splt, nios2_plt0_entry, res_size, 7);
5404 nios2_elf32_install_imm16 (splt, res_size, hiadj (res_start));
5405 nios2_elf32_install_imm16 (splt, res_size + 4,
5406 res_start & 0xffff);
5407 nios2_elf32_install_imm16 (splt, res_size + 12,
5408 hiadj (got_address));
5409 nios2_elf32_install_imm16 (splt, res_size + 16,
5410 (got_address & 0xffff) + 4);
5411 nios2_elf32_install_imm16 (splt, res_size + 20,
5412 (got_address & 0xffff) + 8);
5416 /* Fill in the first three entries in the global offset table. */
5417 if (sgotplt->size > 0)
5420 bfd_put_32 (output_bfd, (bfd_vma) 0, sgotplt->contents);
5422 bfd_put_32 (output_bfd,
5423 sdyn->output_section->vma + sdyn->output_offset,
5425 bfd_put_32 (output_bfd, (bfd_vma) 0, sgotplt->contents + 4);
5426 bfd_put_32 (output_bfd, (bfd_vma) 0, sgotplt->contents + 8);
5429 elf_section_data (sgotplt->output_section)->this_hdr.sh_entsize = 4;
5434 /* Implement elf_backend_adjust_dynamic_symbol:
5435 Adjust a symbol defined by a dynamic object and referenced by a
5436 regular object. The current definition is in some section of the
5437 dynamic object, but we're not including those sections. We have to
5438 change the definition to something the rest of the link can
5441 nios2_elf32_adjust_dynamic_symbol (struct bfd_link_info *info,
5442 struct elf_link_hash_entry *h)
5444 struct elf32_nios2_link_hash_table *htab;
5449 htab = elf32_nios2_hash_table (info);
5450 dynobj = elf_hash_table (info)->dynobj;
5452 /* Make sure we know what is going on here. */
5453 BFD_ASSERT (dynobj != NULL
5455 || h->u.weakdef != NULL
5458 && !h->def_regular)));
5460 /* If this is a function, put it in the procedure linkage table. We
5461 will fill in the contents of the procedure linkage table later,
5462 when we know the address of the .got section. */
5463 if (h->type == STT_FUNC || h->needs_plt)
5465 if (h->plt.refcount <= 0
5466 || SYMBOL_CALLS_LOCAL (info, h)
5467 || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
5468 && h->root.type == bfd_link_hash_undefweak))
5470 /* This case can occur if we saw a PLT reloc in an input
5471 file, but the symbol was never referred to by a dynamic
5472 object, or if all references were garbage collected. In
5473 such a case, we don't actually need to build a procedure
5474 linkage table, and we can just do a PCREL reloc instead. */
5475 h->plt.offset = (bfd_vma) -1;
5482 /* Reinitialize the plt offset now that it is not used as a reference
5484 h->plt.offset = (bfd_vma) -1;
5486 /* If this is a weak symbol, and there is a real definition, the
5487 processor independent code will have arranged for us to see the
5488 real definition first, and we can just use the same value. */
5489 if (h->u.weakdef != NULL)
5491 BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
5492 || h->u.weakdef->root.type == bfd_link_hash_defweak);
5493 h->root.u.def.section = h->u.weakdef->root.u.def.section;
5494 h->root.u.def.value = h->u.weakdef->root.u.def.value;
5498 /* If there are no non-GOT references, we do not need a copy
5500 if (!h->non_got_ref)
5503 /* This is a reference to a symbol defined by a dynamic object which
5505 If we are creating a shared library, we must presume that the
5506 only references to the symbol are via the global offset table.
5507 For such cases we need not do anything here; the relocations will
5508 be handled correctly by relocate_section. */
5514 (*_bfd_error_handler) (_("dynamic variable `%s' is zero size"),
5515 h->root.root.string);
5519 /* We must allocate the symbol in our .dynbss section, which will
5520 become part of the .bss section of the executable. There will be
5521 an entry for this symbol in the .dynsym section. The dynamic
5522 object will contain position independent code, so all references
5523 from the dynamic object to this symbol will go through the global
5524 offset table. The dynamic linker will use the .dynsym entry to
5525 determine the address it must put in the global offset table, so
5526 both the dynamic object and the regular object will refer to the
5527 same memory location for the variable. */
5529 BFD_ASSERT (s != NULL);
5531 /* We must generate a R_NIOS2_COPY reloc to tell the dynamic linker to
5532 copy the initial value out of the dynamic object and into the
5533 runtime process image. We need to remember the offset into the
5534 .rela.bss section we are going to use. */
5535 if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
5539 srel = htab->srelbss;
5540 BFD_ASSERT (srel != NULL);
5541 srel->size += sizeof (Elf32_External_Rela);
5545 align2 = bfd_log2 (h->size);
5546 if (align2 > h->root.u.def.section->alignment_power)
5547 align2 = h->root.u.def.section->alignment_power;
5550 s->size = BFD_ALIGN (s->size, (bfd_size_type)1 << align2);
5551 if (align2 > bfd_get_section_alignment (dynobj, s)
5552 && !bfd_set_section_alignment (dynobj, s, align2))
5555 /* Define the symbol as being at this point in the section. */
5556 h->root.u.def.section = s;
5557 h->root.u.def.value = s->size;
5559 /* Increment the section size to make room for the symbol. */
5565 /* Worker function for nios2_elf32_size_dynamic_sections. */
5567 adjust_dynrelocs (struct elf_link_hash_entry *h, PTR inf)
5569 struct bfd_link_info *info;
5570 struct elf32_nios2_link_hash_table *htab;
5572 if (h->root.type == bfd_link_hash_indirect)
5575 if (h->root.type == bfd_link_hash_warning)
5576 /* When warning symbols are created, they **replace** the "real"
5577 entry in the hash table, thus we never get to see the real
5578 symbol in a hash traversal. So look at it now. */
5579 h = (struct elf_link_hash_entry *) h->root.u.i.link;
5581 info = (struct bfd_link_info *) inf;
5582 htab = elf32_nios2_hash_table (info);
5584 if (h->plt.offset != (bfd_vma)-1)
5585 h->plt.offset += htab->res_n_size;
5586 if (htab->root.splt == h->root.u.def.section)
5587 h->root.u.def.value += htab->res_n_size;
5592 /* Another worker function for nios2_elf32_size_dynamic_sections.
5593 Allocate space in .plt, .got and associated reloc sections for
5596 allocate_dynrelocs (struct elf_link_hash_entry *h, PTR inf)
5598 struct bfd_link_info *info;
5599 struct elf32_nios2_link_hash_table *htab;
5600 struct elf32_nios2_link_hash_entry *eh;
5601 struct elf32_nios2_dyn_relocs *p;
5604 if (h->root.type == bfd_link_hash_indirect)
5607 if (h->root.type == bfd_link_hash_warning)
5608 /* When warning symbols are created, they **replace** the "real"
5609 entry in the hash table, thus we never get to see the real
5610 symbol in a hash traversal. So look at it now. */
5611 h = (struct elf_link_hash_entry *) h->root.u.i.link;
5613 info = (struct bfd_link_info *) inf;
5614 htab = elf32_nios2_hash_table (info);
5616 if (htab->root.dynamic_sections_created
5617 && h->plt.refcount > 0)
5619 /* Make sure this symbol is output as a dynamic symbol.
5620 Undefined weak syms won't yet be marked as dynamic. */
5621 if (h->dynindx == -1
5623 && !bfd_elf_link_record_dynamic_symbol (info, h))
5626 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, info->shared, h))
5628 asection *s = htab->root.splt;
5630 /* Allocate room for the header. */
5639 h->plt.offset = s->size;
5641 /* If this symbol is not defined in a regular file, and we are
5642 not generating a shared library, then set the symbol to this
5643 location in the .plt. This is required to make function
5644 pointers compare as equal between the normal executable and
5645 the shared library. */
5649 h->root.u.def.section = s;
5650 h->root.u.def.value = h->plt.offset;
5653 /* Make room for this entry. */
5656 /* We also need to make an entry in the .rela.plt section. */
5657 htab->root.srelplt->size += sizeof (Elf32_External_Rela);
5659 /* And the .got.plt section. */
5660 htab->root.sgotplt->size += 4;
5664 h->plt.offset = (bfd_vma) -1;
5670 h->plt.offset = (bfd_vma) -1;
5674 eh = (struct elf32_nios2_link_hash_entry *) h;
5675 use_plt = (eh->got_types_used == CALL_USED
5676 && h->plt.offset != (bfd_vma) -1);
5678 if (h->got.refcount > 0)
5682 int tls_type = eh->tls_type;
5685 /* Make sure this symbol is output as a dynamic symbol.
5686 Undefined weak syms won't yet be marked as dynamic. */
5687 if (h->dynindx == -1
5689 && !bfd_elf_link_record_dynamic_symbol (info, h))
5692 s = htab->root.sgot;
5693 h->got.offset = s->size;
5695 if (tls_type == GOT_UNKNOWN)
5698 if (tls_type == GOT_NORMAL)
5699 /* Non-TLS symbols need one GOT slot. */
5703 if (tls_type & GOT_TLS_GD)
5704 /* R_NIOS2_TLS_GD16 needs 2 consecutive GOT slots. */
5706 if (tls_type & GOT_TLS_IE)
5707 /* R_NIOS2_TLS_IE16 needs one GOT slot. */
5711 dyn = htab->root.dynamic_sections_created;
5714 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
5716 || !SYMBOL_REFERENCES_LOCAL (info, h)))
5719 if (tls_type != GOT_NORMAL
5720 && (info->shared || indx != 0)
5721 && (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
5722 || h->root.type != bfd_link_hash_undefweak))
5724 if (tls_type & GOT_TLS_IE)
5725 htab->root.srelgot->size += sizeof (Elf32_External_Rela);
5727 if (tls_type & GOT_TLS_GD)
5728 htab->root.srelgot->size += sizeof (Elf32_External_Rela);
5730 if ((tls_type & GOT_TLS_GD) && indx != 0)
5731 htab->root.srelgot->size += sizeof (Elf32_External_Rela);
5733 else if ((ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
5734 || h->root.type != bfd_link_hash_undefweak)
5737 || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h)))
5738 htab->root.srelgot->size += sizeof (Elf32_External_Rela);
5741 h->got.offset = (bfd_vma) -1;
5743 if (eh->dyn_relocs == NULL)
5746 /* In the shared -Bsymbolic case, discard space allocated for
5747 dynamic pc-relative relocs against symbols which turn out to be
5748 defined in regular objects. For the normal shared case, discard
5749 space for pc-relative relocs that have become local due to symbol
5750 visibility changes. */
5755 && (h->forced_local || info->symbolic))
5757 struct elf32_nios2_dyn_relocs **pp;
5759 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
5761 p->count -= p->pc_count;
5770 /* Also discard relocs on undefined weak syms with non-default
5772 if (eh->dyn_relocs != NULL
5773 && h->root.type == bfd_link_hash_undefweak)
5775 if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
5776 eh->dyn_relocs = NULL;
5778 /* Make sure undefined weak symbols are output as a dynamic
5780 else if (h->dynindx == -1
5782 && !bfd_elf_link_record_dynamic_symbol (info, h))
5788 /* For the non-shared case, discard space for relocs against
5789 symbols which turn out to need copy relocs or are not
5793 && ((h->def_dynamic && !h->def_regular)
5794 || (htab->root.dynamic_sections_created
5795 && (h->root.type == bfd_link_hash_undefweak
5796 || h->root.type == bfd_link_hash_undefined))))
5798 /* Make sure this symbol is output as a dynamic symbol.
5799 Undefined weak syms won't yet be marked as dynamic. */
5800 if (h->dynindx == -1
5802 && !bfd_elf_link_record_dynamic_symbol (info, h))
5805 /* If that succeeded, we know we'll be keeping all the
5807 if (h->dynindx != -1)
5811 eh->dyn_relocs = NULL;
5816 /* Finally, allocate space. */
5817 for (p = eh->dyn_relocs; p != NULL; p = p->next)
5819 asection *sreloc = elf_section_data (p->sec)->sreloc;
5820 sreloc->size += p->count * sizeof (Elf32_External_Rela);
5826 /* Implement elf_backend_size_dynamic_sections:
5827 Set the sizes of the dynamic sections. */
5829 nios2_elf32_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
5830 struct bfd_link_info *info)
5838 struct elf32_nios2_link_hash_table *htab;
5840 htab = elf32_nios2_hash_table (info);
5841 dynobj = elf_hash_table (info)->dynobj;
5842 BFD_ASSERT (dynobj != NULL);
5844 htab->res_n_size = 0;
5845 if (elf_hash_table (info)->dynamic_sections_created)
5847 /* Set the contents of the .interp section to the interpreter. */
5848 if (info->executable)
5850 s = bfd_get_linker_section (dynobj, ".interp");
5851 BFD_ASSERT (s != NULL);
5852 s->size = sizeof ELF_DYNAMIC_INTERPRETER;
5853 s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
5858 /* We may have created entries in the .rela.got section.
5859 However, if we are not creating the dynamic sections, we will
5860 not actually use these entries. Reset the size of .rela.got,
5861 which will cause it to get stripped from the output file
5863 s = htab->root.srelgot;
5868 /* Set up .got offsets for local syms, and space for local dynamic
5870 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
5872 bfd_signed_vma *local_got;
5873 bfd_signed_vma *end_local_got;
5874 char *local_tls_type;
5875 bfd_size_type locsymcount;
5876 Elf_Internal_Shdr *symtab_hdr;
5879 if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour)
5882 for (s = ibfd->sections; s != NULL; s = s->next)
5884 struct elf32_nios2_dyn_relocs *p;
5886 for (p = elf_section_data (s)->local_dynrel; p != NULL; p = p->next)
5888 if (!bfd_is_abs_section (p->sec)
5889 && bfd_is_abs_section (p->sec->output_section))
5891 /* Input section has been discarded, either because
5892 it is a copy of a linkonce section or due to
5893 linker script /DISCARD/, so we'll be discarding
5896 else if (p->count != 0)
5898 srel = elf_section_data (p->sec)->sreloc;
5899 srel->size += p->count * sizeof (Elf32_External_Rela);
5900 if ((p->sec->output_section->flags & SEC_READONLY) != 0)
5901 info->flags |= DF_TEXTREL;
5906 local_got = elf_local_got_refcounts (ibfd);
5910 symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
5911 locsymcount = symtab_hdr->sh_info;
5912 end_local_got = local_got + locsymcount;
5913 local_tls_type = elf32_nios2_local_got_tls_type (ibfd);
5914 s = htab->root.sgot;
5915 srel = htab->root.srelgot;
5916 for (; local_got < end_local_got; ++local_got, ++local_tls_type)
5920 *local_got = s->size;
5921 if (*local_tls_type & GOT_TLS_GD)
5922 /* TLS_GD relocs need an 8-byte structure in the GOT. */
5924 if (*local_tls_type & GOT_TLS_IE)
5926 if (*local_tls_type == GOT_NORMAL)
5929 if (info->shared || *local_tls_type == GOT_TLS_GD)
5930 srel->size += sizeof (Elf32_External_Rela);
5933 *local_got = (bfd_vma) -1;
5937 if (htab->tls_ldm_got.refcount > 0)
5939 /* Allocate two GOT entries and one dynamic relocation (if necessary)
5940 for R_NIOS2_TLS_LDM16 relocations. */
5941 htab->tls_ldm_got.offset = htab->root.sgot->size;
5942 htab->root.sgot->size += 8;
5944 htab->root.srelgot->size += sizeof (Elf32_External_Rela);
5947 htab->tls_ldm_got.offset = -1;
5949 /* Allocate global sym .plt and .got entries, and space for global
5950 sym dynamic relocs. */
5951 elf_link_hash_traverse (& htab->root, allocate_dynrelocs, info);
5953 if (elf_hash_table (info)->dynamic_sections_created)
5955 /* If the .got section is more than 0x8000 bytes, we add
5956 0x8000 to the value of _gp_got, so that 16-bit relocations
5957 have a greater chance of working. */
5958 if (htab->root.sgot->size >= 0x8000
5959 && elf32_nios2_hash_table (info)->h_gp_got->root.u.def.value == 0)
5960 elf32_nios2_hash_table (info)->h_gp_got->root.u.def.value = 0x8000;
5963 /* The check_relocs and adjust_dynamic_symbol entry points have
5964 determined the sizes of the various dynamic sections. Allocate
5969 for (s = dynobj->sections; s != NULL; s = s->next)
5973 if ((s->flags & SEC_LINKER_CREATED) == 0)
5976 /* It's OK to base decisions on the section name, because none
5977 of the dynobj section names depend upon the input files. */
5978 name = bfd_get_section_name (dynobj, s);
5980 if (strcmp (name, ".plt") == 0)
5982 /* Remember whether there is a PLT. */
5985 /* Correct for the number of res_N branches. */
5986 if (plt && !info->shared)
5988 htab->res_n_size = (s->size-28) / 3;
5989 s->size += htab->res_n_size;
5992 else if (CONST_STRNEQ (name, ".rela"))
5998 /* We use the reloc_count field as a counter if we need
5999 to copy relocs into the output file. */
6003 else if (CONST_STRNEQ (name, ".got"))
6005 else if (strcmp (name, ".dynbss") != 0)
6006 /* It's not one of our sections, so don't allocate space. */
6011 /* If we don't need this section, strip it from the
6012 output file. This is mostly to handle .rela.bss and
6013 .rela.plt. We must create both sections in
6014 create_dynamic_sections, because they must be created
6015 before the linker maps input sections to output
6016 sections. The linker does that before
6017 adjust_dynamic_symbol is called, and it is that
6018 function which decides whether anything needs to go
6019 into these sections. */
6020 s->flags |= SEC_EXCLUDE;
6024 if ((s->flags & SEC_HAS_CONTENTS) == 0)
6027 /* Allocate memory for the section contents. */
6028 /* FIXME: This should be a call to bfd_alloc not bfd_zalloc.
6029 Unused entries should be reclaimed before the section's contents
6030 are written out, but at the moment this does not happen. Thus in
6031 order to prevent writing out garbage, we initialize the section's
6032 contents to zero. */
6033 s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->size);
6034 if (s->contents == NULL)
6038 /* Adjust dynamic symbols that point to the plt to account for the
6039 now-known number of resN slots. */
6040 if (htab->res_n_size)
6041 elf_link_hash_traverse (& htab->root, adjust_dynrelocs, info);
6043 if (elf_hash_table (info)->dynamic_sections_created)
6045 /* Add some entries to the .dynamic section. We fill in the
6046 values later, in elf_nios2_finish_dynamic_sections, but we
6047 must add the entries now so that we get the correct size for
6048 the .dynamic section. The DT_DEBUG entry is filled in by the
6049 dynamic linker and used by the debugger. */
6050 #define add_dynamic_entry(TAG, VAL) \
6051 _bfd_elf_add_dynamic_entry (info, TAG, VAL)
6053 if (!info->shared && !add_dynamic_entry (DT_DEBUG, 0))
6056 if (got && !add_dynamic_entry (DT_PLTGOT, 0))
6060 && (!add_dynamic_entry (DT_PLTRELSZ, 0)
6061 || !add_dynamic_entry (DT_PLTREL, DT_RELA)
6062 || !add_dynamic_entry (DT_JMPREL, 0)))
6066 && (!add_dynamic_entry (DT_RELA, 0)
6067 || !add_dynamic_entry (DT_RELASZ, 0)
6068 || !add_dynamic_entry (DT_RELAENT, sizeof (Elf32_External_Rela))))
6071 if (!info->shared && !add_dynamic_entry (DT_NIOS2_GP, 0))
6074 if ((info->flags & DF_TEXTREL) != 0
6075 && !add_dynamic_entry (DT_TEXTREL, 0))
6078 #undef add_dynamic_entry
6083 /* Free the derived linker hash table. */
6085 nios2_elf32_link_hash_table_free (bfd *obfd)
6087 struct elf32_nios2_link_hash_table *htab
6088 = (struct elf32_nios2_link_hash_table *) obfd->link.hash;
6090 bfd_hash_table_free (&htab->bstab);
6091 _bfd_elf_link_hash_table_free (obfd);
6094 /* Implement bfd_elf32_bfd_link_hash_table_create. */
6095 static struct bfd_link_hash_table *
6096 nios2_elf32_link_hash_table_create (bfd *abfd)
6098 struct elf32_nios2_link_hash_table *ret;
6099 bfd_size_type amt = sizeof (struct elf32_nios2_link_hash_table);
6101 ret = bfd_zmalloc (amt);
6105 if (!_bfd_elf_link_hash_table_init (&ret->root, abfd,
6108 elf32_nios2_link_hash_entry),
6115 /* Init the stub hash table too. */
6116 if (!bfd_hash_table_init (&ret->bstab, stub_hash_newfunc,
6117 sizeof (struct elf32_nios2_stub_hash_entry)))
6119 _bfd_elf_link_hash_table_free (abfd);
6122 ret->root.root.hash_table_free = nios2_elf32_link_hash_table_free;
6124 return &ret->root.root;
6127 /* Implement elf_backend_reloc_type_class. */
6128 static enum elf_reloc_type_class
6129 nios2_elf32_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED,
6130 const asection *rel_sec ATTRIBUTE_UNUSED,
6131 const Elf_Internal_Rela *rela)
6133 switch ((int) ELF32_R_TYPE (rela->r_info))
6135 case R_NIOS2_RELATIVE:
6136 return reloc_class_relative;
6137 case R_NIOS2_JUMP_SLOT:
6138 return reloc_class_plt;
6140 return reloc_class_copy;
6142 return reloc_class_normal;
6146 /* Return 1 if target is one of ours. */
6148 is_nios2_elf_target (const struct bfd_target *targ)
6150 return (targ == &nios2_elf32_le_vec
6151 || targ == &nios2_elf32_be_vec);
6154 /* Implement elf_backend_add_symbol_hook.
6155 This hook is called by the linker when adding symbols from an object
6156 file. We use it to put .comm items in .sbss, and not .bss. */
6158 nios2_elf_add_symbol_hook (bfd *abfd,
6159 struct bfd_link_info *info,
6160 Elf_Internal_Sym *sym,
6161 const char **namep ATTRIBUTE_UNUSED,
6162 flagword *flagsp ATTRIBUTE_UNUSED,
6168 if (sym->st_shndx == SHN_COMMON
6169 && !info->relocatable
6170 && sym->st_size <= elf_gp_size (abfd)
6171 && is_nios2_elf_target (info->output_bfd->xvec))
6173 /* Common symbols less than or equal to -G nn bytes are automatically
6175 struct elf32_nios2_link_hash_table *htab;
6177 htab = elf32_nios2_hash_table (info);
6178 if (htab->sbss == NULL)
6180 flagword flags = SEC_IS_COMMON | SEC_LINKER_CREATED;
6182 dynobj = elf_hash_table (info)->dynobj;
6186 htab->sbss = bfd_make_section_anyway_with_flags (dynobj, ".sbss",
6188 if (htab->sbss == NULL)
6193 *valp = sym->st_size;
6199 /* Implement elf_backend_can_make_relative_eh_frame:
6200 Decide whether to attempt to turn absptr or lsda encodings in
6201 shared libraries into pcrel within the given input section. */
6203 nios2_elf32_can_make_relative_eh_frame (bfd *input_bfd ATTRIBUTE_UNUSED,
6204 struct bfd_link_info *info
6206 asection *eh_frame_section
6209 /* We can't use PC-relative encodings in the .eh_frame section. */
6213 /* Implement elf_backend_special_sections. */
6214 const struct bfd_elf_special_section elf32_nios2_special_sections[] =
6216 { STRING_COMMA_LEN (".sbss"), -2, SHT_NOBITS,
6217 SHF_ALLOC + SHF_WRITE + SHF_NIOS2_GPREL },
6218 { STRING_COMMA_LEN (".sdata"), -2, SHT_PROGBITS,
6219 SHF_ALLOC + SHF_WRITE + SHF_NIOS2_GPREL },
6220 { NULL, 0, 0, 0, 0 }
6223 #define ELF_ARCH bfd_arch_nios2
6224 #define ELF_TARGET_ID NIOS2_ELF_DATA
6225 #define ELF_MACHINE_CODE EM_ALTERA_NIOS2
6227 /* The Nios II MMU uses a 4K page size. */
6229 #define ELF_MAXPAGESIZE 0x1000
6231 #define bfd_elf32_bfd_link_hash_table_create \
6232 nios2_elf32_link_hash_table_create
6234 #define bfd_elf32_bfd_merge_private_bfd_data \
6235 nios2_elf32_merge_private_bfd_data
6237 /* Relocation table lookup macros. */
6239 #define bfd_elf32_bfd_reloc_type_lookup nios2_elf32_bfd_reloc_type_lookup
6240 #define bfd_elf32_bfd_reloc_name_lookup nios2_elf32_bfd_reloc_name_lookup
6242 /* JUMP_TABLE_LINK macros. */
6244 /* elf_info_to_howto (using RELA relocations). */
6246 #define elf_info_to_howto nios2_elf32_info_to_howto
6248 /* elf backend functions. */
6250 #define elf_backend_can_gc_sections 1
6251 #define elf_backend_can_refcount 1
6252 #define elf_backend_plt_readonly 1
6253 #define elf_backend_want_got_plt 1
6254 #define elf_backend_rela_normal 1
6256 #define elf_backend_relocate_section nios2_elf32_relocate_section
6257 #define elf_backend_section_flags nios2_elf32_section_flags
6258 #define elf_backend_fake_sections nios2_elf32_fake_sections
6259 #define elf_backend_check_relocs nios2_elf32_check_relocs
6261 #define elf_backend_gc_mark_hook nios2_elf32_gc_mark_hook
6262 #define elf_backend_gc_sweep_hook nios2_elf32_gc_sweep_hook
6263 #define elf_backend_create_dynamic_sections \
6264 nios2_elf32_create_dynamic_sections
6265 #define elf_backend_finish_dynamic_symbol nios2_elf32_finish_dynamic_symbol
6266 #define elf_backend_finish_dynamic_sections \
6267 nios2_elf32_finish_dynamic_sections
6268 #define elf_backend_adjust_dynamic_symbol nios2_elf32_adjust_dynamic_symbol
6269 #define elf_backend_reloc_type_class nios2_elf32_reloc_type_class
6270 #define elf_backend_size_dynamic_sections nios2_elf32_size_dynamic_sections
6271 #define elf_backend_add_symbol_hook nios2_elf_add_symbol_hook
6272 #define elf_backend_copy_indirect_symbol nios2_elf32_copy_indirect_symbol
6273 #define elf_backend_object_p nios2_elf32_object_p
6275 #define elf_backend_grok_prstatus nios2_grok_prstatus
6276 #define elf_backend_grok_psinfo nios2_grok_psinfo
6278 #undef elf_backend_can_make_relative_eh_frame
6279 #define elf_backend_can_make_relative_eh_frame \
6280 nios2_elf32_can_make_relative_eh_frame
6282 #define elf_backend_special_sections elf32_nios2_special_sections
6284 #define TARGET_LITTLE_SYM nios2_elf32_le_vec
6285 #define TARGET_LITTLE_NAME "elf32-littlenios2"
6286 #define TARGET_BIG_SYM nios2_elf32_be_vec
6287 #define TARGET_BIG_NAME "elf32-bignios2"
6289 #define elf_backend_got_header_size 12
6290 #define elf_backend_default_execstack 0
6292 #include "elf32-target.h"