xref: /netbsd-src/external/gpl3/binutils/dist/bfd/elf32-nios2.c (revision fdd524d4ccd2bb0c6f67401e938dabf773eb0372)
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.
5 
6    This file is part of BFD, the Binary File Descriptor library.
7 
8    This program is free software; you can redistribute it and/or modify
9    it under the terms of the GNU General Public License as published by
10    the Free Software Foundation; either version 3 of the License, or
11    (at your option) any later version.
12 
13    This program is distributed in the hope that it will be useful,
14    but WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16    GNU General Public License for more details.
17 
18    You should have received a copy of the GNU General Public License
19    along with this program; if not, write to the Free Software
20    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
21    MA 02110-1301, USA.  */
22 
23 /* This file handles Altera Nios II ELF targets.  */
24 
25 #include "sysdep.h"
26 #include "bfd.h"
27 #include "libbfd.h"
28 #include "bfdlink.h"
29 #include "genlink.h"
30 #include "elf-bfd.h"
31 #include "elf/nios2.h"
32 #include "opcode/nios2.h"
33 #include "elf32-nios2.h"
34 
35 /* Use RELA relocations.  */
36 #ifndef USE_RELA
37 #define USE_RELA
38 #endif
39 
40 #ifdef USE_REL
41 #undef USE_REL
42 #endif
43 
44 /* Forward declarations.  */
45 static bfd_reloc_status_type nios2_elf32_ignore_reloc
46   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
47 static bfd_reloc_status_type nios2_elf32_hi16_relocate
48   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
49 static bfd_reloc_status_type nios2_elf32_lo16_relocate
50   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
51 static bfd_reloc_status_type nios2_elf32_hiadj16_relocate
52   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
53 static bfd_reloc_status_type nios2_elf32_pcrel_lo16_relocate
54   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
55 static bfd_reloc_status_type nios2_elf32_pcrel_hiadj16_relocate
56   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
57 static bfd_reloc_status_type nios2_elf32_pcrel16_relocate
58   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
59 static bfd_reloc_status_type nios2_elf32_call26_relocate
60   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
61 static bfd_reloc_status_type nios2_elf32_gprel_relocate
62   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
63 static bfd_reloc_status_type nios2_elf32_ujmp_relocate
64   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
65 static bfd_reloc_status_type nios2_elf32_cjmp_relocate
66   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
67 static bfd_reloc_status_type nios2_elf32_callr_relocate
68   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
69 
70 /* Target vector.  */
71 extern const bfd_target nios2_elf32_le_vec;
72 extern const bfd_target nios2_elf32_be_vec;
73 
74 /* Offset of tp and dtp pointers from start of TLS block.  */
75 #define TP_OFFSET	0x7000
76 #define DTP_OFFSET	0x8000
77 
78 /* The relocation 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[] = {
81   /* No relocation.  */
82   HOWTO (R_NIOS2_NONE,		/* type */
83 	 0,			/* rightshift */
84 	 3,			/* size (0 = byte, 1 = short, 2 = long) */
85 	 0,			/* bitsize */
86 	 FALSE,			/* pc_relative */
87 	 0,			/* bitpos */
88 	 complain_overflow_dont,	/* complain_on_overflow */
89 	 bfd_elf_generic_reloc,	/* special_function */
90 	 "R_NIOS2_NONE",	/* name */
91 	 FALSE,			/* partial_inplace */
92 	 0,			/* src_mask */
93 	 0,			/* dst_mask */
94 	 FALSE),		/* pcrel_offset */
95 
96   /* 16-bit signed immediate relocation.  */
97   HOWTO (R_NIOS2_S16,		/* type */
98 	 0,			/* rightshift */
99 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
100 	 16,			/* bitsize */
101 	 FALSE,			/* pc_relative */
102 	 6,			/* bitpos */
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 */
110 
111   /* 16-bit unsigned immediate relocation.  */
112   HOWTO (R_NIOS2_U16,		/* type */
113 	 0,			/* rightshift */
114 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
115 	 16,			/* bitsize */
116 	 FALSE,			/* pc_relative */
117 	 6,			/* bitpos */
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 */
125 
126   HOWTO (R_NIOS2_PCREL16,	/* type */
127 	 0,			/* rightshift */
128 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
129 	 16,			/* bitsize */
130 	 TRUE,			/* pc_relative */
131 	 6,			/* bitpos */
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 */
139 
140   HOWTO (R_NIOS2_CALL26,	/* type */
141 	 2,			/* rightshift */
142 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
143 	 26,			/* bitsize */
144 	 FALSE,			/* pc_relative */
145 	 6,			/* bitpos */
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 */
153 
154   HOWTO (R_NIOS2_IMM5,
155 	 0,
156 	 2,
157 	 5,
158 	 FALSE,
159 	 6,
160 	 complain_overflow_bitfield,
161 	 bfd_elf_generic_reloc,
162 	 "R_NIOS2_IMM5",
163 	 FALSE,
164 	 0x000007c0,
165 	 0x000007c0,
166 	 FALSE),
167 
168   HOWTO (R_NIOS2_CACHE_OPX,
169 	 0,
170 	 2,
171 	 5,
172 	 FALSE,
173 	 22,
174 	 complain_overflow_bitfield,
175 	 bfd_elf_generic_reloc,
176 	 "R_NIOS2_CACHE_OPX",
177 	 FALSE,
178 	 0x07c00000,
179 	 0x07c00000,
180 	 FALSE),
181 
182   HOWTO (R_NIOS2_IMM6,
183 	 0,
184 	 2,
185 	 6,
186 	 FALSE,
187 	 6,
188 	 complain_overflow_bitfield,
189 	 bfd_elf_generic_reloc,
190 	 "R_NIOS2_IMM6",
191 	 FALSE,
192 	 0x00000fc0,
193 	 0x00000fc0,
194 	 FALSE),
195 
196   HOWTO (R_NIOS2_IMM8,
197 	 0,
198 	 2,
199 	 8,
200 	 FALSE,
201 	 6,
202 	 complain_overflow_bitfield,
203 	 bfd_elf_generic_reloc,
204 	 "R_NIOS2_IMM8",
205 	 FALSE,
206 	 0x00003fc0,
207 	 0x00003fc0,
208 	 FALSE),
209 
210   HOWTO (R_NIOS2_HI16,
211 	 0,
212 	 2,
213 	 32,
214 	 FALSE,
215 	 6,
216 	 complain_overflow_dont,
217 	 nios2_elf32_hi16_relocate,
218 	 "R_NIOS2_HI16",
219 	 FALSE,
220 	 0x003fffc0,
221 	 0x003fffc0,
222 	 FALSE),
223 
224   HOWTO (R_NIOS2_LO16,
225 	 0,
226 	 2,
227 	 32,
228 	 FALSE,
229 	 6,
230 	 complain_overflow_dont,
231 	 nios2_elf32_lo16_relocate,
232 	 "R_NIOS2_LO16",
233 	 FALSE,
234 	 0x003fffc0,
235 	 0x003fffc0,
236 	 FALSE),
237 
238   HOWTO (R_NIOS2_HIADJ16,
239 	 0,
240 	 2,
241 	 32,
242 	 FALSE,
243 	 6,
244 	 complain_overflow_dont,
245 	 nios2_elf32_hiadj16_relocate,
246 	 "R_NIOS2_HIADJ16",
247 	 FALSE,
248 	 0x003fffc0,
249 	 0x003fffc0,
250 	 FALSE),
251 
252   HOWTO (R_NIOS2_BFD_RELOC_32,
253 	 0,
254 	 2,			/* long */
255 	 32,
256 	 FALSE,
257 	 0,
258 	 complain_overflow_dont,
259 	 bfd_elf_generic_reloc,
260 	 "R_NIOS2_BFD_RELOC32",
261 	 FALSE,
262 	 0xffffffff,
263 	 0xffffffff,
264 	 FALSE),
265 
266   HOWTO (R_NIOS2_BFD_RELOC_16,
267 	 0,
268 	 1,			/* short */
269 	 16,
270 	 FALSE,
271 	 0,
272 	 complain_overflow_bitfield,
273 	 bfd_elf_generic_reloc,
274 	 "R_NIOS2_BFD_RELOC16",
275 	 FALSE,
276 	 0x0000ffff,
277 	 0x0000ffff,
278 	 FALSE),
279 
280   HOWTO (R_NIOS2_BFD_RELOC_8,
281 	 0,
282 	 0,			/* byte */
283 	 8,
284 	 FALSE,
285 	 0,
286 	 complain_overflow_bitfield,
287 	 bfd_elf_generic_reloc,
288 	 "R_NIOS2_BFD_RELOC8",
289 	 FALSE,
290 	 0x000000ff,
291 	 0x000000ff,
292 	 FALSE),
293 
294   HOWTO (R_NIOS2_GPREL,
295 	 0,
296 	 2,
297 	 32,
298 	 FALSE,
299 	 6,
300 	 complain_overflow_dont,
301 	 nios2_elf32_gprel_relocate,
302 	 "R_NIOS2_GPREL",
303 	 FALSE,
304 	 0x003fffc0,
305 	 0x003fffc0,
306 	 FALSE),
307 
308   HOWTO (R_NIOS2_GNU_VTINHERIT,
309 	 0,
310 	 2,			/* short */
311 	 0,
312 	 FALSE,
313 	 0,
314 	 complain_overflow_dont,
315 	 NULL,
316 	 "R_NIOS2_GNU_VTINHERIT",
317 	 FALSE,
318 	 0,
319 	 0,
320 	 FALSE),
321 
322   HOWTO (R_NIOS2_GNU_VTENTRY,
323 	 0,
324 	 2,			/* byte */
325 	 0,
326 	 FALSE,
327 	 0,
328 	 complain_overflow_dont,
329 	 _bfd_elf_rel_vtable_reloc_fn,
330 	 "R_NIOS2_GNU_VTENTRY",
331 	 FALSE,
332 	 0,
333 	 0,
334 	 FALSE),
335 
336   HOWTO (R_NIOS2_UJMP,
337 	 0,
338 	 2,
339 	 32,
340 	 FALSE,
341 	 6,
342 	 complain_overflow_dont,
343 	 nios2_elf32_ujmp_relocate,
344 	 "R_NIOS2_UJMP",
345 	 FALSE,
346 	 0x003fffc0,
347 	 0x003fffc0,
348 	 FALSE),
349 
350   HOWTO (R_NIOS2_CJMP,
351 	 0,
352 	 2,
353 	 32,
354 	 FALSE,
355 	 6,
356 	 complain_overflow_dont,
357 	 nios2_elf32_cjmp_relocate,
358 	 "R_NIOS2_CJMP",
359 	 FALSE,
360 	 0x003fffc0,
361 	 0x003fffc0,
362 	 FALSE),
363 
364   HOWTO (R_NIOS2_CALLR,
365 	 0,
366 	 2,
367 	 32,
368 	 FALSE,
369 	 6,
370 	 complain_overflow_dont,
371 	 nios2_elf32_callr_relocate,
372 	 "R_NIOS2_CALLR",
373 	 FALSE,
374 	 0x003fffc0,
375 	 0x003fffc0,
376 	 FALSE),
377 
378   HOWTO (R_NIOS2_ALIGN,
379 	 0,
380 	 2,
381 	 0,
382 	 FALSE,
383 	 0,
384 	 complain_overflow_dont,
385 	 nios2_elf32_ignore_reloc,
386 	 "R_NIOS2_ALIGN",
387 	 FALSE,
388 	 0,
389 	 0,
390 	 TRUE),
391 
392 
393   HOWTO (R_NIOS2_GOT16,
394 	 0,
395 	 2,
396 	 16,
397 	 FALSE,
398 	 6,
399 	 complain_overflow_bitfield,
400 	 bfd_elf_generic_reloc,
401 	 "R_NIOS2_GOT16",
402 	 FALSE,
403 	 0x003fffc0,
404 	 0x003fffc0,
405 	 FALSE),
406 
407   HOWTO (R_NIOS2_CALL16,
408 	 0,
409 	 2,
410 	 16,
411 	 FALSE,
412 	 6,
413 	 complain_overflow_bitfield,
414 	 bfd_elf_generic_reloc,
415 	 "R_NIOS2_CALL16",
416 	 FALSE,
417 	 0x003fffc0,
418 	 0x003fffc0,
419 	 FALSE),
420 
421   HOWTO (R_NIOS2_GOTOFF_LO,
422 	 0,
423 	 2,
424 	 16,
425 	 FALSE,
426 	 6,
427 	 complain_overflow_dont,
428 	 bfd_elf_generic_reloc,
429 	 "R_NIOS2_GOTOFF_LO",
430 	 FALSE,
431 	 0x003fffc0,
432 	 0x003fffc0,
433 	 FALSE),
434 
435   HOWTO (R_NIOS2_GOTOFF_HA,
436 	 0,
437 	 2,
438 	 16,
439 	 FALSE,
440 	 6,
441 	 complain_overflow_dont,
442 	 bfd_elf_generic_reloc,
443 	 "R_NIOS2_GOTOFF_HA",
444 	 FALSE,
445 	 0x003fffc0,
446 	 0x003fffc0,
447 	 FALSE),
448 
449   HOWTO (R_NIOS2_PCREL_LO,
450 	 0,
451 	 2,
452 	 16,
453 	 TRUE,
454 	 6,
455 	 complain_overflow_dont,
456 	 nios2_elf32_pcrel_lo16_relocate,
457 	 "R_NIOS2_PCREL_LO",
458 	 FALSE,
459 	 0x003fffc0,
460 	 0x003fffc0,
461 	 TRUE),
462 
463   HOWTO (R_NIOS2_PCREL_HA,
464 	 0,
465 	 2,
466 	 16,
467 	 FALSE, /* This is a PC-relative relocation, but we need to subtract
468 		   PC ourselves before the HIADJ.  */
469 	 6,
470 	 complain_overflow_dont,
471 	 nios2_elf32_pcrel_hiadj16_relocate,
472 	 "R_NIOS2_PCREL_HA",
473 	 FALSE,
474 	 0x003fffc0,
475 	 0x003fffc0,
476 	 TRUE),
477 
478   HOWTO (R_NIOS2_TLS_GD16,
479 	 0,
480 	 2,
481 	 16,
482 	 FALSE,
483 	 6,
484 	 complain_overflow_bitfield,
485 	 bfd_elf_generic_reloc,
486 	 "R_NIOS2_TLS_GD16",
487 	 FALSE,
488 	 0x003fffc0,
489 	 0x003fffc0,
490 	 FALSE),
491 
492   HOWTO (R_NIOS2_TLS_LDM16,
493 	 0,
494 	 2,
495 	 16,
496 	 FALSE,
497 	 6,
498 	 complain_overflow_bitfield,
499 	 bfd_elf_generic_reloc,
500 	 "R_NIOS2_TLS_LDM16",
501 	 FALSE,
502 	 0x003fffc0,
503 	 0x003fffc0,
504 	 FALSE),
505 
506   HOWTO (R_NIOS2_TLS_LDO16,
507 	 0,
508 	 2,
509 	 16,
510 	 FALSE,
511 	 6,
512 	 complain_overflow_bitfield,
513 	 bfd_elf_generic_reloc,
514 	 "R_NIOS2_TLS_LDO16",
515 	 FALSE,
516 	 0x003fffc0,
517 	 0x003fffc0,
518 	 FALSE),
519 
520   HOWTO (R_NIOS2_TLS_IE16,
521 	 0,
522 	 2,
523 	 16,
524 	 FALSE,
525 	 6,
526 	 complain_overflow_bitfield,
527 	 bfd_elf_generic_reloc,
528 	 "R_NIOS2_TLS_IE16",
529 	 FALSE,
530 	 0x003fffc0,
531 	 0x003fffc0,
532 	 FALSE),
533 
534   HOWTO (R_NIOS2_TLS_LE16,
535 	 0,
536 	 2,
537 	 16,
538 	 FALSE,
539 	 6,
540 	 complain_overflow_bitfield,
541 	 bfd_elf_generic_reloc,
542 	 "R_NIOS2_TLS_LE16",
543 	 FALSE,
544 	 0x003fffc0,
545 	 0x003fffc0,
546 	 FALSE),
547 
548   HOWTO (R_NIOS2_TLS_DTPMOD,
549 	 0,
550 	 2,
551 	 32,
552 	 FALSE,
553 	 0,
554 	 complain_overflow_dont,
555 	 bfd_elf_generic_reloc,
556 	 "R_NIOS2_TLS_DTPMOD",
557 	 FALSE,
558 	 0xffffffff,
559 	 0xffffffff,
560 	 FALSE),
561 
562   HOWTO (R_NIOS2_TLS_DTPREL,
563 	 0,
564 	 2,
565 	 32,
566 	 FALSE,
567 	 0,
568 	 complain_overflow_dont,
569 	 bfd_elf_generic_reloc,
570 	 "R_NIOS2_TLS_DTPREL",
571 	 FALSE,
572 	 0xffffffff,
573 	 0xffffffff,
574 	 FALSE),
575 
576   HOWTO (R_NIOS2_TLS_TPREL,
577 	 0,
578 	 2,
579 	 32,
580 	 FALSE,
581 	 0,
582 	 complain_overflow_dont,
583 	 bfd_elf_generic_reloc,
584 	 "R_NIOS2_TLS_TPREL",
585 	 FALSE,
586 	 0xffffffff,
587 	 0xffffffff,
588 	 FALSE),
589 
590   HOWTO (R_NIOS2_COPY,
591 	 0,
592 	 2,
593 	 32,
594 	 FALSE,
595 	 0,
596 	 complain_overflow_dont,
597 	 bfd_elf_generic_reloc,
598 	 "R_NIOS2_COPY",
599 	 FALSE,
600 	 0,
601 	 0,
602 	 FALSE),
603 
604   HOWTO (R_NIOS2_GLOB_DAT,
605 	 0,
606 	 2,
607 	 32,
608 	 FALSE,
609 	 0,
610 	 complain_overflow_dont,
611 	 bfd_elf_generic_reloc,
612 	 "R_NIOS2_GLOB_DAT",
613 	 FALSE,
614 	 0xffffffff,
615 	 0xffffffff,
616 	 FALSE),
617 
618   HOWTO (R_NIOS2_JUMP_SLOT,
619 	 0,
620 	 2,
621 	 32,
622 	 FALSE,
623 	 0,
624 	 complain_overflow_dont,
625 	 bfd_elf_generic_reloc,
626 	 "R_NIOS2_JUMP_SLOT",
627 	 FALSE,
628 	 0xffffffff,
629 	 0xffffffff,
630 	 FALSE),
631 
632   HOWTO (R_NIOS2_RELATIVE,
633 	 0,
634 	 2,
635 	 32,
636 	 FALSE,
637 	 0,
638 	 complain_overflow_dont,
639 	 bfd_elf_generic_reloc,
640 	 "R_NIOS2_RELATIVE",
641 	 FALSE,
642 	 0xffffffff,
643 	 0xffffffff,
644 	 FALSE),
645 
646   HOWTO (R_NIOS2_GOTOFF,
647 	 0,
648 	 2,
649 	 32,
650 	 FALSE,
651 	 0,
652 	 complain_overflow_dont,
653 	 bfd_elf_generic_reloc,
654 	 "R_NIOS2_GOTOFF",
655 	 FALSE,
656 	 0xffffffff,
657 	 0xffffffff,
658 	 FALSE),
659 
660   HOWTO (R_NIOS2_CALL26_NOAT,	/* type */
661 	 2,			/* rightshift */
662 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
663 	 26,			/* bitsize */
664 	 FALSE,			/* pc_relative */
665 	 6,			/* bitpos */
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 */
673 
674   HOWTO (R_NIOS2_GOT_LO,
675 	 0,
676 	 2,
677 	 16,
678 	 FALSE,
679 	 6,
680 	 complain_overflow_dont,
681 	 bfd_elf_generic_reloc,
682 	 "R_NIOS2_GOT_LO",
683 	 FALSE,
684 	 0x003fffc0,
685 	 0x003fffc0,
686 	 FALSE),
687 
688   HOWTO (R_NIOS2_GOT_HA,
689 	 0,
690 	 2,
691 	 16,
692 	 FALSE,
693 	 6,
694 	 complain_overflow_dont,
695 	 bfd_elf_generic_reloc,
696 	 "R_NIOS2_GOT_HA",
697 	 FALSE,
698 	 0x003fffc0,
699 	 0x003fffc0,
700 	 FALSE),
701 
702   HOWTO (R_NIOS2_CALL_LO,
703 	 0,
704 	 2,
705 	 16,
706 	 FALSE,
707 	 6,
708 	 complain_overflow_dont,
709 	 bfd_elf_generic_reloc,
710 	 "R_NIOS2_CALL_LO",
711 	 FALSE,
712 	 0x003fffc0,
713 	 0x003fffc0,
714 	 FALSE),
715 
716   HOWTO (R_NIOS2_CALL_HA,
717 	 0,
718 	 2,
719 	 16,
720 	 FALSE,
721 	 6,
722 	 complain_overflow_dont,
723 	 bfd_elf_generic_reloc,
724 	 "R_NIOS2_CALL_HA",
725 	 FALSE,
726 	 0x003fffc0,
727 	 0x003fffc0,
728 	 FALSE),
729 
730 /* Add other relocations here.  */
731 };
732 
733 static reloc_howto_type elf_nios2_r2_howto_table_rel[] = {
734   /* No relocation.  */
735   HOWTO (R_NIOS2_NONE,		/* type */
736 	 0,			/* rightshift */
737 	 0,			/* size (0 = byte, 1 = short, 2 = long) */
738 	 0,			/* bitsize */
739 	 FALSE,			/* pc_relative */
740 	 0,			/* bitpos */
741 	 complain_overflow_dont,	/* complain_on_overflow */
742 	 bfd_elf_generic_reloc,	/* special_function */
743 	 "R_NIOS2_NONE",	/* name */
744 	 FALSE,			/* partial_inplace */
745 	 0,			/* src_mask */
746 	 0,			/* dst_mask */
747 	 FALSE),		/* pcrel_offset */
748 
749   /* 16-bit signed immediate relocation.  */
750   HOWTO (R_NIOS2_S16,		/* type */
751 	 0,			/* rightshift */
752 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
753 	 16,			/* bitsize */
754 	 FALSE,			/* pc_relative */
755 	 16,			/* bitpos */
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 */
763 
764   /* 16-bit unsigned immediate relocation.  */
765   HOWTO (R_NIOS2_U16,		/* type */
766 	 0,			/* rightshift */
767 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
768 	 16,			/* bitsize */
769 	 FALSE,			/* pc_relative */
770 	 16,			/* bitpos */
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 */
778 
779   HOWTO (R_NIOS2_PCREL16,	/* type */
780 	 0,			/* rightshift */
781 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
782 	 16,			/* bitsize */
783 	 TRUE,			/* pc_relative */
784 	 16,			/* bitpos */
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 */
792 
793   HOWTO (R_NIOS2_CALL26,	/* type */
794 	 2,			/* rightshift */
795 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
796 	 26,			/* bitsize */
797 	 FALSE,			/* pc_relative */
798 	 6,			/* bitpos */
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 */
806 
807   HOWTO (R_NIOS2_IMM5,
808 	 0,
809 	 2,
810 	 5,
811 	 FALSE,
812 	 21,
813 	 complain_overflow_bitfield,
814 	 bfd_elf_generic_reloc,
815 	 "R_NIOS2_IMM5",
816 	 FALSE,
817 	 0x03e00000,
818 	 0x03e00000,
819 	 FALSE),
820 
821   HOWTO (R_NIOS2_CACHE_OPX,
822 	 0,
823 	 2,
824 	 5,
825 	 FALSE,
826 	 11,
827 	 complain_overflow_bitfield,
828 	 bfd_elf_generic_reloc,
829 	 "R_NIOS2_CACHE_OPX",
830 	 FALSE,
831 	 0x0000f800,
832 	 0x0000f800,
833 	 FALSE),
834 
835   HOWTO (R_NIOS2_IMM6,
836 	 0,
837 	 2,
838 	 6,
839 	 FALSE,
840 	 26,
841 	 complain_overflow_bitfield,
842 	 bfd_elf_generic_reloc,
843 	 "R_NIOS2_IMM6",
844 	 FALSE,
845 	 0xfc000000,
846 	 0xfc000000,
847 	 FALSE),
848 
849   HOWTO (R_NIOS2_IMM8,
850 	 0,
851 	 2,
852 	 8,
853 	 FALSE,
854 	 24,
855 	 complain_overflow_bitfield,
856 	 bfd_elf_generic_reloc,
857 	 "R_NIOS2_IMM8",
858 	 FALSE,
859 	 0xff000000,
860 	 0xff000000,
861 	 FALSE),
862 
863   HOWTO (R_NIOS2_HI16,
864 	 0,
865 	 2,
866 	 32,
867 	 FALSE,
868 	 16,
869 	 complain_overflow_dont,
870 	 nios2_elf32_hi16_relocate,
871 	 "R_NIOS2_HI16",
872 	 FALSE,
873 	 0xffff0000,
874 	 0xffff0000,
875 	 FALSE),
876 
877   HOWTO (R_NIOS2_LO16,
878 	 0,
879 	 2,
880 	 32,
881 	 FALSE,
882 	 16,
883 	 complain_overflow_dont,
884 	 nios2_elf32_lo16_relocate,
885 	 "R_NIOS2_LO16",
886 	 FALSE,
887 	 0xffff0000,
888 	 0xffff0000,
889 	 FALSE),
890 
891   HOWTO (R_NIOS2_HIADJ16,
892 	 0,
893 	 2,
894 	 32,
895 	 FALSE,
896 	 16,
897 	 complain_overflow_dont,
898 	 nios2_elf32_hiadj16_relocate,
899 	 "R_NIOS2_HIADJ16",
900 	 FALSE,
901 	 0xffff0000,
902 	 0xffff0000,
903 	 FALSE),
904 
905   HOWTO (R_NIOS2_BFD_RELOC_32,
906 	 0,
907 	 2,			/* long */
908 	 32,
909 	 FALSE,
910 	 0,
911 	 complain_overflow_dont,
912 	 bfd_elf_generic_reloc,
913 	 "R_NIOS2_BFD_RELOC32",
914 	 FALSE,
915 	 0xffffffff,
916 	 0xffffffff,
917 	 FALSE),
918 
919   HOWTO (R_NIOS2_BFD_RELOC_16,
920 	 0,
921 	 1,			/* short */
922 	 16,
923 	 FALSE,
924 	 0,
925 	 complain_overflow_bitfield,
926 	 bfd_elf_generic_reloc,
927 	 "R_NIOS2_BFD_RELOC16",
928 	 FALSE,
929 	 0x0000ffff,
930 	 0x0000ffff,
931 	 FALSE),
932 
933   HOWTO (R_NIOS2_BFD_RELOC_8,
934 	 0,
935 	 0,			/* byte */
936 	 8,
937 	 FALSE,
938 	 0,
939 	 complain_overflow_bitfield,
940 	 bfd_elf_generic_reloc,
941 	 "R_NIOS2_BFD_RELOC8",
942 	 FALSE,
943 	 0x000000ff,
944 	 0x000000ff,
945 	 FALSE),
946 
947   HOWTO (R_NIOS2_GPREL,
948 	 0,
949 	 2,
950 	 32,
951 	 FALSE,
952 	 16,
953 	 complain_overflow_dont,
954 	 nios2_elf32_gprel_relocate,
955 	 "R_NIOS2_GPREL",
956 	 FALSE,
957 	 0xffff0000,
958 	 0xffff0000,
959 	 FALSE),
960 
961   HOWTO (R_NIOS2_GNU_VTINHERIT,
962 	 0,
963 	 2,			/* short */
964 	 0,
965 	 FALSE,
966 	 0,
967 	 complain_overflow_dont,
968 	 NULL,
969 	 "R_NIOS2_GNU_VTINHERIT",
970 	 FALSE,
971 	 0,
972 	 0,
973 	 FALSE),
974 
975   HOWTO (R_NIOS2_GNU_VTENTRY,
976 	 0,
977 	 2,			/* byte */
978 	 0,
979 	 FALSE,
980 	 0,
981 	 complain_overflow_dont,
982 	 _bfd_elf_rel_vtable_reloc_fn,
983 	 "R_NIOS2_GNU_VTENTRY",
984 	 FALSE,
985 	 0,
986 	 0,
987 	 FALSE),
988 
989   HOWTO (R_NIOS2_UJMP,
990 	 0,
991 	 2,
992 	 32,
993 	 FALSE,
994 	 16,
995 	 complain_overflow_dont,
996 	 nios2_elf32_ujmp_relocate,
997 	 "R_NIOS2_UJMP",
998 	 FALSE,
999 	 0xffff0000,
1000 	 0xffff0000,
1001 	 FALSE),
1002 
1003   HOWTO (R_NIOS2_CJMP,
1004 	 0,
1005 	 2,
1006 	 32,
1007 	 FALSE,
1008 	 16,
1009 	 complain_overflow_dont,
1010 	 nios2_elf32_cjmp_relocate,
1011 	 "R_NIOS2_CJMP",
1012 	 FALSE,
1013 	 0xffff0000,
1014 	 0xffff0000,
1015 	 FALSE),
1016 
1017   HOWTO (R_NIOS2_CALLR,
1018 	 0,
1019 	 2,
1020 	 32,
1021 	 FALSE,
1022 	 16,
1023 	 complain_overflow_dont,
1024 	 nios2_elf32_callr_relocate,
1025 	 "R_NIOS2_CALLR",
1026 	 FALSE,
1027 	 0xffff0000,
1028 	 0xffff0000,
1029 	 FALSE),
1030 
1031   HOWTO (R_NIOS2_ALIGN,
1032 	 0,
1033 	 2,
1034 	 0,
1035 	 FALSE,
1036 	 0,
1037 	 complain_overflow_dont,
1038 	 nios2_elf32_ignore_reloc,
1039 	 "R_NIOS2_ALIGN",
1040 	 FALSE,
1041 	 0,
1042 	 0,
1043 	 TRUE),
1044 
1045   HOWTO (R_NIOS2_GOT16,
1046 	 0,
1047 	 2,
1048 	 16,
1049 	 FALSE,
1050 	 16,
1051 	 complain_overflow_bitfield,
1052 	 bfd_elf_generic_reloc,
1053 	 "R_NIOS2_GOT16",
1054 	 FALSE,
1055 	 0xffff0000,
1056 	 0xffff0000,
1057 	 FALSE),
1058 
1059   HOWTO (R_NIOS2_CALL16,
1060 	 0,
1061 	 2,
1062 	 16,
1063 	 FALSE,
1064 	 16,
1065 	 complain_overflow_bitfield,
1066 	 bfd_elf_generic_reloc,
1067 	 "R_NIOS2_CALL16",
1068 	 FALSE,
1069 	 0xffff0000,
1070 	 0xffff0000,
1071 	 FALSE),
1072 
1073   HOWTO (R_NIOS2_GOTOFF_LO,
1074 	 0,
1075 	 2,
1076 	 16,
1077 	 FALSE,
1078 	 16,
1079 	 complain_overflow_dont,
1080 	 bfd_elf_generic_reloc,
1081 	 "R_NIOS2_GOTOFF_LO",
1082 	 FALSE,
1083 	 0xffff0000,
1084 	 0xffff0000,
1085 	 FALSE),
1086 
1087   HOWTO (R_NIOS2_GOTOFF_HA,
1088 	 0,
1089 	 2,
1090 	 16,
1091 	 FALSE,
1092 	 16,
1093 	 complain_overflow_dont,
1094 	 bfd_elf_generic_reloc,
1095 	 "R_NIOS2_GOTOFF_HA",
1096 	 FALSE,
1097 	 0xffff0000,
1098 	 0xffff0000,
1099 	 FALSE),
1100 
1101   HOWTO (R_NIOS2_PCREL_LO,
1102 	 0,
1103 	 2,
1104 	 16,
1105 	 TRUE,
1106 	 16,
1107 	 complain_overflow_dont,
1108 	 nios2_elf32_pcrel_lo16_relocate,
1109 	 "R_NIOS2_PCREL_LO",
1110 	 FALSE,
1111 	 0xffff0000,
1112 	 0xffff0000,
1113 	 TRUE),
1114 
1115   HOWTO (R_NIOS2_PCREL_HA,
1116 	 0,
1117 	 2,
1118 	 16,
1119 	 FALSE, /* This is a PC-relative relocation, but we need to subtract
1120 		   PC ourselves before the HIADJ.  */
1121 	 16,
1122 	 complain_overflow_dont,
1123 	 nios2_elf32_pcrel_hiadj16_relocate,
1124 	 "R_NIOS2_PCREL_HA",
1125 	 FALSE,
1126 	 0xffff0000,
1127 	 0xffff0000,
1128 	 TRUE),
1129 
1130   HOWTO (R_NIOS2_TLS_GD16,
1131 	 0,
1132 	 2,
1133 	 16,
1134 	 FALSE,
1135 	 16,
1136 	 complain_overflow_bitfield,
1137 	 bfd_elf_generic_reloc,
1138 	 "R_NIOS2_TLS_GD16",
1139 	 FALSE,
1140 	 0xffff0000,
1141 	 0xffff0000,
1142 	 FALSE),
1143 
1144   HOWTO (R_NIOS2_TLS_LDM16,
1145 	 0,
1146 	 2,
1147 	 16,
1148 	 FALSE,
1149 	 16,
1150 	 complain_overflow_bitfield,
1151 	 bfd_elf_generic_reloc,
1152 	 "R_NIOS2_TLS_LDM16",
1153 	 FALSE,
1154 	 0xffff0000,
1155 	 0xffff0000,
1156 	 FALSE),
1157 
1158   HOWTO (R_NIOS2_TLS_LDO16,
1159 	 0,
1160 	 2,
1161 	 16,
1162 	 FALSE,
1163 	 16,
1164 	 complain_overflow_bitfield,
1165 	 bfd_elf_generic_reloc,
1166 	 "R_NIOS2_TLS_LDO16",
1167 	 FALSE,
1168 	 0xffff0000,
1169 	 0xffff0000,
1170 	 FALSE),
1171 
1172   HOWTO (R_NIOS2_TLS_IE16,
1173 	 0,
1174 	 2,
1175 	 16,
1176 	 FALSE,
1177 	 16,
1178 	 complain_overflow_bitfield,
1179 	 bfd_elf_generic_reloc,
1180 	 "R_NIOS2_TLS_IE16",
1181 	 FALSE,
1182 	 0xffff0000,
1183 	 0xffff0000,
1184 	 FALSE),
1185 
1186   HOWTO (R_NIOS2_TLS_LE16,
1187 	 0,
1188 	 2,
1189 	 16,
1190 	 FALSE,
1191 	 16,
1192 	 complain_overflow_bitfield,
1193 	 bfd_elf_generic_reloc,
1194 	 "R_NIOS2_TLS_LE16",
1195 	 FALSE,
1196 	 0xffff0000,
1197 	 0xffff0000,
1198 	 FALSE),
1199 
1200   HOWTO (R_NIOS2_TLS_DTPMOD,
1201 	 0,
1202 	 2,
1203 	 32,
1204 	 FALSE,
1205 	 0,
1206 	 complain_overflow_dont,
1207 	 bfd_elf_generic_reloc,
1208 	 "R_NIOS2_TLS_DTPMOD",
1209 	 FALSE,
1210 	 0xffffffff,
1211 	 0xffffffff,
1212 	 FALSE),
1213 
1214   HOWTO (R_NIOS2_TLS_DTPREL,
1215 	 0,
1216 	 2,
1217 	 32,
1218 	 FALSE,
1219 	 0,
1220 	 complain_overflow_dont,
1221 	 bfd_elf_generic_reloc,
1222 	 "R_NIOS2_TLS_DTPREL",
1223 	 FALSE,
1224 	 0xffffffff,
1225 	 0xffffffff,
1226 	 FALSE),
1227 
1228   HOWTO (R_NIOS2_TLS_TPREL,
1229 	 0,
1230 	 2,
1231 	 32,
1232 	 FALSE,
1233 	 0,
1234 	 complain_overflow_dont,
1235 	 bfd_elf_generic_reloc,
1236 	 "R_NIOS2_TLS_TPREL",
1237 	 FALSE,
1238 	 0xffffffff,
1239 	 0xffffffff,
1240 	 FALSE),
1241 
1242   HOWTO (R_NIOS2_COPY,
1243 	 0,
1244 	 2,
1245 	 32,
1246 	 FALSE,
1247 	 0,
1248 	 complain_overflow_dont,
1249 	 bfd_elf_generic_reloc,
1250 	 "R_NIOS2_COPY",
1251 	 FALSE,
1252 	 0,
1253 	 0,
1254 	 FALSE),
1255 
1256   HOWTO (R_NIOS2_GLOB_DAT,
1257 	 0,
1258 	 2,
1259 	 32,
1260 	 FALSE,
1261 	 0,
1262 	 complain_overflow_dont,
1263 	 bfd_elf_generic_reloc,
1264 	 "R_NIOS2_GLOB_DAT",
1265 	 FALSE,
1266 	 0xffffffff,
1267 	 0xffffffff,
1268 	 FALSE),
1269 
1270   HOWTO (R_NIOS2_JUMP_SLOT,
1271 	 0,
1272 	 2,
1273 	 32,
1274 	 FALSE,
1275 	 0,
1276 	 complain_overflow_dont,
1277 	 bfd_elf_generic_reloc,
1278 	 "R_NIOS2_JUMP_SLOT",
1279 	 FALSE,
1280 	 0xffffffff,
1281 	 0xffffffff,
1282 	 FALSE),
1283 
1284   HOWTO (R_NIOS2_RELATIVE,
1285 	 0,
1286 	 2,
1287 	 32,
1288 	 FALSE,
1289 	 0,
1290 	 complain_overflow_dont,
1291 	 bfd_elf_generic_reloc,
1292 	 "R_NIOS2_RELATIVE",
1293 	 FALSE,
1294 	 0xffffffff,
1295 	 0xffffffff,
1296 	 FALSE),
1297 
1298   HOWTO (R_NIOS2_GOTOFF,
1299 	 0,
1300 	 2,
1301 	 32,
1302 	 FALSE,
1303 	 0,
1304 	 complain_overflow_dont,
1305 	 bfd_elf_generic_reloc,
1306 	 "R_NIOS2_GOTOFF",
1307 	 FALSE,
1308 	 0xffffffff,
1309 	 0xffffffff,
1310 	 FALSE),
1311 
1312   HOWTO (R_NIOS2_CALL26_NOAT,	/* type */
1313 	 2,			/* rightshift */
1314 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1315 	 26,			/* bitsize */
1316 	 FALSE,			/* pc_relative */
1317 	 6,			/* bitpos */
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 */
1325 
1326   HOWTO (R_NIOS2_GOT_LO,
1327 	 0,
1328 	 2,
1329 	 16,
1330 	 FALSE,
1331 	 16,
1332 	 complain_overflow_dont,
1333 	 bfd_elf_generic_reloc,
1334 	 "R_NIOS2_GOT_LO",
1335 	 FALSE,
1336 	 0xffff0000,
1337 	 0xffff0000,
1338 	 FALSE),
1339 
1340   HOWTO (R_NIOS2_GOT_HA,
1341 	 0,
1342 	 2,
1343 	 16,
1344 	 FALSE,
1345 	 16,
1346 	 complain_overflow_dont,
1347 	 bfd_elf_generic_reloc,
1348 	 "R_NIOS2_GOT_HA",
1349 	 FALSE,
1350 	 0xffff0000,
1351 	 0xffff0000,
1352 	 FALSE),
1353 
1354   HOWTO (R_NIOS2_CALL_LO,
1355 	 0,
1356 	 2,
1357 	 16,
1358 	 FALSE,
1359 	 16,
1360 	 complain_overflow_dont,
1361 	 bfd_elf_generic_reloc,
1362 	 "R_NIOS2_CALL_LO",
1363 	 FALSE,
1364 	 0xffff0000,
1365 	 0xffff0000,
1366 	 FALSE),
1367 
1368   HOWTO (R_NIOS2_CALL_HA,
1369 	 0,
1370 	 2,
1371 	 16,
1372 	 FALSE,
1373 	 16,
1374 	 complain_overflow_dont,
1375 	 bfd_elf_generic_reloc,
1376 	 "R_NIOS2_CALL_HA",
1377 	 FALSE,
1378 	 0xffff0000,
1379 	 0xffff0000,
1380 	 FALSE),
1381 
1382   HOWTO (R_NIOS2_R2_S12,
1383 	 0,
1384 	 2,
1385 	 12,
1386 	 FALSE,
1387 	 16,
1388 	 complain_overflow_signed,
1389 	 bfd_elf_generic_reloc,
1390 	 "R_NIOS2_R2_S12",
1391 	 FALSE,
1392 	 0x0fff0000,
1393 	 0x0fff0000,
1394 	 FALSE),
1395 
1396   HOWTO (R_NIOS2_R2_I10_1_PCREL,
1397 	 1,
1398 	 1,
1399 	 10,
1400 	 TRUE,
1401 	 6,
1402 	 complain_overflow_signed,
1403 	 bfd_elf_generic_reloc, 	/* FIXME? */
1404 	 "R_NIOS2_R2_I10_1_PCREL",
1405 	 FALSE,
1406 	 0xffc0,
1407 	 0xffc0,
1408 	 TRUE),
1409 
1410   HOWTO (R_NIOS2_R2_T1I7_1_PCREL,
1411 	 1,
1412 	 1,
1413 	 7,
1414 	 TRUE,
1415 	 9,
1416 	 complain_overflow_signed,
1417 	 bfd_elf_generic_reloc,		/* FIXME? */
1418 	 "R_NIOS2_R2_T1I7_1_PCREL",
1419 	 FALSE,
1420 	 0xfe00,
1421 	 0xfe00,
1422 	 TRUE),
1423 
1424   HOWTO (R_NIOS2_R2_T1I7_2,
1425 	 2,
1426 	 1,
1427 	 7,
1428 	 FALSE,
1429 	 9,
1430 	 complain_overflow_unsigned,
1431 	 bfd_elf_generic_reloc,
1432 	 "R_NIOS2_R2_T1I7_2",
1433 	 FALSE,
1434 	 0xfe00,
1435 	 0xfe00,
1436 	 FALSE),
1437 
1438   HOWTO (R_NIOS2_R2_T2I4,
1439 	 0,
1440 	 1,
1441 	 4,
1442 	 FALSE,
1443 	 12,
1444 	 complain_overflow_unsigned,
1445 	 bfd_elf_generic_reloc,
1446 	 "R_NIOS2_R2_T2I4",
1447 	 FALSE,
1448 	 0xf000,
1449 	 0xf000,
1450 	 FALSE),
1451 
1452   HOWTO (R_NIOS2_R2_T2I4_1,
1453 	 1,
1454 	 1,
1455 	 4,
1456 	 FALSE,
1457 	 12,
1458 	 complain_overflow_unsigned,
1459 	 bfd_elf_generic_reloc,
1460 	 "R_NIOS2_R2_T2I4_1",
1461 	 FALSE,
1462 	 0xf000,
1463 	 0xf000,
1464 	 FALSE),
1465 
1466   HOWTO (R_NIOS2_R2_T2I4_2,
1467 	 2,
1468 	 1,
1469 	 4,
1470 	 FALSE,
1471 	 12,
1472 	 complain_overflow_unsigned,
1473 	 bfd_elf_generic_reloc,
1474 	 "R_NIOS2_R2_T2I4_2",
1475 	 FALSE,
1476 	 0xf000,
1477 	 0xf000,
1478 	 FALSE),
1479 
1480   HOWTO (R_NIOS2_R2_X1I7_2,
1481 	 2,
1482 	 1,
1483 	 7,
1484 	 FALSE,
1485 	 6,
1486 	 complain_overflow_unsigned,
1487 	 bfd_elf_generic_reloc,
1488 	 "R_NIOS2_R2_X1I7_2",
1489 	 FALSE,
1490 	 0x1fc0,
1491 	 0x1fc0,
1492 	 FALSE),
1493 
1494   HOWTO (R_NIOS2_R2_X2L5,
1495 	 0,
1496 	 1,
1497 	 5,
1498 	 FALSE,
1499 	 6,
1500 	 complain_overflow_unsigned,
1501 	 bfd_elf_generic_reloc,
1502 	 "R_NIOS2_R2_X2L5",
1503 	 FALSE,
1504 	 0x07c0,
1505 	 0x07c0,
1506 	 FALSE),
1507 
1508   HOWTO (R_NIOS2_R2_F1I5_2,
1509 	 2,
1510 	 1,
1511 	 5,
1512 	 FALSE,
1513 	 6,
1514 	 complain_overflow_unsigned,
1515 	 bfd_elf_generic_reloc,
1516 	 "R_NIOS2_R2_F1L5_2",
1517 	 FALSE,
1518 	 0x07c0,
1519 	 0x07c0,
1520 	 FALSE),
1521 
1522   HOWTO (R_NIOS2_R2_L5I4X1,
1523 	 2,
1524 	 1,
1525 	 4,
1526 	 FALSE,
1527 	 6,
1528 	 complain_overflow_unsigned,
1529 	 bfd_elf_generic_reloc,
1530 	 "R_NIOS2_R2_L5I4X1",
1531 	 FALSE,
1532 	 0x03c0,
1533 	 0x03c0,
1534 	 FALSE),
1535 
1536   HOWTO (R_NIOS2_R2_T1X1I6,
1537 	 0,
1538 	 1,
1539 	 6,
1540 	 FALSE,
1541 	 9,
1542 	 complain_overflow_unsigned,
1543 	 bfd_elf_generic_reloc,
1544 	 "R_NIOS2_R2_T1X1I6",
1545 	 FALSE,
1546 	 0x7e00,
1547 	 0x7e00,
1548 	 FALSE),
1549 
1550   HOWTO (R_NIOS2_R2_T1X1I6_2,
1551 	 2,
1552 	 2,
1553 	 6,
1554 	 FALSE,
1555 	 9,
1556 	 complain_overflow_unsigned,
1557 	 bfd_elf_generic_reloc,
1558 	 "R_NIOS2_R2_T1I1X6_2",
1559 	 FALSE,
1560 	 0x7e00,
1561 	 0x7e00,
1562 	 FALSE),
1563 
1564 /* Add other relocations here.  */
1565 };
1566 
1567 static unsigned char elf_code_to_howto_index[R_NIOS2_ILLEGAL + 1];
1568 
1569 
1570 /* Return true if producing output for a R2 BFD.  */
1571 #define BFD_IS_R2(abfd) (bfd_get_mach (abfd) == bfd_mach_nios2r2)
1572 
1573 /* Return the howto for relocation RTYPE.  */
1574 static reloc_howto_type *
1575 lookup_howto (unsigned int rtype, bfd *abfd)
1576 {
1577   static int initialized = 0;
1578   int i;
1579   /* R2 relocations are a superset of R1, so use that for the lookup
1580      table.  */
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]));
1585 
1586   if (!initialized)
1587     {
1588       initialized = 1;
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++)
1592 	{
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);
1597 	}
1598     }
1599 
1600   BFD_ASSERT (rtype <= R_NIOS2_ILLEGAL);
1601   i = elf_code_to_howto_index[rtype];
1602   if (BFD_IS_R2 (abfd))
1603     {
1604       if (i >= r2_howto_tbl_size)
1605 	return 0;
1606       return elf_nios2_r2_howto_table_rel + i;
1607     }
1608   else
1609     {
1610       if (i >= r1_howto_tbl_size)
1611 	return 0;
1612       return elf_nios2_r1_howto_table_rel + i;
1613     }
1614 }
1615 
1616 /* Map for converting BFD reloc types to Nios II reloc types.  */
1617 struct elf_reloc_map
1618 {
1619   bfd_reloc_code_real_type bfd_val;
1620   enum elf_nios2_reloc_type elf_val;
1621 };
1622 
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},
1683 };
1684 
1685 enum elf32_nios2_stub_type
1686 {
1687   nios2_stub_call26_before,
1688   nios2_stub_call26_after,
1689   nios2_stub_none
1690 };
1691 
1692 struct elf32_nios2_stub_hash_entry
1693 {
1694   /* Base hash table entry structure.  */
1695   struct bfd_hash_entry bh_root;
1696 
1697   /* The stub section.  */
1698   asection *stub_sec;
1699 
1700   /* Offset within stub_sec of the beginning of this stub.  */
1701   bfd_vma stub_offset;
1702 
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;
1707 
1708   enum elf32_nios2_stub_type stub_type;
1709 
1710   /* The symbol table entry, if any, that this was derived from.  */
1711   struct elf32_nios2_link_hash_entry *hh;
1712 
1713   /* And the reloc addend that this was derived from.  */
1714   bfd_vma addend;
1715 
1716   /* Where this stub is being called from, or, in the case of combined
1717      stub sections, the first input section in the group.  */
1718   asection *id_sec;
1719 };
1720 
1721 #define nios2_stub_hash_entry(ent) \
1722   ((struct elf32_nios2_stub_hash_entry *)(ent))
1723 
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)))
1727 
1728 
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.  */
1734 
1735 struct elf32_nios2_dyn_relocs
1736 {
1737   struct elf32_nios2_dyn_relocs *next;
1738 
1739   /* The input section of the reloc.  */
1740   asection *sec;
1741 
1742   /* Total number of relocs copied for the input section.  */
1743   bfd_size_type count;
1744 
1745   /* Number of pc-relative relocs copied for the input section.  */
1746   bfd_size_type pc_count;
1747 };
1748 
1749 /* Nios II ELF linker hash entry.  */
1750 
1751 struct elf32_nios2_link_hash_entry
1752 {
1753   struct elf_link_hash_entry root;
1754 
1755   /* A pointer to the most recently used stub hash entry against this
1756      symbol.  */
1757   struct elf32_nios2_stub_hash_entry *hsh_cache;
1758 
1759   /* Track dynamic relocs copied for this symbol.  */
1760   struct elf32_nios2_dyn_relocs *dyn_relocs;
1761 
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;
1767 
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
1773      CALL_USED, meaning
1774      (got_types_used & (GOT_USED | CALL_USED)) == CALL_USED.
1775   */
1776 #define GOT_USED	1
1777 #define CALL_USED	2
1778   unsigned char got_types_used;
1779 };
1780 
1781 #define elf32_nios2_hash_entry(ent) \
1782   ((struct elf32_nios2_link_hash_entry *) (ent))
1783 
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))
1787 
1788 /* Nios II ELF linker hash table.  */
1789 struct elf32_nios2_link_hash_table
1790   {
1791     /* The main hash table.  */
1792     struct elf_link_hash_table root;
1793 
1794     /* The stub hash table.  */
1795     struct bfd_hash_table bstab;
1796 
1797     /* Linker stub bfd.  */
1798     bfd *stub_bfd;
1799 
1800     /* Linker call-backs.  */
1801     asection * (*add_stub_section) (const char *, asection *, bfd_boolean);
1802     void (*layout_sections_again) (void);
1803 
1804     /* Array to keep track of which stub sections have been created, and
1805        information on stub grouping.  */
1806     struct map_stub
1807     {
1808       /* These are the section to which stubs in the group will be
1809 	 attached.  */
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;
1814     } *stub_group;
1815 
1816     /* Assorted information used by nios2_elf32_size_stubs.  */
1817     unsigned int bfd_count;
1818     unsigned int top_index;
1819     asection **input_list;
1820     Elf_Internal_Sym **all_local_syms;
1821 
1822     /* Short-cuts to get to dynamic linker sections.  */
1823     asection *sdynbss;
1824     asection *srelbss;
1825     asection *sbss;
1826 
1827     /* GOT pointer symbol _gp_got.  */
1828     struct elf_link_hash_entry *h_gp_got;
1829 
1830     union {
1831       bfd_signed_vma refcount;
1832       bfd_vma offset;
1833     } tls_ldm_got;
1834 
1835     /* Small local sym cache.  */
1836     struct sym_cache sym_cache;
1837 
1838     bfd_vma res_n_size;
1839   };
1840 
1841 struct nios2_elf32_obj_tdata
1842 {
1843   struct elf_obj_tdata root;
1844 
1845   /* tls_type for each local got entry.  */
1846   char *local_got_tls_type;
1847 
1848   /* TRUE if TLS GD relocs have been seen for this object.  */
1849   bfd_boolean has_tlsgd;
1850 };
1851 
1852 #define elf32_nios2_tdata(abfd) \
1853   ((struct nios2_elf32_obj_tdata *) (abfd)->tdata.any)
1854 
1855 #define elf32_nios2_local_got_tls_type(abfd) \
1856   (elf32_nios2_tdata (abfd)->local_got_tls_type)
1857 
1858 /* The name of the dynamic interpreter.  This is put in the .interp
1859    section.  */
1860 #define ELF_DYNAMIC_INTERPRETER "/lib/ld.so.1"
1861 
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 */
1867 };
1868 
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 */
1877 };
1878 
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 */
1884 };
1885 
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 */
1893 };
1894 
1895 /* CALL26 stub.  */
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 */
1900 };
1901 
1902 /* Install 16-bit immediate value VALUE at offset OFFSET into section SEC.  */
1903 static void
1904 nios2_elf32_install_imm16 (asection *sec, bfd_vma offset, bfd_vma value)
1905 {
1906   bfd_vma word = bfd_get_32 (sec->owner, sec->contents + offset);
1907 
1908   BFD_ASSERT(value <= 0xffff);
1909 
1910   bfd_put_32 (sec->owner, word | ((value & 0xffff) << 6),
1911 	      sec->contents + offset);
1912 }
1913 
1914 /* Install COUNT 32-bit values DATA starting at offset OFFSET into
1915    section SEC. */
1916 static void
1917 nios2_elf32_install_data (asection *sec, const bfd_vma *data, bfd_vma offset,
1918 			  int count)
1919 {
1920   while (count--)
1921     {
1922       bfd_put_32 (sec->owner, *data, sec->contents + offset);
1923       offset += 4;
1924       ++data;
1925     }
1926 }
1927 
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.  */
1933 static
1934 bfd_vma hiadj (bfd_vma symbol_value)
1935 {
1936   return ((symbol_value + 0x8000) >> 16) & 0xffff;
1937 }
1938 
1939 /* Implement elf_backend_grok_prstatus:
1940    Support for core dump NOTE sections.  */
1941 static bfd_boolean
1942 nios2_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
1943 {
1944   int offset;
1945   size_t size;
1946 
1947   switch (note->descsz)
1948     {
1949     default:
1950       return FALSE;
1951 
1952     case 212:	      /* Linux/Nios II */
1953       /* pr_cursig */
1954       elf_tdata (abfd)->core->signal = bfd_get_16 (abfd, note->descdata + 12);
1955 
1956       /* pr_pid */
1957       elf_tdata (abfd)->core->pid = bfd_get_32 (abfd, note->descdata + 24);
1958 
1959       /* pr_reg */
1960       offset = 72;
1961       size = 136;
1962 
1963       break;
1964     }
1965 
1966   /* Make a ".reg/999" section.  */
1967   return _bfd_elfcore_make_pseudosection (abfd, ".reg",
1968 					  size, note->descpos + offset);
1969 }
1970 
1971 /* Implement elf_backend_grok_psinfo.  */
1972 static bfd_boolean
1973 nios2_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
1974 {
1975   switch (note->descsz)
1976     {
1977     default:
1978       return FALSE;
1979 
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);
1985     }
1986 
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.  */
1990 
1991   {
1992     char *command = elf_tdata (abfd)->core->command;
1993     int n = strlen (command);
1994 
1995     if (0 < n && command[n - 1] == ' ')
1996       command[n - 1] = '\0';
1997   }
1998 
1999   return TRUE;
2000 }
2001 
2002 /* Assorted hash table functions.  */
2003 
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,
2008 		   const char *string)
2009 {
2010   /* Allocate the structure if it has not already been allocated by a
2011      subclass.  */
2012   if (entry == NULL)
2013     {
2014       entry = bfd_hash_allocate (table,
2015 				 sizeof (struct elf32_nios2_stub_hash_entry));
2016       if (entry == NULL)
2017 	return entry;
2018     }
2019 
2020   /* Call the allocation method of the superclass.  */
2021   entry = bfd_hash_newfunc (entry, table, string);
2022   if (entry != NULL)
2023     {
2024       struct elf32_nios2_stub_hash_entry *hsh;
2025 
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;
2033       hsh->hh = NULL;
2034       hsh->id_sec = NULL;
2035     }
2036 
2037   return entry;
2038 }
2039 
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)
2044 {
2045   /* Allocate the structure if it has not already been allocated by a
2046      subclass.  */
2047   if (entry == NULL)
2048     {
2049       entry = bfd_hash_allocate (table,
2050 				 sizeof (struct elf32_nios2_link_hash_entry));
2051       if (entry == NULL)
2052 	return entry;
2053     }
2054 
2055   /* Call the allocation method of the superclass.  */
2056   entry = _bfd_elf_link_hash_newfunc (entry, table, string);
2057   if (entry)
2058     {
2059       struct elf32_nios2_link_hash_entry *eh;
2060 
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;
2066     }
2067 
2068   return entry;
2069 }
2070 
2071 /* Section name for stubs is the associated section name plus this
2072    string.  */
2073 #define STUB_SUFFIX ".stub"
2074 
2075 /* Build a name for an entry in the stub hash table.  */
2076 static char *
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)
2082 {
2083   char *stub_name;
2084   bfd_size_type len;
2085   char stubpos = (stub_type == nios2_stub_call26_before) ? 'b' : 'a';
2086 
2087   if (hh)
2088     {
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)
2092 	{
2093 	  sprintf (stub_name, "%08x_%c_%s+%x",
2094 		   input_section->id & 0xffffffff,
2095 		   stubpos,
2096 		   hh->root.root.root.string,
2097 		   (int) rel->r_addend & 0xffffffff);
2098 	}
2099     }
2100   else
2101     {
2102       len = 8 + 1 + 1 + 1+ 8 + 1 + 8 + 1 + 8 + 1;
2103       stub_name = bfd_malloc (len);
2104       if (stub_name != NULL)
2105 	{
2106 	  sprintf (stub_name, "%08x_%c_%x:%x+%x",
2107 		   input_section->id & 0xffffffff,
2108 		   stubpos,
2109 		   sym_sec->id & 0xffffffff,
2110 		   (int) ELF32_R_SYM (rel->r_info) & 0xffffffff,
2111 		   (int) rel->r_addend & 0xffffffff);
2112 	}
2113     }
2114   return stub_name;
2115 }
2116 
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)
2126 {
2127   struct elf32_nios2_stub_hash_entry *hsh;
2128   const asection *id_sec;
2129 
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;
2138   else
2139     id_sec = htab->stub_group[input_section->id].last_sec;
2140 
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)
2145     {
2146       hsh = hh->hsh_cache;
2147     }
2148   else
2149     {
2150       char *stub_name;
2151 
2152       stub_name = nios2_stub_name (id_sec, sym_sec, hh, rel, stub_type);
2153       if (stub_name == NULL)
2154 	return NULL;
2155 
2156       hsh = nios2_stub_hash_lookup (&htab->bstab,
2157 				    stub_name, FALSE, FALSE);
2158 
2159       if (hh != NULL)
2160 	hh->hsh_cache = hsh;
2161 
2162       free (stub_name);
2163     }
2164 
2165   return hsh;
2166 }
2167 
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,
2172 		asection *section,
2173 		struct elf32_nios2_link_hash_table *htab,
2174 		enum elf32_nios2_stub_type stub_type)
2175 {
2176   asection *link_sec;
2177   asection *stub_sec;
2178   asection **secptr, **linkptr;
2179   struct elf32_nios2_stub_hash_entry *hsh;
2180   bfd_boolean afterp;
2181 
2182   if (stub_type == nios2_stub_call26_before)
2183     {
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);
2187       afterp = FALSE;
2188     }
2189   else
2190     {
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);
2194       afterp = TRUE;
2195     }
2196   stub_sec = *secptr;
2197   if (stub_sec == NULL)
2198     {
2199       stub_sec = *linkptr;
2200       if (stub_sec == NULL)
2201 	{
2202 	  size_t namelen;
2203 	  bfd_size_type len;
2204 	  char *s_name;
2205 
2206 	  namelen = strlen (link_sec->name);
2207 	  len = namelen + sizeof (STUB_SUFFIX);
2208 	  s_name = bfd_alloc (htab->stub_bfd, len);
2209 	  if (s_name == NULL)
2210 	    return NULL;
2211 
2212 	  memcpy (s_name, link_sec->name, namelen);
2213 	  memcpy (s_name + namelen, STUB_SUFFIX, sizeof (STUB_SUFFIX));
2214 
2215 	  stub_sec = (*htab->add_stub_section) (s_name, link_sec, afterp);
2216 	  if (stub_sec == NULL)
2217 	    return NULL;
2218 	  *linkptr = stub_sec;
2219 	}
2220       *secptr = stub_sec;
2221     }
2222 
2223   /* Enter this entry into the linker stub hash table.  */
2224   hsh = nios2_stub_hash_lookup (&htab->bstab, stub_name,
2225 				TRUE, FALSE);
2226   if (hsh == NULL)
2227     {
2228       (*_bfd_error_handler) (_("%B: cannot create stub entry %s"),
2229 			     section->owner,
2230 			     stub_name);
2231       return NULL;
2232     }
2233 
2234   hsh->stub_sec = stub_sec;
2235   hsh->stub_offset = 0;
2236   hsh->id_sec = link_sec;
2237   return hsh;
2238 }
2239 
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.  */
2243 int
2244 nios2_elf32_setup_section_lists (bfd *output_bfd, struct bfd_link_info *info)
2245 {
2246   bfd *input_bfd;
2247   unsigned int bfd_count;
2248   unsigned int top_id, top_index;
2249   asection *section;
2250   asection **input_list, **list;
2251   bfd_size_type amt;
2252   struct elf32_nios2_link_hash_table *htab = elf32_nios2_hash_table (info);
2253 
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;
2256        input_bfd != NULL;
2257        input_bfd = input_bfd->link.next)
2258     {
2259       bfd_count += 1;
2260       for (section = input_bfd->sections;
2261 	   section != NULL;
2262 	   section = section->next)
2263 	{
2264 	  if (top_id < section->id)
2265 	    top_id = section->id;
2266 	}
2267     }
2268 
2269   htab->bfd_count = bfd_count;
2270 
2271   amt = sizeof (struct map_stub) * (top_id + 1);
2272   htab->stub_group = bfd_zmalloc (amt);
2273   if (htab->stub_group == NULL)
2274     return -1;
2275 
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;
2280        section != NULL;
2281        section = section->next)
2282     {
2283       if (top_index < section->index)
2284 	top_index = section->index;
2285     }
2286 
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)
2292     return -1;
2293 
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;
2297   do
2298     *list = bfd_abs_section_ptr;
2299   while (list-- != input_list);
2300 
2301   for (section = output_bfd->sections;
2302        section != NULL;
2303        section = section->next)
2304     {
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;
2311     }
2312 
2313   return 1;
2314 }
2315 
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.  */
2320 void
2321 nios2_elf32_next_input_section (struct bfd_link_info *info, asection *isec)
2322 {
2323   struct elf32_nios2_link_hash_table *htab = elf32_nios2_hash_table (info);
2324 
2325   if (isec->output_section->index <= htab->top_index)
2326     {
2327       asection **list = htab->input_list + isec->output_section->index;
2328       if (*list != bfd_abs_section_ptr)
2329 	{
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;
2334 	  *list = isec;
2335 	}
2336     }
2337 }
2338 
2339 /* Segment mask for CALL26 relocation relaxation.  */
2340 #define CALL26_SEGMENT(x) ((x) & 0xf0000000)
2341 
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
2348 
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
2360    target, etc.  */
2361 static void
2362 group_sections (struct elf32_nios2_link_hash_table *htab)
2363 {
2364   asection **list = htab->input_list + htab->top_index;
2365   do
2366     {
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
2370 	 group.  */
2371       asection *tail = *list;
2372       if (tail == bfd_abs_section_ptr)
2373 	continue;
2374       while (tail != NULL)
2375 	{
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);
2379 	  asection *prev;
2380 
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.  */
2389 	    {
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;
2393 	    }
2394 	  else
2395 	    /* Collect more sections for this group.  */
2396 	    {
2397 	      asection *curr, *first;
2398 	      for (curr = tail; ; curr = prev)
2399 		{
2400 		  prev = htab->stub_group[curr->id].last_sec;
2401 		  if (!prev
2402 		      || tail->output_section != prev->output_section
2403 		      || (CALL26_SEGMENT (prev->output_section->vma
2404 					  + prev->output_offset)
2405 			  != segment))
2406 		    break;
2407 		}
2408 	      first = curr;
2409 	      for (curr = tail; ; curr = prev)
2410 		{
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;
2414 		  if (curr == first)
2415 		    break;
2416 		}
2417 	    }
2418 
2419 	  /* Reset tail for the next group.  */
2420 	  tail = prev;
2421 	}
2422     }
2423   while (list-- != htab->input_list);
2424   free (htab->input_list);
2425 }
2426 
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)
2435 {
2436   bfd_vma location, segment, start, end;
2437   asection *s0, *s1, *s;
2438 
2439   if (hh != NULL &&
2440       !(hh->root.root.type == bfd_link_hash_defined
2441 	|| hh->root.root.type == bfd_link_hash_defweak))
2442     return nios2_stub_none;
2443 
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);
2448 
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;
2453 
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;
2462   else
2463     start = s0->output_section->vma + s0->output_offset;
2464 
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;
2469   else
2470     end = s1->output_section->vma + s1->output_offset + s1->size;
2471 
2472   BFD_ASSERT (start < end);
2473   BFD_ASSERT (start <= location);
2474   BFD_ASSERT (location < end);
2475 
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.
2482 
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.  */
2496 
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;
2501   else
2502     /* Perhaps this should be a dedicated error code.  */
2503     return nios2_stub_none;
2504 }
2505 
2506 static bfd_boolean
2507 nios2_build_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg ATTRIBUTE_UNUSED)
2508 {
2509   struct elf32_nios2_stub_hash_entry *hsh
2510     = (struct elf32_nios2_stub_hash_entry *) gen_entry;
2511   asection *stub_sec = hsh->stub_sec;
2512   bfd_vma sym_value;
2513 
2514   /* Make a note of the offset within the stubs for this entry.  */
2515   hsh->stub_offset = stub_sec->size;
2516 
2517   switch (hsh->stub_type)
2518     {
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)
2524 	   jmp at
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
2530 		   + hsh->addend);
2531 
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,
2535 				 hiadj (sym_value));
2536       nios2_elf32_install_imm16 (stub_sec, hsh->stub_offset + 4,
2537 				 (sym_value & 0xffff));
2538       stub_sec->size += 12;
2539       break;
2540     default:
2541       BFD_FAIL ();
2542       return FALSE;
2543     }
2544 
2545   return TRUE;
2546 }
2547 
2548 /* As above, but don't actually build the stub.  Just bump offset so
2549    we know stub section sizes.  */
2550 static bfd_boolean
2551 nios2_size_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg ATTRIBUTE_UNUSED)
2552 {
2553   struct elf32_nios2_stub_hash_entry *hsh
2554     = (struct elf32_nios2_stub_hash_entry *) gen_entry;
2555 
2556   switch (hsh->stub_type)
2557     {
2558     case nios2_stub_call26_before:
2559     case nios2_stub_call26_after:
2560       hsh->stub_sec->size += 12;
2561       break;
2562     default:
2563       BFD_FAIL ();
2564       return FALSE;
2565     }
2566   return TRUE;
2567 }
2568 
2569 /* Read in all local syms for all input bfds.
2570    Returns -1 on error, 0 otherwise.  */
2571 
2572 static int
2573 get_local_syms (bfd *output_bfd ATTRIBUTE_UNUSED, bfd *input_bfd,
2574 		struct bfd_link_info *info)
2575 {
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);
2579 
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)
2587     return -1;
2588 
2589   /* Walk over all the input BFDs, swapping in local symbols.  */
2590   for (bfd_indx = 0;
2591        input_bfd != NULL;
2592        input_bfd = input_bfd->link.next, bfd_indx++)
2593     {
2594       Elf_Internal_Shdr *symtab_hdr;
2595 
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)
2599 	continue;
2600 
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)
2604 	{
2605 	  local_syms = bfd_elf_get_elf_syms (input_bfd, symtab_hdr,
2606 					     symtab_hdr->sh_info, 0,
2607 					     NULL, NULL, NULL);
2608 	  /* Cache them for elf_link_input_bfd.  */
2609 	  symtab_hdr->contents = (unsigned char *) local_syms;
2610 	}
2611       if (local_syms == NULL)
2612 	return -1;
2613 
2614       all_local_syms[bfd_indx] = local_syms;
2615     }
2616 
2617   return 0;
2618 }
2619 
2620 /* Determine and set the size of the stub section for a final link.  */
2621 bfd_boolean
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))
2627 {
2628   bfd_boolean stub_changed = FALSE;
2629   struct elf32_nios2_link_hash_table *htab = elf32_nios2_hash_table (info);
2630 
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;
2635 
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);
2641 
2642   if (get_local_syms (output_bfd, info->input_bfds, info))
2643     {
2644       if (htab->all_local_syms)
2645 	goto error_ret_free_local;
2646       return FALSE;
2647     }
2648 
2649   while (1)
2650     {
2651       bfd *input_bfd;
2652       unsigned int bfd_indx;
2653       asection *stub_sec;
2654 
2655       for (input_bfd = info->input_bfds, bfd_indx = 0;
2656 	   input_bfd != NULL;
2657 	   input_bfd = input_bfd->link.next, bfd_indx++)
2658 	{
2659 	  Elf_Internal_Shdr *symtab_hdr;
2660 	  asection *section;
2661 	  Elf_Internal_Sym *local_syms;
2662 
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)
2666 	    continue;
2667 
2668 	  local_syms = htab->all_local_syms[bfd_indx];
2669 
2670 	  /* Walk over each section attached to the input bfd.  */
2671 	  for (section = input_bfd->sections;
2672 	       section != NULL;
2673 	       section = section->next)
2674 	    {
2675 	      Elf_Internal_Rela *internal_relocs, *irelaend, *irela;
2676 
2677 	      /* If there aren't any relocs, then there's nothing more
2678 		 to do.  */
2679 	      if ((section->flags & SEC_RELOC) == 0
2680 		  || section->reloc_count == 0)
2681 		continue;
2682 
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)
2687 		continue;
2688 
2689 	      /* Get the relocs.  */
2690 	      internal_relocs
2691 		= _bfd_elf_link_read_relocs (input_bfd, section, NULL, NULL,
2692 					     info->keep_memory);
2693 	      if (internal_relocs == NULL)
2694 		goto error_ret_free_local;
2695 
2696 	      /* Now examine each relocation.  */
2697 	      irela = internal_relocs;
2698 	      irelaend = irela + section->reloc_count;
2699 	      for (; irela < irelaend; irela++)
2700 		{
2701 		  unsigned int r_type, r_indx;
2702 		  enum elf32_nios2_stub_type stub_type;
2703 		  struct elf32_nios2_stub_hash_entry *hsh;
2704 		  asection *sym_sec;
2705 		  bfd_vma sym_value;
2706 		  bfd_vma destination;
2707 		  struct elf32_nios2_link_hash_entry *hh;
2708 		  char *stub_name;
2709 		  const asection *id_sec;
2710 
2711 		  r_type = ELF32_R_TYPE (irela->r_info);
2712 		  r_indx = ELF32_R_SYM (irela->r_info);
2713 
2714 		  if (r_type >= (unsigned int) R_NIOS2_ILLEGAL)
2715 		    {
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;
2721 		    }
2722 
2723 		  /* Only look for stubs on CALL and JMPI instructions.  */
2724 		  if (r_type != (unsigned int) R_NIOS2_CALL26)
2725 		    continue;
2726 
2727 		  /* Now determine the call target, its name, value,
2728 		     section.  */
2729 		  sym_sec = NULL;
2730 		  sym_value = 0;
2731 		  destination = 0;
2732 		  hh = NULL;
2733 		  if (r_indx < symtab_hdr->sh_info)
2734 		    {
2735 		      /* It's a local symbol.  */
2736 		      Elf_Internal_Sym *sym;
2737 		      Elf_Internal_Shdr *hdr;
2738 		      unsigned int shndx;
2739 
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))
2745 			{
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);
2751 			}
2752 		    }
2753 		  else
2754 		    {
2755 		      /* It's an external symbol.  */
2756 		      int e_indx;
2757 
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]);
2761 
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);
2766 
2767 		      if (hh->root.root.type == bfd_link_hash_defined
2768 			  || hh->root.root.type == bfd_link_hash_defweak)
2769 			{
2770 			  sym_sec = hh->root.root.u.def.section;
2771 			  sym_value = hh->root.root.u.def.value;
2772 
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);
2777 			  else
2778 			    continue;
2779 			}
2780 		      else if (hh->root.root.type == bfd_link_hash_undefweak)
2781 			{
2782 			  if (! bfd_link_pic (info))
2783 			    continue;
2784 			}
2785 		      else if (hh->root.root.type == bfd_link_hash_undefined)
2786 			{
2787 			  if (! (info->unresolved_syms_in_objects == RM_IGNORE
2788 				 && (ELF_ST_VISIBILITY (hh->root.other)
2789 				     == STV_DEFAULT)))
2790 			    continue;
2791 			}
2792 		      else
2793 			{
2794 			  bfd_set_error (bfd_error_bad_value);
2795 			  goto error_ret_free_internal;
2796 			}
2797 		    }
2798 
2799 		  /* Determine what (if any) linker stub is needed.  */
2800 		  stub_type = nios2_type_of_stub (section, irela, hh, htab,
2801 						  destination, info);
2802 		  if (stub_type == nios2_stub_none)
2803 		    continue;
2804 
2805 		  /* Support for grouping stub sections.  */
2806 		  if (stub_type == nios2_stub_call26_before)
2807 		    id_sec = htab->stub_group[section->id].first_sec;
2808 		  else
2809 		    id_sec = htab->stub_group[section->id].last_sec;
2810 
2811 		  /* Get the name of this stub.  */
2812 		  stub_name = nios2_stub_name (id_sec, sym_sec, hh, irela,
2813 					       stub_type);
2814 		  if (!stub_name)
2815 		    goto error_ret_free_internal;
2816 
2817 		  hsh = nios2_stub_hash_lookup (&htab->bstab,
2818 						stub_name,
2819 						FALSE, FALSE);
2820 		  if (hsh != NULL)
2821 		    {
2822 		      /* The proper stub has already been created.  */
2823 		      free (stub_name);
2824 		      continue;
2825 		    }
2826 
2827 		  hsh = nios2_add_stub (stub_name, section, htab, stub_type);
2828 		  if (hsh == NULL)
2829 		    {
2830 		      free (stub_name);
2831 		      goto error_ret_free_internal;
2832 		    }
2833 		  hsh->target_value = sym_value;
2834 		  hsh->target_section = sym_sec;
2835 		  hsh->stub_type = stub_type;
2836 		  hsh->hh = hh;
2837 		  hsh->addend = irela->r_addend;
2838 		  stub_changed = TRUE;
2839 		}
2840 
2841 	      /* We're done with the internal relocs, free them.  */
2842 	      if (elf_section_data (section)->relocs == NULL)
2843 		free (internal_relocs);
2844 	    }
2845 	}
2846 
2847       if (!stub_changed)
2848 	break;
2849 
2850       /* OK, we've added some stubs.  Find out the new size of the
2851 	 stub sections.  */
2852       for (stub_sec = htab->stub_bfd->sections;
2853 	   stub_sec != NULL;
2854 	   stub_sec = stub_sec->next)
2855 	stub_sec->size = 0;
2856 
2857       bfd_hash_traverse (&htab->bstab, nios2_size_one_stub, htab);
2858 
2859       /* Ask the linker to do its stuff.  */
2860       (*htab->layout_sections_again) ();
2861       stub_changed = FALSE;
2862     }
2863 
2864   free (htab->all_local_syms);
2865   return TRUE;
2866 
2867  error_ret_free_local:
2868   free (htab->all_local_syms);
2869   return FALSE;
2870 }
2871 
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.  */
2875 bfd_boolean
2876 nios2_elf32_build_stubs (struct bfd_link_info *info)
2877 {
2878   asection *stub_sec;
2879   struct bfd_hash_table *table;
2880   struct elf32_nios2_link_hash_table *htab;
2881 
2882   htab = elf32_nios2_hash_table (info);
2883 
2884   for (stub_sec = htab->stub_bfd->sections;
2885        stub_sec != NULL;
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)
2892       {
2893 	bfd_size_type size;
2894 
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)
2899 	  return FALSE;
2900 	stub_sec->size = 0;
2901       }
2902 
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);
2906 
2907   return TRUE;
2908 }
2909 
2910 
2911 #define is_nios2_elf(bfd) \
2912   (bfd_get_flavour (bfd) == bfd_target_elf_flavour \
2913    && elf_object_id (bfd) == NIOS2_ELF_DATA)
2914 
2915 /* Merge backend specific data from an object file to the output
2916    object file when linking.  */
2917 
2918 static bfd_boolean
2919 nios2_elf32_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
2920 {
2921   flagword old_flags;
2922   flagword new_flags;
2923 
2924   if (!is_nios2_elf (ibfd) || !is_nios2_elf (obfd))
2925     return TRUE;
2926 
2927   /* Check if we have the same endianness.  */
2928   if (! _bfd_generic_verify_endian_match (ibfd, obfd))
2929     return FALSE;
2930 
2931   new_flags = elf_elfheader (ibfd)->e_flags;
2932   old_flags = elf_elfheader (obfd)->e_flags;
2933   if (!elf_flags_init (obfd))
2934     {
2935       /* First call, no flags set.  */
2936       elf_flags_init (obfd) = TRUE;
2937       elf_elfheader (obfd)->e_flags = new_flags;
2938 
2939       switch (new_flags)
2940 	{
2941 	default:
2942 	case EF_NIOS2_ARCH_R1:
2943 	  bfd_default_set_arch_mach (obfd, bfd_arch_nios2, bfd_mach_nios2r1);
2944 	  break;
2945 	case EF_NIOS2_ARCH_R2:
2946 	  if (bfd_big_endian (ibfd))
2947 	    {
2948 	      (*_bfd_error_handler)
2949 		(_("error: %B: Big-endian R2 is not supported."), ibfd);
2950 	      bfd_set_error (bfd_error_bad_value);
2951 	      return FALSE;
2952 	    }
2953 	  bfd_default_set_arch_mach (obfd, bfd_arch_nios2, bfd_mach_nios2r2);
2954 	  break;
2955 	}
2956     }
2957 
2958   /* Incompatible flags.  */
2959   else if (new_flags != old_flags)
2960     {
2961       /* So far, the only incompatible flags denote incompatible
2962 	 architectures.  */
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);
2967       return FALSE;
2968     }
2969 
2970   /* Merge Tag_compatibility attributes and any common GNU ones.  */
2971   _bfd_elf_merge_object_attributes (ibfd, obfd);
2972 
2973   return TRUE;
2974 }
2975 
2976 
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)
2982 {
2983   int i;
2984 
2985   for (i = 0;
2986        i < (int) (sizeof (nios2_reloc_map) / sizeof (struct elf_reloc_map));
2987        ++i)
2988     if (nios2_reloc_map[i].bfd_val == code)
2989       return lookup_howto (nios2_reloc_map[i].elf_val, abfd);
2990   return NULL;
2991 }
2992 
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,
2997 				   const char *r_name)
2998 {
2999   int i;
3000   reloc_howto_type *howto_tbl;
3001   int howto_tbl_size;
3002 
3003   if (BFD_IS_R2 (abfd))
3004     {
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]));
3008     }
3009   else
3010     {
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]));
3014     }
3015 
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;
3019   return NULL;
3020 }
3021 
3022 /* Implement elf_info_to_howto:
3023    Given a ELF32 relocation, fill in a arelent structure.  */
3024 static void
3025 nios2_elf32_info_to_howto (bfd *abfd, arelent *cache_ptr,
3026 			   Elf_Internal_Rela *dst)
3027 {
3028   unsigned int r_type;
3029 
3030   r_type = ELF32_R_TYPE (dst->r_info);
3031   cache_ptr->howto = lookup_howto (r_type, abfd);
3032 }
3033 
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.  */
3037 static bfd_vma
3038 dtpoff_base (struct bfd_link_info *info)
3039 {
3040   /* If tls_sec is NULL, we should have signalled an error already.  */
3041   if (elf_hash_table (info)->tls_sec == NULL)
3042     return 0;
3043   return elf_hash_table (info)->tls_sec->vma;
3044 }
3045 
3046 /* Return the relocation value for @tpoff relocation
3047    if STT_TLS virtual address is ADDRESS.  */
3048 static bfd_vma
3049 tpoff (struct bfd_link_info *info, bfd_vma address)
3050 {
3051   struct elf_link_hash_table *htab = elf_hash_table (info);
3052 
3053   /* If tls_sec is NULL, we should have signalled an error already.  */
3054   if (htab->tls_sec == NULL)
3055     return 0;
3056   return address - htab->tls_sec->vma;
3057 }
3058 
3059 /* Set the GP value for OUTPUT_BFD.  Returns FALSE if this is a
3060    dangerous relocation.  */
3061 static bfd_boolean
3062 nios2_elf_assign_gp (bfd *output_bfd, bfd_vma *pgp, struct bfd_link_info *info)
3063 {
3064 
3065   bfd_boolean gp_found;
3066   struct bfd_hash_entry *h;
3067   struct bfd_link_hash_entry *lh;
3068 
3069   /* If we've already figured out what GP will be, just return it. */
3070   *pgp = _bfd_get_gp_value (output_bfd);
3071   if (*pgp)
3072     return TRUE;
3073 
3074   h = bfd_hash_lookup (&info->hash->table, "_gp", FALSE, FALSE);
3075   lh = (struct bfd_link_hash_entry *) h;
3076 lookup:
3077   if (lh)
3078     {
3079       switch (lh->type)
3080 	{
3081 	case bfd_link_hash_undefined:
3082 	case bfd_link_hash_undefweak:
3083 	case bfd_link_hash_common:
3084 	  gp_found = FALSE;
3085 	  break;
3086 	case bfd_link_hash_defined:
3087 	case bfd_link_hash_defweak:
3088 	  gp_found = TRUE;
3089 	  *pgp = lh->u.def.value;
3090 	  break;
3091 	case bfd_link_hash_indirect:
3092 	case bfd_link_hash_warning:
3093 	  lh = lh->u.i.link;
3094 	  /* @@FIXME  ignoring warning for now */
3095 	  goto lookup;
3096 	case bfd_link_hash_new:
3097 	default:
3098 	  abort ();
3099 	}
3100     }
3101   else
3102     gp_found = FALSE;
3103 
3104   if (!gp_found)
3105     {
3106       /* Only get the error once. */
3107       *pgp = 4;
3108       _bfd_set_gp_value (output_bfd, *pgp);
3109       return FALSE;
3110     }
3111 
3112   _bfd_set_gp_value (output_bfd, *pgp);
3113 
3114   return TRUE;
3115 }
3116 
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
3121    output.  */
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)
3125 {
3126   if (bfd_is_und_section (symbol->section) && !relocatable)
3127     {
3128       *pgp = 0;
3129       return bfd_reloc_undefined;
3130     }
3131 
3132   *pgp = _bfd_get_gp_value (output_bfd);
3133   if (*pgp == 0 && (!relocatable || (symbol->flags & BSF_SECTION_SYM) != 0))
3134     {
3135       if (relocatable)
3136 	{
3137 	  /* Make up a value.  */
3138 	  *pgp = symbol->section->output_section->vma + 0x4000;
3139 	  _bfd_set_gp_value (output_bfd, *pgp);
3140 	}
3141       else
3142 	{
3143 	  *error_message
3144 	    = (char *) _("global pointer relative relocation when _gp not defined");
3145 	  return bfd_reloc_dangerous;
3146 	}
3147     }
3148 
3149   return bfd_reloc_ok;
3150 }
3151 
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)
3158 {
3159   symbol_value = symbol_value + addend;
3160   addend = 0;
3161   symbol_value = (symbol_value >> 16) & 0xffff;
3162   return _bfd_final_link_relocate (howto, abfd, input_section,
3163 				   data, offset, symbol_value, addend);
3164 }
3165 
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)
3171 {
3172   symbol_value = symbol_value + addend;
3173   addend = 0;
3174   symbol_value = symbol_value & 0xffff;
3175   return _bfd_final_link_relocate (howto, abfd, input_section,
3176 				   data, offset, symbol_value, addend);
3177 }
3178 
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)
3184 {
3185   symbol_value = symbol_value + addend;
3186   addend = 0;
3187   symbol_value = hiadj(symbol_value);
3188   return _bfd_final_link_relocate (howto, abfd, input_section, data, offset,
3189 				   symbol_value, addend);
3190 }
3191 
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)
3197 {
3198   symbol_value = symbol_value + addend;
3199   addend = 0;
3200   symbol_value = symbol_value & 0xffff;
3201   return _bfd_final_link_relocate (howto, abfd, input_section,
3202 				   data, offset, symbol_value, addend);
3203 }
3204 
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)
3210 {
3211   symbol_value = symbol_value + addend;
3212   symbol_value -= (input_section->output_section->vma
3213 		   + input_section->output_offset);
3214   symbol_value -= offset;
3215   addend = 0;
3216   symbol_value = hiadj(symbol_value);
3217   return _bfd_final_link_relocate (howto, abfd, input_section, data, offset,
3218 				   symbol_value, addend);
3219 }
3220 
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)
3226 {
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;
3230   addend = 0;
3231   return _bfd_final_link_relocate (howto, abfd, input_section,
3232 				   data, offset, symbol_value, addend);
3233 }
3234 
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)
3240 {
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
3245 			 + offset))
3246     return bfd_reloc_overflow;
3247 
3248   /* Check that the target address is correctly aligned on a 4-byte
3249      boundary.  */
3250   if ((symbol_value + addend) & 0x3)
3251     return bfd_reloc_overflow;
3252 
3253   return _bfd_final_link_relocate (howto, abfd, input_section,
3254 				   data, offset, symbol_value, addend);
3255 }
3256 
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)
3262 {
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);
3267 }
3268 
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)
3274 {
3275   bfd_vma symbol_lo16, symbol_hi16;
3276   bfd_reloc_status_type r;
3277   symbol_value = symbol_value + addend;
3278   addend = 0;
3279   symbol_hi16 = (symbol_value >> 16) & 0xffff;
3280   symbol_lo16 = symbol_value & 0xffff;
3281 
3282   r = _bfd_final_link_relocate (howto, abfd, input_section,
3283 				data, offset, symbol_hi16, addend);
3284 
3285   if (r == bfd_reloc_ok)
3286     return _bfd_final_link_relocate (howto, abfd, input_section,
3287 				     data, offset + 4, symbol_lo16, addend);
3288 
3289   return r;
3290 }
3291 
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)
3297 {
3298   bfd_vma symbol_lo16, symbol_hi16;
3299   bfd_reloc_status_type r;
3300   symbol_value = symbol_value + addend;
3301   addend = 0;
3302   symbol_hi16 = (symbol_value >> 16) & 0xffff;
3303   symbol_lo16 = symbol_value & 0xffff;
3304 
3305   r = _bfd_final_link_relocate (howto, abfd, input_section,
3306 				data, offset, symbol_hi16, addend);
3307 
3308   if (r == bfd_reloc_ok)
3309     return _bfd_final_link_relocate (howto, abfd, input_section,
3310 				     data, offset + 4, symbol_lo16, addend);
3311 
3312   return r;
3313 }
3314 
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)
3320 {
3321   bfd_vma symbol_lo16, symbol_hi16;
3322   bfd_reloc_status_type r;
3323   symbol_value = symbol_value + addend;
3324   addend = 0;
3325   symbol_hi16 = (symbol_value >> 16) & 0xffff;
3326   symbol_lo16 = symbol_value & 0xffff;
3327 
3328   r = _bfd_final_link_relocate (howto, abfd, input_section,
3329 				data, offset, symbol_hi16, addend);
3330 
3331   if (r == bfd_reloc_ok)
3332     return _bfd_final_link_relocate (howto, abfd, input_section,
3333 				     data, offset + 4, symbol_lo16, addend);
3334 
3335   return r;
3336 }
3337 
3338 /* HOWTO handlers for relocations that require special handling.  */
3339 
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,
3346 			  bfd *output_bfd,
3347 			  char **error_message ATTRIBUTE_UNUSED)
3348 {
3349   if (output_bfd != NULL)
3350     reloc_entry->address += input_section->output_offset;
3351   return bfd_reloc_ok;
3352 }
3353 
3354 static bfd_reloc_status_type
3355 nios2_elf32_hi16_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
3356 			   void *data, asection *input_section,
3357 			   bfd *output_bfd,
3358 			   char **error_message ATTRIBUTE_UNUSED)
3359 {
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))
3364     {
3365       reloc_entry->address += input_section->output_offset;
3366       return bfd_reloc_ok;
3367     }
3368 
3369   if (output_bfd != NULL)
3370     /* FIXME: See bfd_perform_relocation.  Is this right?  */
3371     return bfd_reloc_continue;
3372 
3373   return nios2_elf32_do_hi16_relocate (abfd, reloc_entry->howto,
3374 				       input_section,
3375 				       data, reloc_entry->address,
3376 				       (symbol->value
3377 					+ symbol->section->output_section->vma
3378 					+ symbol->section->output_offset),
3379 				       reloc_entry->addend);
3380 }
3381 
3382 static bfd_reloc_status_type
3383 nios2_elf32_lo16_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
3384 			   void *data, asection *input_section,
3385 			   bfd *output_bfd,
3386 			   char **error_message ATTRIBUTE_UNUSED)
3387 {
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))
3392     {
3393       reloc_entry->address += input_section->output_offset;
3394       return bfd_reloc_ok;
3395     }
3396 
3397   if (output_bfd != NULL)
3398     /* FIXME: See bfd_perform_relocation.  Is this right?  */
3399     return bfd_reloc_continue;
3400 
3401   return nios2_elf32_do_lo16_relocate (abfd, reloc_entry->howto,
3402 				       input_section,
3403 				       data, reloc_entry->address,
3404 				       (symbol->value
3405 					+ symbol->section->output_section->vma
3406 					+ symbol->section->output_offset),
3407 				       reloc_entry->addend);
3408 }
3409 
3410 static bfd_reloc_status_type
3411 nios2_elf32_hiadj16_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
3412 			      void *data, asection *input_section,
3413 			      bfd *output_bfd,
3414 			      char **error_message ATTRIBUTE_UNUSED)
3415 {
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))
3420     {
3421       reloc_entry->address += input_section->output_offset;
3422       return bfd_reloc_ok;
3423     }
3424 
3425   if (output_bfd != NULL)
3426     /* FIXME: See bfd_perform_relocation.  Is this right?  */
3427     return bfd_reloc_continue;
3428 
3429   return nios2_elf32_do_hiadj16_relocate (abfd, reloc_entry->howto,
3430 					  input_section,
3431 					  data, reloc_entry->address,
3432 					  (symbol->value
3433 					   + symbol->section->output_section->vma
3434 					   + symbol->section->output_offset),
3435 					  reloc_entry->addend);
3436 }
3437 
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)
3443 {
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))
3448     {
3449       reloc_entry->address += input_section->output_offset;
3450       return bfd_reloc_ok;
3451     }
3452 
3453   if (output_bfd != NULL)
3454     /* FIXME: See bfd_perform_relocation.  Is this right?  */
3455     return bfd_reloc_continue;
3456 
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);
3462 }
3463 
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)
3469 {
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))
3474     {
3475       reloc_entry->address += input_section->output_offset;
3476       return bfd_reloc_ok;
3477     }
3478 
3479   if (output_bfd != NULL)
3480     /* FIXME: See bfd_perform_relocation.  Is this right?  */
3481     return bfd_reloc_continue;
3482 
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);
3488 }
3489 
3490 static bfd_reloc_status_type
3491 nios2_elf32_pcrel16_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
3492 			      void *data, asection *input_section,
3493 			      bfd *output_bfd,
3494 			      char **error_message ATTRIBUTE_UNUSED)
3495 {
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))
3500     {
3501       reloc_entry->address += input_section->output_offset;
3502       return bfd_reloc_ok;
3503     }
3504 
3505   if (output_bfd != NULL)
3506     /* FIXME: See bfd_perform_relocation.  Is this right?  */
3507     return bfd_reloc_continue;
3508 
3509   return nios2_elf32_do_pcrel16_relocate (abfd, reloc_entry->howto,
3510 					  input_section,
3511 					  data, reloc_entry->address,
3512 					  (symbol->value
3513 					   + symbol->section->output_section->vma
3514 					   + symbol->section->output_offset),
3515 					  reloc_entry->addend);
3516 }
3517 
3518 static bfd_reloc_status_type
3519 nios2_elf32_call26_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
3520 			     void *data, asection *input_section,
3521 			     bfd *output_bfd,
3522 			     char **error_message ATTRIBUTE_UNUSED)
3523 {
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))
3528     {
3529       reloc_entry->address += input_section->output_offset;
3530       return bfd_reloc_ok;
3531     }
3532 
3533   if (output_bfd != NULL)
3534     /* FIXME: See bfd_perform_relocation.  Is this right?  */
3535     return bfd_reloc_continue;
3536 
3537   return nios2_elf32_do_call26_relocate (abfd, reloc_entry->howto,
3538 					 input_section,
3539 					 data, reloc_entry->address,
3540 					 (symbol->value
3541 					  + symbol->section->output_section->vma
3542 					  + symbol->section->output_offset),
3543 					 reloc_entry->addend);
3544 }
3545 
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)
3550 {
3551   bfd_vma relocation;
3552   bfd_vma gp;
3553   bfd_reloc_status_type r;
3554 
3555 
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))
3560     {
3561       reloc_entry->address += input_section->output_offset;
3562       return bfd_reloc_ok;
3563     }
3564 
3565   if (output_bfd != NULL)
3566     /* FIXME: See bfd_perform_relocation.  Is this right?  */
3567     return bfd_reloc_continue;
3568 
3569   relocation = (symbol->value
3570 		+ symbol->section->output_section->vma
3571 		+ symbol->section->output_offset);
3572 
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)
3576     {
3577       relocation = relocation + reloc_entry->addend - gp;
3578       reloc_entry->addend = 0;
3579       if ((signed) relocation < -32768 || (signed) relocation > 32767)
3580 	{
3581 	  *msg = _("global pointer relative address out of range");
3582 	  r = bfd_reloc_outofrange;
3583 	}
3584       else
3585 	r = nios2_elf32_do_gprel_relocate (abfd, reloc_entry->howto,
3586 					   input_section,
3587 					   data, reloc_entry->address,
3588 					   relocation, reloc_entry->addend);
3589     }
3590 
3591   return r;
3592 }
3593 
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)
3598 {
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))
3603     {
3604       reloc_entry->address += input_section->output_offset;
3605       return bfd_reloc_ok;
3606     }
3607 
3608   if (output_bfd != NULL)
3609     /* FIXME: See bfd_perform_relocation.  Is this right?  */
3610     return bfd_reloc_continue;
3611 
3612   return nios2_elf32_do_ujmp_relocate (abfd, reloc_entry->howto,
3613 				       input_section,
3614 				       data, reloc_entry->address,
3615 				       (symbol->value
3616 					+ symbol->section->output_section->vma
3617 					+ symbol->section->output_offset),
3618 				       reloc_entry->addend);
3619 }
3620 
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)
3625 {
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))
3630     {
3631       reloc_entry->address += input_section->output_offset;
3632       return bfd_reloc_ok;
3633     }
3634 
3635   if (output_bfd != NULL)
3636     /* FIXME: See bfd_perform_relocation.  Is this right?  */
3637     return bfd_reloc_continue;
3638 
3639   return nios2_elf32_do_cjmp_relocate (abfd, reloc_entry->howto,
3640 				       input_section,
3641 				       data, reloc_entry->address,
3642 				       (symbol->value
3643 					+ symbol->section->output_section->vma
3644 					+ symbol->section->output_offset),
3645 				       reloc_entry->addend);
3646 }
3647 
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)
3652 {
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))
3657     {
3658       reloc_entry->address += input_section->output_offset;
3659       return bfd_reloc_ok;
3660     }
3661 
3662   if (output_bfd != NULL)
3663     /* FIXME: See bfd_perform_relocation.  Is this right?  */
3664     return bfd_reloc_continue;
3665 
3666   return nios2_elf32_do_callr_relocate (abfd, reloc_entry->howto,
3667 					input_section,
3668 					data, reloc_entry->address,
3669 					(symbol->value
3670 					 + symbol->section->output_section->vma
3671 					 + symbol->section->output_offset),
3672 					reloc_entry->addend);
3673 }
3674 
3675 
3676 /* Implement elf_backend_relocate_section.  */
3677 static bfd_boolean
3678 nios2_elf32_relocate_section (bfd *output_bfd,
3679 			      struct bfd_link_info *info,
3680 			      bfd *input_bfd,
3681 			      asection *input_section,
3682 			      bfd_byte *contents,
3683 			      Elf_Internal_Rela *relocs,
3684 			      Elf_Internal_Sym *local_syms,
3685 			      asection **local_sections)
3686 {
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;
3692   asection *sgot;
3693   asection *splt;
3694   asection *sreloc = NULL;
3695   bfd_vma *local_got_offsets;
3696   bfd_vma got_base;
3697 
3698   symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
3699   sym_hashes = elf_sym_hashes (input_bfd);
3700   relend = relocs + input_section->reloc_count;
3701 
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);
3706 
3707   if (elf32_nios2_hash_table (info)->h_gp_got == NULL)
3708     got_base = 0;
3709   else
3710     got_base = elf32_nios2_hash_table (info)->h_gp_got->root.u.def.value;
3711 
3712   for (rel = relocs; rel < relend; rel++)
3713     {
3714       reloc_howto_type *howto;
3715       unsigned long r_symndx;
3716       Elf_Internal_Sym *sym;
3717       asection *sec;
3718       struct elf_link_hash_entry *h;
3719       struct elf32_nios2_link_hash_entry *eh;
3720       bfd_vma relocation;
3721       bfd_vma gp;
3722       bfd_vma reloc_address;
3723       bfd_reloc_status_type r = bfd_reloc_ok;
3724       const char *name = NULL;
3725       int r_type;
3726       const char *format;
3727       char msgbuf[256];
3728       const char* msg = (const char*) NULL;
3729       bfd_boolean unresolved_reloc;
3730       bfd_vma off;
3731       int use_plt;
3732 
3733       r_type = ELF32_R_TYPE (rel->r_info);
3734       r_symndx = ELF32_R_SYM (rel->r_info);
3735 
3736       howto = lookup_howto ((unsigned) ELF32_R_TYPE (rel->r_info), output_bfd);
3737       h = NULL;
3738       sym = NULL;
3739       sec = NULL;
3740 
3741       if (r_symndx < symtab_hdr->sh_info)
3742 	{
3743 	  sym = local_syms + r_symndx;
3744 	  sec = local_sections[r_symndx];
3745 	  relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
3746 	}
3747       else
3748 	{
3749 	  bfd_boolean warned, ignored;
3750 
3751 	  RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
3752 				   r_symndx, symtab_hdr, sym_hashes,
3753 				   h, sec, relocation,
3754 				   unresolved_reloc, warned, ignored);
3755 	}
3756 
3757       if (sec && discarded_section (sec))
3758 	RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
3759 					 rel, 1, relend, howto, 0, contents);
3760 
3761       /* Nothing more to do unless this is a final link.  */
3762       if (bfd_link_relocatable (info))
3763 	continue;
3764 
3765       if (sec && sec->output_section)
3766 	reloc_address = (sec->output_section->vma + sec->output_offset
3767 			 + rel->r_offset);
3768       else
3769 	reloc_address = 0;
3770 
3771       if (howto)
3772 	{
3773 	  switch (howto->type)
3774 	    {
3775 	    case R_NIOS2_HI16:
3776 	      r = nios2_elf32_do_hi16_relocate (input_bfd, howto,
3777 						input_section,
3778 						contents, rel->r_offset,
3779 						relocation, rel->r_addend);
3780 	      break;
3781 	    case R_NIOS2_LO16:
3782 	      r = nios2_elf32_do_lo16_relocate (input_bfd, howto,
3783 						input_section,
3784 						contents, rel->r_offset,
3785 						relocation, rel->r_addend);
3786 	      break;
3787 	    case R_NIOS2_PCREL_LO:
3788 	      r = nios2_elf32_do_pcrel_lo16_relocate (input_bfd, howto,
3789 						      input_section,
3790 						      contents,
3791 						      rel->r_offset,
3792 						      relocation,
3793 						      rel->r_addend);
3794 	      break;
3795 	    case R_NIOS2_HIADJ16:
3796 	      r = nios2_elf32_do_hiadj16_relocate (input_bfd, howto,
3797 						   input_section, contents,
3798 						   rel->r_offset, relocation,
3799 						   rel->r_addend);
3800 	      break;
3801 	    case R_NIOS2_PCREL_HA:
3802 	      r = nios2_elf32_do_pcrel_hiadj16_relocate (input_bfd, howto,
3803 							 input_section,
3804 							 contents,
3805 							 rel->r_offset,
3806 							 relocation,
3807 							 rel->r_addend);
3808 	      break;
3809 	    case R_NIOS2_PCREL16:
3810 	      r = nios2_elf32_do_pcrel16_relocate (input_bfd, howto,
3811 						   input_section, contents,
3812 						   rel->r_offset, relocation,
3813 						   rel->r_addend);
3814 	      break;
3815 	    case R_NIOS2_GPREL:
3816 	      /* Turns an absolute address into a gp-relative address.  */
3817 	      if (!nios2_elf_assign_gp (output_bfd, &gp, info))
3818 		{
3819 		  format = _("global pointer relative relocation at address "
3820 			     "0x%08x when _gp not defined\n");
3821 		  sprintf (msgbuf, format, reloc_address);
3822 		  msg = msgbuf;
3823 		  r = bfd_reloc_dangerous;
3824 		}
3825 	      else
3826 		{
3827 		  bfd_vma symbol_address = rel->r_addend + relocation;
3828 		  relocation = relocation + rel->r_addend - gp;
3829 		  rel->r_addend = 0;
3830 		  if (((signed) relocation < -32768
3831 		       || (signed) relocation > 32767)
3832 		      && (!h
3833 			  || h->root.type == bfd_link_hash_defined
3834 			  || h->root.type == bfd_link_hash_defweak))
3835 		    {
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);
3842 		      msg = msgbuf;
3843 		      r = bfd_reloc_outofrange;
3844 		    }
3845 		  else
3846 		    r =	_bfd_final_link_relocate (howto, input_bfd,
3847 						  input_section, contents,
3848 						  rel->r_offset, relocation,
3849 						  rel->r_addend);
3850 		}
3851 
3852 	      break;
3853 	    case R_NIOS2_UJMP:
3854 	      r = nios2_elf32_do_ujmp_relocate (input_bfd, howto,
3855 						input_section,
3856 						contents, rel->r_offset,
3857 						relocation, rel->r_addend);
3858 	      break;
3859 	    case R_NIOS2_CJMP:
3860 	      r = nios2_elf32_do_cjmp_relocate (input_bfd, howto,
3861 						input_section,
3862 						contents, rel->r_offset,
3863 						relocation, rel->r_addend);
3864 	      break;
3865 	    case R_NIOS2_CALLR:
3866 	      r = nios2_elf32_do_callr_relocate (input_bfd, howto,
3867 						 input_section, contents,
3868 						 rel->r_offset, relocation,
3869 						 rel->r_addend);
3870 	      break;
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)
3880 		{
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,
3885 						rel->r_addend);
3886 		  break;
3887 		}
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)
3894 		{
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));
3899 
3900 		  relocation = (splt->output_section->vma
3901 				+ splt->output_offset
3902 				+ h->plt.offset);
3903 
3904 		  unresolved_reloc = FALSE;
3905 		}
3906 	      /* Detect R_NIOS2_CALL26 relocations that would overflow the
3907 		 256MB segment.  Replace the target with a reference to a
3908 		 trampoline instead.
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)
3913 		{
3914 		  bfd_vma dest = relocation + rel->r_addend;
3915 		  enum elf32_nios2_stub_type stub_type;
3916 
3917 		  eh = (struct elf32_nios2_link_hash_entry *)h;
3918 		  stub_type = nios2_type_of_stub (input_section, rel, eh,
3919 						  htab, dest, NULL);
3920 
3921 		  if (stub_type != nios2_stub_none)
3922 		    {
3923 		      struct elf32_nios2_stub_hash_entry *hsh;
3924 
3925 		      hsh = nios2_get_stub_entry (input_section, sec,
3926 						  eh, rel, htab, stub_type);
3927 		      if (hsh == NULL)
3928 			{
3929 			  r = bfd_reloc_undefined;
3930 			  break;
3931 			}
3932 
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,
3937 							  input_section,
3938 							  contents,
3939 							  rel->r_offset,
3940 							  dest, 0);
3941 		      break;
3942 		    }
3943 		}
3944 
3945 	      /* Normal case.  */
3946 	      r = nios2_elf32_do_call26_relocate (input_bfd, howto,
3947 						  input_section, contents,
3948 						  rel->r_offset, relocation,
3949 						  rel->r_addend);
3950 	      break;
3951 	    case R_NIOS2_ALIGN:
3952 	      r = bfd_reloc_ok;
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,
3957 						  rel->r_addend);
3958 		but do_ignore_reloc would do no more than return
3959 		bfd_reloc_ok. */
3960 	      break;
3961 
3962 	    case R_NIOS2_GOT16:
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.  */
3970 	      if (sgot == NULL)
3971 		{
3972 		  r = bfd_reloc_notsupported;
3973 		  break;
3974 		}
3975 
3976 	      use_plt = 0;
3977 
3978 	      if (h != NULL)
3979 		{
3980 		  bfd_boolean dyn;
3981 
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);
3985 
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,
3990 							 bfd_link_pic (info),
3991 							 h)
3992 		      || (bfd_link_pic (info)
3993 			  && SYMBOL_REFERENCES_LOCAL (info, h))
3994 		      || (ELF_ST_VISIBILITY (h->other)
3995 			  && h->root.type == bfd_link_hash_undefweak))
3996 		    {
3997 		      /* This is actually a static link, or it is a -Bsymbolic
3998 			 link and the symbol is defined locally.  We must
3999 			 initialize this entry in the global offset table.
4000 			 Since the offset must always be a multiple of 4, we
4001 			 use the least significant bit to record whether we
4002 			 have initialized it already.
4003 
4004 			 When doing a dynamic link, we create a .rela.got
4005 			 relocation entry to initialize the value.  This is
4006 			 done in the finish_dynamic_symbol routine.  */
4007 		      if ((off & 1) != 0)
4008 			off &= ~1;
4009 		      else
4010 			{
4011 			  bfd_put_32 (output_bfd, relocation,
4012 				      sgot->contents + off);
4013 			  h->got.offset |= 1;
4014 			}
4015 		    }
4016 		  else
4017 		    unresolved_reloc = FALSE;
4018 		}
4019 	      else
4020 		{
4021 		  BFD_ASSERT (local_got_offsets != NULL
4022 			      && local_got_offsets[r_symndx] != (bfd_vma) -1);
4023 
4024 		  off = local_got_offsets[r_symndx];
4025 
4026 		  /* The offset must always be a multiple of 4.  We use the
4027 		     least significant bit to record whether we have already
4028 		     generated the necessary reloc.  */
4029 		  if ((off & 1) != 0)
4030 		    off &= ~1;
4031 		  else
4032 		    {
4033 		      bfd_put_32 (output_bfd, relocation,
4034 				  sgot->contents + off);
4035 
4036 		      if (bfd_link_pic (info))
4037 			{
4038 			  asection *srelgot;
4039 			  Elf_Internal_Rela outrel;
4040 			  bfd_byte *loc;
4041 
4042 			  srelgot = htab->root.srelgot;
4043 			  BFD_ASSERT (srelgot != NULL);
4044 
4045 			  outrel.r_addend = relocation;
4046 			  outrel.r_offset = (sgot->output_section->vma
4047 					     + sgot->output_offset
4048 					     + off);
4049 			  outrel.r_info = ELF32_R_INFO (0, R_NIOS2_RELATIVE);
4050 			  loc = srelgot->contents;
4051 			  loc += (srelgot->reloc_count++ *
4052 				  sizeof (Elf32_External_Rela));
4053 			  bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
4054 			}
4055 
4056 		      local_got_offsets[r_symndx] |= 1;
4057 		    }
4058 		}
4059 
4060 	      if (use_plt && bfd_link_pic (info))
4061 		{
4062 		  off = ((h->plt.offset - 24) / 12 + 3) * 4;
4063 		  relocation = (htab->root.sgotplt->output_offset + off
4064 				- got_base);
4065 		}
4066 	      else
4067 		relocation = sgot->output_offset + off - got_base;
4068 
4069 	      /* This relocation does not use the addend.  */
4070 	      rel->r_addend = 0;
4071 
4072 	      switch (howto->type)
4073 		{
4074 		case R_NIOS2_GOT_LO:
4075 		case R_NIOS2_CALL_LO:
4076 		  r = nios2_elf32_do_lo16_relocate (input_bfd, howto,
4077 						    input_section, contents,
4078 						    rel->r_offset, relocation,
4079 						    rel->r_addend);
4080 		  break;
4081 		case R_NIOS2_GOT_HA:
4082 		case R_NIOS2_CALL_HA:
4083 		  r = nios2_elf32_do_hiadj16_relocate (input_bfd, howto,
4084 						       input_section, contents,
4085 						       rel->r_offset,
4086 						       relocation,
4087 						       rel->r_addend);
4088 		  break;
4089 		default:
4090 		  r = _bfd_final_link_relocate (howto, input_bfd,
4091 						input_section, contents,
4092 						rel->r_offset, relocation,
4093 						rel->r_addend);
4094 		  break;
4095 		}
4096 	      break;
4097 
4098 	    case R_NIOS2_GOTOFF_LO:
4099 	    case R_NIOS2_GOTOFF_HA:
4100 	    case R_NIOS2_GOTOFF:
4101 	      /* Relocation is relative to the global offset table pointer.  */
4102 
4103 	      BFD_ASSERT (sgot != NULL);
4104 	      if (sgot == NULL)
4105 		{
4106 		  r = bfd_reloc_notsupported;
4107 		  break;
4108 		}
4109 
4110 	      /* Note that sgot->output_offset is not involved in this
4111 		 calculation.  We always want the start of .got.  */
4112 	      relocation -= sgot->output_section->vma;
4113 
4114 	      /* Now we adjust the relocation to be relative to the GOT pointer
4115 		 (the _gp_got symbol), which possibly contains the 0x8000 bias.  */
4116 	      relocation -= got_base;
4117 
4118 	      switch (howto->type)
4119 		{
4120 		case R_NIOS2_GOTOFF_LO:
4121 		  r = nios2_elf32_do_lo16_relocate (input_bfd, howto,
4122 						    input_section, contents,
4123 						    rel->r_offset, relocation,
4124 						    rel->r_addend);
4125 		  break;
4126 		case R_NIOS2_GOTOFF_HA:
4127 		  r = nios2_elf32_do_hiadj16_relocate (input_bfd, howto,
4128 						       input_section, contents,
4129 						       rel->r_offset,
4130 						       relocation,
4131 						       rel->r_addend);
4132 		  break;
4133 		default:
4134 		  r = _bfd_final_link_relocate (howto, input_bfd,
4135 						input_section, contents,
4136 						rel->r_offset, relocation,
4137 						rel->r_addend);
4138 		  break;
4139 		}
4140 	      break;
4141 
4142 	    case R_NIOS2_TLS_LDO16:
4143 	      relocation -= dtpoff_base (info) + DTP_OFFSET;
4144 
4145 	      r = _bfd_final_link_relocate (howto, input_bfd, input_section,
4146 					    contents, rel->r_offset,
4147 					    relocation, rel->r_addend);
4148 	      break;
4149 	    case R_NIOS2_TLS_LDM16:
4150 	      if (htab->root.sgot == NULL)
4151 		abort ();
4152 
4153 	      off = htab->tls_ldm_got.offset;
4154 
4155 	      if ((off & 1) != 0)
4156 		off &= ~1;
4157 	      else
4158 		{
4159 		  /* If we don't know the module number, create a relocation
4160 		     for it.  */
4161 		  if (bfd_link_pic (info))
4162 		    {
4163 		      Elf_Internal_Rela outrel;
4164 		      bfd_byte *loc;
4165 
4166 		      if (htab->root.srelgot == NULL)
4167 			abort ();
4168 
4169 		      outrel.r_addend = 0;
4170 		      outrel.r_offset = (htab->root.sgot->output_section->vma
4171 					 + htab->root.sgot->output_offset
4172 					 + off);
4173 		      outrel.r_info = ELF32_R_INFO (0, R_NIOS2_TLS_DTPMOD);
4174 
4175 		      loc = htab->root.srelgot->contents;
4176 		      loc += (htab->root.srelgot->reloc_count++
4177 			      * sizeof (Elf32_External_Rela));
4178 		      bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
4179 		    }
4180 		  else
4181 		    bfd_put_32 (output_bfd, 1,
4182 				htab->root.sgot->contents + off);
4183 
4184 		  htab->tls_ldm_got.offset |= 1;
4185 		}
4186 
4187 	      relocation = htab->root.sgot->output_offset + off - got_base;
4188 
4189 	      r = _bfd_final_link_relocate (howto, input_bfd, input_section,
4190 					    contents, rel->r_offset,
4191 					    relocation, rel->r_addend);
4192 
4193 	      break;
4194 	    case R_NIOS2_TLS_GD16:
4195 	    case R_NIOS2_TLS_IE16:
4196 	      {
4197 		int indx;
4198 		char tls_type;
4199 
4200 		if (htab->root.sgot == NULL)
4201 		  abort ();
4202 
4203 		indx = 0;
4204 		if (h != NULL)
4205 		  {
4206 		    bfd_boolean dyn;
4207 		    dyn = htab->root.dynamic_sections_created;
4208 		    if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn,
4209 							 bfd_link_pic (info),
4210 							 h)
4211 			&& (!bfd_link_pic (info)
4212 			    || !SYMBOL_REFERENCES_LOCAL (info, h)))
4213 		      {
4214 			unresolved_reloc = FALSE;
4215 			indx = h->dynindx;
4216 		      }
4217 		    off = h->got.offset;
4218 		    tls_type = (((struct elf32_nios2_link_hash_entry *) h)
4219 				->tls_type);
4220 		  }
4221 		else
4222 		  {
4223 		    if (local_got_offsets == NULL)
4224 		      abort ();
4225 		    off = local_got_offsets[r_symndx];
4226 		    tls_type = (elf32_nios2_local_got_tls_type (input_bfd)
4227 				[r_symndx]);
4228 		  }
4229 
4230 		if (tls_type == GOT_UNKNOWN)
4231 		  abort ();
4232 
4233 		if ((off & 1) != 0)
4234 		  off &= ~1;
4235 		else
4236 		  {
4237 		    bfd_boolean need_relocs = FALSE;
4238 		    Elf_Internal_Rela outrel;
4239 		    bfd_byte *loc = NULL;
4240 		    int cur_off = off;
4241 
4242 		    /* The GOT entries have not been initialized yet.  Do it
4243 		       now, and emit any relocations.  If both an IE GOT and a
4244 		       GD GOT are necessary, we emit the GD first.  */
4245 
4246 		    if ((bfd_link_pic (info) || indx != 0)
4247 			&& (h == NULL
4248 			    || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
4249 			    || h->root.type != bfd_link_hash_undefweak))
4250 		      {
4251 			need_relocs = TRUE;
4252 			if (htab->root.srelgot == NULL)
4253 			  abort ();
4254 			loc = htab->root.srelgot->contents;
4255 			loc += (htab->root.srelgot->reloc_count *
4256 				sizeof (Elf32_External_Rela));
4257 		      }
4258 
4259 		    if (tls_type & GOT_TLS_GD)
4260 		      {
4261 			if (need_relocs)
4262 			  {
4263 			    outrel.r_addend = 0;
4264 			    outrel.r_offset = (htab->root.sgot->output_section->vma
4265 					       + htab->root.sgot->output_offset
4266 					       + cur_off);
4267 			    outrel.r_info = ELF32_R_INFO (indx,
4268 							  R_NIOS2_TLS_DTPMOD);
4269 
4270 			    bfd_elf32_swap_reloca_out (output_bfd, &outrel,
4271 						       loc);
4272 			    htab->root.srelgot->reloc_count++;
4273 			    loc += sizeof (Elf32_External_Rela);
4274 
4275 			    if (indx == 0)
4276 			      bfd_put_32 (output_bfd,
4277 					  (relocation - dtpoff_base (info) -
4278 					   DTP_OFFSET),
4279 					  htab->root.sgot->contents + cur_off + 4);
4280 			    else
4281 			      {
4282 				outrel.r_addend = 0;
4283 				outrel.r_info = ELF32_R_INFO (indx,
4284 				  R_NIOS2_TLS_DTPREL);
4285 				outrel.r_offset += 4;
4286 
4287 				bfd_elf32_swap_reloca_out (output_bfd, &outrel,
4288 							   loc);
4289 				htab->root.srelgot->reloc_count++;
4290 				loc += sizeof (Elf32_External_Rela);
4291 			      }
4292 			  }
4293 			else
4294 			  {
4295 			    /* If we are not emitting relocations for a
4296 			       general dynamic reference, then we must be in a
4297 			       static link or an executable link with the
4298 			       symbol binding locally.  Mark it as belonging
4299 			       to module 1, the executable.  */
4300 			    bfd_put_32 (output_bfd, 1,
4301 					htab->root.sgot->contents + cur_off);
4302 			    bfd_put_32 (output_bfd, (relocation -
4303 						     dtpoff_base (info) -
4304 						     DTP_OFFSET),
4305 					htab->root.sgot->contents + cur_off + 4);
4306 			  }
4307 
4308 			cur_off += 8;
4309 		      }
4310 
4311 		    if (tls_type & GOT_TLS_IE)
4312 		      {
4313 			if (need_relocs)
4314 			  {
4315 			    if (indx == 0)
4316 			      outrel.r_addend = (relocation -
4317 						 dtpoff_base (info));
4318 			    else
4319 			      outrel.r_addend = 0;
4320 			    outrel.r_offset = (htab->root.sgot->output_section->vma
4321 					       + htab->root.sgot->output_offset
4322 					       + cur_off);
4323 			    outrel.r_info = ELF32_R_INFO (indx,
4324 							  R_NIOS2_TLS_TPREL);
4325 
4326 			    bfd_elf32_swap_reloca_out (output_bfd, &outrel,
4327 						       loc);
4328 			    htab->root.srelgot->reloc_count++;
4329 			    loc += sizeof (Elf32_External_Rela);
4330 			  }
4331 			else
4332 			  bfd_put_32 (output_bfd, (tpoff (info, relocation)
4333 						   - TP_OFFSET),
4334 				      htab->root.sgot->contents + cur_off);
4335 			cur_off += 4;
4336 		      }
4337 
4338 		    if (h != NULL)
4339 		      h->got.offset |= 1;
4340 		    else
4341 		      local_got_offsets[r_symndx] |= 1;
4342 		  }
4343 
4344 		if ((tls_type & GOT_TLS_GD) && r_type != R_NIOS2_TLS_GD16)
4345 		  off += 8;
4346 		relocation = htab->root.sgot->output_offset + off - got_base;
4347 
4348 		r = _bfd_final_link_relocate (howto, input_bfd, input_section,
4349 					      contents, rel->r_offset,
4350 					      relocation, rel->r_addend);
4351 	      }
4352 
4353 	      break;
4354 	    case R_NIOS2_TLS_LE16:
4355 	      if (bfd_link_dll (info))
4356 		{
4357 		  (*_bfd_error_handler)
4358 		    (_("%B(%A+0x%lx): R_NIOS2_TLS_LE16 relocation not "
4359 		       "permitted in shared object"),
4360 		     input_bfd, input_section,
4361 		     (long) rel->r_offset, howto->name);
4362 		  return FALSE;
4363 		}
4364 	      else
4365 		relocation = tpoff (info, relocation) - TP_OFFSET;
4366 
4367 	      r = _bfd_final_link_relocate (howto, input_bfd, input_section,
4368 					    contents, rel->r_offset,
4369 					    relocation, rel->r_addend);
4370 	      break;
4371 
4372 	    case R_NIOS2_BFD_RELOC_32:
4373 	      if (bfd_link_pic (info)
4374 		  && (input_section->flags & SEC_ALLOC) != 0
4375 		  && (h == NULL
4376 		      || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
4377 		      || h->root.type != bfd_link_hash_undefweak))
4378 		{
4379 		  Elf_Internal_Rela outrel;
4380 		  bfd_byte *loc;
4381 		  bfd_boolean skip, relocate;
4382 
4383 		  /* When generating a shared object, these relocations
4384 		     are copied into the output file to be resolved at run
4385 		     time.  */
4386 
4387 		  skip = FALSE;
4388 		  relocate = FALSE;
4389 
4390 		  outrel.r_offset
4391 		    = _bfd_elf_section_offset (output_bfd, info,
4392 					       input_section, rel->r_offset);
4393 		  if (outrel.r_offset == (bfd_vma) -1)
4394 		    skip = TRUE;
4395 		  else if (outrel.r_offset == (bfd_vma) -2)
4396 		    skip = TRUE, relocate = TRUE;
4397 		  outrel.r_offset += (input_section->output_section->vma
4398 				      + input_section->output_offset);
4399 
4400 		  if (skip)
4401 		    memset (&outrel, 0, sizeof outrel);
4402 		  else if (h != NULL
4403 			   && h->dynindx != -1
4404 			   && (!bfd_link_pic (info)
4405 			       || !SYMBOLIC_BIND (info, h)
4406 			       || !h->def_regular))
4407 		    {
4408 		      outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
4409 		      outrel.r_addend = rel->r_addend;
4410 		    }
4411 		  else
4412 		    {
4413 		      /* This symbol is local, or marked to become local.  */
4414 		      outrel.r_addend = relocation + rel->r_addend;
4415 		      relocate = TRUE;
4416 		      outrel.r_info = ELF32_R_INFO (0, R_NIOS2_RELATIVE);
4417 		    }
4418 
4419 		  sreloc = elf_section_data (input_section)->sreloc;
4420 		  if (sreloc == NULL)
4421 		    abort ();
4422 
4423 		  loc = sreloc->contents;
4424 		  loc += sreloc->reloc_count++ * sizeof (Elf32_External_Rela);
4425 		  bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
4426 
4427 		  /* This reloc will be computed at runtime, so there's no
4428 		     need to do anything now, except for R_NIOS2_BFD_RELOC_32
4429 		     relocations that have been turned into
4430 		     R_NIOS2_RELATIVE.  */
4431 		  if (!relocate)
4432 		    break;
4433 		}
4434 
4435 	      r = _bfd_final_link_relocate (howto, input_bfd,
4436 					    input_section, contents,
4437 					    rel->r_offset, relocation,
4438 					    rel->r_addend);
4439 	      break;
4440 
4441 	    case R_NIOS2_TLS_DTPREL:
4442 	      relocation -= dtpoff_base (info);
4443 	      /* Fall through.  */
4444 
4445 	    default:
4446 	      r = _bfd_final_link_relocate (howto, input_bfd,
4447 					    input_section, contents,
4448 					    rel->r_offset, relocation,
4449 					    rel->r_addend);
4450 	      break;
4451 	    }
4452 	}
4453       else
4454 	r = bfd_reloc_notsupported;
4455 
4456       if (r != bfd_reloc_ok)
4457 	{
4458 	  if (h != NULL)
4459 	    name = h->root.root.string;
4460 	  else
4461 	    {
4462 	      name = bfd_elf_string_from_elf_section (input_bfd,
4463 						      symtab_hdr->sh_link,
4464 						      sym->st_name);
4465 	      if (name == NULL || *name == '\0')
4466 		name = bfd_section_name (input_bfd, sec);
4467 	    }
4468 
4469 	  switch (r)
4470 	    {
4471 	    case bfd_reloc_overflow:
4472 	      r = info->callbacks->reloc_overflow (info, NULL, name,
4473 						   howto->name, (bfd_vma) 0,
4474 						   input_bfd, input_section,
4475 						   rel->r_offset);
4476 	      break;
4477 
4478 	    case bfd_reloc_undefined:
4479 	      r = info->callbacks->undefined_symbol (info, name, input_bfd,
4480 						     input_section,
4481 						     rel->r_offset, TRUE);
4482 	      break;
4483 
4484 	    case bfd_reloc_outofrange:
4485 	      if (msg == NULL)
4486 		msg = _("relocation out of range");
4487 	      break;
4488 
4489 	    case bfd_reloc_notsupported:
4490 	      if (msg == NULL)
4491 		msg = _("unsupported relocation");
4492 	      break;
4493 
4494 	    case bfd_reloc_dangerous:
4495 	      if (msg == NULL)
4496 		msg = _("dangerous relocation");
4497 	      break;
4498 
4499 	    default:
4500 	      if (msg == NULL)
4501 		msg = _("unknown error");
4502 	      break;
4503 	    }
4504 
4505 	  if (msg)
4506 	    {
4507 	      r = info->callbacks->warning
4508 		(info, msg, name, input_bfd, input_section, rel->r_offset);
4509 	      return FALSE;
4510 	    }
4511 	}
4512     }
4513   return TRUE;
4514 }
4515 
4516 /* Implement elf-backend_section_flags:
4517    Convert NIOS2 specific section flags to bfd internal section flags.  */
4518 static bfd_boolean
4519 nios2_elf32_section_flags (flagword *flags, const Elf_Internal_Shdr *hdr)
4520 {
4521   if (hdr->sh_flags & SHF_NIOS2_GPREL)
4522     *flags |= SEC_SMALL_DATA;
4523 
4524   return TRUE;
4525 }
4526 
4527 /* Implement elf_backend_fake_sections:
4528    Set the correct type for an NIOS2 ELF section.  We do this by the
4529    section name, which is a hack, but ought to work.  */
4530 static bfd_boolean
4531 nios2_elf32_fake_sections (bfd *abfd ATTRIBUTE_UNUSED,
4532 			   Elf_Internal_Shdr *hdr, asection *sec)
4533 {
4534   register const char *name = bfd_get_section_name (abfd, sec);
4535 
4536   if ((sec->flags & SEC_SMALL_DATA)
4537       || strcmp (name, ".sdata") == 0
4538       || strcmp (name, ".sbss") == 0
4539       || strcmp (name, ".lit4") == 0 || strcmp (name, ".lit8") == 0)
4540     hdr->sh_flags |= SHF_NIOS2_GPREL;
4541 
4542   return TRUE;
4543 }
4544 
4545 /* Create .got, .gotplt, and .rela.got sections in DYNOBJ, and set up
4546    shortcuts to them in our hash table.  */
4547 static bfd_boolean
4548 create_got_section (bfd *dynobj, struct bfd_link_info *info)
4549 {
4550   struct elf32_nios2_link_hash_table *htab;
4551   struct elf_link_hash_entry *h;
4552 
4553   htab = elf32_nios2_hash_table (info);
4554 
4555   if (! _bfd_elf_create_got_section (dynobj, info))
4556     return FALSE;
4557 
4558   /* In order for the two loads in .PLTresolve to share the same %hiadj,
4559      _GLOBAL_OFFSET_TABLE_ must be aligned to a 16-byte boundary.  */
4560   if (!bfd_set_section_alignment (dynobj, htab->root.sgotplt, 4))
4561     return FALSE;
4562 
4563   /* The Nios II ABI specifies that GOT-relative relocations are relative
4564      to the linker-created symbol _gp_got, rather than using
4565      _GLOBAL_OFFSET_TABLE_ directly.  In particular, the latter always
4566      points to the base of the GOT while _gp_got may include a bias.  */
4567   h = _bfd_elf_define_linkage_sym (dynobj, info, htab->root.sgotplt,
4568 				   "_gp_got");
4569   elf32_nios2_hash_table (info)->h_gp_got = h;
4570   if (h == NULL)
4571     return FALSE;
4572 
4573   return TRUE;
4574 }
4575 
4576 /* Implement elf_backend_create_dynamic_sections:
4577    Create .plt, .rela.plt, .got, .got.plt, .rela.got, .dynbss, and
4578    .rela.bss sections in DYNOBJ, and set up shortcuts to them in our
4579    hash table.  */
4580 static bfd_boolean
4581 nios2_elf32_create_dynamic_sections (bfd *dynobj, struct bfd_link_info *info)
4582 {
4583   struct elf32_nios2_link_hash_table *htab;
4584 
4585   htab = elf32_nios2_hash_table (info);
4586   if (!htab->root.sgot && !create_got_section (dynobj, info))
4587     return FALSE;
4588 
4589   _bfd_elf_create_dynamic_sections (dynobj, info);
4590 
4591   /* In order for the two loads in a shared object .PLTresolve to share the
4592      same %hiadj, the start of the PLT (as well as the GOT) must be aligned
4593      to a 16-byte boundary.  This is because the addresses for these loads
4594      include the -(.plt+4) PIC correction.  */
4595   if (!bfd_set_section_alignment (dynobj, htab->root.splt, 4))
4596     return FALSE;
4597 
4598   htab->sdynbss = bfd_get_linker_section (dynobj, ".dynbss");
4599   if (!htab->sdynbss)
4600     return FALSE;
4601   if (!bfd_link_pic (info))
4602     {
4603       htab->srelbss = bfd_get_linker_section (dynobj, ".rela.bss");
4604       if (!htab->srelbss)
4605 	return FALSE;
4606     }
4607 
4608   return TRUE;
4609 }
4610 
4611 /* Implement elf_backend_copy_indirect_symbol:
4612    Copy the extra info we tack onto an elf_link_hash_entry.  */
4613 static void
4614 nios2_elf32_copy_indirect_symbol (struct bfd_link_info *info,
4615 				  struct elf_link_hash_entry *dir,
4616 				  struct elf_link_hash_entry *ind)
4617 {
4618   struct elf32_nios2_link_hash_entry *edir, *eind;
4619 
4620   edir = (struct elf32_nios2_link_hash_entry *) dir;
4621   eind = (struct elf32_nios2_link_hash_entry *) ind;
4622 
4623   if (eind->dyn_relocs != NULL)
4624     {
4625       if (edir->dyn_relocs != NULL)
4626 	{
4627 	  struct elf32_nios2_dyn_relocs **pp;
4628 	  struct elf32_nios2_dyn_relocs *p;
4629 
4630 	  /* Add reloc counts against the indirect sym to the direct sym
4631 	     list.  Merge any entries against the same section.  */
4632 	  for (pp = &eind->dyn_relocs; (p = *pp) != NULL; )
4633 	    {
4634 	      struct elf32_nios2_dyn_relocs *q;
4635 
4636 	      for (q = edir->dyn_relocs; q != NULL; q = q->next)
4637 		if (q->sec == p->sec)
4638 		  {
4639 		    q->pc_count += p->pc_count;
4640 		    q->count += p->count;
4641 		    *pp = p->next;
4642 		    break;
4643 		  }
4644 	      if (q == NULL)
4645 		pp = &p->next;
4646 	    }
4647 	  *pp = edir->dyn_relocs;
4648 	}
4649 
4650       edir->dyn_relocs = eind->dyn_relocs;
4651       eind->dyn_relocs = NULL;
4652     }
4653 
4654   if (ind->root.type == bfd_link_hash_indirect
4655       && dir->got.refcount <= 0)
4656     {
4657       edir->tls_type = eind->tls_type;
4658       eind->tls_type = GOT_UNKNOWN;
4659     }
4660 
4661   edir->got_types_used |= eind->got_types_used;
4662 
4663   _bfd_elf_link_hash_copy_indirect (info, dir, ind);
4664 }
4665 
4666 /* Set the right machine number for a NIOS2 ELF file.  */
4667 
4668 static bfd_boolean
4669 nios2_elf32_object_p (bfd *abfd)
4670 {
4671   unsigned long mach;
4672 
4673   mach = elf_elfheader (abfd)->e_flags;
4674 
4675   switch (mach)
4676     {
4677     default:
4678     case EF_NIOS2_ARCH_R1:
4679       bfd_default_set_arch_mach (abfd, bfd_arch_nios2, bfd_mach_nios2r1);
4680       break;
4681     case EF_NIOS2_ARCH_R2:
4682       bfd_default_set_arch_mach (abfd, bfd_arch_nios2, bfd_mach_nios2r2);
4683       break;
4684     }
4685 
4686   return TRUE;
4687 }
4688 
4689 /* Implement elf_backend_check_relocs:
4690    Look through the relocs for a section during the first phase.  */
4691 static bfd_boolean
4692 nios2_elf32_check_relocs (bfd *abfd, struct bfd_link_info *info,
4693 			  asection *sec, const Elf_Internal_Rela *relocs)
4694 {
4695   bfd *dynobj;
4696   Elf_Internal_Shdr *symtab_hdr;
4697   struct elf_link_hash_entry **sym_hashes, **sym_hashes_end;
4698   const Elf_Internal_Rela *rel;
4699   const Elf_Internal_Rela *rel_end;
4700   struct elf32_nios2_link_hash_table *htab;
4701   asection *sgot;
4702   asection *srelgot;
4703   asection *sreloc = NULL;
4704   bfd_signed_vma *local_got_refcounts;
4705 
4706   if (bfd_link_relocatable (info))
4707     return TRUE;
4708 
4709   dynobj = elf_hash_table (info)->dynobj;
4710   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
4711   sym_hashes = elf_sym_hashes (abfd);
4712   sym_hashes_end = (sym_hashes
4713 		    + symtab_hdr->sh_size / sizeof (Elf32_External_Sym));
4714   if (!elf_bad_symtab (abfd))
4715     sym_hashes_end -= symtab_hdr->sh_info;
4716   local_got_refcounts = elf_local_got_refcounts (abfd);
4717 
4718   htab = elf32_nios2_hash_table (info);
4719   sgot = htab->root.sgot;
4720   srelgot = htab->root.srelgot;
4721 
4722   rel_end = relocs + sec->reloc_count;
4723   for (rel = relocs; rel < rel_end; rel++)
4724     {
4725       unsigned int r_type;
4726       struct elf_link_hash_entry *h;
4727       unsigned long r_symndx;
4728 
4729       r_symndx = ELF32_R_SYM (rel->r_info);
4730       if (r_symndx < symtab_hdr->sh_info)
4731 	h = NULL;
4732       else
4733 	{
4734 	  h = sym_hashes[r_symndx - symtab_hdr->sh_info];
4735 	  while (h->root.type == bfd_link_hash_indirect
4736 		 || h->root.type == bfd_link_hash_warning)
4737 	    h = (struct elf_link_hash_entry *) h->root.u.i.link;
4738 
4739 	  /* PR15323, ref flags aren't set for references in the same
4740 	     object.  */
4741 	  h->root.non_ir_ref = 1;
4742 	}
4743 
4744       r_type = ELF32_R_TYPE (rel->r_info);
4745 
4746       switch (r_type)
4747 	{
4748 	case R_NIOS2_GOT16:
4749 	case R_NIOS2_GOT_LO:
4750 	case R_NIOS2_GOT_HA:
4751 	case R_NIOS2_CALL16:
4752 	case R_NIOS2_CALL_LO:
4753 	case R_NIOS2_CALL_HA:
4754 	case R_NIOS2_TLS_GD16:
4755 	case R_NIOS2_TLS_IE16:
4756 	  /* This symbol requires a global offset table entry.  */
4757 	  {
4758 	    int tls_type, old_tls_type;
4759 
4760 	    switch (r_type)
4761 	      {
4762 	      default:
4763 	      case R_NIOS2_GOT16:
4764 	      case R_NIOS2_GOT_LO:
4765 	      case R_NIOS2_GOT_HA:
4766 	      case R_NIOS2_CALL16:
4767 	      case R_NIOS2_CALL_LO:
4768 	      case R_NIOS2_CALL_HA:
4769 		tls_type = GOT_NORMAL;
4770 		break;
4771 	      case R_NIOS2_TLS_GD16:
4772 		tls_type = GOT_TLS_GD;
4773 		break;
4774 	      case R_NIOS2_TLS_IE16:
4775 		tls_type = GOT_TLS_IE;
4776 		break;
4777 	      }
4778 
4779 	    if (dynobj == NULL)
4780 	      {
4781 		/* Create the .got section.  */
4782 		elf_hash_table (info)->dynobj = dynobj = abfd;
4783 		nios2_elf32_create_dynamic_sections (dynobj, info);
4784 	      }
4785 
4786 	    if (sgot == NULL)
4787 	      {
4788 		sgot = htab->root.sgot;
4789 		BFD_ASSERT (sgot != NULL);
4790 	      }
4791 
4792 	    if (srelgot == NULL
4793 		&& (h != NULL || bfd_link_pic (info)))
4794 	      {
4795 		srelgot = htab->root.srelgot;
4796 		BFD_ASSERT (srelgot != NULL);
4797 	      }
4798 
4799 	    if (h != NULL)
4800 	      {
4801 		struct elf32_nios2_link_hash_entry *eh
4802 		  = (struct elf32_nios2_link_hash_entry *)h;
4803 		h->got.refcount++;
4804 		old_tls_type = elf32_nios2_hash_entry(h)->tls_type;
4805 		if (r_type == R_NIOS2_CALL16
4806 		    || r_type == R_NIOS2_CALL_LO
4807 		    || r_type == R_NIOS2_CALL_HA)
4808 		  {
4809 		    /* Make sure a plt entry is created for this symbol if
4810 		       it turns out to be a function defined by a dynamic
4811 		       object.  */
4812 		    h->plt.refcount++;
4813 		    h->needs_plt = 1;
4814 		    h->type = STT_FUNC;
4815 		    eh->got_types_used |= CALL_USED;
4816 		  }
4817 		else
4818 		  eh->got_types_used |= GOT_USED;
4819 	      }
4820 	    else
4821 	      {
4822 		/* This is a global offset table entry for a local symbol.  */
4823 		if (local_got_refcounts == NULL)
4824 		  {
4825 		    bfd_size_type size;
4826 
4827 		    size = symtab_hdr->sh_info;
4828 		    size *= (sizeof (bfd_signed_vma) + sizeof (char));
4829 		    local_got_refcounts
4830 		      = ((bfd_signed_vma *) bfd_zalloc (abfd, size));
4831 		    if (local_got_refcounts == NULL)
4832 		      return FALSE;
4833 		    elf_local_got_refcounts (abfd) = local_got_refcounts;
4834 		    elf32_nios2_local_got_tls_type (abfd)
4835 		      = (char *) (local_got_refcounts + symtab_hdr->sh_info);
4836 		  }
4837 		local_got_refcounts[r_symndx]++;
4838 		old_tls_type = elf32_nios2_local_got_tls_type (abfd) [r_symndx];
4839 	      }
4840 
4841 	    /* We will already have issued an error message if there is a
4842 	       TLS / non-TLS mismatch, based on the symbol type.  We don't
4843 	       support any linker relaxations.  So just combine any TLS
4844 	       types needed.  */
4845 	    if (old_tls_type != GOT_UNKNOWN && old_tls_type != GOT_NORMAL
4846 		&& tls_type != GOT_NORMAL)
4847 	      tls_type |= old_tls_type;
4848 
4849 	    if (old_tls_type != tls_type)
4850 	      {
4851 		if (h != NULL)
4852 		  elf32_nios2_hash_entry (h)->tls_type = tls_type;
4853 		else
4854 		  elf32_nios2_local_got_tls_type (abfd) [r_symndx] = tls_type;
4855 	      }
4856 	  }
4857 	  /* Fall through */
4858 	case R_NIOS2_TLS_LDM16:
4859 	  if (r_type == R_NIOS2_TLS_LDM16)
4860 	    htab->tls_ldm_got.refcount++;
4861 
4862 	  if (htab->root.sgot == NULL)
4863 	    {
4864 	      if (htab->root.dynobj == NULL)
4865 		htab->root.dynobj = abfd;
4866 	      if (!create_got_section (htab->root.dynobj, info))
4867 		return FALSE;
4868 	    }
4869 	  break;
4870 
4871 	  /* This relocation describes the C++ object vtable hierarchy.
4872 	     Reconstruct it for later use during GC.  */
4873 	case R_NIOS2_GNU_VTINHERIT:
4874 	  if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
4875 	    return FALSE;
4876 	  break;
4877 
4878 	  /* This relocation describes which C++ vtable entries are actually
4879 	     used.  Record for later use during GC.  */
4880 	case R_NIOS2_GNU_VTENTRY:
4881 	  if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
4882 	    return FALSE;
4883 	  break;
4884 
4885 	case R_NIOS2_BFD_RELOC_32:
4886 	case R_NIOS2_CALL26:
4887 	case R_NIOS2_CALL26_NOAT:
4888 	case R_NIOS2_HIADJ16:
4889 	case R_NIOS2_LO16:
4890 
4891 	  if (h != NULL)
4892 	    {
4893 	      /* If this reloc is in a read-only section, we might
4894 		   need a copy reloc.  We can't check reliably at this
4895 		   stage whether the section is read-only, as input
4896 		   sections have not yet been mapped to output sections.
4897 		   Tentatively set the flag for now, and correct in
4898 		   adjust_dynamic_symbol.  */
4899 	      if (!bfd_link_pic (info))
4900 		h->non_got_ref = 1;
4901 
4902 	      /* Make sure a plt entry is created for this symbol if it
4903 		 turns out to be a function defined by a dynamic object.  */
4904 	      h->plt.refcount++;
4905 
4906 	      if (r_type == R_NIOS2_CALL26 || r_type == R_NIOS2_CALL26_NOAT)
4907 		h->needs_plt = 1;
4908 	    }
4909 
4910 	  /* If we are creating a shared library, we need to copy the
4911 	     reloc into the shared library.  */
4912 	  if (bfd_link_pic (info)
4913 	      && (sec->flags & SEC_ALLOC) != 0
4914 	      && (r_type == R_NIOS2_BFD_RELOC_32
4915 		  || (h != NULL && ! h->needs_plt
4916 		      && (! SYMBOLIC_BIND (info, h) || ! h->def_regular))))
4917 	    {
4918 	      struct elf32_nios2_dyn_relocs *p;
4919 	      struct elf32_nios2_dyn_relocs **head;
4920 
4921 	      /* When creating a shared object, we must copy these
4922 		 reloc types into the output file.  We create a reloc
4923 		 section in dynobj and make room for this reloc.  */
4924 	      if (sreloc == NULL)
4925 		{
4926 		  sreloc = _bfd_elf_make_dynamic_reloc_section
4927 		    (sec, dynobj, 2, abfd, TRUE);
4928 		  if (sreloc == NULL)
4929 		    return FALSE;
4930 		}
4931 
4932 	      /* If this is a global symbol, we count the number of
4933 		 relocations we need for this symbol.  */
4934 	      if (h != NULL)
4935 		head = &((struct elf32_nios2_link_hash_entry *) h)->dyn_relocs;
4936 	      else
4937 		{
4938 		  /* Track dynamic relocs needed for local syms too.
4939 		     We really need local syms available to do this
4940 		     easily.  Oh well.  */
4941 
4942 		  asection *s;
4943 		  void *vpp;
4944 		  Elf_Internal_Sym *isym;
4945 
4946 		  isym = bfd_sym_from_r_symndx (&htab->sym_cache,
4947 						abfd, r_symndx);
4948 		  if (isym == NULL)
4949 		    return FALSE;
4950 
4951 		  s = bfd_section_from_elf_index (abfd, isym->st_shndx);
4952 		  if (s == NULL)
4953 		    s = sec;
4954 
4955 		  vpp = &elf_section_data (s)->local_dynrel;
4956 		  head = (struct elf32_nios2_dyn_relocs **) vpp;
4957 		}
4958 
4959 	      p = *head;
4960 	      if (p == NULL || p->sec != sec)
4961 		{
4962 		  bfd_size_type amt = sizeof *p;
4963 		  p = ((struct elf32_nios2_dyn_relocs *)
4964 		       bfd_alloc (htab->root.dynobj, amt));
4965 		  if (p == NULL)
4966 		    return FALSE;
4967 		  p->next = *head;
4968 		  *head = p;
4969 		  p->sec = sec;
4970 		  p->count = 0;
4971 		  p->pc_count = 0;
4972 		}
4973 
4974 	      p->count += 1;
4975 
4976 	    }
4977 	  break;
4978 	}
4979     }
4980 
4981   return TRUE;
4982 }
4983 
4984 
4985 /* Implement elf_backend_gc_mark_hook:
4986    Return the section that should be marked against GC for a given
4987    relocation.  */
4988 static asection *
4989 nios2_elf32_gc_mark_hook (asection *sec,
4990 			  struct bfd_link_info *info,
4991 			  Elf_Internal_Rela *rel,
4992 			  struct elf_link_hash_entry *h,
4993 			  Elf_Internal_Sym *sym)
4994 {
4995   if (h != NULL)
4996     switch (ELF32_R_TYPE (rel->r_info))
4997       {
4998       case R_NIOS2_GNU_VTINHERIT:
4999       case R_NIOS2_GNU_VTENTRY:
5000 	return NULL;
5001       }
5002   return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
5003 }
5004 
5005 /* Implement elf_backend_gc_sweep_hook:
5006    Update the got entry reference counts for the section being removed.  */
5007 static bfd_boolean
5008 nios2_elf32_gc_sweep_hook (bfd *abfd,
5009 			   struct bfd_link_info *info,
5010 			   asection *sec,
5011 			   const Elf_Internal_Rela *relocs)
5012 {
5013   Elf_Internal_Shdr *symtab_hdr;
5014   struct elf_link_hash_entry **sym_hashes;
5015   bfd_signed_vma *local_got_refcounts;
5016   const Elf_Internal_Rela *rel, *relend;
5017   bfd *dynobj;
5018 
5019   if (bfd_link_relocatable (info))
5020     return TRUE;
5021 
5022   elf_section_data (sec)->local_dynrel = NULL;
5023 
5024   dynobj = elf_hash_table (info)->dynobj;
5025   if (dynobj == NULL)
5026     return TRUE;
5027 
5028   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
5029   sym_hashes = elf_sym_hashes (abfd);
5030   local_got_refcounts = elf_local_got_refcounts (abfd);
5031 
5032   relend = relocs + sec->reloc_count;
5033   for (rel = relocs; rel < relend; rel++)
5034     {
5035       unsigned long r_symndx;
5036       struct elf_link_hash_entry *h = NULL;
5037       int r_type;
5038 
5039       r_symndx = ELF32_R_SYM (rel->r_info);
5040       if (r_symndx >= symtab_hdr->sh_info)
5041 	{
5042 	  h = sym_hashes[r_symndx - symtab_hdr->sh_info];
5043 	  while (h->root.type == bfd_link_hash_indirect
5044 		 || h->root.type == bfd_link_hash_warning)
5045 	    h = (struct elf_link_hash_entry *) h->root.u.i.link;
5046 	}
5047 
5048       r_type = ELF32_R_TYPE (rel->r_info);
5049       switch (r_type)
5050 	{
5051 	case R_NIOS2_GOT16:
5052 	case R_NIOS2_GOT_LO:
5053 	case R_NIOS2_GOT_HA:
5054 	case R_NIOS2_CALL16:
5055 	case R_NIOS2_CALL_LO:
5056 	case R_NIOS2_CALL_HA:
5057 	  if (h != NULL)
5058 	    {
5059 	      if (h->got.refcount > 0)
5060 		--h->got.refcount;
5061 	    }
5062 	  else if (local_got_refcounts != NULL)
5063 	    {
5064 	      if (local_got_refcounts[r_symndx] > 0)
5065 		--local_got_refcounts[r_symndx];
5066 	    }
5067 	  break;
5068 
5069 	case R_NIOS2_PCREL_LO:
5070 	case R_NIOS2_PCREL_HA:
5071 	case R_NIOS2_BFD_RELOC_32:
5072 	case R_NIOS2_CALL26:
5073 	case R_NIOS2_CALL26_NOAT:
5074 	  if (h != NULL)
5075 	    {
5076 	      struct elf32_nios2_link_hash_entry *eh;
5077 	      struct elf32_nios2_dyn_relocs **pp;
5078 	      struct elf32_nios2_dyn_relocs *p;
5079 
5080 	      eh = (struct elf32_nios2_link_hash_entry *) h;
5081 
5082 	      if (h->plt.refcount > 0)
5083 		--h->plt.refcount;
5084 
5085 	      if (r_type == R_NIOS2_PCREL_LO || r_type == R_NIOS2_PCREL_HA
5086 		  || r_type == R_NIOS2_BFD_RELOC_32)
5087 		{
5088 		  for (pp = &eh->dyn_relocs; (p = *pp) != NULL;
5089 		       pp = &p->next)
5090 		    if (p->sec == sec)
5091 		      {
5092 			p->count -= 1;
5093 			if (p->count == 0)
5094 			  *pp = p->next;
5095 			break;
5096 		      }
5097 		}
5098 	    }
5099 	  break;
5100 
5101 	default:
5102 	  break;
5103 	}
5104     }
5105 
5106   return TRUE;
5107 }
5108 
5109 /* Implement elf_backend_finish_dynamic_symbols:
5110    Finish up dynamic symbol handling.  We set the contents of various
5111    dynamic sections here.  */
5112 static bfd_boolean
5113 nios2_elf32_finish_dynamic_symbol (bfd *output_bfd,
5114 				   struct bfd_link_info *info,
5115 				   struct elf_link_hash_entry *h,
5116 				   Elf_Internal_Sym *sym)
5117 {
5118   struct elf32_nios2_link_hash_table *htab;
5119   struct elf32_nios2_link_hash_entry *eh
5120     = (struct elf32_nios2_link_hash_entry *)h;
5121   int use_plt;
5122 
5123   htab = elf32_nios2_hash_table (info);
5124 
5125   if (h->plt.offset != (bfd_vma) -1)
5126     {
5127       asection *splt;
5128       asection *sgotplt;
5129       asection *srela;
5130       bfd_vma plt_index;
5131       bfd_vma got_offset;
5132       Elf_Internal_Rela rela;
5133       bfd_byte *loc;
5134       bfd_vma got_address;
5135 
5136       /* This symbol has an entry in the procedure linkage table.  Set
5137 	 it up.  */
5138       BFD_ASSERT (h->dynindx != -1);
5139       splt = htab->root.splt;
5140       sgotplt = htab->root.sgotplt;
5141       srela = htab->root.srelplt;
5142       BFD_ASSERT (splt != NULL && sgotplt != NULL && srela != NULL);
5143 
5144       /* Emit the PLT entry.  */
5145       if (bfd_link_pic (info))
5146 	{
5147 	  nios2_elf32_install_data (splt, nios2_so_plt_entry, h->plt.offset,
5148 				    3);
5149 	  plt_index = (h->plt.offset - 24) / 12;
5150 	  got_offset = (plt_index + 3) * 4;
5151 	  nios2_elf32_install_imm16 (splt, h->plt.offset,
5152 				     hiadj(plt_index * 4));
5153 	  nios2_elf32_install_imm16 (splt, h->plt.offset + 4,
5154 				     (plt_index * 4) & 0xffff);
5155 	  nios2_elf32_install_imm16 (splt, h->plt.offset + 8,
5156 				     0xfff4 - h->plt.offset);
5157 	  got_address = (sgotplt->output_section->vma + sgotplt->output_offset
5158 			 + got_offset);
5159 
5160 	  /* Fill in the entry in the global offset table.  There are no
5161 	     res_n slots for a shared object PLT, instead the .got.plt entries
5162 	     point to the PLT entries.  */
5163 	  bfd_put_32 (output_bfd,
5164 		      splt->output_section->vma + splt->output_offset
5165 		      + h->plt.offset, sgotplt->contents + got_offset);
5166 	}
5167       else
5168 	{
5169 	  plt_index = (h->plt.offset - 28 - htab->res_n_size) / 12;
5170 	  got_offset = (plt_index + 3) * 4;
5171 
5172 	  nios2_elf32_install_data (splt, nios2_plt_entry, h->plt.offset, 3);
5173 	  got_address = (sgotplt->output_section->vma + sgotplt->output_offset
5174 			 + got_offset);
5175 	  nios2_elf32_install_imm16 (splt, h->plt.offset, hiadj(got_address));
5176 	  nios2_elf32_install_imm16 (splt, h->plt.offset + 4,
5177 				     got_address & 0xffff);
5178 
5179 	  /* Fill in the entry in the global offset table.  */
5180 	  bfd_put_32 (output_bfd,
5181 		      splt->output_section->vma + splt->output_offset
5182 		      + plt_index * 4, sgotplt->contents + got_offset);
5183 	}
5184 
5185       /* Fill in the entry in the .rela.plt section.  */
5186       rela.r_offset = got_address;
5187       rela.r_info = ELF32_R_INFO (h->dynindx, R_NIOS2_JUMP_SLOT);
5188       rela.r_addend = 0;
5189       loc = srela->contents + plt_index * sizeof (Elf32_External_Rela);
5190       bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
5191 
5192       if (!h->def_regular)
5193 	{
5194 	  /* Mark the symbol as undefined, rather than as defined in
5195 	     the .plt section.  Leave the value alone.  */
5196 	  sym->st_shndx = SHN_UNDEF;
5197 	  /* If the symbol is weak, we do need to clear the value.
5198 	     Otherwise, the PLT entry would provide a definition for
5199 	     the symbol even if the symbol wasn't defined anywhere,
5200 	     and so the symbol would never be NULL.  */
5201 	  if (!h->ref_regular_nonweak)
5202 	    sym->st_value = 0;
5203 	}
5204     }
5205 
5206   use_plt = (eh->got_types_used == CALL_USED
5207 	     && h->plt.offset != (bfd_vma) -1);
5208 
5209   if (!use_plt && h->got.offset != (bfd_vma) -1
5210       && (elf32_nios2_hash_entry (h)->tls_type & GOT_TLS_GD) == 0
5211       && (elf32_nios2_hash_entry (h)->tls_type & GOT_TLS_IE) == 0)
5212     {
5213       asection *sgot;
5214       asection *srela;
5215       Elf_Internal_Rela rela;
5216       bfd_byte *loc;
5217       bfd_vma offset;
5218 
5219       /* This symbol has an entry in the global offset table.  Set it
5220 	 up.  */
5221       sgot = htab->root.sgot;
5222       srela = htab->root.srelgot;
5223       BFD_ASSERT (sgot != NULL && srela != NULL);
5224 
5225       offset = (h->got.offset & ~(bfd_vma) 1);
5226       rela.r_offset = (sgot->output_section->vma
5227 		       + sgot->output_offset + offset);
5228 
5229       /* If this is a -Bsymbolic link, and the symbol is defined
5230 	 locally, we just want to emit a RELATIVE reloc.  Likewise if
5231 	 the symbol was forced to be local because of a version file.
5232 	 The entry in the global offset table will already have been
5233 	 initialized in the relocate_section function.  */
5234 
5235       if (bfd_link_pic (info) && SYMBOL_REFERENCES_LOCAL (info, h))
5236 	{
5237 	  rela.r_info = ELF32_R_INFO (0, R_NIOS2_RELATIVE);
5238 	  rela.r_addend = bfd_get_signed_32 (output_bfd,
5239 					     (sgot->contents + offset));
5240 	  bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + offset);
5241 	}
5242       else
5243 	{
5244 	  bfd_put_32 (output_bfd, (bfd_vma) 0,
5245 		      sgot->contents + offset);
5246 	  rela.r_info = ELF32_R_INFO (h->dynindx, R_NIOS2_GLOB_DAT);
5247 	  rela.r_addend = 0;
5248 	}
5249 
5250       loc = srela->contents;
5251       loc += srela->reloc_count++ * sizeof (Elf32_External_Rela);
5252       bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
5253     }
5254 
5255   if (use_plt && h->got.offset != (bfd_vma) -1)
5256     {
5257       bfd_vma offset = (h->got.offset & ~(bfd_vma) 1);
5258       asection *sgot = htab->root.sgot;
5259       asection *splt = htab->root.splt;
5260       bfd_put_32 (output_bfd, (splt->output_section->vma + splt->output_offset
5261 			       + h->plt.offset),
5262 		  sgot->contents + offset);
5263     }
5264 
5265   if (h->needs_copy)
5266     {
5267       asection *s;
5268       Elf_Internal_Rela rela;
5269       bfd_byte *loc;
5270 
5271       /* This symbol needs a copy reloc.  Set it up.  */
5272       BFD_ASSERT (h->dynindx != -1
5273 		  && (h->root.type == bfd_link_hash_defined
5274 		      || h->root.type == bfd_link_hash_defweak));
5275 
5276       s = htab->srelbss;
5277       BFD_ASSERT (s != NULL);
5278 
5279       rela.r_offset = (h->root.u.def.value
5280 		       + h->root.u.def.section->output_section->vma
5281 		       + h->root.u.def.section->output_offset);
5282       rela.r_info = ELF32_R_INFO (h->dynindx, R_NIOS2_COPY);
5283       rela.r_addend = 0;
5284       loc = s->contents + s->reloc_count++ * sizeof (Elf32_External_Rela);
5285       bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
5286     }
5287 
5288   /* Mark _DYNAMIC, _GLOBAL_OFFSET_TABLE_, and _gp_got as absolute.  */
5289   if (strcmp (h->root.root.string, "_DYNAMIC") == 0
5290       || h == elf_hash_table (info)->hgot
5291       || h == elf32_nios2_hash_table (info)->h_gp_got)
5292     sym->st_shndx = SHN_ABS;
5293 
5294   return TRUE;
5295 }
5296 
5297 /* Implement elf_backend_finish_dynamic_sections.  */
5298 static bfd_boolean
5299 nios2_elf32_finish_dynamic_sections (bfd *output_bfd,
5300 				     struct bfd_link_info *info)
5301 {
5302   bfd *dynobj;
5303   asection *sgotplt;
5304   asection *sdyn;
5305   struct elf32_nios2_link_hash_table *htab;
5306 
5307   htab = elf32_nios2_hash_table (info);
5308   dynobj = elf_hash_table (info)->dynobj;
5309   sgotplt = htab->root.sgotplt;
5310   BFD_ASSERT (sgotplt != NULL);
5311   sdyn = bfd_get_linker_section (dynobj, ".dynamic");
5312 
5313   if (elf_hash_table (info)->dynamic_sections_created)
5314     {
5315       asection *splt;
5316       Elf32_External_Dyn *dyncon, *dynconend;
5317 
5318       splt = htab->root.splt;
5319       BFD_ASSERT (splt != NULL && sdyn != NULL);
5320 
5321       dyncon = (Elf32_External_Dyn *) sdyn->contents;
5322       dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
5323       for (; dyncon < dynconend; dyncon++)
5324 	{
5325 	  Elf_Internal_Dyn dyn;
5326 	  asection *s;
5327 
5328 	  bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
5329 
5330 	  switch (dyn.d_tag)
5331 	    {
5332 	    default:
5333 	      break;
5334 
5335 	    case DT_PLTGOT:
5336 	      s = htab->root.sgot;
5337 	      BFD_ASSERT (s != NULL);
5338 	      dyn.d_un.d_ptr = s->output_section->vma;
5339 	      bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
5340 	      break;
5341 
5342 	    case DT_JMPREL:
5343 	      s = htab->root.srelplt;
5344 	      BFD_ASSERT (s != NULL);
5345 	      dyn.d_un.d_ptr = s->output_section->vma;
5346 	      bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
5347 	      break;
5348 
5349 	    case DT_PLTRELSZ:
5350 	      s = htab->root.srelplt;
5351 	      BFD_ASSERT (s != NULL);
5352 	      dyn.d_un.d_val = s->size;
5353 	      bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
5354 	      break;
5355 
5356 	    case DT_RELASZ:
5357 	      /* The procedure linkage table relocs (DT_JMPREL) should
5358 		 not be included in the overall relocs (DT_RELA).
5359 		 Therefore, we override the DT_RELASZ entry here to
5360 		 make it not include the JMPREL relocs.  Since the
5361 		 linker script arranges for .rela.plt to follow all
5362 		 other relocation sections, we don't have to worry
5363 		 about changing the DT_RELA entry.  */
5364 	      s = htab->root.srelplt;
5365 	      if (s != NULL)
5366 		dyn.d_un.d_val -= s->size;
5367 	      bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
5368 	      break;
5369 
5370 	    case DT_NIOS2_GP:
5371 	      s = htab->root.sgot;
5372 	      BFD_ASSERT (s != NULL);
5373 	      dyn.d_un.d_ptr = s->output_section->vma + 0x7ff0;
5374 	      bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
5375 	      break;
5376 	    }
5377 	}
5378 
5379       /* Fill in the first entry in the procedure linkage table.  */
5380       if (splt->size > 0)
5381 	{
5382 	  bfd_vma got_address = (sgotplt->output_section->vma
5383 				 + sgotplt->output_offset);
5384 	  if (bfd_link_pic (info))
5385 	    {
5386 	      bfd_vma corrected = got_address - (splt->output_section->vma
5387 						 + splt->output_offset + 4);
5388 	      nios2_elf32_install_data (splt, nios2_so_plt0_entry, 0, 6);
5389 	      nios2_elf32_install_imm16 (splt, 4, hiadj (corrected));
5390 	      nios2_elf32_install_imm16 (splt, 12, (corrected & 0xffff) + 4);
5391 	      nios2_elf32_install_imm16 (splt, 16, (corrected & 0xffff) + 8);
5392 	    }
5393 	  else
5394 	    {
5395 	      /* Divide by 4 here, not 3 because we already corrected for the
5396 		 res_N branches.  */
5397 	      bfd_vma res_size = (splt->size - 28) / 4;
5398 	      bfd_vma res_start = (splt->output_section->vma
5399 				   + splt->output_offset);
5400 	      bfd_vma res_offset;
5401 
5402 	      for (res_offset = 0; res_offset < res_size; res_offset += 4)
5403 		bfd_put_32 (output_bfd,
5404 			    6 | ((res_size - (res_offset + 4)) << 6),
5405 			    splt->contents + res_offset);
5406 
5407 	      nios2_elf32_install_data (splt, nios2_plt0_entry, res_size, 7);
5408 	      nios2_elf32_install_imm16 (splt, res_size, hiadj (res_start));
5409 	      nios2_elf32_install_imm16 (splt, res_size + 4,
5410 					 res_start & 0xffff);
5411 	      nios2_elf32_install_imm16 (splt, res_size + 12,
5412 					 hiadj (got_address));
5413 	      nios2_elf32_install_imm16 (splt, res_size + 16,
5414 					 (got_address & 0xffff) + 4);
5415 	      nios2_elf32_install_imm16 (splt, res_size + 20,
5416 					 (got_address & 0xffff) + 8);
5417 	    }
5418 	}
5419     }
5420   /* Fill in the first three entries in the global offset table.  */
5421   if (sgotplt->size > 0)
5422     {
5423       if (sdyn == NULL)
5424 	bfd_put_32 (output_bfd, (bfd_vma) 0, sgotplt->contents);
5425       else
5426 	bfd_put_32 (output_bfd,
5427 		    sdyn->output_section->vma + sdyn->output_offset,
5428 		    sgotplt->contents);
5429       bfd_put_32 (output_bfd, (bfd_vma) 0, sgotplt->contents + 4);
5430       bfd_put_32 (output_bfd, (bfd_vma) 0, sgotplt->contents + 8);
5431     }
5432 
5433   elf_section_data (sgotplt->output_section)->this_hdr.sh_entsize = 4;
5434 
5435   return TRUE;
5436 }
5437 
5438 /* Implement elf_backend_adjust_dynamic_symbol:
5439    Adjust a symbol defined by a dynamic object and referenced by a
5440    regular object.  The current definition is in some section of the
5441    dynamic object, but we're not including those sections.  We have to
5442    change the definition to something the rest of the link can
5443    understand.  */
5444 static bfd_boolean
5445 nios2_elf32_adjust_dynamic_symbol (struct bfd_link_info *info,
5446 				   struct elf_link_hash_entry *h)
5447 {
5448   struct elf32_nios2_link_hash_table *htab;
5449   bfd *dynobj;
5450   asection *s;
5451   unsigned align2;
5452 
5453   htab = elf32_nios2_hash_table (info);
5454   dynobj = elf_hash_table (info)->dynobj;
5455 
5456   /* Make sure we know what is going on here.  */
5457   BFD_ASSERT (dynobj != NULL
5458 	      && (h->needs_plt
5459 		  || h->u.weakdef != NULL
5460 		  || (h->def_dynamic
5461 		      && h->ref_regular
5462 		      && !h->def_regular)));
5463 
5464   /* If this is a function, put it in the procedure linkage table.  We
5465      will fill in the contents of the procedure linkage table later,
5466      when we know the address of the .got section.  */
5467   if (h->type == STT_FUNC || h->needs_plt)
5468     {
5469       if (h->plt.refcount <= 0
5470 	  || SYMBOL_CALLS_LOCAL (info, h)
5471 	  || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
5472 	      && h->root.type == bfd_link_hash_undefweak))
5473 	{
5474 	  /* This case can occur if we saw a PLT reloc in an input
5475 	     file, but the symbol was never referred to by a dynamic
5476 	     object, or if all references were garbage collected.  In
5477 	     such a case, we don't actually need to build a procedure
5478 	     linkage table, and we can just do a PCREL reloc instead.  */
5479 	  h->plt.offset = (bfd_vma) -1;
5480 	  h->needs_plt = 0;
5481 	}
5482 
5483       return TRUE;
5484     }
5485 
5486   /* Reinitialize the plt offset now that it is not used as a reference
5487      count any more.  */
5488   h->plt.offset = (bfd_vma) -1;
5489 
5490   /* If this is a weak symbol, and there is a real definition, the
5491      processor independent code will have arranged for us to see the
5492      real definition first, and we can just use the same value.  */
5493   if (h->u.weakdef != NULL)
5494     {
5495       BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
5496 		  || h->u.weakdef->root.type == bfd_link_hash_defweak);
5497       h->root.u.def.section = h->u.weakdef->root.u.def.section;
5498       h->root.u.def.value = h->u.weakdef->root.u.def.value;
5499       return TRUE;
5500     }
5501 
5502   /* If there are no non-GOT references, we do not need a copy
5503      relocation.  */
5504   if (!h->non_got_ref)
5505     return TRUE;
5506 
5507   /* This is a reference to a symbol defined by a dynamic object which
5508      is not a function.
5509      If we are creating a shared library, we must presume that the
5510      only references to the symbol are via the global offset table.
5511      For such cases we need not do anything here; the relocations will
5512      be handled correctly by relocate_section.  */
5513   if (bfd_link_pic (info))
5514     return TRUE;
5515 
5516   if (h->size == 0)
5517     {
5518       (*_bfd_error_handler) (_("dynamic variable `%s' is zero size"),
5519 			     h->root.root.string);
5520       return TRUE;
5521     }
5522 
5523   /* We must allocate the symbol in our .dynbss section, which will
5524      become part of the .bss section of the executable.  There will be
5525      an entry for this symbol in the .dynsym section.  The dynamic
5526      object will contain position independent code, so all references
5527      from the dynamic object to this symbol will go through the global
5528      offset table.  The dynamic linker will use the .dynsym entry to
5529      determine the address it must put in the global offset table, so
5530      both the dynamic object and the regular object will refer to the
5531      same memory location for the variable.  */
5532   s = htab->sdynbss;
5533   BFD_ASSERT (s != NULL);
5534 
5535   /* We must generate a R_NIOS2_COPY reloc to tell the dynamic linker to
5536      copy the initial value out of the dynamic object and into the
5537      runtime process image.  We need to remember the offset into the
5538      .rela.bss section we are going to use.  */
5539   if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
5540     {
5541       asection *srel;
5542 
5543       srel = htab->srelbss;
5544       BFD_ASSERT (srel != NULL);
5545       srel->size += sizeof (Elf32_External_Rela);
5546       h->needs_copy = 1;
5547     }
5548 
5549   align2 = bfd_log2 (h->size);
5550   if (align2 > h->root.u.def.section->alignment_power)
5551     align2 = h->root.u.def.section->alignment_power;
5552 
5553   /* Align dynbss.  */
5554   s->size = BFD_ALIGN (s->size, (bfd_size_type)1 << align2);
5555   if (align2 > bfd_get_section_alignment (dynobj, s)
5556       && !bfd_set_section_alignment (dynobj, s, align2))
5557     return FALSE;
5558 
5559   /* Define the symbol as being at this point in the section.  */
5560   h->root.u.def.section = s;
5561   h->root.u.def.value = s->size;
5562 
5563   /* Increment the section size to make room for the symbol.  */
5564   s->size += h->size;
5565 
5566   return TRUE;
5567 }
5568 
5569 /* Worker function for nios2_elf32_size_dynamic_sections.  */
5570 static bfd_boolean
5571 adjust_dynrelocs (struct elf_link_hash_entry *h, PTR inf)
5572 {
5573   struct bfd_link_info *info;
5574   struct elf32_nios2_link_hash_table *htab;
5575 
5576   if (h->root.type == bfd_link_hash_indirect)
5577     return TRUE;
5578 
5579   if (h->root.type == bfd_link_hash_warning)
5580     /* When warning symbols are created, they **replace** the "real"
5581        entry in the hash table, thus we never get to see the real
5582        symbol in a hash traversal.  So look at it now.  */
5583     h = (struct elf_link_hash_entry *) h->root.u.i.link;
5584 
5585   info = (struct bfd_link_info *) inf;
5586   htab = elf32_nios2_hash_table (info);
5587 
5588   if (h->plt.offset != (bfd_vma)-1)
5589     h->plt.offset += htab->res_n_size;
5590   if (htab->root.splt == h->root.u.def.section)
5591     h->root.u.def.value += htab->res_n_size;
5592 
5593   return TRUE;
5594 }
5595 
5596 /* Another worker function for nios2_elf32_size_dynamic_sections.
5597    Allocate space in .plt, .got and associated reloc sections for
5598    dynamic relocs.  */
5599 static bfd_boolean
5600 allocate_dynrelocs (struct elf_link_hash_entry *h, PTR inf)
5601 {
5602   struct bfd_link_info *info;
5603   struct elf32_nios2_link_hash_table *htab;
5604   struct elf32_nios2_link_hash_entry *eh;
5605   struct elf32_nios2_dyn_relocs *p;
5606   int use_plt;
5607 
5608   if (h->root.type == bfd_link_hash_indirect)
5609     return TRUE;
5610 
5611   if (h->root.type == bfd_link_hash_warning)
5612     /* When warning symbols are created, they **replace** the "real"
5613        entry in the hash table, thus we never get to see the real
5614        symbol in a hash traversal.  So look at it now.  */
5615     h = (struct elf_link_hash_entry *) h->root.u.i.link;
5616 
5617   info = (struct bfd_link_info *) inf;
5618   htab = elf32_nios2_hash_table (info);
5619 
5620   if (htab->root.dynamic_sections_created
5621       && h->plt.refcount > 0)
5622     {
5623       /* Make sure this symbol is output as a dynamic symbol.
5624 	 Undefined weak syms won't yet be marked as dynamic.  */
5625       if (h->dynindx == -1
5626 	  && !h->forced_local
5627 	  && !bfd_elf_link_record_dynamic_symbol (info, h))
5628 	return FALSE;
5629 
5630       if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, bfd_link_pic (info), h))
5631 	{
5632 	  asection *s = htab->root.splt;
5633 
5634 	  /* Allocate room for the header.  */
5635 	  if (s->size == 0)
5636 	    {
5637 	      if (bfd_link_pic (info))
5638 		s->size = 24;
5639 	      else
5640 		s->size = 28;
5641 	    }
5642 
5643 	  h->plt.offset = s->size;
5644 
5645 	  /* If this symbol is not defined in a regular file, and we are
5646 	     not generating a shared library, then set the symbol to this
5647 	     location in the .plt.  This is required to make function
5648 	     pointers compare as equal between the normal executable and
5649 	     the shared library.  */
5650 	  if (! bfd_link_pic (info)
5651 	      && !h->def_regular)
5652 	    {
5653 	      h->root.u.def.section = s;
5654 	      h->root.u.def.value = h->plt.offset;
5655 	    }
5656 
5657 	  /* Make room for this entry.  */
5658 	  s->size += 12;
5659 
5660 	  /* We also need to make an entry in the .rela.plt section.  */
5661 	  htab->root.srelplt->size += sizeof (Elf32_External_Rela);
5662 
5663 	  /* And the .got.plt section.  */
5664 	  htab->root.sgotplt->size += 4;
5665 	}
5666       else
5667 	{
5668 	  h->plt.offset = (bfd_vma) -1;
5669 	  h->needs_plt = 0;
5670 	}
5671     }
5672   else
5673     {
5674       h->plt.offset = (bfd_vma) -1;
5675       h->needs_plt = 0;
5676     }
5677 
5678   eh = (struct elf32_nios2_link_hash_entry *) h;
5679   use_plt = (eh->got_types_used == CALL_USED
5680 	     && h->plt.offset != (bfd_vma) -1);
5681 
5682   if (h->got.refcount > 0)
5683     {
5684       asection *s;
5685       bfd_boolean dyn;
5686       int tls_type = eh->tls_type;
5687       int indx;
5688 
5689       /* Make sure this symbol is output as a dynamic symbol.
5690 	 Undefined weak syms won't yet be marked as dynamic.  */
5691       if (h->dynindx == -1
5692 	  && !h->forced_local
5693 	  && !bfd_elf_link_record_dynamic_symbol (info, h))
5694 	return FALSE;
5695 
5696       s = htab->root.sgot;
5697       h->got.offset = s->size;
5698 
5699       if (tls_type == GOT_UNKNOWN)
5700 	abort ();
5701 
5702       if (tls_type == GOT_NORMAL)
5703 	/* Non-TLS symbols need one GOT slot.  */
5704 	s->size += 4;
5705       else
5706 	{
5707 	  if (tls_type & GOT_TLS_GD)
5708 	    /* R_NIOS2_TLS_GD16 needs 2 consecutive GOT slots.  */
5709 	    s->size += 8;
5710 	  if (tls_type & GOT_TLS_IE)
5711 	    /* R_NIOS2_TLS_IE16 needs one GOT slot.  */
5712 	    s->size += 4;
5713 	}
5714 
5715       dyn = htab->root.dynamic_sections_created;
5716 
5717       indx = 0;
5718       if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, bfd_link_pic (info), h)
5719 	  && (!bfd_link_pic (info)
5720 	      || !SYMBOL_REFERENCES_LOCAL (info, h)))
5721 	indx = h->dynindx;
5722 
5723       if (tls_type != GOT_NORMAL
5724 	  && (bfd_link_pic (info) || indx != 0)
5725 	  && (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
5726 	      || h->root.type != bfd_link_hash_undefweak))
5727 	{
5728 	  if (tls_type & GOT_TLS_IE)
5729 	    htab->root.srelgot->size += sizeof (Elf32_External_Rela);
5730 
5731 	  if (tls_type & GOT_TLS_GD)
5732 	    htab->root.srelgot->size += sizeof (Elf32_External_Rela);
5733 
5734 	  if ((tls_type & GOT_TLS_GD) && indx != 0)
5735 	    htab->root.srelgot->size += sizeof (Elf32_External_Rela);
5736 	}
5737       else if ((ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
5738 		|| h->root.type != bfd_link_hash_undefweak)
5739 	       && !use_plt
5740 	       && (bfd_link_pic (info)
5741 		   || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h)))
5742 	htab->root.srelgot->size += sizeof (Elf32_External_Rela);
5743     }
5744   else
5745     h->got.offset = (bfd_vma) -1;
5746 
5747   if (eh->dyn_relocs == NULL)
5748     return TRUE;
5749 
5750   /* In the shared -Bsymbolic case, discard space allocated for
5751      dynamic pc-relative relocs against symbols which turn out to be
5752      defined in regular objects.  For the normal shared case, discard
5753      space for pc-relative relocs that have become local due to symbol
5754      visibility changes.  */
5755 
5756   if (bfd_link_pic (info))
5757     {
5758       if (h->def_regular
5759 	  && (h->forced_local || SYMBOLIC_BIND (info, h)))
5760 	{
5761 	  struct elf32_nios2_dyn_relocs **pp;
5762 
5763 	  for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
5764 	    {
5765 	      p->count -= p->pc_count;
5766 	      p->pc_count = 0;
5767 	      if (p->count == 0)
5768 		*pp = p->next;
5769 	      else
5770 		pp = &p->next;
5771 	    }
5772 	}
5773 
5774       /* Also discard relocs on undefined weak syms with non-default
5775 	 visibility.  */
5776       if (eh->dyn_relocs != NULL
5777 	  && h->root.type == bfd_link_hash_undefweak)
5778 	{
5779 	  if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
5780 	    eh->dyn_relocs = NULL;
5781 
5782 	  /* Make sure undefined weak symbols are output as a dynamic
5783 	     symbol in PIEs.  */
5784 	  else if (h->dynindx == -1
5785 		   && !h->forced_local
5786 		   && !bfd_elf_link_record_dynamic_symbol (info, h))
5787 	    return FALSE;
5788 	}
5789     }
5790   else
5791     {
5792       /* For the non-shared case, discard space for relocs against
5793 	 symbols which turn out to need copy relocs or are not
5794 	 dynamic.  */
5795 
5796       if (!h->non_got_ref
5797 	  && ((h->def_dynamic && !h->def_regular)
5798 	      || (htab->root.dynamic_sections_created
5799 		  && (h->root.type == bfd_link_hash_undefweak
5800 		      || h->root.type == bfd_link_hash_undefined))))
5801 	{
5802 	  /* Make sure this symbol is output as a dynamic symbol.
5803 	     Undefined weak syms won't yet be marked as dynamic.  */
5804 	  if (h->dynindx == -1
5805 	      && !h->forced_local
5806 	      && !bfd_elf_link_record_dynamic_symbol (info, h))
5807 	    return FALSE;
5808 
5809 	  /* If that succeeded, we know we'll be keeping all the
5810 	     relocs.  */
5811 	  if (h->dynindx != -1)
5812 	    goto keep;
5813 	}
5814 
5815       eh->dyn_relocs = NULL;
5816 
5817     keep: ;
5818     }
5819 
5820   /* Finally, allocate space.  */
5821   for (p = eh->dyn_relocs; p != NULL; p = p->next)
5822     {
5823       asection *sreloc = elf_section_data (p->sec)->sreloc;
5824       sreloc->size += p->count * sizeof (Elf32_External_Rela);
5825     }
5826 
5827   return TRUE;
5828 }
5829 
5830 /* Implement elf_backend_size_dynamic_sections:
5831    Set the sizes of the dynamic sections.  */
5832 static bfd_boolean
5833 nios2_elf32_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
5834 				   struct bfd_link_info *info)
5835 {
5836   bfd *dynobj;
5837   asection *s;
5838   bfd_boolean plt;
5839   bfd_boolean got;
5840   bfd_boolean relocs;
5841   bfd *ibfd;
5842   struct elf32_nios2_link_hash_table *htab;
5843 
5844   htab = elf32_nios2_hash_table (info);
5845   dynobj = elf_hash_table (info)->dynobj;
5846   BFD_ASSERT (dynobj != NULL);
5847 
5848   htab->res_n_size = 0;
5849   if (elf_hash_table (info)->dynamic_sections_created)
5850     {
5851       /* Set the contents of the .interp section to the interpreter.  */
5852       if (bfd_link_executable (info) && !info->nointerp)
5853 	{
5854 	  s = bfd_get_linker_section (dynobj, ".interp");
5855 	  BFD_ASSERT (s != NULL);
5856 	  s->size = sizeof ELF_DYNAMIC_INTERPRETER;
5857 	  s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
5858 	}
5859     }
5860   else
5861     {
5862       /* We may have created entries in the .rela.got section.
5863 	 However, if we are not creating the dynamic sections, we will
5864 	 not actually use these entries.  Reset the size of .rela.got,
5865 	 which will cause it to get stripped from the output file
5866 	 below.  */
5867       s = htab->root.srelgot;
5868       if (s != NULL)
5869 	s->size = 0;
5870     }
5871 
5872   /* Set up .got offsets for local syms, and space for local dynamic
5873      relocs.  */
5874   for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
5875     {
5876       bfd_signed_vma *local_got;
5877       bfd_signed_vma *end_local_got;
5878       char *local_tls_type;
5879       bfd_size_type locsymcount;
5880       Elf_Internal_Shdr *symtab_hdr;
5881       asection *srel;
5882 
5883       if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour)
5884 	continue;
5885 
5886       for (s = ibfd->sections; s != NULL; s = s->next)
5887 	{
5888 	  struct elf32_nios2_dyn_relocs *p;
5889 
5890 	  for (p = elf_section_data (s)->local_dynrel; p != NULL; p = p->next)
5891 	    {
5892 	      if (!bfd_is_abs_section (p->sec)
5893 		  && bfd_is_abs_section (p->sec->output_section))
5894 		{
5895 		  /* Input section has been discarded, either because
5896 		     it is a copy of a linkonce section or due to
5897 		     linker script /DISCARD/, so we'll be discarding
5898 		     the relocs too.  */
5899 		}
5900 	      else if (p->count != 0)
5901 		{
5902 		  srel = elf_section_data (p->sec)->sreloc;
5903 		  srel->size += p->count * sizeof (Elf32_External_Rela);
5904 		  if ((p->sec->output_section->flags & SEC_READONLY) != 0)
5905 		    info->flags |= DF_TEXTREL;
5906 		}
5907 	    }
5908 	}
5909 
5910       local_got = elf_local_got_refcounts (ibfd);
5911       if (!local_got)
5912 	continue;
5913 
5914       symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
5915       locsymcount = symtab_hdr->sh_info;
5916       end_local_got = local_got + locsymcount;
5917       local_tls_type = elf32_nios2_local_got_tls_type (ibfd);
5918       s = htab->root.sgot;
5919       srel = htab->root.srelgot;
5920       for (; local_got < end_local_got; ++local_got, ++local_tls_type)
5921 	{
5922 	  if (*local_got > 0)
5923 	    {
5924 	      *local_got = s->size;
5925 	      if (*local_tls_type & GOT_TLS_GD)
5926 		/* TLS_GD relocs need an 8-byte structure in the GOT.  */
5927 		s->size += 8;
5928 	      if (*local_tls_type & GOT_TLS_IE)
5929 		s->size += 4;
5930 	      if (*local_tls_type == GOT_NORMAL)
5931 		s->size += 4;
5932 
5933 	      if (bfd_link_pic (info) || *local_tls_type == GOT_TLS_GD)
5934 		srel->size += sizeof (Elf32_External_Rela);
5935 	    }
5936 	  else
5937 	    *local_got = (bfd_vma) -1;
5938 	}
5939     }
5940 
5941   if (htab->tls_ldm_got.refcount > 0)
5942     {
5943       /* Allocate two GOT entries and one dynamic relocation (if necessary)
5944 	 for R_NIOS2_TLS_LDM16 relocations.  */
5945       htab->tls_ldm_got.offset = htab->root.sgot->size;
5946       htab->root.sgot->size += 8;
5947       if (bfd_link_pic (info))
5948 	htab->root.srelgot->size += sizeof (Elf32_External_Rela);
5949     }
5950   else
5951     htab->tls_ldm_got.offset = -1;
5952 
5953   /* Allocate global sym .plt and .got entries, and space for global
5954      sym dynamic relocs.  */
5955   elf_link_hash_traverse (& htab->root, allocate_dynrelocs, info);
5956 
5957   if (elf_hash_table (info)->dynamic_sections_created)
5958     {
5959       /* If the .got section is more than 0x8000 bytes, we add
5960 	 0x8000 to the value of _gp_got, so that 16-bit relocations
5961 	 have a greater chance of working. */
5962       if (htab->root.sgot->size >= 0x8000
5963 	  && elf32_nios2_hash_table (info)->h_gp_got->root.u.def.value == 0)
5964 	elf32_nios2_hash_table (info)->h_gp_got->root.u.def.value = 0x8000;
5965     }
5966 
5967   /* The check_relocs and adjust_dynamic_symbol entry points have
5968      determined the sizes of the various dynamic sections.  Allocate
5969      memory for them.  */
5970   plt = FALSE;
5971   got = FALSE;
5972   relocs = FALSE;
5973   for (s = dynobj->sections; s != NULL; s = s->next)
5974     {
5975       const char *name;
5976 
5977       if ((s->flags & SEC_LINKER_CREATED) == 0)
5978 	continue;
5979 
5980       /* It's OK to base decisions on the section name, because none
5981 	 of the dynobj section names depend upon the input files.  */
5982       name = bfd_get_section_name (dynobj, s);
5983 
5984       if (strcmp (name, ".plt") == 0)
5985 	{
5986 	  /* Remember whether there is a PLT.  */
5987 	  plt = s->size != 0;
5988 
5989 	  /* Correct for the number of res_N branches.  */
5990 	  if (plt && !bfd_link_pic (info))
5991 	    {
5992 	      htab->res_n_size = (s->size-28) / 3;
5993 	      s->size += htab->res_n_size;
5994 	    }
5995 	}
5996       else if (CONST_STRNEQ (name, ".rela"))
5997 	{
5998 	  if (s->size != 0)
5999 	    {
6000 	      relocs = TRUE;
6001 
6002 	      /* We use the reloc_count field as a counter if we need
6003 		 to copy relocs into the output file.  */
6004 	      s->reloc_count = 0;
6005 	    }
6006 	}
6007       else if (CONST_STRNEQ (name, ".got"))
6008 	got = s->size != 0;
6009       else if (strcmp (name, ".dynbss") != 0)
6010 	/* It's not one of our sections, so don't allocate space.  */
6011 	continue;
6012 
6013       if (s->size == 0)
6014 	{
6015 	  /* If we don't need this section, strip it from the
6016 	     output file.  This is mostly to handle .rela.bss and
6017 	     .rela.plt.  We must create both sections in
6018 	     create_dynamic_sections, because they must be created
6019 	     before the linker maps input sections to output
6020 	     sections.  The linker does that before
6021 	     adjust_dynamic_symbol is called, and it is that
6022 	     function which decides whether anything needs to go
6023 	     into these sections.  */
6024 	  s->flags |= SEC_EXCLUDE;
6025 	  continue;
6026 	}
6027 
6028       if ((s->flags & SEC_HAS_CONTENTS) == 0)
6029 	continue;
6030 
6031       /* Allocate memory for the section contents.  */
6032       /* FIXME: This should be a call to bfd_alloc not bfd_zalloc.
6033 	 Unused entries should be reclaimed before the section's contents
6034 	 are written out, but at the moment this does not happen.  Thus in
6035 	 order to prevent writing out garbage, we initialize the section's
6036 	 contents to zero.  */
6037       s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->size);
6038       if (s->contents == NULL)
6039 	return FALSE;
6040     }
6041 
6042   /* Adjust dynamic symbols that point to the plt to account for the
6043      now-known number of resN slots.  */
6044   if (htab->res_n_size)
6045     elf_link_hash_traverse (& htab->root, adjust_dynrelocs, info);
6046 
6047   if (elf_hash_table (info)->dynamic_sections_created)
6048     {
6049       /* Add some entries to the .dynamic section.  We fill in the
6050 	 values later, in elf_nios2_finish_dynamic_sections, but we
6051 	 must add the entries now so that we get the correct size for
6052 	 the .dynamic section.  The DT_DEBUG entry is filled in by the
6053 	 dynamic linker and used by the debugger.  */
6054 #define add_dynamic_entry(TAG, VAL) \
6055   _bfd_elf_add_dynamic_entry (info, TAG, VAL)
6056 
6057       if (!bfd_link_pic (info) && !add_dynamic_entry (DT_DEBUG, 0))
6058 	return FALSE;
6059 
6060       if (got && !add_dynamic_entry (DT_PLTGOT, 0))
6061 	return FALSE;
6062 
6063       if (plt
6064 	  && (!add_dynamic_entry (DT_PLTRELSZ, 0)
6065 	      || !add_dynamic_entry (DT_PLTREL, DT_RELA)
6066 	      || !add_dynamic_entry (DT_JMPREL, 0)))
6067 	return FALSE;
6068 
6069       if (relocs
6070 	  && (!add_dynamic_entry (DT_RELA, 0)
6071 	      || !add_dynamic_entry (DT_RELASZ, 0)
6072 	      || !add_dynamic_entry (DT_RELAENT, sizeof (Elf32_External_Rela))))
6073 	return FALSE;
6074 
6075       if (!bfd_link_pic (info) && !add_dynamic_entry (DT_NIOS2_GP, 0))
6076 	return FALSE;
6077 
6078       if ((info->flags & DF_TEXTREL) != 0
6079 	  && !add_dynamic_entry (DT_TEXTREL, 0))
6080 	return FALSE;
6081     }
6082 #undef add_dynamic_entry
6083 
6084   return TRUE;
6085 }
6086 
6087 /* Free the derived linker hash table.  */
6088 static void
6089 nios2_elf32_link_hash_table_free (bfd *obfd)
6090 {
6091   struct elf32_nios2_link_hash_table *htab
6092     = (struct elf32_nios2_link_hash_table *) obfd->link.hash;
6093 
6094   bfd_hash_table_free (&htab->bstab);
6095   _bfd_elf_link_hash_table_free (obfd);
6096 }
6097 
6098 /* Implement bfd_elf32_bfd_link_hash_table_create.  */
6099 static struct bfd_link_hash_table *
6100 nios2_elf32_link_hash_table_create (bfd *abfd)
6101 {
6102   struct elf32_nios2_link_hash_table *ret;
6103   bfd_size_type amt = sizeof (struct elf32_nios2_link_hash_table);
6104 
6105   ret = bfd_zmalloc (amt);
6106   if (ret == NULL)
6107     return NULL;
6108 
6109   if (!_bfd_elf_link_hash_table_init (&ret->root, abfd,
6110 				      link_hash_newfunc,
6111 				      sizeof (struct
6112 					      elf32_nios2_link_hash_entry),
6113 				      NIOS2_ELF_DATA))
6114     {
6115       free (ret);
6116       return NULL;
6117     }
6118 
6119   /* Init the stub hash table too.  */
6120   if (!bfd_hash_table_init (&ret->bstab, stub_hash_newfunc,
6121 			    sizeof (struct elf32_nios2_stub_hash_entry)))
6122     {
6123       _bfd_elf_link_hash_table_free (abfd);
6124       return NULL;
6125     }
6126   ret->root.root.hash_table_free = nios2_elf32_link_hash_table_free;
6127 
6128   return &ret->root.root;
6129 }
6130 
6131 /* Implement elf_backend_reloc_type_class.  */
6132 static enum elf_reloc_type_class
6133 nios2_elf32_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED,
6134 			      const asection *rel_sec ATTRIBUTE_UNUSED,
6135 			      const Elf_Internal_Rela *rela)
6136 {
6137   switch ((int) ELF32_R_TYPE (rela->r_info))
6138     {
6139     case R_NIOS2_RELATIVE:
6140       return reloc_class_relative;
6141     case R_NIOS2_JUMP_SLOT:
6142       return reloc_class_plt;
6143     case R_NIOS2_COPY:
6144       return reloc_class_copy;
6145     default:
6146       return reloc_class_normal;
6147     }
6148 }
6149 
6150 /* Return 1 if target is one of ours.  */
6151 static bfd_boolean
6152 is_nios2_elf_target (const struct bfd_target *targ)
6153 {
6154   return (targ == &nios2_elf32_le_vec
6155 	  || targ == &nios2_elf32_be_vec);
6156 }
6157 
6158 /* Implement elf_backend_add_symbol_hook.
6159    This hook is called by the linker when adding symbols from an object
6160    file.  We use it to put .comm items in .sbss, and not .bss.  */
6161 static bfd_boolean
6162 nios2_elf_add_symbol_hook (bfd *abfd,
6163 			   struct bfd_link_info *info,
6164 			   Elf_Internal_Sym *sym,
6165 			   const char **namep ATTRIBUTE_UNUSED,
6166 			   flagword *flagsp ATTRIBUTE_UNUSED,
6167 			   asection **secp,
6168 			   bfd_vma *valp)
6169 {
6170   bfd *dynobj;
6171 
6172   if (sym->st_shndx == SHN_COMMON
6173       && !bfd_link_relocatable (info)
6174       && sym->st_size <= elf_gp_size (abfd)
6175       && is_nios2_elf_target (info->output_bfd->xvec))
6176     {
6177       /* Common symbols less than or equal to -G nn bytes are automatically
6178 	 put into .sbss.  */
6179       struct elf32_nios2_link_hash_table *htab;
6180 
6181       htab = elf32_nios2_hash_table (info);
6182       if (htab->sbss == NULL)
6183 	{
6184 	  flagword flags = SEC_IS_COMMON | SEC_LINKER_CREATED;
6185 
6186 	  dynobj = elf_hash_table (info)->dynobj;
6187 	  if (!dynobj)
6188 	    dynobj = abfd;
6189 
6190 	  htab->sbss = bfd_make_section_anyway_with_flags (dynobj, ".sbss",
6191 							   flags);
6192 	  if (htab->sbss == NULL)
6193 	    return FALSE;
6194 	}
6195 
6196       *secp = htab->sbss;
6197       *valp = sym->st_size;
6198     }
6199 
6200   return TRUE;
6201 }
6202 
6203 /* Implement elf_backend_can_make_relative_eh_frame:
6204    Decide whether to attempt to turn absptr or lsda encodings in
6205    shared libraries into pcrel within the given input section.  */
6206 static bfd_boolean
6207 nios2_elf32_can_make_relative_eh_frame (bfd *input_bfd ATTRIBUTE_UNUSED,
6208 					struct bfd_link_info *info
6209 					ATTRIBUTE_UNUSED,
6210 					asection *eh_frame_section
6211 					ATTRIBUTE_UNUSED)
6212 {
6213   /* We can't use PC-relative encodings in the .eh_frame section.  */
6214   return FALSE;
6215 }
6216 
6217 /* Implement elf_backend_special_sections.  */
6218 const struct bfd_elf_special_section elf32_nios2_special_sections[] =
6219 {
6220   { STRING_COMMA_LEN (".sbss"),	 -2, SHT_NOBITS,
6221     SHF_ALLOC + SHF_WRITE + SHF_NIOS2_GPREL },
6222   { STRING_COMMA_LEN (".sdata"), -2, SHT_PROGBITS,
6223     SHF_ALLOC + SHF_WRITE + SHF_NIOS2_GPREL },
6224   { NULL,		      0,  0, 0,		     0 }
6225 };
6226 
6227 #define ELF_ARCH			bfd_arch_nios2
6228 #define ELF_TARGET_ID			NIOS2_ELF_DATA
6229 #define ELF_MACHINE_CODE		EM_ALTERA_NIOS2
6230 
6231 /* The Nios II MMU uses a 4K page size.  */
6232 
6233 #define ELF_MAXPAGESIZE			0x1000
6234 
6235 #define bfd_elf32_bfd_link_hash_table_create \
6236 					  nios2_elf32_link_hash_table_create
6237 
6238 #define bfd_elf32_bfd_merge_private_bfd_data \
6239 					  nios2_elf32_merge_private_bfd_data
6240 
6241 /* Relocation table lookup macros.  */
6242 
6243 #define bfd_elf32_bfd_reloc_type_lookup	  nios2_elf32_bfd_reloc_type_lookup
6244 #define bfd_elf32_bfd_reloc_name_lookup	  nios2_elf32_bfd_reloc_name_lookup
6245 
6246 /* JUMP_TABLE_LINK macros.  */
6247 
6248 /* elf_info_to_howto (using RELA relocations).  */
6249 
6250 #define elf_info_to_howto		  nios2_elf32_info_to_howto
6251 
6252 /* elf backend functions.  */
6253 
6254 #define elf_backend_can_gc_sections	1
6255 #define elf_backend_can_refcount	1
6256 #define elf_backend_plt_readonly	1
6257 #define elf_backend_want_got_plt	1
6258 #define elf_backend_rela_normal		1
6259 
6260 #define elf_backend_relocate_section	  nios2_elf32_relocate_section
6261 #define elf_backend_section_flags	  nios2_elf32_section_flags
6262 #define elf_backend_fake_sections	  nios2_elf32_fake_sections
6263 #define elf_backend_check_relocs	  nios2_elf32_check_relocs
6264 
6265 #define elf_backend_gc_mark_hook	  nios2_elf32_gc_mark_hook
6266 #define elf_backend_gc_sweep_hook	  nios2_elf32_gc_sweep_hook
6267 #define elf_backend_create_dynamic_sections \
6268 					  nios2_elf32_create_dynamic_sections
6269 #define elf_backend_finish_dynamic_symbol nios2_elf32_finish_dynamic_symbol
6270 #define elf_backend_finish_dynamic_sections \
6271 					  nios2_elf32_finish_dynamic_sections
6272 #define elf_backend_adjust_dynamic_symbol nios2_elf32_adjust_dynamic_symbol
6273 #define elf_backend_reloc_type_class	  nios2_elf32_reloc_type_class
6274 #define elf_backend_size_dynamic_sections nios2_elf32_size_dynamic_sections
6275 #define elf_backend_add_symbol_hook	  nios2_elf_add_symbol_hook
6276 #define elf_backend_copy_indirect_symbol  nios2_elf32_copy_indirect_symbol
6277 #define elf_backend_object_p		  nios2_elf32_object_p
6278 
6279 #define elf_backend_grok_prstatus	  nios2_grok_prstatus
6280 #define elf_backend_grok_psinfo		  nios2_grok_psinfo
6281 
6282 #undef elf_backend_can_make_relative_eh_frame
6283 #define elf_backend_can_make_relative_eh_frame \
6284 					  nios2_elf32_can_make_relative_eh_frame
6285 
6286 #define elf_backend_special_sections	  elf32_nios2_special_sections
6287 
6288 #define TARGET_LITTLE_SYM		nios2_elf32_le_vec
6289 #define TARGET_LITTLE_NAME		"elf32-littlenios2"
6290 #define TARGET_BIG_SYM			nios2_elf32_be_vec
6291 #define TARGET_BIG_NAME			"elf32-bignios2"
6292 
6293 #define elf_backend_got_header_size	12
6294 #define elf_backend_default_execstack	0
6295 
6296 #include "elf32-target.h"
6297