bfd target vector rationalisation
[external/binutils.git] / bfd / elf32-nios2.c
1 /* 32-bit ELF support for Nios II.
2    Copyright (C) 2012-2014 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 table used for SHT_REL sections.  */
79 static reloc_howto_type elf_nios2_howto_table_rel[] = {
80   /* No relocation.  */
81   HOWTO (R_NIOS2_NONE,          /* type */
82          0,                     /* rightshift */
83          0,                     /* size (0 = byte, 1 = short, 2 = long) */
84          0,                     /* bitsize */
85          FALSE,                 /* pc_relative */
86          0,                     /* bitpos */
87          complain_overflow_dont,        /* complain_on_overflow */
88          bfd_elf_generic_reloc, /* special_function */
89          "R_NIOS2_NONE",        /* name */
90          FALSE,                 /* partial_inplace */
91          0,                     /* src_mask */
92          0,                     /* dst_mask */
93          FALSE),                /* pcrel_offset */
94
95   /* 16-bit signed immediate relocation.  */
96   HOWTO (R_NIOS2_S16,           /* type */
97          0,                     /* rightshift */
98          2,                     /* size (0 = byte, 1 = short, 2 = long) */
99          16,                    /* bitsize */
100          FALSE,                 /* pc_relative */
101          6,                     /* bitpos */
102          complain_overflow_signed,      /* complain on overflow */
103          bfd_elf_generic_reloc, /* special function */
104          "R_NIOS2_S16",         /* name */
105          FALSE,                 /* partial_inplace */
106          0x003fffc0,            /* src_mask */
107          0x003fffc0,            /* dest_mask */
108          FALSE),                /* pcrel_offset */
109
110   /* 16-bit unsigned immediate relocation.  */
111   HOWTO (R_NIOS2_U16,           /* type */
112          0,                     /* rightshift */
113          2,                     /* size (0 = byte, 1 = short, 2 = long) */
114          16,                    /* bitsize */
115          FALSE,                 /* pc_relative */
116          6,                     /* bitpos */
117          complain_overflow_unsigned,    /* complain on overflow */
118          bfd_elf_generic_reloc, /* special function */
119          "R_NIOS2_U16",         /* name */
120          FALSE,                 /* partial_inplace */
121          0x003fffc0,            /* src_mask */
122          0x003fffc0,            /* dest_mask */
123          FALSE),                /* pcrel_offset */
124
125   HOWTO (R_NIOS2_PCREL16,       /* type */
126          0,                     /* rightshift */
127          2,                     /* size (0 = byte, 1 = short, 2 = long) */
128          16,                    /* bitsize */
129          TRUE,                  /* pc_relative */
130          6,                     /* bitpos */
131          complain_overflow_signed,      /* complain on overflow */
132          nios2_elf32_pcrel16_relocate,  /* special function */
133          "R_NIOS2_PCREL16",     /* name */
134          FALSE,                 /* partial_inplace */
135          0x003fffc0,            /* src_mask */
136          0x003fffc0,            /* dest_mask */
137          TRUE),                 /* pcrel_offset */
138
139   HOWTO (R_NIOS2_CALL26,        /* type */
140          2,                     /* rightshift */
141          2,                     /* size (0 = byte, 1 = short, 2 = long) */
142          26,                    /* bitsize */
143          FALSE,                 /* pc_relative */
144          6,                     /* bitpos */
145          complain_overflow_dont,        /* complain on overflow */
146          nios2_elf32_call26_relocate,   /* special function */
147          "R_NIOS2_CALL26",      /* name */
148          FALSE,                 /* partial_inplace */
149          0xffffffc0,            /* src_mask */
150          0xffffffc0,            /* dst_mask */
151          FALSE),                /* pcrel_offset */
152
153   HOWTO (R_NIOS2_IMM5,
154          0,
155          2,
156          5,
157          FALSE,
158          6,
159          complain_overflow_bitfield,
160          bfd_elf_generic_reloc,
161          "R_NIOS2_IMM5",
162          FALSE,
163          0x000007c0,
164          0x000007c0,
165          FALSE),
166
167   HOWTO (R_NIOS2_CACHE_OPX,
168          0,
169          2,
170          5,
171          FALSE,
172          22,
173          complain_overflow_bitfield,
174          bfd_elf_generic_reloc,
175          "R_NIOS2_CACHE_OPX",
176          FALSE,
177          0x07c00000,
178          0x07c00000,
179          FALSE),
180
181   HOWTO (R_NIOS2_IMM6,
182          0,
183          2,
184          6,
185          FALSE,
186          6,
187          complain_overflow_bitfield,
188          bfd_elf_generic_reloc,
189          "R_NIOS2_IMM6",
190          FALSE,
191          0x00000fc0,
192          0x00000fc0,
193          FALSE),
194
195   HOWTO (R_NIOS2_IMM8,
196          0,
197          2,
198          8,
199          FALSE,
200          6,
201          complain_overflow_bitfield,
202          bfd_elf_generic_reloc,
203          "R_NIOS2_IMM8",
204          FALSE,
205          0x00003fc0,
206          0x00003fc0,
207          FALSE),
208
209   HOWTO (R_NIOS2_HI16,
210          0,
211          2,
212          32,
213          FALSE,
214          6,
215          complain_overflow_dont,
216          nios2_elf32_hi16_relocate,
217          "R_NIOS2_HI16",
218          FALSE,
219          0x003fffc0,
220          0x003fffc0,
221          FALSE),
222
223   HOWTO (R_NIOS2_LO16,
224          0,
225          2,
226          32,
227          FALSE,
228          6,
229          complain_overflow_dont,
230          nios2_elf32_lo16_relocate,
231          "R_NIOS2_LO16",
232          FALSE,
233          0x003fffc0,
234          0x003fffc0,
235          FALSE),
236
237   HOWTO (R_NIOS2_HIADJ16,
238          0,
239          2,
240          32,
241          FALSE,
242          6,
243          complain_overflow_dont,
244          nios2_elf32_hiadj16_relocate,
245          "R_NIOS2_HIADJ16",
246          FALSE,
247          0x003fffc0,
248          0x003fffc0,
249          FALSE),
250
251   HOWTO (R_NIOS2_BFD_RELOC_32,
252          0,
253          2,                     /* long */
254          32,
255          FALSE,
256          0,
257          complain_overflow_dont,
258          bfd_elf_generic_reloc,
259          "R_NIOS2_BFD_RELOC32",
260          FALSE,
261          0xffffffff,
262          0xffffffff,
263          FALSE),
264
265   HOWTO (R_NIOS2_BFD_RELOC_16,
266          0,
267          1,                     /* short */
268          16,
269          FALSE,
270          0,
271          complain_overflow_bitfield,
272          bfd_elf_generic_reloc,
273          "R_NIOS2_BFD_RELOC16",
274          FALSE,
275          0x0000ffff,
276          0x0000ffff,
277          FALSE),
278
279   HOWTO (R_NIOS2_BFD_RELOC_8,
280          0,
281          0,                     /* byte */
282          8,
283          FALSE,
284          0,
285          complain_overflow_bitfield,
286          bfd_elf_generic_reloc,
287          "R_NIOS2_BFD_RELOC8",
288          FALSE,
289          0x000000ff,
290          0x000000ff,
291          FALSE),
292
293   HOWTO (R_NIOS2_GPREL,
294          0,
295          2,
296          32,
297          FALSE,
298          6,
299          complain_overflow_dont,
300          nios2_elf32_gprel_relocate,
301          "R_NIOS2_GPREL",
302          FALSE,
303          0x003fffc0,
304          0x003fffc0,
305          FALSE),
306
307   HOWTO (R_NIOS2_GNU_VTINHERIT,
308          0,
309          2,                     /* short */
310          0,
311          FALSE,
312          0,
313          complain_overflow_dont,
314          NULL,
315          "R_NIOS2_GNU_VTINHERIT",
316          FALSE,
317          0,
318          0,
319          FALSE),
320
321   HOWTO (R_NIOS2_GNU_VTENTRY,
322          0,
323          2,                     /* byte */
324          0,
325          FALSE,
326          0,
327          complain_overflow_dont,
328          _bfd_elf_rel_vtable_reloc_fn,
329          "R_NIOS2_GNU_VTENTRY",
330          FALSE,
331          0,
332          0,
333          FALSE),
334
335   HOWTO (R_NIOS2_UJMP,
336          0,
337          2,
338          32,
339          FALSE,
340          6,
341          complain_overflow_dont,
342          nios2_elf32_ujmp_relocate,
343          "R_NIOS2_UJMP",
344          FALSE,
345          0x003fffc0,
346          0x003fffc0,
347          FALSE),
348
349   HOWTO (R_NIOS2_CJMP,
350          0,
351          2,
352          32,
353          FALSE,
354          6,
355          complain_overflow_dont,
356          nios2_elf32_cjmp_relocate,
357          "R_NIOS2_CJMP",
358          FALSE,
359          0x003fffc0,
360          0x003fffc0,
361          FALSE),
362
363   HOWTO (R_NIOS2_CALLR,
364          0,
365          2,
366          32,
367          FALSE,
368          6,
369          complain_overflow_dont,
370          nios2_elf32_callr_relocate,
371          "R_NIOS2_CALLR",
372          FALSE,
373          0x003fffc0,
374          0x003fffc0,
375          FALSE),
376
377   HOWTO (R_NIOS2_ALIGN,
378          0,
379          2,
380          0,
381          FALSE,
382          0,
383          complain_overflow_dont,
384          nios2_elf32_ignore_reloc,
385          "R_NIOS2_ALIGN",
386          FALSE,
387          0,
388          0,
389          TRUE),
390
391
392   HOWTO (R_NIOS2_GOT16,
393          0,
394          2,
395          16,
396          FALSE,
397          6,
398          complain_overflow_bitfield,
399          bfd_elf_generic_reloc,
400          "R_NIOS2_GOT16",
401          FALSE,
402          0x003fffc0,
403          0x003fffc0,
404          FALSE),
405
406   HOWTO (R_NIOS2_CALL16,
407          0,
408          2,
409          16,
410          FALSE,
411          6,
412          complain_overflow_bitfield,
413          bfd_elf_generic_reloc,
414          "R_NIOS2_CALL16",
415          FALSE,
416          0x003fffc0,
417          0x003fffc0,
418          FALSE),
419
420   HOWTO (R_NIOS2_GOTOFF_LO,
421          0,
422          2,
423          16,
424          FALSE,
425          6,
426          complain_overflow_dont,
427          bfd_elf_generic_reloc,
428          "R_NIOS2_GOTOFF_LO",
429          FALSE,
430          0x003fffc0,
431          0x003fffc0,
432          FALSE),
433
434   HOWTO (R_NIOS2_GOTOFF_HA,
435          0,
436          2,
437          16,
438          FALSE,
439          6,
440          complain_overflow_dont,
441          bfd_elf_generic_reloc,
442          "R_NIOS2_GOTOFF_HA",
443          FALSE,
444          0x003fffc0,
445          0x003fffc0,
446          FALSE),
447
448   HOWTO (R_NIOS2_PCREL_LO,
449          0,
450          2,
451          16,
452          TRUE,
453          6,
454          complain_overflow_dont,
455          nios2_elf32_pcrel_lo16_relocate,
456          "R_NIOS2_PCREL_LO",
457          FALSE,
458          0x003fffc0,
459          0x003fffc0,
460          TRUE),
461
462   HOWTO (R_NIOS2_PCREL_HA,
463          0,
464          2,
465          16,
466          FALSE, /* This is a PC-relative relocation, but we need to subtract
467                    PC ourselves before the HIADJ.  */
468          6,
469          complain_overflow_dont,
470          nios2_elf32_pcrel_hiadj16_relocate,
471          "R_NIOS2_PCREL_HA",
472          FALSE,
473          0x003fffc0,
474          0x003fffc0,
475          TRUE),
476
477   HOWTO (R_NIOS2_TLS_GD16,
478          0,
479          2,
480          16,
481          FALSE,
482          6,
483          complain_overflow_bitfield,
484          bfd_elf_generic_reloc,
485          "R_NIOS2_TLS_GD16",
486          FALSE,
487          0x003fffc0,
488          0x003fffc0,
489          FALSE),
490
491   HOWTO (R_NIOS2_TLS_LDM16,
492          0,
493          2,
494          16,
495          FALSE,
496          6,
497          complain_overflow_bitfield,
498          bfd_elf_generic_reloc,
499          "R_NIOS2_TLS_LDM16",
500          FALSE,
501          0x003fffc0,
502          0x003fffc0,
503          FALSE),
504
505   HOWTO (R_NIOS2_TLS_LDO16,
506          0,
507          2,
508          16,
509          FALSE,
510          6,
511          complain_overflow_bitfield,
512          bfd_elf_generic_reloc,
513          "R_NIOS2_TLS_LDO16",
514          FALSE,
515          0x003fffc0,
516          0x003fffc0,
517          FALSE),
518
519   HOWTO (R_NIOS2_TLS_IE16,
520          0,
521          2,
522          16,
523          FALSE,
524          6,
525          complain_overflow_bitfield,
526          bfd_elf_generic_reloc,
527          "R_NIOS2_TLS_IE16",
528          FALSE,
529          0x003fffc0,
530          0x003fffc0,
531          FALSE),
532
533   HOWTO (R_NIOS2_TLS_LE16,
534          0,
535          2,
536          16,
537          FALSE,
538          6,
539          complain_overflow_bitfield,
540          bfd_elf_generic_reloc,
541          "R_NIOS2_TLS_LE16",
542          FALSE,
543          0x003fffc0,
544          0x003fffc0,
545          FALSE),
546
547   HOWTO (R_NIOS2_TLS_DTPMOD,
548          0,
549          2,
550          32,
551          FALSE,
552          0,
553          complain_overflow_dont,
554          bfd_elf_generic_reloc,
555          "R_NIOS2_TLS_DTPMOD",
556          FALSE,
557          0xffffffff,
558          0xffffffff,
559          FALSE),
560
561   HOWTO (R_NIOS2_TLS_DTPREL,
562          0,
563          2,
564          32,
565          FALSE,
566          0,
567          complain_overflow_dont,
568          bfd_elf_generic_reloc,
569          "R_NIOS2_TLS_DTPREL",
570          FALSE,
571          0xffffffff,
572          0xffffffff,
573          FALSE),
574
575   HOWTO (R_NIOS2_TLS_TPREL,
576          0,
577          2,
578          32,
579          FALSE,
580          0,
581          complain_overflow_dont,
582          bfd_elf_generic_reloc,
583          "R_NIOS2_TLS_TPREL",
584          FALSE,
585          0xffffffff,
586          0xffffffff,
587          FALSE),
588
589   HOWTO (R_NIOS2_COPY,
590          0,
591          2,
592          32,
593          FALSE,
594          0,
595          complain_overflow_dont,
596          bfd_elf_generic_reloc,
597          "R_NIOS2_COPY",
598          FALSE,
599          0,
600          0,
601          FALSE),
602
603   HOWTO (R_NIOS2_GLOB_DAT,
604          0,
605          2,
606          32,
607          FALSE,
608          0,
609          complain_overflow_dont,
610          bfd_elf_generic_reloc,
611          "R_NIOS2_GLOB_DAT",
612          FALSE,
613          0xffffffff,
614          0xffffffff,
615          FALSE),
616
617   HOWTO (R_NIOS2_JUMP_SLOT,
618          0,
619          2,
620          32,
621          FALSE,
622          0,
623          complain_overflow_dont,
624          bfd_elf_generic_reloc,
625          "R_NIOS2_JUMP_SLOT",
626          FALSE,
627          0xffffffff,
628          0xffffffff,
629          FALSE),
630
631   HOWTO (R_NIOS2_RELATIVE,
632          0,
633          2,
634          32,
635          FALSE,
636          0,
637          complain_overflow_dont,
638          bfd_elf_generic_reloc,
639          "R_NIOS2_RELATIVE",
640          FALSE,
641          0xffffffff,
642          0xffffffff,
643          FALSE),
644
645   HOWTO (R_NIOS2_GOTOFF,
646          0,
647          2,
648          32,
649          FALSE,
650          0,
651          complain_overflow_dont,
652          bfd_elf_generic_reloc,
653          "R_NIOS2_GOTOFF",
654          FALSE,
655          0xffffffff,
656          0xffffffff,
657          FALSE),
658
659   HOWTO (R_NIOS2_CALL26_NOAT,   /* type */
660          2,                     /* rightshift */
661          2,                     /* size (0 = byte, 1 = short, 2 = long) */
662          26,                    /* bitsize */
663          FALSE,                 /* pc_relative */
664          6,                     /* bitpos */
665          complain_overflow_dont,        /* complain on overflow */
666          nios2_elf32_call26_relocate,   /* special function */
667          "R_NIOS2_CALL26_NOAT", /* name */
668          FALSE,                 /* partial_inplace */
669          0xffffffc0,            /* src_mask */
670          0xffffffc0,            /* dst_mask */
671          FALSE),                /* pcrel_offset */
672
673   HOWTO (R_NIOS2_GOT_LO,
674          0,
675          2,
676          16,
677          FALSE,
678          6,
679          complain_overflow_dont,
680          bfd_elf_generic_reloc,
681          "R_NIOS2_GOT_LO",
682          FALSE,
683          0x003fffc0,
684          0x003fffc0,
685          FALSE),
686
687   HOWTO (R_NIOS2_GOT_HA,
688          0,
689          2,
690          16,
691          FALSE,
692          6,
693          complain_overflow_dont,
694          bfd_elf_generic_reloc,
695          "R_NIOS2_GOT_HA",
696          FALSE,
697          0x003fffc0,
698          0x003fffc0,
699          FALSE),
700
701   HOWTO (R_NIOS2_CALL_LO,
702          0,
703          2,
704          16,
705          FALSE,
706          6,
707          complain_overflow_dont,
708          bfd_elf_generic_reloc,
709          "R_NIOS2_CALL_LO",
710          FALSE,
711          0x003fffc0,
712          0x003fffc0,
713          FALSE),
714
715   HOWTO (R_NIOS2_CALL_HA,
716          0,
717          2,
718          16,
719          FALSE,
720          6,
721          complain_overflow_dont,
722          bfd_elf_generic_reloc,
723          "R_NIOS2_CALL_HA",
724          FALSE,
725          0x003fffc0,
726          0x003fffc0,
727          FALSE),
728
729 /* Add other relocations here.  */
730 };
731
732 static unsigned char elf_code_to_howto_index[R_NIOS2_ILLEGAL + 1];
733
734 /* Return the howto for relocation RTYPE.  */
735 static reloc_howto_type *
736 lookup_howto (unsigned int rtype)
737 {
738   static int initialized = 0;
739   int i;
740   int howto_tbl_size = (int) (sizeof (elf_nios2_howto_table_rel)
741                               / sizeof (elf_nios2_howto_table_rel[0]));
742
743   if (!initialized)
744     {
745       initialized = 1;
746       memset (elf_code_to_howto_index, 0xff,
747               sizeof (elf_code_to_howto_index));
748       for (i = 0; i < howto_tbl_size; i++)
749         elf_code_to_howto_index[elf_nios2_howto_table_rel[i].type] = i;
750     }
751
752   BFD_ASSERT (rtype <= R_NIOS2_ILLEGAL);
753   i = elf_code_to_howto_index[rtype];
754   if (i >= howto_tbl_size)
755     return 0;
756   return elf_nios2_howto_table_rel + i;
757 }
758
759 /* Map for converting BFD reloc types to Nios II reloc types.  */
760 struct elf_reloc_map
761 {
762   bfd_reloc_code_real_type bfd_val;
763   enum elf_nios2_reloc_type elf_val;
764 };
765
766 static const struct elf_reloc_map nios2_reloc_map[] = {
767   {BFD_RELOC_NIOS2_S16, R_NIOS2_S16},
768   {BFD_RELOC_NIOS2_U16, R_NIOS2_U16},
769   {BFD_RELOC_16_PCREL, R_NIOS2_PCREL16},
770   {BFD_RELOC_NIOS2_CALL26, R_NIOS2_CALL26},
771   {BFD_RELOC_NIOS2_IMM5, R_NIOS2_IMM5},
772   {BFD_RELOC_NIOS2_CACHE_OPX, R_NIOS2_CACHE_OPX},
773   {BFD_RELOC_NIOS2_IMM6, R_NIOS2_IMM6},
774   {BFD_RELOC_NIOS2_IMM8, R_NIOS2_IMM8},
775   {BFD_RELOC_NIOS2_HI16, R_NIOS2_HI16},
776   {BFD_RELOC_NIOS2_LO16, R_NIOS2_LO16},
777   {BFD_RELOC_NIOS2_HIADJ16, R_NIOS2_HIADJ16},
778   {BFD_RELOC_32, R_NIOS2_BFD_RELOC_32},
779   {BFD_RELOC_16, R_NIOS2_BFD_RELOC_16},
780   {BFD_RELOC_8, R_NIOS2_BFD_RELOC_8},
781   {BFD_RELOC_NIOS2_GPREL, R_NIOS2_GPREL},
782   {BFD_RELOC_VTABLE_INHERIT, R_NIOS2_GNU_VTINHERIT},
783   {BFD_RELOC_VTABLE_ENTRY, R_NIOS2_GNU_VTENTRY},
784   {BFD_RELOC_NIOS2_UJMP, R_NIOS2_UJMP},
785   {BFD_RELOC_NIOS2_CJMP, R_NIOS2_CJMP},
786   {BFD_RELOC_NIOS2_CALLR, R_NIOS2_CALLR},
787   {BFD_RELOC_NIOS2_ALIGN, R_NIOS2_ALIGN},
788   {BFD_RELOC_NIOS2_GOT16, R_NIOS2_GOT16},
789   {BFD_RELOC_NIOS2_CALL16, R_NIOS2_CALL16},
790   {BFD_RELOC_NIOS2_GOTOFF_LO, R_NIOS2_GOTOFF_LO},
791   {BFD_RELOC_NIOS2_GOTOFF_HA, R_NIOS2_GOTOFF_HA},
792   {BFD_RELOC_NIOS2_PCREL_LO, R_NIOS2_PCREL_LO},
793   {BFD_RELOC_NIOS2_PCREL_HA, R_NIOS2_PCREL_HA},
794   {BFD_RELOC_NIOS2_TLS_GD16, R_NIOS2_TLS_GD16},
795   {BFD_RELOC_NIOS2_TLS_LDM16, R_NIOS2_TLS_LDM16},
796   {BFD_RELOC_NIOS2_TLS_LDO16, R_NIOS2_TLS_LDO16},
797   {BFD_RELOC_NIOS2_TLS_IE16, R_NIOS2_TLS_IE16},
798   {BFD_RELOC_NIOS2_TLS_LE16, R_NIOS2_TLS_LE16},
799   {BFD_RELOC_NIOS2_TLS_DTPMOD, R_NIOS2_TLS_DTPMOD},
800   {BFD_RELOC_NIOS2_TLS_DTPREL, R_NIOS2_TLS_DTPREL},
801   {BFD_RELOC_NIOS2_TLS_TPREL, R_NIOS2_TLS_TPREL},
802   {BFD_RELOC_NIOS2_COPY, R_NIOS2_COPY},
803   {BFD_RELOC_NIOS2_GLOB_DAT, R_NIOS2_GLOB_DAT},
804   {BFD_RELOC_NIOS2_JUMP_SLOT, R_NIOS2_JUMP_SLOT},
805   {BFD_RELOC_NIOS2_RELATIVE, R_NIOS2_RELATIVE},
806   {BFD_RELOC_NIOS2_GOTOFF, R_NIOS2_GOTOFF},
807   {BFD_RELOC_NIOS2_CALL26_NOAT, R_NIOS2_CALL26_NOAT},
808   {BFD_RELOC_NIOS2_GOT_LO, R_NIOS2_GOT_LO},
809   {BFD_RELOC_NIOS2_GOT_HA, R_NIOS2_GOT_HA},
810   {BFD_RELOC_NIOS2_CALL_LO, R_NIOS2_CALL_LO},
811   {BFD_RELOC_NIOS2_CALL_HA, R_NIOS2_CALL_HA},
812 };
813
814 enum elf32_nios2_stub_type
815 {
816   nios2_stub_call26_before,
817   nios2_stub_call26_after,
818   nios2_stub_none
819 };
820
821 struct elf32_nios2_stub_hash_entry
822 {
823   /* Base hash table entry structure.  */
824   struct bfd_hash_entry bh_root;
825
826   /* The stub section.  */
827   asection *stub_sec;
828
829   /* Offset within stub_sec of the beginning of this stub.  */
830   bfd_vma stub_offset;
831
832   /* Given the symbol's value and its section we can determine its final
833      value when building the stubs (so the stub knows where to jump.  */
834   bfd_vma target_value;
835   asection *target_section;
836
837   enum elf32_nios2_stub_type stub_type;
838
839   /* The symbol table entry, if any, that this was derived from.  */
840   struct elf32_nios2_link_hash_entry *hh;
841
842   /* And the reloc addend that this was derived from.  */
843   bfd_vma addend;
844
845   /* Where this stub is being called from, or, in the case of combined
846      stub sections, the first input section in the group.  */
847   asection *id_sec;
848 };
849
850 #define nios2_stub_hash_entry(ent) \
851   ((struct elf32_nios2_stub_hash_entry *)(ent))
852
853 #define nios2_stub_hash_lookup(table, string, create, copy) \
854   ((struct elf32_nios2_stub_hash_entry *) \
855    bfd_hash_lookup ((table), (string), (create), (copy)))
856
857
858 /* The Nios II linker needs to keep track of the number of relocs that it
859    decides to copy as dynamic relocs in check_relocs for each symbol.
860    This is so that it can later discard them if they are found to be
861    unnecessary.  We store the information in a field extending the
862    regular ELF linker hash table.  */
863
864 struct elf32_nios2_dyn_relocs
865 {
866   struct elf32_nios2_dyn_relocs *next;
867
868   /* The input section of the reloc.  */
869   asection *sec;
870
871   /* Total number of relocs copied for the input section.  */
872   bfd_size_type count;
873
874   /* Number of pc-relative relocs copied for the input section.  */
875   bfd_size_type pc_count;
876 };
877
878 /* Nios II ELF linker hash entry.  */
879
880 struct elf32_nios2_link_hash_entry
881 {
882   struct elf_link_hash_entry root;
883
884   /* A pointer to the most recently used stub hash entry against this
885      symbol.  */
886   struct elf32_nios2_stub_hash_entry *hsh_cache;
887
888   /* Track dynamic relocs copied for this symbol.  */
889   struct elf32_nios2_dyn_relocs *dyn_relocs;
890
891 #define GOT_UNKNOWN     0
892 #define GOT_NORMAL      1
893 #define GOT_TLS_GD      2
894 #define GOT_TLS_IE      4
895   unsigned char tls_type;
896
897   /* We need to detect and take special action for symbols which are only
898      referenced with %call() and not with %got().  Such symbols do not need
899      a dynamic GOT reloc in shared objects, only a dynamic PLT reloc.  Lazy
900      linking will not work if the dynamic GOT reloc exists.
901      To check for this condition efficiently, we compare got_types_used against
902      CALL_USED, meaning
903      (got_types_used & (GOT_USED | CALL_USED)) == CALL_USED.
904   */
905 #define GOT_USED        1
906 #define CALL_USED       2
907   unsigned char got_types_used;
908 };
909
910 #define elf32_nios2_hash_entry(ent) \
911   ((struct elf32_nios2_link_hash_entry *) (ent))
912
913 /* Get the Nios II elf linker hash table from a link_info structure.  */
914 #define elf32_nios2_hash_table(info) \
915   ((struct elf32_nios2_link_hash_table *) ((info)->hash))
916
917 /* Nios II ELF linker hash table.  */
918 struct elf32_nios2_link_hash_table
919   {
920     /* The main hash table.  */
921     struct elf_link_hash_table root;
922
923     /* The stub hash table.  */
924     struct bfd_hash_table bstab;
925
926     /* Linker stub bfd.  */
927     bfd *stub_bfd;
928
929     /* Linker call-backs.  */
930     asection * (*add_stub_section) (const char *, asection *, bfd_boolean);
931     void (*layout_sections_again) (void);
932
933     /* Array to keep track of which stub sections have been created, and
934        information on stub grouping.  */
935     struct map_stub
936     {
937       /* These are the section to which stubs in the group will be
938          attached.  */
939       asection *first_sec, *last_sec;
940       /* The stub sections.  There might be stubs inserted either before
941          or after the real section.*/
942       asection *first_stub_sec, *last_stub_sec;
943     } *stub_group;
944
945     /* Assorted information used by nios2_elf32_size_stubs.  */
946     unsigned int bfd_count;
947     int top_index;
948     asection **input_list;
949     Elf_Internal_Sym **all_local_syms;
950
951     /* Short-cuts to get to dynamic linker sections.  */
952     asection *sdynbss;
953     asection *srelbss;
954     asection *sbss;
955
956     /* GOT pointer symbol _gp_got.  */
957     struct elf_link_hash_entry *h_gp_got;
958
959     union {
960       bfd_signed_vma refcount;
961       bfd_vma offset;
962     } tls_ldm_got;
963
964     /* Small local sym cache.  */
965     struct sym_cache sym_cache;
966
967     bfd_vma res_n_size;
968   };
969
970 struct nios2_elf32_obj_tdata
971 {
972   struct elf_obj_tdata root;
973
974   /* tls_type for each local got entry.  */
975   char *local_got_tls_type;
976
977   /* TRUE if TLS GD relocs have been seen for this object.  */
978   bfd_boolean has_tlsgd;
979 };
980
981 #define elf32_nios2_tdata(abfd) \
982   ((struct nios2_elf32_obj_tdata *) (abfd)->tdata.any)
983
984 #define elf32_nios2_local_got_tls_type(abfd) \
985   (elf32_nios2_tdata (abfd)->local_got_tls_type)
986
987 /* The name of the dynamic interpreter.  This is put in the .interp
988    section.  */
989 #define ELF_DYNAMIC_INTERPRETER "/lib/ld.so.1"
990
991 /* PLT implementation for position-dependent code.  */
992 static const bfd_vma nios2_plt_entry[] = { /* .PLTn: */
993   0x03c00034,   /* movhi r15, %hiadj(plt_got_slot_address) */
994   0x7bc00017,   /* ldw r15, %lo(plt_got_slot_address)(r15) */
995   0x7800683a    /* jmp r15 */
996 };
997
998 static const bfd_vma nios2_plt0_entry[] = { /* .PLTresolve */
999   0x03800034,   /* movhi r14, %hiadj(res_0) */
1000   0x73800004,   /* addi r14, r14, %lo(res_0) */
1001   0x7b9fc83a,   /* sub r15, r15, r14 */
1002   0x03400034,   /* movhi r13, %hiadj(_GLOBAL_OFFSET_TABLE_) */
1003   0x6b800017,   /* ldw r14, %lo(_GLOBAL_OFFSET_TABLE_+4)(r13) */
1004   0x6b400017,   /* ldw r13, %lo(_GLOBAL_OFFSET_TABLE_+8)(r13) */
1005   0x6800683a    /* jmp r13 */
1006 };
1007
1008 /* PLT implementation for position-independent code.  */
1009 static const bfd_vma nios2_so_plt_entry[] = { /* .PLTn */
1010   0x03c00034,   /* movhi r15, %hiadj(index * 4) */
1011   0x7bc00004,   /* addi r15, r15, %lo(index * 4) */
1012   0x00000006    /* br .PLTresolve */
1013 };
1014
1015 static const bfd_vma nios2_so_plt0_entry[] = { /* .PLTresolve */
1016   0x001ce03a,   /* nextpc r14 */
1017   0x03400034,   /* movhi r13, %hiadj(_GLOBAL_OFFSET_TABLE_) */
1018   0x6b9b883a,   /* add r13, r13, r14 */
1019   0x6b800017,   /* ldw r14, %lo(_GLOBAL_OFFSET_TABLE_+4)(r13) */
1020   0x6b400017,   /* ldw r13, %lo(_GLOBAL_OFFSET_TABLE_+8)(r13) */
1021   0x6800683a    /* jmp r13 */
1022 };
1023
1024 /* CALL26 stub.  */
1025 static const bfd_vma nios2_call26_stub_entry[] = {
1026   0x00400034,   /* orhi at, r0, %hiadj(dest) */
1027   0x08400004,   /* addi at, at, %lo(dest) */
1028   0x0800683a    /* jmp at */
1029 };
1030
1031 /* Install 16-bit immediate value VALUE at offset OFFSET into section SEC.  */
1032 static void
1033 nios2_elf32_install_imm16 (asection *sec, bfd_vma offset, bfd_vma value)
1034 {
1035   bfd_vma word = bfd_get_32 (sec->owner, sec->contents + offset);
1036
1037   BFD_ASSERT(value <= 0xffff);
1038
1039   bfd_put_32 (sec->owner, word | ((value & 0xffff) << 6),
1040               sec->contents + offset);
1041 }
1042
1043 /* Install COUNT 32-bit values DATA starting at offset OFFSET into
1044    section SEC. */
1045 static void
1046 nios2_elf32_install_data (asection *sec, const bfd_vma *data, bfd_vma offset,
1047                           int count)
1048 {
1049   while (count--)
1050     {
1051       bfd_put_32 (sec->owner, *data, sec->contents + offset);
1052       offset += 4;
1053       ++data;
1054     }
1055 }
1056
1057 /* The usual way of loading a 32-bit constant into a Nios II register is to
1058    load the high 16 bits in one instruction and then add the low 16 bits with
1059    a signed add. This means that the high halfword needs to be adjusted to
1060    compensate for the sign bit of the low halfword. This function returns the
1061    adjusted high halfword for a given 32-bit constant.  */
1062 static
1063 bfd_vma hiadj (bfd_vma symbol_value)
1064 {
1065   return ((symbol_value + 0x8000) >> 16) & 0xffff;
1066 }
1067
1068 /* Implement elf_backend_grok_prstatus:
1069    Support for core dump NOTE sections.  */
1070 static bfd_boolean
1071 nios2_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
1072 {
1073   int offset;
1074   size_t size;
1075
1076   switch (note->descsz)
1077     {
1078     default:
1079       return FALSE;
1080
1081     case 212:         /* Linux/Nios II */
1082       /* pr_cursig */
1083       elf_tdata (abfd)->core->signal = bfd_get_16 (abfd, note->descdata + 12);
1084
1085       /* pr_pid */
1086       elf_tdata (abfd)->core->pid = bfd_get_32 (abfd, note->descdata + 24);
1087
1088       /* pr_reg */
1089       offset = 72;
1090       size = 136;
1091
1092       break;
1093     }
1094
1095   /* Make a ".reg/999" section.  */
1096   return _bfd_elfcore_make_pseudosection (abfd, ".reg",
1097                                           size, note->descpos + offset);
1098 }
1099
1100 /* Implement elf_backend_grok_psinfo.  */
1101 static bfd_boolean
1102 nios2_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
1103 {
1104   switch (note->descsz)
1105     {
1106     default:
1107       return FALSE;
1108
1109     case 124:         /* Linux/Nios II elf_prpsinfo */
1110       elf_tdata (abfd)->core->program
1111         = _bfd_elfcore_strndup (abfd, note->descdata + 28, 16);
1112       elf_tdata (abfd)->core->command
1113         = _bfd_elfcore_strndup (abfd, note->descdata + 44, 80);
1114     }
1115
1116   /* Note that for some reason, a spurious space is tacked
1117      onto the end of the args in some (at least one anyway)
1118      implementations, so strip it off if it exists.  */
1119
1120   {
1121     char *command = elf_tdata (abfd)->core->command;
1122     int n = strlen (command);
1123
1124     if (0 < n && command[n - 1] == ' ')
1125       command[n - 1] = '\0';
1126   }
1127
1128   return TRUE;
1129 }
1130
1131 /* Assorted hash table functions.  */
1132
1133 /* Initialize an entry in the stub hash table.  */
1134 static struct bfd_hash_entry *
1135 stub_hash_newfunc (struct bfd_hash_entry *entry,
1136                    struct bfd_hash_table *table,
1137                    const char *string)
1138 {
1139   /* Allocate the structure if it has not already been allocated by a
1140      subclass.  */
1141   if (entry == NULL)
1142     {
1143       entry = bfd_hash_allocate (table,
1144                                  sizeof (struct elf32_nios2_stub_hash_entry));
1145       if (entry == NULL)
1146         return entry;
1147     }
1148
1149   /* Call the allocation method of the superclass.  */
1150   entry = bfd_hash_newfunc (entry, table, string);
1151   if (entry != NULL)
1152     {
1153       struct elf32_nios2_stub_hash_entry *hsh;
1154
1155       /* Initialize the local fields.  */
1156       hsh = (struct elf32_nios2_stub_hash_entry *) entry;
1157       hsh->stub_sec = NULL;
1158       hsh->stub_offset = 0;
1159       hsh->target_value = 0;
1160       hsh->target_section = NULL;
1161       hsh->stub_type = nios2_stub_none;
1162       hsh->hh = NULL;
1163       hsh->id_sec = NULL;
1164     }
1165
1166   return entry;
1167 }
1168
1169 /* Create an entry in a Nios II ELF linker hash table.  */
1170 static struct bfd_hash_entry *
1171 link_hash_newfunc (struct bfd_hash_entry *entry,
1172                    struct bfd_hash_table *table, const char *string)
1173 {
1174   /* Allocate the structure if it has not already been allocated by a
1175      subclass.  */
1176   if (entry == NULL)
1177     {
1178       entry = bfd_hash_allocate (table,
1179                                  sizeof (struct elf32_nios2_link_hash_entry));
1180       if (entry == NULL)
1181         return entry;
1182     }
1183
1184   /* Call the allocation method of the superclass.  */
1185   entry = _bfd_elf_link_hash_newfunc (entry, table, string);
1186   if (entry)
1187     {
1188       struct elf32_nios2_link_hash_entry *eh;
1189
1190       eh = (struct elf32_nios2_link_hash_entry *) entry;
1191       eh->hsh_cache = NULL;
1192       eh->dyn_relocs = NULL;
1193       eh->tls_type = GOT_UNKNOWN;
1194       eh->got_types_used = 0;
1195     }
1196
1197   return entry;
1198 }
1199
1200 /* Section name for stubs is the associated section name plus this
1201    string.  */
1202 #define STUB_SUFFIX ".stub"
1203
1204 /* Build a name for an entry in the stub hash table.  */
1205 static char *
1206 nios2_stub_name (const asection *input_section,
1207                  const asection *sym_sec,
1208                  const struct elf32_nios2_link_hash_entry *hh,
1209                  const Elf_Internal_Rela *rel,
1210                  enum elf32_nios2_stub_type stub_type)
1211 {
1212   char *stub_name;
1213   bfd_size_type len;
1214   char stubpos = (stub_type == nios2_stub_call26_before) ? 'b' : 'a';
1215
1216   if (hh)
1217     {
1218       len = 8 + 1 + 1 + 1+ strlen (hh->root.root.root.string) + 1 + 8 + 1;
1219       stub_name = bfd_malloc (len);
1220       if (stub_name != NULL)
1221         {
1222           sprintf (stub_name, "%08x_%c_%s+%x",
1223                    input_section->id & 0xffffffff,
1224                    stubpos,
1225                    hh->root.root.root.string,
1226                    (int) rel->r_addend & 0xffffffff);
1227         }
1228     }
1229   else
1230     {
1231       len = 8 + 1 + 1 + 1+ 8 + 1 + 8 + 1 + 8 + 1;
1232       stub_name = bfd_malloc (len);
1233       if (stub_name != NULL)
1234         {
1235           sprintf (stub_name, "%08x_%c_%x:%x+%x",
1236                    input_section->id & 0xffffffff,
1237                    stubpos,
1238                    sym_sec->id & 0xffffffff,
1239                    (int) ELF32_R_SYM (rel->r_info) & 0xffffffff,
1240                    (int) rel->r_addend & 0xffffffff);
1241         }
1242     }
1243   return stub_name;
1244 }
1245
1246 /* Look up an entry in the stub hash.  Stub entries are cached because
1247    creating the stub name takes a bit of time.  */
1248 static struct elf32_nios2_stub_hash_entry *
1249 nios2_get_stub_entry (const asection *input_section,
1250                       const asection *sym_sec,
1251                       struct elf32_nios2_link_hash_entry *hh,
1252                       const Elf_Internal_Rela *rel,
1253                       struct elf32_nios2_link_hash_table *htab,
1254                       enum elf32_nios2_stub_type stub_type)
1255 {
1256   struct elf32_nios2_stub_hash_entry *hsh;
1257   const asection *id_sec;
1258
1259   /* If this input section is part of a group of sections sharing one
1260      stub section, then use the id of the first/last section in the group,
1261      depending on the stub section placement relative to the group.
1262      Stub names need to include a section id, as there may well be
1263      more than one stub used to reach say, printf, and we need to
1264      distinguish between them.  */
1265   if (stub_type == nios2_stub_call26_before)
1266     id_sec = htab->stub_group[input_section->id].first_sec;
1267   else
1268     id_sec = htab->stub_group[input_section->id].last_sec;
1269
1270   if (hh != NULL && hh->hsh_cache != NULL
1271       && hh->hsh_cache->hh == hh
1272       && hh->hsh_cache->id_sec == id_sec
1273       && hh->hsh_cache->stub_type == stub_type)
1274     {
1275       hsh = hh->hsh_cache;
1276     }
1277   else
1278     {
1279       char *stub_name;
1280
1281       stub_name = nios2_stub_name (id_sec, sym_sec, hh, rel, stub_type);
1282       if (stub_name == NULL)
1283         return NULL;
1284
1285       hsh = nios2_stub_hash_lookup (&htab->bstab,
1286                                     stub_name, FALSE, FALSE);
1287
1288       if (hh != NULL)
1289         hh->hsh_cache = hsh;
1290
1291       free (stub_name);
1292     }
1293
1294   return hsh;
1295 }
1296
1297 /* Add a new stub entry to the stub hash.  Not all fields of the new
1298    stub entry are initialised.  */
1299 static struct elf32_nios2_stub_hash_entry *
1300 nios2_add_stub (const char *stub_name,
1301                 asection *section,
1302                 struct elf32_nios2_link_hash_table *htab,
1303                 enum elf32_nios2_stub_type stub_type)
1304 {
1305   asection *link_sec;
1306   asection *stub_sec;
1307   asection **secptr, **linkptr;
1308   struct elf32_nios2_stub_hash_entry *hsh;
1309   bfd_boolean afterp;
1310
1311   if (stub_type == nios2_stub_call26_before)
1312     {
1313       link_sec = htab->stub_group[section->id].first_sec;
1314       secptr = &(htab->stub_group[section->id].first_stub_sec);
1315       linkptr = &(htab->stub_group[link_sec->id].first_stub_sec);
1316       afterp = FALSE;
1317     }
1318   else
1319     {
1320       link_sec = htab->stub_group[section->id].last_sec;
1321       secptr = &(htab->stub_group[section->id].last_stub_sec);
1322       linkptr = &(htab->stub_group[link_sec->id].last_stub_sec);
1323       afterp = TRUE;
1324     }
1325   stub_sec = *secptr;
1326   if (stub_sec == NULL)
1327     {
1328       stub_sec = *linkptr;
1329       if (stub_sec == NULL)
1330         {
1331           size_t namelen;
1332           bfd_size_type len;
1333           char *s_name;
1334
1335           namelen = strlen (link_sec->name);
1336           len = namelen + sizeof (STUB_SUFFIX);
1337           s_name = bfd_alloc (htab->stub_bfd, len);
1338           if (s_name == NULL)
1339             return NULL;
1340
1341           memcpy (s_name, link_sec->name, namelen);
1342           memcpy (s_name + namelen, STUB_SUFFIX, sizeof (STUB_SUFFIX));
1343
1344           stub_sec = (*htab->add_stub_section) (s_name, link_sec, afterp);
1345           if (stub_sec == NULL)
1346             return NULL;
1347           *linkptr = stub_sec;
1348         }
1349       *secptr = stub_sec;
1350     }
1351
1352   /* Enter this entry into the linker stub hash table.  */
1353   hsh = nios2_stub_hash_lookup (&htab->bstab, stub_name,
1354                                 TRUE, FALSE);
1355   if (hsh == NULL)
1356     {
1357       (*_bfd_error_handler) (_("%B: cannot create stub entry %s"),
1358                              section->owner,
1359                              stub_name);
1360       return NULL;
1361     }
1362
1363   hsh->stub_sec = stub_sec;
1364   hsh->stub_offset = 0;
1365   hsh->id_sec = link_sec;
1366   return hsh;
1367 }
1368
1369 /* Set up various things so that we can make a list of input sections
1370    for each output section included in the link.  Returns -1 on error,
1371    0 when no stubs will be needed, and 1 on success.  */
1372 int
1373 nios2_elf32_setup_section_lists (bfd *output_bfd, struct bfd_link_info *info)
1374 {
1375   bfd *input_bfd;
1376   unsigned int bfd_count;
1377   int top_id, top_index;
1378   asection *section;
1379   asection **input_list, **list;
1380   bfd_size_type amt;
1381   struct elf32_nios2_link_hash_table *htab = elf32_nios2_hash_table (info);
1382
1383   /* Count the number of input BFDs and find the top input section id.  */
1384   for (input_bfd = info->input_bfds, bfd_count = 0, top_id = 0;
1385        input_bfd != NULL;
1386        input_bfd = input_bfd->link_next)
1387     {
1388       bfd_count += 1;
1389       for (section = input_bfd->sections;
1390            section != NULL;
1391            section = section->next)
1392         {
1393           if (top_id < section->id)
1394             top_id = section->id;
1395         }
1396     }
1397
1398   htab->bfd_count = bfd_count;
1399
1400   amt = sizeof (struct map_stub) * (top_id + 1);
1401   htab->stub_group = bfd_zmalloc (amt);
1402   if (htab->stub_group == NULL)
1403     return -1;
1404
1405   /* We can't use output_bfd->section_count here to find the top output
1406      section index as some sections may have been removed, and
1407      strip_excluded_output_sections doesn't renumber the indices.  */
1408   for (section = output_bfd->sections, top_index = 0;
1409        section != NULL;
1410        section = section->next)
1411     {
1412       if (top_index < section->index)
1413         top_index = section->index;
1414     }
1415
1416   htab->top_index = top_index;
1417   amt = sizeof (asection *) * (top_index + 1);
1418   input_list = bfd_malloc (amt);
1419   htab->input_list = input_list;
1420   if (input_list == NULL)
1421     return -1;
1422
1423   /* For sections we aren't interested in, mark their entries with a
1424      value we can check later.  */
1425   list = input_list + top_index;
1426   do
1427     *list = bfd_abs_section_ptr;
1428   while (list-- != input_list);
1429
1430   for (section = output_bfd->sections;
1431        section != NULL;
1432        section = section->next)
1433     {
1434       /* FIXME: This is a bit of hack. Currently our .ctors and .dtors
1435        * have PC relative relocs in them but no code flag set.  */
1436       if (((section->flags & SEC_CODE) != 0) ||
1437           strcmp(".ctors", section->name) ||
1438           strcmp(".dtors", section->name))
1439         input_list[section->index] = NULL;
1440     }
1441
1442   return 1;
1443 }
1444
1445 /* The linker repeatedly calls this function for each input section,
1446    in the order that input sections are linked into output sections.
1447    Build lists of input sections to determine groupings between which
1448    we may insert linker stubs.  */
1449 void
1450 nios2_elf32_next_input_section (struct bfd_link_info *info, asection *isec)
1451 {
1452   struct elf32_nios2_link_hash_table *htab = elf32_nios2_hash_table (info);
1453
1454   if (isec->output_section->index <= htab->top_index)
1455     {
1456       asection **list = htab->input_list + isec->output_section->index;
1457       if (*list != bfd_abs_section_ptr)
1458         {
1459           /* Steal the last_sec pointer for our list.
1460              This happens to make the list in reverse order,
1461              which is what we want.  */
1462           htab->stub_group[isec->id].last_sec = *list;
1463           *list = isec;
1464         }
1465     }
1466 }
1467
1468 /* Segment mask for CALL26 relocation relaxation.  */
1469 #define CALL26_SEGMENT(x) ((x) & 0xf0000000)
1470
1471 /* Fudge factor for approximate maximum size of all stubs that might
1472    be inserted by the linker.  This does not actually limit the number
1473    of stubs that might be inserted, and only affects strategy for grouping
1474    and placement of stubs.  Perhaps this should be computed based on number
1475    of relocations seen, or be specifiable on the command line.  */
1476 #define MAX_STUB_SECTION_SIZE 0xffff
1477
1478 /* See whether we can group stub sections together.  Grouping stub
1479    sections may result in fewer stubs.  More importantly, we need to
1480    put all .init* and .fini* stubs at the end of the .init or
1481    .fini output sections respectively, because glibc splits the
1482    _init and _fini functions into multiple parts.  Putting a stub in
1483    the middle of a function is not a good idea.
1484    Rather than computing groups of a maximum fixed size, for Nios II
1485    CALL26 relaxation it makes more sense to compute the groups based on
1486    sections that fit within a 256MB address segment.  Also do not allow
1487    a group to span more than one output section, since different output
1488    sections might correspond to different memory banks on a bare-metal
1489    target, etc.  */
1490 static void
1491 group_sections (struct elf32_nios2_link_hash_table *htab)
1492 {
1493   asection **list = htab->input_list + htab->top_index;
1494   do
1495     {
1496       /* The list is in reverse order so we'll search backwards looking
1497          for the first section that begins in the same memory segment,
1498          marking sections along the way to point at the tail for this
1499          group.  */
1500       asection *tail = *list;
1501       if (tail == bfd_abs_section_ptr)
1502         continue;
1503       while (tail != NULL)
1504         {
1505           bfd_vma start = tail->output_section->vma + tail->output_offset;
1506           bfd_vma end = start + tail->size;
1507           bfd_vma segment = CALL26_SEGMENT (end);
1508           asection *prev;
1509
1510           if (segment != CALL26_SEGMENT (start)
1511               || segment != CALL26_SEGMENT (end + MAX_STUB_SECTION_SIZE))
1512             /* This section spans more than one memory segment, or is
1513                close enough to the end of the segment that adding stub
1514                sections before it might cause it to move so that it
1515                spans memory segments, or that stubs added at the end of
1516                this group might overflow into the next memory segment.
1517                Put it in a group by itself to localize the effects.  */
1518             {
1519               prev = htab->stub_group[tail->id].last_sec;
1520               htab->stub_group[tail->id].last_sec = tail;
1521               htab->stub_group[tail->id].first_sec = tail;
1522             }
1523           else
1524             /* Collect more sections for this group.  */
1525             {
1526               asection *curr, *first;
1527               for (curr = tail; ; curr = prev)
1528                 {
1529                   prev = htab->stub_group[curr->id].last_sec;
1530                   if (!prev
1531                       || tail->output_section != prev->output_section
1532                       || (CALL26_SEGMENT (prev->output_section->vma
1533                                           + prev->output_offset)
1534                           != segment))
1535                     break;
1536                 }
1537               first = curr;
1538               for (curr = tail; ; curr = prev)
1539                 {
1540                   prev = htab->stub_group[curr->id].last_sec;
1541                   htab->stub_group[curr->id].last_sec = tail;
1542                   htab->stub_group[curr->id].first_sec = first;
1543                   if (curr == first)
1544                     break;
1545                 }
1546             }
1547
1548           /* Reset tail for the next group.  */
1549           tail = prev;
1550         }
1551     }
1552   while (list-- != htab->input_list);
1553   free (htab->input_list);
1554 }
1555
1556 /* Determine the type of stub needed, if any, for a call.  */
1557 static enum elf32_nios2_stub_type
1558 nios2_type_of_stub (asection *input_sec,
1559                     const Elf_Internal_Rela *rel,
1560                     struct elf32_nios2_link_hash_entry *hh,
1561                     struct elf32_nios2_link_hash_table *htab,
1562                     bfd_vma destination,
1563                     struct bfd_link_info *info ATTRIBUTE_UNUSED)
1564 {
1565   bfd_vma location, segment, start, end;
1566   asection *s0, *s1, *s;
1567
1568   if (hh != NULL &&
1569       !(hh->root.root.type == bfd_link_hash_defined
1570         || hh->root.root.type == bfd_link_hash_defweak))
1571     return nios2_stub_none;
1572
1573   /* Determine where the call point is.  */
1574   location = (input_sec->output_section->vma
1575               + input_sec->output_offset + rel->r_offset);
1576   segment = CALL26_SEGMENT (location);
1577
1578   /* Nios II CALL and JMPI instructions can transfer control to addresses
1579      within the same 256MB segment as the PC.  */
1580   if (segment == CALL26_SEGMENT (destination))
1581     return nios2_stub_none;
1582
1583   /* Find the start and end addresses of the stub group.  Also account for
1584      any already-created stub sections for this group.  Note that for stubs
1585      in the end section, only the first instruction of the last stub
1586      (12 bytes long) needs to be within range.  */
1587   s0 = htab->stub_group[input_sec->id].first_sec;
1588   s = htab->stub_group[s0->id].first_stub_sec;
1589   if (s != NULL && s->size > 0)
1590     start = s->output_section->vma + s->output_offset;
1591   else
1592     start = s0->output_section->vma + s0->output_offset;
1593
1594   s1 = htab->stub_group[input_sec->id].last_sec;
1595   s = htab->stub_group[s1->id].last_stub_sec;
1596   if (s != NULL && s->size > 0)
1597     end = s->output_section->vma + s->output_offset + s->size - 8;
1598   else
1599     end = s1->output_section->vma + s1->output_offset + s1->size;
1600
1601   BFD_ASSERT (start < end);
1602   BFD_ASSERT (start <= location);
1603   BFD_ASSERT (location < end);
1604
1605   /* Put stubs at the end of the group unless that is not a valid
1606      location and the beginning of the group is.  It might be that
1607      neither the beginning nor end works if we have an input section
1608      so large that it spans multiple segment boundaries.  In that
1609      case, punt; the end result will be a relocation overflow error no
1610      matter what we do here.
1611
1612      Note that adding stubs pushes up the addresses of all subsequent
1613      sections, so that stubs allocated on one pass through the
1614      relaxation loop may not be valid on the next pass.  (E.g., we may
1615      allocate a stub at the beginning of the section on one pass and
1616      find that the call site has been bumped into the next memory
1617      segment on the next pass.)  The important thing to note is that
1618      we never try to reclaim the space allocated to such unused stubs,
1619      so code size and section addresses can only increase with each
1620      iteration.  Accounting for the start and end addresses of the
1621      already-created stub sections ensures that when the algorithm
1622      converges, it converges accurately, with the entire appropriate
1623      stub section accessible from the call site and not just the
1624      address at the start or end of the stub group proper.  */
1625
1626   if (segment == CALL26_SEGMENT (end))
1627     return nios2_stub_call26_after;
1628   else if (segment == CALL26_SEGMENT (start))
1629     return nios2_stub_call26_before;
1630   else
1631     /* Perhaps this should be a dedicated error code.  */
1632     return nios2_stub_none;
1633 }
1634
1635 static bfd_boolean
1636 nios2_build_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg ATTRIBUTE_UNUSED)
1637 {
1638   struct elf32_nios2_stub_hash_entry *hsh
1639     = (struct elf32_nios2_stub_hash_entry *) gen_entry;
1640   asection *stub_sec = hsh->stub_sec;
1641   bfd_vma sym_value;
1642
1643   /* Make a note of the offset within the stubs for this entry.  */
1644   hsh->stub_offset = stub_sec->size;
1645
1646   switch (hsh->stub_type)
1647     {
1648     case nios2_stub_call26_before:
1649     case nios2_stub_call26_after:
1650       /* A call26 stub looks like:
1651            orhi at, %hiadj(dest)
1652            addi at, at, %lo(dest)
1653            jmp at
1654          Note that call/jmpi instructions can't be used in PIC code
1655          so there is no reason for the stub to be PIC, either.  */
1656       sym_value = (hsh->target_value
1657                    + hsh->target_section->output_offset
1658                    + hsh->target_section->output_section->vma
1659                    + hsh->addend);
1660
1661       nios2_elf32_install_data (stub_sec, nios2_call26_stub_entry,
1662                                 hsh->stub_offset, 3);
1663       nios2_elf32_install_imm16 (stub_sec, hsh->stub_offset,
1664                                  hiadj (sym_value));
1665       nios2_elf32_install_imm16 (stub_sec, hsh->stub_offset + 4,
1666                                  (sym_value & 0xffff));
1667       stub_sec->size += 12;
1668       break;
1669     default:
1670       BFD_FAIL ();
1671       return FALSE;
1672     }
1673
1674   return TRUE;
1675 }
1676
1677 /* As above, but don't actually build the stub.  Just bump offset so
1678    we know stub section sizes.  */
1679 static bfd_boolean
1680 nios2_size_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg ATTRIBUTE_UNUSED)
1681 {
1682   struct elf32_nios2_stub_hash_entry *hsh
1683     = (struct elf32_nios2_stub_hash_entry *) gen_entry;
1684
1685   switch (hsh->stub_type)
1686     {
1687     case nios2_stub_call26_before:
1688     case nios2_stub_call26_after:
1689       hsh->stub_sec->size += 12;
1690       break;
1691     default:
1692       BFD_FAIL ();
1693       return FALSE;
1694     }
1695   return TRUE;
1696 }
1697
1698 /* Read in all local syms for all input bfds.
1699    Returns -1 on error, 0 otherwise.  */
1700
1701 static int
1702 get_local_syms (bfd *output_bfd ATTRIBUTE_UNUSED, bfd *input_bfd,
1703                 struct bfd_link_info *info)
1704 {
1705   unsigned int bfd_indx;
1706   Elf_Internal_Sym *local_syms, **all_local_syms;
1707   struct elf32_nios2_link_hash_table *htab = elf32_nios2_hash_table (info);
1708
1709   /* We want to read in symbol extension records only once.  To do this
1710      we need to read in the local symbols in parallel and save them for
1711      later use; so hold pointers to the local symbols in an array.  */
1712   bfd_size_type amt = sizeof (Elf_Internal_Sym *) * htab->bfd_count;
1713   all_local_syms = bfd_zmalloc (amt);
1714   htab->all_local_syms = all_local_syms;
1715   if (all_local_syms == NULL)
1716     return -1;
1717
1718   /* Walk over all the input BFDs, swapping in local symbols.  */
1719   for (bfd_indx = 0;
1720        input_bfd != NULL;
1721        input_bfd = input_bfd->link_next, bfd_indx++)
1722     {
1723       Elf_Internal_Shdr *symtab_hdr;
1724
1725       /* We'll need the symbol table in a second.  */
1726       symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
1727       if (symtab_hdr->sh_info == 0)
1728         continue;
1729
1730       /* We need an array of the local symbols attached to the input bfd.  */
1731       local_syms = (Elf_Internal_Sym *) symtab_hdr->contents;
1732       if (local_syms == NULL)
1733         {
1734           local_syms = bfd_elf_get_elf_syms (input_bfd, symtab_hdr,
1735                                              symtab_hdr->sh_info, 0,
1736                                              NULL, NULL, NULL);
1737           /* Cache them for elf_link_input_bfd.  */
1738           symtab_hdr->contents = (unsigned char *) local_syms;
1739         }
1740       if (local_syms == NULL)
1741         return -1;
1742
1743       all_local_syms[bfd_indx] = local_syms;
1744     }
1745
1746   return 0;
1747 }
1748
1749 /* Determine and set the size of the stub section for a final link.  */
1750 bfd_boolean
1751 nios2_elf32_size_stubs (bfd *output_bfd, bfd *stub_bfd,
1752                         struct bfd_link_info *info,
1753                         asection *(*add_stub_section) (const char *,
1754                                                        asection *, bfd_boolean),
1755                         void (*layout_sections_again) (void))
1756 {
1757   bfd_boolean stub_changed = FALSE;
1758   struct elf32_nios2_link_hash_table *htab = elf32_nios2_hash_table (info);
1759
1760   /* Stash our params away.  */
1761   htab->stub_bfd = stub_bfd;
1762   htab->add_stub_section = add_stub_section;
1763   htab->layout_sections_again = layout_sections_again;
1764
1765   /* FIXME: We only compute the section groups once.  This could cause
1766      problems if adding a large stub section causes following sections,
1767      or parts of them, to move into another segment.  However, this seems
1768      to be consistent with the way other back ends handle this....  */
1769   group_sections (htab);
1770
1771   if (get_local_syms (output_bfd, info->input_bfds, info))
1772     {
1773       if (htab->all_local_syms)
1774         goto error_ret_free_local;
1775       return FALSE;
1776     }
1777
1778   while (1)
1779     {
1780       bfd *input_bfd;
1781       unsigned int bfd_indx;
1782       asection *stub_sec;
1783
1784       for (input_bfd = info->input_bfds, bfd_indx = 0;
1785            input_bfd != NULL;
1786            input_bfd = input_bfd->link_next, bfd_indx++)
1787         {
1788           Elf_Internal_Shdr *symtab_hdr;
1789           asection *section;
1790           Elf_Internal_Sym *local_syms;
1791
1792           /* We'll need the symbol table in a second.  */
1793           symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
1794           if (symtab_hdr->sh_info == 0)
1795             continue;
1796
1797           local_syms = htab->all_local_syms[bfd_indx];
1798
1799           /* Walk over each section attached to the input bfd.  */
1800           for (section = input_bfd->sections;
1801                section != NULL;
1802                section = section->next)
1803             {
1804               Elf_Internal_Rela *internal_relocs, *irelaend, *irela;
1805
1806               /* If there aren't any relocs, then there's nothing more
1807                  to do.  */
1808               if ((section->flags & SEC_RELOC) == 0
1809                   || section->reloc_count == 0)
1810                 continue;
1811
1812               /* If this section is a link-once section that will be
1813                  discarded, then don't create any stubs.  */
1814               if (section->output_section == NULL
1815                   || section->output_section->owner != output_bfd)
1816                 continue;
1817
1818               /* Get the relocs.  */
1819               internal_relocs
1820                 = _bfd_elf_link_read_relocs (input_bfd, section, NULL, NULL,
1821                                              info->keep_memory);
1822               if (internal_relocs == NULL)
1823                 goto error_ret_free_local;
1824
1825               /* Now examine each relocation.  */
1826               irela = internal_relocs;
1827               irelaend = irela + section->reloc_count;
1828               for (; irela < irelaend; irela++)
1829                 {
1830                   unsigned int r_type, r_indx;
1831                   enum elf32_nios2_stub_type stub_type;
1832                   struct elf32_nios2_stub_hash_entry *hsh;
1833                   asection *sym_sec;
1834                   bfd_vma sym_value;
1835                   bfd_vma destination;
1836                   struct elf32_nios2_link_hash_entry *hh;
1837                   char *stub_name;
1838                   const asection *id_sec;
1839
1840                   r_type = ELF32_R_TYPE (irela->r_info);
1841                   r_indx = ELF32_R_SYM (irela->r_info);
1842
1843                   if (r_type >= (unsigned int) R_NIOS2_ILLEGAL)
1844                     {
1845                       bfd_set_error (bfd_error_bad_value);
1846                     error_ret_free_internal:
1847                       if (elf_section_data (section)->relocs == NULL)
1848                         free (internal_relocs);
1849                       goto error_ret_free_local;
1850                     }
1851
1852                   /* Only look for stubs on CALL and JMPI instructions.  */
1853                   if (r_type != (unsigned int) R_NIOS2_CALL26)
1854                     continue;
1855
1856                   /* Now determine the call target, its name, value,
1857                      section.  */
1858                   sym_sec = NULL;
1859                   sym_value = 0;
1860                   destination = 0;
1861                   hh = NULL;
1862                   if (r_indx < symtab_hdr->sh_info)
1863                     {
1864                       /* It's a local symbol.  */
1865                       Elf_Internal_Sym *sym;
1866                       Elf_Internal_Shdr *hdr;
1867                       unsigned int shndx;
1868
1869                       sym = local_syms + r_indx;
1870                       if (ELF_ST_TYPE (sym->st_info) != STT_SECTION)
1871                         sym_value = sym->st_value;
1872                       shndx = sym->st_shndx;
1873                       if (shndx < elf_numsections (input_bfd))
1874                         {
1875                           hdr = elf_elfsections (input_bfd)[shndx];
1876                           sym_sec = hdr->bfd_section;
1877                           destination = (sym_value + irela->r_addend
1878                                          + sym_sec->output_offset
1879                                          + sym_sec->output_section->vma);
1880                         }
1881                     }
1882                   else
1883                     {
1884                       /* It's an external symbol.  */
1885                       int e_indx;
1886
1887                       e_indx = r_indx - symtab_hdr->sh_info;
1888                       hh = ((struct elf32_nios2_link_hash_entry *)
1889                             elf_sym_hashes (input_bfd)[e_indx]);
1890
1891                       while (hh->root.root.type == bfd_link_hash_indirect
1892                              || hh->root.root.type == bfd_link_hash_warning)
1893                         hh = ((struct elf32_nios2_link_hash_entry *)
1894                               hh->root.root.u.i.link);
1895
1896                       if (hh->root.root.type == bfd_link_hash_defined
1897                           || hh->root.root.type == bfd_link_hash_defweak)
1898                         {
1899                           sym_sec = hh->root.root.u.def.section;
1900                           sym_value = hh->root.root.u.def.value;
1901
1902                           if (sym_sec->output_section != NULL)
1903                             destination = (sym_value + irela->r_addend
1904                                            + sym_sec->output_offset
1905                                            + sym_sec->output_section->vma);
1906                           else
1907                             continue;
1908                         }
1909                       else if (hh->root.root.type == bfd_link_hash_undefweak)
1910                         {
1911                           if (! info->shared)
1912                             continue;
1913                         }
1914                       else if (hh->root.root.type == bfd_link_hash_undefined)
1915                         {
1916                           if (! (info->unresolved_syms_in_objects == RM_IGNORE
1917                                  && (ELF_ST_VISIBILITY (hh->root.other)
1918                                      == STV_DEFAULT)))
1919                             continue;
1920                         }
1921                       else
1922                         {
1923                           bfd_set_error (bfd_error_bad_value);
1924                           goto error_ret_free_internal;
1925                         }
1926                     }
1927
1928                   /* Determine what (if any) linker stub is needed.  */
1929                   stub_type = nios2_type_of_stub (section, irela, hh, htab,
1930                                                   destination, info);
1931                   if (stub_type == nios2_stub_none)
1932                     continue;
1933
1934                   /* Support for grouping stub sections.  */
1935                   if (stub_type == nios2_stub_call26_before)
1936                     id_sec = htab->stub_group[section->id].first_sec;
1937                   else
1938                     id_sec = htab->stub_group[section->id].last_sec;
1939
1940                   /* Get the name of this stub.  */
1941                   stub_name = nios2_stub_name (id_sec, sym_sec, hh, irela,
1942                                                stub_type);
1943                   if (!stub_name)
1944                     goto error_ret_free_internal;
1945
1946                   hsh = nios2_stub_hash_lookup (&htab->bstab,
1947                                                 stub_name,
1948                                                 FALSE, FALSE);
1949                   if (hsh != NULL)
1950                     {
1951                       /* The proper stub has already been created.  */
1952                       free (stub_name);
1953                       continue;
1954                     }
1955
1956                   hsh = nios2_add_stub (stub_name, section, htab, stub_type);
1957                   if (hsh == NULL)
1958                     {
1959                       free (stub_name);
1960                       goto error_ret_free_internal;
1961                     }
1962                   hsh->target_value = sym_value;
1963                   hsh->target_section = sym_sec;
1964                   hsh->stub_type = stub_type;
1965                   hsh->hh = hh;
1966                   hsh->addend = irela->r_addend;
1967                   stub_changed = TRUE;
1968                 }
1969
1970               /* We're done with the internal relocs, free them.  */
1971               if (elf_section_data (section)->relocs == NULL)
1972                 free (internal_relocs);
1973             }
1974         }
1975
1976       if (!stub_changed)
1977         break;
1978
1979       /* OK, we've added some stubs.  Find out the new size of the
1980          stub sections.  */
1981       for (stub_sec = htab->stub_bfd->sections;
1982            stub_sec != NULL;
1983            stub_sec = stub_sec->next)
1984         stub_sec->size = 0;
1985
1986       bfd_hash_traverse (&htab->bstab, nios2_size_one_stub, htab);
1987
1988       /* Ask the linker to do its stuff.  */
1989       (*htab->layout_sections_again) ();
1990       stub_changed = FALSE;
1991     }
1992
1993   free (htab->all_local_syms);
1994   return TRUE;
1995
1996  error_ret_free_local:
1997   free (htab->all_local_syms);
1998   return FALSE;
1999 }
2000
2001 /* Build all the stubs associated with the current output file.  The
2002    stubs are kept in a hash table attached to the main linker hash
2003    table.  This function is called via nios2elf_finish in the linker.  */
2004 bfd_boolean
2005 nios2_elf32_build_stubs (struct bfd_link_info *info)
2006 {
2007   asection *stub_sec;
2008   struct bfd_hash_table *table;
2009   struct elf32_nios2_link_hash_table *htab;
2010
2011   htab = elf32_nios2_hash_table (info);
2012
2013   for (stub_sec = htab->stub_bfd->sections;
2014        stub_sec != NULL;
2015        stub_sec = stub_sec->next)
2016     /* The stub_bfd may contain non-stub sections if it is also the
2017        dynobj.  Any such non-stub sections are created with the
2018        SEC_LINKER_CREATED flag set, while stub sections do not
2019        have that flag.  Ignore any non-stub sections here.  */
2020     if ((stub_sec->flags & SEC_LINKER_CREATED) == 0)
2021       {  
2022         bfd_size_type size;
2023
2024         /* Allocate memory to hold the linker stubs.  */
2025         size = stub_sec->size;
2026         stub_sec->contents = bfd_zalloc (htab->stub_bfd, size);
2027         if (stub_sec->contents == NULL && size != 0)
2028           return FALSE;
2029         stub_sec->size = 0;
2030       }
2031
2032   /* Build the stubs as directed by the stub hash table.  */
2033   table = &htab->bstab;
2034   bfd_hash_traverse (table, nios2_build_one_stub, info);
2035
2036   return TRUE;
2037 }
2038
2039
2040 /* Implement bfd_elf32_bfd_reloc_type_lookup:
2041    Given a BFD reloc type, return a howto structure.  */
2042 static reloc_howto_type *
2043 nios2_elf32_bfd_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
2044                                    bfd_reloc_code_real_type code)
2045 {
2046   int i;
2047   for (i = 0;
2048        i < (int) (sizeof (nios2_reloc_map) / sizeof (struct elf_reloc_map));
2049        ++i)
2050     if (nios2_reloc_map[i].bfd_val == code)
2051       return &elf_nios2_howto_table_rel[(int) nios2_reloc_map[i].elf_val];
2052   return NULL;
2053 }
2054
2055 /* Implement bfd_elf32_bfd_reloc_name_lookup:
2056    Given a reloc name, return a howto structure.  */
2057 static reloc_howto_type *
2058 nios2_elf32_bfd_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
2059                                    const char *r_name)
2060 {
2061   unsigned int i;
2062   for (i = 0;
2063        i < (sizeof (elf_nios2_howto_table_rel)
2064             / sizeof (elf_nios2_howto_table_rel[0]));
2065        i++)
2066     if (elf_nios2_howto_table_rel[i].name
2067         && strcasecmp (elf_nios2_howto_table_rel[i].name, r_name) == 0)
2068       return &elf_nios2_howto_table_rel[i];
2069
2070   return NULL;  
2071 }
2072
2073 /* Implement elf_info_to_howto:
2074    Given a ELF32 relocation, fill in a arelent structure.  */
2075 static void
2076 nios2_elf32_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED, arelent *cache_ptr,
2077                            Elf_Internal_Rela *dst)
2078 {
2079   unsigned int r_type;
2080
2081   r_type = ELF32_R_TYPE (dst->r_info);
2082   BFD_ASSERT (r_type < R_NIOS2_ILLEGAL);
2083   cache_ptr->howto = &elf_nios2_howto_table_rel[r_type];
2084 }
2085
2086 /* Return the base VMA address which should be subtracted from real addresses
2087    when resolving @dtpoff relocation.
2088    This is PT_TLS segment p_vaddr.  */
2089 static bfd_vma
2090 dtpoff_base (struct bfd_link_info *info)
2091 {
2092   /* If tls_sec is NULL, we should have signalled an error already.  */
2093   if (elf_hash_table (info)->tls_sec == NULL)
2094     return 0;
2095   return elf_hash_table (info)->tls_sec->vma;
2096 }
2097
2098 /* Return the relocation value for @tpoff relocation
2099    if STT_TLS virtual address is ADDRESS.  */
2100 static bfd_vma
2101 tpoff (struct bfd_link_info *info, bfd_vma address)
2102 {
2103   struct elf_link_hash_table *htab = elf_hash_table (info);
2104
2105   /* If tls_sec is NULL, we should have signalled an error already.  */
2106   if (htab->tls_sec == NULL)
2107     return 0;
2108   return address - htab->tls_sec->vma;
2109 }
2110
2111 /* Set the GP value for OUTPUT_BFD.  Returns FALSE if this is a
2112    dangerous relocation.  */
2113 static bfd_boolean
2114 nios2_elf_assign_gp (bfd *output_bfd, bfd_vma *pgp, struct bfd_link_info *info)
2115 {
2116
2117   bfd_boolean gp_found;
2118   struct bfd_hash_entry *h;
2119   struct bfd_link_hash_entry *lh;
2120
2121   /* If we've already figured out what GP will be, just return it. */
2122   *pgp = _bfd_get_gp_value (output_bfd);
2123   if (*pgp)
2124     return TRUE;
2125
2126   h = bfd_hash_lookup (&info->hash->table, "_gp", FALSE, FALSE);
2127   lh = (struct bfd_link_hash_entry *) h;
2128 lookup:
2129   if (lh)
2130     {
2131       switch (lh->type)
2132         {
2133         case bfd_link_hash_undefined:
2134         case bfd_link_hash_undefweak:
2135         case bfd_link_hash_common:
2136           gp_found = FALSE;
2137           break;
2138         case bfd_link_hash_defined:
2139         case bfd_link_hash_defweak:
2140           gp_found = TRUE;
2141           *pgp = lh->u.def.value;
2142           break;
2143         case bfd_link_hash_indirect:
2144         case bfd_link_hash_warning:
2145           lh = lh->u.i.link;
2146           /* @@FIXME  ignoring warning for now */
2147           goto lookup;
2148         case bfd_link_hash_new:
2149         default:
2150           abort ();
2151         }
2152     }
2153   else
2154     gp_found = FALSE;
2155
2156   if (!gp_found)
2157     {
2158       /* Only get the error once. */
2159       *pgp = 4;
2160       _bfd_set_gp_value (output_bfd, *pgp);
2161       return FALSE;
2162     }
2163
2164   _bfd_set_gp_value (output_bfd, *pgp);
2165
2166   return TRUE;
2167 }
2168
2169 /* Retrieve the previously cached _gp pointer, returning bfd_reloc_dangerous
2170    if it's not available as we don't have a link_info pointer available here
2171    to look it up in the output symbol table.  We don't need to adjust the
2172    symbol value for an external symbol if we are producing relocatable
2173    output.  */
2174 static bfd_reloc_status_type
2175 nios2_elf_final_gp (bfd *output_bfd, asymbol *symbol, bfd_boolean relocatable, 
2176                     char **error_message, bfd_vma *pgp)
2177 {
2178   if (bfd_is_und_section (symbol->section) && !relocatable)
2179     {
2180       *pgp = 0;
2181       return bfd_reloc_undefined;
2182     }
2183
2184   *pgp = _bfd_get_gp_value (output_bfd);
2185   if (*pgp == 0 && (!relocatable || (symbol->flags & BSF_SECTION_SYM) != 0))
2186     {
2187       if (relocatable)
2188         {
2189           /* Make up a value.  */
2190           *pgp = symbol->section->output_section->vma + 0x4000;
2191           _bfd_set_gp_value (output_bfd, *pgp);
2192         }
2193       else
2194         {
2195           *error_message
2196             = (char *) _("global pointer relative relocation when _gp not defined");
2197           return bfd_reloc_dangerous;
2198         }
2199     }
2200
2201   return bfd_reloc_ok;
2202 }
2203
2204 /* Do the relocations that require special handling.  */
2205 static bfd_reloc_status_type
2206 nios2_elf32_do_hi16_relocate (bfd *abfd, reloc_howto_type *howto, 
2207                               asection *input_section,
2208                               bfd_byte *data, bfd_vma offset, 
2209                               bfd_vma symbol_value, bfd_vma addend)
2210 {
2211   symbol_value = symbol_value + addend;
2212   addend = 0;
2213   symbol_value = (symbol_value >> 16) & 0xffff;
2214   return _bfd_final_link_relocate (howto, abfd, input_section,
2215                                    data, offset, symbol_value, addend);
2216 }
2217
2218 static bfd_reloc_status_type
2219 nios2_elf32_do_lo16_relocate (bfd *abfd, reloc_howto_type *howto,
2220                               asection *input_section,
2221                               bfd_byte *data, bfd_vma offset, 
2222                               bfd_vma symbol_value, bfd_vma addend)
2223 {
2224   symbol_value = symbol_value + addend;
2225   addend = 0;
2226   symbol_value = symbol_value & 0xffff;
2227   return _bfd_final_link_relocate (howto, abfd, input_section,
2228                                    data, offset, symbol_value, addend);
2229 }
2230
2231 static bfd_reloc_status_type
2232 nios2_elf32_do_hiadj16_relocate (bfd *abfd, reloc_howto_type *howto,
2233                                  asection *input_section,
2234                                  bfd_byte *data, bfd_vma offset,
2235                                  bfd_vma symbol_value, bfd_vma addend)
2236 {
2237   symbol_value = symbol_value + addend;
2238   addend = 0;
2239   symbol_value = hiadj(symbol_value);
2240   return _bfd_final_link_relocate (howto, abfd, input_section, data, offset,
2241                                    symbol_value, addend);
2242 }
2243
2244 static bfd_reloc_status_type
2245 nios2_elf32_do_pcrel_lo16_relocate (bfd *abfd, reloc_howto_type *howto,
2246                                     asection *input_section,
2247                                     bfd_byte *data, bfd_vma offset,
2248                                     bfd_vma symbol_value, bfd_vma addend)
2249 {
2250   symbol_value = symbol_value + addend;
2251   addend = 0;
2252   symbol_value = symbol_value & 0xffff;
2253   return _bfd_final_link_relocate (howto, abfd, input_section,
2254                                    data, offset, symbol_value, addend);
2255 }
2256
2257 static bfd_reloc_status_type
2258 nios2_elf32_do_pcrel_hiadj16_relocate (bfd *abfd, reloc_howto_type *howto,
2259                                        asection *input_section,
2260                                        bfd_byte *data, bfd_vma offset,
2261                                        bfd_vma symbol_value, bfd_vma addend)
2262 {
2263   symbol_value = symbol_value + addend;
2264   symbol_value -= (input_section->output_section->vma
2265                    + input_section->output_offset);
2266   symbol_value -= offset;
2267   addend = 0;
2268   symbol_value = hiadj(symbol_value);
2269   return _bfd_final_link_relocate (howto, abfd, input_section, data, offset,
2270                                    symbol_value, addend);
2271 }
2272
2273 static bfd_reloc_status_type
2274 nios2_elf32_do_pcrel16_relocate (bfd *abfd, reloc_howto_type *howto,
2275                                  asection *input_section,
2276                                  bfd_byte *data, bfd_vma offset, 
2277                                  bfd_vma symbol_value, bfd_vma addend)
2278 {
2279   /* NIOS2 pc relative relocations are relative to the next 32-bit instruction 
2280      so we need to subtract 4 before doing a final_link_relocate. */
2281   symbol_value = symbol_value + addend - 4;
2282   addend = 0;
2283   return _bfd_final_link_relocate (howto, abfd, input_section,
2284                                    data, offset, symbol_value, addend);
2285 }
2286
2287 static bfd_reloc_status_type
2288 nios2_elf32_do_call26_relocate (bfd *abfd, reloc_howto_type *howto,
2289                                 asection *input_section,
2290                                 bfd_byte *data, bfd_vma offset, 
2291                                 bfd_vma symbol_value, bfd_vma addend)
2292 {
2293   /* Check that the relocation is in the same page as the current address.  */
2294   if (CALL26_SEGMENT (symbol_value + addend) 
2295       != CALL26_SEGMENT (input_section->output_section->vma
2296                          + input_section->output_offset
2297                          + offset))
2298     return bfd_reloc_overflow;
2299
2300   return _bfd_final_link_relocate (howto, abfd, input_section,
2301                                    data, offset, symbol_value, addend);
2302 }
2303
2304 static bfd_reloc_status_type
2305 nios2_elf32_do_gprel_relocate (bfd *abfd, reloc_howto_type *howto,
2306                                asection *input_section,
2307                                bfd_byte *data, bfd_vma offset, 
2308                                bfd_vma symbol_value, bfd_vma addend)
2309 {
2310   /* Because we need the output_bfd, the special handling is done
2311      in nios2_elf32_relocate_section or in nios2_elf32_gprel_relocate.  */
2312   return _bfd_final_link_relocate (howto, abfd, input_section,
2313                                    data, offset, symbol_value, addend);
2314 }
2315
2316 static bfd_reloc_status_type
2317 nios2_elf32_do_ujmp_relocate (bfd *abfd, reloc_howto_type *howto,
2318                               asection *input_section,
2319                               bfd_byte *data, bfd_vma offset, 
2320                               bfd_vma symbol_value, bfd_vma addend)
2321 {
2322   bfd_vma symbol_lo16, symbol_hi16;
2323   bfd_reloc_status_type r;
2324   symbol_value = symbol_value + addend;
2325   addend = 0;
2326   symbol_hi16 = (symbol_value >> 16) & 0xffff;
2327   symbol_lo16 = symbol_value & 0xffff;
2328
2329   r = _bfd_final_link_relocate (howto, abfd, input_section,
2330                                 data, offset, symbol_hi16, addend);
2331
2332   if (r == bfd_reloc_ok)
2333     return _bfd_final_link_relocate (howto, abfd, input_section,
2334                                      data, offset + 4, symbol_lo16, addend);
2335
2336   return r;
2337 }
2338
2339 static bfd_reloc_status_type
2340 nios2_elf32_do_cjmp_relocate (bfd *abfd, reloc_howto_type *howto,
2341                               asection *input_section,
2342                               bfd_byte *data, bfd_vma offset, 
2343                               bfd_vma symbol_value, bfd_vma addend)
2344 {
2345   bfd_vma symbol_lo16, symbol_hi16;
2346   bfd_reloc_status_type r;
2347   symbol_value = symbol_value + addend;
2348   addend = 0;
2349   symbol_hi16 = (symbol_value >> 16) & 0xffff;
2350   symbol_lo16 = symbol_value & 0xffff;
2351
2352   r = _bfd_final_link_relocate (howto, abfd, input_section,
2353                                 data, offset, symbol_hi16, addend);
2354
2355   if (r == bfd_reloc_ok)
2356     return _bfd_final_link_relocate (howto, abfd, input_section,
2357                                      data, offset + 4, symbol_lo16, addend);
2358
2359   return r;
2360 }
2361
2362 static bfd_reloc_status_type
2363 nios2_elf32_do_callr_relocate (bfd *abfd, reloc_howto_type *howto,
2364                                asection *input_section,
2365                                bfd_byte *data, bfd_vma offset, 
2366                                bfd_vma symbol_value, bfd_vma addend)
2367 {
2368   bfd_vma symbol_lo16, symbol_hi16;
2369   bfd_reloc_status_type r;
2370   symbol_value = symbol_value + addend;
2371   addend = 0;
2372   symbol_hi16 = (symbol_value >> 16) & 0xffff;
2373   symbol_lo16 = symbol_value & 0xffff;
2374
2375   r = _bfd_final_link_relocate (howto, abfd, input_section,
2376                                 data, offset, symbol_hi16, addend);
2377
2378   if (r == bfd_reloc_ok)
2379     return _bfd_final_link_relocate (howto, abfd, input_section,
2380                                      data, offset + 4, symbol_lo16, addend);
2381
2382   return r;
2383 }
2384
2385 /* HOWTO handlers for relocations that require special handling.  */
2386
2387 /* This is for relocations used only when relaxing to ensure
2388    changes in size of section don't screw up .align.  */
2389 static bfd_reloc_status_type
2390 nios2_elf32_ignore_reloc (bfd *abfd ATTRIBUTE_UNUSED, arelent *reloc_entry,
2391                           asymbol *symbol ATTRIBUTE_UNUSED, 
2392                           void *data ATTRIBUTE_UNUSED, asection *input_section, 
2393                           bfd *output_bfd, 
2394                           char **error_message ATTRIBUTE_UNUSED)
2395 {
2396   if (output_bfd != NULL)
2397     reloc_entry->address += input_section->output_offset;
2398   return bfd_reloc_ok;
2399 }
2400
2401 static bfd_reloc_status_type
2402 nios2_elf32_hi16_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol, 
2403                            void *data, asection *input_section, 
2404                            bfd *output_bfd, 
2405                            char **error_message ATTRIBUTE_UNUSED)
2406 {
2407   /* This part is from bfd_elf_generic_reloc.  */
2408   if (output_bfd != NULL
2409       && (symbol->flags & BSF_SECTION_SYM) == 0
2410       && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
2411     {
2412       reloc_entry->address += input_section->output_offset;
2413       return bfd_reloc_ok;
2414     }
2415
2416   if (output_bfd != NULL)
2417     /* FIXME: See bfd_perform_relocation.  Is this right?  */
2418     return bfd_reloc_continue;
2419
2420   return nios2_elf32_do_hi16_relocate (abfd, reloc_entry->howto,
2421                                        input_section,
2422                                        data, reloc_entry->address,
2423                                        (symbol->value
2424                                         + symbol->section->output_section->vma
2425                                         + symbol->section->output_offset),
2426                                        reloc_entry->addend);
2427 }
2428
2429 static bfd_reloc_status_type
2430 nios2_elf32_lo16_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2431                            void *data, asection *input_section, 
2432                            bfd *output_bfd, 
2433                            char **error_message ATTRIBUTE_UNUSED)
2434 {
2435   /* This part is from bfd_elf_generic_reloc.  */
2436   if (output_bfd != NULL
2437       && (symbol->flags & BSF_SECTION_SYM) == 0
2438       && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
2439     {
2440       reloc_entry->address += input_section->output_offset;
2441       return bfd_reloc_ok;
2442     }
2443
2444   if (output_bfd != NULL)
2445     /* FIXME: See bfd_perform_relocation.  Is this right?  */
2446     return bfd_reloc_continue;
2447
2448   return nios2_elf32_do_lo16_relocate (abfd, reloc_entry->howto,
2449                                        input_section,
2450                                        data, reloc_entry->address,
2451                                        (symbol->value
2452                                         + symbol->section->output_section->vma
2453                                         + symbol->section->output_offset),
2454                                        reloc_entry->addend);
2455 }
2456
2457 static bfd_reloc_status_type
2458 nios2_elf32_hiadj16_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2459                               void *data, asection *input_section, 
2460                               bfd *output_bfd, 
2461                               char **error_message ATTRIBUTE_UNUSED)
2462 {
2463   /* This part is from bfd_elf_generic_reloc.  */
2464   if (output_bfd != NULL
2465       && (symbol->flags & BSF_SECTION_SYM) == 0
2466       && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
2467     {
2468       reloc_entry->address += input_section->output_offset;
2469       return bfd_reloc_ok;
2470     }
2471
2472   if (output_bfd != NULL)
2473     /* FIXME: See bfd_perform_relocation.  Is this right?  */
2474     return bfd_reloc_continue;
2475
2476   return nios2_elf32_do_hiadj16_relocate (abfd, reloc_entry->howto,
2477                                           input_section,
2478                                           data, reloc_entry->address,
2479                                           (symbol->value
2480                                            + symbol->section->output_section->vma
2481                                            + symbol->section->output_offset),
2482                                           reloc_entry->addend);
2483 }
2484
2485 static bfd_reloc_status_type
2486 nios2_elf32_pcrel_lo16_relocate (bfd *abfd, arelent *reloc_entry,
2487                                  asymbol *symbol, void *data,
2488                                  asection *input_section, bfd *output_bfd,
2489                                  char **error_message ATTRIBUTE_UNUSED)
2490 {
2491   /* This part is from bfd_elf_generic_reloc.  */
2492   if (output_bfd != NULL
2493       && (symbol->flags & BSF_SECTION_SYM) == 0
2494       && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
2495     {
2496       reloc_entry->address += input_section->output_offset;
2497       return bfd_reloc_ok;
2498     }
2499
2500   if (output_bfd != NULL)
2501     /* FIXME: See bfd_perform_relocation.  Is this right?  */
2502     return bfd_reloc_continue;
2503
2504   return nios2_elf32_do_pcrel_lo16_relocate (
2505     abfd, reloc_entry->howto, input_section, data, reloc_entry->address,
2506     (symbol->value + symbol->section->output_section->vma
2507      + symbol->section->output_offset),
2508     reloc_entry->addend);
2509 }
2510
2511 static bfd_reloc_status_type
2512 nios2_elf32_pcrel_hiadj16_relocate (bfd *abfd, arelent *reloc_entry,
2513                                     asymbol *symbol, void *data,
2514                                     asection *input_section, bfd *output_bfd,
2515                                     char **error_message ATTRIBUTE_UNUSED)
2516 {
2517   /* This part is from bfd_elf_generic_reloc.  */
2518   if (output_bfd != NULL
2519       && (symbol->flags & BSF_SECTION_SYM) == 0
2520       && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
2521     {
2522       reloc_entry->address += input_section->output_offset;
2523       return bfd_reloc_ok;
2524     }
2525
2526   if (output_bfd != NULL)
2527     /* FIXME: See bfd_perform_relocation.  Is this right?  */
2528     return bfd_reloc_continue;
2529
2530   return nios2_elf32_do_pcrel_hiadj16_relocate (
2531     abfd, reloc_entry->howto, input_section, data, reloc_entry->address,
2532     (symbol->value + symbol->section->output_section->vma
2533      + symbol->section->output_offset),
2534     reloc_entry->addend);
2535 }
2536
2537 static bfd_reloc_status_type
2538 nios2_elf32_pcrel16_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2539                               void *data, asection *input_section, 
2540                               bfd *output_bfd, 
2541                               char **error_message ATTRIBUTE_UNUSED)
2542 {
2543   /* This part is from bfd_elf_generic_reloc.  */
2544   if (output_bfd != NULL
2545       && (symbol->flags & BSF_SECTION_SYM) == 0
2546       && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
2547     {
2548       reloc_entry->address += input_section->output_offset;
2549       return bfd_reloc_ok;
2550     }
2551
2552   if (output_bfd != NULL)
2553     /* FIXME: See bfd_perform_relocation.  Is this right?  */
2554     return bfd_reloc_continue;
2555
2556   return nios2_elf32_do_pcrel16_relocate (abfd, reloc_entry->howto,
2557                                           input_section,
2558                                           data, reloc_entry->address,
2559                                           (symbol->value
2560                                            + symbol->section->output_section->vma
2561                                            + symbol->section->output_offset),
2562                                           reloc_entry->addend);
2563 }
2564
2565 static bfd_reloc_status_type
2566 nios2_elf32_call26_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2567                              void *data, asection *input_section, 
2568                              bfd *output_bfd, 
2569                              char **error_message ATTRIBUTE_UNUSED)
2570 {
2571   /* This part is from bfd_elf_generic_reloc.  */
2572   if (output_bfd != NULL
2573       && (symbol->flags & BSF_SECTION_SYM) == 0
2574       && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
2575     {
2576       reloc_entry->address += input_section->output_offset;
2577       return bfd_reloc_ok;
2578     }
2579
2580   if (output_bfd != NULL)
2581     /* FIXME: See bfd_perform_relocation.  Is this right?  */
2582     return bfd_reloc_continue;
2583
2584   return nios2_elf32_do_call26_relocate (abfd, reloc_entry->howto,
2585                                          input_section,
2586                                          data, reloc_entry->address,
2587                                          (symbol->value
2588                                           + symbol->section->output_section->vma
2589                                           + symbol->section->output_offset),
2590                                          reloc_entry->addend);
2591 }
2592
2593 static bfd_reloc_status_type
2594 nios2_elf32_gprel_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2595                             void *data, asection *input_section, 
2596                             bfd *output_bfd, char **msg)
2597 {
2598   bfd_vma relocation;
2599   bfd_vma gp;
2600   bfd_reloc_status_type r;
2601
2602
2603   /* This part is from bfd_elf_generic_reloc.  */
2604   if (output_bfd != NULL
2605       && (symbol->flags & BSF_SECTION_SYM) == 0
2606       && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
2607     {
2608       reloc_entry->address += input_section->output_offset;
2609       return bfd_reloc_ok;
2610     }
2611
2612   if (output_bfd != NULL)
2613     /* FIXME: See bfd_perform_relocation.  Is this right?  */
2614     return bfd_reloc_continue;
2615
2616   relocation = (symbol->value
2617                 + symbol->section->output_section->vma
2618                 + symbol->section->output_offset);
2619
2620   /* This assumes we've already cached the _gp symbol.  */
2621   r = nios2_elf_final_gp (abfd, symbol, FALSE, msg, &gp);
2622   if (r == bfd_reloc_ok)
2623     {
2624       relocation = relocation + reloc_entry->addend - gp;
2625       reloc_entry->addend = 0;
2626       if ((signed) relocation < -32768 || (signed) relocation > 32767)
2627         {
2628           *msg = _("global pointer relative address out of range");
2629           r = bfd_reloc_outofrange;
2630         }
2631       else
2632         r = nios2_elf32_do_gprel_relocate (abfd, reloc_entry->howto,
2633                                            input_section,
2634                                            data, reloc_entry->address,
2635                                            relocation, reloc_entry->addend);
2636     }
2637
2638   return r;
2639 }
2640
2641 static bfd_reloc_status_type
2642 nios2_elf32_ujmp_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2643                            void *data, asection *input_section, 
2644                            bfd *output_bfd, char **msg ATTRIBUTE_UNUSED)
2645 {
2646   /* This part is from bfd_elf_generic_reloc.  */
2647   if (output_bfd != NULL
2648       && (symbol->flags & BSF_SECTION_SYM) == 0
2649       && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
2650     {
2651       reloc_entry->address += input_section->output_offset;
2652       return bfd_reloc_ok;
2653     }
2654
2655   if (output_bfd != NULL)
2656     /* FIXME: See bfd_perform_relocation.  Is this right?  */
2657     return bfd_reloc_continue;
2658
2659   return nios2_elf32_do_ujmp_relocate (abfd, reloc_entry->howto,
2660                                        input_section,
2661                                        data, reloc_entry->address,
2662                                        (symbol->value
2663                                         + symbol->section->output_section->vma
2664                                         + symbol->section->output_offset),
2665                                        reloc_entry->addend);
2666 }
2667
2668 static bfd_reloc_status_type
2669 nios2_elf32_cjmp_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2670                            void *data, asection *input_section, 
2671                            bfd *output_bfd, char **msg ATTRIBUTE_UNUSED)
2672 {
2673   /* This part is from bfd_elf_generic_reloc.  */
2674   if (output_bfd != NULL
2675       && (symbol->flags & BSF_SECTION_SYM) == 0
2676       && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
2677     {
2678       reloc_entry->address += input_section->output_offset;
2679       return bfd_reloc_ok;
2680     }
2681
2682   if (output_bfd != NULL)
2683     /* FIXME: See bfd_perform_relocation.  Is this right?  */
2684     return bfd_reloc_continue;
2685
2686   return nios2_elf32_do_cjmp_relocate (abfd, reloc_entry->howto,
2687                                        input_section,
2688                                        data, reloc_entry->address,
2689                                        (symbol->value
2690                                         + symbol->section->output_section->vma
2691                                         + symbol->section->output_offset),
2692                                        reloc_entry->addend);
2693 }
2694
2695 static bfd_reloc_status_type
2696 nios2_elf32_callr_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2697                             void *data, asection *input_section, 
2698                             bfd *output_bfd, char **msg ATTRIBUTE_UNUSED)
2699 {
2700   /* This part is from bfd_elf_generic_reloc.  */
2701   if (output_bfd != NULL
2702       && (symbol->flags & BSF_SECTION_SYM) == 0
2703       && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
2704     {
2705       reloc_entry->address += input_section->output_offset;
2706       return bfd_reloc_ok;
2707     }
2708
2709   if (output_bfd != NULL)
2710     /* FIXME: See bfd_perform_relocation.  Is this right?  */
2711     return bfd_reloc_continue;
2712
2713   return nios2_elf32_do_callr_relocate (abfd, reloc_entry->howto,
2714                                         input_section,
2715                                         data, reloc_entry->address,
2716                                         (symbol->value
2717                                          + symbol->section->output_section->vma
2718                                          + symbol->section->output_offset),
2719                                         reloc_entry->addend);
2720 }
2721
2722  
2723 /* Implement elf_backend_relocate_section.  */
2724 static bfd_boolean
2725 nios2_elf32_relocate_section (bfd *output_bfd,
2726                               struct bfd_link_info *info,
2727                               bfd *input_bfd,
2728                               asection *input_section,
2729                               bfd_byte *contents,
2730                               Elf_Internal_Rela *relocs,
2731                               Elf_Internal_Sym *local_syms,
2732                               asection **local_sections)
2733 {
2734   Elf_Internal_Shdr *symtab_hdr;
2735   struct elf_link_hash_entry **sym_hashes;
2736   Elf_Internal_Rela *rel;
2737   Elf_Internal_Rela *relend;
2738   struct elf32_nios2_link_hash_table *htab;
2739   asection *sgot;
2740   asection *splt;
2741   asection *sreloc = NULL;
2742   bfd_vma *local_got_offsets;
2743   bfd_vma got_base;
2744
2745   symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
2746   sym_hashes = elf_sym_hashes (input_bfd);
2747   relend = relocs + input_section->reloc_count;
2748
2749   htab = elf32_nios2_hash_table (info);
2750   sgot = htab->root.sgot;
2751   splt = htab->root.splt;
2752   local_got_offsets = elf_local_got_offsets (input_bfd);
2753
2754   if (elf32_nios2_hash_table (info)->h_gp_got == NULL)
2755     got_base = 0;
2756   else
2757     got_base = elf32_nios2_hash_table (info)->h_gp_got->root.u.def.value;
2758
2759   for (rel = relocs; rel < relend; rel++)
2760     {
2761       reloc_howto_type *howto;
2762       unsigned long r_symndx;
2763       Elf_Internal_Sym *sym;
2764       asection *sec;
2765       struct elf_link_hash_entry *h;
2766       struct elf32_nios2_link_hash_entry *eh;
2767       bfd_vma relocation;
2768       bfd_vma gp;
2769       bfd_vma reloc_address;
2770       bfd_reloc_status_type r = bfd_reloc_ok;
2771       const char *name = NULL;
2772       int r_type;
2773       const char *format;
2774       char msgbuf[256];
2775       const char* msg = (const char*) NULL;
2776       bfd_boolean unresolved_reloc;
2777       bfd_vma off;
2778       int use_plt;
2779
2780       r_type = ELF32_R_TYPE (rel->r_info);
2781       r_symndx = ELF32_R_SYM (rel->r_info);
2782
2783       howto = lookup_howto ((unsigned) ELF32_R_TYPE (rel->r_info));
2784       h = NULL;
2785       sym = NULL;
2786       sec = NULL;
2787
2788       if (r_symndx < symtab_hdr->sh_info)
2789         {
2790           sym = local_syms + r_symndx;
2791           sec = local_sections[r_symndx];
2792           relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
2793         }
2794       else
2795         {
2796           bfd_boolean warned, ignored;
2797
2798           RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
2799                                    r_symndx, symtab_hdr, sym_hashes,
2800                                    h, sec, relocation,
2801                                    unresolved_reloc, warned, ignored);
2802         }
2803
2804       if (sec && discarded_section (sec))
2805         RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
2806                                          rel, 1, relend, howto, 0, contents);
2807
2808       /* Nothing more to do unless this is a final link.  */
2809       if (info->relocatable)
2810         continue;
2811
2812       if (sec && sec->output_section)
2813         reloc_address = (sec->output_section->vma + sec->output_offset
2814                          + rel->r_offset);
2815       else
2816         reloc_address = 0;
2817                 
2818       if (howto)
2819         {
2820           switch (howto->type)
2821             {
2822             case R_NIOS2_HI16:
2823               r = nios2_elf32_do_hi16_relocate (input_bfd, howto,
2824                                                 input_section,
2825                                                 contents, rel->r_offset,
2826                                                 relocation, rel->r_addend);
2827               break;
2828             case R_NIOS2_LO16:
2829               r = nios2_elf32_do_lo16_relocate (input_bfd, howto,
2830                                                 input_section,
2831                                                 contents, rel->r_offset,
2832                                                 relocation, rel->r_addend);
2833               break;
2834             case R_NIOS2_PCREL_LO:
2835               r = nios2_elf32_do_pcrel_lo16_relocate (input_bfd, howto,
2836                                                       input_section,
2837                                                       contents,
2838                                                       rel->r_offset,
2839                                                       relocation,
2840                                                       rel->r_addend);
2841               break;
2842             case R_NIOS2_HIADJ16:
2843               r = nios2_elf32_do_hiadj16_relocate (input_bfd, howto,
2844                                                    input_section, contents,
2845                                                    rel->r_offset, relocation,
2846                                                    rel->r_addend);
2847               break;
2848             case R_NIOS2_PCREL_HA:
2849               r = nios2_elf32_do_pcrel_hiadj16_relocate (input_bfd, howto,
2850                                                          input_section,
2851                                                          contents,
2852                                                          rel->r_offset,
2853                                                          relocation,
2854                                                          rel->r_addend);
2855               break;
2856             case R_NIOS2_PCREL16:
2857               r = nios2_elf32_do_pcrel16_relocate (input_bfd, howto,
2858                                                    input_section, contents,
2859                                                    rel->r_offset, relocation,
2860                                                    rel->r_addend);
2861               break;
2862             case R_NIOS2_GPREL:
2863               /* Turns an absolute address into a gp-relative address.  */
2864               if (!nios2_elf_assign_gp (output_bfd, &gp, info))
2865                 {
2866                   format = _("global pointer relative relocation at address "
2867                              "0x%08x when _gp not defined\n");
2868                   sprintf (msgbuf, format, reloc_address);
2869                   msg = msgbuf;
2870                   r = bfd_reloc_dangerous;
2871                 }
2872               else
2873                 {
2874                   bfd_vma symbol_address = rel->r_addend + relocation;
2875                   relocation = relocation + rel->r_addend - gp;
2876                   rel->r_addend = 0;
2877                   if (((signed) relocation < -32768
2878                        || (signed) relocation > 32767)
2879                       && (!h
2880                           || h->root.type == bfd_link_hash_defined
2881                           || h->root.type == bfd_link_hash_defweak))
2882                     {
2883                       format = _("Unable to reach %s (at 0x%08x) from the "
2884                                  "global pointer (at 0x%08x) because the "
2885                                  "offset (%d) is out of the allowed range, "
2886                                  "-32678 to 32767.\n" );
2887                       sprintf (msgbuf, format, name, symbol_address, gp, 
2888                                (signed)relocation);
2889                       msg = msgbuf;
2890                       r = bfd_reloc_outofrange;
2891                     }
2892                   else
2893                     r = _bfd_final_link_relocate (howto, input_bfd,
2894                                                   input_section, contents,
2895                                                   rel->r_offset, relocation,
2896                                                   rel->r_addend);
2897                 }
2898
2899               break;
2900             case R_NIOS2_UJMP:
2901               r = nios2_elf32_do_ujmp_relocate (input_bfd, howto,
2902                                                 input_section,
2903                                                 contents, rel->r_offset,
2904                                                 relocation, rel->r_addend);
2905               break;
2906             case R_NIOS2_CJMP:
2907               r = nios2_elf32_do_cjmp_relocate (input_bfd, howto,
2908                                                 input_section,
2909                                                 contents, rel->r_offset,
2910                                                 relocation, rel->r_addend);
2911               break;
2912             case R_NIOS2_CALLR:
2913               r = nios2_elf32_do_callr_relocate (input_bfd, howto,
2914                                                  input_section, contents,
2915                                                  rel->r_offset, relocation,
2916                                                  rel->r_addend);
2917               break;
2918             case R_NIOS2_CALL26:
2919             case R_NIOS2_CALL26_NOAT:
2920               /* If we have a call to an undefined weak symbol, we just want
2921                  to stuff a zero in the bits of the call instruction and
2922                  bypass the normal call26 relocation handling, because it'll
2923                  diagnose an overflow error if address 0 isn't in the same
2924                  256MB segment as the call site.  Presumably the call
2925                  should be guarded by a null check anyway.  */
2926               if (h != NULL && h->root.type == bfd_link_hash_undefweak)
2927                 {
2928                   BFD_ASSERT (relocation == 0 && rel->r_addend == 0);
2929                   r = _bfd_final_link_relocate (howto, input_bfd,
2930                                                 input_section, contents,
2931                                                 rel->r_offset, relocation,
2932                                                 rel->r_addend);
2933                   break;
2934                 }
2935               /* Handle relocations which should use the PLT entry.
2936                  NIOS2_BFD_RELOC_32 relocations will use the symbol's value,
2937                  which may point to a PLT entry, but we don't need to handle
2938                  that here.  If we created a PLT entry, all branches in this
2939                  object should go to it.  */
2940               if (h != NULL && splt != NULL && h->plt.offset != (bfd_vma) -1)
2941                 {
2942                   /* If we've created a .plt section, and assigned a PLT entry
2943                      to this function, it should not be known to bind locally.
2944                      If it were, we would have cleared the PLT entry.  */
2945                   BFD_ASSERT (!SYMBOL_CALLS_LOCAL (info, h));
2946
2947                   relocation = (splt->output_section->vma
2948                                 + splt->output_offset
2949                                 + h->plt.offset);
2950
2951                   unresolved_reloc = FALSE;
2952                 }
2953               /* Detect R_NIOS2_CALL26 relocations that would overflow the
2954                  256MB segment.  Replace the target with a reference to a
2955                  trampoline instead.
2956                  Note that htab->stub_group is null if relaxation has been
2957                  disabled by the --no-relax linker command-line option, so
2958                  we can use that to skip this processing entirely.  */
2959               if (howto->type == R_NIOS2_CALL26 && htab->stub_group)
2960                 {
2961                   bfd_vma dest = relocation + rel->r_addend;
2962                   enum elf32_nios2_stub_type stub_type;
2963
2964                   eh = (struct elf32_nios2_link_hash_entry *)h;
2965                   stub_type = nios2_type_of_stub (input_section, rel, eh,
2966                                                   htab, dest, NULL);
2967
2968                   if (stub_type != nios2_stub_none)
2969                     {
2970                       struct elf32_nios2_stub_hash_entry *hsh;
2971
2972                       hsh = nios2_get_stub_entry (input_section, sec,
2973                                                   eh, rel, htab, stub_type);
2974                       if (hsh == NULL)
2975                         {
2976                           r = bfd_reloc_undefined;
2977                           break;
2978                         }
2979
2980                       dest = (hsh->stub_offset
2981                               + hsh->stub_sec->output_offset
2982                               + hsh->stub_sec->output_section->vma);
2983                       r = nios2_elf32_do_call26_relocate (input_bfd, howto,
2984                                                           input_section,
2985                                                           contents,
2986                                                           rel->r_offset,
2987                                                           dest, 0);
2988                       break;
2989                     }
2990                 }
2991
2992               /* Normal case.  */
2993               r = nios2_elf32_do_call26_relocate (input_bfd, howto,
2994                                                   input_section, contents,
2995                                                   rel->r_offset, relocation,
2996                                                   rel->r_addend);
2997               break;
2998             case R_NIOS2_ALIGN:
2999               r = bfd_reloc_ok;
3000               /* For symmetry this would be
3001                  r = nios2_elf32_do_ignore_reloc (input_bfd, howto,
3002                                                   input_section, contents,
3003                                                   rel->r_offset, relocation,
3004                                                   rel->r_addend);
3005                 but do_ignore_reloc would do no more than return
3006                 bfd_reloc_ok. */
3007               break;
3008
3009             case R_NIOS2_GOT16:
3010             case R_NIOS2_CALL16:
3011             case R_NIOS2_GOT_LO:
3012             case R_NIOS2_GOT_HA:
3013             case R_NIOS2_CALL_LO:
3014             case R_NIOS2_CALL_HA:
3015               /* Relocation is to the entry for this symbol in the
3016                  global offset table.  */
3017               if (sgot == NULL)
3018                 {
3019                   r = bfd_reloc_notsupported;
3020                   break;
3021                 }
3022
3023               use_plt = 0;
3024
3025               if (h != NULL)
3026                 {
3027                   bfd_boolean dyn;
3028
3029                   eh = (struct elf32_nios2_link_hash_entry *)h;
3030                   use_plt = (eh->got_types_used == CALL_USED
3031                              && h->plt.offset != (bfd_vma) -1);
3032
3033                   off = h->got.offset;
3034                   BFD_ASSERT (off != (bfd_vma) -1);
3035                   dyn = elf_hash_table (info)->dynamic_sections_created;
3036                   if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
3037                       || (info->shared
3038                           && SYMBOL_REFERENCES_LOCAL (info, h))
3039                       || (ELF_ST_VISIBILITY (h->other)
3040                           && h->root.type == bfd_link_hash_undefweak))
3041                     {
3042                       /* This is actually a static link, or it is a -Bsymbolic
3043                          link and the symbol is defined locally.  We must
3044                          initialize this entry in the global offset table.
3045                          Since the offset must always be a multiple of 4, we
3046                          use the least significant bit to record whether we
3047                          have initialized it already.
3048
3049                          When doing a dynamic link, we create a .rela.got
3050                          relocation entry to initialize the value.  This is
3051                          done in the finish_dynamic_symbol routine.  */
3052                       if ((off & 1) != 0)
3053                         off &= ~1;
3054                       else
3055                         {
3056                           bfd_put_32 (output_bfd, relocation,
3057                                       sgot->contents + off);
3058                           h->got.offset |= 1;
3059                         }
3060                     }
3061                   else
3062                     unresolved_reloc = FALSE;
3063                 }
3064               else
3065                 {
3066                   BFD_ASSERT (local_got_offsets != NULL
3067                               && local_got_offsets[r_symndx] != (bfd_vma) -1);
3068
3069                   off = local_got_offsets[r_symndx];
3070
3071                   /* The offset must always be a multiple of 4.  We use the
3072                      least significant bit to record whether we have already
3073                      generated the necessary reloc.  */
3074                   if ((off & 1) != 0)
3075                     off &= ~1;
3076                   else
3077                     {
3078                       bfd_put_32 (output_bfd, relocation,
3079                                   sgot->contents + off);
3080
3081                       if (info->shared)
3082                         {
3083                           asection *srelgot;
3084                           Elf_Internal_Rela outrel;
3085                           bfd_byte *loc;
3086
3087                           srelgot = htab->root.srelgot;
3088                           BFD_ASSERT (srelgot != NULL);
3089
3090                           outrel.r_addend = relocation;
3091                           outrel.r_offset = (sgot->output_section->vma
3092                                              + sgot->output_offset
3093                                              + off);
3094                           outrel.r_info = ELF32_R_INFO (0, R_NIOS2_RELATIVE);
3095                           loc = srelgot->contents;
3096                           loc += (srelgot->reloc_count++ *
3097                                   sizeof (Elf32_External_Rela));
3098                           bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
3099                         }
3100
3101                       local_got_offsets[r_symndx] |= 1;
3102                     }
3103                 }
3104
3105               if (use_plt && info->shared)
3106                 {
3107                   off = ((h->plt.offset - 24) / 12 + 3) * 4;
3108                   relocation = (htab->root.sgotplt->output_offset + off
3109                                 - got_base);
3110                 }
3111               else
3112                 relocation = sgot->output_offset + off - got_base;
3113
3114               /* This relocation does not use the addend.  */
3115               rel->r_addend = 0;
3116
3117               switch (howto->type)
3118                 {
3119                 case R_NIOS2_GOT_LO:
3120                 case R_NIOS2_CALL_LO:
3121                   r = nios2_elf32_do_lo16_relocate (input_bfd, howto,
3122                                                     input_section, contents,
3123                                                     rel->r_offset, relocation,
3124                                                     rel->r_addend);
3125                   break;
3126                 case R_NIOS2_GOT_HA:
3127                 case R_NIOS2_CALL_HA:
3128                   r = nios2_elf32_do_hiadj16_relocate (input_bfd, howto,
3129                                                        input_section, contents,
3130                                                        rel->r_offset,
3131                                                        relocation,
3132                                                        rel->r_addend);
3133                   break;
3134                 default:
3135                   r = _bfd_final_link_relocate (howto, input_bfd,
3136                                                 input_section, contents,
3137                                                 rel->r_offset, relocation,
3138                                                 rel->r_addend);
3139                   break;
3140                 }
3141               break;
3142
3143             case R_NIOS2_GOTOFF_LO:
3144             case R_NIOS2_GOTOFF_HA:
3145             case R_NIOS2_GOTOFF:
3146               /* Relocation is relative to the global offset table pointer.  */
3147
3148               BFD_ASSERT (sgot != NULL);
3149               if (sgot == NULL)
3150                 {
3151                   r = bfd_reloc_notsupported;
3152                   break;
3153                 }
3154
3155               /* Note that sgot->output_offset is not involved in this
3156                  calculation.  We always want the start of .got.  */
3157               relocation -= sgot->output_section->vma;
3158
3159               /* Now we adjust the relocation to be relative to the GOT pointer
3160                  (the _gp_got symbol), which possibly contains the 0x8000 bias.  */
3161               relocation -= got_base;
3162
3163               switch (howto->type)
3164                 {
3165                 case R_NIOS2_GOTOFF_LO:
3166                   r = nios2_elf32_do_lo16_relocate (input_bfd, howto,
3167                                                     input_section, contents,
3168                                                     rel->r_offset, relocation,
3169                                                     rel->r_addend);
3170                   break;
3171                 case R_NIOS2_GOTOFF_HA:
3172                   r = nios2_elf32_do_hiadj16_relocate (input_bfd, howto,
3173                                                        input_section, contents,
3174                                                        rel->r_offset,
3175                                                        relocation,
3176                                                        rel->r_addend);
3177                   break;
3178                 default:
3179                   r = _bfd_final_link_relocate (howto, input_bfd,
3180                                                 input_section, contents,
3181                                                 rel->r_offset, relocation,
3182                                                 rel->r_addend);
3183                   break;
3184                 }
3185               break;
3186
3187             case R_NIOS2_TLS_LDO16:
3188               relocation -= dtpoff_base (info) + DTP_OFFSET;
3189
3190               r = _bfd_final_link_relocate (howto, input_bfd, input_section,
3191                                             contents, rel->r_offset,
3192                                             relocation, rel->r_addend);
3193               break;
3194             case R_NIOS2_TLS_LDM16:
3195               if (htab->root.sgot == NULL)
3196                 abort ();
3197
3198               off = htab->tls_ldm_got.offset;
3199
3200               if ((off & 1) != 0)
3201                 off &= ~1;
3202               else
3203                 {
3204                   /* If we don't know the module number, create a relocation
3205                      for it.  */
3206                   if (info->shared)
3207                     {
3208                       Elf_Internal_Rela outrel;
3209                       bfd_byte *loc;
3210
3211                       if (htab->root.srelgot == NULL)
3212                         abort ();
3213
3214                       outrel.r_addend = 0;
3215                       outrel.r_offset = (htab->root.sgot->output_section->vma
3216                                          + htab->root.sgot->output_offset
3217                                          + off);
3218                       outrel.r_info = ELF32_R_INFO (0, R_NIOS2_TLS_DTPMOD);
3219
3220                       loc = htab->root.srelgot->contents;
3221                       loc += (htab->root.srelgot->reloc_count++
3222                               * sizeof (Elf32_External_Rela));
3223                       bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
3224                     }
3225                   else
3226                     bfd_put_32 (output_bfd, 1,
3227                                 htab->root.sgot->contents + off);
3228
3229                   htab->tls_ldm_got.offset |= 1;
3230                 }
3231
3232               relocation = htab->root.sgot->output_offset + off - got_base;
3233
3234               r = _bfd_final_link_relocate (howto, input_bfd, input_section,
3235                                             contents, rel->r_offset,
3236                                             relocation, rel->r_addend);
3237
3238               break;
3239             case R_NIOS2_TLS_GD16:
3240             case R_NIOS2_TLS_IE16:
3241               {
3242                 int indx;
3243                 char tls_type;
3244
3245                 if (htab->root.sgot == NULL)
3246                   abort ();
3247
3248                 indx = 0;
3249                 if (h != NULL)
3250                   {
3251                     bfd_boolean dyn;
3252                     dyn = htab->root.dynamic_sections_created;
3253                     if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
3254                         && (!info->shared
3255                             || !SYMBOL_REFERENCES_LOCAL (info, h)))
3256                       {
3257                         unresolved_reloc = FALSE;
3258                         indx = h->dynindx;
3259                       }
3260                     off = h->got.offset;
3261                     tls_type = (((struct elf32_nios2_link_hash_entry *) h)
3262                                 ->tls_type);
3263                   }
3264                 else
3265                   {
3266                     if (local_got_offsets == NULL)
3267                       abort ();
3268                     off = local_got_offsets[r_symndx];
3269                     tls_type = (elf32_nios2_local_got_tls_type (input_bfd)
3270                                 [r_symndx]);
3271                   }
3272
3273                 if (tls_type == GOT_UNKNOWN)
3274                   abort ();
3275
3276                 if ((off & 1) != 0)
3277                   off &= ~1;
3278                 else
3279                   {
3280                     bfd_boolean need_relocs = FALSE;
3281                     Elf_Internal_Rela outrel;
3282                     bfd_byte *loc = NULL;
3283                     int cur_off = off;
3284
3285                     /* The GOT entries have not been initialized yet.  Do it
3286                        now, and emit any relocations.  If both an IE GOT and a
3287                        GD GOT are necessary, we emit the GD first.  */
3288
3289                     if ((info->shared || indx != 0)
3290                         && (h == NULL
3291                             || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
3292                             || h->root.type != bfd_link_hash_undefweak))
3293                       {
3294                         need_relocs = TRUE;
3295                         if (htab->root.srelgot == NULL)
3296                           abort ();
3297                         loc = htab->root.srelgot->contents;
3298                         loc += (htab->root.srelgot->reloc_count *
3299                                 sizeof (Elf32_External_Rela));
3300                       }
3301
3302                     if (tls_type & GOT_TLS_GD)
3303                       {
3304                         if (need_relocs)
3305                           {
3306                             outrel.r_addend = 0;
3307                             outrel.r_offset = (htab->root.sgot->output_section->vma
3308                                                + htab->root.sgot->output_offset
3309                                                + cur_off);
3310                             outrel.r_info = ELF32_R_INFO (indx,
3311                                                           R_NIOS2_TLS_DTPMOD);
3312
3313                             bfd_elf32_swap_reloca_out (output_bfd, &outrel,
3314                                                        loc);
3315                             htab->root.srelgot->reloc_count++;
3316                             loc += sizeof (Elf32_External_Rela);
3317
3318                             if (indx == 0)
3319                               bfd_put_32 (output_bfd,
3320                                           (relocation - dtpoff_base (info) -
3321                                            DTP_OFFSET),
3322                                           htab->root.sgot->contents + cur_off + 4);
3323                             else
3324                               {
3325                                 outrel.r_addend = 0;
3326                                 outrel.r_info = ELF32_R_INFO (indx,
3327                                   R_NIOS2_TLS_DTPREL);
3328                                 outrel.r_offset += 4;
3329
3330                                 bfd_elf32_swap_reloca_out (output_bfd, &outrel,
3331                                                            loc);
3332                                 htab->root.srelgot->reloc_count++;
3333                                 loc += sizeof (Elf32_External_Rela);
3334                               }
3335                           }
3336                         else
3337                           {
3338                             /* If we are not emitting relocations for a
3339                                general dynamic reference, then we must be in a
3340                                static link or an executable link with the
3341                                symbol binding locally.  Mark it as belonging
3342                                to module 1, the executable.  */
3343                             bfd_put_32 (output_bfd, 1,
3344                                         htab->root.sgot->contents + cur_off);
3345                             bfd_put_32 (output_bfd, (relocation -
3346                                                      dtpoff_base (info) -
3347                                                      DTP_OFFSET),
3348                                         htab->root.sgot->contents + cur_off + 4);
3349                           }
3350
3351                         cur_off += 8;
3352                       }
3353
3354                     if (tls_type & GOT_TLS_IE)
3355                       {
3356                         if (need_relocs)
3357                           {
3358                             if (indx == 0)
3359                               outrel.r_addend = (relocation -
3360                                                  dtpoff_base (info));
3361                             else
3362                               outrel.r_addend = 0;
3363                             outrel.r_offset = (htab->root.sgot->output_section->vma
3364                                                + htab->root.sgot->output_offset
3365                                                + cur_off);
3366                             outrel.r_info = ELF32_R_INFO (indx,
3367                                                           R_NIOS2_TLS_TPREL);
3368
3369                             bfd_elf32_swap_reloca_out (output_bfd, &outrel,
3370                                                        loc);
3371                             htab->root.srelgot->reloc_count++;
3372                             loc += sizeof (Elf32_External_Rela);
3373                           }
3374                         else
3375                           bfd_put_32 (output_bfd, (tpoff (info, relocation)
3376                                                    - TP_OFFSET),
3377                                       htab->root.sgot->contents + cur_off);
3378                         cur_off += 4;
3379                       }
3380
3381                     if (h != NULL)
3382                       h->got.offset |= 1;
3383                     else
3384                       local_got_offsets[r_symndx] |= 1;
3385                   }
3386
3387                 if ((tls_type & GOT_TLS_GD) && r_type != R_NIOS2_TLS_GD16)
3388                   off += 8;
3389                 relocation = htab->root.sgot->output_offset + off - got_base;
3390
3391                 r = _bfd_final_link_relocate (howto, input_bfd, input_section,
3392                                               contents, rel->r_offset,
3393                                               relocation, rel->r_addend);
3394               }
3395
3396               break;
3397             case R_NIOS2_TLS_LE16:
3398               if (info->shared && !info->pie)
3399                 {
3400                   (*_bfd_error_handler)
3401                     (_("%B(%A+0x%lx): R_NIOS2_TLS_LE16 relocation not "
3402                        "permitted in shared object"),
3403                      input_bfd, input_section,
3404                      (long) rel->r_offset, howto->name);
3405                   return FALSE;
3406                 }
3407               else
3408                 relocation = tpoff (info, relocation) - TP_OFFSET;
3409
3410               r = _bfd_final_link_relocate (howto, input_bfd, input_section,
3411                                             contents, rel->r_offset,
3412                                             relocation, rel->r_addend);
3413               break;
3414
3415             case R_NIOS2_BFD_RELOC_32:
3416               if (info->shared
3417                   && (input_section->flags & SEC_ALLOC) != 0
3418                   && (h == NULL
3419                       || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
3420                       || h->root.type != bfd_link_hash_undefweak))
3421                 {
3422                   Elf_Internal_Rela outrel;
3423                   bfd_byte *loc;
3424                   bfd_boolean skip, relocate;
3425
3426                   /* When generating a shared object, these relocations
3427                      are copied into the output file to be resolved at run
3428                      time.  */
3429
3430                   skip = FALSE;
3431                   relocate = FALSE;
3432
3433                   outrel.r_offset
3434                     = _bfd_elf_section_offset (output_bfd, info,
3435                                                input_section, rel->r_offset);
3436                   if (outrel.r_offset == (bfd_vma) -1)
3437                     skip = TRUE;
3438                   else if (outrel.r_offset == (bfd_vma) -2)
3439                     skip = TRUE, relocate = TRUE;
3440                   outrel.r_offset += (input_section->output_section->vma
3441                                       + input_section->output_offset);
3442
3443                   if (skip)
3444                     memset (&outrel, 0, sizeof outrel);
3445                   else if (h != NULL
3446                            && h->dynindx != -1
3447                            && (!info->shared
3448                                || !info->symbolic
3449                                || !h->def_regular))
3450                     {
3451                       outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
3452                       outrel.r_addend = rel->r_addend;
3453                     }
3454                   else
3455                     {
3456                       /* This symbol is local, or marked to become local.  */
3457                       outrel.r_addend = relocation + rel->r_addend;
3458                       relocate = TRUE;
3459                       outrel.r_info = ELF32_R_INFO (0, R_NIOS2_RELATIVE);
3460                     }
3461
3462                   sreloc = elf_section_data (input_section)->sreloc;
3463                   if (sreloc == NULL)
3464                     abort ();
3465
3466                   loc = sreloc->contents;
3467                   loc += sreloc->reloc_count++ * sizeof (Elf32_External_Rela);
3468                   bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
3469
3470                   /* This reloc will be computed at runtime, so there's no
3471                      need to do anything now, except for R_NIOS2_BFD_RELOC_32
3472                      relocations that have been turned into
3473                      R_NIOS2_RELATIVE.  */
3474                   if (!relocate)
3475                     break;
3476                 }
3477
3478               r = _bfd_final_link_relocate (howto, input_bfd,
3479                                             input_section, contents,
3480                                             rel->r_offset, relocation,
3481                                             rel->r_addend);
3482               break;
3483
3484             case R_NIOS2_TLS_DTPREL:
3485               relocation -= dtpoff_base (info);
3486               /* Fall through.  */
3487
3488             default:
3489               r = _bfd_final_link_relocate (howto, input_bfd,
3490                                             input_section, contents,
3491                                             rel->r_offset, relocation,
3492                                             rel->r_addend);
3493               break;
3494             }
3495         }
3496       else
3497         r = bfd_reloc_notsupported;
3498
3499       if (r != bfd_reloc_ok)
3500         {
3501           if (h != NULL)
3502             name = h->root.root.string;
3503           else
3504             {
3505               name = bfd_elf_string_from_elf_section (input_bfd,
3506                                                       symtab_hdr->sh_link,
3507                                                       sym->st_name);
3508               if (name == NULL || *name == '\0')
3509                 name = bfd_section_name (input_bfd, sec);
3510             }
3511
3512           switch (r)
3513             {
3514             case bfd_reloc_overflow:
3515               r = info->callbacks->reloc_overflow (info, NULL, name,
3516                                                    howto->name, (bfd_vma) 0,
3517                                                    input_bfd, input_section,
3518                                                    rel->r_offset);
3519               break;
3520
3521             case bfd_reloc_undefined:
3522               r = info->callbacks->undefined_symbol (info, name, input_bfd,
3523                                                      input_section,
3524                                                      rel->r_offset, TRUE);
3525               break;
3526
3527             case bfd_reloc_outofrange:
3528               if (msg == NULL)
3529                 msg = _("relocation out of range");
3530               break;
3531
3532             case bfd_reloc_notsupported:
3533               if (msg == NULL)
3534                 msg = _("unsupported relocation");
3535               break;
3536
3537             case bfd_reloc_dangerous:
3538               if (msg == NULL)
3539                 msg = _("dangerous relocation");
3540               break;
3541
3542             default:
3543               if (msg == NULL)
3544                 msg = _("unknown error");
3545               break;
3546             }
3547
3548           if (msg)
3549             {
3550               r = info->callbacks->warning
3551                 (info, msg, name, input_bfd, input_section, rel->r_offset);
3552               return FALSE;
3553             }
3554         }
3555     }
3556   return TRUE;
3557 }
3558
3559 /* Implement elf-backend_section_flags:
3560    Convert NIOS2 specific section flags to bfd internal section flags.  */
3561 static bfd_boolean
3562 nios2_elf32_section_flags (flagword *flags, const Elf_Internal_Shdr *hdr)
3563 {
3564   if (hdr->sh_flags & SHF_NIOS2_GPREL)
3565     *flags |= SEC_SMALL_DATA;
3566
3567   return TRUE;
3568 }
3569
3570 /* Implement elf_backend_fake_sections:
3571    Set the correct type for an NIOS2 ELF section.  We do this by the
3572    section name, which is a hack, but ought to work.  */
3573 static bfd_boolean
3574 nios2_elf32_fake_sections (bfd *abfd ATTRIBUTE_UNUSED,
3575                            Elf_Internal_Shdr *hdr, asection *sec)
3576 {
3577   register const char *name = bfd_get_section_name (abfd, sec);
3578
3579   if ((sec->flags & SEC_SMALL_DATA)
3580       || strcmp (name, ".sdata") == 0
3581       || strcmp (name, ".sbss") == 0
3582       || strcmp (name, ".lit4") == 0 || strcmp (name, ".lit8") == 0)
3583     hdr->sh_flags |= SHF_NIOS2_GPREL;
3584
3585   return TRUE;
3586 }
3587
3588 /* Create .got, .gotplt, and .rela.got sections in DYNOBJ, and set up
3589    shortcuts to them in our hash table.  */
3590 static bfd_boolean
3591 create_got_section (bfd *dynobj, struct bfd_link_info *info)
3592 {
3593   struct elf32_nios2_link_hash_table *htab;
3594   struct elf_link_hash_entry *h;
3595
3596   htab = elf32_nios2_hash_table (info);
3597
3598   if (! _bfd_elf_create_got_section (dynobj, info))
3599     return FALSE;
3600
3601   /* In order for the two loads in .PLTresolve to share the same %hiadj,
3602      _GLOBAL_OFFSET_TABLE_ must be aligned to a 16-byte boundary.  */
3603   if (!bfd_set_section_alignment (dynobj, htab->root.sgotplt, 4))
3604     return FALSE;
3605
3606   /* The Nios II ABI specifies that GOT-relative relocations are relative
3607      to the linker-created symbol _gp_got, rather than using
3608      _GLOBAL_OFFSET_TABLE_ directly.  In particular, the latter always
3609      points to the base of the GOT while _gp_got may include a bias.  */
3610   h = _bfd_elf_define_linkage_sym (dynobj, info, htab->root.sgotplt,
3611                                    "_gp_got");
3612   elf32_nios2_hash_table (info)->h_gp_got = h;
3613   if (h == NULL)
3614     return FALSE;
3615
3616   return TRUE;
3617 }
3618
3619 /* Implement elf_backend_create_dynamic_sections:
3620    Create .plt, .rela.plt, .got, .got.plt, .rela.got, .dynbss, and
3621    .rela.bss sections in DYNOBJ, and set up shortcuts to them in our
3622    hash table.  */
3623 static bfd_boolean
3624 nios2_elf32_create_dynamic_sections (bfd *dynobj, struct bfd_link_info *info)
3625 {
3626   struct elf32_nios2_link_hash_table *htab;
3627
3628   htab = elf32_nios2_hash_table (info);
3629   if (!htab->root.sgot && !create_got_section (dynobj, info))
3630     return FALSE;
3631
3632   _bfd_elf_create_dynamic_sections (dynobj, info);
3633
3634   /* In order for the two loads in a shared object .PLTresolve to share the
3635      same %hiadj, the start of the PLT (as well as the GOT) must be aligned
3636      to a 16-byte boundary.  This is because the addresses for these loads
3637      include the -(.plt+4) PIC correction.  */
3638   if (!bfd_set_section_alignment (dynobj, htab->root.splt, 4))
3639     return FALSE;
3640
3641   htab->sdynbss = bfd_get_linker_section (dynobj, ".dynbss");
3642   if (!htab->sdynbss)
3643     return FALSE;
3644   if (!info->shared)
3645     {
3646       htab->srelbss = bfd_get_linker_section (dynobj, ".rela.bss");
3647       if (!htab->srelbss)
3648         return FALSE;
3649     }
3650
3651   return TRUE;
3652 }
3653
3654 /* Implement elf_backend_copy_indirect_symbol:
3655    Copy the extra info we tack onto an elf_link_hash_entry.  */
3656 static void
3657 nios2_elf32_copy_indirect_symbol (struct bfd_link_info *info,
3658                                   struct elf_link_hash_entry *dir,
3659                                   struct elf_link_hash_entry *ind)
3660 {
3661   struct elf32_nios2_link_hash_entry *edir, *eind;
3662
3663   edir = (struct elf32_nios2_link_hash_entry *) dir;
3664   eind = (struct elf32_nios2_link_hash_entry *) ind;
3665
3666   if (eind->dyn_relocs != NULL)
3667     {
3668       if (edir->dyn_relocs != NULL)
3669         {
3670           struct elf32_nios2_dyn_relocs **pp;
3671           struct elf32_nios2_dyn_relocs *p;
3672
3673           /* Add reloc counts against the indirect sym to the direct sym
3674              list.  Merge any entries against the same section.  */
3675           for (pp = &eind->dyn_relocs; (p = *pp) != NULL; )
3676             {
3677               struct elf32_nios2_dyn_relocs *q;
3678
3679               for (q = edir->dyn_relocs; q != NULL; q = q->next)
3680                 if (q->sec == p->sec)
3681                   {
3682                     q->pc_count += p->pc_count;
3683                     q->count += p->count;
3684                     *pp = p->next;
3685                     break;
3686                   }
3687               if (q == NULL)
3688                 pp = &p->next;
3689             }
3690           *pp = edir->dyn_relocs;
3691         }
3692
3693       edir->dyn_relocs = eind->dyn_relocs;
3694       eind->dyn_relocs = NULL;
3695     }
3696
3697   if (ind->root.type == bfd_link_hash_indirect
3698       && dir->got.refcount <= 0)
3699     {
3700       edir->tls_type = eind->tls_type;
3701       eind->tls_type = GOT_UNKNOWN;
3702     }
3703
3704   edir->got_types_used |= eind->got_types_used;
3705
3706   _bfd_elf_link_hash_copy_indirect (info, dir, ind);
3707 }
3708
3709 /* Implement elf_backend_check_relocs:
3710    Look through the relocs for a section during the first phase.  */
3711 static bfd_boolean
3712 nios2_elf32_check_relocs (bfd *abfd, struct bfd_link_info *info,
3713                           asection *sec, const Elf_Internal_Rela *relocs)
3714 {
3715   bfd *dynobj;
3716   Elf_Internal_Shdr *symtab_hdr;
3717   struct elf_link_hash_entry **sym_hashes, **sym_hashes_end;
3718   const Elf_Internal_Rela *rel;
3719   const Elf_Internal_Rela *rel_end;
3720   struct elf32_nios2_link_hash_table *htab;
3721   asection *sgot;
3722   asection *srelgot;
3723   asection *sreloc = NULL;
3724   bfd_signed_vma *local_got_refcounts;
3725
3726   if (info->relocatable)
3727     return TRUE;
3728
3729   dynobj = elf_hash_table (info)->dynobj;
3730   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
3731   sym_hashes = elf_sym_hashes (abfd);
3732   sym_hashes_end = (sym_hashes
3733                     + symtab_hdr->sh_size / sizeof (Elf32_External_Sym));
3734   if (!elf_bad_symtab (abfd))
3735     sym_hashes_end -= symtab_hdr->sh_info;
3736   local_got_refcounts = elf_local_got_refcounts (abfd);
3737
3738   htab = elf32_nios2_hash_table (info);
3739   sgot = htab->root.sgot;
3740   srelgot = htab->root.srelgot;
3741
3742   rel_end = relocs + sec->reloc_count;
3743   for (rel = relocs; rel < rel_end; rel++)
3744     {
3745       unsigned int r_type;
3746       struct elf_link_hash_entry *h;
3747       unsigned long r_symndx;
3748
3749       r_symndx = ELF32_R_SYM (rel->r_info);
3750       if (r_symndx < symtab_hdr->sh_info)
3751         h = NULL;
3752       else
3753         {
3754           h = sym_hashes[r_symndx - symtab_hdr->sh_info];
3755           while (h->root.type == bfd_link_hash_indirect
3756                  || h->root.type == bfd_link_hash_warning)
3757             h = (struct elf_link_hash_entry *) h->root.u.i.link;
3758
3759           /* PR15323, ref flags aren't set for references in the same
3760              object.  */
3761           h->root.non_ir_ref = 1;
3762         }
3763
3764       r_type = ELF32_R_TYPE (rel->r_info);
3765
3766       switch (r_type)
3767         {
3768         case R_NIOS2_GOT16:
3769         case R_NIOS2_GOT_LO:
3770         case R_NIOS2_GOT_HA:
3771         case R_NIOS2_CALL16:
3772         case R_NIOS2_CALL_LO:
3773         case R_NIOS2_CALL_HA:
3774         case R_NIOS2_TLS_GD16:
3775         case R_NIOS2_TLS_IE16:
3776           /* This symbol requires a global offset table entry.  */
3777           {
3778             int tls_type, old_tls_type;
3779
3780             switch (r_type)
3781               {
3782               default:
3783               case R_NIOS2_GOT16:
3784               case R_NIOS2_GOT_LO:
3785               case R_NIOS2_GOT_HA:
3786               case R_NIOS2_CALL16:
3787               case R_NIOS2_CALL_LO:
3788               case R_NIOS2_CALL_HA:
3789                 tls_type = GOT_NORMAL;
3790                 break;
3791               case R_NIOS2_TLS_GD16:
3792                 tls_type = GOT_TLS_GD;
3793                 break;
3794               case R_NIOS2_TLS_IE16:
3795                 tls_type = GOT_TLS_IE;
3796                 break;
3797               }
3798
3799             if (dynobj == NULL)
3800               {
3801                 /* Create the .got section.  */
3802                 elf_hash_table (info)->dynobj = dynobj = abfd;
3803                 nios2_elf32_create_dynamic_sections (dynobj, info);
3804               }
3805
3806             if (sgot == NULL)
3807               {
3808                 sgot = htab->root.sgot;
3809                 BFD_ASSERT (sgot != NULL);
3810               }
3811
3812             if (srelgot == NULL
3813                 && (h != NULL || info->shared))
3814               {
3815                 srelgot = htab->root.srelgot;
3816                 BFD_ASSERT (srelgot != NULL);
3817               }
3818
3819             if (h != NULL)
3820               {
3821                 struct elf32_nios2_link_hash_entry *eh
3822                   = (struct elf32_nios2_link_hash_entry *)h;
3823                 h->got.refcount++;
3824                 old_tls_type = elf32_nios2_hash_entry(h)->tls_type;
3825                 if (r_type == R_NIOS2_CALL16
3826                     || r_type == R_NIOS2_CALL_LO
3827                     || r_type == R_NIOS2_CALL_HA)
3828                   {
3829                     /* Make sure a plt entry is created for this symbol if
3830                        it turns out to be a function defined by a dynamic
3831                        object.  */
3832                     h->plt.refcount++;
3833                     h->needs_plt = 1;
3834                     h->type = STT_FUNC;
3835                     eh->got_types_used |= CALL_USED;
3836                   }
3837                 else
3838                   eh->got_types_used |= GOT_USED;
3839               }
3840             else
3841               {
3842                 /* This is a global offset table entry for a local symbol.  */
3843                 if (local_got_refcounts == NULL)
3844                   {
3845                     bfd_size_type size;
3846
3847                     size = symtab_hdr->sh_info;
3848                     size *= (sizeof (bfd_signed_vma) + sizeof (char));
3849                     local_got_refcounts
3850                       = ((bfd_signed_vma *) bfd_zalloc (abfd, size));
3851                     if (local_got_refcounts == NULL)
3852                       return FALSE;
3853                     elf_local_got_refcounts (abfd) = local_got_refcounts;
3854                     elf32_nios2_local_got_tls_type (abfd)
3855                       = (char *) (local_got_refcounts + symtab_hdr->sh_info);
3856                   }
3857                 local_got_refcounts[r_symndx]++;
3858                 old_tls_type = elf32_nios2_local_got_tls_type (abfd) [r_symndx];
3859               }
3860
3861             /* We will already have issued an error message if there is a
3862                TLS / non-TLS mismatch, based on the symbol type.  We don't
3863                support any linker relaxations.  So just combine any TLS
3864                types needed.  */
3865             if (old_tls_type != GOT_UNKNOWN && old_tls_type != GOT_NORMAL
3866                 && tls_type != GOT_NORMAL)
3867               tls_type |= old_tls_type;
3868
3869             if (old_tls_type != tls_type)
3870               {
3871                 if (h != NULL)
3872                   elf32_nios2_hash_entry (h)->tls_type = tls_type;
3873                 else
3874                   elf32_nios2_local_got_tls_type (abfd) [r_symndx] = tls_type;
3875               }
3876           }
3877           /* Fall through */
3878         case R_NIOS2_TLS_LDM16:
3879           if (r_type == R_NIOS2_TLS_LDM16)
3880             htab->tls_ldm_got.refcount++;
3881
3882           if (htab->root.sgot == NULL)
3883             {
3884               if (htab->root.dynobj == NULL)
3885                 htab->root.dynobj = abfd;
3886               if (!create_got_section (htab->root.dynobj, info))
3887                 return FALSE;
3888             }
3889           break;
3890
3891           /* This relocation describes the C++ object vtable hierarchy.
3892              Reconstruct it for later use during GC.  */
3893         case R_NIOS2_GNU_VTINHERIT:
3894           if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
3895             return FALSE;
3896           break;
3897
3898           /* This relocation describes which C++ vtable entries are actually
3899              used.  Record for later use during GC.  */
3900         case R_NIOS2_GNU_VTENTRY:
3901           if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
3902             return FALSE;
3903           break;
3904
3905         case R_NIOS2_BFD_RELOC_32:
3906         case R_NIOS2_CALL26:
3907         case R_NIOS2_CALL26_NOAT:
3908         case R_NIOS2_HIADJ16:
3909         case R_NIOS2_LO16:
3910
3911           if (h != NULL)
3912             {
3913               /* If this reloc is in a read-only section, we might
3914                    need a copy reloc.  We can't check reliably at this
3915                    stage whether the section is read-only, as input
3916                    sections have not yet been mapped to output sections.
3917                    Tentatively set the flag for now, and correct in
3918                    adjust_dynamic_symbol.  */
3919               if (!info->shared)
3920                 h->non_got_ref = 1;
3921
3922               /* Make sure a plt entry is created for this symbol if it
3923                  turns out to be a function defined by a dynamic object.  */
3924               h->plt.refcount++;
3925
3926               if (r_type == R_NIOS2_CALL26 || r_type == R_NIOS2_CALL26_NOAT)
3927                 h->needs_plt = 1;
3928             }
3929
3930           /* If we are creating a shared library, we need to copy the
3931              reloc into the shared library.  */
3932           if (info->shared
3933               && (sec->flags & SEC_ALLOC) != 0
3934               && (r_type == R_NIOS2_BFD_RELOC_32
3935                   || (h != NULL && ! h->needs_plt
3936                       && (! info->symbolic || ! h->def_regular))))
3937             {
3938               struct elf32_nios2_dyn_relocs *p;
3939               struct elf32_nios2_dyn_relocs **head;
3940
3941               /* When creating a shared object, we must copy these
3942                  reloc types into the output file.  We create a reloc
3943                  section in dynobj and make room for this reloc.  */
3944               if (sreloc == NULL)
3945                 {
3946                   sreloc = _bfd_elf_make_dynamic_reloc_section
3947                     (sec, dynobj, 2, abfd, TRUE);
3948                   if (sreloc == NULL)
3949                     return FALSE;
3950                 }
3951
3952               /* If this is a global symbol, we count the number of
3953                  relocations we need for this symbol.  */
3954               if (h != NULL)
3955                 head = &((struct elf32_nios2_link_hash_entry *) h)->dyn_relocs;
3956               else
3957                 {
3958                   /* Track dynamic relocs needed for local syms too.
3959                      We really need local syms available to do this
3960                      easily.  Oh well.  */
3961
3962                   asection *s;
3963                   void *vpp;
3964                   Elf_Internal_Sym *isym;
3965
3966                   isym = bfd_sym_from_r_symndx (&htab->sym_cache,
3967                                                 abfd, r_symndx);
3968                   if (isym == NULL)
3969                     return FALSE;
3970
3971                   s = bfd_section_from_elf_index (abfd, isym->st_shndx);
3972                   if (s == NULL)
3973                     s = sec;
3974
3975                   vpp = &elf_section_data (s)->local_dynrel;
3976                   head = (struct elf32_nios2_dyn_relocs **) vpp;
3977                 }
3978
3979               p = *head;
3980               if (p == NULL || p->sec != sec)
3981                 {
3982                   bfd_size_type amt = sizeof *p;
3983                   p = ((struct elf32_nios2_dyn_relocs *)
3984                        bfd_alloc (htab->root.dynobj, amt));
3985                   if (p == NULL)
3986                     return FALSE;
3987                   p->next = *head;
3988                   *head = p;
3989                   p->sec = sec;
3990                   p->count = 0;
3991                   p->pc_count = 0;
3992                 }
3993
3994               p->count += 1;
3995
3996             }
3997           break;
3998         }
3999     }
4000
4001   return TRUE;
4002 }
4003
4004
4005 /* Implement elf_backend_gc_mark_hook:
4006    Return the section that should be marked against GC for a given
4007    relocation.  */
4008 static asection *
4009 nios2_elf32_gc_mark_hook (asection *sec,
4010                           struct bfd_link_info *info,
4011                           Elf_Internal_Rela *rel,
4012                           struct elf_link_hash_entry *h,
4013                           Elf_Internal_Sym *sym)
4014 {
4015   if (h != NULL)
4016     switch (ELF32_R_TYPE (rel->r_info))
4017       {
4018       case R_NIOS2_GNU_VTINHERIT:
4019       case R_NIOS2_GNU_VTENTRY:
4020         return NULL;
4021       }
4022   return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
4023 }
4024
4025 /* Implement elf_backend_gc_sweep_hook:
4026    Update the got entry reference counts for the section being removed.  */
4027 static bfd_boolean
4028 nios2_elf32_gc_sweep_hook (bfd *abfd,
4029                            struct bfd_link_info *info,
4030                            asection *sec,
4031                            const Elf_Internal_Rela *relocs)
4032 {
4033   Elf_Internal_Shdr *symtab_hdr;
4034   struct elf_link_hash_entry **sym_hashes;
4035   bfd_signed_vma *local_got_refcounts;
4036   const Elf_Internal_Rela *rel, *relend;
4037   bfd *dynobj;
4038
4039   if (info->relocatable)
4040     return TRUE;
4041
4042   elf_section_data (sec)->local_dynrel = NULL;
4043
4044   dynobj = elf_hash_table (info)->dynobj;
4045   if (dynobj == NULL)
4046     return TRUE;
4047
4048   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
4049   sym_hashes = elf_sym_hashes (abfd);
4050   local_got_refcounts = elf_local_got_refcounts (abfd);
4051
4052   relend = relocs + sec->reloc_count;
4053   for (rel = relocs; rel < relend; rel++)
4054     {
4055       unsigned long r_symndx;
4056       struct elf_link_hash_entry *h = NULL;
4057       int r_type;
4058
4059       r_symndx = ELF32_R_SYM (rel->r_info);
4060       if (r_symndx >= symtab_hdr->sh_info)
4061         {
4062           h = sym_hashes[r_symndx - symtab_hdr->sh_info];
4063           while (h->root.type == bfd_link_hash_indirect
4064                  || h->root.type == bfd_link_hash_warning)
4065             h = (struct elf_link_hash_entry *) h->root.u.i.link;
4066         }
4067
4068       r_type = ELF32_R_TYPE (rel->r_info);
4069       switch (r_type)
4070         {
4071         case R_NIOS2_GOT16:
4072         case R_NIOS2_GOT_LO:
4073         case R_NIOS2_GOT_HA:
4074         case R_NIOS2_CALL16:
4075         case R_NIOS2_CALL_LO:
4076         case R_NIOS2_CALL_HA:
4077           if (h != NULL)
4078             {
4079               if (h->got.refcount > 0)
4080                 --h->got.refcount;
4081             }
4082           else if (local_got_refcounts != NULL)
4083             {
4084               if (local_got_refcounts[r_symndx] > 0)
4085                 --local_got_refcounts[r_symndx];
4086             }
4087           break;
4088
4089         case R_NIOS2_PCREL_LO:
4090         case R_NIOS2_PCREL_HA:
4091         case R_NIOS2_BFD_RELOC_32:
4092         case R_NIOS2_CALL26:
4093         case R_NIOS2_CALL26_NOAT:
4094           if (h != NULL)
4095             {
4096               struct elf32_nios2_link_hash_entry *eh;
4097               struct elf32_nios2_dyn_relocs **pp;
4098               struct elf32_nios2_dyn_relocs *p;
4099
4100               eh = (struct elf32_nios2_link_hash_entry *) h;
4101
4102               if (h->plt.refcount > 0)
4103                 --h->plt.refcount;
4104
4105               if (r_type == R_NIOS2_PCREL_LO || r_type == R_NIOS2_PCREL_HA
4106                   || r_type == R_NIOS2_BFD_RELOC_32)
4107                 {
4108                   for (pp = &eh->dyn_relocs; (p = *pp) != NULL;
4109                        pp = &p->next)
4110                     if (p->sec == sec)
4111                       {
4112                         p->count -= 1;
4113                         if (p->count == 0)
4114                           *pp = p->next;
4115                         break;
4116                       }
4117                 }
4118             }
4119           break;
4120
4121         default:
4122           break;
4123         }
4124     }
4125
4126   return TRUE;
4127 }
4128
4129 /* Implement elf_backend_finish_dynamic_symbols:
4130    Finish up dynamic symbol handling.  We set the contents of various
4131    dynamic sections here.  */
4132 static bfd_boolean
4133 nios2_elf32_finish_dynamic_symbol (bfd *output_bfd,
4134                                    struct bfd_link_info *info,
4135                                    struct elf_link_hash_entry *h,
4136                                    Elf_Internal_Sym *sym)
4137 {
4138   struct elf32_nios2_link_hash_table *htab;
4139   struct elf32_nios2_link_hash_entry *eh
4140     = (struct elf32_nios2_link_hash_entry *)h;
4141   int use_plt;
4142
4143   htab = elf32_nios2_hash_table (info);
4144
4145   if (h->plt.offset != (bfd_vma) -1)
4146     {
4147       asection *splt;
4148       asection *sgotplt;
4149       asection *srela;
4150       bfd_vma plt_index;
4151       bfd_vma got_offset;
4152       Elf_Internal_Rela rela;
4153       bfd_byte *loc;
4154       bfd_vma got_address;
4155
4156       /* This symbol has an entry in the procedure linkage table.  Set
4157          it up.  */
4158       BFD_ASSERT (h->dynindx != -1);
4159       splt = htab->root.splt;
4160       sgotplt = htab->root.sgotplt;
4161       srela = htab->root.srelplt;
4162       BFD_ASSERT (splt != NULL && sgotplt != NULL && srela != NULL);
4163
4164       /* Emit the PLT entry.  */
4165       if (info->shared)
4166         {
4167           nios2_elf32_install_data (splt, nios2_so_plt_entry, h->plt.offset,
4168                                     3);
4169           plt_index = (h->plt.offset - 24) / 12;
4170           got_offset = (plt_index + 3) * 4;
4171           nios2_elf32_install_imm16 (splt, h->plt.offset,
4172                                      hiadj(plt_index * 4));
4173           nios2_elf32_install_imm16 (splt, h->plt.offset + 4,
4174                                      (plt_index * 4) & 0xffff);
4175           nios2_elf32_install_imm16 (splt, h->plt.offset + 8,
4176                                      0xfff4 - h->plt.offset);
4177           got_address = (sgotplt->output_section->vma + sgotplt->output_offset
4178                          + got_offset);
4179
4180           /* Fill in the entry in the global offset table.  There are no
4181              res_n slots for a shared object PLT, instead the .got.plt entries
4182              point to the PLT entries.  */
4183           bfd_put_32 (output_bfd,
4184                       splt->output_section->vma + splt->output_offset
4185                       + h->plt.offset, sgotplt->contents + got_offset);
4186         }
4187       else
4188         {
4189           plt_index = (h->plt.offset - 28 - htab->res_n_size) / 12;
4190           got_offset = (plt_index + 3) * 4;
4191
4192           nios2_elf32_install_data (splt, nios2_plt_entry, h->plt.offset, 3);
4193           got_address = (sgotplt->output_section->vma + sgotplt->output_offset
4194                          + got_offset);
4195           nios2_elf32_install_imm16 (splt, h->plt.offset, hiadj(got_address));
4196           nios2_elf32_install_imm16 (splt, h->plt.offset + 4,
4197                                      got_address & 0xffff);
4198
4199           /* Fill in the entry in the global offset table.  */
4200           bfd_put_32 (output_bfd,
4201                       splt->output_section->vma + splt->output_offset
4202                       + plt_index * 4, sgotplt->contents + got_offset);
4203         }
4204
4205       /* Fill in the entry in the .rela.plt section.  */
4206       rela.r_offset = got_address;
4207       rela.r_info = ELF32_R_INFO (h->dynindx, R_NIOS2_JUMP_SLOT);
4208       rela.r_addend = 0;
4209       loc = srela->contents + plt_index * sizeof (Elf32_External_Rela);
4210       bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
4211
4212       if (!h->def_regular)
4213         {
4214           /* Mark the symbol as undefined, rather than as defined in
4215              the .plt section.  Leave the value alone.  */
4216           sym->st_shndx = SHN_UNDEF;
4217           /* If the symbol is weak, we do need to clear the value.
4218              Otherwise, the PLT entry would provide a definition for
4219              the symbol even if the symbol wasn't defined anywhere,
4220              and so the symbol would never be NULL.  */
4221           if (!h->ref_regular_nonweak)
4222             sym->st_value = 0;
4223         }
4224     }
4225
4226   use_plt = (eh->got_types_used == CALL_USED
4227              && h->plt.offset != (bfd_vma) -1);
4228
4229   if (!use_plt && h->got.offset != (bfd_vma) -1
4230       && (elf32_nios2_hash_entry (h)->tls_type & GOT_TLS_GD) == 0
4231       && (elf32_nios2_hash_entry (h)->tls_type & GOT_TLS_IE) == 0)
4232     {
4233       asection *sgot;
4234       asection *srela;
4235       Elf_Internal_Rela rela;
4236       bfd_byte *loc;
4237       bfd_vma offset;
4238
4239       /* This symbol has an entry in the global offset table.  Set it
4240          up.  */
4241       sgot = htab->root.sgot;
4242       srela = htab->root.srelgot;
4243       BFD_ASSERT (sgot != NULL && srela != NULL);
4244
4245       offset = (h->got.offset & ~(bfd_vma) 1);
4246       rela.r_offset = (sgot->output_section->vma
4247                        + sgot->output_offset + offset);
4248
4249       /* If this is a -Bsymbolic link, and the symbol is defined
4250          locally, we just want to emit a RELATIVE reloc.  Likewise if
4251          the symbol was forced to be local because of a version file.
4252          The entry in the global offset table will already have been
4253          initialized in the relocate_section function.  */
4254
4255       if (info->shared && SYMBOL_REFERENCES_LOCAL (info, h))
4256         {
4257           rela.r_info = ELF32_R_INFO (0, R_NIOS2_RELATIVE);
4258           rela.r_addend = bfd_get_signed_32 (output_bfd,
4259                                              (sgot->contents + offset));
4260           bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + offset);
4261         }
4262       else
4263         {
4264           bfd_put_32 (output_bfd, (bfd_vma) 0,
4265                       sgot->contents + offset);
4266           rela.r_info = ELF32_R_INFO (h->dynindx, R_NIOS2_GLOB_DAT);
4267           rela.r_addend = 0;
4268         }
4269
4270       loc = srela->contents;
4271       loc += srela->reloc_count++ * sizeof (Elf32_External_Rela);
4272       bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
4273     }
4274
4275   if (use_plt && h->got.offset != (bfd_vma) -1)
4276     {
4277       bfd_vma offset = (h->got.offset & ~(bfd_vma) 1);
4278       asection *sgot = htab->root.sgot;
4279       asection *splt = htab->root.splt;
4280       bfd_put_32 (output_bfd, (splt->output_section->vma + splt->output_offset
4281                                + h->plt.offset),
4282                   sgot->contents + offset);
4283     }
4284
4285   if (h->needs_copy)
4286     {
4287       asection *s;
4288       Elf_Internal_Rela rela;
4289       bfd_byte *loc;
4290
4291       /* This symbol needs a copy reloc.  Set it up.  */
4292       BFD_ASSERT (h->dynindx != -1
4293                   && (h->root.type == bfd_link_hash_defined
4294                       || h->root.type == bfd_link_hash_defweak));
4295
4296       s = htab->srelbss;
4297       BFD_ASSERT (s != NULL);
4298
4299       rela.r_offset = (h->root.u.def.value
4300                        + h->root.u.def.section->output_section->vma
4301                        + h->root.u.def.section->output_offset);
4302       rela.r_info = ELF32_R_INFO (h->dynindx, R_NIOS2_COPY);
4303       rela.r_addend = 0;
4304       loc = s->contents + s->reloc_count++ * sizeof (Elf32_External_Rela);
4305       bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
4306     }
4307
4308   /* Mark _DYNAMIC, _GLOBAL_OFFSET_TABLE_, and _gp_got as absolute.  */
4309   if (strcmp (h->root.root.string, "_DYNAMIC") == 0
4310       || h == elf_hash_table (info)->hgot
4311       || h == elf32_nios2_hash_table (info)->h_gp_got)
4312     sym->st_shndx = SHN_ABS;
4313
4314   return TRUE;
4315 }
4316
4317 /* Implement elf_backend_finish_dynamic_sections.  */
4318 static bfd_boolean
4319 nios2_elf32_finish_dynamic_sections (bfd *output_bfd,
4320                                      struct bfd_link_info *info)
4321 {
4322   bfd *dynobj;
4323   asection *sgotplt;
4324   asection *sdyn;
4325   struct elf32_nios2_link_hash_table *htab;
4326
4327   htab = elf32_nios2_hash_table (info);
4328   dynobj = elf_hash_table (info)->dynobj;
4329   sgotplt = htab->root.sgotplt;
4330   BFD_ASSERT (sgotplt != NULL);
4331   sdyn = bfd_get_linker_section (dynobj, ".dynamic");
4332
4333   if (elf_hash_table (info)->dynamic_sections_created)
4334     {
4335       asection *splt;
4336       Elf32_External_Dyn *dyncon, *dynconend;
4337
4338       splt = htab->root.splt;
4339       BFD_ASSERT (splt != NULL && sdyn != NULL);
4340
4341       dyncon = (Elf32_External_Dyn *) sdyn->contents;
4342       dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
4343       for (; dyncon < dynconend; dyncon++)
4344         {
4345           Elf_Internal_Dyn dyn;
4346           asection *s;
4347
4348           bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
4349
4350           switch (dyn.d_tag)
4351             {
4352             default:
4353               break;
4354
4355             case DT_PLTGOT:
4356               s = htab->root.sgot;
4357               BFD_ASSERT (s != NULL);
4358               dyn.d_un.d_ptr = s->output_section->vma;
4359               bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
4360               break;
4361
4362             case DT_JMPREL:
4363               s = htab->root.srelplt;
4364               BFD_ASSERT (s != NULL);
4365               dyn.d_un.d_ptr = s->output_section->vma;
4366               bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
4367               break;
4368
4369             case DT_PLTRELSZ:
4370               s = htab->root.srelplt;
4371               BFD_ASSERT (s != NULL);
4372               dyn.d_un.d_val = s->size;
4373               bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
4374               break;
4375
4376             case DT_RELASZ:
4377               /* The procedure linkage table relocs (DT_JMPREL) should
4378                  not be included in the overall relocs (DT_RELA).
4379                  Therefore, we override the DT_RELASZ entry here to
4380                  make it not include the JMPREL relocs.  Since the
4381                  linker script arranges for .rela.plt to follow all
4382                  other relocation sections, we don't have to worry
4383                  about changing the DT_RELA entry.  */
4384               s = htab->root.srelplt;
4385               if (s != NULL)
4386                 dyn.d_un.d_val -= s->size;
4387               bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
4388               break;
4389
4390             case DT_NIOS2_GP:
4391               s = htab->root.sgot;
4392               BFD_ASSERT (s != NULL);
4393               dyn.d_un.d_ptr = s->output_section->vma + 0x7ff0;
4394               bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
4395               break;
4396             }
4397         }
4398
4399       /* Fill in the first entry in the procedure linkage table.  */
4400       if (splt->size > 0)
4401         {
4402           bfd_vma got_address = (sgotplt->output_section->vma
4403                                  + sgotplt->output_offset);
4404           if (info->shared)
4405             {
4406               bfd_vma corrected = got_address - (splt->output_section->vma
4407                                                  + splt->output_offset + 4);
4408               nios2_elf32_install_data (splt, nios2_so_plt0_entry, 0, 6);
4409               nios2_elf32_install_imm16 (splt, 4, hiadj (corrected));
4410               nios2_elf32_install_imm16 (splt, 12, (corrected & 0xffff) + 4);
4411               nios2_elf32_install_imm16 (splt, 16, (corrected & 0xffff) + 8);
4412             }
4413           else
4414             {
4415               /* Divide by 4 here, not 3 because we already corrected for the
4416                  res_N branches.  */
4417               bfd_vma res_size = (splt->size - 28) / 4;
4418               bfd_vma res_start = (splt->output_section->vma
4419                                    + splt->output_offset);
4420               bfd_vma res_offset;
4421
4422               for (res_offset = 0; res_offset < res_size; res_offset += 4)
4423                 bfd_put_32 (output_bfd,
4424                             6 | ((res_size - (res_offset + 4)) << 6),
4425                             splt->contents + res_offset);
4426
4427               nios2_elf32_install_data (splt, nios2_plt0_entry, res_size, 7);
4428               nios2_elf32_install_imm16 (splt, res_size, hiadj (res_start));
4429               nios2_elf32_install_imm16 (splt, res_size + 4,
4430                                          res_start & 0xffff);
4431               nios2_elf32_install_imm16 (splt, res_size + 12,
4432                                          hiadj (got_address));
4433               nios2_elf32_install_imm16 (splt, res_size + 16,
4434                                          (got_address & 0xffff) + 4);
4435               nios2_elf32_install_imm16 (splt, res_size + 20,
4436                                          (got_address & 0xffff) + 8);
4437             }
4438         }
4439     }
4440   /* Fill in the first three entries in the global offset table.  */
4441   if (sgotplt->size > 0)
4442     {
4443       if (sdyn == NULL)
4444         bfd_put_32 (output_bfd, (bfd_vma) 0, sgotplt->contents);
4445       else
4446         bfd_put_32 (output_bfd,
4447                     sdyn->output_section->vma + sdyn->output_offset,
4448                     sgotplt->contents);
4449       bfd_put_32 (output_bfd, (bfd_vma) 0, sgotplt->contents + 4);
4450       bfd_put_32 (output_bfd, (bfd_vma) 0, sgotplt->contents + 8);
4451     }
4452
4453   elf_section_data (sgotplt->output_section)->this_hdr.sh_entsize = 4;
4454
4455   return TRUE;
4456 }
4457
4458 /* Implement elf_backend_adjust_dynamic_symbol:
4459    Adjust a symbol defined by a dynamic object and referenced by a
4460    regular object.  The current definition is in some section of the
4461    dynamic object, but we're not including those sections.  We have to
4462    change the definition to something the rest of the link can
4463    understand.  */
4464 static bfd_boolean
4465 nios2_elf32_adjust_dynamic_symbol (struct bfd_link_info *info,
4466                                    struct elf_link_hash_entry *h)
4467 {
4468   struct elf32_nios2_link_hash_table *htab;
4469   bfd *dynobj;
4470   asection *s;
4471   unsigned align2;
4472
4473   htab = elf32_nios2_hash_table (info);
4474   dynobj = elf_hash_table (info)->dynobj;
4475
4476   /* Make sure we know what is going on here.  */
4477   BFD_ASSERT (dynobj != NULL
4478               && (h->needs_plt
4479                   || h->u.weakdef != NULL
4480                   || (h->def_dynamic
4481                       && h->ref_regular
4482                       && !h->def_regular)));
4483
4484   /* If this is a function, put it in the procedure linkage table.  We
4485      will fill in the contents of the procedure linkage table later,
4486      when we know the address of the .got section.  */
4487   if (h->type == STT_FUNC || h->needs_plt)
4488     {
4489       if (h->plt.refcount <= 0
4490           || SYMBOL_CALLS_LOCAL (info, h)
4491           || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
4492               && h->root.type == bfd_link_hash_undefweak))
4493         {
4494           /* This case can occur if we saw a PLT reloc in an input
4495              file, but the symbol was never referred to by a dynamic
4496              object, or if all references were garbage collected.  In
4497              such a case, we don't actually need to build a procedure
4498              linkage table, and we can just do a PCREL reloc instead.  */
4499           h->plt.offset = (bfd_vma) -1;
4500           h->needs_plt = 0;
4501         }
4502
4503       return TRUE;
4504     }
4505
4506   /* Reinitialize the plt offset now that it is not used as a reference
4507      count any more.  */
4508   h->plt.offset = (bfd_vma) -1;
4509
4510   /* If this is a weak symbol, and there is a real definition, the
4511      processor independent code will have arranged for us to see the
4512      real definition first, and we can just use the same value.  */
4513   if (h->u.weakdef != NULL)
4514     {
4515       BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
4516                   || h->u.weakdef->root.type == bfd_link_hash_defweak);
4517       h->root.u.def.section = h->u.weakdef->root.u.def.section;
4518       h->root.u.def.value = h->u.weakdef->root.u.def.value;
4519       return TRUE;
4520     }
4521
4522   /* If there are no non-GOT references, we do not need a copy
4523      relocation.  */
4524   if (!h->non_got_ref)
4525     return TRUE;
4526
4527   /* This is a reference to a symbol defined by a dynamic object which
4528      is not a function.
4529      If we are creating a shared library, we must presume that the
4530      only references to the symbol are via the global offset table.
4531      For such cases we need not do anything here; the relocations will
4532      be handled correctly by relocate_section.  */
4533   if (info->shared)
4534     return TRUE;
4535
4536   if (h->size == 0)
4537     {
4538       (*_bfd_error_handler) (_("dynamic variable `%s' is zero size"),
4539                              h->root.root.string);
4540       return TRUE;
4541     }
4542
4543   /* We must allocate the symbol in our .dynbss section, which will
4544      become part of the .bss section of the executable.  There will be
4545      an entry for this symbol in the .dynsym section.  The dynamic
4546      object will contain position independent code, so all references
4547      from the dynamic object to this symbol will go through the global
4548      offset table.  The dynamic linker will use the .dynsym entry to
4549      determine the address it must put in the global offset table, so
4550      both the dynamic object and the regular object will refer to the
4551      same memory location for the variable.  */
4552   s = htab->sdynbss;
4553   BFD_ASSERT (s != NULL);
4554
4555   /* We must generate a R_NIOS2_COPY reloc to tell the dynamic linker to
4556      copy the initial value out of the dynamic object and into the
4557      runtime process image.  We need to remember the offset into the
4558      .rela.bss section we are going to use.  */
4559   if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
4560     {
4561       asection *srel;
4562
4563       srel = htab->srelbss;
4564       BFD_ASSERT (srel != NULL);
4565       srel->size += sizeof (Elf32_External_Rela);
4566       h->needs_copy = 1;
4567     }
4568
4569   align2 = bfd_log2 (h->size);
4570   if (align2 > h->root.u.def.section->alignment_power)
4571     align2 = h->root.u.def.section->alignment_power;
4572
4573   /* Align dynbss.  */
4574   s->size = BFD_ALIGN (s->size, (bfd_size_type)1 << align2);
4575   if (align2 > bfd_get_section_alignment (dynobj, s)
4576       && !bfd_set_section_alignment (dynobj, s, align2))
4577     return FALSE;
4578
4579   /* Define the symbol as being at this point in the section.  */
4580   h->root.u.def.section = s;
4581   h->root.u.def.value = s->size;
4582
4583   /* Increment the section size to make room for the symbol.  */
4584   s->size += h->size;
4585
4586   return TRUE;
4587 }
4588
4589 /* Worker function for nios2_elf32_size_dynamic_sections.  */
4590 static bfd_boolean
4591 adjust_dynrelocs (struct elf_link_hash_entry *h, PTR inf)
4592 {
4593   struct bfd_link_info *info;
4594   struct elf32_nios2_link_hash_table *htab;
4595
4596   if (h->root.type == bfd_link_hash_indirect)
4597     return TRUE;
4598
4599   if (h->root.type == bfd_link_hash_warning)
4600     /* When warning symbols are created, they **replace** the "real"
4601        entry in the hash table, thus we never get to see the real
4602        symbol in a hash traversal.  So look at it now.  */
4603     h = (struct elf_link_hash_entry *) h->root.u.i.link;
4604
4605   info = (struct bfd_link_info *) inf;
4606   htab = elf32_nios2_hash_table (info);
4607
4608   if (h->plt.offset != (bfd_vma)-1)
4609     h->plt.offset += htab->res_n_size;
4610   if (htab->root.splt == h->root.u.def.section)
4611     h->root.u.def.value += htab->res_n_size;
4612
4613   return TRUE;
4614 }
4615
4616 /* Another worker function for nios2_elf32_size_dynamic_sections.
4617    Allocate space in .plt, .got and associated reloc sections for
4618    dynamic relocs.  */
4619 static bfd_boolean
4620 allocate_dynrelocs (struct elf_link_hash_entry *h, PTR inf)
4621 {
4622   struct bfd_link_info *info;
4623   struct elf32_nios2_link_hash_table *htab;
4624   struct elf32_nios2_link_hash_entry *eh;
4625   struct elf32_nios2_dyn_relocs *p;
4626   int use_plt;
4627
4628   if (h->root.type == bfd_link_hash_indirect)
4629     return TRUE;
4630
4631   if (h->root.type == bfd_link_hash_warning)
4632     /* When warning symbols are created, they **replace** the "real"
4633        entry in the hash table, thus we never get to see the real
4634        symbol in a hash traversal.  So look at it now.  */
4635     h = (struct elf_link_hash_entry *) h->root.u.i.link;
4636
4637   info = (struct bfd_link_info *) inf;
4638   htab = elf32_nios2_hash_table (info);
4639
4640   if (htab->root.dynamic_sections_created
4641       && h->plt.refcount > 0)
4642     {
4643       /* Make sure this symbol is output as a dynamic symbol.
4644          Undefined weak syms won't yet be marked as dynamic.  */
4645       if (h->dynindx == -1
4646           && !h->forced_local
4647           && !bfd_elf_link_record_dynamic_symbol (info, h))
4648         return FALSE;
4649
4650       if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, info->shared, h))
4651         {
4652           asection *s = htab->root.splt;
4653
4654           /* Allocate room for the header.  */
4655           if (s->size == 0)
4656             {
4657               if (info->shared)
4658                 s->size = 24;
4659               else
4660                 s->size = 28;
4661             }
4662
4663           h->plt.offset = s->size;
4664
4665           /* If this symbol is not defined in a regular file, and we are
4666              not generating a shared library, then set the symbol to this
4667              location in the .plt.  This is required to make function
4668              pointers compare as equal between the normal executable and
4669              the shared library.  */
4670           if (! info->shared
4671               && !h->def_regular)
4672             {
4673               h->root.u.def.section = s;
4674               h->root.u.def.value = h->plt.offset;
4675             }
4676
4677           /* Make room for this entry.  */
4678           s->size += 12;
4679
4680           /* We also need to make an entry in the .rela.plt section.  */
4681           htab->root.srelplt->size += sizeof (Elf32_External_Rela);
4682
4683           /* And the .got.plt section.  */
4684           htab->root.sgotplt->size += 4;
4685         }
4686       else
4687         {
4688           h->plt.offset = (bfd_vma) -1;
4689           h->needs_plt = 0;
4690         }
4691     }
4692   else
4693     {
4694       h->plt.offset = (bfd_vma) -1;
4695       h->needs_plt = 0;
4696     }
4697
4698   eh = (struct elf32_nios2_link_hash_entry *) h;
4699   use_plt = (eh->got_types_used == CALL_USED
4700              && h->plt.offset != (bfd_vma) -1);
4701
4702   if (h->got.refcount > 0)
4703     {
4704       asection *s;
4705       bfd_boolean dyn;
4706       int tls_type = eh->tls_type;
4707       int indx;
4708
4709       /* Make sure this symbol is output as a dynamic symbol.
4710          Undefined weak syms won't yet be marked as dynamic.  */
4711       if (h->dynindx == -1
4712           && !h->forced_local
4713           && !bfd_elf_link_record_dynamic_symbol (info, h))
4714         return FALSE;
4715
4716       s = htab->root.sgot;
4717       h->got.offset = s->size;
4718
4719       if (tls_type == GOT_UNKNOWN)
4720         abort ();
4721
4722       if (tls_type == GOT_NORMAL)
4723         /* Non-TLS symbols need one GOT slot.  */
4724         s->size += 4;
4725       else
4726         {
4727           if (tls_type & GOT_TLS_GD)
4728             /* R_NIOS2_TLS_GD16 needs 2 consecutive GOT slots.  */
4729             s->size += 8;
4730           if (tls_type & GOT_TLS_IE)
4731             /* R_NIOS2_TLS_IE16 needs one GOT slot.  */
4732             s->size += 4;
4733         }
4734
4735       dyn = htab->root.dynamic_sections_created;
4736
4737       indx = 0;
4738       if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
4739           && (!info->shared
4740               || !SYMBOL_REFERENCES_LOCAL (info, h)))
4741         indx = h->dynindx;
4742
4743       if (tls_type != GOT_NORMAL
4744           && (info->shared || indx != 0)
4745           && (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
4746               || h->root.type != bfd_link_hash_undefweak))
4747         {
4748           if (tls_type & GOT_TLS_IE)
4749             htab->root.srelgot->size += sizeof (Elf32_External_Rela);
4750
4751           if (tls_type & GOT_TLS_GD)
4752             htab->root.srelgot->size += sizeof (Elf32_External_Rela);
4753
4754           if ((tls_type & GOT_TLS_GD) && indx != 0)
4755             htab->root.srelgot->size += sizeof (Elf32_External_Rela);
4756         }
4757       else if ((ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
4758                 || h->root.type != bfd_link_hash_undefweak)
4759                && !use_plt
4760                && (info->shared
4761                    || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h)))
4762         htab->root.srelgot->size += sizeof (Elf32_External_Rela);
4763     }
4764   else
4765     h->got.offset = (bfd_vma) -1;
4766
4767   if (eh->dyn_relocs == NULL)
4768     return TRUE;
4769
4770   /* In the shared -Bsymbolic case, discard space allocated for
4771      dynamic pc-relative relocs against symbols which turn out to be
4772      defined in regular objects.  For the normal shared case, discard
4773      space for pc-relative relocs that have become local due to symbol
4774      visibility changes.  */
4775
4776   if (info->shared)
4777     {
4778       if (h->def_regular
4779           && (h->forced_local || info->symbolic))
4780         {
4781           struct elf32_nios2_dyn_relocs **pp;
4782
4783           for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
4784             {
4785               p->count -= p->pc_count;
4786               p->pc_count = 0;
4787               if (p->count == 0)
4788                 *pp = p->next;
4789               else
4790                 pp = &p->next;
4791             }
4792         }
4793
4794       /* Also discard relocs on undefined weak syms with non-default
4795          visibility.  */
4796       if (eh->dyn_relocs != NULL
4797           && h->root.type == bfd_link_hash_undefweak)
4798         {
4799           if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
4800             eh->dyn_relocs = NULL;
4801
4802           /* Make sure undefined weak symbols are output as a dynamic
4803              symbol in PIEs.  */
4804           else if (h->dynindx == -1
4805                    && !h->forced_local
4806                    && !bfd_elf_link_record_dynamic_symbol (info, h))
4807             return FALSE;
4808         }
4809     }
4810   else
4811     {
4812       /* For the non-shared case, discard space for relocs against
4813          symbols which turn out to need copy relocs or are not
4814          dynamic.  */
4815
4816       if (!h->non_got_ref
4817           && ((h->def_dynamic && !h->def_regular)
4818               || (htab->root.dynamic_sections_created
4819                   && (h->root.type == bfd_link_hash_undefweak
4820                       || h->root.type == bfd_link_hash_undefined))))
4821         {
4822           /* Make sure this symbol is output as a dynamic symbol.
4823              Undefined weak syms won't yet be marked as dynamic.  */
4824           if (h->dynindx == -1
4825               && !h->forced_local
4826               && !bfd_elf_link_record_dynamic_symbol (info, h))
4827             return FALSE;
4828
4829           /* If that succeeded, we know we'll be keeping all the
4830              relocs.  */
4831           if (h->dynindx != -1)
4832             goto keep;
4833         }
4834
4835       eh->dyn_relocs = NULL;
4836
4837     keep: ;
4838     }
4839
4840   /* Finally, allocate space.  */
4841   for (p = eh->dyn_relocs; p != NULL; p = p->next)
4842     {
4843       asection *sreloc = elf_section_data (p->sec)->sreloc;
4844       sreloc->size += p->count * sizeof (Elf32_External_Rela);
4845     }
4846
4847   return TRUE;
4848 }
4849
4850 /* Implement elf_backend_size_dynamic_sections:
4851    Set the sizes of the dynamic sections.  */
4852 static bfd_boolean
4853 nios2_elf32_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
4854                                    struct bfd_link_info *info)
4855 {
4856   bfd *dynobj;
4857   asection *s;
4858   bfd_boolean plt;
4859   bfd_boolean got;
4860   bfd_boolean relocs;
4861   bfd *ibfd;
4862   struct elf32_nios2_link_hash_table *htab;
4863
4864   htab = elf32_nios2_hash_table (info);
4865   dynobj = elf_hash_table (info)->dynobj;
4866   BFD_ASSERT (dynobj != NULL);
4867
4868   htab->res_n_size = 0;
4869   if (elf_hash_table (info)->dynamic_sections_created)
4870     {
4871       /* Set the contents of the .interp section to the interpreter.  */
4872       if (info->executable)
4873         {
4874           s = bfd_get_linker_section (dynobj, ".interp");
4875           BFD_ASSERT (s != NULL);
4876           s->size = sizeof ELF_DYNAMIC_INTERPRETER;
4877           s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
4878         }
4879     }
4880   else
4881     {
4882       /* We may have created entries in the .rela.got section.
4883          However, if we are not creating the dynamic sections, we will
4884          not actually use these entries.  Reset the size of .rela.got,
4885          which will cause it to get stripped from the output file
4886          below.  */
4887       s = htab->root.srelgot;
4888       if (s != NULL)
4889         s->size = 0;
4890     }
4891
4892   /* Set up .got offsets for local syms, and space for local dynamic
4893      relocs.  */
4894   for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
4895     {
4896       bfd_signed_vma *local_got;
4897       bfd_signed_vma *end_local_got;
4898       char *local_tls_type;
4899       bfd_size_type locsymcount;
4900       Elf_Internal_Shdr *symtab_hdr;
4901       asection *srel;
4902
4903       if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour)
4904         continue;
4905
4906       for (s = ibfd->sections; s != NULL; s = s->next)
4907         {
4908           struct elf32_nios2_dyn_relocs *p;
4909
4910           for (p = elf_section_data (s)->local_dynrel; p != NULL; p = p->next)
4911             {
4912               if (!bfd_is_abs_section (p->sec)
4913                   && bfd_is_abs_section (p->sec->output_section))
4914                 {
4915                   /* Input section has been discarded, either because
4916                      it is a copy of a linkonce section or due to
4917                      linker script /DISCARD/, so we'll be discarding
4918                      the relocs too.  */
4919                 }
4920               else if (p->count != 0)
4921                 {
4922                   srel = elf_section_data (p->sec)->sreloc;
4923                   srel->size += p->count * sizeof (Elf32_External_Rela);
4924                   if ((p->sec->output_section->flags & SEC_READONLY) != 0)
4925                     info->flags |= DF_TEXTREL;
4926                 }
4927             }
4928         }
4929
4930       local_got = elf_local_got_refcounts (ibfd);
4931       if (!local_got)
4932         continue;
4933
4934       symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
4935       locsymcount = symtab_hdr->sh_info;
4936       end_local_got = local_got + locsymcount;
4937       local_tls_type = elf32_nios2_local_got_tls_type (ibfd);
4938       s = htab->root.sgot;
4939       srel = htab->root.srelgot;
4940       for (; local_got < end_local_got; ++local_got, ++local_tls_type)
4941         {
4942           if (*local_got > 0)
4943             {
4944               *local_got = s->size;
4945               if (*local_tls_type & GOT_TLS_GD)
4946                 /* TLS_GD relocs need an 8-byte structure in the GOT.  */
4947                 s->size += 8;
4948               if (*local_tls_type & GOT_TLS_IE)
4949                 s->size += 4;
4950               if (*local_tls_type == GOT_NORMAL)
4951                 s->size += 4;
4952
4953               if (info->shared || *local_tls_type == GOT_TLS_GD)
4954                 srel->size += sizeof (Elf32_External_Rela);
4955             }
4956           else
4957             *local_got = (bfd_vma) -1;
4958         }
4959     }
4960
4961   if (htab->tls_ldm_got.refcount > 0)
4962     {
4963       /* Allocate two GOT entries and one dynamic relocation (if necessary)
4964          for R_NIOS2_TLS_LDM16 relocations.  */
4965       htab->tls_ldm_got.offset = htab->root.sgot->size;
4966       htab->root.sgot->size += 8;
4967       if (info->shared)
4968         htab->root.srelgot->size += sizeof (Elf32_External_Rela);
4969     }
4970   else
4971     htab->tls_ldm_got.offset = -1;
4972
4973   /* Allocate global sym .plt and .got entries, and space for global
4974      sym dynamic relocs.  */
4975   elf_link_hash_traverse (& htab->root, allocate_dynrelocs, info);
4976
4977   if (elf_hash_table (info)->dynamic_sections_created)
4978     {
4979       /* If the .got section is more than 0x8000 bytes, we add
4980          0x8000 to the value of _gp_got, so that 16-bit relocations
4981          have a greater chance of working. */
4982       if (htab->root.sgot->size >= 0x8000
4983           && elf32_nios2_hash_table (info)->h_gp_got->root.u.def.value == 0)
4984         elf32_nios2_hash_table (info)->h_gp_got->root.u.def.value = 0x8000;
4985     }
4986
4987   /* The check_relocs and adjust_dynamic_symbol entry points have
4988      determined the sizes of the various dynamic sections.  Allocate
4989      memory for them.  */
4990   plt = FALSE;
4991   got = FALSE;
4992   relocs = FALSE;
4993   for (s = dynobj->sections; s != NULL; s = s->next)
4994     {
4995       const char *name;
4996
4997       if ((s->flags & SEC_LINKER_CREATED) == 0)
4998         continue;
4999
5000       /* It's OK to base decisions on the section name, because none
5001          of the dynobj section names depend upon the input files.  */
5002       name = bfd_get_section_name (dynobj, s);
5003
5004       if (strcmp (name, ".plt") == 0)
5005         {
5006           /* Remember whether there is a PLT.  */
5007           plt = s->size != 0;
5008
5009           /* Correct for the number of res_N branches.  */
5010           if (plt && !info->shared)
5011             {
5012               htab->res_n_size = (s->size-28) / 3;
5013               s->size += htab->res_n_size;
5014             }
5015         }
5016       else if (CONST_STRNEQ (name, ".rela"))
5017         {
5018           if (s->size != 0)
5019             {
5020               relocs = TRUE;
5021
5022               /* We use the reloc_count field as a counter if we need
5023                  to copy relocs into the output file.  */
5024               s->reloc_count = 0;
5025             }
5026         }
5027       else if (CONST_STRNEQ (name, ".got"))
5028         got = s->size != 0;
5029       else if (strcmp (name, ".dynbss") != 0)
5030         /* It's not one of our sections, so don't allocate space.  */
5031         continue;
5032
5033       if (s->size == 0)
5034         {
5035           /* If we don't need this section, strip it from the
5036              output file.  This is mostly to handle .rela.bss and
5037              .rela.plt.  We must create both sections in
5038              create_dynamic_sections, because they must be created
5039              before the linker maps input sections to output
5040              sections.  The linker does that before
5041              adjust_dynamic_symbol is called, and it is that
5042              function which decides whether anything needs to go
5043              into these sections.  */
5044           s->flags |= SEC_EXCLUDE;
5045           continue;
5046         }
5047
5048       if ((s->flags & SEC_HAS_CONTENTS) == 0)
5049         continue;
5050
5051       /* Allocate memory for the section contents.  */
5052       /* FIXME: This should be a call to bfd_alloc not bfd_zalloc.
5053          Unused entries should be reclaimed before the section's contents
5054          are written out, but at the moment this does not happen.  Thus in
5055          order to prevent writing out garbage, we initialize the section's
5056          contents to zero.  */
5057       s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->size);
5058       if (s->contents == NULL)
5059         return FALSE;
5060     }
5061
5062   /* Adjust dynamic symbols that point to the plt to account for the
5063      now-known number of resN slots.  */
5064   if (htab->res_n_size)
5065     elf_link_hash_traverse (& htab->root, adjust_dynrelocs, info);
5066
5067   if (elf_hash_table (info)->dynamic_sections_created)
5068     {
5069       /* Add some entries to the .dynamic section.  We fill in the
5070          values later, in elf_nios2_finish_dynamic_sections, but we
5071          must add the entries now so that we get the correct size for
5072          the .dynamic section.  The DT_DEBUG entry is filled in by the
5073          dynamic linker and used by the debugger.  */
5074 #define add_dynamic_entry(TAG, VAL) \
5075   _bfd_elf_add_dynamic_entry (info, TAG, VAL)
5076
5077       if (!info->shared && !add_dynamic_entry (DT_DEBUG, 0))
5078         return FALSE;
5079
5080       if (got && !add_dynamic_entry (DT_PLTGOT, 0))
5081         return FALSE;
5082
5083       if (plt
5084           && (!add_dynamic_entry (DT_PLTRELSZ, 0)
5085               || !add_dynamic_entry (DT_PLTREL, DT_RELA)
5086               || !add_dynamic_entry (DT_JMPREL, 0)))
5087         return FALSE;
5088
5089       if (relocs
5090           && (!add_dynamic_entry (DT_RELA, 0)
5091               || !add_dynamic_entry (DT_RELASZ, 0)
5092               || !add_dynamic_entry (DT_RELAENT, sizeof (Elf32_External_Rela))))
5093         return FALSE;
5094
5095       if (!info->shared && !add_dynamic_entry (DT_NIOS2_GP, 0))
5096         return FALSE;
5097
5098       if ((info->flags & DF_TEXTREL) != 0
5099           && !add_dynamic_entry (DT_TEXTREL, 0))
5100         return FALSE;
5101     }
5102 #undef add_dynamic_entry
5103
5104   return TRUE;
5105 }
5106
5107 /* Implement bfd_elf32_bfd_link_hash_table_create.  */
5108 static struct bfd_link_hash_table *
5109 nios2_elf32_link_hash_table_create (bfd *abfd)
5110 {
5111   struct elf32_nios2_link_hash_table *ret;
5112   bfd_size_type amt = sizeof (struct elf32_nios2_link_hash_table);
5113
5114   ret = bfd_zmalloc (amt);
5115   if (ret == NULL)
5116     return NULL;
5117
5118   if (!_bfd_elf_link_hash_table_init (&ret->root, abfd,
5119                                       link_hash_newfunc,
5120                                       sizeof (struct
5121                                               elf32_nios2_link_hash_entry),
5122                                       NIOS2_ELF_DATA))
5123     {
5124       free (ret);
5125       return NULL;
5126     }
5127
5128   /* Init the stub hash table too.  */
5129   if (!bfd_hash_table_init (&ret->bstab, stub_hash_newfunc,
5130                             sizeof (struct elf32_nios2_stub_hash_entry)))
5131     return NULL;
5132
5133   return &ret->root.root;
5134 }
5135
5136 /* Free the derived linker hash table.  */
5137 static void
5138 nios2_elf32_link_hash_table_free (struct bfd_link_hash_table *btab)
5139 {
5140   struct elf32_nios2_link_hash_table *htab
5141     = (struct elf32_nios2_link_hash_table *) btab;
5142
5143   bfd_hash_table_free (&htab->bstab);
5144   _bfd_elf_link_hash_table_free (btab);
5145 }
5146
5147 /* Implement elf_backend_reloc_type_class.  */
5148 static enum elf_reloc_type_class
5149 nios2_elf32_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED,
5150                               const asection *rel_sec ATTRIBUTE_UNUSED,
5151                               const Elf_Internal_Rela *rela)
5152 {
5153   switch ((int) ELF32_R_TYPE (rela->r_info))
5154     {
5155     case R_NIOS2_RELATIVE:
5156       return reloc_class_relative;
5157     case R_NIOS2_JUMP_SLOT:
5158       return reloc_class_plt;
5159     case R_NIOS2_COPY:
5160       return reloc_class_copy;
5161     default:
5162       return reloc_class_normal;
5163     }
5164 }
5165
5166 /* Return 1 if target is one of ours.  */
5167 static bfd_boolean
5168 is_nios2_elf_target (const struct bfd_target *targ)
5169 {
5170   return (targ == &nios2_elf32_le_vec
5171           || targ == &nios2_elf32_be_vec);
5172 }
5173
5174 /* Implement elf_backend_add_symbol_hook.
5175    This hook is called by the linker when adding symbols from an object
5176    file.  We use it to put .comm items in .sbss, and not .bss.  */
5177 static bfd_boolean
5178 nios2_elf_add_symbol_hook (bfd *abfd,
5179                            struct bfd_link_info *info,
5180                            Elf_Internal_Sym *sym,
5181                            const char **namep ATTRIBUTE_UNUSED,
5182                            flagword *flagsp ATTRIBUTE_UNUSED,
5183                            asection **secp,
5184                            bfd_vma *valp)
5185 {
5186   bfd *dynobj;
5187
5188   if (sym->st_shndx == SHN_COMMON
5189       && !info->relocatable
5190       && sym->st_size <= elf_gp_size (abfd)
5191       && is_nios2_elf_target (info->output_bfd->xvec))
5192     {
5193       /* Common symbols less than or equal to -G nn bytes are automatically
5194          put into .sbss.  */
5195       struct elf32_nios2_link_hash_table *htab;
5196
5197       htab = elf32_nios2_hash_table (info);
5198       if (htab->sbss == NULL)
5199         {
5200           flagword flags = SEC_IS_COMMON | SEC_LINKER_CREATED;
5201
5202           dynobj = elf_hash_table (info)->dynobj;
5203           if (!dynobj)
5204             dynobj = abfd;
5205
5206           htab->sbss = bfd_make_section_anyway_with_flags (dynobj, ".sbss",
5207                                                            flags);
5208           if (htab->sbss == NULL)
5209             return FALSE;
5210         }
5211
5212       *secp = htab->sbss;
5213       *valp = sym->st_size;
5214     }
5215
5216   return TRUE;
5217 }
5218
5219 /* Implement elf_backend_can_make_relative_eh_frame:
5220    Decide whether to attempt to turn absptr or lsda encodings in
5221    shared libraries into pcrel within the given input section.  */
5222 static bfd_boolean
5223 nios2_elf32_can_make_relative_eh_frame (bfd *input_bfd ATTRIBUTE_UNUSED,
5224                                         struct bfd_link_info *info
5225                                         ATTRIBUTE_UNUSED,
5226                                         asection *eh_frame_section
5227                                         ATTRIBUTE_UNUSED)
5228 {
5229   /* We can't use PC-relative encodings in the .eh_frame section.  */
5230   return FALSE;
5231 }
5232
5233 /* Implement elf_backend_special_sections.  */
5234 const struct bfd_elf_special_section elf32_nios2_special_sections[] =
5235 {
5236   { STRING_COMMA_LEN (".sbss"),  -2, SHT_NOBITS,
5237     SHF_ALLOC + SHF_WRITE + SHF_NIOS2_GPREL },
5238   { STRING_COMMA_LEN (".sdata"), -2, SHT_PROGBITS,
5239     SHF_ALLOC + SHF_WRITE + SHF_NIOS2_GPREL },
5240   { NULL,                     0,  0, 0,              0 }
5241 };
5242
5243 #define ELF_ARCH                        bfd_arch_nios2
5244 #define ELF_TARGET_ID                   NIOS2_ELF_DATA
5245 #define ELF_MACHINE_CODE                EM_ALTERA_NIOS2
5246
5247 /* The Nios II MMU uses a 4K page size.  */
5248
5249 #define ELF_MAXPAGESIZE                 0x1000
5250
5251 #define bfd_elf32_bfd_link_hash_table_create \
5252                                           nios2_elf32_link_hash_table_create
5253 #define bfd_elf32_bfd_link_hash_table_free \
5254                                           nios2_elf32_link_hash_table_free
5255
5256 /* Relocation table lookup macros.  */
5257
5258 #define bfd_elf32_bfd_reloc_type_lookup   nios2_elf32_bfd_reloc_type_lookup
5259 #define bfd_elf32_bfd_reloc_name_lookup   nios2_elf32_bfd_reloc_name_lookup
5260
5261 /* JUMP_TABLE_LINK macros.  */
5262
5263 /* elf_info_to_howto (using RELA relocations).  */
5264
5265 #define elf_info_to_howto                 nios2_elf32_info_to_howto
5266
5267 /* elf backend functions.  */
5268
5269 #define elf_backend_can_gc_sections     1
5270 #define elf_backend_can_refcount        1
5271 #define elf_backend_plt_readonly        1
5272 #define elf_backend_want_got_plt        1
5273 #define elf_backend_rela_normal         1
5274
5275 #define elf_backend_relocate_section      nios2_elf32_relocate_section
5276 #define elf_backend_section_flags         nios2_elf32_section_flags
5277 #define elf_backend_fake_sections         nios2_elf32_fake_sections
5278 #define elf_backend_check_relocs          nios2_elf32_check_relocs
5279
5280 #define elf_backend_gc_mark_hook          nios2_elf32_gc_mark_hook
5281 #define elf_backend_gc_sweep_hook         nios2_elf32_gc_sweep_hook
5282 #define elf_backend_create_dynamic_sections \
5283                                           nios2_elf32_create_dynamic_sections
5284 #define elf_backend_finish_dynamic_symbol nios2_elf32_finish_dynamic_symbol
5285 #define elf_backend_finish_dynamic_sections \
5286                                           nios2_elf32_finish_dynamic_sections
5287 #define elf_backend_adjust_dynamic_symbol nios2_elf32_adjust_dynamic_symbol
5288 #define elf_backend_reloc_type_class      nios2_elf32_reloc_type_class
5289 #define elf_backend_size_dynamic_sections nios2_elf32_size_dynamic_sections
5290 #define elf_backend_add_symbol_hook       nios2_elf_add_symbol_hook
5291 #define elf_backend_copy_indirect_symbol  nios2_elf32_copy_indirect_symbol
5292
5293 #define elf_backend_grok_prstatus         nios2_grok_prstatus
5294 #define elf_backend_grok_psinfo           nios2_grok_psinfo
5295
5296 #undef elf_backend_can_make_relative_eh_frame
5297 #define elf_backend_can_make_relative_eh_frame \
5298                                           nios2_elf32_can_make_relative_eh_frame
5299
5300 #define elf_backend_special_sections      elf32_nios2_special_sections
5301
5302 #define TARGET_LITTLE_SYM               nios2_elf32_le_vec
5303 #define TARGET_LITTLE_NAME              "elf32-littlenios2"
5304 #define TARGET_BIG_SYM                  nios2_elf32_be_vec
5305 #define TARGET_BIG_NAME                 "elf32-bignios2"
5306
5307 #define elf_backend_got_header_size     12
5308
5309 #include "elf32-target.h"