Nios II large-GOT relocations
[external/binutils.git] / bfd / elf32-nios2.c
1 /* 32-bit ELF support for Nios II.
2    Copyright (C) 2012, 2013 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 bfd_elf32_littlenios2_vec;
72 extern const bfd_target bfd_elf32_bignios2_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     {
2017       bfd_size_type size;
2018
2019       /* Allocate memory to hold the linker stubs.  */
2020       size = stub_sec->size;
2021       stub_sec->contents = bfd_zalloc (htab->stub_bfd, size);
2022       if (stub_sec->contents == NULL && size != 0)
2023         return FALSE;
2024       stub_sec->size = 0;
2025     }
2026
2027   /* Build the stubs as directed by the stub hash table.  */
2028   table = &htab->bstab;
2029   bfd_hash_traverse (table, nios2_build_one_stub, info);
2030
2031   return TRUE;
2032 }
2033
2034
2035 /* Implement bfd_elf32_bfd_reloc_type_lookup:
2036    Given a BFD reloc type, return a howto structure.  */
2037 static reloc_howto_type *
2038 nios2_elf32_bfd_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
2039                                    bfd_reloc_code_real_type code)
2040 {
2041   int i;
2042   for (i = 0;
2043        i < (int) (sizeof (nios2_reloc_map) / sizeof (struct elf_reloc_map));
2044        ++i)
2045     if (nios2_reloc_map[i].bfd_val == code)
2046       return &elf_nios2_howto_table_rel[(int) nios2_reloc_map[i].elf_val];
2047   return NULL;
2048 }
2049
2050 /* Implement bfd_elf32_bfd_reloc_name_lookup:
2051    Given a reloc name, return a howto structure.  */
2052 static reloc_howto_type *
2053 nios2_elf32_bfd_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
2054                                    const char *r_name)
2055 {
2056   unsigned int i;
2057   for (i = 0;
2058        i < (sizeof (elf_nios2_howto_table_rel)
2059             / sizeof (elf_nios2_howto_table_rel[0]));
2060        i++)
2061     if (elf_nios2_howto_table_rel[i].name
2062         && strcasecmp (elf_nios2_howto_table_rel[i].name, r_name) == 0)
2063       return &elf_nios2_howto_table_rel[i];
2064
2065   return NULL;  
2066 }
2067
2068 /* Implement elf_info_to_howto:
2069    Given a ELF32 relocation, fill in a arelent structure.  */
2070 static void
2071 nios2_elf32_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED, arelent *cache_ptr,
2072                            Elf_Internal_Rela *dst)
2073 {
2074   unsigned int r_type;
2075
2076   r_type = ELF32_R_TYPE (dst->r_info);
2077   BFD_ASSERT (r_type < R_NIOS2_ILLEGAL);
2078   cache_ptr->howto = &elf_nios2_howto_table_rel[r_type];
2079 }
2080
2081 /* Return the base VMA address which should be subtracted from real addresses
2082    when resolving @dtpoff relocation.
2083    This is PT_TLS segment p_vaddr.  */
2084 static bfd_vma
2085 dtpoff_base (struct bfd_link_info *info)
2086 {
2087   /* If tls_sec is NULL, we should have signalled an error already.  */
2088   if (elf_hash_table (info)->tls_sec == NULL)
2089     return 0;
2090   return elf_hash_table (info)->tls_sec->vma;
2091 }
2092
2093 /* Return the relocation value for @tpoff relocation
2094    if STT_TLS virtual address is ADDRESS.  */
2095 static bfd_vma
2096 tpoff (struct bfd_link_info *info, bfd_vma address)
2097 {
2098   struct elf_link_hash_table *htab = elf_hash_table (info);
2099
2100   /* If tls_sec is NULL, we should have signalled an error already.  */
2101   if (htab->tls_sec == NULL)
2102     return 0;
2103   return address - htab->tls_sec->vma;
2104 }
2105
2106 /* Set the GP value for OUTPUT_BFD.  Returns FALSE if this is a
2107    dangerous relocation.  */
2108 static bfd_boolean
2109 nios2_elf_assign_gp (bfd *output_bfd, bfd_vma *pgp, struct bfd_link_info *info)
2110 {
2111
2112   bfd_boolean gp_found;
2113   struct bfd_hash_entry *h;
2114   struct bfd_link_hash_entry *lh;
2115
2116   /* If we've already figured out what GP will be, just return it. */
2117   *pgp = _bfd_get_gp_value (output_bfd);
2118   if (*pgp)
2119     return TRUE;
2120
2121   h = bfd_hash_lookup (&info->hash->table, "_gp", FALSE, FALSE);
2122   lh = (struct bfd_link_hash_entry *) h;
2123 lookup:
2124   if (lh)
2125     {
2126       switch (lh->type)
2127         {
2128         case bfd_link_hash_undefined:
2129         case bfd_link_hash_undefweak:
2130         case bfd_link_hash_common:
2131           gp_found = FALSE;
2132           break;
2133         case bfd_link_hash_defined:
2134         case bfd_link_hash_defweak:
2135           gp_found = TRUE;
2136           *pgp = lh->u.def.value;
2137           break;
2138         case bfd_link_hash_indirect:
2139         case bfd_link_hash_warning:
2140           lh = lh->u.i.link;
2141           /* @@FIXME  ignoring warning for now */
2142           goto lookup;
2143         case bfd_link_hash_new:
2144         default:
2145           abort ();
2146         }
2147     }
2148   else
2149     gp_found = FALSE;
2150
2151   if (!gp_found)
2152     {
2153       /* Only get the error once. */
2154       *pgp = 4;
2155       _bfd_set_gp_value (output_bfd, *pgp);
2156       return FALSE;
2157     }
2158
2159   _bfd_set_gp_value (output_bfd, *pgp);
2160
2161   return TRUE;
2162 }
2163
2164 /* Retrieve the previously cached _gp pointer, returning bfd_reloc_dangerous
2165    if it's not available as we don't have a link_info pointer available here
2166    to look it up in the output symbol table.  We don't need to adjust the
2167    symbol value for an external symbol if we are producing relocatable
2168    output.  */
2169 static bfd_reloc_status_type
2170 nios2_elf_final_gp (bfd *output_bfd, asymbol *symbol, bfd_boolean relocatable, 
2171                     char **error_message, bfd_vma *pgp)
2172 {
2173   if (bfd_is_und_section (symbol->section) && !relocatable)
2174     {
2175       *pgp = 0;
2176       return bfd_reloc_undefined;
2177     }
2178
2179   *pgp = _bfd_get_gp_value (output_bfd);
2180   if (*pgp == 0 && (!relocatable || (symbol->flags & BSF_SECTION_SYM) != 0))
2181     {
2182       if (relocatable)
2183         {
2184           /* Make up a value.  */
2185           *pgp = symbol->section->output_section->vma + 0x4000;
2186           _bfd_set_gp_value (output_bfd, *pgp);
2187         }
2188       else
2189         {
2190           *error_message
2191             = (char *) _("global pointer relative relocation when _gp not defined");
2192           return bfd_reloc_dangerous;
2193         }
2194     }
2195
2196   return bfd_reloc_ok;
2197 }
2198
2199 /* Do the relocations that require special handling.  */
2200 static bfd_reloc_status_type
2201 nios2_elf32_do_hi16_relocate (bfd *abfd, reloc_howto_type *howto, 
2202                               asection *input_section,
2203                               bfd_byte *data, bfd_vma offset, 
2204                               bfd_vma symbol_value, bfd_vma addend)
2205 {
2206   symbol_value = symbol_value + addend;
2207   addend = 0;
2208   symbol_value = (symbol_value >> 16) & 0xffff;
2209   return _bfd_final_link_relocate (howto, abfd, input_section,
2210                                    data, offset, symbol_value, addend);
2211 }
2212
2213 static bfd_reloc_status_type
2214 nios2_elf32_do_lo16_relocate (bfd *abfd, reloc_howto_type *howto,
2215                               asection *input_section,
2216                               bfd_byte *data, bfd_vma offset, 
2217                               bfd_vma symbol_value, bfd_vma addend)
2218 {
2219   symbol_value = symbol_value + addend;
2220   addend = 0;
2221   symbol_value = symbol_value & 0xffff;
2222   return _bfd_final_link_relocate (howto, abfd, input_section,
2223                                    data, offset, symbol_value, addend);
2224 }
2225
2226 static bfd_reloc_status_type
2227 nios2_elf32_do_hiadj16_relocate (bfd *abfd, reloc_howto_type *howto,
2228                                  asection *input_section,
2229                                  bfd_byte *data, bfd_vma offset,
2230                                  bfd_vma symbol_value, bfd_vma addend)
2231 {
2232   symbol_value = symbol_value + addend;
2233   addend = 0;
2234   symbol_value = hiadj(symbol_value);
2235   return _bfd_final_link_relocate (howto, abfd, input_section, data, offset,
2236                                    symbol_value, addend);
2237 }
2238
2239 static bfd_reloc_status_type
2240 nios2_elf32_do_pcrel_lo16_relocate (bfd *abfd, reloc_howto_type *howto,
2241                                     asection *input_section,
2242                                     bfd_byte *data, bfd_vma offset,
2243                                     bfd_vma symbol_value, bfd_vma addend)
2244 {
2245   symbol_value = symbol_value + addend;
2246   addend = 0;
2247   symbol_value = symbol_value & 0xffff;
2248   return _bfd_final_link_relocate (howto, abfd, input_section,
2249                                    data, offset, symbol_value, addend);
2250 }
2251
2252 static bfd_reloc_status_type
2253 nios2_elf32_do_pcrel_hiadj16_relocate (bfd *abfd, reloc_howto_type *howto,
2254                                        asection *input_section,
2255                                        bfd_byte *data, bfd_vma offset,
2256                                        bfd_vma symbol_value, bfd_vma addend)
2257 {
2258   symbol_value = symbol_value + addend;
2259   symbol_value -= (input_section->output_section->vma
2260                    + input_section->output_offset);
2261   symbol_value -= offset;
2262   addend = 0;
2263   symbol_value = hiadj(symbol_value);
2264   return _bfd_final_link_relocate (howto, abfd, input_section, data, offset,
2265                                    symbol_value, addend);
2266 }
2267
2268 static bfd_reloc_status_type
2269 nios2_elf32_do_pcrel16_relocate (bfd *abfd, reloc_howto_type *howto,
2270                                  asection *input_section,
2271                                  bfd_byte *data, bfd_vma offset, 
2272                                  bfd_vma symbol_value, bfd_vma addend)
2273 {
2274   /* NIOS2 pc relative relocations are relative to the next 32-bit instruction 
2275      so we need to subtract 4 before doing a final_link_relocate. */
2276   symbol_value = symbol_value + addend - 4;
2277   addend = 0;
2278   return _bfd_final_link_relocate (howto, abfd, input_section,
2279                                    data, offset, symbol_value, addend);
2280 }
2281
2282 static bfd_reloc_status_type
2283 nios2_elf32_do_call26_relocate (bfd *abfd, reloc_howto_type *howto,
2284                                 asection *input_section,
2285                                 bfd_byte *data, bfd_vma offset, 
2286                                 bfd_vma symbol_value, bfd_vma addend)
2287 {
2288   /* Check that the relocation is in the same page as the current address.  */
2289   if (CALL26_SEGMENT (symbol_value + addend) 
2290       != CALL26_SEGMENT (input_section->output_section->vma
2291                          + input_section->output_offset
2292                          + offset))
2293     return bfd_reloc_overflow;
2294
2295   return _bfd_final_link_relocate (howto, abfd, input_section,
2296                                    data, offset, symbol_value, addend);
2297 }
2298
2299 static bfd_reloc_status_type
2300 nios2_elf32_do_gprel_relocate (bfd *abfd, reloc_howto_type *howto,
2301                                asection *input_section,
2302                                bfd_byte *data, bfd_vma offset, 
2303                                bfd_vma symbol_value, bfd_vma addend)
2304 {
2305   /* Because we need the output_bfd, the special handling is done
2306      in nios2_elf32_relocate_section or in nios2_elf32_gprel_relocate.  */
2307   return _bfd_final_link_relocate (howto, abfd, input_section,
2308                                    data, offset, symbol_value, addend);
2309 }
2310
2311 static bfd_reloc_status_type
2312 nios2_elf32_do_ujmp_relocate (bfd *abfd, reloc_howto_type *howto,
2313                               asection *input_section,
2314                               bfd_byte *data, bfd_vma offset, 
2315                               bfd_vma symbol_value, bfd_vma addend)
2316 {
2317   bfd_vma symbol_lo16, symbol_hi16;
2318   bfd_reloc_status_type r;
2319   symbol_value = symbol_value + addend;
2320   addend = 0;
2321   symbol_hi16 = (symbol_value >> 16) & 0xffff;
2322   symbol_lo16 = symbol_value & 0xffff;
2323
2324   r = _bfd_final_link_relocate (howto, abfd, input_section,
2325                                 data, offset, symbol_hi16, addend);
2326
2327   if (r == bfd_reloc_ok)
2328     return _bfd_final_link_relocate (howto, abfd, input_section,
2329                                      data, offset + 4, symbol_lo16, addend);
2330
2331   return r;
2332 }
2333
2334 static bfd_reloc_status_type
2335 nios2_elf32_do_cjmp_relocate (bfd *abfd, reloc_howto_type *howto,
2336                               asection *input_section,
2337                               bfd_byte *data, bfd_vma offset, 
2338                               bfd_vma symbol_value, bfd_vma addend)
2339 {
2340   bfd_vma symbol_lo16, symbol_hi16;
2341   bfd_reloc_status_type r;
2342   symbol_value = symbol_value + addend;
2343   addend = 0;
2344   symbol_hi16 = (symbol_value >> 16) & 0xffff;
2345   symbol_lo16 = symbol_value & 0xffff;
2346
2347   r = _bfd_final_link_relocate (howto, abfd, input_section,
2348                                 data, offset, symbol_hi16, addend);
2349
2350   if (r == bfd_reloc_ok)
2351     return _bfd_final_link_relocate (howto, abfd, input_section,
2352                                      data, offset + 4, symbol_lo16, addend);
2353
2354   return r;
2355 }
2356
2357 static bfd_reloc_status_type
2358 nios2_elf32_do_callr_relocate (bfd *abfd, reloc_howto_type *howto,
2359                                asection *input_section,
2360                                bfd_byte *data, bfd_vma offset, 
2361                                bfd_vma symbol_value, bfd_vma addend)
2362 {
2363   bfd_vma symbol_lo16, symbol_hi16;
2364   bfd_reloc_status_type r;
2365   symbol_value = symbol_value + addend;
2366   addend = 0;
2367   symbol_hi16 = (symbol_value >> 16) & 0xffff;
2368   symbol_lo16 = symbol_value & 0xffff;
2369
2370   r = _bfd_final_link_relocate (howto, abfd, input_section,
2371                                 data, offset, symbol_hi16, addend);
2372
2373   if (r == bfd_reloc_ok)
2374     return _bfd_final_link_relocate (howto, abfd, input_section,
2375                                      data, offset + 4, symbol_lo16, addend);
2376
2377   return r;
2378 }
2379
2380 /* HOWTO handlers for relocations that require special handling.  */
2381
2382 /* This is for relocations used only when relaxing to ensure
2383    changes in size of section don't screw up .align.  */
2384 static bfd_reloc_status_type
2385 nios2_elf32_ignore_reloc (bfd *abfd ATTRIBUTE_UNUSED, arelent *reloc_entry,
2386                           asymbol *symbol ATTRIBUTE_UNUSED, 
2387                           void *data ATTRIBUTE_UNUSED, asection *input_section, 
2388                           bfd *output_bfd, 
2389                           char **error_message ATTRIBUTE_UNUSED)
2390 {
2391   if (output_bfd != NULL)
2392     reloc_entry->address += input_section->output_offset;
2393   return bfd_reloc_ok;
2394 }
2395
2396 static bfd_reloc_status_type
2397 nios2_elf32_hi16_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol, 
2398                            void *data, asection *input_section, 
2399                            bfd *output_bfd, 
2400                            char **error_message ATTRIBUTE_UNUSED)
2401 {
2402   /* This part is from bfd_elf_generic_reloc.  */
2403   if (output_bfd != NULL
2404       && (symbol->flags & BSF_SECTION_SYM) == 0
2405       && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
2406     {
2407       reloc_entry->address += input_section->output_offset;
2408       return bfd_reloc_ok;
2409     }
2410
2411   if (output_bfd != NULL)
2412     /* FIXME: See bfd_perform_relocation.  Is this right?  */
2413     return bfd_reloc_continue;
2414
2415   return nios2_elf32_do_hi16_relocate (abfd, reloc_entry->howto,
2416                                        input_section,
2417                                        data, reloc_entry->address,
2418                                        (symbol->value
2419                                         + symbol->section->output_section->vma
2420                                         + symbol->section->output_offset),
2421                                        reloc_entry->addend);
2422 }
2423
2424 static bfd_reloc_status_type
2425 nios2_elf32_lo16_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2426                            void *data, asection *input_section, 
2427                            bfd *output_bfd, 
2428                            char **error_message ATTRIBUTE_UNUSED)
2429 {
2430   /* This part is from bfd_elf_generic_reloc.  */
2431   if (output_bfd != NULL
2432       && (symbol->flags & BSF_SECTION_SYM) == 0
2433       && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
2434     {
2435       reloc_entry->address += input_section->output_offset;
2436       return bfd_reloc_ok;
2437     }
2438
2439   if (output_bfd != NULL)
2440     /* FIXME: See bfd_perform_relocation.  Is this right?  */
2441     return bfd_reloc_continue;
2442
2443   return nios2_elf32_do_lo16_relocate (abfd, reloc_entry->howto,
2444                                        input_section,
2445                                        data, reloc_entry->address,
2446                                        (symbol->value
2447                                         + symbol->section->output_section->vma
2448                                         + symbol->section->output_offset),
2449                                        reloc_entry->addend);
2450 }
2451
2452 static bfd_reloc_status_type
2453 nios2_elf32_hiadj16_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2454                               void *data, asection *input_section, 
2455                               bfd *output_bfd, 
2456                               char **error_message ATTRIBUTE_UNUSED)
2457 {
2458   /* This part is from bfd_elf_generic_reloc.  */
2459   if (output_bfd != NULL
2460       && (symbol->flags & BSF_SECTION_SYM) == 0
2461       && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
2462     {
2463       reloc_entry->address += input_section->output_offset;
2464       return bfd_reloc_ok;
2465     }
2466
2467   if (output_bfd != NULL)
2468     /* FIXME: See bfd_perform_relocation.  Is this right?  */
2469     return bfd_reloc_continue;
2470
2471   return nios2_elf32_do_hiadj16_relocate (abfd, reloc_entry->howto,
2472                                           input_section,
2473                                           data, reloc_entry->address,
2474                                           (symbol->value
2475                                            + symbol->section->output_section->vma
2476                                            + symbol->section->output_offset),
2477                                           reloc_entry->addend);
2478 }
2479
2480 static bfd_reloc_status_type
2481 nios2_elf32_pcrel_lo16_relocate (bfd *abfd, arelent *reloc_entry,
2482                                  asymbol *symbol, void *data,
2483                                  asection *input_section, bfd *output_bfd,
2484                                  char **error_message ATTRIBUTE_UNUSED)
2485 {
2486   /* This part is from bfd_elf_generic_reloc.  */
2487   if (output_bfd != NULL
2488       && (symbol->flags & BSF_SECTION_SYM) == 0
2489       && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
2490     {
2491       reloc_entry->address += input_section->output_offset;
2492       return bfd_reloc_ok;
2493     }
2494
2495   if (output_bfd != NULL)
2496     /* FIXME: See bfd_perform_relocation.  Is this right?  */
2497     return bfd_reloc_continue;
2498
2499   return nios2_elf32_do_pcrel_lo16_relocate (
2500     abfd, reloc_entry->howto, input_section, data, reloc_entry->address,
2501     (symbol->value + symbol->section->output_section->vma
2502      + symbol->section->output_offset),
2503     reloc_entry->addend);
2504 }
2505
2506 static bfd_reloc_status_type
2507 nios2_elf32_pcrel_hiadj16_relocate (bfd *abfd, arelent *reloc_entry,
2508                                     asymbol *symbol, void *data,
2509                                     asection *input_section, bfd *output_bfd,
2510                                     char **error_message ATTRIBUTE_UNUSED)
2511 {
2512   /* This part is from bfd_elf_generic_reloc.  */
2513   if (output_bfd != NULL
2514       && (symbol->flags & BSF_SECTION_SYM) == 0
2515       && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
2516     {
2517       reloc_entry->address += input_section->output_offset;
2518       return bfd_reloc_ok;
2519     }
2520
2521   if (output_bfd != NULL)
2522     /* FIXME: See bfd_perform_relocation.  Is this right?  */
2523     return bfd_reloc_continue;
2524
2525   return nios2_elf32_do_pcrel_hiadj16_relocate (
2526     abfd, reloc_entry->howto, input_section, data, reloc_entry->address,
2527     (symbol->value + symbol->section->output_section->vma
2528      + symbol->section->output_offset),
2529     reloc_entry->addend);
2530 }
2531
2532 static bfd_reloc_status_type
2533 nios2_elf32_pcrel16_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2534                               void *data, asection *input_section, 
2535                               bfd *output_bfd, 
2536                               char **error_message ATTRIBUTE_UNUSED)
2537 {
2538   /* This part is from bfd_elf_generic_reloc.  */
2539   if (output_bfd != NULL
2540       && (symbol->flags & BSF_SECTION_SYM) == 0
2541       && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
2542     {
2543       reloc_entry->address += input_section->output_offset;
2544       return bfd_reloc_ok;
2545     }
2546
2547   if (output_bfd != NULL)
2548     /* FIXME: See bfd_perform_relocation.  Is this right?  */
2549     return bfd_reloc_continue;
2550
2551   return nios2_elf32_do_pcrel16_relocate (abfd, reloc_entry->howto,
2552                                           input_section,
2553                                           data, reloc_entry->address,
2554                                           (symbol->value
2555                                            + symbol->section->output_section->vma
2556                                            + symbol->section->output_offset),
2557                                           reloc_entry->addend);
2558 }
2559
2560 static bfd_reloc_status_type
2561 nios2_elf32_call26_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2562                              void *data, asection *input_section, 
2563                              bfd *output_bfd, 
2564                              char **error_message ATTRIBUTE_UNUSED)
2565 {
2566   /* This part is from bfd_elf_generic_reloc.  */
2567   if (output_bfd != NULL
2568       && (symbol->flags & BSF_SECTION_SYM) == 0
2569       && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
2570     {
2571       reloc_entry->address += input_section->output_offset;
2572       return bfd_reloc_ok;
2573     }
2574
2575   if (output_bfd != NULL)
2576     /* FIXME: See bfd_perform_relocation.  Is this right?  */
2577     return bfd_reloc_continue;
2578
2579   return nios2_elf32_do_call26_relocate (abfd, reloc_entry->howto,
2580                                          input_section,
2581                                          data, reloc_entry->address,
2582                                          (symbol->value
2583                                           + symbol->section->output_section->vma
2584                                           + symbol->section->output_offset),
2585                                          reloc_entry->addend);
2586 }
2587
2588 static bfd_reloc_status_type
2589 nios2_elf32_gprel_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2590                             void *data, asection *input_section, 
2591                             bfd *output_bfd, char **msg)
2592 {
2593   bfd_vma relocation;
2594   bfd_vma gp;
2595   bfd_reloc_status_type r;
2596
2597
2598   /* This part is from bfd_elf_generic_reloc.  */
2599   if (output_bfd != NULL
2600       && (symbol->flags & BSF_SECTION_SYM) == 0
2601       && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
2602     {
2603       reloc_entry->address += input_section->output_offset;
2604       return bfd_reloc_ok;
2605     }
2606
2607   if (output_bfd != NULL)
2608     /* FIXME: See bfd_perform_relocation.  Is this right?  */
2609     return bfd_reloc_continue;
2610
2611   relocation = (symbol->value
2612                 + symbol->section->output_section->vma
2613                 + symbol->section->output_offset);
2614
2615   /* This assumes we've already cached the _gp symbol.  */
2616   r = nios2_elf_final_gp (abfd, symbol, FALSE, msg, &gp);
2617   if (r == bfd_reloc_ok)
2618     {
2619       relocation = relocation + reloc_entry->addend - gp;
2620       reloc_entry->addend = 0;
2621       if ((signed) relocation < -32768 || (signed) relocation > 32767)
2622         {
2623           *msg = _("global pointer relative address out of range");
2624           r = bfd_reloc_outofrange;
2625         }
2626       else
2627         r = nios2_elf32_do_gprel_relocate (abfd, reloc_entry->howto,
2628                                            input_section,
2629                                            data, reloc_entry->address,
2630                                            relocation, reloc_entry->addend);
2631     }
2632
2633   return r;
2634 }
2635
2636 static bfd_reloc_status_type
2637 nios2_elf32_ujmp_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2638                            void *data, asection *input_section, 
2639                            bfd *output_bfd, char **msg ATTRIBUTE_UNUSED)
2640 {
2641   /* This part is from bfd_elf_generic_reloc.  */
2642   if (output_bfd != NULL
2643       && (symbol->flags & BSF_SECTION_SYM) == 0
2644       && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
2645     {
2646       reloc_entry->address += input_section->output_offset;
2647       return bfd_reloc_ok;
2648     }
2649
2650   if (output_bfd != NULL)
2651     /* FIXME: See bfd_perform_relocation.  Is this right?  */
2652     return bfd_reloc_continue;
2653
2654   return nios2_elf32_do_ujmp_relocate (abfd, reloc_entry->howto,
2655                                        input_section,
2656                                        data, reloc_entry->address,
2657                                        (symbol->value
2658                                         + symbol->section->output_section->vma
2659                                         + symbol->section->output_offset),
2660                                        reloc_entry->addend);
2661 }
2662
2663 static bfd_reloc_status_type
2664 nios2_elf32_cjmp_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2665                            void *data, asection *input_section, 
2666                            bfd *output_bfd, char **msg ATTRIBUTE_UNUSED)
2667 {
2668   /* This part is from bfd_elf_generic_reloc.  */
2669   if (output_bfd != NULL
2670       && (symbol->flags & BSF_SECTION_SYM) == 0
2671       && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
2672     {
2673       reloc_entry->address += input_section->output_offset;
2674       return bfd_reloc_ok;
2675     }
2676
2677   if (output_bfd != NULL)
2678     /* FIXME: See bfd_perform_relocation.  Is this right?  */
2679     return bfd_reloc_continue;
2680
2681   return nios2_elf32_do_cjmp_relocate (abfd, reloc_entry->howto,
2682                                        input_section,
2683                                        data, reloc_entry->address,
2684                                        (symbol->value
2685                                         + symbol->section->output_section->vma
2686                                         + symbol->section->output_offset),
2687                                        reloc_entry->addend);
2688 }
2689
2690 static bfd_reloc_status_type
2691 nios2_elf32_callr_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2692                             void *data, asection *input_section, 
2693                             bfd *output_bfd, char **msg ATTRIBUTE_UNUSED)
2694 {
2695   /* This part is from bfd_elf_generic_reloc.  */
2696   if (output_bfd != NULL
2697       && (symbol->flags & BSF_SECTION_SYM) == 0
2698       && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
2699     {
2700       reloc_entry->address += input_section->output_offset;
2701       return bfd_reloc_ok;
2702     }
2703
2704   if (output_bfd != NULL)
2705     /* FIXME: See bfd_perform_relocation.  Is this right?  */
2706     return bfd_reloc_continue;
2707
2708   return nios2_elf32_do_callr_relocate (abfd, reloc_entry->howto,
2709                                         input_section,
2710                                         data, reloc_entry->address,
2711                                         (symbol->value
2712                                          + symbol->section->output_section->vma
2713                                          + symbol->section->output_offset),
2714                                         reloc_entry->addend);
2715 }
2716
2717  
2718 /* Implement elf_backend_relocate_section.  */
2719 static bfd_boolean
2720 nios2_elf32_relocate_section (bfd *output_bfd,
2721                               struct bfd_link_info *info,
2722                               bfd *input_bfd,
2723                               asection *input_section,
2724                               bfd_byte *contents,
2725                               Elf_Internal_Rela *relocs,
2726                               Elf_Internal_Sym *local_syms,
2727                               asection **local_sections)
2728 {
2729   Elf_Internal_Shdr *symtab_hdr;
2730   struct elf_link_hash_entry **sym_hashes;
2731   Elf_Internal_Rela *rel;
2732   Elf_Internal_Rela *relend;
2733   struct elf32_nios2_link_hash_table *htab;
2734   asection *sgot;
2735   asection *splt;
2736   asection *sreloc = NULL;
2737   bfd_vma *local_got_offsets;
2738   bfd_vma got_base;
2739
2740   symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
2741   sym_hashes = elf_sym_hashes (input_bfd);
2742   relend = relocs + input_section->reloc_count;
2743
2744   htab = elf32_nios2_hash_table (info);
2745   sgot = htab->root.sgot;
2746   splt = htab->root.splt;
2747   local_got_offsets = elf_local_got_offsets (input_bfd);
2748
2749   if (elf32_nios2_hash_table (info)->h_gp_got == NULL)
2750     got_base = 0;
2751   else
2752     got_base = elf32_nios2_hash_table (info)->h_gp_got->root.u.def.value;
2753
2754   for (rel = relocs; rel < relend; rel++)
2755     {
2756       reloc_howto_type *howto;
2757       unsigned long r_symndx;
2758       Elf_Internal_Sym *sym;
2759       asection *sec;
2760       struct elf_link_hash_entry *h;
2761       struct elf32_nios2_link_hash_entry *eh;
2762       bfd_vma relocation;
2763       bfd_vma gp;
2764       bfd_vma reloc_address;
2765       bfd_reloc_status_type r = bfd_reloc_ok;
2766       const char *name = NULL;
2767       int r_type;
2768       const char *format;
2769       char msgbuf[256];
2770       const char* msg = (const char*) NULL;
2771       bfd_boolean unresolved_reloc;
2772       bfd_vma off;
2773       int use_plt;
2774
2775       r_type = ELF32_R_TYPE (rel->r_info);
2776       r_symndx = ELF32_R_SYM (rel->r_info);
2777
2778       howto = lookup_howto ((unsigned) ELF32_R_TYPE (rel->r_info));
2779       h = NULL;
2780       sym = NULL;
2781       sec = NULL;
2782
2783       if (r_symndx < symtab_hdr->sh_info)
2784         {
2785           sym = local_syms + r_symndx;
2786           sec = local_sections[r_symndx];
2787           relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
2788         }
2789       else
2790         {
2791           bfd_boolean warned, ignored;
2792
2793           RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
2794                                    r_symndx, symtab_hdr, sym_hashes,
2795                                    h, sec, relocation,
2796                                    unresolved_reloc, warned, ignored);
2797         }
2798
2799       if (sec && discarded_section (sec))
2800         RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
2801                                          rel, 1, relend, howto, 0, contents);
2802
2803       /* Nothing more to do unless this is a final link.  */
2804       if (info->relocatable)
2805         continue;
2806
2807       if (sec && sec->output_section)
2808         reloc_address = (sec->output_section->vma + sec->output_offset
2809                          + rel->r_offset);
2810       else
2811         reloc_address = 0;
2812                 
2813       if (howto)
2814         {
2815           switch (howto->type)
2816             {
2817             case R_NIOS2_HI16:
2818               r = nios2_elf32_do_hi16_relocate (input_bfd, howto,
2819                                                 input_section,
2820                                                 contents, rel->r_offset,
2821                                                 relocation, rel->r_addend);
2822               break;
2823             case R_NIOS2_LO16:
2824               r = nios2_elf32_do_lo16_relocate (input_bfd, howto,
2825                                                 input_section,
2826                                                 contents, rel->r_offset,
2827                                                 relocation, rel->r_addend);
2828               break;
2829             case R_NIOS2_PCREL_LO:
2830               r = nios2_elf32_do_pcrel_lo16_relocate (input_bfd, howto,
2831                                                       input_section,
2832                                                       contents,
2833                                                       rel->r_offset,
2834                                                       relocation,
2835                                                       rel->r_addend);
2836               break;
2837             case R_NIOS2_HIADJ16:
2838               r = nios2_elf32_do_hiadj16_relocate (input_bfd, howto,
2839                                                    input_section, contents,
2840                                                    rel->r_offset, relocation,
2841                                                    rel->r_addend);
2842               break;
2843             case R_NIOS2_PCREL_HA:
2844               r = nios2_elf32_do_pcrel_hiadj16_relocate (input_bfd, howto,
2845                                                          input_section,
2846                                                          contents,
2847                                                          rel->r_offset,
2848                                                          relocation,
2849                                                          rel->r_addend);
2850               break;
2851             case R_NIOS2_PCREL16:
2852               r = nios2_elf32_do_pcrel16_relocate (input_bfd, howto,
2853                                                    input_section, contents,
2854                                                    rel->r_offset, relocation,
2855                                                    rel->r_addend);
2856               break;
2857             case R_NIOS2_GPREL:
2858               /* Turns an absolute address into a gp-relative address.  */
2859               if (!nios2_elf_assign_gp (output_bfd, &gp, info))
2860                 {
2861                   format = _("global pointer relative relocation at address "
2862                              "0x%08x when _gp not defined\n");
2863                   sprintf (msgbuf, format, reloc_address);
2864                   msg = msgbuf;
2865                   r = bfd_reloc_dangerous;
2866                 }
2867               else
2868                 {
2869                   bfd_vma symbol_address = rel->r_addend + relocation;
2870                   relocation = relocation + rel->r_addend - gp;
2871                   rel->r_addend = 0;
2872                   if (((signed) relocation < -32768
2873                        || (signed) relocation > 32767)
2874                       && (!h
2875                           || h->root.type == bfd_link_hash_defined
2876                           || h->root.type == bfd_link_hash_defweak))
2877                     {
2878                       format = _("Unable to reach %s (at 0x%08x) from the "
2879                                  "global pointer (at 0x%08x) because the "
2880                                  "offset (%d) is out of the allowed range, "
2881                                  "-32678 to 32767.\n" );
2882                       sprintf (msgbuf, format, name, symbol_address, gp, 
2883                                (signed)relocation);
2884                       msg = msgbuf;
2885                       r = bfd_reloc_outofrange;
2886                     }
2887                   else
2888                     r = _bfd_final_link_relocate (howto, input_bfd,
2889                                                   input_section, contents,
2890                                                   rel->r_offset, relocation,
2891                                                   rel->r_addend);
2892                 }
2893
2894               break;
2895             case R_NIOS2_UJMP:
2896               r = nios2_elf32_do_ujmp_relocate (input_bfd, howto,
2897                                                 input_section,
2898                                                 contents, rel->r_offset,
2899                                                 relocation, rel->r_addend);
2900               break;
2901             case R_NIOS2_CJMP:
2902               r = nios2_elf32_do_cjmp_relocate (input_bfd, howto,
2903                                                 input_section,
2904                                                 contents, rel->r_offset,
2905                                                 relocation, rel->r_addend);
2906               break;
2907             case R_NIOS2_CALLR:
2908               r = nios2_elf32_do_callr_relocate (input_bfd, howto,
2909                                                  input_section, contents,
2910                                                  rel->r_offset, relocation,
2911                                                  rel->r_addend);
2912               break;
2913             case R_NIOS2_CALL26:
2914             case R_NIOS2_CALL26_NOAT:
2915               /* If we have a call to an undefined weak symbol, we just want
2916                  to stuff a zero in the bits of the call instruction and
2917                  bypass the normal call26 relocation handling, because it'll
2918                  diagnose an overflow error if address 0 isn't in the same
2919                  256MB segment as the call site.  Presumably the call
2920                  should be guarded by a null check anyway.  */
2921               if (h != NULL && h->root.type == bfd_link_hash_undefweak)
2922                 {
2923                   BFD_ASSERT (relocation == 0 && rel->r_addend == 0);
2924                   r = _bfd_final_link_relocate (howto, input_bfd,
2925                                                 input_section, contents,
2926                                                 rel->r_offset, relocation,
2927                                                 rel->r_addend);
2928                   break;
2929                 }
2930               /* Handle relocations which should use the PLT entry.
2931                  NIOS2_BFD_RELOC_32 relocations will use the symbol's value,
2932                  which may point to a PLT entry, but we don't need to handle
2933                  that here.  If we created a PLT entry, all branches in this
2934                  object should go to it.  */
2935               if (h != NULL && splt != NULL && h->plt.offset != (bfd_vma) -1)
2936                 {
2937                   /* If we've created a .plt section, and assigned a PLT entry
2938                      to this function, it should not be known to bind locally.
2939                      If it were, we would have cleared the PLT entry.  */
2940                   BFD_ASSERT (!SYMBOL_CALLS_LOCAL (info, h));
2941
2942                   relocation = (splt->output_section->vma
2943                                 + splt->output_offset
2944                                 + h->plt.offset);
2945
2946                   unresolved_reloc = FALSE;
2947                 }
2948               /* Detect R_NIOS2_CALL26 relocations that would overflow the
2949                  256MB segment.  Replace the target with a reference to a
2950                  trampoline instead.
2951                  Note that htab->stub_group is null if relaxation has been
2952                  disabled by the --no-relax linker command-line option, so
2953                  we can use that to skip this processing entirely.  */
2954               if (howto->type == R_NIOS2_CALL26 && htab->stub_group)
2955                 {
2956                   bfd_vma dest = relocation + rel->r_addend;
2957                   enum elf32_nios2_stub_type stub_type;
2958
2959                   eh = (struct elf32_nios2_link_hash_entry *)h;
2960                   stub_type = nios2_type_of_stub (input_section, rel, eh,
2961                                                   htab, dest, NULL);
2962
2963                   if (stub_type != nios2_stub_none)
2964                     {
2965                       struct elf32_nios2_stub_hash_entry *hsh;
2966
2967                       hsh = nios2_get_stub_entry (input_section, sec,
2968                                                   eh, rel, htab, stub_type);
2969                       if (hsh == NULL)
2970                         {
2971                           r = bfd_reloc_undefined;
2972                           break;
2973                         }
2974
2975                       dest = (hsh->stub_offset
2976                               + hsh->stub_sec->output_offset
2977                               + hsh->stub_sec->output_section->vma);
2978                       r = nios2_elf32_do_call26_relocate (input_bfd, howto,
2979                                                           input_section,
2980                                                           contents,
2981                                                           rel->r_offset,
2982                                                           dest, 0);
2983                       break;
2984                     }
2985                 }
2986
2987               /* Normal case.  */
2988               r = nios2_elf32_do_call26_relocate (input_bfd, howto,
2989                                                   input_section, contents,
2990                                                   rel->r_offset, relocation,
2991                                                   rel->r_addend);
2992               break;
2993             case R_NIOS2_ALIGN:
2994               r = bfd_reloc_ok;
2995               /* For symmetry this would be
2996                  r = nios2_elf32_do_ignore_reloc (input_bfd, howto,
2997                                                   input_section, contents,
2998                                                   rel->r_offset, relocation,
2999                                                   rel->r_addend);
3000                 but do_ignore_reloc would do no more than return
3001                 bfd_reloc_ok. */
3002               break;
3003
3004             case R_NIOS2_GOT16:
3005             case R_NIOS2_CALL16:
3006             case R_NIOS2_GOT_LO:
3007             case R_NIOS2_GOT_HA:
3008             case R_NIOS2_CALL_LO:
3009             case R_NIOS2_CALL_HA:
3010               /* Relocation is to the entry for this symbol in the
3011                  global offset table.  */
3012               if (sgot == NULL)
3013                 {
3014                   r = bfd_reloc_notsupported;
3015                   break;
3016                 }
3017
3018               use_plt = 0;
3019
3020               if (h != NULL)
3021                 {
3022                   bfd_boolean dyn;
3023
3024                   eh = (struct elf32_nios2_link_hash_entry *)h;
3025                   use_plt = (eh->got_types_used == CALL_USED
3026                              && h->plt.offset != (bfd_vma) -1);
3027
3028                   off = h->got.offset;
3029                   BFD_ASSERT (off != (bfd_vma) -1);
3030                   dyn = elf_hash_table (info)->dynamic_sections_created;
3031                   if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
3032                       || (info->shared
3033                           && SYMBOL_REFERENCES_LOCAL (info, h))
3034                       || (ELF_ST_VISIBILITY (h->other)
3035                           && h->root.type == bfd_link_hash_undefweak))
3036                     {
3037                       /* This is actually a static link, or it is a -Bsymbolic
3038                          link and the symbol is defined locally.  We must
3039                          initialize this entry in the global offset table.
3040                          Since the offset must always be a multiple of 4, we
3041                          use the least significant bit to record whether we
3042                          have initialized it already.
3043
3044                          When doing a dynamic link, we create a .rela.got
3045                          relocation entry to initialize the value.  This is
3046                          done in the finish_dynamic_symbol routine.  */
3047                       if ((off & 1) != 0)
3048                         off &= ~1;
3049                       else
3050                         {
3051                           bfd_put_32 (output_bfd, relocation,
3052                                       sgot->contents + off);
3053                           h->got.offset |= 1;
3054                         }
3055                     }
3056                   else
3057                     unresolved_reloc = FALSE;
3058                 }
3059               else
3060                 {
3061                   BFD_ASSERT (local_got_offsets != NULL
3062                               && local_got_offsets[r_symndx] != (bfd_vma) -1);
3063
3064                   off = local_got_offsets[r_symndx];
3065
3066                   /* The offset must always be a multiple of 4.  We use the
3067                      least significant bit to record whether we have already
3068                      generated the necessary reloc.  */
3069                   if ((off & 1) != 0)
3070                     off &= ~1;
3071                   else
3072                     {
3073                       bfd_put_32 (output_bfd, relocation,
3074                                   sgot->contents + off);
3075
3076                       if (info->shared)
3077                         {
3078                           asection *srelgot;
3079                           Elf_Internal_Rela outrel;
3080                           bfd_byte *loc;
3081
3082                           srelgot = htab->root.srelgot;
3083                           BFD_ASSERT (srelgot != NULL);
3084
3085                           outrel.r_addend = relocation;
3086                           outrel.r_offset = (sgot->output_section->vma
3087                                              + sgot->output_offset
3088                                              + off);
3089                           outrel.r_info = ELF32_R_INFO (0, R_NIOS2_RELATIVE);
3090                           loc = srelgot->contents;
3091                           loc += (srelgot->reloc_count++ *
3092                                   sizeof (Elf32_External_Rela));
3093                           bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
3094                         }
3095
3096                       local_got_offsets[r_symndx] |= 1;
3097                     }
3098                 }
3099
3100               if (use_plt && info->shared)
3101                 {
3102                   off = ((h->plt.offset - 24) / 12 + 3) * 4;
3103                   relocation = (htab->root.sgotplt->output_offset + off
3104                                 - got_base);
3105                 }
3106               else
3107                 relocation = sgot->output_offset + off - got_base;
3108
3109               /* This relocation does not use the addend.  */
3110               rel->r_addend = 0;
3111
3112               switch (howto->type)
3113                 {
3114                 case R_NIOS2_GOT_LO:
3115                 case R_NIOS2_CALL_LO:
3116                   r = nios2_elf32_do_lo16_relocate (input_bfd, howto,
3117                                                     input_section, contents,
3118                                                     rel->r_offset, relocation,
3119                                                     rel->r_addend);
3120                   break;
3121                 case R_NIOS2_GOT_HA:
3122                 case R_NIOS2_CALL_HA:
3123                   r = nios2_elf32_do_hiadj16_relocate (input_bfd, howto,
3124                                                        input_section, contents,
3125                                                        rel->r_offset,
3126                                                        relocation,
3127                                                        rel->r_addend);
3128                   break;
3129                 default:
3130                   r = _bfd_final_link_relocate (howto, input_bfd,
3131                                                 input_section, contents,
3132                                                 rel->r_offset, relocation,
3133                                                 rel->r_addend);
3134                   break;
3135                 }
3136               break;
3137
3138             case R_NIOS2_GOTOFF_LO:
3139             case R_NIOS2_GOTOFF_HA:
3140             case R_NIOS2_GOTOFF:
3141               /* Relocation is relative to the global offset table pointer.  */
3142
3143               BFD_ASSERT (sgot != NULL);
3144               if (sgot == NULL)
3145                 {
3146                   r = bfd_reloc_notsupported;
3147                   break;
3148                 }
3149
3150               /* Adjust the relocation to be relative to the GOT pointer.  */
3151               relocation -= (sgot->output_section->vma
3152                              + sgot->output_offset - got_base);
3153
3154               switch (howto->type)
3155                 {
3156                 case R_NIOS2_GOTOFF_LO:
3157                   r = nios2_elf32_do_lo16_relocate (input_bfd, howto,
3158                                                     input_section, contents,
3159                                                     rel->r_offset, relocation,
3160                                                     rel->r_addend);
3161                   break;
3162                 case R_NIOS2_GOTOFF_HA:
3163                   r = nios2_elf32_do_hiadj16_relocate (input_bfd, howto,
3164                                                        input_section, contents,
3165                                                        rel->r_offset,
3166                                                        relocation,
3167                                                        rel->r_addend);
3168                   break;
3169                 default:
3170                   r = _bfd_final_link_relocate (howto, input_bfd,
3171                                                 input_section, contents,
3172                                                 rel->r_offset, relocation,
3173                                                 rel->r_addend);
3174                   break;
3175                 }
3176               break;
3177
3178             case R_NIOS2_TLS_LDO16:
3179               relocation -= dtpoff_base (info) + DTP_OFFSET;
3180
3181               r = _bfd_final_link_relocate (howto, input_bfd, input_section,
3182                                             contents, rel->r_offset,
3183                                             relocation, rel->r_addend);
3184               break;
3185             case R_NIOS2_TLS_LDM16:
3186               if (htab->root.sgot == NULL)
3187                 abort ();
3188
3189               off = htab->tls_ldm_got.offset;
3190
3191               if ((off & 1) != 0)
3192                 off &= ~1;
3193               else
3194                 {
3195                   /* If we don't know the module number, create a relocation
3196                      for it.  */
3197                   if (info->shared)
3198                     {
3199                       Elf_Internal_Rela outrel;
3200                       bfd_byte *loc;
3201
3202                       if (htab->root.srelgot == NULL)
3203                         abort ();
3204
3205                       outrel.r_addend = 0;
3206                       outrel.r_offset = (htab->root.sgot->output_section->vma
3207                                          + htab->root.sgot->output_offset
3208                                          + off);
3209                       outrel.r_info = ELF32_R_INFO (0, R_NIOS2_TLS_DTPMOD);
3210
3211                       loc = htab->root.srelgot->contents;
3212                       loc += (htab->root.srelgot->reloc_count++
3213                               * sizeof (Elf32_External_Rela));
3214                       bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
3215                     }
3216                   else
3217                     bfd_put_32 (output_bfd, 1,
3218                                 htab->root.sgot->contents + off);
3219
3220                   htab->tls_ldm_got.offset |= 1;
3221                 }
3222
3223               relocation = htab->root.sgot->output_offset + off - got_base;
3224
3225               r = _bfd_final_link_relocate (howto, input_bfd, input_section,
3226                                             contents, rel->r_offset,
3227                                             relocation, rel->r_addend);
3228
3229               break;
3230             case R_NIOS2_TLS_GD16:
3231             case R_NIOS2_TLS_IE16:
3232               {
3233                 int indx;
3234                 char tls_type;
3235
3236                 if (htab->root.sgot == NULL)
3237                   abort ();
3238
3239                 indx = 0;
3240                 if (h != NULL)
3241                   {
3242                     bfd_boolean dyn;
3243                     dyn = htab->root.dynamic_sections_created;
3244                     if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
3245                         && (!info->shared
3246                             || !SYMBOL_REFERENCES_LOCAL (info, h)))
3247                       {
3248                         unresolved_reloc = FALSE;
3249                         indx = h->dynindx;
3250                       }
3251                     off = h->got.offset;
3252                     tls_type = (((struct elf32_nios2_link_hash_entry *) h)
3253                                 ->tls_type);
3254                   }
3255                 else
3256                   {
3257                     if (local_got_offsets == NULL)
3258                       abort ();
3259                     off = local_got_offsets[r_symndx];
3260                     tls_type = (elf32_nios2_local_got_tls_type (input_bfd)
3261                                 [r_symndx]);
3262                   }
3263
3264                 if (tls_type == GOT_UNKNOWN)
3265                   abort ();
3266
3267                 if ((off & 1) != 0)
3268                   off &= ~1;
3269                 else
3270                   {
3271                     bfd_boolean need_relocs = FALSE;
3272                     Elf_Internal_Rela outrel;
3273                     bfd_byte *loc = NULL;
3274                     int cur_off = off;
3275
3276                     /* The GOT entries have not been initialized yet.  Do it
3277                        now, and emit any relocations.  If both an IE GOT and a
3278                        GD GOT are necessary, we emit the GD first.  */
3279
3280                     if ((info->shared || indx != 0)
3281                         && (h == NULL
3282                             || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
3283                             || h->root.type != bfd_link_hash_undefweak))
3284                       {
3285                         need_relocs = TRUE;
3286                         if (htab->root.srelgot == NULL)
3287                           abort ();
3288                         loc = htab->root.srelgot->contents;
3289                         loc += (htab->root.srelgot->reloc_count *
3290                                 sizeof (Elf32_External_Rela));
3291                       }
3292
3293                     if (tls_type & GOT_TLS_GD)
3294                       {
3295                         if (need_relocs)
3296                           {
3297                             outrel.r_addend = 0;
3298                             outrel.r_offset = (htab->root.sgot->output_section->vma
3299                                                + htab->root.sgot->output_offset
3300                                                + cur_off);
3301                             outrel.r_info = ELF32_R_INFO (indx,
3302                                                           R_NIOS2_TLS_DTPMOD);
3303
3304                             bfd_elf32_swap_reloca_out (output_bfd, &outrel,
3305                                                        loc);
3306                             htab->root.srelgot->reloc_count++;
3307                             loc += sizeof (Elf32_External_Rela);
3308
3309                             if (indx == 0)
3310                               bfd_put_32 (output_bfd,
3311                                           (relocation - dtpoff_base (info) -
3312                                            DTP_OFFSET),
3313                                           htab->root.sgot->contents + cur_off + 4);
3314                             else
3315                               {
3316                                 outrel.r_addend = 0;
3317                                 outrel.r_info = ELF32_R_INFO (indx,
3318                                   R_NIOS2_TLS_DTPREL);
3319                                 outrel.r_offset += 4;
3320
3321                                 bfd_elf32_swap_reloca_out (output_bfd, &outrel,
3322                                                            loc);
3323                                 htab->root.srelgot->reloc_count++;
3324                                 loc += sizeof (Elf32_External_Rela);
3325                               }
3326                           }
3327                         else
3328                           {
3329                             /* If we are not emitting relocations for a
3330                                general dynamic reference, then we must be in a
3331                                static link or an executable link with the
3332                                symbol binding locally.  Mark it as belonging
3333                                to module 1, the executable.  */
3334                             bfd_put_32 (output_bfd, 1,
3335                                         htab->root.sgot->contents + cur_off);
3336                             bfd_put_32 (output_bfd, (relocation -
3337                                                      dtpoff_base (info) -
3338                                                      DTP_OFFSET),
3339                                         htab->root.sgot->contents + cur_off + 4);
3340                           }
3341
3342                         cur_off += 8;
3343                       }
3344
3345                     if (tls_type & GOT_TLS_IE)
3346                       {
3347                         if (need_relocs)
3348                           {
3349                             if (indx == 0)
3350                               outrel.r_addend = (relocation -
3351                                                  dtpoff_base (info));
3352                             else
3353                               outrel.r_addend = 0;
3354                             outrel.r_offset = (htab->root.sgot->output_section->vma
3355                                                + htab->root.sgot->output_offset
3356                                                + cur_off);
3357                             outrel.r_info = ELF32_R_INFO (indx,
3358                                                           R_NIOS2_TLS_TPREL);
3359
3360                             bfd_elf32_swap_reloca_out (output_bfd, &outrel,
3361                                                        loc);
3362                             htab->root.srelgot->reloc_count++;
3363                             loc += sizeof (Elf32_External_Rela);
3364                           }
3365                         else
3366                           bfd_put_32 (output_bfd, (tpoff (info, relocation)
3367                                                    - TP_OFFSET),
3368                                       htab->root.sgot->contents + cur_off);
3369                         cur_off += 4;
3370                       }
3371
3372                     if (h != NULL)
3373                       h->got.offset |= 1;
3374                     else
3375                       local_got_offsets[r_symndx] |= 1;
3376                   }
3377
3378                 if ((tls_type & GOT_TLS_GD) && r_type != R_NIOS2_TLS_GD16)
3379                   off += 8;
3380                 relocation = htab->root.sgot->output_offset + off - got_base;
3381
3382                 r = _bfd_final_link_relocate (howto, input_bfd, input_section,
3383                                               contents, rel->r_offset,
3384                                               relocation, rel->r_addend);
3385               }
3386
3387               break;
3388             case R_NIOS2_TLS_LE16:
3389               if (info->shared && !info->pie)
3390                 {
3391                   (*_bfd_error_handler)
3392                     (_("%B(%A+0x%lx): R_NIOS2_TLS_LE16 relocation not "
3393                        "permitted in shared object"),
3394                      input_bfd, input_section,
3395                      (long) rel->r_offset, howto->name);
3396                   return FALSE;
3397                 }
3398               else
3399                 relocation = tpoff (info, relocation) - TP_OFFSET;
3400
3401               r = _bfd_final_link_relocate (howto, input_bfd, input_section,
3402                                             contents, rel->r_offset,
3403                                             relocation, rel->r_addend);
3404               break;
3405
3406             case R_NIOS2_BFD_RELOC_32:
3407               if (info->shared
3408                   && (input_section->flags & SEC_ALLOC) != 0
3409                   && (h == NULL
3410                       || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
3411                       || h->root.type != bfd_link_hash_undefweak))
3412                 {
3413                   Elf_Internal_Rela outrel;
3414                   bfd_byte *loc;
3415                   bfd_boolean skip, relocate;
3416
3417                   /* When generating a shared object, these relocations
3418                      are copied into the output file to be resolved at run
3419                      time.  */
3420
3421                   skip = FALSE;
3422                   relocate = FALSE;
3423
3424                   outrel.r_offset
3425                     = _bfd_elf_section_offset (output_bfd, info,
3426                                                input_section, rel->r_offset);
3427                   if (outrel.r_offset == (bfd_vma) -1)
3428                     skip = TRUE;
3429                   else if (outrel.r_offset == (bfd_vma) -2)
3430                     skip = TRUE, relocate = TRUE;
3431                   outrel.r_offset += (input_section->output_section->vma
3432                                       + input_section->output_offset);
3433
3434                   if (skip)
3435                     memset (&outrel, 0, sizeof outrel);
3436                   else if (h != NULL
3437                            && h->dynindx != -1
3438                            && (!info->shared
3439                                || !info->symbolic
3440                                || !h->def_regular))
3441                     {
3442                       outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
3443                       outrel.r_addend = rel->r_addend;
3444                     }
3445                   else
3446                     {
3447                       /* This symbol is local, or marked to become local.  */
3448                       outrel.r_addend = relocation + rel->r_addend;
3449                       relocate = TRUE;
3450                       outrel.r_info = ELF32_R_INFO (0, R_NIOS2_RELATIVE);
3451                     }
3452
3453                   sreloc = elf_section_data (input_section)->sreloc;
3454                   if (sreloc == NULL)
3455                     abort ();
3456
3457                   loc = sreloc->contents;
3458                   loc += sreloc->reloc_count++ * sizeof (Elf32_External_Rela);
3459                   bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
3460
3461                   /* This reloc will be computed at runtime, so there's no
3462                      need to do anything now, except for R_NIOS2_BFD_RELOC_32
3463                      relocations that have been turned into
3464                      R_NIOS2_RELATIVE.  */
3465                   if (!relocate)
3466                     break;
3467                 }
3468
3469               r = _bfd_final_link_relocate (howto, input_bfd,
3470                                             input_section, contents,
3471                                             rel->r_offset, relocation,
3472                                             rel->r_addend);
3473               break;
3474
3475             case R_NIOS2_TLS_DTPREL:
3476               relocation -= dtpoff_base (info);
3477               /* Fall through.  */
3478
3479             default:
3480               r = _bfd_final_link_relocate (howto, input_bfd,
3481                                             input_section, contents,
3482                                             rel->r_offset, relocation,
3483                                             rel->r_addend);
3484               break;
3485             }
3486         }
3487       else
3488         r = bfd_reloc_notsupported;
3489
3490       if (r != bfd_reloc_ok)
3491         {
3492           if (h != NULL)
3493             name = h->root.root.string;
3494           else
3495             {
3496               name = bfd_elf_string_from_elf_section (input_bfd,
3497                                                       symtab_hdr->sh_link,
3498                                                       sym->st_name);
3499               if (name == NULL || *name == '\0')
3500                 name = bfd_section_name (input_bfd, sec);
3501             }
3502
3503           switch (r)
3504             {
3505             case bfd_reloc_overflow:
3506               r = info->callbacks->reloc_overflow (info, NULL, name,
3507                                                    howto->name, (bfd_vma) 0,
3508                                                    input_bfd, input_section,
3509                                                    rel->r_offset);
3510               break;
3511
3512             case bfd_reloc_undefined:
3513               r = info->callbacks->undefined_symbol (info, name, input_bfd,
3514                                                      input_section,
3515                                                      rel->r_offset, TRUE);
3516               break;
3517
3518             case bfd_reloc_outofrange:
3519               if (msg == NULL)
3520                 msg = _("relocation out of range");
3521               break;
3522
3523             case bfd_reloc_notsupported:
3524               if (msg == NULL)
3525                 msg = _("unsupported relocation");
3526               break;
3527
3528             case bfd_reloc_dangerous:
3529               if (msg == NULL)
3530                 msg = _("dangerous relocation");
3531               break;
3532
3533             default:
3534               if (msg == NULL)
3535                 msg = _("unknown error");
3536               break;
3537             }
3538
3539           if (msg)
3540             {
3541               r = info->callbacks->warning
3542                 (info, msg, name, input_bfd, input_section, rel->r_offset);
3543               return FALSE;
3544             }
3545         }
3546     }
3547   return TRUE;
3548 }
3549
3550 /* Implement elf-backend_section_flags:
3551    Convert NIOS2 specific section flags to bfd internal section flags.  */
3552 static bfd_boolean
3553 nios2_elf32_section_flags (flagword *flags, const Elf_Internal_Shdr *hdr)
3554 {
3555   if (hdr->sh_flags & SHF_NIOS2_GPREL)
3556     *flags |= SEC_SMALL_DATA;
3557
3558   return TRUE;
3559 }
3560
3561 /* Implement elf_backend_fake_sections:
3562    Set the correct type for an NIOS2 ELF section.  We do this by the
3563    section name, which is a hack, but ought to work.  */
3564 static bfd_boolean
3565 nios2_elf32_fake_sections (bfd *abfd ATTRIBUTE_UNUSED,
3566                            Elf_Internal_Shdr *hdr, asection *sec)
3567 {
3568   register const char *name = bfd_get_section_name (abfd, sec);
3569
3570   if ((sec->flags & SEC_SMALL_DATA)
3571       || strcmp (name, ".sdata") == 0
3572       || strcmp (name, ".sbss") == 0
3573       || strcmp (name, ".lit4") == 0 || strcmp (name, ".lit8") == 0)
3574     hdr->sh_flags |= SHF_NIOS2_GPREL;
3575
3576   return TRUE;
3577 }
3578
3579 /* Create .got, .gotplt, and .rela.got sections in DYNOBJ, and set up
3580    shortcuts to them in our hash table.  */
3581 static bfd_boolean
3582 create_got_section (bfd *dynobj, struct bfd_link_info *info)
3583 {
3584   struct elf32_nios2_link_hash_table *htab;
3585   struct elf_link_hash_entry *h;
3586
3587   htab = elf32_nios2_hash_table (info);
3588
3589   if (! _bfd_elf_create_got_section (dynobj, info))
3590     return FALSE;
3591
3592   /* In order for the two loads in .PLTresolve to share the same %hiadj,
3593      _GLOBAL_OFFSET_TABLE_ must be aligned to a 16-byte boundary.  */
3594   if (!bfd_set_section_alignment (dynobj, htab->root.sgotplt, 4))
3595     return FALSE;
3596
3597   /* The Nios II ABI specifies that GOT-relative relocations are relative
3598      to the linker-created symbol _gp_got, rather than using
3599      _GLOBAL_OFFSET_TABLE_ directly.  In particular, the latter always
3600      points to the base of the GOT while _gp_got may include a bias.  */
3601   h = _bfd_elf_define_linkage_sym (dynobj, info, htab->root.sgotplt,
3602                                    "_gp_got");
3603   elf32_nios2_hash_table (info)->h_gp_got = h;
3604   if (h == NULL)
3605     return FALSE;
3606
3607   return TRUE;
3608 }
3609
3610 /* Implement elf_backend_create_dynamic_sections:
3611    Create .plt, .rela.plt, .got, .got.plt, .rela.got, .dynbss, and
3612    .rela.bss sections in DYNOBJ, and set up shortcuts to them in our
3613    hash table.  */
3614 static bfd_boolean
3615 nios2_elf32_create_dynamic_sections (bfd *dynobj, struct bfd_link_info *info)
3616 {
3617   struct elf32_nios2_link_hash_table *htab;
3618
3619   htab = elf32_nios2_hash_table (info);
3620   if (!htab->root.sgot && !create_got_section (dynobj, info))
3621     return FALSE;
3622
3623   _bfd_elf_create_dynamic_sections (dynobj, info);
3624
3625   /* In order for the two loads in a shared object .PLTresolve to share the
3626      same %hiadj, the start of the PLT (as well as the GOT) must be aligned
3627      to a 16-byte boundary.  This is because the addresses for these loads
3628      include the -(.plt+4) PIC correction.  */
3629   if (!bfd_set_section_alignment (dynobj, htab->root.splt, 4))
3630     return FALSE;
3631
3632   htab->sdynbss = bfd_get_linker_section (dynobj, ".dynbss");
3633   if (!htab->sdynbss)
3634     return FALSE;
3635   if (!info->shared)
3636     {
3637       htab->srelbss = bfd_get_linker_section (dynobj, ".rela.bss");
3638       if (!htab->srelbss)
3639         return FALSE;
3640     }
3641
3642   return TRUE;
3643 }
3644
3645 /* Implement elf_backend_copy_indirect_symbol:
3646    Copy the extra info we tack onto an elf_link_hash_entry.  */
3647 static void
3648 nios2_elf32_copy_indirect_symbol (struct bfd_link_info *info,
3649                                   struct elf_link_hash_entry *dir,
3650                                   struct elf_link_hash_entry *ind)
3651 {
3652   struct elf32_nios2_link_hash_entry *edir, *eind;
3653
3654   edir = (struct elf32_nios2_link_hash_entry *) dir;
3655   eind = (struct elf32_nios2_link_hash_entry *) ind;
3656
3657   if (eind->dyn_relocs != NULL)
3658     {
3659       if (edir->dyn_relocs != NULL)
3660         {
3661           struct elf32_nios2_dyn_relocs **pp;
3662           struct elf32_nios2_dyn_relocs *p;
3663
3664           /* Add reloc counts against the indirect sym to the direct sym
3665              list.  Merge any entries against the same section.  */
3666           for (pp = &eind->dyn_relocs; (p = *pp) != NULL; )
3667             {
3668               struct elf32_nios2_dyn_relocs *q;
3669
3670               for (q = edir->dyn_relocs; q != NULL; q = q->next)
3671                 if (q->sec == p->sec)
3672                   {
3673                     q->pc_count += p->pc_count;
3674                     q->count += p->count;
3675                     *pp = p->next;
3676                     break;
3677                   }
3678               if (q == NULL)
3679                 pp = &p->next;
3680             }
3681           *pp = edir->dyn_relocs;
3682         }
3683
3684       edir->dyn_relocs = eind->dyn_relocs;
3685       eind->dyn_relocs = NULL;
3686     }
3687
3688   if (ind->root.type == bfd_link_hash_indirect
3689       && dir->got.refcount <= 0)
3690     {
3691       edir->tls_type = eind->tls_type;
3692       eind->tls_type = GOT_UNKNOWN;
3693     }
3694
3695   edir->got_types_used |= eind->got_types_used;
3696
3697   _bfd_elf_link_hash_copy_indirect (info, dir, ind);
3698 }
3699
3700 /* Implement elf_backend_check_relocs:
3701    Look through the relocs for a section during the first phase.  */
3702 static bfd_boolean
3703 nios2_elf32_check_relocs (bfd *abfd, struct bfd_link_info *info,
3704                           asection *sec, const Elf_Internal_Rela *relocs)
3705 {
3706   bfd *dynobj;
3707   Elf_Internal_Shdr *symtab_hdr;
3708   struct elf_link_hash_entry **sym_hashes, **sym_hashes_end;
3709   const Elf_Internal_Rela *rel;
3710   const Elf_Internal_Rela *rel_end;
3711   struct elf32_nios2_link_hash_table *htab;
3712   asection *sgot;
3713   asection *srelgot;
3714   asection *sreloc = NULL;
3715   bfd_signed_vma *local_got_refcounts;
3716
3717   if (info->relocatable)
3718     return TRUE;
3719
3720   dynobj = elf_hash_table (info)->dynobj;
3721   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
3722   sym_hashes = elf_sym_hashes (abfd);
3723   sym_hashes_end = (sym_hashes
3724                     + symtab_hdr->sh_size / sizeof (Elf32_External_Sym));
3725   if (!elf_bad_symtab (abfd))
3726     sym_hashes_end -= symtab_hdr->sh_info;
3727   local_got_refcounts = elf_local_got_refcounts (abfd);
3728
3729   htab = elf32_nios2_hash_table (info);
3730   sgot = htab->root.sgot;
3731   srelgot = htab->root.srelgot;
3732
3733   rel_end = relocs + sec->reloc_count;
3734   for (rel = relocs; rel < rel_end; rel++)
3735     {
3736       unsigned int r_type;
3737       struct elf_link_hash_entry *h;
3738       unsigned long r_symndx;
3739
3740       r_symndx = ELF32_R_SYM (rel->r_info);
3741       if (r_symndx < symtab_hdr->sh_info)
3742         h = NULL;
3743       else
3744         {
3745           h = sym_hashes[r_symndx - symtab_hdr->sh_info];
3746           while (h->root.type == bfd_link_hash_indirect
3747                  || h->root.type == bfd_link_hash_warning)
3748             h = (struct elf_link_hash_entry *) h->root.u.i.link;
3749
3750           /* PR15323, ref flags aren't set for references in the same
3751              object.  */
3752           h->root.non_ir_ref = 1;
3753         }
3754
3755       r_type = ELF32_R_TYPE (rel->r_info);
3756
3757       switch (r_type)
3758         {
3759         case R_NIOS2_GOT16:
3760         case R_NIOS2_GOT_LO:
3761         case R_NIOS2_GOT_HA:
3762         case R_NIOS2_CALL16:
3763         case R_NIOS2_CALL_LO:
3764         case R_NIOS2_CALL_HA:
3765         case R_NIOS2_TLS_GD16:
3766         case R_NIOS2_TLS_IE16:
3767           /* This symbol requires a global offset table entry.  */
3768           {
3769             int tls_type, old_tls_type;
3770
3771             switch (r_type)
3772               {
3773               default:
3774               case R_NIOS2_GOT16:
3775               case R_NIOS2_GOT_LO:
3776               case R_NIOS2_GOT_HA:
3777               case R_NIOS2_CALL16:
3778               case R_NIOS2_CALL_LO:
3779               case R_NIOS2_CALL_HA:
3780                 tls_type = GOT_NORMAL;
3781                 break;
3782               case R_NIOS2_TLS_GD16:
3783                 tls_type = GOT_TLS_GD;
3784                 break;
3785               case R_NIOS2_TLS_IE16:
3786                 tls_type = GOT_TLS_IE;
3787                 break;
3788               }
3789
3790             if (dynobj == NULL)
3791               {
3792                 /* Create the .got section.  */
3793                 elf_hash_table (info)->dynobj = dynobj = abfd;
3794                 nios2_elf32_create_dynamic_sections (dynobj, info);
3795               }
3796
3797             if (sgot == NULL)
3798               {
3799                 sgot = htab->root.sgot;
3800                 BFD_ASSERT (sgot != NULL);
3801               }
3802
3803             if (srelgot == NULL
3804                 && (h != NULL || info->shared))
3805               {
3806                 srelgot = htab->root.srelgot;
3807                 BFD_ASSERT (srelgot != NULL);
3808               }
3809
3810             if (h != NULL)
3811               {
3812                 struct elf32_nios2_link_hash_entry *eh
3813                   = (struct elf32_nios2_link_hash_entry *)h;
3814                 h->got.refcount++;
3815                 old_tls_type = elf32_nios2_hash_entry(h)->tls_type;
3816                 if (r_type == R_NIOS2_CALL16
3817                     || r_type == R_NIOS2_CALL_LO
3818                     || r_type == R_NIOS2_CALL_HA)
3819                   {
3820                     /* Make sure a plt entry is created for this symbol if
3821                        it turns out to be a function defined by a dynamic
3822                        object.  */
3823                     h->plt.refcount++;
3824                     h->needs_plt = 1;
3825                     h->type = STT_FUNC;
3826                     eh->got_types_used |= CALL_USED;
3827                   }
3828                 else
3829                   eh->got_types_used |= GOT_USED;
3830               }
3831             else
3832               {
3833                 /* This is a global offset table entry for a local symbol.  */
3834                 if (local_got_refcounts == NULL)
3835                   {
3836                     bfd_size_type size;
3837
3838                     size = symtab_hdr->sh_info;
3839                     size *= (sizeof (bfd_signed_vma) + sizeof (char));
3840                     local_got_refcounts
3841                       = ((bfd_signed_vma *) bfd_zalloc (abfd, size));
3842                     if (local_got_refcounts == NULL)
3843                       return FALSE;
3844                     elf_local_got_refcounts (abfd) = local_got_refcounts;
3845                     elf32_nios2_local_got_tls_type (abfd)
3846                       = (char *) (local_got_refcounts + symtab_hdr->sh_info);
3847                   }
3848                 local_got_refcounts[r_symndx]++;
3849                 old_tls_type = elf32_nios2_local_got_tls_type (abfd) [r_symndx];
3850               }
3851
3852             /* We will already have issued an error message if there is a
3853                TLS / non-TLS mismatch, based on the symbol type.  We don't
3854                support any linker relaxations.  So just combine any TLS
3855                types needed.  */
3856             if (old_tls_type != GOT_UNKNOWN && old_tls_type != GOT_NORMAL
3857                 && tls_type != GOT_NORMAL)
3858               tls_type |= old_tls_type;
3859
3860             if (old_tls_type != tls_type)
3861               {
3862                 if (h != NULL)
3863                   elf32_nios2_hash_entry (h)->tls_type = tls_type;
3864                 else
3865                   elf32_nios2_local_got_tls_type (abfd) [r_symndx] = tls_type;
3866               }
3867           }
3868           /* Fall through */
3869         case R_NIOS2_TLS_LDM16:
3870           if (r_type == R_NIOS2_TLS_LDM16)
3871             htab->tls_ldm_got.refcount++;
3872
3873           if (htab->root.sgot == NULL)
3874             {
3875               if (htab->root.dynobj == NULL)
3876                 htab->root.dynobj = abfd;
3877               if (!create_got_section (htab->root.dynobj, info))
3878                 return FALSE;
3879             }
3880           break;
3881
3882           /* This relocation describes the C++ object vtable hierarchy.
3883              Reconstruct it for later use during GC.  */
3884         case R_NIOS2_GNU_VTINHERIT:
3885           if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
3886             return FALSE;
3887           break;
3888
3889           /* This relocation describes which C++ vtable entries are actually
3890              used.  Record for later use during GC.  */
3891         case R_NIOS2_GNU_VTENTRY:
3892           if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
3893             return FALSE;
3894           break;
3895
3896         case R_NIOS2_BFD_RELOC_32:
3897         case R_NIOS2_CALL26:
3898         case R_NIOS2_CALL26_NOAT:
3899         case R_NIOS2_HIADJ16:
3900         case R_NIOS2_LO16:
3901
3902           if (h != NULL)
3903             {
3904               /* If this reloc is in a read-only section, we might
3905                    need a copy reloc.  We can't check reliably at this
3906                    stage whether the section is read-only, as input
3907                    sections have not yet been mapped to output sections.
3908                    Tentatively set the flag for now, and correct in
3909                    adjust_dynamic_symbol.  */
3910               if (!info->shared)
3911                 h->non_got_ref = 1;
3912
3913               /* Make sure a plt entry is created for this symbol if it
3914                  turns out to be a function defined by a dynamic object.  */
3915               h->plt.refcount++;
3916
3917               if (r_type == R_NIOS2_CALL26 || r_type == R_NIOS2_CALL26_NOAT)
3918                 h->needs_plt = 1;
3919             }
3920
3921           /* If we are creating a shared library, we need to copy the
3922              reloc into the shared library.  */
3923           if (info->shared
3924               && (sec->flags & SEC_ALLOC) != 0
3925               && (r_type == R_NIOS2_BFD_RELOC_32
3926                   || (h != NULL && ! h->needs_plt
3927                       && (! info->symbolic || ! h->def_regular))))
3928             {
3929               struct elf32_nios2_dyn_relocs *p;
3930               struct elf32_nios2_dyn_relocs **head;
3931
3932               /* When creating a shared object, we must copy these
3933                  reloc types into the output file.  We create a reloc
3934                  section in dynobj and make room for this reloc.  */
3935               if (sreloc == NULL)
3936                 {
3937                   sreloc = _bfd_elf_make_dynamic_reloc_section
3938                     (sec, dynobj, 2, abfd, TRUE);
3939                   if (sreloc == NULL)
3940                     return FALSE;
3941                 }
3942
3943               /* If this is a global symbol, we count the number of
3944                  relocations we need for this symbol.  */
3945               if (h != NULL)
3946                 head = &((struct elf32_nios2_link_hash_entry *) h)->dyn_relocs;
3947               else
3948                 {
3949                   /* Track dynamic relocs needed for local syms too.
3950                      We really need local syms available to do this
3951                      easily.  Oh well.  */
3952
3953                   asection *s;
3954                   void *vpp;
3955                   Elf_Internal_Sym *isym;
3956
3957                   isym = bfd_sym_from_r_symndx (&htab->sym_cache,
3958                                                 abfd, r_symndx);
3959                   if (isym == NULL)
3960                     return FALSE;
3961
3962                   s = bfd_section_from_elf_index (abfd, isym->st_shndx);
3963                   if (s == NULL)
3964                     s = sec;
3965
3966                   vpp = &elf_section_data (s)->local_dynrel;
3967                   head = (struct elf32_nios2_dyn_relocs **) vpp;
3968                 }
3969
3970               p = *head;
3971               if (p == NULL || p->sec != sec)
3972                 {
3973                   bfd_size_type amt = sizeof *p;
3974                   p = ((struct elf32_nios2_dyn_relocs *)
3975                        bfd_alloc (htab->root.dynobj, amt));
3976                   if (p == NULL)
3977                     return FALSE;
3978                   p->next = *head;
3979                   *head = p;
3980                   p->sec = sec;
3981                   p->count = 0;
3982                   p->pc_count = 0;
3983                 }
3984
3985               p->count += 1;
3986
3987             }
3988           break;
3989         }
3990     }
3991
3992   return TRUE;
3993 }
3994
3995
3996 /* Implement elf_backend_gc_mark_hook:
3997    Return the section that should be marked against GC for a given
3998    relocation.  */
3999 static asection *
4000 nios2_elf32_gc_mark_hook (asection *sec,
4001                           struct bfd_link_info *info,
4002                           Elf_Internal_Rela *rel,
4003                           struct elf_link_hash_entry *h,
4004                           Elf_Internal_Sym *sym)
4005 {
4006   if (h != NULL)
4007     switch (ELF32_R_TYPE (rel->r_info))
4008       {
4009       case R_NIOS2_GNU_VTINHERIT:
4010       case R_NIOS2_GNU_VTENTRY:
4011         return NULL;
4012       }
4013   return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
4014 }
4015
4016 /* Implement elf_backend_gc_sweep_hook:
4017    Update the got entry reference counts for the section being removed.  */
4018 static bfd_boolean
4019 nios2_elf32_gc_sweep_hook (bfd *abfd,
4020                            struct bfd_link_info *info,
4021                            asection *sec,
4022                            const Elf_Internal_Rela *relocs)
4023 {
4024   Elf_Internal_Shdr *symtab_hdr;
4025   struct elf_link_hash_entry **sym_hashes;
4026   bfd_signed_vma *local_got_refcounts;
4027   const Elf_Internal_Rela *rel, *relend;
4028   bfd *dynobj;
4029
4030   if (info->relocatable)
4031     return TRUE;
4032
4033   elf_section_data (sec)->local_dynrel = NULL;
4034
4035   dynobj = elf_hash_table (info)->dynobj;
4036   if (dynobj == NULL)
4037     return TRUE;
4038
4039   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
4040   sym_hashes = elf_sym_hashes (abfd);
4041   local_got_refcounts = elf_local_got_refcounts (abfd);
4042
4043   relend = relocs + sec->reloc_count;
4044   for (rel = relocs; rel < relend; rel++)
4045     {
4046       unsigned long r_symndx;
4047       struct elf_link_hash_entry *h = NULL;
4048       int r_type;
4049
4050       r_symndx = ELF32_R_SYM (rel->r_info);
4051       if (r_symndx >= symtab_hdr->sh_info)
4052         {
4053           h = sym_hashes[r_symndx - symtab_hdr->sh_info];
4054           while (h->root.type == bfd_link_hash_indirect
4055                  || h->root.type == bfd_link_hash_warning)
4056             h = (struct elf_link_hash_entry *) h->root.u.i.link;
4057         }
4058
4059       r_type = ELF32_R_TYPE (rel->r_info);
4060       switch (r_type)
4061         {
4062         case R_NIOS2_GOT16:
4063         case R_NIOS2_GOT_LO:
4064         case R_NIOS2_GOT_HA:
4065         case R_NIOS2_CALL16:
4066         case R_NIOS2_CALL_LO:
4067         case R_NIOS2_CALL_HA:
4068           if (h != NULL)
4069             {
4070               if (h->got.refcount > 0)
4071                 --h->got.refcount;
4072             }
4073           else if (local_got_refcounts != NULL)
4074             {
4075               if (local_got_refcounts[r_symndx] > 0)
4076                 --local_got_refcounts[r_symndx];
4077             }
4078           break;
4079
4080         case R_NIOS2_PCREL_LO:
4081         case R_NIOS2_PCREL_HA:
4082         case R_NIOS2_BFD_RELOC_32:
4083         case R_NIOS2_CALL26:
4084         case R_NIOS2_CALL26_NOAT:
4085           if (h != NULL)
4086             {
4087               struct elf32_nios2_link_hash_entry *eh;
4088               struct elf32_nios2_dyn_relocs **pp;
4089               struct elf32_nios2_dyn_relocs *p;
4090
4091               eh = (struct elf32_nios2_link_hash_entry *) h;
4092
4093               if (h->plt.refcount > 0)
4094                 --h->plt.refcount;
4095
4096               if (r_type == R_NIOS2_PCREL_LO || r_type == R_NIOS2_PCREL_HA
4097                   || r_type == R_NIOS2_BFD_RELOC_32)
4098                 {
4099                   for (pp = &eh->dyn_relocs; (p = *pp) != NULL;
4100                        pp = &p->next)
4101                     if (p->sec == sec)
4102                       {
4103                         p->count -= 1;
4104                         if (p->count == 0)
4105                           *pp = p->next;
4106                         break;
4107                       }
4108                 }
4109             }
4110           break;
4111
4112         default:
4113           break;
4114         }
4115     }
4116
4117   return TRUE;
4118 }
4119
4120 /* Implement elf_backend_finish_dynamic_symbols:
4121    Finish up dynamic symbol handling.  We set the contents of various
4122    dynamic sections here.  */
4123 static bfd_boolean
4124 nios2_elf32_finish_dynamic_symbol (bfd *output_bfd,
4125                                    struct bfd_link_info *info,
4126                                    struct elf_link_hash_entry *h,
4127                                    Elf_Internal_Sym *sym)
4128 {
4129   struct elf32_nios2_link_hash_table *htab;
4130   struct elf32_nios2_link_hash_entry *eh
4131     = (struct elf32_nios2_link_hash_entry *)h;
4132   int use_plt;
4133
4134   htab = elf32_nios2_hash_table (info);
4135
4136   if (h->plt.offset != (bfd_vma) -1)
4137     {
4138       asection *splt;
4139       asection *sgotplt;
4140       asection *srela;
4141       bfd_vma plt_index;
4142       bfd_vma got_offset;
4143       Elf_Internal_Rela rela;
4144       bfd_byte *loc;
4145       bfd_vma got_address;
4146
4147       /* This symbol has an entry in the procedure linkage table.  Set
4148          it up.  */
4149       BFD_ASSERT (h->dynindx != -1);
4150       splt = htab->root.splt;
4151       sgotplt = htab->root.sgotplt;
4152       srela = htab->root.srelplt;
4153       BFD_ASSERT (splt != NULL && sgotplt != NULL && srela != NULL);
4154
4155       /* Emit the PLT entry.  */
4156       if (info->shared)
4157         {
4158           nios2_elf32_install_data (splt, nios2_so_plt_entry, h->plt.offset,
4159                                     3);
4160           plt_index = (h->plt.offset - 24) / 12;
4161           got_offset = (plt_index + 3) * 4;
4162           nios2_elf32_install_imm16 (splt, h->plt.offset,
4163                                      hiadj(plt_index * 4));
4164           nios2_elf32_install_imm16 (splt, h->plt.offset + 4,
4165                                      (plt_index * 4) & 0xffff);
4166           nios2_elf32_install_imm16 (splt, h->plt.offset + 8,
4167                                      0xfff4 - h->plt.offset);
4168           got_address = (sgotplt->output_section->vma + sgotplt->output_offset
4169                          + got_offset);
4170
4171           /* Fill in the entry in the global offset table.  There are no
4172              res_n slots for a shared object PLT, instead the .got.plt entries
4173              point to the PLT entries.  */
4174           bfd_put_32 (output_bfd,
4175                       splt->output_section->vma + splt->output_offset
4176                       + h->plt.offset, sgotplt->contents + got_offset);
4177         }
4178       else
4179         {
4180           plt_index = (h->plt.offset - 28 - htab->res_n_size) / 12;
4181           got_offset = (plt_index + 3) * 4;
4182
4183           nios2_elf32_install_data (splt, nios2_plt_entry, h->plt.offset, 3);
4184           got_address = (sgotplt->output_section->vma + sgotplt->output_offset
4185                          + got_offset);
4186           nios2_elf32_install_imm16 (splt, h->plt.offset, hiadj(got_address));
4187           nios2_elf32_install_imm16 (splt, h->plt.offset + 4,
4188                                      got_address & 0xffff);
4189
4190           /* Fill in the entry in the global offset table.  */
4191           bfd_put_32 (output_bfd,
4192                       splt->output_section->vma + splt->output_offset
4193                       + plt_index * 4, sgotplt->contents + got_offset);
4194         }
4195
4196       /* Fill in the entry in the .rela.plt section.  */
4197       rela.r_offset = got_address;
4198       rela.r_info = ELF32_R_INFO (h->dynindx, R_NIOS2_JUMP_SLOT);
4199       rela.r_addend = 0;
4200       loc = srela->contents + plt_index * sizeof (Elf32_External_Rela);
4201       bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
4202
4203       if (!h->def_regular)
4204         {
4205           /* Mark the symbol as undefined, rather than as defined in
4206              the .plt section.  Leave the value alone.  */
4207           sym->st_shndx = SHN_UNDEF;
4208           /* If the symbol is weak, we do need to clear the value.
4209              Otherwise, the PLT entry would provide a definition for
4210              the symbol even if the symbol wasn't defined anywhere,
4211              and so the symbol would never be NULL.  */
4212           if (!h->ref_regular_nonweak)
4213             sym->st_value = 0;
4214         }
4215     }
4216
4217   use_plt = (eh->got_types_used == CALL_USED
4218              && h->plt.offset != (bfd_vma) -1);
4219
4220   if (!use_plt && h->got.offset != (bfd_vma) -1
4221       && (elf32_nios2_hash_entry (h)->tls_type & GOT_TLS_GD) == 0
4222       && (elf32_nios2_hash_entry (h)->tls_type & GOT_TLS_IE) == 0)
4223     {
4224       asection *sgot;
4225       asection *srela;
4226       Elf_Internal_Rela rela;
4227       bfd_byte *loc;
4228       bfd_vma offset;
4229
4230       /* This symbol has an entry in the global offset table.  Set it
4231          up.  */
4232       sgot = htab->root.sgot;
4233       srela = htab->root.srelgot;
4234       BFD_ASSERT (sgot != NULL && srela != NULL);
4235
4236       offset = (h->got.offset & ~(bfd_vma) 1);
4237       rela.r_offset = (sgot->output_section->vma
4238                        + sgot->output_offset + offset);
4239
4240       /* If this is a -Bsymbolic link, and the symbol is defined
4241          locally, we just want to emit a RELATIVE reloc.  Likewise if
4242          the symbol was forced to be local because of a version file.
4243          The entry in the global offset table will already have been
4244          initialized in the relocate_section function.  */
4245
4246       if (info->shared && SYMBOL_REFERENCES_LOCAL (info, h))
4247         {
4248           rela.r_info = ELF32_R_INFO (0, R_NIOS2_RELATIVE);
4249           rela.r_addend = bfd_get_signed_32 (output_bfd,
4250                                              (sgot->contents + offset));
4251           bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + offset);
4252         }
4253       else
4254         {
4255           bfd_put_32 (output_bfd, (bfd_vma) 0,
4256                       sgot->contents + offset);
4257           rela.r_info = ELF32_R_INFO (h->dynindx, R_NIOS2_GLOB_DAT);
4258           rela.r_addend = 0;
4259         }
4260
4261       loc = srela->contents;
4262       loc += srela->reloc_count++ * sizeof (Elf32_External_Rela);
4263       bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
4264     }
4265
4266   if (use_plt && h->got.offset != (bfd_vma) -1)
4267     {
4268       bfd_vma offset = (h->got.offset & ~(bfd_vma) 1);
4269       asection *sgot = htab->root.sgot;
4270       asection *splt = htab->root.splt;
4271       bfd_put_32 (output_bfd, (splt->output_section->vma + splt->output_offset
4272                                + h->plt.offset),
4273                   sgot->contents + offset);
4274     }
4275
4276   if (h->needs_copy)
4277     {
4278       asection *s;
4279       Elf_Internal_Rela rela;
4280       bfd_byte *loc;
4281
4282       /* This symbol needs a copy reloc.  Set it up.  */
4283       BFD_ASSERT (h->dynindx != -1
4284                   && (h->root.type == bfd_link_hash_defined
4285                       || h->root.type == bfd_link_hash_defweak));
4286
4287       s = htab->srelbss;
4288       BFD_ASSERT (s != NULL);
4289
4290       rela.r_offset = (h->root.u.def.value
4291                        + h->root.u.def.section->output_section->vma
4292                        + h->root.u.def.section->output_offset);
4293       rela.r_info = ELF32_R_INFO (h->dynindx, R_NIOS2_COPY);
4294       rela.r_addend = 0;
4295       loc = s->contents + s->reloc_count++ * sizeof (Elf32_External_Rela);
4296       bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
4297     }
4298
4299   /* Mark _DYNAMIC, _GLOBAL_OFFSET_TABLE_, and _gp_got as absolute.  */
4300   if (strcmp (h->root.root.string, "_DYNAMIC") == 0
4301       || h == elf_hash_table (info)->hgot
4302       || h == elf32_nios2_hash_table (info)->h_gp_got)
4303     sym->st_shndx = SHN_ABS;
4304
4305   return TRUE;
4306 }
4307
4308 /* Implement elf_backend_finish_dynamic_sections.  */
4309 static bfd_boolean
4310 nios2_elf32_finish_dynamic_sections (bfd *output_bfd,
4311                                      struct bfd_link_info *info)
4312 {
4313   bfd *dynobj;
4314   asection *sgotplt;
4315   asection *sdyn;
4316   struct elf32_nios2_link_hash_table *htab;
4317
4318   htab = elf32_nios2_hash_table (info);
4319   dynobj = elf_hash_table (info)->dynobj;
4320   sgotplt = htab->root.sgotplt;
4321   BFD_ASSERT (sgotplt != NULL);
4322   sdyn = bfd_get_linker_section (dynobj, ".dynamic");
4323
4324   if (elf_hash_table (info)->dynamic_sections_created)
4325     {
4326       asection *splt;
4327       Elf32_External_Dyn *dyncon, *dynconend;
4328
4329       splt = htab->root.splt;
4330       BFD_ASSERT (splt != NULL && sdyn != NULL);
4331
4332       dyncon = (Elf32_External_Dyn *) sdyn->contents;
4333       dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
4334       for (; dyncon < dynconend; dyncon++)
4335         {
4336           Elf_Internal_Dyn dyn;
4337           asection *s;
4338
4339           bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
4340
4341           switch (dyn.d_tag)
4342             {
4343             default:
4344               break;
4345
4346             case DT_PLTGOT:
4347               s = htab->root.sgot;
4348               BFD_ASSERT (s != NULL);
4349               dyn.d_un.d_ptr = s->output_section->vma;
4350               bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
4351               break;
4352
4353             case DT_JMPREL:
4354               s = htab->root.srelplt;
4355               BFD_ASSERT (s != NULL);
4356               dyn.d_un.d_ptr = s->output_section->vma;
4357               bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
4358               break;
4359
4360             case DT_PLTRELSZ:
4361               s = htab->root.srelplt;
4362               BFD_ASSERT (s != NULL);
4363               dyn.d_un.d_val = s->size;
4364               bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
4365               break;
4366
4367             case DT_RELASZ:
4368               /* The procedure linkage table relocs (DT_JMPREL) should
4369                  not be included in the overall relocs (DT_RELA).
4370                  Therefore, we override the DT_RELASZ entry here to
4371                  make it not include the JMPREL relocs.  Since the
4372                  linker script arranges for .rela.plt to follow all
4373                  other relocation sections, we don't have to worry
4374                  about changing the DT_RELA entry.  */
4375               s = htab->root.srelplt;
4376               if (s != NULL)
4377                 dyn.d_un.d_val -= s->size;
4378               bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
4379               break;
4380
4381             case DT_NIOS2_GP:
4382               s = htab->root.sgot;
4383               BFD_ASSERT (s != NULL);
4384               dyn.d_un.d_ptr = s->output_section->vma + 0x7ff0;
4385               bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
4386               break;
4387             }
4388         }
4389
4390       /* Fill in the first entry in the procedure linkage table.  */
4391       if (splt->size > 0)
4392         {
4393           bfd_vma got_address = (sgotplt->output_section->vma
4394                                  + sgotplt->output_offset);
4395           if (info->shared)
4396             {
4397               bfd_vma corrected = got_address - (splt->output_section->vma
4398                                                  + splt->output_offset + 4);
4399               nios2_elf32_install_data (splt, nios2_so_plt0_entry, 0, 6);
4400               nios2_elf32_install_imm16 (splt, 4, hiadj (corrected));
4401               nios2_elf32_install_imm16 (splt, 12, (corrected & 0xffff) + 4);
4402               nios2_elf32_install_imm16 (splt, 16, (corrected & 0xffff) + 8);
4403             }
4404           else
4405             {
4406               /* Divide by 4 here, not 3 because we already corrected for the
4407                  res_N branches.  */
4408               bfd_vma res_size = (splt->size - 28) / 4;
4409               bfd_vma res_start = (splt->output_section->vma
4410                                    + splt->output_offset);
4411               bfd_vma res_offset;
4412
4413               for (res_offset = 0; res_offset < res_size; res_offset += 4)
4414                 bfd_put_32 (output_bfd,
4415                             6 | ((res_size - (res_offset + 4)) << 6),
4416                             splt->contents + res_offset);
4417
4418               nios2_elf32_install_data (splt, nios2_plt0_entry, res_size, 7);
4419               nios2_elf32_install_imm16 (splt, res_size, hiadj (res_start));
4420               nios2_elf32_install_imm16 (splt, res_size + 4,
4421                                          res_start & 0xffff);
4422               nios2_elf32_install_imm16 (splt, res_size + 12,
4423                                          hiadj (got_address));
4424               nios2_elf32_install_imm16 (splt, res_size + 16,
4425                                          (got_address & 0xffff) + 4);
4426               nios2_elf32_install_imm16 (splt, res_size + 20,
4427                                          (got_address & 0xffff) + 8);
4428             }
4429         }
4430     }
4431   /* Fill in the first three entries in the global offset table.  */
4432   if (sgotplt->size > 0)
4433     {
4434       if (sdyn == NULL)
4435         bfd_put_32 (output_bfd, (bfd_vma) 0, sgotplt->contents);
4436       else
4437         bfd_put_32 (output_bfd,
4438                     sdyn->output_section->vma + sdyn->output_offset,
4439                     sgotplt->contents);
4440       bfd_put_32 (output_bfd, (bfd_vma) 0, sgotplt->contents + 4);
4441       bfd_put_32 (output_bfd, (bfd_vma) 0, sgotplt->contents + 8);
4442     }
4443
4444   elf_section_data (sgotplt->output_section)->this_hdr.sh_entsize = 4;
4445
4446   return TRUE;
4447 }
4448
4449 /* Implement elf_backend_adjust_dynamic_symbol:
4450    Adjust a symbol defined by a dynamic object and referenced by a
4451    regular object.  The current definition is in some section of the
4452    dynamic object, but we're not including those sections.  We have to
4453    change the definition to something the rest of the link can
4454    understand.  */
4455 static bfd_boolean
4456 nios2_elf32_adjust_dynamic_symbol (struct bfd_link_info *info,
4457                                    struct elf_link_hash_entry *h)
4458 {
4459   struct elf32_nios2_link_hash_table *htab;
4460   bfd *dynobj;
4461   asection *s;
4462   unsigned align2;
4463
4464   htab = elf32_nios2_hash_table (info);
4465   dynobj = elf_hash_table (info)->dynobj;
4466
4467   /* Make sure we know what is going on here.  */
4468   BFD_ASSERT (dynobj != NULL
4469               && (h->needs_plt
4470                   || h->u.weakdef != NULL
4471                   || (h->def_dynamic
4472                       && h->ref_regular
4473                       && !h->def_regular)));
4474
4475   /* If this is a function, put it in the procedure linkage table.  We
4476      will fill in the contents of the procedure linkage table later,
4477      when we know the address of the .got section.  */
4478   if (h->type == STT_FUNC || h->needs_plt)
4479     {
4480       if (h->plt.refcount <= 0
4481           || SYMBOL_CALLS_LOCAL (info, h)
4482           || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
4483               && h->root.type == bfd_link_hash_undefweak))
4484         {
4485           /* This case can occur if we saw a PLT reloc in an input
4486              file, but the symbol was never referred to by a dynamic
4487              object, or if all references were garbage collected.  In
4488              such a case, we don't actually need to build a procedure
4489              linkage table, and we can just do a PCREL reloc instead.  */
4490           h->plt.offset = (bfd_vma) -1;
4491           h->needs_plt = 0;
4492         }
4493
4494       return TRUE;
4495     }
4496
4497   /* Reinitialize the plt offset now that it is not used as a reference
4498      count any more.  */
4499   h->plt.offset = (bfd_vma) -1;
4500
4501   /* If this is a weak symbol, and there is a real definition, the
4502      processor independent code will have arranged for us to see the
4503      real definition first, and we can just use the same value.  */
4504   if (h->u.weakdef != NULL)
4505     {
4506       BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
4507                   || h->u.weakdef->root.type == bfd_link_hash_defweak);
4508       h->root.u.def.section = h->u.weakdef->root.u.def.section;
4509       h->root.u.def.value = h->u.weakdef->root.u.def.value;
4510       return TRUE;
4511     }
4512
4513   /* If there are no non-GOT references, we do not need a copy
4514      relocation.  */
4515   if (!h->non_got_ref)
4516     return TRUE;
4517
4518   /* This is a reference to a symbol defined by a dynamic object which
4519      is not a function.
4520      If we are creating a shared library, we must presume that the
4521      only references to the symbol are via the global offset table.
4522      For such cases we need not do anything here; the relocations will
4523      be handled correctly by relocate_section.  */
4524   if (info->shared)
4525     return TRUE;
4526
4527   if (h->size == 0)
4528     {
4529       (*_bfd_error_handler) (_("dynamic variable `%s' is zero size"),
4530                              h->root.root.string);
4531       return TRUE;
4532     }
4533
4534   /* We must allocate the symbol in our .dynbss section, which will
4535      become part of the .bss section of the executable.  There will be
4536      an entry for this symbol in the .dynsym section.  The dynamic
4537      object will contain position independent code, so all references
4538      from the dynamic object to this symbol will go through the global
4539      offset table.  The dynamic linker will use the .dynsym entry to
4540      determine the address it must put in the global offset table, so
4541      both the dynamic object and the regular object will refer to the
4542      same memory location for the variable.  */
4543   s = htab->sdynbss;
4544   BFD_ASSERT (s != NULL);
4545
4546   /* We must generate a R_NIOS2_COPY reloc to tell the dynamic linker to
4547      copy the initial value out of the dynamic object and into the
4548      runtime process image.  We need to remember the offset into the
4549      .rela.bss section we are going to use.  */
4550   if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
4551     {
4552       asection *srel;
4553
4554       srel = htab->srelbss;
4555       BFD_ASSERT (srel != NULL);
4556       srel->size += sizeof (Elf32_External_Rela);
4557       h->needs_copy = 1;
4558     }
4559
4560   align2 = bfd_log2 (h->size);
4561   if (align2 > h->root.u.def.section->alignment_power)
4562     align2 = h->root.u.def.section->alignment_power;
4563
4564   /* Align dynbss.  */
4565   s->size = BFD_ALIGN (s->size, (bfd_size_type)1 << align2);
4566   if (align2 > bfd_get_section_alignment (dynobj, s)
4567       && !bfd_set_section_alignment (dynobj, s, align2))
4568     return FALSE;
4569
4570   /* Define the symbol as being at this point in the section.  */
4571   h->root.u.def.section = s;
4572   h->root.u.def.value = s->size;
4573
4574   /* Increment the section size to make room for the symbol.  */
4575   s->size += h->size;
4576
4577   return TRUE;
4578 }
4579
4580 /* Worker function for nios2_elf32_size_dynamic_sections.  */
4581 static bfd_boolean
4582 adjust_dynrelocs (struct elf_link_hash_entry *h, PTR inf)
4583 {
4584   struct bfd_link_info *info;
4585   struct elf32_nios2_link_hash_table *htab;
4586
4587   if (h->root.type == bfd_link_hash_indirect)
4588     return TRUE;
4589
4590   if (h->root.type == bfd_link_hash_warning)
4591     /* When warning symbols are created, they **replace** the "real"
4592        entry in the hash table, thus we never get to see the real
4593        symbol in a hash traversal.  So look at it now.  */
4594     h = (struct elf_link_hash_entry *) h->root.u.i.link;
4595
4596   info = (struct bfd_link_info *) inf;
4597   htab = elf32_nios2_hash_table (info);
4598
4599   if (h->plt.offset != (bfd_vma)-1)
4600     h->plt.offset += htab->res_n_size;
4601   if (htab->root.splt == h->root.u.def.section)
4602     h->root.u.def.value += htab->res_n_size;
4603
4604   return TRUE;
4605 }
4606
4607 /* Another worker function for nios2_elf32_size_dynamic_sections.
4608    Allocate space in .plt, .got and associated reloc sections for
4609    dynamic relocs.  */
4610 static bfd_boolean
4611 allocate_dynrelocs (struct elf_link_hash_entry *h, PTR inf)
4612 {
4613   struct bfd_link_info *info;
4614   struct elf32_nios2_link_hash_table *htab;
4615   struct elf32_nios2_link_hash_entry *eh;
4616   struct elf32_nios2_dyn_relocs *p;
4617   int use_plt;
4618
4619   if (h->root.type == bfd_link_hash_indirect)
4620     return TRUE;
4621
4622   if (h->root.type == bfd_link_hash_warning)
4623     /* When warning symbols are created, they **replace** the "real"
4624        entry in the hash table, thus we never get to see the real
4625        symbol in a hash traversal.  So look at it now.  */
4626     h = (struct elf_link_hash_entry *) h->root.u.i.link;
4627
4628   info = (struct bfd_link_info *) inf;
4629   htab = elf32_nios2_hash_table (info);
4630
4631   if (htab->root.dynamic_sections_created
4632       && h->plt.refcount > 0)
4633     {
4634       /* Make sure this symbol is output as a dynamic symbol.
4635          Undefined weak syms won't yet be marked as dynamic.  */
4636       if (h->dynindx == -1
4637           && !h->forced_local
4638           && !bfd_elf_link_record_dynamic_symbol (info, h))
4639         return FALSE;
4640
4641       if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, info->shared, h))
4642         {
4643           asection *s = htab->root.splt;
4644
4645           /* Allocate room for the header.  */
4646           if (s->size == 0)
4647             {
4648               if (info->shared)
4649                 s->size = 24;
4650               else
4651                 s->size = 28;
4652             }
4653
4654           h->plt.offset = s->size;
4655
4656           /* If this symbol is not defined in a regular file, and we are
4657              not generating a shared library, then set the symbol to this
4658              location in the .plt.  This is required to make function
4659              pointers compare as equal between the normal executable and
4660              the shared library.  */
4661           if (! info->shared
4662               && !h->def_regular)
4663             {
4664               h->root.u.def.section = s;
4665               h->root.u.def.value = h->plt.offset;
4666             }
4667
4668           /* Make room for this entry.  */
4669           s->size += 12;
4670
4671           /* We also need to make an entry in the .rela.plt section.  */
4672           htab->root.srelplt->size += sizeof (Elf32_External_Rela);
4673
4674           /* And the .got.plt section.  */
4675           htab->root.sgotplt->size += 4;
4676         }
4677       else
4678         {
4679           h->plt.offset = (bfd_vma) -1;
4680           h->needs_plt = 0;
4681         }
4682     }
4683   else
4684     {
4685       h->plt.offset = (bfd_vma) -1;
4686       h->needs_plt = 0;
4687     }
4688
4689   eh = (struct elf32_nios2_link_hash_entry *) h;
4690   use_plt = (eh->got_types_used == CALL_USED
4691              && h->plt.offset != (bfd_vma) -1);
4692
4693   if (h->got.refcount > 0)
4694     {
4695       asection *s;
4696       bfd_boolean dyn;
4697       int tls_type = eh->tls_type;
4698       int indx;
4699
4700       /* Make sure this symbol is output as a dynamic symbol.
4701          Undefined weak syms won't yet be marked as dynamic.  */
4702       if (h->dynindx == -1
4703           && !h->forced_local
4704           && !bfd_elf_link_record_dynamic_symbol (info, h))
4705         return FALSE;
4706
4707       s = htab->root.sgot;
4708       h->got.offset = s->size;
4709
4710       if (tls_type == GOT_UNKNOWN)
4711         abort ();
4712
4713       if (tls_type == GOT_NORMAL)
4714         /* Non-TLS symbols need one GOT slot.  */
4715         s->size += 4;
4716       else
4717         {
4718           if (tls_type & GOT_TLS_GD)
4719             /* R_NIOS2_TLS_GD16 needs 2 consecutive GOT slots.  */
4720             s->size += 8;
4721           if (tls_type & GOT_TLS_IE)
4722             /* R_NIOS2_TLS_IE16 needs one GOT slot.  */
4723             s->size += 4;
4724         }
4725
4726       dyn = htab->root.dynamic_sections_created;
4727
4728       indx = 0;
4729       if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
4730           && (!info->shared
4731               || !SYMBOL_REFERENCES_LOCAL (info, h)))
4732         indx = h->dynindx;
4733
4734       if (tls_type != GOT_NORMAL
4735           && (info->shared || indx != 0)
4736           && (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
4737               || h->root.type != bfd_link_hash_undefweak))
4738         {
4739           if (tls_type & GOT_TLS_IE)
4740             htab->root.srelgot->size += sizeof (Elf32_External_Rela);
4741
4742           if (tls_type & GOT_TLS_GD)
4743             htab->root.srelgot->size += sizeof (Elf32_External_Rela);
4744
4745           if ((tls_type & GOT_TLS_GD) && indx != 0)
4746             htab->root.srelgot->size += sizeof (Elf32_External_Rela);
4747         }
4748       else if ((ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
4749                 || h->root.type != bfd_link_hash_undefweak)
4750                && !use_plt
4751                && (info->shared
4752                    || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h)))
4753         htab->root.srelgot->size += sizeof (Elf32_External_Rela);
4754     }
4755   else
4756     h->got.offset = (bfd_vma) -1;
4757
4758   if (eh->dyn_relocs == NULL)
4759     return TRUE;
4760
4761   /* In the shared -Bsymbolic case, discard space allocated for
4762      dynamic pc-relative relocs against symbols which turn out to be
4763      defined in regular objects.  For the normal shared case, discard
4764      space for pc-relative relocs that have become local due to symbol
4765      visibility changes.  */
4766
4767   if (info->shared)
4768     {
4769       if (h->def_regular
4770           && (h->forced_local || info->symbolic))
4771         {
4772           struct elf32_nios2_dyn_relocs **pp;
4773
4774           for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
4775             {
4776               p->count -= p->pc_count;
4777               p->pc_count = 0;
4778               if (p->count == 0)
4779                 *pp = p->next;
4780               else
4781                 pp = &p->next;
4782             }
4783         }
4784
4785       /* Also discard relocs on undefined weak syms with non-default
4786          visibility.  */
4787       if (eh->dyn_relocs != NULL
4788           && h->root.type == bfd_link_hash_undefweak)
4789         {
4790           if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
4791             eh->dyn_relocs = NULL;
4792
4793           /* Make sure undefined weak symbols are output as a dynamic
4794              symbol in PIEs.  */
4795           else if (h->dynindx == -1
4796                    && !h->forced_local
4797                    && !bfd_elf_link_record_dynamic_symbol (info, h))
4798             return FALSE;
4799         }
4800     }
4801   else
4802     {
4803       /* For the non-shared case, discard space for relocs against
4804          symbols which turn out to need copy relocs or are not
4805          dynamic.  */
4806
4807       if (!h->non_got_ref
4808           && ((h->def_dynamic && !h->def_regular)
4809               || (htab->root.dynamic_sections_created
4810                   && (h->root.type == bfd_link_hash_undefweak
4811                       || h->root.type == bfd_link_hash_undefined))))
4812         {
4813           /* Make sure this symbol is output as a dynamic symbol.
4814              Undefined weak syms won't yet be marked as dynamic.  */
4815           if (h->dynindx == -1
4816               && !h->forced_local
4817               && !bfd_elf_link_record_dynamic_symbol (info, h))
4818             return FALSE;
4819
4820           /* If that succeeded, we know we'll be keeping all the
4821              relocs.  */
4822           if (h->dynindx != -1)
4823             goto keep;
4824         }
4825
4826       eh->dyn_relocs = NULL;
4827
4828     keep: ;
4829     }
4830
4831   /* Finally, allocate space.  */
4832   for (p = eh->dyn_relocs; p != NULL; p = p->next)
4833     {
4834       asection *sreloc = elf_section_data (p->sec)->sreloc;
4835       sreloc->size += p->count * sizeof (Elf32_External_Rela);
4836     }
4837
4838   return TRUE;
4839 }
4840
4841 /* Implement elf_backend_size_dynamic_sections:
4842    Set the sizes of the dynamic sections.  */
4843 static bfd_boolean
4844 nios2_elf32_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
4845                                    struct bfd_link_info *info)
4846 {
4847   bfd *dynobj;
4848   asection *s;
4849   bfd_boolean plt;
4850   bfd_boolean got;
4851   bfd_boolean relocs;
4852   bfd *ibfd;
4853   struct elf32_nios2_link_hash_table *htab;
4854
4855   htab = elf32_nios2_hash_table (info);
4856   dynobj = elf_hash_table (info)->dynobj;
4857   BFD_ASSERT (dynobj != NULL);
4858
4859   htab->res_n_size = 0;
4860   if (elf_hash_table (info)->dynamic_sections_created)
4861     {
4862       /* Set the contents of the .interp section to the interpreter.  */
4863       if (info->executable)
4864         {
4865           s = bfd_get_linker_section (dynobj, ".interp");
4866           BFD_ASSERT (s != NULL);
4867           s->size = sizeof ELF_DYNAMIC_INTERPRETER;
4868           s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
4869         }
4870     }
4871   else
4872     {
4873       /* We may have created entries in the .rela.got section.
4874          However, if we are not creating the dynamic sections, we will
4875          not actually use these entries.  Reset the size of .rela.got,
4876          which will cause it to get stripped from the output file
4877          below.  */
4878       s = htab->root.srelgot;
4879       if (s != NULL)
4880         s->size = 0;
4881     }
4882
4883   /* Set up .got offsets for local syms, and space for local dynamic
4884      relocs.  */
4885   for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
4886     {
4887       bfd_signed_vma *local_got;
4888       bfd_signed_vma *end_local_got;
4889       char *local_tls_type;
4890       bfd_size_type locsymcount;
4891       Elf_Internal_Shdr *symtab_hdr;
4892       asection *srel;
4893
4894       if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour)
4895         continue;
4896
4897       for (s = ibfd->sections; s != NULL; s = s->next)
4898         {
4899           struct elf32_nios2_dyn_relocs *p;
4900
4901           for (p = elf_section_data (s)->local_dynrel; p != NULL; p = p->next)
4902             {
4903               if (!bfd_is_abs_section (p->sec)
4904                   && bfd_is_abs_section (p->sec->output_section))
4905                 {
4906                   /* Input section has been discarded, either because
4907                      it is a copy of a linkonce section or due to
4908                      linker script /DISCARD/, so we'll be discarding
4909                      the relocs too.  */
4910                 }
4911               else if (p->count != 0)
4912                 {
4913                   srel = elf_section_data (p->sec)->sreloc;
4914                   srel->size += p->count * sizeof (Elf32_External_Rela);
4915                   if ((p->sec->output_section->flags & SEC_READONLY) != 0)
4916                     info->flags |= DF_TEXTREL;
4917                 }
4918             }
4919         }
4920
4921       local_got = elf_local_got_refcounts (ibfd);
4922       if (!local_got)
4923         continue;
4924
4925       symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
4926       locsymcount = symtab_hdr->sh_info;
4927       end_local_got = local_got + locsymcount;
4928       local_tls_type = elf32_nios2_local_got_tls_type (ibfd);
4929       s = htab->root.sgot;
4930       srel = htab->root.srelgot;
4931       for (; local_got < end_local_got; ++local_got, ++local_tls_type)
4932         {
4933           if (*local_got > 0)
4934             {
4935               *local_got = s->size;
4936               if (*local_tls_type & GOT_TLS_GD)
4937                 /* TLS_GD relocs need an 8-byte structure in the GOT.  */
4938                 s->size += 8;
4939               if (*local_tls_type & GOT_TLS_IE)
4940                 s->size += 4;
4941               if (*local_tls_type == GOT_NORMAL)
4942                 s->size += 4;
4943
4944               if (info->shared || *local_tls_type == GOT_TLS_GD)
4945                 srel->size += sizeof (Elf32_External_Rela);
4946             }
4947           else
4948             *local_got = (bfd_vma) -1;
4949         }
4950     }
4951
4952   if (htab->tls_ldm_got.refcount > 0)
4953     {
4954       /* Allocate two GOT entries and one dynamic relocation (if necessary)
4955          for R_NIOS2_TLS_LDM16 relocations.  */
4956       htab->tls_ldm_got.offset = htab->root.sgot->size;
4957       htab->root.sgot->size += 8;
4958       if (info->shared)
4959         htab->root.srelgot->size += sizeof (Elf32_External_Rela);
4960     }
4961   else
4962     htab->tls_ldm_got.offset = -1;
4963
4964   /* Allocate global sym .plt and .got entries, and space for global
4965      sym dynamic relocs.  */
4966   elf_link_hash_traverse (& htab->root, allocate_dynrelocs, info);
4967
4968   if (elf_hash_table (info)->dynamic_sections_created)
4969     {
4970       /* If the .got section is more than 0x8000 bytes, we add
4971          0x8000 to the value of _gp_got, so that 16-bit relocations
4972          have a greater chance of working. */
4973       if (htab->root.sgot->size >= 0x8000
4974           && elf32_nios2_hash_table (info)->h_gp_got->root.u.def.value == 0)
4975         elf32_nios2_hash_table (info)->h_gp_got->root.u.def.value = 0x8000;
4976     }
4977
4978   /* The check_relocs and adjust_dynamic_symbol entry points have
4979      determined the sizes of the various dynamic sections.  Allocate
4980      memory for them.  */
4981   plt = FALSE;
4982   got = FALSE;
4983   relocs = FALSE;
4984   for (s = dynobj->sections; s != NULL; s = s->next)
4985     {
4986       const char *name;
4987
4988       if ((s->flags & SEC_LINKER_CREATED) == 0)
4989         continue;
4990
4991       /* It's OK to base decisions on the section name, because none
4992          of the dynobj section names depend upon the input files.  */
4993       name = bfd_get_section_name (dynobj, s);
4994
4995       if (strcmp (name, ".plt") == 0)
4996         {
4997           /* Remember whether there is a PLT.  */
4998           plt = s->size != 0;
4999
5000           /* Correct for the number of res_N branches.  */
5001           if (plt && !info->shared)
5002             {
5003               htab->res_n_size = (s->size-28) / 3;
5004               s->size += htab->res_n_size;
5005             }
5006         }
5007       else if (CONST_STRNEQ (name, ".rela"))
5008         {
5009           if (s->size != 0)
5010             {
5011               relocs = TRUE;
5012
5013               /* We use the reloc_count field as a counter if we need
5014                  to copy relocs into the output file.  */
5015               s->reloc_count = 0;
5016             }
5017         }
5018       else if (CONST_STRNEQ (name, ".got"))
5019         got = s->size != 0;
5020       else if (strcmp (name, ".dynbss") != 0)
5021         /* It's not one of our sections, so don't allocate space.  */
5022         continue;
5023
5024       if (s->size == 0)
5025         {
5026           /* If we don't need this section, strip it from the
5027              output file.  This is mostly to handle .rela.bss and
5028              .rela.plt.  We must create both sections in
5029              create_dynamic_sections, because they must be created
5030              before the linker maps input sections to output
5031              sections.  The linker does that before
5032              adjust_dynamic_symbol is called, and it is that
5033              function which decides whether anything needs to go
5034              into these sections.  */
5035           s->flags |= SEC_EXCLUDE;
5036           continue;
5037         }
5038
5039       if ((s->flags & SEC_HAS_CONTENTS) == 0)
5040         continue;
5041
5042       /* Allocate memory for the section contents.  */
5043       /* FIXME: This should be a call to bfd_alloc not bfd_zalloc.
5044          Unused entries should be reclaimed before the section's contents
5045          are written out, but at the moment this does not happen.  Thus in
5046          order to prevent writing out garbage, we initialize the section's
5047          contents to zero.  */
5048       s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->size);
5049       if (s->contents == NULL)
5050         return FALSE;
5051     }
5052
5053   /* Adjust dynamic symbols that point to the plt to account for the
5054      now-known number of resN slots.  */
5055   if (htab->res_n_size)
5056     elf_link_hash_traverse (& htab->root, adjust_dynrelocs, info);
5057
5058   if (elf_hash_table (info)->dynamic_sections_created)
5059     {
5060       /* Add some entries to the .dynamic section.  We fill in the
5061          values later, in elf_nios2_finish_dynamic_sections, but we
5062          must add the entries now so that we get the correct size for
5063          the .dynamic section.  The DT_DEBUG entry is filled in by the
5064          dynamic linker and used by the debugger.  */
5065 #define add_dynamic_entry(TAG, VAL) \
5066   _bfd_elf_add_dynamic_entry (info, TAG, VAL)
5067
5068       if (!info->shared && !add_dynamic_entry (DT_DEBUG, 0))
5069         return FALSE;
5070
5071       if (got && !add_dynamic_entry (DT_PLTGOT, 0))
5072         return FALSE;
5073
5074       if (plt
5075           && (!add_dynamic_entry (DT_PLTRELSZ, 0)
5076               || !add_dynamic_entry (DT_PLTREL, DT_RELA)
5077               || !add_dynamic_entry (DT_JMPREL, 0)))
5078         return FALSE;
5079
5080       if (relocs
5081           && (!add_dynamic_entry (DT_RELA, 0)
5082               || !add_dynamic_entry (DT_RELASZ, 0)
5083               || !add_dynamic_entry (DT_RELAENT, sizeof (Elf32_External_Rela))))
5084         return FALSE;
5085
5086       if (!info->shared && !add_dynamic_entry (DT_NIOS2_GP, 0))
5087         return FALSE;
5088
5089       if ((info->flags & DF_TEXTREL) != 0
5090           && !add_dynamic_entry (DT_TEXTREL, 0))
5091         return FALSE;
5092     }
5093 #undef add_dynamic_entry
5094
5095   return TRUE;
5096 }
5097
5098 /* Implement bfd_elf32_bfd_link_hash_table_create.  */
5099 static struct bfd_link_hash_table *
5100 nios2_elf32_link_hash_table_create (bfd *abfd)
5101 {
5102   struct elf32_nios2_link_hash_table *ret;
5103   bfd_size_type amt = sizeof (struct elf32_nios2_link_hash_table);
5104
5105   ret = bfd_zmalloc (amt);
5106   if (ret == NULL)
5107     return NULL;
5108
5109   if (!_bfd_elf_link_hash_table_init (&ret->root, abfd,
5110                                       link_hash_newfunc,
5111                                       sizeof (struct
5112                                               elf32_nios2_link_hash_entry),
5113                                       NIOS2_ELF_DATA))
5114     {
5115       free (ret);
5116       return NULL;
5117     }
5118
5119   /* Init the stub hash table too.  */
5120   if (!bfd_hash_table_init (&ret->bstab, stub_hash_newfunc,
5121                             sizeof (struct elf32_nios2_stub_hash_entry)))
5122     return NULL;
5123
5124   return &ret->root.root;
5125 }
5126
5127 /* Free the derived linker hash table.  */
5128 static void
5129 nios2_elf32_link_hash_table_free (struct bfd_link_hash_table *btab)
5130 {
5131   struct elf32_nios2_link_hash_table *htab
5132     = (struct elf32_nios2_link_hash_table *) btab;
5133
5134   bfd_hash_table_free (&htab->bstab);
5135   _bfd_elf_link_hash_table_free (btab);
5136 }
5137
5138 /* Implement elf_backend_reloc_type_class.  */
5139 static enum elf_reloc_type_class
5140 nios2_elf32_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED,
5141                               const asection *rel_sec ATTRIBUTE_UNUSED,
5142                               const Elf_Internal_Rela *rela)
5143 {
5144   switch ((int) ELF32_R_TYPE (rela->r_info))
5145     {
5146     case R_NIOS2_RELATIVE:
5147       return reloc_class_relative;
5148     case R_NIOS2_JUMP_SLOT:
5149       return reloc_class_plt;
5150     case R_NIOS2_COPY:
5151       return reloc_class_copy;
5152     default:
5153       return reloc_class_normal;
5154     }
5155 }
5156
5157 /* Return 1 if target is one of ours.  */
5158 static bfd_boolean
5159 is_nios2_elf_target (const struct bfd_target *targ)
5160 {
5161   return (targ == &bfd_elf32_littlenios2_vec
5162           || targ == &bfd_elf32_bignios2_vec);
5163 }
5164
5165 /* Implement elf_backend_add_symbol_hook.
5166    This hook is called by the linker when adding symbols from an object
5167    file.  We use it to put .comm items in .sbss, and not .bss.  */
5168 static bfd_boolean
5169 nios2_elf_add_symbol_hook (bfd *abfd,
5170                            struct bfd_link_info *info,
5171                            Elf_Internal_Sym *sym,
5172                            const char **namep ATTRIBUTE_UNUSED,
5173                            flagword *flagsp ATTRIBUTE_UNUSED,
5174                            asection **secp,
5175                            bfd_vma *valp)
5176 {
5177   bfd *dynobj;
5178
5179   if (sym->st_shndx == SHN_COMMON
5180       && !info->relocatable
5181       && sym->st_size <= elf_gp_size (abfd)
5182       && is_nios2_elf_target (info->output_bfd->xvec))
5183     {
5184       /* Common symbols less than or equal to -G nn bytes are automatically
5185          put into .sbss.  */
5186       struct elf32_nios2_link_hash_table *htab;
5187
5188       htab = elf32_nios2_hash_table (info);
5189       if (htab->sbss == NULL)
5190         {
5191           flagword flags = SEC_IS_COMMON | SEC_LINKER_CREATED;
5192
5193           dynobj = elf_hash_table (info)->dynobj;
5194           if (!dynobj)
5195             dynobj = abfd;
5196
5197           htab->sbss = bfd_make_section_anyway_with_flags (dynobj, ".sbss",
5198                                                            flags);
5199           if (htab->sbss == NULL)
5200             return FALSE;
5201         }
5202
5203       *secp = htab->sbss;
5204       *valp = sym->st_size;
5205     }
5206
5207   return TRUE;
5208 }
5209
5210 /* Implement elf_backend_can_make_relative_eh_frame:
5211    Decide whether to attempt to turn absptr or lsda encodings in
5212    shared libraries into pcrel within the given input section.  */
5213 static bfd_boolean
5214 nios2_elf32_can_make_relative_eh_frame (bfd *input_bfd ATTRIBUTE_UNUSED,
5215                                         struct bfd_link_info *info
5216                                         ATTRIBUTE_UNUSED,
5217                                         asection *eh_frame_section
5218                                         ATTRIBUTE_UNUSED)
5219 {
5220   /* We can't use PC-relative encodings in the .eh_frame section.  */
5221   return FALSE;
5222 }
5223
5224 /* Implement elf_backend_special_sections.  */
5225 const struct bfd_elf_special_section elf32_nios2_special_sections[] =
5226 {
5227   { STRING_COMMA_LEN (".sbss"),  -2, SHT_NOBITS,
5228     SHF_ALLOC + SHF_WRITE + SHF_NIOS2_GPREL },
5229   { STRING_COMMA_LEN (".sdata"), -2, SHT_PROGBITS,
5230     SHF_ALLOC + SHF_WRITE + SHF_NIOS2_GPREL },
5231   { NULL,                     0,  0, 0,              0 }
5232 };
5233
5234 #define ELF_ARCH                        bfd_arch_nios2
5235 #define ELF_TARGET_ID                   NIOS2_ELF_DATA
5236 #define ELF_MACHINE_CODE                EM_ALTERA_NIOS2
5237
5238 /* The Nios II MMU uses a 4K page size.  */
5239
5240 #define ELF_MAXPAGESIZE                 0x1000
5241
5242 #define bfd_elf32_bfd_link_hash_table_create \
5243                                           nios2_elf32_link_hash_table_create
5244 #define bfd_elf32_bfd_link_hash_table_free \
5245                                           nios2_elf32_link_hash_table_free
5246
5247 /* Relocation table lookup macros.  */
5248
5249 #define bfd_elf32_bfd_reloc_type_lookup   nios2_elf32_bfd_reloc_type_lookup
5250 #define bfd_elf32_bfd_reloc_name_lookup   nios2_elf32_bfd_reloc_name_lookup
5251
5252 /* JUMP_TABLE_LINK macros.  */
5253
5254 /* elf_info_to_howto (using RELA relocations).  */
5255
5256 #define elf_info_to_howto                 nios2_elf32_info_to_howto
5257
5258 /* elf backend functions.  */
5259
5260 #define elf_backend_can_gc_sections     1
5261 #define elf_backend_can_refcount        1
5262 #define elf_backend_plt_readonly        1
5263 #define elf_backend_want_got_plt        1
5264 #define elf_backend_rela_normal         1
5265
5266 #define elf_backend_relocate_section      nios2_elf32_relocate_section
5267 #define elf_backend_section_flags         nios2_elf32_section_flags
5268 #define elf_backend_fake_sections         nios2_elf32_fake_sections
5269 #define elf_backend_check_relocs          nios2_elf32_check_relocs
5270
5271 #define elf_backend_gc_mark_hook          nios2_elf32_gc_mark_hook
5272 #define elf_backend_gc_sweep_hook         nios2_elf32_gc_sweep_hook
5273 #define elf_backend_create_dynamic_sections \
5274                                           nios2_elf32_create_dynamic_sections
5275 #define elf_backend_finish_dynamic_symbol nios2_elf32_finish_dynamic_symbol
5276 #define elf_backend_finish_dynamic_sections \
5277                                           nios2_elf32_finish_dynamic_sections
5278 #define elf_backend_adjust_dynamic_symbol nios2_elf32_adjust_dynamic_symbol
5279 #define elf_backend_reloc_type_class      nios2_elf32_reloc_type_class
5280 #define elf_backend_size_dynamic_sections nios2_elf32_size_dynamic_sections
5281 #define elf_backend_add_symbol_hook       nios2_elf_add_symbol_hook
5282 #define elf_backend_copy_indirect_symbol  nios2_elf32_copy_indirect_symbol
5283
5284 #define elf_backend_grok_prstatus         nios2_grok_prstatus
5285 #define elf_backend_grok_psinfo           nios2_grok_psinfo
5286
5287 #undef elf_backend_can_make_relative_eh_frame
5288 #define elf_backend_can_make_relative_eh_frame \
5289                                           nios2_elf32_can_make_relative_eh_frame
5290
5291 #define elf_backend_special_sections      elf32_nios2_special_sections
5292
5293 #define TARGET_LITTLE_SYM               bfd_elf32_littlenios2_vec
5294 #define TARGET_LITTLE_NAME              "elf32-littlenios2"
5295 #define TARGET_BIG_SYM                  bfd_elf32_bignios2_vec
5296 #define TARGET_BIG_NAME                 "elf32-bignios2"
5297
5298 #define elf_backend_got_header_size     12
5299
5300 #include "elf32-target.h"