Fix RX and M68HC11 linker testsuite failures.
[external/binutils.git] / bfd / elf32-nios2.c
1 /* 32-bit ELF support for Nios II.
2    Copyright (C) 2012-2016 Free Software Foundation, Inc.
3    Contributed by Nigel Gray (ngray@altera.com).
4    Contributed by Mentor Graphics, Inc.
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 || ((bfd_signed_vma) 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           {
3090             asection *sym_sec = lh->u.def.section;
3091             bfd_vma sym_value = lh->u.def.value;
3092
3093             if (sym_sec->output_section)
3094               sym_value = (sym_value + sym_sec->output_offset
3095                            + sym_sec->output_section->vma);
3096             *pgp = sym_value;
3097           }
3098           break;
3099         case bfd_link_hash_indirect:
3100         case bfd_link_hash_warning:
3101           lh = lh->u.i.link;
3102           /* @@FIXME  ignoring warning for now */
3103           goto lookup;
3104         case bfd_link_hash_new:
3105         default:
3106           abort ();
3107         }
3108     }
3109   else
3110     gp_found = FALSE;
3111
3112   if (!gp_found)
3113     {
3114       /* Only get the error once. */
3115       *pgp = 4;
3116       _bfd_set_gp_value (output_bfd, *pgp);
3117       return FALSE;
3118     }
3119
3120   _bfd_set_gp_value (output_bfd, *pgp);
3121
3122   return TRUE;
3123 }
3124
3125 /* Retrieve the previously cached _gp pointer, returning bfd_reloc_dangerous
3126    if it's not available as we don't have a link_info pointer available here
3127    to look it up in the output symbol table.  We don't need to adjust the
3128    symbol value for an external symbol if we are producing relocatable
3129    output.  */
3130 static bfd_reloc_status_type
3131 nios2_elf_final_gp (bfd *output_bfd, asymbol *symbol, bfd_boolean relocatable,
3132                     char **error_message, bfd_vma *pgp)
3133 {
3134   if (bfd_is_und_section (symbol->section) && !relocatable)
3135     {
3136       *pgp = 0;
3137       return bfd_reloc_undefined;
3138     }
3139
3140   *pgp = _bfd_get_gp_value (output_bfd);
3141   if (*pgp == 0 && (!relocatable || (symbol->flags & BSF_SECTION_SYM) != 0))
3142     {
3143       if (relocatable)
3144         {
3145           /* Make up a value.  */
3146           *pgp = symbol->section->output_section->vma + 0x4000;
3147           _bfd_set_gp_value (output_bfd, *pgp);
3148         }
3149       else
3150         {
3151           *error_message
3152             = (char *) _("global pointer relative relocation when _gp not defined");
3153           return bfd_reloc_dangerous;
3154         }
3155     }
3156
3157   return bfd_reloc_ok;
3158 }
3159
3160 /* Do the relocations that require special handling.  */
3161 static bfd_reloc_status_type
3162 nios2_elf32_do_hi16_relocate (bfd *abfd, reloc_howto_type *howto,
3163                               asection *input_section,
3164                               bfd_byte *data, bfd_vma offset,
3165                               bfd_vma symbol_value, bfd_vma addend)
3166 {
3167   symbol_value = symbol_value + addend;
3168   addend = 0;
3169   symbol_value = (symbol_value >> 16) & 0xffff;
3170   return _bfd_final_link_relocate (howto, abfd, input_section,
3171                                    data, offset, symbol_value, addend);
3172 }
3173
3174 static bfd_reloc_status_type
3175 nios2_elf32_do_lo16_relocate (bfd *abfd, reloc_howto_type *howto,
3176                               asection *input_section,
3177                               bfd_byte *data, bfd_vma offset,
3178                               bfd_vma symbol_value, bfd_vma addend)
3179 {
3180   symbol_value = symbol_value + addend;
3181   addend = 0;
3182   symbol_value = symbol_value & 0xffff;
3183   return _bfd_final_link_relocate (howto, abfd, input_section,
3184                                    data, offset, symbol_value, addend);
3185 }
3186
3187 static bfd_reloc_status_type
3188 nios2_elf32_do_hiadj16_relocate (bfd *abfd, reloc_howto_type *howto,
3189                                  asection *input_section,
3190                                  bfd_byte *data, bfd_vma offset,
3191                                  bfd_vma symbol_value, bfd_vma addend)
3192 {
3193   symbol_value = symbol_value + addend;
3194   addend = 0;
3195   symbol_value = hiadj(symbol_value);
3196   return _bfd_final_link_relocate (howto, abfd, input_section, data, offset,
3197                                    symbol_value, addend);
3198 }
3199
3200 static bfd_reloc_status_type
3201 nios2_elf32_do_pcrel_lo16_relocate (bfd *abfd, reloc_howto_type *howto,
3202                                     asection *input_section,
3203                                     bfd_byte *data, bfd_vma offset,
3204                                     bfd_vma symbol_value, bfd_vma addend)
3205 {
3206   symbol_value = symbol_value + addend;
3207   addend = 0;
3208   symbol_value = symbol_value & 0xffff;
3209   return _bfd_final_link_relocate (howto, abfd, input_section,
3210                                    data, offset, symbol_value, addend);
3211 }
3212
3213 static bfd_reloc_status_type
3214 nios2_elf32_do_pcrel_hiadj16_relocate (bfd *abfd, reloc_howto_type *howto,
3215                                        asection *input_section,
3216                                        bfd_byte *data, bfd_vma offset,
3217                                        bfd_vma symbol_value, bfd_vma addend)
3218 {
3219   symbol_value = symbol_value + addend;
3220   symbol_value -= (input_section->output_section->vma
3221                    + input_section->output_offset);
3222   symbol_value -= offset;
3223   addend = 0;
3224   symbol_value = hiadj(symbol_value);
3225   return _bfd_final_link_relocate (howto, abfd, input_section, data, offset,
3226                                    symbol_value, addend);
3227 }
3228
3229 static bfd_reloc_status_type
3230 nios2_elf32_do_pcrel16_relocate (bfd *abfd, reloc_howto_type *howto,
3231                                  asection *input_section,
3232                                  bfd_byte *data, bfd_vma offset,
3233                                  bfd_vma symbol_value, bfd_vma addend)
3234 {
3235   /* NIOS2 pc relative relocations are relative to the next 32-bit instruction
3236      so we need to subtract 4 before doing a final_link_relocate. */
3237   symbol_value = symbol_value + addend - 4;
3238   addend = 0;
3239   return _bfd_final_link_relocate (howto, abfd, input_section,
3240                                    data, offset, symbol_value, addend);
3241 }
3242
3243 static bfd_reloc_status_type
3244 nios2_elf32_do_call26_relocate (bfd *abfd, reloc_howto_type *howto,
3245                                 asection *input_section,
3246                                 bfd_byte *data, bfd_vma offset,
3247                                 bfd_vma symbol_value, bfd_vma addend)
3248 {
3249   /* Check that the relocation is in the same page as the current address.  */
3250   if (CALL26_SEGMENT (symbol_value + addend)
3251       != CALL26_SEGMENT (input_section->output_section->vma
3252                          + input_section->output_offset
3253                          + offset))
3254     return bfd_reloc_overflow;
3255
3256   /* Check that the target address is correctly aligned on a 4-byte
3257      boundary.  */
3258   if ((symbol_value + addend) & 0x3)
3259     return bfd_reloc_overflow;
3260
3261   return _bfd_final_link_relocate (howto, abfd, input_section,
3262                                    data, offset, symbol_value, addend);
3263 }
3264
3265 static bfd_reloc_status_type
3266 nios2_elf32_do_gprel_relocate (bfd *abfd, reloc_howto_type *howto,
3267                                asection *input_section,
3268                                bfd_byte *data, bfd_vma offset,
3269                                bfd_vma symbol_value, bfd_vma addend)
3270 {
3271   /* Because we need the output_bfd, the special handling is done
3272      in nios2_elf32_relocate_section or in nios2_elf32_gprel_relocate.  */
3273   return _bfd_final_link_relocate (howto, abfd, input_section,
3274                                    data, offset, symbol_value, addend);
3275 }
3276
3277 static bfd_reloc_status_type
3278 nios2_elf32_do_ujmp_relocate (bfd *abfd, reloc_howto_type *howto,
3279                               asection *input_section,
3280                               bfd_byte *data, bfd_vma offset,
3281                               bfd_vma symbol_value, bfd_vma addend)
3282 {
3283   bfd_vma symbol_lo16, symbol_hi16;
3284   bfd_reloc_status_type r;
3285   symbol_value = symbol_value + addend;
3286   addend = 0;
3287   symbol_hi16 = (symbol_value >> 16) & 0xffff;
3288   symbol_lo16 = symbol_value & 0xffff;
3289
3290   r = _bfd_final_link_relocate (howto, abfd, input_section,
3291                                 data, offset, symbol_hi16, addend);
3292
3293   if (r == bfd_reloc_ok)
3294     return _bfd_final_link_relocate (howto, abfd, input_section,
3295                                      data, offset + 4, symbol_lo16, addend);
3296
3297   return r;
3298 }
3299
3300 static bfd_reloc_status_type
3301 nios2_elf32_do_cjmp_relocate (bfd *abfd, reloc_howto_type *howto,
3302                               asection *input_section,
3303                               bfd_byte *data, bfd_vma offset,
3304                               bfd_vma symbol_value, bfd_vma addend)
3305 {
3306   bfd_vma symbol_lo16, symbol_hi16;
3307   bfd_reloc_status_type r;
3308   symbol_value = symbol_value + addend;
3309   addend = 0;
3310   symbol_hi16 = (symbol_value >> 16) & 0xffff;
3311   symbol_lo16 = symbol_value & 0xffff;
3312
3313   r = _bfd_final_link_relocate (howto, abfd, input_section,
3314                                 data, offset, symbol_hi16, addend);
3315
3316   if (r == bfd_reloc_ok)
3317     return _bfd_final_link_relocate (howto, abfd, input_section,
3318                                      data, offset + 4, symbol_lo16, addend);
3319
3320   return r;
3321 }
3322
3323 static bfd_reloc_status_type
3324 nios2_elf32_do_callr_relocate (bfd *abfd, reloc_howto_type *howto,
3325                                asection *input_section,
3326                                bfd_byte *data, bfd_vma offset,
3327                                bfd_vma symbol_value, bfd_vma addend)
3328 {
3329   bfd_vma symbol_lo16, symbol_hi16;
3330   bfd_reloc_status_type r;
3331   symbol_value = symbol_value + addend;
3332   addend = 0;
3333   symbol_hi16 = (symbol_value >> 16) & 0xffff;
3334   symbol_lo16 = symbol_value & 0xffff;
3335
3336   r = _bfd_final_link_relocate (howto, abfd, input_section,
3337                                 data, offset, symbol_hi16, addend);
3338
3339   if (r == bfd_reloc_ok)
3340     return _bfd_final_link_relocate (howto, abfd, input_section,
3341                                      data, offset + 4, symbol_lo16, addend);
3342
3343   return r;
3344 }
3345
3346 /* HOWTO handlers for relocations that require special handling.  */
3347
3348 /* This is for relocations used only when relaxing to ensure
3349    changes in size of section don't screw up .align.  */
3350 static bfd_reloc_status_type
3351 nios2_elf32_ignore_reloc (bfd *abfd ATTRIBUTE_UNUSED, arelent *reloc_entry,
3352                           asymbol *symbol ATTRIBUTE_UNUSED,
3353                           void *data ATTRIBUTE_UNUSED, asection *input_section,
3354                           bfd *output_bfd,
3355                           char **error_message ATTRIBUTE_UNUSED)
3356 {
3357   if (output_bfd != NULL)
3358     reloc_entry->address += input_section->output_offset;
3359   return bfd_reloc_ok;
3360 }
3361
3362 static bfd_reloc_status_type
3363 nios2_elf32_hi16_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
3364                            void *data, asection *input_section,
3365                            bfd *output_bfd,
3366                            char **error_message ATTRIBUTE_UNUSED)
3367 {
3368   /* This part is from bfd_elf_generic_reloc.  */
3369   if (output_bfd != NULL
3370       && (symbol->flags & BSF_SECTION_SYM) == 0
3371       && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
3372     {
3373       reloc_entry->address += input_section->output_offset;
3374       return bfd_reloc_ok;
3375     }
3376
3377   if (output_bfd != NULL)
3378     /* FIXME: See bfd_perform_relocation.  Is this right?  */
3379     return bfd_reloc_continue;
3380
3381   return nios2_elf32_do_hi16_relocate (abfd, reloc_entry->howto,
3382                                        input_section,
3383                                        data, reloc_entry->address,
3384                                        (symbol->value
3385                                         + symbol->section->output_section->vma
3386                                         + symbol->section->output_offset),
3387                                        reloc_entry->addend);
3388 }
3389
3390 static bfd_reloc_status_type
3391 nios2_elf32_lo16_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
3392                            void *data, asection *input_section,
3393                            bfd *output_bfd,
3394                            char **error_message ATTRIBUTE_UNUSED)
3395 {
3396   /* This part is from bfd_elf_generic_reloc.  */
3397   if (output_bfd != NULL
3398       && (symbol->flags & BSF_SECTION_SYM) == 0
3399       && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
3400     {
3401       reloc_entry->address += input_section->output_offset;
3402       return bfd_reloc_ok;
3403     }
3404
3405   if (output_bfd != NULL)
3406     /* FIXME: See bfd_perform_relocation.  Is this right?  */
3407     return bfd_reloc_continue;
3408
3409   return nios2_elf32_do_lo16_relocate (abfd, reloc_entry->howto,
3410                                        input_section,
3411                                        data, reloc_entry->address,
3412                                        (symbol->value
3413                                         + symbol->section->output_section->vma
3414                                         + symbol->section->output_offset),
3415                                        reloc_entry->addend);
3416 }
3417
3418 static bfd_reloc_status_type
3419 nios2_elf32_hiadj16_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
3420                               void *data, asection *input_section,
3421                               bfd *output_bfd,
3422                               char **error_message ATTRIBUTE_UNUSED)
3423 {
3424   /* This part is from bfd_elf_generic_reloc.  */
3425   if (output_bfd != NULL
3426       && (symbol->flags & BSF_SECTION_SYM) == 0
3427       && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
3428     {
3429       reloc_entry->address += input_section->output_offset;
3430       return bfd_reloc_ok;
3431     }
3432
3433   if (output_bfd != NULL)
3434     /* FIXME: See bfd_perform_relocation.  Is this right?  */
3435     return bfd_reloc_continue;
3436
3437   return nios2_elf32_do_hiadj16_relocate (abfd, reloc_entry->howto,
3438                                           input_section,
3439                                           data, reloc_entry->address,
3440                                           (symbol->value
3441                                            + symbol->section->output_section->vma
3442                                            + symbol->section->output_offset),
3443                                           reloc_entry->addend);
3444 }
3445
3446 static bfd_reloc_status_type
3447 nios2_elf32_pcrel_lo16_relocate (bfd *abfd, arelent *reloc_entry,
3448                                  asymbol *symbol, void *data,
3449                                  asection *input_section, bfd *output_bfd,
3450                                  char **error_message ATTRIBUTE_UNUSED)
3451 {
3452   /* This part is from bfd_elf_generic_reloc.  */
3453   if (output_bfd != NULL
3454       && (symbol->flags & BSF_SECTION_SYM) == 0
3455       && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
3456     {
3457       reloc_entry->address += input_section->output_offset;
3458       return bfd_reloc_ok;
3459     }
3460
3461   if (output_bfd != NULL)
3462     /* FIXME: See bfd_perform_relocation.  Is this right?  */
3463     return bfd_reloc_continue;
3464
3465   return nios2_elf32_do_pcrel_lo16_relocate (
3466     abfd, reloc_entry->howto, input_section, data, reloc_entry->address,
3467     (symbol->value + symbol->section->output_section->vma
3468      + symbol->section->output_offset),
3469     reloc_entry->addend);
3470 }
3471
3472 static bfd_reloc_status_type
3473 nios2_elf32_pcrel_hiadj16_relocate (bfd *abfd, arelent *reloc_entry,
3474                                     asymbol *symbol, void *data,
3475                                     asection *input_section, bfd *output_bfd,
3476                                     char **error_message ATTRIBUTE_UNUSED)
3477 {
3478   /* This part is from bfd_elf_generic_reloc.  */
3479   if (output_bfd != NULL
3480       && (symbol->flags & BSF_SECTION_SYM) == 0
3481       && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
3482     {
3483       reloc_entry->address += input_section->output_offset;
3484       return bfd_reloc_ok;
3485     }
3486
3487   if (output_bfd != NULL)
3488     /* FIXME: See bfd_perform_relocation.  Is this right?  */
3489     return bfd_reloc_continue;
3490
3491   return nios2_elf32_do_pcrel_hiadj16_relocate (
3492     abfd, reloc_entry->howto, input_section, data, reloc_entry->address,
3493     (symbol->value + symbol->section->output_section->vma
3494      + symbol->section->output_offset),
3495     reloc_entry->addend);
3496 }
3497
3498 static bfd_reloc_status_type
3499 nios2_elf32_pcrel16_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
3500                               void *data, asection *input_section,
3501                               bfd *output_bfd,
3502                               char **error_message ATTRIBUTE_UNUSED)
3503 {
3504   /* This part is from bfd_elf_generic_reloc.  */
3505   if (output_bfd != NULL
3506       && (symbol->flags & BSF_SECTION_SYM) == 0
3507       && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
3508     {
3509       reloc_entry->address += input_section->output_offset;
3510       return bfd_reloc_ok;
3511     }
3512
3513   if (output_bfd != NULL)
3514     /* FIXME: See bfd_perform_relocation.  Is this right?  */
3515     return bfd_reloc_continue;
3516
3517   return nios2_elf32_do_pcrel16_relocate (abfd, reloc_entry->howto,
3518                                           input_section,
3519                                           data, reloc_entry->address,
3520                                           (symbol->value
3521                                            + symbol->section->output_section->vma
3522                                            + symbol->section->output_offset),
3523                                           reloc_entry->addend);
3524 }
3525
3526 static bfd_reloc_status_type
3527 nios2_elf32_call26_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
3528                              void *data, asection *input_section,
3529                              bfd *output_bfd,
3530                              char **error_message ATTRIBUTE_UNUSED)
3531 {
3532   /* This part is from bfd_elf_generic_reloc.  */
3533   if (output_bfd != NULL
3534       && (symbol->flags & BSF_SECTION_SYM) == 0
3535       && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
3536     {
3537       reloc_entry->address += input_section->output_offset;
3538       return bfd_reloc_ok;
3539     }
3540
3541   if (output_bfd != NULL)
3542     /* FIXME: See bfd_perform_relocation.  Is this right?  */
3543     return bfd_reloc_continue;
3544
3545   return nios2_elf32_do_call26_relocate (abfd, reloc_entry->howto,
3546                                          input_section,
3547                                          data, reloc_entry->address,
3548                                          (symbol->value
3549                                           + symbol->section->output_section->vma
3550                                           + symbol->section->output_offset),
3551                                          reloc_entry->addend);
3552 }
3553
3554 static bfd_reloc_status_type
3555 nios2_elf32_gprel_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
3556                             void *data, asection *input_section,
3557                             bfd *output_bfd, char **msg)
3558 {
3559   bfd_vma relocation;
3560   bfd_vma gp;
3561   bfd_reloc_status_type r;
3562
3563
3564   /* This part is from bfd_elf_generic_reloc.  */
3565   if (output_bfd != NULL
3566       && (symbol->flags & BSF_SECTION_SYM) == 0
3567       && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
3568     {
3569       reloc_entry->address += input_section->output_offset;
3570       return bfd_reloc_ok;
3571     }
3572
3573   if (output_bfd != NULL)
3574     /* FIXME: See bfd_perform_relocation.  Is this right?  */
3575     return bfd_reloc_continue;
3576
3577   relocation = (symbol->value
3578                 + symbol->section->output_section->vma
3579                 + symbol->section->output_offset);
3580
3581   /* This assumes we've already cached the _gp symbol.  */
3582   r = nios2_elf_final_gp (abfd, symbol, FALSE, msg, &gp);
3583   if (r == bfd_reloc_ok)
3584     {
3585       relocation = relocation + reloc_entry->addend - gp;
3586       reloc_entry->addend = 0;
3587       if ((signed) relocation < -32768 || (signed) relocation > 32767)
3588         {
3589           *msg = _("global pointer relative address out of range");
3590           r = bfd_reloc_outofrange;
3591         }
3592       else
3593         r = nios2_elf32_do_gprel_relocate (abfd, reloc_entry->howto,
3594                                            input_section,
3595                                            data, reloc_entry->address,
3596                                            relocation, reloc_entry->addend);
3597     }
3598
3599   return r;
3600 }
3601
3602 static bfd_reloc_status_type
3603 nios2_elf32_ujmp_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
3604                            void *data, asection *input_section,
3605                            bfd *output_bfd, char **msg ATTRIBUTE_UNUSED)
3606 {
3607   /* This part is from bfd_elf_generic_reloc.  */
3608   if (output_bfd != NULL
3609       && (symbol->flags & BSF_SECTION_SYM) == 0
3610       && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
3611     {
3612       reloc_entry->address += input_section->output_offset;
3613       return bfd_reloc_ok;
3614     }
3615
3616   if (output_bfd != NULL)
3617     /* FIXME: See bfd_perform_relocation.  Is this right?  */
3618     return bfd_reloc_continue;
3619
3620   return nios2_elf32_do_ujmp_relocate (abfd, reloc_entry->howto,
3621                                        input_section,
3622                                        data, reloc_entry->address,
3623                                        (symbol->value
3624                                         + symbol->section->output_section->vma
3625                                         + symbol->section->output_offset),
3626                                        reloc_entry->addend);
3627 }
3628
3629 static bfd_reloc_status_type
3630 nios2_elf32_cjmp_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
3631                            void *data, asection *input_section,
3632                            bfd *output_bfd, char **msg ATTRIBUTE_UNUSED)
3633 {
3634   /* This part is from bfd_elf_generic_reloc.  */
3635   if (output_bfd != NULL
3636       && (symbol->flags & BSF_SECTION_SYM) == 0
3637       && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
3638     {
3639       reloc_entry->address += input_section->output_offset;
3640       return bfd_reloc_ok;
3641     }
3642
3643   if (output_bfd != NULL)
3644     /* FIXME: See bfd_perform_relocation.  Is this right?  */
3645     return bfd_reloc_continue;
3646
3647   return nios2_elf32_do_cjmp_relocate (abfd, reloc_entry->howto,
3648                                        input_section,
3649                                        data, reloc_entry->address,
3650                                        (symbol->value
3651                                         + symbol->section->output_section->vma
3652                                         + symbol->section->output_offset),
3653                                        reloc_entry->addend);
3654 }
3655
3656 static bfd_reloc_status_type
3657 nios2_elf32_callr_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
3658                             void *data, asection *input_section,
3659                             bfd *output_bfd, char **msg ATTRIBUTE_UNUSED)
3660 {
3661   /* This part is from bfd_elf_generic_reloc.  */
3662   if (output_bfd != NULL
3663       && (symbol->flags & BSF_SECTION_SYM) == 0
3664       && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
3665     {
3666       reloc_entry->address += input_section->output_offset;
3667       return bfd_reloc_ok;
3668     }
3669
3670   if (output_bfd != NULL)
3671     /* FIXME: See bfd_perform_relocation.  Is this right?  */
3672     return bfd_reloc_continue;
3673
3674   return nios2_elf32_do_callr_relocate (abfd, reloc_entry->howto,
3675                                         input_section,
3676                                         data, reloc_entry->address,
3677                                         (symbol->value
3678                                          + symbol->section->output_section->vma
3679                                          + symbol->section->output_offset),
3680                                         reloc_entry->addend);
3681 }
3682
3683
3684 /* Implement elf_backend_relocate_section.  */
3685 static bfd_boolean
3686 nios2_elf32_relocate_section (bfd *output_bfd,
3687                               struct bfd_link_info *info,
3688                               bfd *input_bfd,
3689                               asection *input_section,
3690                               bfd_byte *contents,
3691                               Elf_Internal_Rela *relocs,
3692                               Elf_Internal_Sym *local_syms,
3693                               asection **local_sections)
3694 {
3695   Elf_Internal_Shdr *symtab_hdr;
3696   struct elf_link_hash_entry **sym_hashes;
3697   Elf_Internal_Rela *rel;
3698   Elf_Internal_Rela *relend;
3699   struct elf32_nios2_link_hash_table *htab;
3700   asection *sgot;
3701   asection *splt;
3702   asection *sreloc = NULL;
3703   bfd_vma *local_got_offsets;
3704   bfd_vma got_base;
3705
3706   symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
3707   sym_hashes = elf_sym_hashes (input_bfd);
3708   relend = relocs + input_section->reloc_count;
3709
3710   htab = elf32_nios2_hash_table (info);
3711   sgot = htab->root.sgot;
3712   splt = htab->root.splt;
3713   local_got_offsets = elf_local_got_offsets (input_bfd);
3714
3715   if (elf32_nios2_hash_table (info)->h_gp_got == NULL)
3716     got_base = 0;
3717   else
3718     got_base = elf32_nios2_hash_table (info)->h_gp_got->root.u.def.value;
3719
3720   for (rel = relocs; rel < relend; rel++)
3721     {
3722       reloc_howto_type *howto;
3723       unsigned long r_symndx;
3724       Elf_Internal_Sym *sym;
3725       asection *sec;
3726       struct elf_link_hash_entry *h;
3727       struct elf32_nios2_link_hash_entry *eh;
3728       bfd_vma relocation;
3729       bfd_vma gp;
3730       bfd_reloc_status_type r = bfd_reloc_ok;
3731       const char *name = NULL;
3732       int r_type;
3733       const char *format;
3734       char msgbuf[256];
3735       const char* msg = (const char*) NULL;
3736       bfd_boolean unresolved_reloc;
3737       bfd_vma off;
3738       int use_plt;
3739
3740       r_type = ELF32_R_TYPE (rel->r_info);
3741       r_symndx = ELF32_R_SYM (rel->r_info);
3742
3743       howto = lookup_howto ((unsigned) ELF32_R_TYPE (rel->r_info), output_bfd);
3744       h = NULL;
3745       sym = NULL;
3746       sec = NULL;
3747
3748       if (r_symndx < symtab_hdr->sh_info)
3749         {
3750           sym = local_syms + r_symndx;
3751           sec = local_sections[r_symndx];
3752           relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
3753         }
3754       else
3755         {
3756           bfd_boolean warned, ignored;
3757
3758           RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
3759                                    r_symndx, symtab_hdr, sym_hashes,
3760                                    h, sec, relocation,
3761                                    unresolved_reloc, warned, ignored);
3762         }
3763
3764       if (sec && discarded_section (sec))
3765         RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
3766                                          rel, 1, relend, howto, 0, contents);
3767
3768       /* Nothing more to do unless this is a final link.  */
3769       if (bfd_link_relocatable (info))
3770         continue;
3771
3772       if (howto)
3773         {
3774           switch (howto->type)
3775             {
3776             case R_NIOS2_HI16:
3777               r = nios2_elf32_do_hi16_relocate (input_bfd, howto,
3778                                                 input_section,
3779                                                 contents, rel->r_offset,
3780                                                 relocation, rel->r_addend);
3781               break;
3782             case R_NIOS2_LO16:
3783               r = nios2_elf32_do_lo16_relocate (input_bfd, howto,
3784                                                 input_section,
3785                                                 contents, rel->r_offset,
3786                                                 relocation, rel->r_addend);
3787               break;
3788             case R_NIOS2_PCREL_LO:
3789               r = nios2_elf32_do_pcrel_lo16_relocate (input_bfd, howto,
3790                                                       input_section,
3791                                                       contents,
3792                                                       rel->r_offset,
3793                                                       relocation,
3794                                                       rel->r_addend);
3795               break;
3796             case R_NIOS2_HIADJ16:
3797               r = nios2_elf32_do_hiadj16_relocate (input_bfd, howto,
3798                                                    input_section, contents,
3799                                                    rel->r_offset, relocation,
3800                                                    rel->r_addend);
3801               break;
3802             case R_NIOS2_PCREL_HA:
3803               r = nios2_elf32_do_pcrel_hiadj16_relocate (input_bfd, howto,
3804                                                          input_section,
3805                                                          contents,
3806                                                          rel->r_offset,
3807                                                          relocation,
3808                                                          rel->r_addend);
3809               break;
3810             case R_NIOS2_PCREL16:
3811               r = nios2_elf32_do_pcrel16_relocate (input_bfd, howto,
3812                                                    input_section, contents,
3813                                                    rel->r_offset, relocation,
3814                                                    rel->r_addend);
3815               break;
3816             case R_NIOS2_GPREL:
3817               /* Turns an absolute address into a gp-relative address.  */
3818               if (!nios2_elf_assign_gp (output_bfd, &gp, info))
3819                 {
3820                   bfd_vma reloc_address;
3821
3822                   if (sec && sec->output_section)
3823                     reloc_address = (sec->output_section->vma
3824                                      + sec->output_offset
3825                                      + rel->r_offset);
3826                   else
3827                     reloc_address = 0;
3828
3829                   format = _("global pointer relative relocation at address "
3830                              "0x%08x when _gp not defined\n");
3831                   sprintf (msgbuf, format, reloc_address);
3832                   msg = msgbuf;
3833                   r = bfd_reloc_dangerous;
3834                 }
3835               else
3836                 {
3837                   bfd_vma symbol_address = rel->r_addend + relocation;
3838                   relocation = symbol_address - gp;
3839                   rel->r_addend = 0;
3840                   if (((signed) relocation < -32768
3841                        || (signed) relocation > 32767)
3842                       && (!h
3843                           || h->root.type == bfd_link_hash_defined
3844                           || h->root.type == bfd_link_hash_defweak))
3845                     {
3846                       if (h)
3847                         name = h->root.root.string;
3848                       format = _("Unable to reach %s (at 0x%08x) from the "
3849                                  "global pointer (at 0x%08x) because the "
3850                                  "offset (%d) is out of the allowed range, "
3851                                  "-32678 to 32767.\n" );
3852                       sprintf (msgbuf, format, name, symbol_address, gp,
3853                                (signed)relocation);
3854                       msg = msgbuf;
3855                       r = bfd_reloc_outofrange;
3856                     }
3857                   else
3858                     r = _bfd_final_link_relocate (howto, input_bfd,
3859                                                   input_section, contents,
3860                                                   rel->r_offset, relocation,
3861                                                   rel->r_addend);
3862                 }
3863               break;
3864             case R_NIOS2_UJMP:
3865               r = nios2_elf32_do_ujmp_relocate (input_bfd, howto,
3866                                                 input_section,
3867                                                 contents, rel->r_offset,
3868                                                 relocation, rel->r_addend);
3869               break;
3870             case R_NIOS2_CJMP:
3871               r = nios2_elf32_do_cjmp_relocate (input_bfd, howto,
3872                                                 input_section,
3873                                                 contents, rel->r_offset,
3874                                                 relocation, rel->r_addend);
3875               break;
3876             case R_NIOS2_CALLR:
3877               r = nios2_elf32_do_callr_relocate (input_bfd, howto,
3878                                                  input_section, contents,
3879                                                  rel->r_offset, relocation,
3880                                                  rel->r_addend);
3881               break;
3882             case R_NIOS2_CALL26:
3883             case R_NIOS2_CALL26_NOAT:
3884               /* If we have a call to an undefined weak symbol, we just want
3885                  to stuff a zero in the bits of the call instruction and
3886                  bypass the normal call26 relocation handling, because it'll
3887                  diagnose an overflow error if address 0 isn't in the same
3888                  256MB segment as the call site.  Presumably the call
3889                  should be guarded by a null check anyway.  */
3890               if (h != NULL && h->root.type == bfd_link_hash_undefweak)
3891                 {
3892                   BFD_ASSERT (relocation == 0 && rel->r_addend == 0);
3893                   r = _bfd_final_link_relocate (howto, input_bfd,
3894                                                 input_section, contents,
3895                                                 rel->r_offset, relocation,
3896                                                 rel->r_addend);
3897                   break;
3898                 }
3899               /* Handle relocations which should use the PLT entry.
3900                  NIOS2_BFD_RELOC_32 relocations will use the symbol's value,
3901                  which may point to a PLT entry, but we don't need to handle
3902                  that here.  If we created a PLT entry, all branches in this
3903                  object should go to it.  */
3904               if (h != NULL && splt != NULL && h->plt.offset != (bfd_vma) -1)
3905                 {
3906                   /* If we've created a .plt section, and assigned a PLT entry
3907                      to this function, it should not be known to bind locally.
3908                      If it were, we would have cleared the PLT entry.  */
3909                   BFD_ASSERT (!SYMBOL_CALLS_LOCAL (info, h));
3910
3911                   relocation = (splt->output_section->vma
3912                                 + splt->output_offset
3913                                 + h->plt.offset);
3914
3915                   unresolved_reloc = FALSE;
3916                 }
3917               /* Detect R_NIOS2_CALL26 relocations that would overflow the
3918                  256MB segment.  Replace the target with a reference to a
3919                  trampoline instead.
3920                  Note that htab->stub_group is null if relaxation has been
3921                  disabled by the --no-relax linker command-line option, so
3922                  we can use that to skip this processing entirely.  */
3923               if (howto->type == R_NIOS2_CALL26 && htab->stub_group)
3924                 {
3925                   bfd_vma dest = relocation + rel->r_addend;
3926                   enum elf32_nios2_stub_type stub_type;
3927
3928                   eh = (struct elf32_nios2_link_hash_entry *)h;
3929                   stub_type = nios2_type_of_stub (input_section, rel, eh,
3930                                                   htab, dest, NULL);
3931
3932                   if (stub_type != nios2_stub_none)
3933                     {
3934                       struct elf32_nios2_stub_hash_entry *hsh;
3935
3936                       hsh = nios2_get_stub_entry (input_section, sec,
3937                                                   eh, rel, htab, stub_type);
3938                       if (hsh == NULL)
3939                         {
3940                           r = bfd_reloc_undefined;
3941                           break;
3942                         }
3943
3944                       dest = (hsh->stub_offset
3945                               + hsh->stub_sec->output_offset
3946                               + hsh->stub_sec->output_section->vma);
3947                       r = nios2_elf32_do_call26_relocate (input_bfd, howto,
3948                                                           input_section,
3949                                                           contents,
3950                                                           rel->r_offset,
3951                                                           dest, 0);
3952                       break;
3953                     }
3954                 }
3955
3956               /* Normal case.  */
3957               r = nios2_elf32_do_call26_relocate (input_bfd, howto,
3958                                                   input_section, contents,
3959                                                   rel->r_offset, relocation,
3960                                                   rel->r_addend);
3961               break;
3962             case R_NIOS2_ALIGN:
3963               r = bfd_reloc_ok;
3964               /* For symmetry this would be
3965                  r = nios2_elf32_do_ignore_reloc (input_bfd, howto,
3966                                                   input_section, contents,
3967                                                   rel->r_offset, relocation,
3968                                                   rel->r_addend);
3969                 but do_ignore_reloc would do no more than return
3970                 bfd_reloc_ok. */
3971               break;
3972
3973             case R_NIOS2_GOT16:
3974             case R_NIOS2_CALL16:
3975             case R_NIOS2_GOT_LO:
3976             case R_NIOS2_GOT_HA:
3977             case R_NIOS2_CALL_LO:
3978             case R_NIOS2_CALL_HA:
3979               /* Relocation is to the entry for this symbol in the
3980                  global offset table.  */
3981               if (sgot == NULL)
3982                 {
3983                   r = bfd_reloc_notsupported;
3984                   break;
3985                 }
3986
3987               use_plt = 0;
3988
3989               if (h != NULL)
3990                 {
3991                   bfd_boolean dyn;
3992
3993                   eh = (struct elf32_nios2_link_hash_entry *)h;
3994                   use_plt = (eh->got_types_used == CALL_USED
3995                              && h->plt.offset != (bfd_vma) -1);
3996
3997                   off = h->got.offset;
3998                   BFD_ASSERT (off != (bfd_vma) -1);
3999                   dyn = elf_hash_table (info)->dynamic_sections_created;
4000                   if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn,
4001                                                          bfd_link_pic (info),
4002                                                          h)
4003                       || (bfd_link_pic (info)
4004                           && SYMBOL_REFERENCES_LOCAL (info, h))
4005                       || (ELF_ST_VISIBILITY (h->other)
4006                           && h->root.type == bfd_link_hash_undefweak))
4007                     {
4008                       /* This is actually a static link, or it is a -Bsymbolic
4009                          link and the symbol is defined locally.  We must
4010                          initialize this entry in the global offset table.
4011                          Since the offset must always be a multiple of 4, we
4012                          use the least significant bit to record whether we
4013                          have initialized it already.
4014
4015                          When doing a dynamic link, we create a .rela.got
4016                          relocation entry to initialize the value.  This is
4017                          done in the finish_dynamic_symbol routine.  */
4018                       if ((off & 1) != 0)
4019                         off &= ~1;
4020                       else
4021                         {
4022                           bfd_put_32 (output_bfd, relocation,
4023                                       sgot->contents + off);
4024                           h->got.offset |= 1;
4025                         }
4026                     }
4027                   else
4028                     unresolved_reloc = FALSE;
4029                 }
4030               else
4031                 {
4032                   BFD_ASSERT (local_got_offsets != NULL
4033                               && local_got_offsets[r_symndx] != (bfd_vma) -1);
4034
4035                   off = local_got_offsets[r_symndx];
4036
4037                   /* The offset must always be a multiple of 4.  We use the
4038                      least significant bit to record whether we have already
4039                      generated the necessary reloc.  */
4040                   if ((off & 1) != 0)
4041                     off &= ~1;
4042                   else
4043                     {
4044                       bfd_put_32 (output_bfd, relocation,
4045                                   sgot->contents + off);
4046
4047                       if (bfd_link_pic (info))
4048                         {
4049                           asection *srelgot;
4050                           Elf_Internal_Rela outrel;
4051                           bfd_byte *loc;
4052
4053                           srelgot = htab->root.srelgot;
4054                           BFD_ASSERT (srelgot != NULL);
4055
4056                           outrel.r_addend = relocation;
4057                           outrel.r_offset = (sgot->output_section->vma
4058                                              + sgot->output_offset
4059                                              + off);
4060                           outrel.r_info = ELF32_R_INFO (0, R_NIOS2_RELATIVE);
4061                           loc = srelgot->contents;
4062                           loc += (srelgot->reloc_count++ *
4063                                   sizeof (Elf32_External_Rela));
4064                           bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
4065                         }
4066
4067                       local_got_offsets[r_symndx] |= 1;
4068                     }
4069                 }
4070
4071               if (use_plt && bfd_link_pic (info))
4072                 {
4073                   off = ((h->plt.offset - 24) / 12 + 3) * 4;
4074                   relocation = (htab->root.sgotplt->output_offset + off
4075                                 - got_base);
4076                 }
4077               else
4078                 relocation = sgot->output_offset + off - got_base;
4079
4080               /* This relocation does not use the addend.  */
4081               rel->r_addend = 0;
4082
4083               switch (howto->type)
4084                 {
4085                 case R_NIOS2_GOT_LO:
4086                 case R_NIOS2_CALL_LO:
4087                   r = nios2_elf32_do_lo16_relocate (input_bfd, howto,
4088                                                     input_section, contents,
4089                                                     rel->r_offset, relocation,
4090                                                     rel->r_addend);
4091                   break;
4092                 case R_NIOS2_GOT_HA:
4093                 case R_NIOS2_CALL_HA:
4094                   r = nios2_elf32_do_hiadj16_relocate (input_bfd, howto,
4095                                                        input_section, contents,
4096                                                        rel->r_offset,
4097                                                        relocation,
4098                                                        rel->r_addend);
4099                   break;
4100                 default:
4101                   r = _bfd_final_link_relocate (howto, input_bfd,
4102                                                 input_section, contents,
4103                                                 rel->r_offset, relocation,
4104                                                 rel->r_addend);
4105                   break;
4106                 }
4107               break;
4108
4109             case R_NIOS2_GOTOFF_LO:
4110             case R_NIOS2_GOTOFF_HA:
4111             case R_NIOS2_GOTOFF:
4112               /* Relocation is relative to the global offset table pointer.  */
4113
4114               BFD_ASSERT (sgot != NULL);
4115               if (sgot == NULL)
4116                 {
4117                   r = bfd_reloc_notsupported;
4118                   break;
4119                 }
4120
4121               /* Note that sgot->output_offset is not involved in this
4122                  calculation.  We always want the start of .got.  */
4123               relocation -= sgot->output_section->vma;
4124
4125               /* Now we adjust the relocation to be relative to the GOT pointer
4126                  (the _gp_got symbol), which possibly contains the 0x8000 bias.  */
4127               relocation -= got_base;
4128
4129               switch (howto->type)
4130                 {
4131                 case R_NIOS2_GOTOFF_LO:
4132                   r = nios2_elf32_do_lo16_relocate (input_bfd, howto,
4133                                                     input_section, contents,
4134                                                     rel->r_offset, relocation,
4135                                                     rel->r_addend);
4136                   break;
4137                 case R_NIOS2_GOTOFF_HA:
4138                   r = nios2_elf32_do_hiadj16_relocate (input_bfd, howto,
4139                                                        input_section, contents,
4140                                                        rel->r_offset,
4141                                                        relocation,
4142                                                        rel->r_addend);
4143                   break;
4144                 default:
4145                   r = _bfd_final_link_relocate (howto, input_bfd,
4146                                                 input_section, contents,
4147                                                 rel->r_offset, relocation,
4148                                                 rel->r_addend);
4149                   break;
4150                 }
4151               break;
4152
4153             case R_NIOS2_TLS_LDO16:
4154               relocation -= dtpoff_base (info) + DTP_OFFSET;
4155
4156               r = _bfd_final_link_relocate (howto, input_bfd, input_section,
4157                                             contents, rel->r_offset,
4158                                             relocation, rel->r_addend);
4159               break;
4160             case R_NIOS2_TLS_LDM16:
4161               if (htab->root.sgot == NULL)
4162                 abort ();
4163
4164               off = htab->tls_ldm_got.offset;
4165
4166               if ((off & 1) != 0)
4167                 off &= ~1;
4168               else
4169                 {
4170                   /* If we don't know the module number, create a relocation
4171                      for it.  */
4172                   if (bfd_link_pic (info))
4173                     {
4174                       Elf_Internal_Rela outrel;
4175                       bfd_byte *loc;
4176
4177                       if (htab->root.srelgot == NULL)
4178                         abort ();
4179
4180                       outrel.r_addend = 0;
4181                       outrel.r_offset = (htab->root.sgot->output_section->vma
4182                                          + htab->root.sgot->output_offset
4183                                          + off);
4184                       outrel.r_info = ELF32_R_INFO (0, R_NIOS2_TLS_DTPMOD);
4185
4186                       loc = htab->root.srelgot->contents;
4187                       loc += (htab->root.srelgot->reloc_count++
4188                               * sizeof (Elf32_External_Rela));
4189                       bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
4190                     }
4191                   else
4192                     bfd_put_32 (output_bfd, 1,
4193                                 htab->root.sgot->contents + off);
4194
4195                   htab->tls_ldm_got.offset |= 1;
4196                 }
4197
4198               relocation = htab->root.sgot->output_offset + off - got_base;
4199
4200               r = _bfd_final_link_relocate (howto, input_bfd, input_section,
4201                                             contents, rel->r_offset,
4202                                             relocation, rel->r_addend);
4203
4204               break;
4205             case R_NIOS2_TLS_GD16:
4206             case R_NIOS2_TLS_IE16:
4207               {
4208                 int indx;
4209                 char tls_type;
4210
4211                 if (htab->root.sgot == NULL)
4212                   abort ();
4213
4214                 indx = 0;
4215                 if (h != NULL)
4216                   {
4217                     bfd_boolean dyn;
4218                     dyn = htab->root.dynamic_sections_created;
4219                     if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn,
4220                                                          bfd_link_pic (info),
4221                                                          h)
4222                         && (!bfd_link_pic (info)
4223                             || !SYMBOL_REFERENCES_LOCAL (info, h)))
4224                       {
4225                         unresolved_reloc = FALSE;
4226                         indx = h->dynindx;
4227                       }
4228                     off = h->got.offset;
4229                     tls_type = (((struct elf32_nios2_link_hash_entry *) h)
4230                                 ->tls_type);
4231                   }
4232                 else
4233                   {
4234                     if (local_got_offsets == NULL)
4235                       abort ();
4236                     off = local_got_offsets[r_symndx];
4237                     tls_type = (elf32_nios2_local_got_tls_type (input_bfd)
4238                                 [r_symndx]);
4239                   }
4240
4241                 if (tls_type == GOT_UNKNOWN)
4242                   abort ();
4243
4244                 if ((off & 1) != 0)
4245                   off &= ~1;
4246                 else
4247                   {
4248                     bfd_boolean need_relocs = FALSE;
4249                     Elf_Internal_Rela outrel;
4250                     bfd_byte *loc = NULL;
4251                     int cur_off = off;
4252
4253                     /* The GOT entries have not been initialized yet.  Do it
4254                        now, and emit any relocations.  If both an IE GOT and a
4255                        GD GOT are necessary, we emit the GD first.  */
4256
4257                     if ((bfd_link_pic (info) || indx != 0)
4258                         && (h == NULL
4259                             || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
4260                             || h->root.type != bfd_link_hash_undefweak))
4261                       {
4262                         need_relocs = TRUE;
4263                         if (htab->root.srelgot == NULL)
4264                           abort ();
4265                         loc = htab->root.srelgot->contents;
4266                         loc += (htab->root.srelgot->reloc_count *
4267                                 sizeof (Elf32_External_Rela));
4268                       }
4269
4270                     if (tls_type & GOT_TLS_GD)
4271                       {
4272                         if (need_relocs)
4273                           {
4274                             outrel.r_addend = 0;
4275                             outrel.r_offset = (htab->root.sgot->output_section->vma
4276                                                + htab->root.sgot->output_offset
4277                                                + cur_off);
4278                             outrel.r_info = ELF32_R_INFO (indx,
4279                                                           R_NIOS2_TLS_DTPMOD);
4280
4281                             bfd_elf32_swap_reloca_out (output_bfd, &outrel,
4282                                                        loc);
4283                             htab->root.srelgot->reloc_count++;
4284                             loc += sizeof (Elf32_External_Rela);
4285
4286                             if (indx == 0)
4287                               bfd_put_32 (output_bfd,
4288                                           (relocation - dtpoff_base (info) -
4289                                            DTP_OFFSET),
4290                                           htab->root.sgot->contents + cur_off + 4);
4291                             else
4292                               {
4293                                 outrel.r_addend = 0;
4294                                 outrel.r_info = ELF32_R_INFO (indx,
4295                                   R_NIOS2_TLS_DTPREL);
4296                                 outrel.r_offset += 4;
4297
4298                                 bfd_elf32_swap_reloca_out (output_bfd, &outrel,
4299                                                            loc);
4300                                 htab->root.srelgot->reloc_count++;
4301                                 loc += sizeof (Elf32_External_Rela);
4302                               }
4303                           }
4304                         else
4305                           {
4306                             /* If we are not emitting relocations for a
4307                                general dynamic reference, then we must be in a
4308                                static link or an executable link with the
4309                                symbol binding locally.  Mark it as belonging
4310                                to module 1, the executable.  */
4311                             bfd_put_32 (output_bfd, 1,
4312                                         htab->root.sgot->contents + cur_off);
4313                             bfd_put_32 (output_bfd, (relocation -
4314                                                      dtpoff_base (info) -
4315                                                      DTP_OFFSET),
4316                                         htab->root.sgot->contents + cur_off + 4);
4317                           }
4318
4319                         cur_off += 8;
4320                       }
4321
4322                     if (tls_type & GOT_TLS_IE)
4323                       {
4324                         if (need_relocs)
4325                           {
4326                             if (indx == 0)
4327                               outrel.r_addend = (relocation -
4328                                                  dtpoff_base (info));
4329                             else
4330                               outrel.r_addend = 0;
4331                             outrel.r_offset = (htab->root.sgot->output_section->vma
4332                                                + htab->root.sgot->output_offset
4333                                                + cur_off);
4334                             outrel.r_info = ELF32_R_INFO (indx,
4335                                                           R_NIOS2_TLS_TPREL);
4336
4337                             bfd_elf32_swap_reloca_out (output_bfd, &outrel,
4338                                                        loc);
4339                             htab->root.srelgot->reloc_count++;
4340                             loc += sizeof (Elf32_External_Rela);
4341                           }
4342                         else
4343                           bfd_put_32 (output_bfd, (tpoff (info, relocation)
4344                                                    - TP_OFFSET),
4345                                       htab->root.sgot->contents + cur_off);
4346                         cur_off += 4;
4347                       }
4348
4349                     if (h != NULL)
4350                       h->got.offset |= 1;
4351                     else
4352                       local_got_offsets[r_symndx] |= 1;
4353                   }
4354
4355                 if ((tls_type & GOT_TLS_GD) && r_type != R_NIOS2_TLS_GD16)
4356                   off += 8;
4357                 relocation = htab->root.sgot->output_offset + off - got_base;
4358
4359                 r = _bfd_final_link_relocate (howto, input_bfd, input_section,
4360                                               contents, rel->r_offset,
4361                                               relocation, rel->r_addend);
4362               }
4363
4364               break;
4365             case R_NIOS2_TLS_LE16:
4366               if (bfd_link_dll (info))
4367                 {
4368                   (*_bfd_error_handler)
4369                     (_("%B(%A+0x%lx): R_NIOS2_TLS_LE16 relocation not "
4370                        "permitted in shared object"),
4371                      input_bfd, input_section,
4372                      (long) rel->r_offset, howto->name);
4373                   return FALSE;
4374                 }
4375               else
4376                 relocation = tpoff (info, relocation) - TP_OFFSET;
4377
4378               r = _bfd_final_link_relocate (howto, input_bfd, input_section,
4379                                             contents, rel->r_offset,
4380                                             relocation, rel->r_addend);
4381               break;
4382
4383             case R_NIOS2_BFD_RELOC_32:
4384               if (bfd_link_pic (info)
4385                   && (input_section->flags & SEC_ALLOC) != 0
4386                   && (h == NULL
4387                       || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
4388                       || h->root.type != bfd_link_hash_undefweak))
4389                 {
4390                   Elf_Internal_Rela outrel;
4391                   bfd_byte *loc;
4392                   bfd_boolean skip, relocate;
4393
4394                   /* When generating a shared object, these relocations
4395                      are copied into the output file to be resolved at run
4396                      time.  */
4397
4398                   skip = FALSE;
4399                   relocate = FALSE;
4400
4401                   outrel.r_offset
4402                     = _bfd_elf_section_offset (output_bfd, info,
4403                                                input_section, rel->r_offset);
4404                   if (outrel.r_offset == (bfd_vma) -1)
4405                     skip = TRUE;
4406                   else if (outrel.r_offset == (bfd_vma) -2)
4407                     skip = TRUE, relocate = TRUE;
4408                   outrel.r_offset += (input_section->output_section->vma
4409                                       + input_section->output_offset);
4410
4411                   if (skip)
4412                     memset (&outrel, 0, sizeof outrel);
4413                   else if (h != NULL
4414                            && h->dynindx != -1
4415                            && (!bfd_link_pic (info)
4416                                || !SYMBOLIC_BIND (info, h)
4417                                || !h->def_regular))
4418                     {
4419                       outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
4420                       outrel.r_addend = rel->r_addend;
4421                     }
4422                   else
4423                     {
4424                       /* This symbol is local, or marked to become local.  */
4425                       outrel.r_addend = relocation + rel->r_addend;
4426                       relocate = TRUE;
4427                       outrel.r_info = ELF32_R_INFO (0, R_NIOS2_RELATIVE);
4428                     }
4429
4430                   sreloc = elf_section_data (input_section)->sreloc;
4431                   if (sreloc == NULL)
4432                     abort ();
4433
4434                   loc = sreloc->contents;
4435                   loc += sreloc->reloc_count++ * sizeof (Elf32_External_Rela);
4436                   bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
4437
4438                   /* This reloc will be computed at runtime, so there's no
4439                      need to do anything now, except for R_NIOS2_BFD_RELOC_32
4440                      relocations that have been turned into
4441                      R_NIOS2_RELATIVE.  */
4442                   if (!relocate)
4443                     break;
4444                 }
4445
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             case R_NIOS2_TLS_DTPREL:
4453               relocation -= dtpoff_base (info);
4454               /* Fall through.  */
4455
4456             default:
4457               r = _bfd_final_link_relocate (howto, input_bfd,
4458                                             input_section, contents,
4459                                             rel->r_offset, relocation,
4460                                             rel->r_addend);
4461               break;
4462             }
4463         }
4464       else
4465         r = bfd_reloc_notsupported;
4466
4467       if (r != bfd_reloc_ok)
4468         {
4469           if (h != NULL)
4470             name = h->root.root.string;
4471           else
4472             {
4473               name = bfd_elf_string_from_elf_section (input_bfd,
4474                                                       symtab_hdr->sh_link,
4475                                                       sym->st_name);
4476               if (name == NULL || *name == '\0')
4477                 name = bfd_section_name (input_bfd, sec);
4478             }
4479
4480           switch (r)
4481             {
4482             case bfd_reloc_overflow:
4483               (*info->callbacks->reloc_overflow) (info, NULL, name,
4484                                                   howto->name, (bfd_vma) 0,
4485                                                   input_bfd, input_section,
4486                                                   rel->r_offset);
4487               break;
4488
4489             case bfd_reloc_undefined:
4490               (*info->callbacks->undefined_symbol) (info, name, input_bfd,
4491                                                     input_section,
4492                                                     rel->r_offset, TRUE);
4493               break;
4494
4495             case bfd_reloc_outofrange:
4496               if (msg == NULL)
4497                 msg = _("relocation out of range");
4498               break;
4499
4500             case bfd_reloc_notsupported:
4501               if (msg == NULL)
4502                 msg = _("unsupported relocation");
4503               break;
4504
4505             case bfd_reloc_dangerous:
4506               if (msg == NULL)
4507                 msg = _("dangerous relocation");
4508               break;
4509
4510             default:
4511               if (msg == NULL)
4512                 msg = _("unknown error");
4513               break;
4514             }
4515
4516           if (msg)
4517             {
4518               (*info->callbacks->warning) (info, msg, name, input_bfd,
4519                                            input_section, rel->r_offset);
4520               return FALSE;
4521             }
4522         }
4523     }
4524   return TRUE;
4525 }
4526
4527 /* Implement elf-backend_section_flags:
4528    Convert NIOS2 specific section flags to bfd internal section flags.  */
4529 static bfd_boolean
4530 nios2_elf32_section_flags (flagword *flags, const Elf_Internal_Shdr *hdr)
4531 {
4532   if (hdr->sh_flags & SHF_NIOS2_GPREL)
4533     *flags |= SEC_SMALL_DATA;
4534
4535   return TRUE;
4536 }
4537
4538 /* Implement elf_backend_fake_sections:
4539    Set the correct type for an NIOS2 ELF section.  We do this by the
4540    section name, which is a hack, but ought to work.  */
4541 static bfd_boolean
4542 nios2_elf32_fake_sections (bfd *abfd ATTRIBUTE_UNUSED,
4543                            Elf_Internal_Shdr *hdr, asection *sec)
4544 {
4545   register const char *name = bfd_get_section_name (abfd, sec);
4546
4547   if ((sec->flags & SEC_SMALL_DATA)
4548       || strcmp (name, ".sdata") == 0
4549       || strcmp (name, ".sbss") == 0
4550       || strcmp (name, ".lit4") == 0 || strcmp (name, ".lit8") == 0)
4551     hdr->sh_flags |= SHF_NIOS2_GPREL;
4552
4553   return TRUE;
4554 }
4555
4556 /* Create .got, .gotplt, and .rela.got sections in DYNOBJ, and set up
4557    shortcuts to them in our hash table.  */
4558 static bfd_boolean
4559 create_got_section (bfd *dynobj, struct bfd_link_info *info)
4560 {
4561   struct elf32_nios2_link_hash_table *htab;
4562   struct elf_link_hash_entry *h;
4563
4564   htab = elf32_nios2_hash_table (info);
4565
4566   if (! _bfd_elf_create_got_section (dynobj, info))
4567     return FALSE;
4568
4569   /* In order for the two loads in .PLTresolve to share the same %hiadj,
4570      _GLOBAL_OFFSET_TABLE_ must be aligned to a 16-byte boundary.  */
4571   if (!bfd_set_section_alignment (dynobj, htab->root.sgotplt, 4))
4572     return FALSE;
4573
4574   /* The Nios II ABI specifies that GOT-relative relocations are relative
4575      to the linker-created symbol _gp_got, rather than using
4576      _GLOBAL_OFFSET_TABLE_ directly.  In particular, the latter always
4577      points to the base of the GOT while _gp_got may include a bias.  */
4578   h = _bfd_elf_define_linkage_sym (dynobj, info, htab->root.sgotplt,
4579                                    "_gp_got");
4580   elf32_nios2_hash_table (info)->h_gp_got = h;
4581   if (h == NULL)
4582     return FALSE;
4583
4584   return TRUE;
4585 }
4586
4587 /* Implement elf_backend_create_dynamic_sections:
4588    Create .plt, .rela.plt, .got, .got.plt, .rela.got, .dynbss, and
4589    .rela.bss sections in DYNOBJ, and set up shortcuts to them in our
4590    hash table.  */
4591 static bfd_boolean
4592 nios2_elf32_create_dynamic_sections (bfd *dynobj, struct bfd_link_info *info)
4593 {
4594   struct elf32_nios2_link_hash_table *htab;
4595
4596   htab = elf32_nios2_hash_table (info);
4597   if (!htab->root.sgot && !create_got_section (dynobj, info))
4598     return FALSE;
4599
4600   _bfd_elf_create_dynamic_sections (dynobj, info);
4601
4602   /* In order for the two loads in a shared object .PLTresolve to share the
4603      same %hiadj, the start of the PLT (as well as the GOT) must be aligned
4604      to a 16-byte boundary.  This is because the addresses for these loads
4605      include the -(.plt+4) PIC correction.  */
4606   if (!bfd_set_section_alignment (dynobj, htab->root.splt, 4))
4607     return FALSE;
4608
4609   htab->sdynbss = bfd_get_linker_section (dynobj, ".dynbss");
4610   if (!htab->sdynbss)
4611     return FALSE;
4612   if (!bfd_link_pic (info))
4613     {
4614       htab->srelbss = bfd_get_linker_section (dynobj, ".rela.bss");
4615       if (!htab->srelbss)
4616         return FALSE;
4617     }
4618
4619   return TRUE;
4620 }
4621
4622 /* Implement elf_backend_copy_indirect_symbol:
4623    Copy the extra info we tack onto an elf_link_hash_entry.  */
4624 static void
4625 nios2_elf32_copy_indirect_symbol (struct bfd_link_info *info,
4626                                   struct elf_link_hash_entry *dir,
4627                                   struct elf_link_hash_entry *ind)
4628 {
4629   struct elf32_nios2_link_hash_entry *edir, *eind;
4630
4631   edir = (struct elf32_nios2_link_hash_entry *) dir;
4632   eind = (struct elf32_nios2_link_hash_entry *) ind;
4633
4634   if (eind->dyn_relocs != NULL)
4635     {
4636       if (edir->dyn_relocs != NULL)
4637         {
4638           struct elf32_nios2_dyn_relocs **pp;
4639           struct elf32_nios2_dyn_relocs *p;
4640
4641           /* Add reloc counts against the indirect sym to the direct sym
4642              list.  Merge any entries against the same section.  */
4643           for (pp = &eind->dyn_relocs; (p = *pp) != NULL; )
4644             {
4645               struct elf32_nios2_dyn_relocs *q;
4646
4647               for (q = edir->dyn_relocs; q != NULL; q = q->next)
4648                 if (q->sec == p->sec)
4649                   {
4650                     q->pc_count += p->pc_count;
4651                     q->count += p->count;
4652                     *pp = p->next;
4653                     break;
4654                   }
4655               if (q == NULL)
4656                 pp = &p->next;
4657             }
4658           *pp = edir->dyn_relocs;
4659         }
4660
4661       edir->dyn_relocs = eind->dyn_relocs;
4662       eind->dyn_relocs = NULL;
4663     }
4664
4665   if (ind->root.type == bfd_link_hash_indirect
4666       && dir->got.refcount <= 0)
4667     {
4668       edir->tls_type = eind->tls_type;
4669       eind->tls_type = GOT_UNKNOWN;
4670     }
4671
4672   edir->got_types_used |= eind->got_types_used;
4673
4674   _bfd_elf_link_hash_copy_indirect (info, dir, ind);
4675 }
4676
4677 /* Set the right machine number for a NIOS2 ELF file.  */
4678
4679 static bfd_boolean
4680 nios2_elf32_object_p (bfd *abfd)
4681 {
4682   unsigned long mach;
4683
4684   mach = elf_elfheader (abfd)->e_flags;
4685
4686   switch (mach)
4687     {
4688     default:
4689     case EF_NIOS2_ARCH_R1:
4690       bfd_default_set_arch_mach (abfd, bfd_arch_nios2, bfd_mach_nios2r1);
4691       break;
4692     case EF_NIOS2_ARCH_R2:
4693       bfd_default_set_arch_mach (abfd, bfd_arch_nios2, bfd_mach_nios2r2);
4694       break;
4695     }
4696
4697   return TRUE;
4698 }
4699
4700 /* Implement elf_backend_check_relocs:
4701    Look through the relocs for a section during the first phase.  */
4702 static bfd_boolean
4703 nios2_elf32_check_relocs (bfd *abfd, struct bfd_link_info *info,
4704                           asection *sec, const Elf_Internal_Rela *relocs)
4705 {
4706   bfd *dynobj;
4707   Elf_Internal_Shdr *symtab_hdr;
4708   struct elf_link_hash_entry **sym_hashes, **sym_hashes_end;
4709   const Elf_Internal_Rela *rel;
4710   const Elf_Internal_Rela *rel_end;
4711   struct elf32_nios2_link_hash_table *htab;
4712   asection *sgot;
4713   asection *srelgot;
4714   asection *sreloc = NULL;
4715   bfd_signed_vma *local_got_refcounts;
4716
4717   if (bfd_link_relocatable (info))
4718     return TRUE;
4719
4720   dynobj = elf_hash_table (info)->dynobj;
4721   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
4722   sym_hashes = elf_sym_hashes (abfd);
4723   sym_hashes_end = (sym_hashes
4724                     + symtab_hdr->sh_size / sizeof (Elf32_External_Sym));
4725   if (!elf_bad_symtab (abfd))
4726     sym_hashes_end -= symtab_hdr->sh_info;
4727   local_got_refcounts = elf_local_got_refcounts (abfd);
4728
4729   htab = elf32_nios2_hash_table (info);
4730   sgot = htab->root.sgot;
4731   srelgot = htab->root.srelgot;
4732
4733   rel_end = relocs + sec->reloc_count;
4734   for (rel = relocs; rel < rel_end; rel++)
4735     {
4736       unsigned int r_type;
4737       struct elf_link_hash_entry *h;
4738       unsigned long r_symndx;
4739
4740       r_symndx = ELF32_R_SYM (rel->r_info);
4741       if (r_symndx < symtab_hdr->sh_info)
4742         h = NULL;
4743       else
4744         {
4745           h = sym_hashes[r_symndx - symtab_hdr->sh_info];
4746           while (h->root.type == bfd_link_hash_indirect
4747                  || h->root.type == bfd_link_hash_warning)
4748             h = (struct elf_link_hash_entry *) h->root.u.i.link;
4749
4750           /* PR15323, ref flags aren't set for references in the same
4751              object.  */
4752           h->root.non_ir_ref = 1;
4753         }
4754
4755       r_type = ELF32_R_TYPE (rel->r_info);
4756
4757       switch (r_type)
4758         {
4759         case R_NIOS2_GOT16:
4760         case R_NIOS2_GOT_LO:
4761         case R_NIOS2_GOT_HA:
4762         case R_NIOS2_CALL16:
4763         case R_NIOS2_CALL_LO:
4764         case R_NIOS2_CALL_HA:
4765         case R_NIOS2_TLS_GD16:
4766         case R_NIOS2_TLS_IE16:
4767           /* This symbol requires a global offset table entry.  */
4768           {
4769             int tls_type, old_tls_type;
4770
4771             switch (r_type)
4772               {
4773               default:
4774               case R_NIOS2_GOT16:
4775               case R_NIOS2_GOT_LO:
4776               case R_NIOS2_GOT_HA:
4777               case R_NIOS2_CALL16:
4778               case R_NIOS2_CALL_LO:
4779               case R_NIOS2_CALL_HA:
4780                 tls_type = GOT_NORMAL;
4781                 break;
4782               case R_NIOS2_TLS_GD16:
4783                 tls_type = GOT_TLS_GD;
4784                 break;
4785               case R_NIOS2_TLS_IE16:
4786                 tls_type = GOT_TLS_IE;
4787                 break;
4788               }
4789
4790             if (dynobj == NULL)
4791               {
4792                 /* Create the .got section.  */
4793                 elf_hash_table (info)->dynobj = dynobj = abfd;
4794                 nios2_elf32_create_dynamic_sections (dynobj, info);
4795               }
4796
4797             if (sgot == NULL)
4798               {
4799                 sgot = htab->root.sgot;
4800                 BFD_ASSERT (sgot != NULL);
4801               }
4802
4803             if (srelgot == NULL
4804                 && (h != NULL || bfd_link_pic (info)))
4805               {
4806                 srelgot = htab->root.srelgot;
4807                 BFD_ASSERT (srelgot != NULL);
4808               }
4809
4810             if (h != NULL)
4811               {
4812                 struct elf32_nios2_link_hash_entry *eh
4813                   = (struct elf32_nios2_link_hash_entry *)h;
4814                 h->got.refcount++;
4815                 old_tls_type = elf32_nios2_hash_entry(h)->tls_type;
4816                 if (r_type == R_NIOS2_CALL16
4817                     || r_type == R_NIOS2_CALL_LO
4818                     || r_type == R_NIOS2_CALL_HA)
4819                   {
4820                     /* Make sure a plt entry is created for this symbol if
4821                        it turns out to be a function defined by a dynamic
4822                        object.  */
4823                     h->plt.refcount++;
4824                     h->needs_plt = 1;
4825                     h->type = STT_FUNC;
4826                     eh->got_types_used |= CALL_USED;
4827                   }
4828                 else
4829                   eh->got_types_used |= GOT_USED;
4830               }
4831             else
4832               {
4833                 /* This is a global offset table entry for a local symbol.  */
4834                 if (local_got_refcounts == NULL)
4835                   {
4836                     bfd_size_type size;
4837
4838                     size = symtab_hdr->sh_info;
4839                     size *= (sizeof (bfd_signed_vma) + sizeof (char));
4840                     local_got_refcounts
4841                       = ((bfd_signed_vma *) bfd_zalloc (abfd, size));
4842                     if (local_got_refcounts == NULL)
4843                       return FALSE;
4844                     elf_local_got_refcounts (abfd) = local_got_refcounts;
4845                     elf32_nios2_local_got_tls_type (abfd)
4846                       = (char *) (local_got_refcounts + symtab_hdr->sh_info);
4847                   }
4848                 local_got_refcounts[r_symndx]++;
4849                 old_tls_type = elf32_nios2_local_got_tls_type (abfd) [r_symndx];
4850               }
4851
4852             /* We will already have issued an error message if there is a
4853                TLS / non-TLS mismatch, based on the symbol type.  We don't
4854                support any linker relaxations.  So just combine any TLS
4855                types needed.  */
4856             if (old_tls_type != GOT_UNKNOWN && old_tls_type != GOT_NORMAL
4857                 && tls_type != GOT_NORMAL)
4858               tls_type |= old_tls_type;
4859
4860             if (old_tls_type != tls_type)
4861               {
4862                 if (h != NULL)
4863                   elf32_nios2_hash_entry (h)->tls_type = tls_type;
4864                 else
4865                   elf32_nios2_local_got_tls_type (abfd) [r_symndx] = tls_type;
4866               }
4867           }
4868           /* Fall through */
4869         case R_NIOS2_TLS_LDM16:
4870           if (r_type == R_NIOS2_TLS_LDM16)
4871             htab->tls_ldm_got.refcount++;
4872
4873           if (htab->root.sgot == NULL)
4874             {
4875               if (htab->root.dynobj == NULL)
4876                 htab->root.dynobj = abfd;
4877               if (!create_got_section (htab->root.dynobj, info))
4878                 return FALSE;
4879             }
4880           break;
4881
4882           /* This relocation describes the C++ object vtable hierarchy.
4883              Reconstruct it for later use during GC.  */
4884         case R_NIOS2_GNU_VTINHERIT:
4885           if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
4886             return FALSE;
4887           break;
4888
4889           /* This relocation describes which C++ vtable entries are actually
4890              used.  Record for later use during GC.  */
4891         case R_NIOS2_GNU_VTENTRY:
4892           if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
4893             return FALSE;
4894           break;
4895
4896         case R_NIOS2_BFD_RELOC_32:
4897         case R_NIOS2_CALL26:
4898         case R_NIOS2_CALL26_NOAT:
4899         case R_NIOS2_HIADJ16:
4900         case R_NIOS2_LO16:
4901
4902           if (h != NULL)
4903             {
4904               /* If this reloc is in a read-only section, we might
4905                    need a copy reloc.  We can't check reliably at this
4906                    stage whether the section is read-only, as input
4907                    sections have not yet been mapped to output sections.
4908                    Tentatively set the flag for now, and correct in
4909                    adjust_dynamic_symbol.  */
4910               if (!bfd_link_pic (info))
4911                 h->non_got_ref = 1;
4912
4913               /* Make sure a plt entry is created for this symbol if it
4914                  turns out to be a function defined by a dynamic object.  */
4915               h->plt.refcount++;
4916
4917               if (r_type == R_NIOS2_CALL26 || r_type == R_NIOS2_CALL26_NOAT)
4918                 h->needs_plt = 1;
4919             }
4920
4921           /* If we are creating a shared library, we need to copy the
4922              reloc into the shared library.  */
4923           if (bfd_link_pic (info)
4924               && (sec->flags & SEC_ALLOC) != 0
4925               && (r_type == R_NIOS2_BFD_RELOC_32
4926                   || (h != NULL && ! h->needs_plt
4927                       && (! SYMBOLIC_BIND (info, h) || ! h->def_regular))))
4928             {
4929               struct elf32_nios2_dyn_relocs *p;
4930               struct elf32_nios2_dyn_relocs **head;
4931
4932               /* When creating a shared object, we must copy these
4933                  reloc types into the output file.  We create a reloc
4934                  section in dynobj and make room for this reloc.  */
4935               if (sreloc == NULL)
4936                 {
4937                   sreloc = _bfd_elf_make_dynamic_reloc_section
4938                     (sec, dynobj, 2, abfd, TRUE);
4939                   if (sreloc == NULL)
4940                     return FALSE;
4941                 }
4942
4943               /* If this is a global symbol, we count the number of
4944                  relocations we need for this symbol.  */
4945               if (h != NULL)
4946                 head = &((struct elf32_nios2_link_hash_entry *) h)->dyn_relocs;
4947               else
4948                 {
4949                   /* Track dynamic relocs needed for local syms too.
4950                      We really need local syms available to do this
4951                      easily.  Oh well.  */
4952
4953                   asection *s;
4954                   void *vpp;
4955                   Elf_Internal_Sym *isym;
4956
4957                   isym = bfd_sym_from_r_symndx (&htab->sym_cache,
4958                                                 abfd, r_symndx);
4959                   if (isym == NULL)
4960                     return FALSE;
4961
4962                   s = bfd_section_from_elf_index (abfd, isym->st_shndx);
4963                   if (s == NULL)
4964                     s = sec;
4965
4966                   vpp = &elf_section_data (s)->local_dynrel;
4967                   head = (struct elf32_nios2_dyn_relocs **) vpp;
4968                 }
4969
4970               p = *head;
4971               if (p == NULL || p->sec != sec)
4972                 {
4973                   bfd_size_type amt = sizeof *p;
4974                   p = ((struct elf32_nios2_dyn_relocs *)
4975                        bfd_alloc (htab->root.dynobj, amt));
4976                   if (p == NULL)
4977                     return FALSE;
4978                   p->next = *head;
4979                   *head = p;
4980                   p->sec = sec;
4981                   p->count = 0;
4982                   p->pc_count = 0;
4983                 }
4984
4985               p->count += 1;
4986
4987             }
4988           break;
4989         }
4990     }
4991
4992   return TRUE;
4993 }
4994
4995
4996 /* Implement elf_backend_gc_mark_hook:
4997    Return the section that should be marked against GC for a given
4998    relocation.  */
4999 static asection *
5000 nios2_elf32_gc_mark_hook (asection *sec,
5001                           struct bfd_link_info *info,
5002                           Elf_Internal_Rela *rel,
5003                           struct elf_link_hash_entry *h,
5004                           Elf_Internal_Sym *sym)
5005 {
5006   if (h != NULL)
5007     switch (ELF32_R_TYPE (rel->r_info))
5008       {
5009       case R_NIOS2_GNU_VTINHERIT:
5010       case R_NIOS2_GNU_VTENTRY:
5011         return NULL;
5012       }
5013   return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
5014 }
5015
5016 /* Implement elf_backend_gc_sweep_hook:
5017    Update the got entry reference counts for the section being removed.  */
5018 static bfd_boolean
5019 nios2_elf32_gc_sweep_hook (bfd *abfd,
5020                            struct bfd_link_info *info,
5021                            asection *sec,
5022                            const Elf_Internal_Rela *relocs)
5023 {
5024   Elf_Internal_Shdr *symtab_hdr;
5025   struct elf_link_hash_entry **sym_hashes;
5026   bfd_signed_vma *local_got_refcounts;
5027   const Elf_Internal_Rela *rel, *relend;
5028   bfd *dynobj;
5029
5030   if (bfd_link_relocatable (info))
5031     return TRUE;
5032
5033   elf_section_data (sec)->local_dynrel = NULL;
5034
5035   dynobj = elf_hash_table (info)->dynobj;
5036   if (dynobj == NULL)
5037     return TRUE;
5038
5039   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
5040   sym_hashes = elf_sym_hashes (abfd);
5041   local_got_refcounts = elf_local_got_refcounts (abfd);
5042
5043   relend = relocs + sec->reloc_count;
5044   for (rel = relocs; rel < relend; rel++)
5045     {
5046       unsigned long r_symndx;
5047       struct elf_link_hash_entry *h = NULL;
5048       int r_type;
5049
5050       r_symndx = ELF32_R_SYM (rel->r_info);
5051       if (r_symndx >= symtab_hdr->sh_info)
5052         {
5053           h = sym_hashes[r_symndx - symtab_hdr->sh_info];
5054           while (h->root.type == bfd_link_hash_indirect
5055                  || h->root.type == bfd_link_hash_warning)
5056             h = (struct elf_link_hash_entry *) h->root.u.i.link;
5057         }
5058
5059       r_type = ELF32_R_TYPE (rel->r_info);
5060       switch (r_type)
5061         {
5062         case R_NIOS2_GOT16:
5063         case R_NIOS2_GOT_LO:
5064         case R_NIOS2_GOT_HA:
5065         case R_NIOS2_CALL16:
5066         case R_NIOS2_CALL_LO:
5067         case R_NIOS2_CALL_HA:
5068           if (h != NULL)
5069             {
5070               if (h->got.refcount > 0)
5071                 --h->got.refcount;
5072             }
5073           else if (local_got_refcounts != NULL)
5074             {
5075               if (local_got_refcounts[r_symndx] > 0)
5076                 --local_got_refcounts[r_symndx];
5077             }
5078           break;
5079
5080         case R_NIOS2_PCREL_LO:
5081         case R_NIOS2_PCREL_HA:
5082         case R_NIOS2_BFD_RELOC_32:
5083         case R_NIOS2_CALL26:
5084         case R_NIOS2_CALL26_NOAT:
5085           if (h != NULL)
5086             {
5087               struct elf32_nios2_link_hash_entry *eh;
5088               struct elf32_nios2_dyn_relocs **pp;
5089               struct elf32_nios2_dyn_relocs *p;
5090
5091               eh = (struct elf32_nios2_link_hash_entry *) h;
5092
5093               if (h->plt.refcount > 0)
5094                 --h->plt.refcount;
5095
5096               if (r_type == R_NIOS2_PCREL_LO || r_type == R_NIOS2_PCREL_HA
5097                   || r_type == R_NIOS2_BFD_RELOC_32)
5098                 {
5099                   for (pp = &eh->dyn_relocs; (p = *pp) != NULL;
5100                        pp = &p->next)
5101                     if (p->sec == sec)
5102                       {
5103                         p->count -= 1;
5104                         if (p->count == 0)
5105                           *pp = p->next;
5106                         break;
5107                       }
5108                 }
5109             }
5110           break;
5111
5112         default:
5113           break;
5114         }
5115     }
5116
5117   return TRUE;
5118 }
5119
5120 /* Implement elf_backend_finish_dynamic_symbols:
5121    Finish up dynamic symbol handling.  We set the contents of various
5122    dynamic sections here.  */
5123 static bfd_boolean
5124 nios2_elf32_finish_dynamic_symbol (bfd *output_bfd,
5125                                    struct bfd_link_info *info,
5126                                    struct elf_link_hash_entry *h,
5127                                    Elf_Internal_Sym *sym)
5128 {
5129   struct elf32_nios2_link_hash_table *htab;
5130   struct elf32_nios2_link_hash_entry *eh
5131     = (struct elf32_nios2_link_hash_entry *)h;
5132   int use_plt;
5133
5134   htab = elf32_nios2_hash_table (info);
5135
5136   if (h->plt.offset != (bfd_vma) -1)
5137     {
5138       asection *splt;
5139       asection *sgotplt;
5140       asection *srela;
5141       bfd_vma plt_index;
5142       bfd_vma got_offset;
5143       Elf_Internal_Rela rela;
5144       bfd_byte *loc;
5145       bfd_vma got_address;
5146
5147       /* This symbol has an entry in the procedure linkage table.  Set
5148          it up.  */
5149       BFD_ASSERT (h->dynindx != -1);
5150       splt = htab->root.splt;
5151       sgotplt = htab->root.sgotplt;
5152       srela = htab->root.srelplt;
5153       BFD_ASSERT (splt != NULL && sgotplt != NULL && srela != NULL);
5154
5155       /* Emit the PLT entry.  */
5156       if (bfd_link_pic (info))
5157         {
5158           nios2_elf32_install_data (splt, nios2_so_plt_entry, h->plt.offset,
5159                                     3);
5160           plt_index = (h->plt.offset - 24) / 12;
5161           got_offset = (plt_index + 3) * 4;
5162           nios2_elf32_install_imm16 (splt, h->plt.offset,
5163                                      hiadj(plt_index * 4));
5164           nios2_elf32_install_imm16 (splt, h->plt.offset + 4,
5165                                      (plt_index * 4) & 0xffff);
5166           nios2_elf32_install_imm16 (splt, h->plt.offset + 8,
5167                                      0xfff4 - h->plt.offset);
5168           got_address = (sgotplt->output_section->vma + sgotplt->output_offset
5169                          + got_offset);
5170
5171           /* Fill in the entry in the global offset table.  There are no
5172              res_n slots for a shared object PLT, instead the .got.plt entries
5173              point to the PLT entries.  */
5174           bfd_put_32 (output_bfd,
5175                       splt->output_section->vma + splt->output_offset
5176                       + h->plt.offset, sgotplt->contents + got_offset);
5177         }
5178       else
5179         {
5180           plt_index = (h->plt.offset - 28 - htab->res_n_size) / 12;
5181           got_offset = (plt_index + 3) * 4;
5182
5183           nios2_elf32_install_data (splt, nios2_plt_entry, h->plt.offset, 3);
5184           got_address = (sgotplt->output_section->vma + sgotplt->output_offset
5185                          + got_offset);
5186           nios2_elf32_install_imm16 (splt, h->plt.offset, hiadj(got_address));
5187           nios2_elf32_install_imm16 (splt, h->plt.offset + 4,
5188                                      got_address & 0xffff);
5189
5190           /* Fill in the entry in the global offset table.  */
5191           bfd_put_32 (output_bfd,
5192                       splt->output_section->vma + splt->output_offset
5193                       + plt_index * 4, sgotplt->contents + got_offset);
5194         }
5195
5196       /* Fill in the entry in the .rela.plt section.  */
5197       rela.r_offset = got_address;
5198       rela.r_info = ELF32_R_INFO (h->dynindx, R_NIOS2_JUMP_SLOT);
5199       rela.r_addend = 0;
5200       loc = srela->contents + plt_index * sizeof (Elf32_External_Rela);
5201       bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
5202
5203       if (!h->def_regular)
5204         {
5205           /* Mark the symbol as undefined, rather than as defined in
5206              the .plt section.  Leave the value alone.  */
5207           sym->st_shndx = SHN_UNDEF;
5208           /* If the symbol is weak, we do need to clear the value.
5209              Otherwise, the PLT entry would provide a definition for
5210              the symbol even if the symbol wasn't defined anywhere,
5211              and so the symbol would never be NULL.  */
5212           if (!h->ref_regular_nonweak)
5213             sym->st_value = 0;
5214         }
5215     }
5216
5217   use_plt = (eh->got_types_used == CALL_USED
5218              && h->plt.offset != (bfd_vma) -1);
5219
5220   if (!use_plt && h->got.offset != (bfd_vma) -1
5221       && (elf32_nios2_hash_entry (h)->tls_type & GOT_TLS_GD) == 0
5222       && (elf32_nios2_hash_entry (h)->tls_type & GOT_TLS_IE) == 0)
5223     {
5224       asection *sgot;
5225       asection *srela;
5226       Elf_Internal_Rela rela;
5227       bfd_byte *loc;
5228       bfd_vma offset;
5229
5230       /* This symbol has an entry in the global offset table.  Set it
5231          up.  */
5232       sgot = htab->root.sgot;
5233       srela = htab->root.srelgot;
5234       BFD_ASSERT (sgot != NULL && srela != NULL);
5235
5236       offset = (h->got.offset & ~(bfd_vma) 1);
5237       rela.r_offset = (sgot->output_section->vma
5238                        + sgot->output_offset + offset);
5239
5240       /* If this is a -Bsymbolic link, and the symbol is defined
5241          locally, we just want to emit a RELATIVE reloc.  Likewise if
5242          the symbol was forced to be local because of a version file.
5243          The entry in the global offset table will already have been
5244          initialized in the relocate_section function.  */
5245
5246       if (bfd_link_pic (info) && SYMBOL_REFERENCES_LOCAL (info, h))
5247         {
5248           rela.r_info = ELF32_R_INFO (0, R_NIOS2_RELATIVE);
5249           rela.r_addend = bfd_get_signed_32 (output_bfd,
5250                                              (sgot->contents + offset));
5251           bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + offset);
5252         }
5253       else
5254         {
5255           bfd_put_32 (output_bfd, (bfd_vma) 0,
5256                       sgot->contents + offset);
5257           rela.r_info = ELF32_R_INFO (h->dynindx, R_NIOS2_GLOB_DAT);
5258           rela.r_addend = 0;
5259         }
5260
5261       loc = srela->contents;
5262       loc += srela->reloc_count++ * sizeof (Elf32_External_Rela);
5263       bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
5264     }
5265
5266   if (use_plt && h->got.offset != (bfd_vma) -1)
5267     {
5268       bfd_vma offset = (h->got.offset & ~(bfd_vma) 1);
5269       asection *sgot = htab->root.sgot;
5270       asection *splt = htab->root.splt;
5271       bfd_put_32 (output_bfd, (splt->output_section->vma + splt->output_offset
5272                                + h->plt.offset),
5273                   sgot->contents + offset);
5274     }
5275
5276   if (h->needs_copy)
5277     {
5278       asection *s;
5279       Elf_Internal_Rela rela;
5280       bfd_byte *loc;
5281
5282       /* This symbol needs a copy reloc.  Set it up.  */
5283       BFD_ASSERT (h->dynindx != -1
5284                   && (h->root.type == bfd_link_hash_defined
5285                       || h->root.type == bfd_link_hash_defweak));
5286
5287       s = htab->srelbss;
5288       BFD_ASSERT (s != NULL);
5289
5290       rela.r_offset = (h->root.u.def.value
5291                        + h->root.u.def.section->output_section->vma
5292                        + h->root.u.def.section->output_offset);
5293       rela.r_info = ELF32_R_INFO (h->dynindx, R_NIOS2_COPY);
5294       rela.r_addend = 0;
5295       loc = s->contents + s->reloc_count++ * sizeof (Elf32_External_Rela);
5296       bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
5297     }
5298
5299   /* Mark _DYNAMIC, _GLOBAL_OFFSET_TABLE_, and _gp_got as absolute.  */
5300   if (strcmp (h->root.root.string, "_DYNAMIC") == 0
5301       || h == elf_hash_table (info)->hgot
5302       || h == elf32_nios2_hash_table (info)->h_gp_got)
5303     sym->st_shndx = SHN_ABS;
5304
5305   return TRUE;
5306 }
5307
5308 /* Implement elf_backend_finish_dynamic_sections.  */
5309 static bfd_boolean
5310 nios2_elf32_finish_dynamic_sections (bfd *output_bfd,
5311                                      struct bfd_link_info *info)
5312 {
5313   bfd *dynobj;
5314   asection *sgotplt;
5315   asection *sdyn;
5316   struct elf32_nios2_link_hash_table *htab;
5317
5318   htab = elf32_nios2_hash_table (info);
5319   dynobj = elf_hash_table (info)->dynobj;
5320   sgotplt = htab->root.sgotplt;
5321   BFD_ASSERT (sgotplt != NULL);
5322   sdyn = bfd_get_linker_section (dynobj, ".dynamic");
5323
5324   if (elf_hash_table (info)->dynamic_sections_created)
5325     {
5326       asection *splt;
5327       Elf32_External_Dyn *dyncon, *dynconend;
5328
5329       splt = htab->root.splt;
5330       BFD_ASSERT (splt != NULL && sdyn != NULL);
5331
5332       dyncon = (Elf32_External_Dyn *) sdyn->contents;
5333       dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
5334       for (; dyncon < dynconend; dyncon++)
5335         {
5336           Elf_Internal_Dyn dyn;
5337           asection *s;
5338
5339           bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
5340
5341           switch (dyn.d_tag)
5342             {
5343             default:
5344               break;
5345
5346             case DT_PLTGOT:
5347               s = htab->root.sgotplt;
5348               dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
5349               bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
5350               break;
5351
5352             case DT_JMPREL:
5353               s = htab->root.srelplt;
5354               dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
5355               bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
5356               break;
5357
5358             case DT_PLTRELSZ:
5359               s = htab->root.srelplt;
5360               dyn.d_un.d_val = s->size;
5361               bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
5362               break;
5363
5364             case DT_RELASZ:
5365               /* The procedure linkage table relocs (DT_JMPREL) should
5366                  not be included in the overall relocs (DT_RELA).
5367                  Therefore, we override the DT_RELASZ entry here to
5368                  make it not include the JMPREL relocs.  Since the
5369                  linker script arranges for .rela.plt to follow all
5370                  other relocation sections, we don't have to worry
5371                  about changing the DT_RELA entry.  */
5372               s = htab->root.srelplt;
5373               if (s != NULL)
5374                 dyn.d_un.d_val -= s->size;
5375               bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
5376               break;
5377
5378             case DT_NIOS2_GP:
5379               s = htab->root.sgotplt;
5380               dyn.d_un.d_ptr
5381                 = s->output_section->vma + s->output_offset + 0x7ff0;
5382               bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
5383               break;
5384             }
5385         }
5386
5387       /* Fill in the first entry in the procedure linkage table.  */
5388       if (splt->size > 0)
5389         {
5390           bfd_vma got_address = (sgotplt->output_section->vma
5391                                  + sgotplt->output_offset);
5392           if (bfd_link_pic (info))
5393             {
5394               bfd_vma got_pcrel = got_address - (splt->output_section->vma
5395                                                  + splt->output_offset);
5396               /* Both GOT and PLT must be aligned to a 16-byte boundary
5397                  for the two loads to share the %hiadj part.  The 4-byte
5398                  offset for nextpc is accounted for in the %lo offsets
5399                  on the loads.  */
5400               BFD_ASSERT ((got_pcrel & 0xf) == 0);
5401               nios2_elf32_install_data (splt, nios2_so_plt0_entry, 0, 6);
5402               nios2_elf32_install_imm16 (splt, 4, hiadj (got_pcrel));
5403               nios2_elf32_install_imm16 (splt, 12, got_pcrel & 0xffff);
5404               nios2_elf32_install_imm16 (splt, 16, (got_pcrel + 4) & 0xffff);
5405             }
5406           else
5407             {
5408               /* Divide by 4 here, not 3 because we already corrected for the
5409                  res_N branches.  */
5410               bfd_vma res_size = (splt->size - 28) / 4;
5411               bfd_vma res_start = (splt->output_section->vma
5412                                    + splt->output_offset);
5413               bfd_vma res_offset;
5414
5415               for (res_offset = 0; res_offset < res_size; res_offset += 4)
5416                 bfd_put_32 (output_bfd,
5417                             6 | ((res_size - (res_offset + 4)) << 6),
5418                             splt->contents + res_offset);
5419
5420               /* The GOT must be aligned to a 16-byte boundary for the
5421                  two loads to share the same %hiadj part.  */
5422               BFD_ASSERT ((got_address & 0xf) == 0);
5423
5424               nios2_elf32_install_data (splt, nios2_plt0_entry, res_size, 7);
5425               nios2_elf32_install_imm16 (splt, res_size, hiadj (res_start));
5426               nios2_elf32_install_imm16 (splt, res_size + 4,
5427                                          res_start & 0xffff);
5428               nios2_elf32_install_imm16 (splt, res_size + 12,
5429                                          hiadj (got_address));
5430               nios2_elf32_install_imm16 (splt, res_size + 16,
5431                                          (got_address + 4) & 0xffff);
5432               nios2_elf32_install_imm16 (splt, res_size + 20,
5433                                          (got_address + 8) & 0xffff);
5434             }
5435         }
5436     }
5437   /* Fill in the first three entries in the global offset table.  */
5438   if (sgotplt->size > 0)
5439     {
5440       if (sdyn == NULL)
5441         bfd_put_32 (output_bfd, (bfd_vma) 0, sgotplt->contents);
5442       else
5443         bfd_put_32 (output_bfd,
5444                     sdyn->output_section->vma + sdyn->output_offset,
5445                     sgotplt->contents);
5446       bfd_put_32 (output_bfd, (bfd_vma) 0, sgotplt->contents + 4);
5447       bfd_put_32 (output_bfd, (bfd_vma) 0, sgotplt->contents + 8);
5448     }
5449
5450   elf_section_data (sgotplt->output_section)->this_hdr.sh_entsize = 4;
5451
5452   return TRUE;
5453 }
5454
5455 /* Implement elf_backend_adjust_dynamic_symbol:
5456    Adjust a symbol defined by a dynamic object and referenced by a
5457    regular object.  The current definition is in some section of the
5458    dynamic object, but we're not including those sections.  We have to
5459    change the definition to something the rest of the link can
5460    understand.  */
5461 static bfd_boolean
5462 nios2_elf32_adjust_dynamic_symbol (struct bfd_link_info *info,
5463                                    struct elf_link_hash_entry *h)
5464 {
5465   struct elf32_nios2_link_hash_table *htab;
5466   bfd *dynobj;
5467   asection *s;
5468   unsigned align2;
5469
5470   htab = elf32_nios2_hash_table (info);
5471   dynobj = elf_hash_table (info)->dynobj;
5472
5473   /* Make sure we know what is going on here.  */
5474   BFD_ASSERT (dynobj != NULL
5475               && (h->needs_plt
5476                   || h->u.weakdef != NULL
5477                   || (h->def_dynamic
5478                       && h->ref_regular
5479                       && !h->def_regular)));
5480
5481   /* If this is a function, put it in the procedure linkage table.  We
5482      will fill in the contents of the procedure linkage table later,
5483      when we know the address of the .got section.  */
5484   if (h->type == STT_FUNC || h->needs_plt)
5485     {
5486       if (h->plt.refcount <= 0
5487           || SYMBOL_CALLS_LOCAL (info, h)
5488           || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
5489               && h->root.type == bfd_link_hash_undefweak))
5490         {
5491           /* This case can occur if we saw a PLT reloc in an input
5492              file, but the symbol was never referred to by a dynamic
5493              object, or if all references were garbage collected.  In
5494              such a case, we don't actually need to build a procedure
5495              linkage table, and we can just do a PCREL reloc instead.  */
5496           h->plt.offset = (bfd_vma) -1;
5497           h->needs_plt = 0;
5498         }
5499
5500       return TRUE;
5501     }
5502
5503   /* Reinitialize the plt offset now that it is not used as a reference
5504      count any more.  */
5505   h->plt.offset = (bfd_vma) -1;
5506
5507   /* If this is a weak symbol, and there is a real definition, the
5508      processor independent code will have arranged for us to see the
5509      real definition first, and we can just use the same value.  */
5510   if (h->u.weakdef != NULL)
5511     {
5512       BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
5513                   || h->u.weakdef->root.type == bfd_link_hash_defweak);
5514       h->root.u.def.section = h->u.weakdef->root.u.def.section;
5515       h->root.u.def.value = h->u.weakdef->root.u.def.value;
5516       return TRUE;
5517     }
5518
5519   /* If there are no non-GOT references, we do not need a copy
5520      relocation.  */
5521   if (!h->non_got_ref)
5522     return TRUE;
5523
5524   /* This is a reference to a symbol defined by a dynamic object which
5525      is not a function.
5526      If we are creating a shared library, we must presume that the
5527      only references to the symbol are via the global offset table.
5528      For such cases we need not do anything here; the relocations will
5529      be handled correctly by relocate_section.  */
5530   if (bfd_link_pic (info))
5531     return TRUE;
5532
5533   if (h->size == 0)
5534     {
5535       (*_bfd_error_handler) (_("dynamic variable `%s' is zero size"),
5536                              h->root.root.string);
5537       return TRUE;
5538     }
5539
5540   /* We must allocate the symbol in our .dynbss section, which will
5541      become part of the .bss section of the executable.  There will be
5542      an entry for this symbol in the .dynsym section.  The dynamic
5543      object will contain position independent code, so all references
5544      from the dynamic object to this symbol will go through the global
5545      offset table.  The dynamic linker will use the .dynsym entry to
5546      determine the address it must put in the global offset table, so
5547      both the dynamic object and the regular object will refer to the
5548      same memory location for the variable.  */
5549   s = htab->sdynbss;
5550   BFD_ASSERT (s != NULL);
5551
5552   /* We must generate a R_NIOS2_COPY reloc to tell the dynamic linker to
5553      copy the initial value out of the dynamic object and into the
5554      runtime process image.  We need to remember the offset into the
5555      .rela.bss section we are going to use.  */
5556   if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
5557     {
5558       asection *srel;
5559
5560       srel = htab->srelbss;
5561       BFD_ASSERT (srel != NULL);
5562       srel->size += sizeof (Elf32_External_Rela);
5563       h->needs_copy = 1;
5564     }
5565
5566   align2 = bfd_log2 (h->size);
5567   if (align2 > h->root.u.def.section->alignment_power)
5568     align2 = h->root.u.def.section->alignment_power;
5569
5570   /* Align dynbss.  */
5571   s->size = BFD_ALIGN (s->size, (bfd_size_type)1 << align2);
5572   if (align2 > bfd_get_section_alignment (dynobj, s)
5573       && !bfd_set_section_alignment (dynobj, s, align2))
5574     return FALSE;
5575
5576   /* Define the symbol as being at this point in the section.  */
5577   h->root.u.def.section = s;
5578   h->root.u.def.value = s->size;
5579
5580   /* Increment the section size to make room for the symbol.  */
5581   s->size += h->size;
5582
5583   return TRUE;
5584 }
5585
5586 /* Worker function for nios2_elf32_size_dynamic_sections.  */
5587 static bfd_boolean
5588 adjust_dynrelocs (struct elf_link_hash_entry *h, PTR inf)
5589 {
5590   struct bfd_link_info *info;
5591   struct elf32_nios2_link_hash_table *htab;
5592
5593   if (h->root.type == bfd_link_hash_indirect)
5594     return TRUE;
5595
5596   if (h->root.type == bfd_link_hash_warning)
5597     /* When warning symbols are created, they **replace** the "real"
5598        entry in the hash table, thus we never get to see the real
5599        symbol in a hash traversal.  So look at it now.  */
5600     h = (struct elf_link_hash_entry *) h->root.u.i.link;
5601
5602   info = (struct bfd_link_info *) inf;
5603   htab = elf32_nios2_hash_table (info);
5604
5605   if (h->plt.offset != (bfd_vma)-1)
5606     h->plt.offset += htab->res_n_size;
5607   if (htab->root.splt == h->root.u.def.section)
5608     h->root.u.def.value += htab->res_n_size;
5609
5610   return TRUE;
5611 }
5612
5613 /* Another worker function for nios2_elf32_size_dynamic_sections.
5614    Allocate space in .plt, .got and associated reloc sections for
5615    dynamic relocs.  */
5616 static bfd_boolean
5617 allocate_dynrelocs (struct elf_link_hash_entry *h, PTR inf)
5618 {
5619   struct bfd_link_info *info;
5620   struct elf32_nios2_link_hash_table *htab;
5621   struct elf32_nios2_link_hash_entry *eh;
5622   struct elf32_nios2_dyn_relocs *p;
5623   int use_plt;
5624
5625   if (h->root.type == bfd_link_hash_indirect)
5626     return TRUE;
5627
5628   if (h->root.type == bfd_link_hash_warning)
5629     /* When warning symbols are created, they **replace** the "real"
5630        entry in the hash table, thus we never get to see the real
5631        symbol in a hash traversal.  So look at it now.  */
5632     h = (struct elf_link_hash_entry *) h->root.u.i.link;
5633
5634   info = (struct bfd_link_info *) inf;
5635   htab = elf32_nios2_hash_table (info);
5636
5637   if (htab->root.dynamic_sections_created
5638       && h->plt.refcount > 0)
5639     {
5640       /* Make sure this symbol is output as a dynamic symbol.
5641          Undefined weak syms won't yet be marked as dynamic.  */
5642       if (h->dynindx == -1
5643           && !h->forced_local
5644           && !bfd_elf_link_record_dynamic_symbol (info, h))
5645         return FALSE;
5646
5647       if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, bfd_link_pic (info), h))
5648         {
5649           asection *s = htab->root.splt;
5650
5651           /* Allocate room for the header.  */
5652           if (s->size == 0)
5653             {
5654               if (bfd_link_pic (info))
5655                 s->size = 24;
5656               else
5657                 s->size = 28;
5658             }
5659
5660           h->plt.offset = s->size;
5661
5662           /* If this symbol is not defined in a regular file, and we are
5663              not generating a shared library, then set the symbol to this
5664              location in the .plt.  This is required to make function
5665              pointers compare as equal between the normal executable and
5666              the shared library.  */
5667           if (! bfd_link_pic (info)
5668               && !h->def_regular)
5669             {
5670               h->root.u.def.section = s;
5671               h->root.u.def.value = h->plt.offset;
5672             }
5673
5674           /* Make room for this entry.  */
5675           s->size += 12;
5676
5677           /* We also need to make an entry in the .rela.plt section.  */
5678           htab->root.srelplt->size += sizeof (Elf32_External_Rela);
5679
5680           /* And the .got.plt section.  */
5681           htab->root.sgotplt->size += 4;
5682         }
5683       else
5684         {
5685           h->plt.offset = (bfd_vma) -1;
5686           h->needs_plt = 0;
5687         }
5688     }
5689   else
5690     {
5691       h->plt.offset = (bfd_vma) -1;
5692       h->needs_plt = 0;
5693     }
5694
5695   eh = (struct elf32_nios2_link_hash_entry *) h;
5696   use_plt = (eh->got_types_used == CALL_USED
5697              && h->plt.offset != (bfd_vma) -1);
5698
5699   if (h->got.refcount > 0)
5700     {
5701       asection *s;
5702       bfd_boolean dyn;
5703       int tls_type = eh->tls_type;
5704       int indx;
5705
5706       /* Make sure this symbol is output as a dynamic symbol.
5707          Undefined weak syms won't yet be marked as dynamic.  */
5708       if (h->dynindx == -1
5709           && !h->forced_local
5710           && !bfd_elf_link_record_dynamic_symbol (info, h))
5711         return FALSE;
5712
5713       s = htab->root.sgot;
5714       h->got.offset = s->size;
5715
5716       if (tls_type == GOT_UNKNOWN)
5717         abort ();
5718
5719       if (tls_type == GOT_NORMAL)
5720         /* Non-TLS symbols need one GOT slot.  */
5721         s->size += 4;
5722       else
5723         {
5724           if (tls_type & GOT_TLS_GD)
5725             /* R_NIOS2_TLS_GD16 needs 2 consecutive GOT slots.  */
5726             s->size += 8;
5727           if (tls_type & GOT_TLS_IE)
5728             /* R_NIOS2_TLS_IE16 needs one GOT slot.  */
5729             s->size += 4;
5730         }
5731
5732       dyn = htab->root.dynamic_sections_created;
5733
5734       indx = 0;
5735       if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, bfd_link_pic (info), h)
5736           && (!bfd_link_pic (info)
5737               || !SYMBOL_REFERENCES_LOCAL (info, h)))
5738         indx = h->dynindx;
5739
5740       if (tls_type != GOT_NORMAL
5741           && (bfd_link_pic (info) || indx != 0)
5742           && (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
5743               || h->root.type != bfd_link_hash_undefweak))
5744         {
5745           if (tls_type & GOT_TLS_IE)
5746             htab->root.srelgot->size += sizeof (Elf32_External_Rela);
5747
5748           if (tls_type & GOT_TLS_GD)
5749             htab->root.srelgot->size += sizeof (Elf32_External_Rela);
5750
5751           if ((tls_type & GOT_TLS_GD) && indx != 0)
5752             htab->root.srelgot->size += sizeof (Elf32_External_Rela);
5753         }
5754       else if ((ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
5755                 || h->root.type != bfd_link_hash_undefweak)
5756                && !use_plt
5757                && (bfd_link_pic (info)
5758                    || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h)))
5759         htab->root.srelgot->size += sizeof (Elf32_External_Rela);
5760     }
5761   else
5762     h->got.offset = (bfd_vma) -1;
5763
5764   if (eh->dyn_relocs == NULL)
5765     return TRUE;
5766
5767   /* In the shared -Bsymbolic case, discard space allocated for
5768      dynamic pc-relative relocs against symbols which turn out to be
5769      defined in regular objects.  For the normal shared case, discard
5770      space for pc-relative relocs that have become local due to symbol
5771      visibility changes.  */
5772
5773   if (bfd_link_pic (info))
5774     {
5775       if (h->def_regular
5776           && (h->forced_local || SYMBOLIC_BIND (info, h)))
5777         {
5778           struct elf32_nios2_dyn_relocs **pp;
5779
5780           for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
5781             {
5782               p->count -= p->pc_count;
5783               p->pc_count = 0;
5784               if (p->count == 0)
5785                 *pp = p->next;
5786               else
5787                 pp = &p->next;
5788             }
5789         }
5790
5791       /* Also discard relocs on undefined weak syms with non-default
5792          visibility.  */
5793       if (eh->dyn_relocs != NULL
5794           && h->root.type == bfd_link_hash_undefweak)
5795         {
5796           if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
5797             eh->dyn_relocs = NULL;
5798
5799           /* Make sure undefined weak symbols are output as a dynamic
5800              symbol in PIEs.  */
5801           else if (h->dynindx == -1
5802                    && !h->forced_local
5803                    && !bfd_elf_link_record_dynamic_symbol (info, h))
5804             return FALSE;
5805         }
5806     }
5807   else
5808     {
5809       /* For the non-shared case, discard space for relocs against
5810          symbols which turn out to need copy relocs or are not
5811          dynamic.  */
5812
5813       if (!h->non_got_ref
5814           && ((h->def_dynamic && !h->def_regular)
5815               || (htab->root.dynamic_sections_created
5816                   && (h->root.type == bfd_link_hash_undefweak
5817                       || h->root.type == bfd_link_hash_undefined))))
5818         {
5819           /* Make sure this symbol is output as a dynamic symbol.
5820              Undefined weak syms won't yet be marked as dynamic.  */
5821           if (h->dynindx == -1
5822               && !h->forced_local
5823               && !bfd_elf_link_record_dynamic_symbol (info, h))
5824             return FALSE;
5825
5826           /* If that succeeded, we know we'll be keeping all the
5827              relocs.  */
5828           if (h->dynindx != -1)
5829             goto keep;
5830         }
5831
5832       eh->dyn_relocs = NULL;
5833
5834     keep: ;
5835     }
5836
5837   /* Finally, allocate space.  */
5838   for (p = eh->dyn_relocs; p != NULL; p = p->next)
5839     {
5840       asection *sreloc = elf_section_data (p->sec)->sreloc;
5841       sreloc->size += p->count * sizeof (Elf32_External_Rela);
5842     }
5843
5844   return TRUE;
5845 }
5846
5847 /* Implement elf_backend_size_dynamic_sections:
5848    Set the sizes of the dynamic sections.  */
5849 static bfd_boolean
5850 nios2_elf32_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
5851                                    struct bfd_link_info *info)
5852 {
5853   bfd *dynobj;
5854   asection *s;
5855   bfd_boolean plt;
5856   bfd_boolean got;
5857   bfd_boolean relocs;
5858   bfd *ibfd;
5859   struct elf32_nios2_link_hash_table *htab;
5860
5861   htab = elf32_nios2_hash_table (info);
5862   dynobj = elf_hash_table (info)->dynobj;
5863   BFD_ASSERT (dynobj != NULL);
5864
5865   htab->res_n_size = 0;
5866   if (elf_hash_table (info)->dynamic_sections_created)
5867     {
5868       /* Set the contents of the .interp section to the interpreter.  */
5869       if (bfd_link_executable (info) && !info->nointerp)
5870         {
5871           s = bfd_get_linker_section (dynobj, ".interp");
5872           BFD_ASSERT (s != NULL);
5873           s->size = sizeof ELF_DYNAMIC_INTERPRETER;
5874           s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
5875         }
5876     }
5877   else
5878     {
5879       /* We may have created entries in the .rela.got section.
5880          However, if we are not creating the dynamic sections, we will
5881          not actually use these entries.  Reset the size of .rela.got,
5882          which will cause it to get stripped from the output file
5883          below.  */
5884       s = htab->root.srelgot;
5885       if (s != NULL)
5886         s->size = 0;
5887     }
5888
5889   /* Set up .got offsets for local syms, and space for local dynamic
5890      relocs.  */
5891   for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
5892     {
5893       bfd_signed_vma *local_got;
5894       bfd_signed_vma *end_local_got;
5895       char *local_tls_type;
5896       bfd_size_type locsymcount;
5897       Elf_Internal_Shdr *symtab_hdr;
5898       asection *srel;
5899
5900       if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour)
5901         continue;
5902
5903       for (s = ibfd->sections; s != NULL; s = s->next)
5904         {
5905           struct elf32_nios2_dyn_relocs *p;
5906
5907           for (p = elf_section_data (s)->local_dynrel; p != NULL; p = p->next)
5908             {
5909               if (!bfd_is_abs_section (p->sec)
5910                   && bfd_is_abs_section (p->sec->output_section))
5911                 {
5912                   /* Input section has been discarded, either because
5913                      it is a copy of a linkonce section or due to
5914                      linker script /DISCARD/, so we'll be discarding
5915                      the relocs too.  */
5916                 }
5917               else if (p->count != 0)
5918                 {
5919                   srel = elf_section_data (p->sec)->sreloc;
5920                   srel->size += p->count * sizeof (Elf32_External_Rela);
5921                   if ((p->sec->output_section->flags & SEC_READONLY) != 0)
5922                     info->flags |= DF_TEXTREL;
5923                 }
5924             }
5925         }
5926
5927       local_got = elf_local_got_refcounts (ibfd);
5928       if (!local_got)
5929         continue;
5930
5931       symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
5932       locsymcount = symtab_hdr->sh_info;
5933       end_local_got = local_got + locsymcount;
5934       local_tls_type = elf32_nios2_local_got_tls_type (ibfd);
5935       s = htab->root.sgot;
5936       srel = htab->root.srelgot;
5937       for (; local_got < end_local_got; ++local_got, ++local_tls_type)
5938         {
5939           if (*local_got > 0)
5940             {
5941               *local_got = s->size;
5942               if (*local_tls_type & GOT_TLS_GD)
5943                 /* TLS_GD relocs need an 8-byte structure in the GOT.  */
5944                 s->size += 8;
5945               if (*local_tls_type & GOT_TLS_IE)
5946                 s->size += 4;
5947               if (*local_tls_type == GOT_NORMAL)
5948                 s->size += 4;
5949
5950               if (bfd_link_pic (info) || *local_tls_type == GOT_TLS_GD)
5951                 srel->size += sizeof (Elf32_External_Rela);
5952             }
5953           else
5954             *local_got = (bfd_vma) -1;
5955         }
5956     }
5957
5958   if (htab->tls_ldm_got.refcount > 0)
5959     {
5960       /* Allocate two GOT entries and one dynamic relocation (if necessary)
5961          for R_NIOS2_TLS_LDM16 relocations.  */
5962       htab->tls_ldm_got.offset = htab->root.sgot->size;
5963       htab->root.sgot->size += 8;
5964       if (bfd_link_pic (info))
5965         htab->root.srelgot->size += sizeof (Elf32_External_Rela);
5966     }
5967   else
5968     htab->tls_ldm_got.offset = -1;
5969
5970   /* Allocate global sym .plt and .got entries, and space for global
5971      sym dynamic relocs.  */
5972   elf_link_hash_traverse (& htab->root, allocate_dynrelocs, info);
5973
5974   if (elf_hash_table (info)->dynamic_sections_created)
5975     {
5976       /* If the .got section is more than 0x8000 bytes, we add
5977          0x8000 to the value of _gp_got, so that 16-bit relocations
5978          have a greater chance of working. */
5979       if (htab->root.sgot->size >= 0x8000
5980           && elf32_nios2_hash_table (info)->h_gp_got->root.u.def.value == 0)
5981         elf32_nios2_hash_table (info)->h_gp_got->root.u.def.value = 0x8000;
5982     }
5983
5984   /* The check_relocs and adjust_dynamic_symbol entry points have
5985      determined the sizes of the various dynamic sections.  Allocate
5986      memory for them.  */
5987   plt = FALSE;
5988   got = FALSE;
5989   relocs = FALSE;
5990   for (s = dynobj->sections; s != NULL; s = s->next)
5991     {
5992       const char *name;
5993
5994       if ((s->flags & SEC_LINKER_CREATED) == 0)
5995         continue;
5996
5997       /* It's OK to base decisions on the section name, because none
5998          of the dynobj section names depend upon the input files.  */
5999       name = bfd_get_section_name (dynobj, s);
6000
6001       if (strcmp (name, ".plt") == 0)
6002         {
6003           /* Remember whether there is a PLT.  */
6004           plt = s->size != 0;
6005
6006           /* Correct for the number of res_N branches.  */
6007           if (plt && !bfd_link_pic (info))
6008             {
6009               htab->res_n_size = (s->size-28) / 3;
6010               s->size += htab->res_n_size;
6011             }
6012         }
6013       else if (CONST_STRNEQ (name, ".rela"))
6014         {
6015           if (s->size != 0)
6016             {
6017               relocs = TRUE;
6018
6019               /* We use the reloc_count field as a counter if we need
6020                  to copy relocs into the output file.  */
6021               s->reloc_count = 0;
6022             }
6023         }
6024       else if (CONST_STRNEQ (name, ".got"))
6025         got = s->size != 0;
6026       else if (strcmp (name, ".dynbss") != 0)
6027         /* It's not one of our sections, so don't allocate space.  */
6028         continue;
6029
6030       if (s->size == 0)
6031         {
6032           /* If we don't need this section, strip it from the
6033              output file.  This is mostly to handle .rela.bss and
6034              .rela.plt.  We must create both sections in
6035              create_dynamic_sections, because they must be created
6036              before the linker maps input sections to output
6037              sections.  The linker does that before
6038              adjust_dynamic_symbol is called, and it is that
6039              function which decides whether anything needs to go
6040              into these sections.  */
6041           s->flags |= SEC_EXCLUDE;
6042           continue;
6043         }
6044
6045       if ((s->flags & SEC_HAS_CONTENTS) == 0)
6046         continue;
6047
6048       /* Allocate memory for the section contents.  */
6049       /* FIXME: This should be a call to bfd_alloc not bfd_zalloc.
6050          Unused entries should be reclaimed before the section's contents
6051          are written out, but at the moment this does not happen.  Thus in
6052          order to prevent writing out garbage, we initialize the section's
6053          contents to zero.  */
6054       s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->size);
6055       if (s->contents == NULL)
6056         return FALSE;
6057     }
6058
6059   /* Adjust dynamic symbols that point to the plt to account for the
6060      now-known number of resN slots.  */
6061   if (htab->res_n_size)
6062     elf_link_hash_traverse (& htab->root, adjust_dynrelocs, info);
6063
6064   if (elf_hash_table (info)->dynamic_sections_created)
6065     {
6066       /* Add some entries to the .dynamic section.  We fill in the
6067          values later, in elf_nios2_finish_dynamic_sections, but we
6068          must add the entries now so that we get the correct size for
6069          the .dynamic section.  The DT_DEBUG entry is filled in by the
6070          dynamic linker and used by the debugger.  */
6071 #define add_dynamic_entry(TAG, VAL) \
6072   _bfd_elf_add_dynamic_entry (info, TAG, VAL)
6073
6074       if (!bfd_link_pic (info) && !add_dynamic_entry (DT_DEBUG, 0))
6075         return FALSE;
6076
6077       if (got && !add_dynamic_entry (DT_PLTGOT, 0))
6078         return FALSE;
6079
6080       if (plt
6081           && (!add_dynamic_entry (DT_PLTRELSZ, 0)
6082               || !add_dynamic_entry (DT_PLTREL, DT_RELA)
6083               || !add_dynamic_entry (DT_JMPREL, 0)))
6084         return FALSE;
6085
6086       if (relocs
6087           && (!add_dynamic_entry (DT_RELA, 0)
6088               || !add_dynamic_entry (DT_RELASZ, 0)
6089               || !add_dynamic_entry (DT_RELAENT, sizeof (Elf32_External_Rela))))
6090         return FALSE;
6091
6092       if (!bfd_link_pic (info) && !add_dynamic_entry (DT_NIOS2_GP, 0))
6093         return FALSE;
6094
6095       if ((info->flags & DF_TEXTREL) != 0
6096           && !add_dynamic_entry (DT_TEXTREL, 0))
6097         return FALSE;
6098     }
6099 #undef add_dynamic_entry
6100
6101   return TRUE;
6102 }
6103
6104 /* Free the derived linker hash table.  */
6105 static void
6106 nios2_elf32_link_hash_table_free (bfd *obfd)
6107 {
6108   struct elf32_nios2_link_hash_table *htab
6109     = (struct elf32_nios2_link_hash_table *) obfd->link.hash;
6110
6111   bfd_hash_table_free (&htab->bstab);
6112   _bfd_elf_link_hash_table_free (obfd);
6113 }
6114
6115 /* Implement bfd_elf32_bfd_link_hash_table_create.  */
6116 static struct bfd_link_hash_table *
6117 nios2_elf32_link_hash_table_create (bfd *abfd)
6118 {
6119   struct elf32_nios2_link_hash_table *ret;
6120   bfd_size_type amt = sizeof (struct elf32_nios2_link_hash_table);
6121
6122   ret = bfd_zmalloc (amt);
6123   if (ret == NULL)
6124     return NULL;
6125
6126   if (!_bfd_elf_link_hash_table_init (&ret->root, abfd,
6127                                       link_hash_newfunc,
6128                                       sizeof (struct
6129                                               elf32_nios2_link_hash_entry),
6130                                       NIOS2_ELF_DATA))
6131     {
6132       free (ret);
6133       return NULL;
6134     }
6135
6136   /* Init the stub hash table too.  */
6137   if (!bfd_hash_table_init (&ret->bstab, stub_hash_newfunc,
6138                             sizeof (struct elf32_nios2_stub_hash_entry)))
6139     {
6140       _bfd_elf_link_hash_table_free (abfd);
6141       return NULL;
6142     }
6143   ret->root.root.hash_table_free = nios2_elf32_link_hash_table_free;
6144
6145   return &ret->root.root;
6146 }
6147
6148 /* Implement elf_backend_reloc_type_class.  */
6149 static enum elf_reloc_type_class
6150 nios2_elf32_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED,
6151                               const asection *rel_sec ATTRIBUTE_UNUSED,
6152                               const Elf_Internal_Rela *rela)
6153 {
6154   switch ((int) ELF32_R_TYPE (rela->r_info))
6155     {
6156     case R_NIOS2_RELATIVE:
6157       return reloc_class_relative;
6158     case R_NIOS2_JUMP_SLOT:
6159       return reloc_class_plt;
6160     case R_NIOS2_COPY:
6161       return reloc_class_copy;
6162     default:
6163       return reloc_class_normal;
6164     }
6165 }
6166
6167 /* Return 1 if target is one of ours.  */
6168 static bfd_boolean
6169 is_nios2_elf_target (const struct bfd_target *targ)
6170 {
6171   return (targ == &nios2_elf32_le_vec
6172           || targ == &nios2_elf32_be_vec);
6173 }
6174
6175 /* Implement elf_backend_add_symbol_hook.
6176    This hook is called by the linker when adding symbols from an object
6177    file.  We use it to put .comm items in .sbss, and not .bss.  */
6178 static bfd_boolean
6179 nios2_elf_add_symbol_hook (bfd *abfd,
6180                            struct bfd_link_info *info,
6181                            Elf_Internal_Sym *sym,
6182                            const char **namep ATTRIBUTE_UNUSED,
6183                            flagword *flagsp ATTRIBUTE_UNUSED,
6184                            asection **secp,
6185                            bfd_vma *valp)
6186 {
6187   bfd *dynobj;
6188
6189   if (sym->st_shndx == SHN_COMMON
6190       && !bfd_link_relocatable (info)
6191       && sym->st_size <= elf_gp_size (abfd)
6192       && is_nios2_elf_target (info->output_bfd->xvec))
6193     {
6194       /* Common symbols less than or equal to -G nn bytes are automatically
6195          put into .sbss.  */
6196       struct elf32_nios2_link_hash_table *htab;
6197
6198       htab = elf32_nios2_hash_table (info);
6199       if (htab->sbss == NULL)
6200         {
6201           flagword flags = SEC_IS_COMMON | SEC_LINKER_CREATED;
6202
6203           dynobj = elf_hash_table (info)->dynobj;
6204           if (!dynobj)
6205             dynobj = abfd;
6206
6207           htab->sbss = bfd_make_section_anyway_with_flags (dynobj, ".sbss",
6208                                                            flags);
6209           if (htab->sbss == NULL)
6210             return FALSE;
6211         }
6212
6213       *secp = htab->sbss;
6214       *valp = sym->st_size;
6215     }
6216
6217   return TRUE;
6218 }
6219
6220 /* Implement elf_backend_can_make_relative_eh_frame:
6221    Decide whether to attempt to turn absptr or lsda encodings in
6222    shared libraries into pcrel within the given input section.  */
6223 static bfd_boolean
6224 nios2_elf32_can_make_relative_eh_frame (bfd *input_bfd ATTRIBUTE_UNUSED,
6225                                         struct bfd_link_info *info
6226                                         ATTRIBUTE_UNUSED,
6227                                         asection *eh_frame_section
6228                                         ATTRIBUTE_UNUSED)
6229 {
6230   /* We can't use PC-relative encodings in the .eh_frame section.  */
6231   return FALSE;
6232 }
6233
6234 /* Implement elf_backend_special_sections.  */
6235 const struct bfd_elf_special_section elf32_nios2_special_sections[] =
6236 {
6237   { STRING_COMMA_LEN (".sbss"),  -2, SHT_NOBITS,
6238     SHF_ALLOC + SHF_WRITE + SHF_NIOS2_GPREL },
6239   { STRING_COMMA_LEN (".sdata"), -2, SHT_PROGBITS,
6240     SHF_ALLOC + SHF_WRITE + SHF_NIOS2_GPREL },
6241   { NULL,                     0,  0, 0,              0 }
6242 };
6243
6244 #define ELF_ARCH                        bfd_arch_nios2
6245 #define ELF_TARGET_ID                   NIOS2_ELF_DATA
6246 #define ELF_MACHINE_CODE                EM_ALTERA_NIOS2
6247
6248 /* The Nios II MMU uses a 4K page size.  */
6249
6250 #define ELF_MAXPAGESIZE                 0x1000
6251
6252 #define bfd_elf32_bfd_link_hash_table_create \
6253                                           nios2_elf32_link_hash_table_create
6254
6255 #define bfd_elf32_bfd_merge_private_bfd_data \
6256                                           nios2_elf32_merge_private_bfd_data
6257
6258 /* Relocation table lookup macros.  */
6259
6260 #define bfd_elf32_bfd_reloc_type_lookup   nios2_elf32_bfd_reloc_type_lookup
6261 #define bfd_elf32_bfd_reloc_name_lookup   nios2_elf32_bfd_reloc_name_lookup
6262
6263 /* JUMP_TABLE_LINK macros.  */
6264
6265 /* elf_info_to_howto (using RELA relocations).  */
6266
6267 #define elf_info_to_howto                 nios2_elf32_info_to_howto
6268
6269 /* elf backend functions.  */
6270
6271 #define elf_backend_can_gc_sections     1
6272 #define elf_backend_can_refcount        1
6273 #define elf_backend_plt_readonly        1
6274 #define elf_backend_want_got_plt        1
6275 #define elf_backend_rela_normal         1
6276
6277 #define elf_backend_relocate_section      nios2_elf32_relocate_section
6278 #define elf_backend_section_flags         nios2_elf32_section_flags
6279 #define elf_backend_fake_sections         nios2_elf32_fake_sections
6280 #define elf_backend_check_relocs          nios2_elf32_check_relocs
6281
6282 #define elf_backend_gc_mark_hook          nios2_elf32_gc_mark_hook
6283 #define elf_backend_gc_sweep_hook         nios2_elf32_gc_sweep_hook
6284 #define elf_backend_create_dynamic_sections \
6285                                           nios2_elf32_create_dynamic_sections
6286 #define elf_backend_finish_dynamic_symbol nios2_elf32_finish_dynamic_symbol
6287 #define elf_backend_finish_dynamic_sections \
6288                                           nios2_elf32_finish_dynamic_sections
6289 #define elf_backend_adjust_dynamic_symbol nios2_elf32_adjust_dynamic_symbol
6290 #define elf_backend_reloc_type_class      nios2_elf32_reloc_type_class
6291 #define elf_backend_size_dynamic_sections nios2_elf32_size_dynamic_sections
6292 #define elf_backend_add_symbol_hook       nios2_elf_add_symbol_hook
6293 #define elf_backend_copy_indirect_symbol  nios2_elf32_copy_indirect_symbol
6294 #define elf_backend_object_p              nios2_elf32_object_p
6295
6296 #define elf_backend_grok_prstatus         nios2_grok_prstatus
6297 #define elf_backend_grok_psinfo           nios2_grok_psinfo
6298
6299 #undef elf_backend_can_make_relative_eh_frame
6300 #define elf_backend_can_make_relative_eh_frame \
6301                                           nios2_elf32_can_make_relative_eh_frame
6302
6303 #define elf_backend_special_sections      elf32_nios2_special_sections
6304
6305 #define TARGET_LITTLE_SYM               nios2_elf32_le_vec
6306 #define TARGET_LITTLE_NAME              "elf32-littlenios2"
6307 #define TARGET_BIG_SYM                  nios2_elf32_be_vec
6308 #define TARGET_BIG_NAME                 "elf32-bignios2"
6309
6310 #define elf_backend_got_header_size     12
6311 #define elf_backend_default_execstack   0
6312
6313 #include "elf32-target.h"