Remove incorrect ATTRIBUTE_UNUSED from nios2 bfd
[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
34 /* Use RELA relocations.  */
35 #ifndef USE_RELA
36 #define USE_RELA
37 #endif
38
39 #ifdef USE_REL
40 #undef USE_REL
41 #endif
42
43 /* Forward declarations.  */
44 static bfd_reloc_status_type nios2_elf32_ignore_reloc
45   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
46 static bfd_reloc_status_type nios2_elf32_hi16_relocate
47   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
48 static bfd_reloc_status_type nios2_elf32_lo16_relocate
49   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
50 static bfd_reloc_status_type nios2_elf32_hiadj16_relocate
51   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
52 static bfd_reloc_status_type nios2_elf32_pcrel_lo16_relocate
53   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
54 static bfd_reloc_status_type nios2_elf32_pcrel_hiadj16_relocate
55   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
56 static bfd_reloc_status_type nios2_elf32_pcrel16_relocate
57   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
58 static bfd_reloc_status_type nios2_elf32_call26_relocate
59   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
60 static bfd_reloc_status_type nios2_elf32_gprel_relocate
61   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
62 static bfd_reloc_status_type nios2_elf32_ujmp_relocate
63   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
64 static bfd_reloc_status_type nios2_elf32_cjmp_relocate
65   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
66 static bfd_reloc_status_type nios2_elf32_callr_relocate
67   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
68
69 /* Target vector.  */
70 extern const bfd_target bfd_elf32_littlenios2_vec;
71 extern const bfd_target bfd_elf32_bignios2_vec;
72
73 /* Offset of tp and dtp pointers from start of TLS block.  */
74 #define TP_OFFSET       0x7000
75 #define DTP_OFFSET      0x8000
76
77 /* The relocation table used for SHT_REL sections.  */
78 static reloc_howto_type elf_nios2_howto_table_rel[] = {
79   /* No relocation.  */
80   HOWTO (R_NIOS2_NONE,          /* type */
81          0,                     /* rightshift */
82          0,                     /* size (0 = byte, 1 = short, 2 = long) */
83          0,                     /* bitsize */
84          FALSE,                 /* pc_relative */
85          0,                     /* bitpos */
86          complain_overflow_dont,        /* complain_on_overflow */
87          bfd_elf_generic_reloc, /* special_function */
88          "R_NIOS2_NONE",        /* name */
89          FALSE,                 /* partial_inplace */
90          0,                     /* src_mask */
91          0,                     /* dst_mask */
92          FALSE),                /* pcrel_offset */
93
94   /* 16-bit signed immediate relocation.  */
95   HOWTO (R_NIOS2_S16,           /* type */
96          0,                     /* rightshift */
97          2,                     /* size (0 = byte, 1 = short, 2 = long) */
98          16,                    /* bitsize */
99          FALSE,                 /* pc_relative */
100          6,                     /* bitpos */
101          complain_overflow_signed,      /* complain on overflow */
102          bfd_elf_generic_reloc, /* special function */
103          "R_NIOS2_S16",         /* name */
104          FALSE,                 /* partial_inplace */
105          0x003fffc0,            /* src_mask */
106          0x003fffc0,            /* dest_mask */
107          FALSE),                /* pcrel_offset */
108
109   /* 16-bit unsigned immediate relocation.  */
110   HOWTO (R_NIOS2_U16,           /* type */
111          0,                     /* rightshift */
112          2,                     /* size (0 = byte, 1 = short, 2 = long) */
113          16,                    /* bitsize */
114          FALSE,                 /* pc_relative */
115          6,                     /* bitpos */
116          complain_overflow_unsigned,    /* complain on overflow */
117          bfd_elf_generic_reloc, /* special function */
118          "R_NIOS2_U16",         /* name */
119          FALSE,                 /* partial_inplace */
120          0x003fffc0,            /* src_mask */
121          0x003fffc0,            /* dest_mask */
122          FALSE),                /* pcrel_offset */
123
124   HOWTO (R_NIOS2_PCREL16,       /* type */
125          0,                     /* rightshift */
126          2,                     /* size (0 = byte, 1 = short, 2 = long) */
127          16,                    /* bitsize */
128          TRUE,                  /* pc_relative */
129          6,                     /* bitpos */
130          complain_overflow_signed,      /* complain on overflow */
131          nios2_elf32_pcrel16_relocate,  /* special function */
132          "R_NIOS2_PCREL16",     /* name */
133          FALSE,                 /* partial_inplace */
134          0x003fffc0,            /* src_mask */
135          0x003fffc0,            /* dest_mask */
136          TRUE),                 /* pcrel_offset */
137
138   HOWTO (R_NIOS2_CALL26,        /* type */
139          2,                     /* rightshift */
140          2,                     /* size (0 = byte, 1 = short, 2 = long) */
141          26,                    /* bitsize */
142          FALSE,                 /* pc_relative */
143          6,                     /* bitpos */
144          complain_overflow_dont,        /* complain on overflow */
145          nios2_elf32_call26_relocate,   /* special function */
146          "R_NIOS2_CALL26",      /* name */
147          FALSE,                 /* partial_inplace */
148          0xffffffc0,            /* src_mask */
149          0xffffffc0,            /* dst_mask */
150          FALSE),                /* pcrel_offset */
151
152   HOWTO (R_NIOS2_IMM5,
153          0,
154          2,
155          5,
156          FALSE,
157          6,
158          complain_overflow_bitfield,
159          bfd_elf_generic_reloc,
160          "R_NIOS2_IMM5",
161          FALSE,
162          0x000007c0,
163          0x000007c0,
164          FALSE),
165
166   HOWTO (R_NIOS2_CACHE_OPX,
167          0,
168          2,
169          5,
170          FALSE,
171          22,
172          complain_overflow_bitfield,
173          bfd_elf_generic_reloc,
174          "R_NIOS2_CACHE_OPX",
175          FALSE,
176          0x07c00000,
177          0x07c00000,
178          FALSE),
179
180   HOWTO (R_NIOS2_IMM6,
181          0,
182          2,
183          6,
184          FALSE,
185          6,
186          complain_overflow_bitfield,
187          bfd_elf_generic_reloc,
188          "R_NIOS2_IMM6",
189          FALSE,
190          0x00000fc0,
191          0x00000fc0,
192          FALSE),
193
194   HOWTO (R_NIOS2_IMM8,
195          0,
196          2,
197          8,
198          FALSE,
199          6,
200          complain_overflow_bitfield,
201          bfd_elf_generic_reloc,
202          "R_NIOS2_IMM8",
203          FALSE,
204          0x00003fc0,
205          0x00003fc0,
206          FALSE),
207
208   HOWTO (R_NIOS2_HI16,
209          0,
210          2,
211          32,
212          FALSE,
213          6,
214          complain_overflow_dont,
215          nios2_elf32_hi16_relocate,
216          "R_NIOS2_HI16",
217          FALSE,
218          0x003fffc0,
219          0x003fffc0,
220          FALSE),
221
222   HOWTO (R_NIOS2_LO16,
223          0,
224          2,
225          32,
226          FALSE,
227          6,
228          complain_overflow_dont,
229          nios2_elf32_lo16_relocate,
230          "R_NIOS2_LO16",
231          FALSE,
232          0x003fffc0,
233          0x003fffc0,
234          FALSE),
235
236   HOWTO (R_NIOS2_HIADJ16,
237          0,
238          2,
239          32,
240          FALSE,
241          6,
242          complain_overflow_dont,
243          nios2_elf32_hiadj16_relocate,
244          "R_NIOS2_HIADJ16",
245          FALSE,
246          0x003fffc0,
247          0x003fffc0,
248          FALSE),
249
250   HOWTO (R_NIOS2_BFD_RELOC_32,
251          0,
252          2,                     /* long */
253          32,
254          FALSE,
255          0,
256          complain_overflow_dont,
257          bfd_elf_generic_reloc,
258          "R_NIOS2_BFD_RELOC32",
259          FALSE,
260          0xffffffff,
261          0xffffffff,
262          FALSE),
263
264   HOWTO (R_NIOS2_BFD_RELOC_16,
265          0,
266          1,                     /* short */
267          16,
268          FALSE,
269          0,
270          complain_overflow_bitfield,
271          bfd_elf_generic_reloc,
272          "R_NIOS2_BFD_RELOC16",
273          FALSE,
274          0x0000ffff,
275          0x0000ffff,
276          FALSE),
277
278   HOWTO (R_NIOS2_BFD_RELOC_8,
279          0,
280          0,                     /* byte */
281          8,
282          FALSE,
283          0,
284          complain_overflow_bitfield,
285          bfd_elf_generic_reloc,
286          "R_NIOS2_BFD_RELOC8",
287          FALSE,
288          0x000000ff,
289          0x000000ff,
290          FALSE),
291
292   HOWTO (R_NIOS2_GPREL,
293          0,
294          2,
295          32,
296          FALSE,
297          6,
298          complain_overflow_dont,
299          nios2_elf32_gprel_relocate,
300          "R_NIOS2_GPREL",
301          FALSE,
302          0x003fffc0,
303          0x003fffc0,
304          FALSE),
305
306   HOWTO (R_NIOS2_GNU_VTINHERIT,
307          0,
308          2,                     /* short */
309          0,
310          FALSE,
311          0,
312          complain_overflow_dont,
313          NULL,
314          "R_NIOS2_GNU_VTINHERIT",
315          FALSE,
316          0,
317          0,
318          FALSE),
319
320   HOWTO (R_NIOS2_GNU_VTENTRY,
321          0,
322          2,                     /* byte */
323          0,
324          FALSE,
325          0,
326          complain_overflow_dont,
327          _bfd_elf_rel_vtable_reloc_fn,
328          "R_NIOS2_GNU_VTENTRY",
329          FALSE,
330          0,
331          0,
332          FALSE),
333
334   HOWTO (R_NIOS2_UJMP,
335          0,
336          2,
337          32,
338          FALSE,
339          6,
340          complain_overflow_dont,
341          nios2_elf32_ujmp_relocate,
342          "R_NIOS2_UJMP",
343          FALSE,
344          0x003fffc0,
345          0x003fffc0,
346          FALSE),
347
348   HOWTO (R_NIOS2_CJMP,
349          0,
350          2,
351          32,
352          FALSE,
353          6,
354          complain_overflow_dont,
355          nios2_elf32_cjmp_relocate,
356          "R_NIOS2_CJMP",
357          FALSE,
358          0x003fffc0,
359          0x003fffc0,
360          FALSE),
361
362   HOWTO (R_NIOS2_CALLR,
363          0,
364          2,
365          32,
366          FALSE,
367          6,
368          complain_overflow_dont,
369          nios2_elf32_callr_relocate,
370          "R_NIOS2_CALLR",
371          FALSE,
372          0x003fffc0,
373          0x003fffc0,
374          FALSE),
375
376   HOWTO (R_NIOS2_ALIGN,
377          0,
378          2,
379          0,
380          FALSE,
381          0,
382          complain_overflow_dont,
383          nios2_elf32_ignore_reloc,
384          "R_NIOS2_ALIGN",
385          FALSE,
386          0,
387          0,
388          TRUE),
389
390
391   HOWTO (R_NIOS2_GOT16,
392          0,
393          2,
394          16,
395          FALSE,
396          6,
397          complain_overflow_bitfield,
398          bfd_elf_generic_reloc,
399          "R_NIOS2_GOT16",
400          FALSE,
401          0x003fffc0,
402          0x003fffc0,
403          FALSE),
404
405   HOWTO (R_NIOS2_CALL16,
406          0,
407          2,
408          16,
409          FALSE,
410          6,
411          complain_overflow_bitfield,
412          bfd_elf_generic_reloc,
413          "R_NIOS2_CALL16",
414          FALSE,
415          0x003fffc0,
416          0x003fffc0,
417          FALSE),
418
419   HOWTO (R_NIOS2_GOTOFF_LO,
420          0,
421          2,
422          16,
423          FALSE,
424          6,
425          complain_overflow_dont,
426          bfd_elf_generic_reloc,
427          "R_NIOS2_GOTOFF_LO",
428          FALSE,
429          0x003fffc0,
430          0x003fffc0,
431          FALSE),
432
433   HOWTO (R_NIOS2_GOTOFF_HA,
434          0,
435          2,
436          16,
437          FALSE,
438          6,
439          complain_overflow_dont,
440          bfd_elf_generic_reloc,
441          "R_NIOS2_GOTOFF_HA",
442          FALSE,
443          0x003fffc0,
444          0x003fffc0,
445          FALSE),
446
447   HOWTO (R_NIOS2_PCREL_LO,
448          0,
449          2,
450          16,
451          TRUE,
452          6,
453          complain_overflow_dont,
454          nios2_elf32_pcrel_lo16_relocate,
455          "R_NIOS2_PCREL_LO",
456          FALSE,
457          0x003fffc0,
458          0x003fffc0,
459          TRUE),
460
461   HOWTO (R_NIOS2_PCREL_HA,
462          0,
463          2,
464          16,
465          FALSE, /* This is a PC-relative relocation, but we need to subtract
466                    PC ourselves before the HIADJ.  */
467          6,
468          complain_overflow_dont,
469          nios2_elf32_pcrel_hiadj16_relocate,
470          "R_NIOS2_PCREL_HA",
471          FALSE,
472          0x003fffc0,
473          0x003fffc0,
474          TRUE),
475
476   HOWTO (R_NIOS2_TLS_GD16,
477          0,
478          2,
479          16,
480          FALSE,
481          6,
482          complain_overflow_bitfield,
483          bfd_elf_generic_reloc,
484          "R_NIOS2_TLS_GD16",
485          FALSE,
486          0x003fffc0,
487          0x003fffc0,
488          FALSE),
489
490   HOWTO (R_NIOS2_TLS_LDM16,
491          0,
492          2,
493          16,
494          FALSE,
495          6,
496          complain_overflow_bitfield,
497          bfd_elf_generic_reloc,
498          "R_NIOS2_TLS_LDM16",
499          FALSE,
500          0x003fffc0,
501          0x003fffc0,
502          FALSE),
503
504   HOWTO (R_NIOS2_TLS_LDO16,
505          0,
506          2,
507          16,
508          FALSE,
509          6,
510          complain_overflow_bitfield,
511          bfd_elf_generic_reloc,
512          "R_NIOS2_TLS_LDO16",
513          FALSE,
514          0x003fffc0,
515          0x003fffc0,
516          FALSE),
517
518   HOWTO (R_NIOS2_TLS_IE16,
519          0,
520          2,
521          16,
522          FALSE,
523          6,
524          complain_overflow_bitfield,
525          bfd_elf_generic_reloc,
526          "R_NIOS2_TLS_IE16",
527          FALSE,
528          0x003fffc0,
529          0x003fffc0,
530          FALSE),
531
532   HOWTO (R_NIOS2_TLS_LE16,
533          0,
534          2,
535          16,
536          FALSE,
537          6,
538          complain_overflow_bitfield,
539          bfd_elf_generic_reloc,
540          "R_NIOS2_TLS_LE16",
541          FALSE,
542          0x003fffc0,
543          0x003fffc0,
544          FALSE),
545
546   HOWTO (R_NIOS2_TLS_DTPMOD,
547          0,
548          2,
549          32,
550          FALSE,
551          0,
552          complain_overflow_dont,
553          bfd_elf_generic_reloc,
554          "R_NIOS2_TLS_DTPMOD",
555          FALSE,
556          0xffffffff,
557          0xffffffff,
558          FALSE),
559
560   HOWTO (R_NIOS2_TLS_DTPREL,
561          0,
562          2,
563          32,
564          FALSE,
565          0,
566          complain_overflow_dont,
567          bfd_elf_generic_reloc,
568          "R_NIOS2_TLS_DTPREL",
569          FALSE,
570          0xffffffff,
571          0xffffffff,
572          FALSE),
573
574   HOWTO (R_NIOS2_TLS_TPREL,
575          0,
576          2,
577          32,
578          FALSE,
579          0,
580          complain_overflow_dont,
581          bfd_elf_generic_reloc,
582          "R_NIOS2_TLS_TPREL",
583          FALSE,
584          0xffffffff,
585          0xffffffff,
586          FALSE),
587
588   HOWTO (R_NIOS2_COPY,
589          0,
590          2,
591          32,
592          FALSE,
593          0,
594          complain_overflow_dont,
595          bfd_elf_generic_reloc,
596          "R_NIOS2_COPY",
597          FALSE,
598          0,
599          0,
600          FALSE),
601
602   HOWTO (R_NIOS2_GLOB_DAT,
603          0,
604          2,
605          32,
606          FALSE,
607          0,
608          complain_overflow_dont,
609          bfd_elf_generic_reloc,
610          "R_NIOS2_GLOB_DAT",
611          FALSE,
612          0xffffffff,
613          0xffffffff,
614          FALSE),
615
616   HOWTO (R_NIOS2_JUMP_SLOT,
617          0,
618          2,
619          32,
620          FALSE,
621          0,
622          complain_overflow_dont,
623          bfd_elf_generic_reloc,
624          "R_NIOS2_JUMP_SLOT",
625          FALSE,
626          0xffffffff,
627          0xffffffff,
628          FALSE),
629
630   HOWTO (R_NIOS2_RELATIVE,
631          0,
632          2,
633          32,
634          FALSE,
635          0,
636          complain_overflow_dont,
637          bfd_elf_generic_reloc,
638          "R_NIOS2_RELATIVE",
639          FALSE,
640          0xffffffff,
641          0xffffffff,
642          FALSE),
643
644   HOWTO (R_NIOS2_GOTOFF,
645          0,
646          2,
647          32,
648          FALSE,
649          0,
650          complain_overflow_dont,
651          bfd_elf_generic_reloc,
652          "R_NIOS2_GOTOFF",
653          FALSE,
654          0xffffffff,
655          0xffffffff,
656          FALSE),
657
658 /* Add other relocations here.  */
659 };
660
661 static unsigned char elf_code_to_howto_index[R_NIOS2_ILLEGAL + 1];
662
663 /* Return the howto for relocation RTYPE.  */
664 static reloc_howto_type *
665 lookup_howto (unsigned int rtype)
666 {
667   static int initialized = 0;
668   int i;
669   int howto_tbl_size = (int) (sizeof (elf_nios2_howto_table_rel)
670                               / sizeof (elf_nios2_howto_table_rel[0]));
671
672   if (!initialized)
673     {
674       initialized = 1;
675       memset (elf_code_to_howto_index, 0xff,
676               sizeof (elf_code_to_howto_index));
677       for (i = 0; i < howto_tbl_size; i++)
678         elf_code_to_howto_index[elf_nios2_howto_table_rel[i].type] = i;
679     }
680
681   BFD_ASSERT (rtype <= R_NIOS2_ILLEGAL);
682   i = elf_code_to_howto_index[rtype];
683   if (i >= howto_tbl_size)
684     return 0;
685   return elf_nios2_howto_table_rel + i;
686 }
687
688 /* Map for converting BFD reloc types to Nios II reloc types.  */
689 struct elf_reloc_map
690 {
691   bfd_reloc_code_real_type bfd_val;
692   enum elf_nios2_reloc_type elf_val;
693 };
694
695 static const struct elf_reloc_map nios2_reloc_map[] = {
696   {BFD_RELOC_NIOS2_S16, R_NIOS2_S16},
697   {BFD_RELOC_NIOS2_U16, R_NIOS2_U16},
698   {BFD_RELOC_16_PCREL, R_NIOS2_PCREL16},
699   {BFD_RELOC_NIOS2_CALL26, R_NIOS2_CALL26},
700   {BFD_RELOC_NIOS2_IMM5, R_NIOS2_IMM5},
701   {BFD_RELOC_NIOS2_CACHE_OPX, R_NIOS2_CACHE_OPX},
702   {BFD_RELOC_NIOS2_IMM6, R_NIOS2_IMM6},
703   {BFD_RELOC_NIOS2_IMM8, R_NIOS2_IMM8},
704   {BFD_RELOC_NIOS2_HI16, R_NIOS2_HI16},
705   {BFD_RELOC_NIOS2_LO16, R_NIOS2_LO16},
706   {BFD_RELOC_NIOS2_HIADJ16, R_NIOS2_HIADJ16},
707   {BFD_RELOC_32, R_NIOS2_BFD_RELOC_32},
708   {BFD_RELOC_16, R_NIOS2_BFD_RELOC_16},
709   {BFD_RELOC_8, R_NIOS2_BFD_RELOC_8},
710   {BFD_RELOC_NIOS2_GPREL, R_NIOS2_GPREL},
711   {BFD_RELOC_VTABLE_INHERIT, R_NIOS2_GNU_VTINHERIT},
712   {BFD_RELOC_VTABLE_ENTRY, R_NIOS2_GNU_VTENTRY},
713   {BFD_RELOC_NIOS2_UJMP, R_NIOS2_UJMP},
714   {BFD_RELOC_NIOS2_CJMP, R_NIOS2_CJMP},
715   {BFD_RELOC_NIOS2_CALLR, R_NIOS2_CALLR},
716   {BFD_RELOC_NIOS2_ALIGN, R_NIOS2_ALIGN},
717   {BFD_RELOC_NIOS2_GOT16, R_NIOS2_GOT16},
718   {BFD_RELOC_NIOS2_CALL16, R_NIOS2_CALL16},
719   {BFD_RELOC_NIOS2_GOTOFF_LO, R_NIOS2_GOTOFF_LO},
720   {BFD_RELOC_NIOS2_GOTOFF_HA, R_NIOS2_GOTOFF_HA},
721   {BFD_RELOC_NIOS2_PCREL_LO, R_NIOS2_PCREL_LO},
722   {BFD_RELOC_NIOS2_PCREL_HA, R_NIOS2_PCREL_HA},
723   {BFD_RELOC_NIOS2_TLS_GD16, R_NIOS2_TLS_GD16},
724   {BFD_RELOC_NIOS2_TLS_LDM16, R_NIOS2_TLS_LDM16},
725   {BFD_RELOC_NIOS2_TLS_LDO16, R_NIOS2_TLS_LDO16},
726   {BFD_RELOC_NIOS2_TLS_IE16, R_NIOS2_TLS_IE16},
727   {BFD_RELOC_NIOS2_TLS_LE16, R_NIOS2_TLS_LE16},
728   {BFD_RELOC_NIOS2_TLS_DTPMOD, R_NIOS2_TLS_DTPMOD},
729   {BFD_RELOC_NIOS2_TLS_DTPREL, R_NIOS2_TLS_DTPREL},
730   {BFD_RELOC_NIOS2_TLS_TPREL, R_NIOS2_TLS_TPREL},
731   {BFD_RELOC_NIOS2_COPY, R_NIOS2_COPY},
732   {BFD_RELOC_NIOS2_GLOB_DAT, R_NIOS2_GLOB_DAT},
733   {BFD_RELOC_NIOS2_JUMP_SLOT, R_NIOS2_JUMP_SLOT},
734   {BFD_RELOC_NIOS2_RELATIVE, R_NIOS2_RELATIVE},
735   {BFD_RELOC_NIOS2_GOTOFF, R_NIOS2_GOTOFF}
736 };
737
738 /* The Nios II linker needs to keep track of the number of relocs that it
739    decides to copy as dynamic relocs in check_relocs for each symbol.
740    This is so that it can later discard them if they are found to be
741    unnecessary.  We store the information in a field extending the
742    regular ELF linker hash table.  */
743
744 struct elf32_nios2_dyn_relocs
745 {
746   struct elf32_nios2_dyn_relocs *next;
747
748   /* The input section of the reloc.  */
749   asection *sec;
750
751   /* Total number of relocs copied for the input section.  */
752   bfd_size_type count;
753
754   /* Number of pc-relative relocs copied for the input section.  */
755   bfd_size_type pc_count;
756 };
757
758 /* Nios II ELF linker hash entry.  */
759
760 struct elf32_nios2_link_hash_entry
761 {
762   struct elf_link_hash_entry root;
763
764   /* Track dynamic relocs copied for this symbol.  */
765   struct elf32_nios2_dyn_relocs *dyn_relocs;
766
767 #define GOT_UNKNOWN     0
768 #define GOT_NORMAL      1
769 #define GOT_TLS_GD      2
770 #define GOT_TLS_IE      4
771   unsigned char tls_type;
772
773   /* We need to detect and take special action for symbols which are only
774      referenced with %call() and not with %got().  Such symbols do not need
775      a dynamic GOT reloc in shared objects, only a dynamic PLT reloc.  Lazy
776      linking will not work if the dynamic GOT reloc exists.
777      To check for this condition efficiently, we compare got_types_used against
778      CALL16_USED, meaning
779      (got_types_used & (GOT16_USED | CALL16_USED)) == CALL16_USED.  */
780 #define GOT16_USED      1
781 #define CALL16_USED     2
782   unsigned char got_types_used;
783 };
784
785 #define elf32_nios2_hash_entry(ent) \
786   ((struct elf32_nios2_link_hash_entry *) (ent))
787
788 /* Get the Nios II elf linker hash table from a link_info structure.  */
789 #define elf32_nios2_hash_table(info) \
790   ((struct elf32_nios2_link_hash_table *) ((info)->hash))
791
792 /* Nios II ELF linker hash table.  */
793 struct elf32_nios2_link_hash_table
794   {
795     /* The main hash table.  */
796     struct elf_link_hash_table root;
797
798     /* Short-cuts to get to dynamic linker sections.  */
799     asection *sdynbss;
800     asection *srelbss;
801     asection *sbss;
802
803     union {
804       bfd_signed_vma refcount;
805       bfd_vma offset;
806     } tls_ldm_got;
807
808     /* Small local sym cache.  */
809     struct sym_cache sym_cache;
810
811     bfd_vma res_n_size;
812   };
813
814 struct nios2_elf32_obj_tdata
815 {
816   struct elf_obj_tdata root;
817
818   /* tls_type for each local got entry.  */
819   char *local_got_tls_type;
820
821   /* TRUE if TLS GD relocs have been seen for this object.  */
822   bfd_boolean has_tlsgd;
823 };
824
825 #define elf32_nios2_tdata(abfd) \
826   ((struct nios2_elf32_obj_tdata *) (abfd)->tdata.any)
827
828 #define elf32_nios2_local_got_tls_type(abfd) \
829   (elf32_nios2_tdata (abfd)->local_got_tls_type)
830
831 /* The name of the dynamic interpreter.  This is put in the .interp
832    section.  */
833 #define ELF_DYNAMIC_INTERPRETER "/lib/ld.so.1"
834
835 /* PLT implementation for position-dependent code.  */
836 static const bfd_vma nios2_plt_entry[] = { /* .PLTn: */
837   0x03c00034,   /* movhi r15, %hiadj(plt_got_slot_address) */
838   0x7bc00017,   /* ldw r15, %lo(plt_got_slot_address)(r15) */
839   0x7800683a    /* jmp r15 */
840 };
841
842 static const bfd_vma nios2_plt0_entry[] = { /* .PLTresolve */
843   0x03800034,   /* movhi r14, %hiadj(res_0) */
844   0x73800004,   /* addi r14, r14, %lo(res_0) */
845   0x7b9fc83a,   /* sub r15, r15, r14 */
846   0x03400034,   /* movhi r13, %hiadj(_GLOBAL_OFFSET_TABLE_) */
847   0x6b800017,   /* ldw r14, %lo(_GLOBAL_OFFSET_TABLE_+4)(r13) */
848   0x6b400017,   /* ldw r13, %lo(_GLOBAL_OFFSET_TABLE_+8)(r13) */
849   0x6800683a    /* jmp r13 */
850 };
851
852 /* PLT implementation for position-independent code.  */
853 static const bfd_vma nios2_so_plt_entry[] = { /* .PLTn */
854   0x03c00034,   /* movhi r15, %hiadj(index * 4) */
855   0x7bc00004,   /* addi r15, r15, %lo(index * 4) */
856   0x00000006    /* br .PLTresolve */
857 };
858
859 static const bfd_vma nios2_so_plt0_entry[] = { /* .PLTresolve */
860   0x001ce03a,   /* nextpc r14 */
861   0x03400034,   /* movhi r13, %hiadj(_GLOBAL_OFFSET_TABLE_) */
862   0x6b9b883a,   /* add r13, r13, r14 */
863   0x6b800017,   /* ldw r14, %lo(_GLOBAL_OFFSET_TABLE_+4)(r13) */
864   0x6b400017,   /* ldw r13, %lo(_GLOBAL_OFFSET_TABLE_+8)(r13) */
865   0x6800683a    /* jmp r13 */
866 };
867
868 /* Implement elf_backend_grok_prstatus:
869    Support for core dump NOTE sections.  */
870 static bfd_boolean
871 nios2_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
872 {
873   int offset;
874   size_t size;
875
876   switch (note->descsz)
877     {
878     default:
879       return FALSE;
880
881     case 212:         /* Linux/Nios II */
882       /* pr_cursig */
883       elf_tdata (abfd)->core->signal = bfd_get_16 (abfd, note->descdata + 12);
884
885       /* pr_pid */
886       elf_tdata (abfd)->core->pid = bfd_get_32 (abfd, note->descdata + 24);
887
888       /* pr_reg */
889       offset = 72;
890       size = 136;
891
892       break;
893     }
894
895   /* Make a ".reg/999" section.  */
896   return _bfd_elfcore_make_pseudosection (abfd, ".reg",
897                                           size, note->descpos + offset);
898 }
899
900 /* Implement elf_backend_grok_psinfo.  */
901 static bfd_boolean
902 nios2_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
903 {
904   switch (note->descsz)
905     {
906     default:
907       return FALSE;
908
909     case 124:         /* Linux/Nios II elf_prpsinfo */
910       elf_tdata (abfd)->core->program
911         = _bfd_elfcore_strndup (abfd, note->descdata + 28, 16);
912       elf_tdata (abfd)->core->command
913         = _bfd_elfcore_strndup (abfd, note->descdata + 44, 80);
914     }
915
916   /* Note that for some reason, a spurious space is tacked
917      onto the end of the args in some (at least one anyway)
918      implementations, so strip it off if it exists.  */
919
920   {
921     char *command = elf_tdata (abfd)->core->command;
922     int n = strlen (command);
923
924     if (0 < n && command[n - 1] == ' ')
925       command[n - 1] = '\0';
926   }
927
928   return TRUE;
929 }
930
931 /* Create an entry in a Nios II ELF linker hash table.  */
932 static struct bfd_hash_entry *
933 link_hash_newfunc (struct bfd_hash_entry *entry,
934                    struct bfd_hash_table *table, const char *string)
935 {
936   /* Allocate the structure if it has not already been allocated by a
937      subclass.  */
938   if (entry == NULL)
939     {
940       entry = bfd_hash_allocate (table,
941                                  sizeof (struct elf32_nios2_link_hash_entry));
942       if (entry == NULL)
943         return entry;
944     }
945
946   /* Call the allocation method of the superclass.  */
947   entry = _bfd_elf_link_hash_newfunc (entry, table, string);
948   if (entry)
949     {
950       struct elf32_nios2_link_hash_entry *eh;
951
952       eh = (struct elf32_nios2_link_hash_entry *) entry;
953       eh->dyn_relocs = NULL;
954       eh->tls_type = GOT_UNKNOWN;
955       eh->got_types_used = 0;
956     }
957
958   return entry;
959 }
960
961 /* Implement bfd_elf32_bfd_reloc_type_lookup:
962    Given a BFD reloc type, return a howto structure.  */
963 static reloc_howto_type *
964 nios2_elf32_bfd_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
965                                    bfd_reloc_code_real_type code)
966 {
967   int i;
968   for (i = 0;
969        i < (int) (sizeof (nios2_reloc_map) / sizeof (struct elf_reloc_map));
970        ++i)
971     if (nios2_reloc_map[i].bfd_val == code)
972       return &elf_nios2_howto_table_rel[(int) nios2_reloc_map[i].elf_val];
973   return NULL;
974 }
975
976 /* Implement bfd_elf32_bfd_reloc_name_lookup:
977    Given a reloc name, return a howto structure.  */
978 static reloc_howto_type *
979 nios2_elf32_bfd_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
980                                    const char *r_name)
981 {
982   unsigned int i;
983   for (i = 0;
984        i < (sizeof (elf_nios2_howto_table_rel)
985             / sizeof (elf_nios2_howto_table_rel[0]));
986        i++)
987     if (elf_nios2_howto_table_rel[i].name
988         && strcasecmp (elf_nios2_howto_table_rel[i].name, r_name) == 0)
989       return &elf_nios2_howto_table_rel[i];
990
991   return NULL;  
992 }
993
994 /* Implement elf_info_to_howto:
995    Given a ELF32 relocation, fill in a arelent structure.  */
996 static void
997 nios2_elf32_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED, arelent *cache_ptr,
998                            Elf_Internal_Rela *dst)
999 {
1000   unsigned int r_type;
1001
1002   r_type = ELF32_R_TYPE (dst->r_info);
1003   BFD_ASSERT (r_type < R_NIOS2_ILLEGAL);
1004   cache_ptr->howto = &elf_nios2_howto_table_rel[r_type];
1005 }
1006
1007 /* Return the base VMA address which should be subtracted from real addresses
1008    when resolving @dtpoff relocation.
1009    This is PT_TLS segment p_vaddr.  */
1010 static bfd_vma
1011 dtpoff_base (struct bfd_link_info *info)
1012 {
1013   /* If tls_sec is NULL, we should have signalled an error already.  */
1014   if (elf_hash_table (info)->tls_sec == NULL)
1015     return 0;
1016   return elf_hash_table (info)->tls_sec->vma;
1017 }
1018
1019 /* Return the relocation value for @tpoff relocation
1020    if STT_TLS virtual address is ADDRESS.  */
1021 static bfd_vma
1022 tpoff (struct bfd_link_info *info, bfd_vma address)
1023 {
1024   struct elf_link_hash_table *htab = elf_hash_table (info);
1025
1026   /* If tls_sec is NULL, we should have signalled an error already.  */
1027   if (htab->tls_sec == NULL)
1028     return 0;
1029   return address - htab->tls_sec->vma;
1030 }
1031
1032 /* Set the GP value for OUTPUT_BFD.  Returns FALSE if this is a
1033    dangerous relocation.  */
1034 static bfd_boolean
1035 nios2_elf_assign_gp (bfd *output_bfd, bfd_vma *pgp, struct bfd_link_info *info)
1036 {
1037
1038   bfd_boolean gp_found;
1039   struct bfd_hash_entry *h;
1040   struct bfd_link_hash_entry *lh;
1041
1042   /* If we've already figured out what GP will be, just return it. */
1043   *pgp = _bfd_get_gp_value (output_bfd);
1044   if (*pgp)
1045     return TRUE;
1046
1047   h = bfd_hash_lookup (&info->hash->table, "_gp", FALSE, FALSE);
1048   lh = (struct bfd_link_hash_entry *) h;
1049 lookup:
1050   if (lh)
1051     {
1052       switch (lh->type)
1053         {
1054         case bfd_link_hash_undefined:
1055         case bfd_link_hash_undefweak:
1056         case bfd_link_hash_common:
1057           gp_found = FALSE;
1058           break;
1059         case bfd_link_hash_defined:
1060         case bfd_link_hash_defweak:
1061           gp_found = TRUE;
1062           *pgp = lh->u.def.value;
1063           break;
1064         case bfd_link_hash_indirect:
1065         case bfd_link_hash_warning:
1066           lh = lh->u.i.link;
1067           /* @@FIXME  ignoring warning for now */
1068           goto lookup;
1069         case bfd_link_hash_new:
1070         default:
1071           abort ();
1072         }
1073     }
1074   else
1075     gp_found = FALSE;
1076
1077   if (!gp_found)
1078     {
1079       /* Only get the error once. */
1080       *pgp = 4;
1081       _bfd_set_gp_value (output_bfd, *pgp);
1082       return FALSE;
1083     }
1084
1085   _bfd_set_gp_value (output_bfd, *pgp);
1086
1087   return TRUE;
1088 }
1089
1090 /* Retrieve the previously cached _gp pointer, returning bfd_reloc_dangerous
1091    if it's not available as we don't have a link_info pointer available here
1092    to look it up in the output symbol table.  We don't need to adjust the
1093    symbol value for an external symbol if we are producing relocatable
1094    output.  */
1095 static bfd_reloc_status_type
1096 nios2_elf_final_gp (bfd *output_bfd, asymbol *symbol, bfd_boolean relocatable, 
1097                     char **error_message, bfd_vma *pgp)
1098 {
1099   if (bfd_is_und_section (symbol->section) && !relocatable)
1100     {
1101       *pgp = 0;
1102       return bfd_reloc_undefined;
1103     }
1104
1105   *pgp = _bfd_get_gp_value (output_bfd);
1106   if (*pgp == 0 && (!relocatable || (symbol->flags & BSF_SECTION_SYM) != 0))
1107     {
1108       if (relocatable)
1109         {
1110           /* Make up a value.  */
1111           *pgp = symbol->section->output_section->vma + 0x4000;
1112           _bfd_set_gp_value (output_bfd, *pgp);
1113         }
1114       else
1115         {
1116           *error_message
1117             = (char *) _("global pointer relative relocation when _gp not defined");
1118           return bfd_reloc_dangerous;
1119         }
1120     }
1121
1122   return bfd_reloc_ok;
1123 }
1124
1125 /* The usual way of loading a 32-bit constant into a Nios II register is to
1126    load the high 16 bits in one instruction and then add the low 16 bits with
1127    a signed add. This means that the high halfword needs to be adjusted to
1128    compensate for the sign bit of the low halfword. This function returns the
1129    adjusted high halfword for a given 32-bit constant.  */
1130 static
1131 bfd_vma hiadj (bfd_vma symbol_value)
1132 {
1133   return ((symbol_value + 0x8000) >> 16) & 0xffff;
1134 }
1135
1136 /* Do the relocations that require special handling.  */
1137 static bfd_reloc_status_type
1138 nios2_elf32_do_hi16_relocate (bfd *abfd, reloc_howto_type *howto, 
1139                               asection *input_section,
1140                               bfd_byte *data, bfd_vma offset, 
1141                               bfd_vma symbol_value, bfd_vma addend)
1142 {
1143   symbol_value = symbol_value + addend;
1144   addend = 0;
1145   symbol_value = (symbol_value >> 16) & 0xffff;
1146   return _bfd_final_link_relocate (howto, abfd, input_section,
1147                                    data, offset, symbol_value, addend);
1148 }
1149
1150 static bfd_reloc_status_type
1151 nios2_elf32_do_lo16_relocate (bfd *abfd, reloc_howto_type *howto,
1152                               asection *input_section,
1153                               bfd_byte *data, bfd_vma offset, 
1154                               bfd_vma symbol_value, bfd_vma addend)
1155 {
1156   symbol_value = symbol_value + addend;
1157   addend = 0;
1158   symbol_value = symbol_value & 0xffff;
1159   return _bfd_final_link_relocate (howto, abfd, input_section,
1160                                    data, offset, symbol_value, addend);
1161 }
1162
1163 static bfd_reloc_status_type
1164 nios2_elf32_do_hiadj16_relocate (bfd *abfd, reloc_howto_type *howto,
1165                                  asection *input_section,
1166                                  bfd_byte *data, bfd_vma offset,
1167                                  bfd_vma symbol_value, bfd_vma addend)
1168 {
1169   symbol_value = symbol_value + addend;
1170   addend = 0;
1171   symbol_value = hiadj(symbol_value);
1172   return _bfd_final_link_relocate (howto, abfd, input_section, data, offset,
1173                                    symbol_value, addend);
1174 }
1175
1176 static bfd_reloc_status_type
1177 nios2_elf32_do_pcrel_lo16_relocate (bfd *abfd, reloc_howto_type *howto,
1178                                     asection *input_section,
1179                                     bfd_byte *data, bfd_vma offset,
1180                                     bfd_vma symbol_value, bfd_vma addend)
1181 {
1182   symbol_value = symbol_value + addend;
1183   addend = 0;
1184   symbol_value = symbol_value & 0xffff;
1185   return _bfd_final_link_relocate (howto, abfd, input_section,
1186                                    data, offset, symbol_value, addend);
1187 }
1188
1189 static bfd_reloc_status_type
1190 nios2_elf32_do_pcrel_hiadj16_relocate (bfd *abfd, reloc_howto_type *howto,
1191                                        asection *input_section,
1192                                        bfd_byte *data, bfd_vma offset,
1193                                        bfd_vma symbol_value, bfd_vma addend)
1194 {
1195   symbol_value = symbol_value + addend;
1196   symbol_value -= (input_section->output_section->vma
1197                    + input_section->output_offset);
1198   symbol_value -= offset;
1199   addend = 0;
1200   symbol_value = hiadj(symbol_value);
1201   return _bfd_final_link_relocate (howto, abfd, input_section, data, offset,
1202                                    symbol_value, addend);
1203 }
1204
1205 static bfd_reloc_status_type
1206 nios2_elf32_do_pcrel16_relocate (bfd *abfd, reloc_howto_type *howto,
1207                                  asection *input_section,
1208                                  bfd_byte *data, bfd_vma offset, 
1209                                  bfd_vma symbol_value, bfd_vma addend)
1210 {
1211   /* NIOS2 pc relative relocations are relative to the next 32-bit instruction 
1212      so we need to subtract 4 before doing a final_link_relocate. */
1213   symbol_value = symbol_value + addend - 4;
1214   addend = 0;
1215   return _bfd_final_link_relocate (howto, abfd, input_section,
1216                                    data, offset, symbol_value, addend);
1217 }
1218
1219 static bfd_reloc_status_type
1220 nios2_elf32_do_call26_relocate (bfd *abfd, reloc_howto_type *howto,
1221                                 asection *input_section,
1222                                 bfd_byte *data, bfd_vma offset, 
1223                                 bfd_vma symbol_value, bfd_vma addend)
1224 {
1225   /* Check that the relocation is in the same page as the current address.  */
1226   if (((symbol_value + addend) & 0xf0000000)
1227       != ((input_section->output_section->vma + offset) & 0xf0000000))
1228     return bfd_reloc_overflow;
1229
1230   return _bfd_final_link_relocate (howto, abfd, input_section,
1231                                    data, offset, symbol_value, addend);
1232 }
1233
1234 static bfd_reloc_status_type
1235 nios2_elf32_do_gprel_relocate (bfd *abfd, reloc_howto_type *howto,
1236                                asection *input_section,
1237                                bfd_byte *data, bfd_vma offset, 
1238                                bfd_vma symbol_value, bfd_vma addend)
1239 {
1240   /* Because we need the output_bfd, the special handling is done
1241      in nios2_elf32_relocate_section or in nios2_elf32_gprel_relocate.  */
1242   return _bfd_final_link_relocate (howto, abfd, input_section,
1243                                    data, offset, symbol_value, addend);
1244 }
1245
1246 static bfd_reloc_status_type
1247 nios2_elf32_do_ujmp_relocate (bfd *abfd, reloc_howto_type *howto,
1248                               asection *input_section,
1249                               bfd_byte *data, bfd_vma offset, 
1250                               bfd_vma symbol_value, bfd_vma addend)
1251 {
1252   bfd_vma symbol_lo16, symbol_hi16;
1253   bfd_reloc_status_type r;
1254   symbol_value = symbol_value + addend;
1255   addend = 0;
1256   symbol_hi16 = (symbol_value >> 16) & 0xffff;
1257   symbol_lo16 = symbol_value & 0xffff;
1258
1259   r = _bfd_final_link_relocate (howto, abfd, input_section,
1260                                 data, offset, symbol_hi16, addend);
1261
1262   if (r == bfd_reloc_ok)
1263     return _bfd_final_link_relocate (howto, abfd, input_section,
1264                                      data, offset + 4, symbol_lo16, addend);
1265
1266   return r;
1267 }
1268
1269 static bfd_reloc_status_type
1270 nios2_elf32_do_cjmp_relocate (bfd *abfd, reloc_howto_type *howto,
1271                               asection *input_section,
1272                               bfd_byte *data, bfd_vma offset, 
1273                               bfd_vma symbol_value, bfd_vma addend)
1274 {
1275   bfd_vma symbol_lo16, symbol_hi16;
1276   bfd_reloc_status_type r;
1277   symbol_value = symbol_value + addend;
1278   addend = 0;
1279   symbol_hi16 = (symbol_value >> 16) & 0xffff;
1280   symbol_lo16 = symbol_value & 0xffff;
1281
1282   r = _bfd_final_link_relocate (howto, abfd, input_section,
1283                                 data, offset, symbol_hi16, addend);
1284
1285   if (r == bfd_reloc_ok)
1286     return _bfd_final_link_relocate (howto, abfd, input_section,
1287                                      data, offset + 4, symbol_lo16, addend);
1288
1289   return r;
1290 }
1291
1292 static bfd_reloc_status_type
1293 nios2_elf32_do_callr_relocate (bfd *abfd, reloc_howto_type *howto,
1294                                asection *input_section,
1295                                bfd_byte *data, bfd_vma offset, 
1296                                bfd_vma symbol_value, bfd_vma addend)
1297 {
1298   bfd_vma symbol_lo16, symbol_hi16;
1299   bfd_reloc_status_type r;
1300   symbol_value = symbol_value + addend;
1301   addend = 0;
1302   symbol_hi16 = (symbol_value >> 16) & 0xffff;
1303   symbol_lo16 = symbol_value & 0xffff;
1304
1305   r = _bfd_final_link_relocate (howto, abfd, input_section,
1306                                 data, offset, symbol_hi16, addend);
1307
1308   if (r == bfd_reloc_ok)
1309     return _bfd_final_link_relocate (howto, abfd, input_section,
1310                                      data, offset + 4, symbol_lo16, addend);
1311
1312   return r;
1313 }
1314
1315 /* HOWTO handlers for relocations that require special handling.  */
1316
1317 /* This is for relocations used only when relaxing to ensure
1318    changes in size of section don't screw up .align.  */
1319 static bfd_reloc_status_type
1320 nios2_elf32_ignore_reloc (bfd *abfd ATTRIBUTE_UNUSED, arelent *reloc_entry,
1321                           asymbol *symbol ATTRIBUTE_UNUSED, 
1322                           void *data ATTRIBUTE_UNUSED, asection *input_section, 
1323                           bfd *output_bfd, 
1324                           char **error_message ATTRIBUTE_UNUSED)
1325 {
1326   if (output_bfd != NULL)
1327     reloc_entry->address += input_section->output_offset;
1328   return bfd_reloc_ok;
1329 }
1330
1331 static bfd_reloc_status_type
1332 nios2_elf32_hi16_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol, 
1333                            void *data, asection *input_section, 
1334                            bfd *output_bfd, 
1335                            char **error_message ATTRIBUTE_UNUSED)
1336 {
1337   /* This part is from bfd_elf_generic_reloc.  */
1338   if (output_bfd != NULL
1339       && (symbol->flags & BSF_SECTION_SYM) == 0
1340       && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
1341     {
1342       reloc_entry->address += input_section->output_offset;
1343       return bfd_reloc_ok;
1344     }
1345
1346   if (output_bfd != NULL)
1347     /* FIXME: See bfd_perform_relocation.  Is this right?  */
1348     return bfd_reloc_continue;
1349
1350   return nios2_elf32_do_hi16_relocate (abfd, reloc_entry->howto,
1351                                        input_section,
1352                                        data, reloc_entry->address,
1353                                        (symbol->value
1354                                         + symbol->section->output_section->vma
1355                                         + symbol->section->output_offset),
1356                                        reloc_entry->addend);
1357 }
1358
1359 static bfd_reloc_status_type
1360 nios2_elf32_lo16_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
1361                            void *data, asection *input_section, 
1362                            bfd *output_bfd, 
1363                            char **error_message ATTRIBUTE_UNUSED)
1364 {
1365   /* This part is from bfd_elf_generic_reloc.  */
1366   if (output_bfd != NULL
1367       && (symbol->flags & BSF_SECTION_SYM) == 0
1368       && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
1369     {
1370       reloc_entry->address += input_section->output_offset;
1371       return bfd_reloc_ok;
1372     }
1373
1374   if (output_bfd != NULL)
1375     /* FIXME: See bfd_perform_relocation.  Is this right?  */
1376     return bfd_reloc_continue;
1377
1378   return nios2_elf32_do_lo16_relocate (abfd, reloc_entry->howto,
1379                                        input_section,
1380                                        data, reloc_entry->address,
1381                                        (symbol->value
1382                                         + symbol->section->output_section->vma
1383                                         + symbol->section->output_offset),
1384                                        reloc_entry->addend);
1385 }
1386
1387 static bfd_reloc_status_type
1388 nios2_elf32_hiadj16_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
1389                               void *data, asection *input_section, 
1390                               bfd *output_bfd, 
1391                               char **error_message ATTRIBUTE_UNUSED)
1392 {
1393   /* This part is from bfd_elf_generic_reloc.  */
1394   if (output_bfd != NULL
1395       && (symbol->flags & BSF_SECTION_SYM) == 0
1396       && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
1397     {
1398       reloc_entry->address += input_section->output_offset;
1399       return bfd_reloc_ok;
1400     }
1401
1402   if (output_bfd != NULL)
1403     /* FIXME: See bfd_perform_relocation.  Is this right?  */
1404     return bfd_reloc_continue;
1405
1406   return nios2_elf32_do_hiadj16_relocate (abfd, reloc_entry->howto,
1407                                           input_section,
1408                                           data, reloc_entry->address,
1409                                           (symbol->value
1410                                            + symbol->section->output_section->vma
1411                                            + symbol->section->output_offset),
1412                                           reloc_entry->addend);
1413 }
1414
1415 static bfd_reloc_status_type
1416 nios2_elf32_pcrel_lo16_relocate (bfd *abfd, arelent *reloc_entry,
1417                                  asymbol *symbol, void *data,
1418                                  asection *input_section, bfd *output_bfd,
1419                                  char **error_message ATTRIBUTE_UNUSED)
1420 {
1421   /* This part is from bfd_elf_generic_reloc.  */
1422   if (output_bfd != NULL
1423       && (symbol->flags & BSF_SECTION_SYM) == 0
1424       && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
1425     {
1426       reloc_entry->address += input_section->output_offset;
1427       return bfd_reloc_ok;
1428     }
1429
1430   if (output_bfd != NULL)
1431     /* FIXME: See bfd_perform_relocation.  Is this right?  */
1432     return bfd_reloc_continue;
1433
1434   return nios2_elf32_do_pcrel_lo16_relocate (
1435     abfd, reloc_entry->howto, input_section, data, reloc_entry->address,
1436     (symbol->value + symbol->section->output_section->vma
1437      + symbol->section->output_offset),
1438     reloc_entry->addend);
1439 }
1440
1441 static bfd_reloc_status_type
1442 nios2_elf32_pcrel_hiadj16_relocate (bfd *abfd, arelent *reloc_entry,
1443                                     asymbol *symbol, void *data,
1444                                     asection *input_section, bfd *output_bfd,
1445                                     char **error_message ATTRIBUTE_UNUSED)
1446 {
1447   /* This part is from bfd_elf_generic_reloc.  */
1448   if (output_bfd != NULL
1449       && (symbol->flags & BSF_SECTION_SYM) == 0
1450       && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
1451     {
1452       reloc_entry->address += input_section->output_offset;
1453       return bfd_reloc_ok;
1454     }
1455
1456   if (output_bfd != NULL)
1457     /* FIXME: See bfd_perform_relocation.  Is this right?  */
1458     return bfd_reloc_continue;
1459
1460   return nios2_elf32_do_pcrel_hiadj16_relocate (
1461     abfd, reloc_entry->howto, input_section, data, reloc_entry->address,
1462     (symbol->value + symbol->section->output_section->vma
1463      + symbol->section->output_offset),
1464     reloc_entry->addend);
1465 }
1466
1467 static bfd_reloc_status_type
1468 nios2_elf32_pcrel16_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
1469                               void *data, asection *input_section, 
1470                               bfd *output_bfd, 
1471                               char **error_message ATTRIBUTE_UNUSED)
1472 {
1473   /* This part is from bfd_elf_generic_reloc.  */
1474   if (output_bfd != NULL
1475       && (symbol->flags & BSF_SECTION_SYM) == 0
1476       && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
1477     {
1478       reloc_entry->address += input_section->output_offset;
1479       return bfd_reloc_ok;
1480     }
1481
1482   if (output_bfd != NULL)
1483     /* FIXME: See bfd_perform_relocation.  Is this right?  */
1484     return bfd_reloc_continue;
1485
1486   return nios2_elf32_do_pcrel16_relocate (abfd, reloc_entry->howto,
1487                                           input_section,
1488                                           data, reloc_entry->address,
1489                                           (symbol->value
1490                                            + symbol->section->output_section->vma
1491                                            + symbol->section->output_offset),
1492                                           reloc_entry->addend);
1493 }
1494
1495 static bfd_reloc_status_type
1496 nios2_elf32_call26_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
1497                              void *data, asection *input_section, 
1498                              bfd *output_bfd, 
1499                              char **error_message ATTRIBUTE_UNUSED)
1500 {
1501   /* This part is from bfd_elf_generic_reloc.  */
1502   if (output_bfd != NULL
1503       && (symbol->flags & BSF_SECTION_SYM) == 0
1504       && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
1505     {
1506       reloc_entry->address += input_section->output_offset;
1507       return bfd_reloc_ok;
1508     }
1509
1510   if (output_bfd != NULL)
1511     /* FIXME: See bfd_perform_relocation.  Is this right?  */
1512     return bfd_reloc_continue;
1513
1514   return nios2_elf32_do_call26_relocate (abfd, reloc_entry->howto,
1515                                          input_section,
1516                                          data, reloc_entry->address,
1517                                          (symbol->value
1518                                           + symbol->section->output_section->vma
1519                                           + symbol->section->output_offset),
1520                                          reloc_entry->addend);
1521 }
1522
1523 static bfd_reloc_status_type
1524 nios2_elf32_gprel_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
1525                             void *data, asection *input_section, 
1526                             bfd *output_bfd, char **msg)
1527 {
1528   bfd_vma relocation;
1529   bfd_vma gp;
1530   bfd_reloc_status_type r;
1531
1532
1533   /* This part is from bfd_elf_generic_reloc.  */
1534   if (output_bfd != NULL
1535       && (symbol->flags & BSF_SECTION_SYM) == 0
1536       && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
1537     {
1538       reloc_entry->address += input_section->output_offset;
1539       return bfd_reloc_ok;
1540     }
1541
1542   if (output_bfd != NULL)
1543     /* FIXME: See bfd_perform_relocation.  Is this right?  */
1544     return bfd_reloc_continue;
1545
1546   relocation = (symbol->value
1547                 + symbol->section->output_section->vma
1548                 + symbol->section->output_offset);
1549
1550   /* This assumes we've already cached the _gp symbol.  */
1551   r = nios2_elf_final_gp (abfd, symbol, FALSE, msg, &gp);
1552   if (r == bfd_reloc_ok)
1553     {
1554       relocation = relocation + reloc_entry->addend - gp;
1555       reloc_entry->addend = 0;
1556       if ((signed) relocation < -32768 || (signed) relocation > 32767)
1557         {
1558           *msg = _("global pointer relative address out of range");
1559           r = bfd_reloc_outofrange;
1560         }
1561       else
1562         r = nios2_elf32_do_gprel_relocate (abfd, reloc_entry->howto,
1563                                            input_section,
1564                                            data, reloc_entry->address,
1565                                            relocation, reloc_entry->addend);
1566     }
1567
1568   return r;
1569 }
1570
1571 static bfd_reloc_status_type
1572 nios2_elf32_ujmp_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
1573                            void *data, asection *input_section, 
1574                            bfd *output_bfd, char **msg ATTRIBUTE_UNUSED)
1575 {
1576   /* This part is from bfd_elf_generic_reloc.  */
1577   if (output_bfd != NULL
1578       && (symbol->flags & BSF_SECTION_SYM) == 0
1579       && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
1580     {
1581       reloc_entry->address += input_section->output_offset;
1582       return bfd_reloc_ok;
1583     }
1584
1585   if (output_bfd != NULL)
1586     /* FIXME: See bfd_perform_relocation.  Is this right?  */
1587     return bfd_reloc_continue;
1588
1589   return nios2_elf32_do_ujmp_relocate (abfd, reloc_entry->howto,
1590                                        input_section,
1591                                        data, reloc_entry->address,
1592                                        (symbol->value
1593                                         + symbol->section->output_section->vma
1594                                         + symbol->section->output_offset),
1595                                        reloc_entry->addend);
1596 }
1597
1598 static bfd_reloc_status_type
1599 nios2_elf32_cjmp_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
1600                            void *data, asection *input_section, 
1601                            bfd *output_bfd, char **msg ATTRIBUTE_UNUSED)
1602 {
1603   /* This part is from bfd_elf_generic_reloc.  */
1604   if (output_bfd != NULL
1605       && (symbol->flags & BSF_SECTION_SYM) == 0
1606       && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
1607     {
1608       reloc_entry->address += input_section->output_offset;
1609       return bfd_reloc_ok;
1610     }
1611
1612   if (output_bfd != NULL)
1613     /* FIXME: See bfd_perform_relocation.  Is this right?  */
1614     return bfd_reloc_continue;
1615
1616   return nios2_elf32_do_cjmp_relocate (abfd, reloc_entry->howto,
1617                                        input_section,
1618                                        data, reloc_entry->address,
1619                                        (symbol->value
1620                                         + symbol->section->output_section->vma
1621                                         + symbol->section->output_offset),
1622                                        reloc_entry->addend);
1623 }
1624
1625 static bfd_reloc_status_type
1626 nios2_elf32_callr_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
1627                             void *data, asection *input_section, 
1628                             bfd *output_bfd, char **msg ATTRIBUTE_UNUSED)
1629 {
1630   /* This part is from bfd_elf_generic_reloc.  */
1631   if (output_bfd != NULL
1632       && (symbol->flags & BSF_SECTION_SYM) == 0
1633       && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
1634     {
1635       reloc_entry->address += input_section->output_offset;
1636       return bfd_reloc_ok;
1637     }
1638
1639   if (output_bfd != NULL)
1640     /* FIXME: See bfd_perform_relocation.  Is this right?  */
1641     return bfd_reloc_continue;
1642
1643   return nios2_elf32_do_callr_relocate (abfd, reloc_entry->howto,
1644                                         input_section,
1645                                         data, reloc_entry->address,
1646                                         (symbol->value
1647                                          + symbol->section->output_section->vma
1648                                          + symbol->section->output_offset),
1649                                         reloc_entry->addend);
1650 }
1651
1652  
1653 /* Implement elf_backend_relocate_section.  */
1654 static bfd_boolean
1655 nios2_elf32_relocate_section (bfd *output_bfd,
1656                               struct bfd_link_info *info,
1657                               bfd *input_bfd,
1658                               asection *input_section,
1659                               bfd_byte *contents,
1660                               Elf_Internal_Rela *relocs,
1661                               Elf_Internal_Sym *local_syms,
1662                               asection **local_sections)
1663 {
1664   Elf_Internal_Shdr *symtab_hdr;
1665   struct elf_link_hash_entry **sym_hashes;
1666   Elf_Internal_Rela *rel;
1667   Elf_Internal_Rela *relend;
1668   struct elf32_nios2_link_hash_table *htab;
1669   asection *sgot;
1670   asection *splt;
1671   asection *sreloc = NULL;
1672   bfd_vma *local_got_offsets;
1673
1674   symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
1675   sym_hashes = elf_sym_hashes (input_bfd);
1676   relend = relocs + input_section->reloc_count;
1677
1678   htab = elf32_nios2_hash_table (info);
1679   sgot = htab->root.sgot;
1680   splt = htab->root.splt;
1681   local_got_offsets = elf_local_got_offsets (input_bfd);
1682
1683   for (rel = relocs; rel < relend; rel++)
1684     {
1685       reloc_howto_type *howto;
1686       unsigned long r_symndx;
1687       Elf_Internal_Sym *sym;
1688       asection *sec;
1689       struct elf_link_hash_entry *h;
1690       struct elf32_nios2_link_hash_entry *eh;
1691       bfd_vma relocation;
1692       bfd_vma gp;
1693       bfd_vma reloc_address;
1694       bfd_reloc_status_type r = bfd_reloc_ok;
1695       const char *name = NULL;
1696       int r_type;
1697       const char *format;
1698       char msgbuf[256];
1699       const char* msg = (const char*) NULL;
1700       bfd_boolean unresolved_reloc;
1701       bfd_vma off;
1702       int use_plt;
1703
1704       r_type = ELF32_R_TYPE (rel->r_info);
1705       r_symndx = ELF32_R_SYM (rel->r_info);
1706
1707       howto = lookup_howto ((unsigned) ELF32_R_TYPE (rel->r_info));
1708       h = NULL;
1709       sym = NULL;
1710       sec = NULL;
1711
1712       if (r_symndx < symtab_hdr->sh_info)
1713         {
1714           sym = local_syms + r_symndx;
1715           sec = local_sections[r_symndx];
1716           relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
1717         }
1718       else
1719         {
1720           bfd_boolean warned;
1721
1722           RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
1723                                    r_symndx, symtab_hdr, sym_hashes,
1724                                    h, sec, relocation,
1725                                    unresolved_reloc, warned);
1726         }
1727
1728       if (sec && discarded_section (sec))
1729         RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
1730                                          rel, 1, relend, howto, 0, contents);
1731
1732       /* Nothing more to do unless this is a final link.  */
1733       if (info->relocatable)
1734         continue;
1735
1736       if (sec && sec->output_section)
1737         reloc_address = (sec->output_section->vma + sec->output_offset
1738                          + rel->r_offset);
1739       else
1740         reloc_address = 0;
1741                 
1742       if (howto)
1743         {
1744           switch (howto->type)
1745             {
1746             case R_NIOS2_HI16:
1747               r = nios2_elf32_do_hi16_relocate (input_bfd, howto,
1748                                                 input_section,
1749                                                 contents, rel->r_offset,
1750                                                 relocation, rel->r_addend);
1751               break;
1752             case R_NIOS2_LO16:
1753               r = nios2_elf32_do_lo16_relocate (input_bfd, howto,
1754                                                 input_section,
1755                                                 contents, rel->r_offset,
1756                                                 relocation, rel->r_addend);
1757               break;
1758             case R_NIOS2_PCREL_LO:
1759               r = nios2_elf32_do_pcrel_lo16_relocate (input_bfd, howto,
1760                                                       input_section,
1761                                                       contents,
1762                                                       rel->r_offset,
1763                                                       relocation,
1764                                                       rel->r_addend);
1765               break;
1766             case R_NIOS2_HIADJ16:
1767               r = nios2_elf32_do_hiadj16_relocate (input_bfd, howto,
1768                                                    input_section, contents,
1769                                                    rel->r_offset, relocation,
1770                                                    rel->r_addend);
1771               break;
1772             case R_NIOS2_PCREL_HA:
1773               r = nios2_elf32_do_pcrel_hiadj16_relocate (input_bfd, howto,
1774                                                          input_section,
1775                                                          contents,
1776                                                          rel->r_offset,
1777                                                          relocation,
1778                                                          rel->r_addend);
1779               break;
1780             case R_NIOS2_PCREL16:
1781               r = nios2_elf32_do_pcrel16_relocate (input_bfd, howto,
1782                                                    input_section, contents,
1783                                                    rel->r_offset, relocation,
1784                                                    rel->r_addend);
1785               break;
1786             case R_NIOS2_GPREL:
1787               /* Turns an absolute address into a gp-relative address.  */
1788               if (!nios2_elf_assign_gp (output_bfd, &gp, info))
1789                 {
1790                   format = _("global pointer relative relocation at address "
1791                              "0x%08x when _gp not defined\n");
1792                   sprintf (msgbuf, format, reloc_address);
1793                   msg = msgbuf;
1794                   r = bfd_reloc_dangerous;
1795                 }
1796               else
1797                 {
1798                   bfd_vma symbol_address = rel->r_addend + relocation;
1799                   relocation = relocation + rel->r_addend - gp;
1800                   rel->r_addend = 0;
1801                   if (((signed) relocation < -32768
1802                        || (signed) relocation > 32767)
1803                       && (!h
1804                           || h->root.type == bfd_link_hash_defined
1805                           || h->root.type == bfd_link_hash_defweak))
1806                     {
1807                       format = _("Unable to reach %s (at 0x%08x) from the "
1808                                  "global pointer (at 0x%08x) because the "
1809                                  "offset (%d) is out of the allowed range, "
1810                                  "-32678 to 32767.\n" );
1811                       sprintf (msgbuf, format, name, symbol_address, gp, 
1812                                (signed)relocation);
1813                       msg = msgbuf;
1814                       r = bfd_reloc_outofrange;
1815                     }
1816                   else
1817                     r = _bfd_final_link_relocate (howto, input_bfd,
1818                                                   input_section, contents,
1819                                                   rel->r_offset, relocation,
1820                                                   rel->r_addend);
1821                 }
1822
1823               break;
1824             case R_NIOS2_UJMP:
1825               r = nios2_elf32_do_ujmp_relocate (input_bfd, howto,
1826                                                 input_section,
1827                                                 contents, rel->r_offset,
1828                                                 relocation, rel->r_addend);
1829               break;
1830             case R_NIOS2_CJMP:
1831               r = nios2_elf32_do_cjmp_relocate (input_bfd, howto,
1832                                                 input_section,
1833                                                 contents, rel->r_offset,
1834                                                 relocation, rel->r_addend);
1835               break;
1836             case R_NIOS2_CALLR:
1837               r = nios2_elf32_do_callr_relocate (input_bfd, howto,
1838                                                  input_section, contents,
1839                                                  rel->r_offset, relocation,
1840                                                  rel->r_addend);
1841               break;
1842             case R_NIOS2_CALL26:
1843               /* If we have a call to an undefined weak symbol, we just want
1844                  to stuff a zero in the bits of the call instruction and
1845                  bypass the normal call26 relocation handling, because it'll
1846                  diagnose an overflow error if address 0 isn't in the same
1847                  256MB segment as the call site.  Presumably the call
1848                  should be guarded by a null check anyway.  */
1849               if (h != NULL && h->root.type == bfd_link_hash_undefweak)
1850                 {
1851                   BFD_ASSERT (relocation == 0 && rel->r_addend == 0);
1852                   r = _bfd_final_link_relocate (howto, input_bfd,
1853                                                 input_section, contents,
1854                                                 rel->r_offset, relocation,
1855                                                 rel->r_addend);
1856                   break;
1857                 }
1858               /* Handle relocations which should use the PLT entry.
1859                  NIOS2_BFD_RELOC_32 relocations will use the symbol's value,
1860                  which may point to a PLT entry, but we don't need to handle
1861                  that here.  If we created a PLT entry, all branches in this
1862                  object should go to it.  */
1863               if (h != NULL && splt != NULL && h->plt.offset != (bfd_vma) -1)
1864                 {
1865                   /* If we've created a .plt section, and assigned a PLT entry
1866                      to this function, it should not be known to bind locally.
1867                      If it were, we would have cleared the PLT entry.  */
1868                   BFD_ASSERT (!SYMBOL_CALLS_LOCAL (info, h));
1869
1870                   relocation = (splt->output_section->vma
1871                                 + splt->output_offset
1872                                 + h->plt.offset);
1873
1874                   unresolved_reloc = FALSE;
1875                 }
1876               r = nios2_elf32_do_call26_relocate (input_bfd, howto,
1877                                                   input_section, contents,
1878                                                   rel->r_offset, relocation,
1879                                                   rel->r_addend);
1880               break;
1881             case R_NIOS2_ALIGN:
1882               r = bfd_reloc_ok;
1883               /* For symmetry this would be
1884                  r = nios2_elf32_do_ignore_reloc (input_bfd, howto,
1885                                                   input_section, contents,
1886                                                   rel->r_offset, relocation,
1887                                                   rel->r_addend);
1888                 but do_ignore_reloc would do no more than return
1889                 bfd_reloc_ok. */
1890               break;
1891
1892             case R_NIOS2_GOT16:
1893             case R_NIOS2_CALL16:
1894               /* Relocation is to the entry for this symbol in the
1895                  global offset table.  */
1896               if (sgot == NULL)
1897                 {
1898                   r = bfd_reloc_notsupported;
1899                   break;
1900                 }
1901
1902               use_plt = 0;
1903
1904               if (h != NULL)
1905                 {
1906                   bfd_boolean dyn;
1907
1908                   eh = (struct elf32_nios2_link_hash_entry *)h;
1909                   use_plt = (eh->got_types_used == CALL16_USED
1910                              && h->plt.offset != (bfd_vma) -1);
1911
1912                   off = h->got.offset;
1913                   BFD_ASSERT (off != (bfd_vma) -1);
1914                   dyn = elf_hash_table (info)->dynamic_sections_created;
1915                   if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
1916                       || (info->shared
1917                           && SYMBOL_REFERENCES_LOCAL (info, h))
1918                       || (ELF_ST_VISIBILITY (h->other)
1919                           && h->root.type == bfd_link_hash_undefweak))
1920                     {
1921                       /* This is actually a static link, or it is a -Bsymbolic
1922                          link and the symbol is defined locally.  We must
1923                          initialize this entry in the global offset table.
1924                          Since the offset must always be a multiple of 4, we
1925                          use the least significant bit to record whether we
1926                          have initialized it already.
1927
1928                          When doing a dynamic link, we create a .rela.got
1929                          relocation entry to initialize the value.  This is
1930                          done in the finish_dynamic_symbol routine.  */
1931                       if ((off & 1) != 0)
1932                         off &= ~1;
1933                       else
1934                         {
1935                           bfd_put_32 (output_bfd, relocation,
1936                                       sgot->contents + off);
1937                           h->got.offset |= 1;
1938                         }
1939                     }
1940                   else
1941                     unresolved_reloc = FALSE;
1942                 }
1943               else
1944                 {
1945                   BFD_ASSERT (local_got_offsets != NULL
1946                               && local_got_offsets[r_symndx] != (bfd_vma) -1);
1947
1948                   off = local_got_offsets[r_symndx];
1949
1950                   /* The offset must always be a multiple of 4.  We use the
1951                      least significant bit to record whether we have already
1952                      generated the necessary reloc.  */
1953                   if ((off & 1) != 0)
1954                     off &= ~1;
1955                   else
1956                     {
1957                       bfd_put_32 (output_bfd, relocation,
1958                                   sgot->contents + off);
1959
1960                       if (info->shared)
1961                         {
1962                           asection *srelgot;
1963                           Elf_Internal_Rela outrel;
1964                           bfd_byte *loc;
1965
1966                           srelgot = htab->root.srelgot;
1967                           BFD_ASSERT (srelgot != NULL);
1968
1969                           outrel.r_addend = relocation;
1970                           outrel.r_offset = (sgot->output_section->vma
1971                                              + sgot->output_offset
1972                                              + off);
1973                           outrel.r_info = ELF32_R_INFO (0, R_NIOS2_RELATIVE);
1974                           loc = srelgot->contents;
1975                           loc += (srelgot->reloc_count++ *
1976                                   sizeof (Elf32_External_Rela));
1977                           bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
1978                         }
1979
1980                       local_got_offsets[r_symndx] |= 1;
1981                     }
1982                 }
1983
1984               if (use_plt && info->shared)
1985                 {
1986                   off = ((h->plt.offset - 24) / 12 + 3) * 4;
1987                   relocation = htab->root.sgotplt->output_offset + off;
1988                 }
1989               else
1990                 relocation = sgot->output_offset + off;
1991
1992               /* This relocation does not use the addend.  */
1993               rel->r_addend = 0;
1994
1995               r = _bfd_final_link_relocate (howto, input_bfd, input_section,
1996                                             contents, rel->r_offset,
1997                                             relocation, rel->r_addend);
1998               break;
1999
2000             case R_NIOS2_GOTOFF_LO:
2001             case R_NIOS2_GOTOFF_HA:
2002             case R_NIOS2_GOTOFF:
2003               /* Relocation is relative to the start of the
2004                  global offset table.  */
2005
2006               BFD_ASSERT (sgot != NULL);
2007               if (sgot == NULL)
2008                 {
2009                   r = bfd_reloc_notsupported;
2010                   break;
2011                 }
2012
2013               /* Note that sgot->output_offset is not involved in this
2014                  calculation.  We always want the start of .got.  If we
2015                  define _GLOBAL_OFFSET_TABLE in a different way, as is
2016                  permitted by the ABI, we might have to change this
2017                  calculation.  */
2018               relocation -= sgot->output_section->vma;
2019               switch (howto->type)
2020                 {
2021                 case R_NIOS2_GOTOFF_LO:
2022                   r = nios2_elf32_do_lo16_relocate (input_bfd, howto,
2023                                                     input_section, contents,
2024                                                     rel->r_offset, relocation,
2025                                                     rel->r_addend);
2026                   break;
2027                 case R_NIOS2_GOTOFF_HA:
2028                   r = nios2_elf32_do_hiadj16_relocate (input_bfd, howto,
2029                                                        input_section, contents,
2030                                                        rel->r_offset,
2031                                                        relocation,
2032                                                        rel->r_addend);
2033                   break;
2034                 default:
2035                   r = _bfd_final_link_relocate (howto, input_bfd,
2036                                                 input_section, contents,
2037                                                 rel->r_offset, relocation,
2038                                                 rel->r_addend);
2039                   break;
2040                 }
2041               break;
2042
2043             case R_NIOS2_TLS_LDO16:
2044               relocation -= dtpoff_base (info) + DTP_OFFSET;
2045
2046               r = _bfd_final_link_relocate (howto, input_bfd, input_section,
2047                                             contents, rel->r_offset,
2048                                             relocation, rel->r_addend);
2049               break;
2050             case R_NIOS2_TLS_LDM16:
2051               if (htab->root.sgot == NULL)
2052                 abort ();
2053
2054               off = htab->tls_ldm_got.offset;
2055
2056               if ((off & 1) != 0)
2057                 off &= ~1;
2058               else
2059                 {
2060                   /* If we don't know the module number, create a relocation
2061                      for it.  */
2062                   if (info->shared)
2063                     {
2064                       Elf_Internal_Rela outrel;
2065                       bfd_byte *loc;
2066
2067                       if (htab->root.srelgot == NULL)
2068                         abort ();
2069
2070                       outrel.r_addend = 0;
2071                       outrel.r_offset = (htab->root.sgot->output_section->vma
2072                                          + htab->root.sgot->output_offset
2073                                          + off);
2074                       outrel.r_info = ELF32_R_INFO (0, R_NIOS2_TLS_DTPMOD);
2075
2076                       loc = htab->root.srelgot->contents;
2077                       loc += (htab->root.srelgot->reloc_count++
2078                               * sizeof (Elf32_External_Rela));
2079                       bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
2080                     }
2081                   else
2082                     bfd_put_32 (output_bfd, 1,
2083                                 htab->root.sgot->contents + off);
2084
2085                   htab->tls_ldm_got.offset |= 1;
2086                 }
2087
2088               relocation = (htab->root.sgot->output_offset + off);
2089
2090               r = _bfd_final_link_relocate (howto, input_bfd, input_section,
2091                                             contents, rel->r_offset,
2092                                             relocation, rel->r_addend);
2093
2094               break;
2095             case R_NIOS2_TLS_GD16:
2096             case R_NIOS2_TLS_IE16:
2097               {
2098                 int indx;
2099                 char tls_type;
2100
2101                 if (htab->root.sgot == NULL)
2102                   abort ();
2103
2104                 indx = 0;
2105                 if (h != NULL)
2106                   {
2107                     bfd_boolean dyn;
2108                     dyn = htab->root.dynamic_sections_created;
2109                     if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
2110                         && (!info->shared
2111                             || !SYMBOL_REFERENCES_LOCAL (info, h)))
2112                       {
2113                         unresolved_reloc = FALSE;
2114                         indx = h->dynindx;
2115                       }
2116                     off = h->got.offset;
2117                     tls_type = (((struct elf32_nios2_link_hash_entry *) h)
2118                                 ->tls_type);
2119                   }
2120                 else
2121                   {
2122                     if (local_got_offsets == NULL)
2123                       abort ();
2124                     off = local_got_offsets[r_symndx];
2125                     tls_type = (elf32_nios2_local_got_tls_type (input_bfd)
2126                                 [r_symndx]);
2127                   }
2128
2129                 if (tls_type == GOT_UNKNOWN)
2130                   abort ();
2131
2132                 if ((off & 1) != 0)
2133                   off &= ~1;
2134                 else
2135                   {
2136                     bfd_boolean need_relocs = FALSE;
2137                     Elf_Internal_Rela outrel;
2138                     bfd_byte *loc = NULL;
2139                     int cur_off = off;
2140
2141                     /* The GOT entries have not been initialized yet.  Do it
2142                        now, and emit any relocations.  If both an IE GOT and a
2143                        GD GOT are necessary, we emit the GD first.  */
2144
2145                     if ((info->shared || indx != 0)
2146                         && (h == NULL
2147                             || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
2148                             || h->root.type != bfd_link_hash_undefweak))
2149                       {
2150                         need_relocs = TRUE;
2151                         if (htab->root.srelgot == NULL)
2152                           abort ();
2153                         loc = htab->root.srelgot->contents;
2154                         loc += (htab->root.srelgot->reloc_count *
2155                                 sizeof (Elf32_External_Rela));
2156                       }
2157
2158                     if (tls_type & GOT_TLS_GD)
2159                       {
2160                         if (need_relocs)
2161                           {
2162                             outrel.r_addend = 0;
2163                             outrel.r_offset = (htab->root.sgot->output_section->vma
2164                                                + htab->root.sgot->output_offset
2165                                                + cur_off);
2166                             outrel.r_info = ELF32_R_INFO (indx,
2167                                                           R_NIOS2_TLS_DTPMOD);
2168
2169                             bfd_elf32_swap_reloca_out (output_bfd, &outrel,
2170                                                        loc);
2171                             htab->root.srelgot->reloc_count++;
2172                             loc += sizeof (Elf32_External_Rela);
2173
2174                             if (indx == 0)
2175                               bfd_put_32 (output_bfd,
2176                                           (relocation - dtpoff_base (info) -
2177                                            DTP_OFFSET),
2178                                           htab->root.sgot->contents + cur_off + 4);
2179                             else
2180                               {
2181                                 outrel.r_addend = 0;
2182                                 outrel.r_info = ELF32_R_INFO (indx,
2183                                   R_NIOS2_TLS_DTPREL);
2184                                 outrel.r_offset += 4;
2185
2186                                 bfd_elf32_swap_reloca_out (output_bfd, &outrel,
2187                                                            loc);
2188                                 htab->root.srelgot->reloc_count++;
2189                                 loc += sizeof (Elf32_External_Rela);
2190                               }
2191                           }
2192                         else
2193                           {
2194                             /* If we are not emitting relocations for a
2195                                general dynamic reference, then we must be in a
2196                                static link or an executable link with the
2197                                symbol binding locally.  Mark it as belonging
2198                                to module 1, the executable.  */
2199                             bfd_put_32 (output_bfd, 1,
2200                                         htab->root.sgot->contents + cur_off);
2201                             bfd_put_32 (output_bfd, (relocation -
2202                                                      dtpoff_base (info) -
2203                                                      DTP_OFFSET),
2204                                         htab->root.sgot->contents + cur_off + 4);
2205                           }
2206
2207                         cur_off += 8;
2208                       }
2209
2210                     if (tls_type & GOT_TLS_IE)
2211                       {
2212                         if (need_relocs)
2213                           {
2214                             if (indx == 0)
2215                               outrel.r_addend = (relocation -
2216                                                  dtpoff_base (info));
2217                             else
2218                               outrel.r_addend = 0;
2219                             outrel.r_offset = (htab->root.sgot->output_section->vma
2220                                                + htab->root.sgot->output_offset
2221                                                + cur_off);
2222                             outrel.r_info = ELF32_R_INFO (indx,
2223                                                           R_NIOS2_TLS_TPREL);
2224
2225                             bfd_elf32_swap_reloca_out (output_bfd, &outrel,
2226                                                        loc);
2227                             htab->root.srelgot->reloc_count++;
2228                             loc += sizeof (Elf32_External_Rela);
2229                           }
2230                         else
2231                           bfd_put_32 (output_bfd, (tpoff (info, relocation)
2232                                                    - TP_OFFSET),
2233                                       htab->root.sgot->contents + cur_off);
2234                         cur_off += 4;
2235                       }
2236
2237                     if (h != NULL)
2238                       h->got.offset |= 1;
2239                     else
2240                       local_got_offsets[r_symndx] |= 1;
2241                   }
2242
2243                 if ((tls_type & GOT_TLS_GD) && r_type != R_NIOS2_TLS_GD16)
2244                   off += 8;
2245                 relocation = (htab->root.sgot->output_offset + off);
2246
2247                 r = _bfd_final_link_relocate (howto, input_bfd, input_section,
2248                                               contents, rel->r_offset,
2249                                               relocation, rel->r_addend);
2250               }
2251
2252               break;
2253             case R_NIOS2_TLS_LE16:
2254               if (info->shared && !info->pie)
2255                 {
2256                   (*_bfd_error_handler)
2257                     (_("%B(%A+0x%lx): R_NIOS2_TLS_LE16 relocation not "
2258                        "permitted in shared object"),
2259                      input_bfd, input_section,
2260                      (long) rel->r_offset, howto->name);
2261                   return FALSE;
2262                 }
2263               else
2264                 relocation = tpoff (info, relocation) - TP_OFFSET;
2265
2266               r = _bfd_final_link_relocate (howto, input_bfd, input_section,
2267                                             contents, rel->r_offset,
2268                                             relocation, rel->r_addend);
2269               break;
2270
2271             case R_NIOS2_BFD_RELOC_32:
2272               if (info->shared
2273                   && (input_section->flags & SEC_ALLOC) != 0
2274                   && (h == NULL
2275                       || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
2276                       || h->root.type != bfd_link_hash_undefweak))
2277                 {
2278                   Elf_Internal_Rela outrel;
2279                   bfd_byte *loc;
2280                   bfd_boolean skip, relocate;
2281
2282                   /* When generating a shared object, these relocations
2283                      are copied into the output file to be resolved at run
2284                      time.  */
2285
2286                   skip = FALSE;
2287                   relocate = FALSE;
2288
2289                   outrel.r_offset
2290                     = _bfd_elf_section_offset (output_bfd, info,
2291                                                input_section, rel->r_offset);
2292                   if (outrel.r_offset == (bfd_vma) -1)
2293                     skip = TRUE;
2294                   else if (outrel.r_offset == (bfd_vma) -2)
2295                     skip = TRUE, relocate = TRUE;
2296                   outrel.r_offset += (input_section->output_section->vma
2297                                       + input_section->output_offset);
2298
2299                   if (skip)
2300                     memset (&outrel, 0, sizeof outrel);
2301                   else if (h != NULL
2302                            && h->dynindx != -1
2303                            && (!info->shared
2304                                || !info->symbolic
2305                                || !h->def_regular))
2306                     {
2307                       outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
2308                       outrel.r_addend = rel->r_addend;
2309                     }
2310                   else
2311                     {
2312                       /* This symbol is local, or marked to become local.  */
2313                       outrel.r_addend = relocation + rel->r_addend;
2314                       relocate = TRUE;
2315                       outrel.r_info = ELF32_R_INFO (0, R_NIOS2_RELATIVE);
2316                     }
2317
2318                   sreloc = elf_section_data (input_section)->sreloc;
2319                   if (sreloc == NULL)
2320                     abort ();
2321
2322                   loc = sreloc->contents;
2323                   loc += sreloc->reloc_count++ * sizeof (Elf32_External_Rela);
2324                   bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
2325
2326                   /* This reloc will be computed at runtime, so there's no
2327                      need to do anything now, except for R_NIOS2_BFD_RELOC_32
2328                      relocations that have been turned into
2329                      R_NIOS2_RELATIVE.  */
2330                   if (!relocate)
2331                     break;
2332                 }
2333
2334               r = _bfd_final_link_relocate (howto, input_bfd,
2335                                             input_section, contents,
2336                                             rel->r_offset, relocation,
2337                                             rel->r_addend);
2338               break;
2339
2340             case R_NIOS2_TLS_DTPREL:
2341               relocation -= dtpoff_base (info);
2342               /* Fall through.  */
2343
2344             default:
2345               r = _bfd_final_link_relocate (howto, input_bfd,
2346                                             input_section, contents,
2347                                             rel->r_offset, relocation,
2348                                             rel->r_addend);
2349               break;
2350             }
2351         }
2352       else
2353         r = bfd_reloc_notsupported;
2354
2355       if (r != bfd_reloc_ok)
2356         {
2357           if (h != NULL)
2358             name = h->root.root.string;
2359           else
2360             {
2361               name = bfd_elf_string_from_elf_section (input_bfd,
2362                                                       symtab_hdr->sh_link,
2363                                                       sym->st_name);
2364               if (name == NULL || *name == '\0')
2365                 name = bfd_section_name (input_bfd, sec);
2366             }
2367
2368           switch (r)
2369             {
2370             case bfd_reloc_overflow:
2371               r = info->callbacks->reloc_overflow (info, NULL, name,
2372                                                    howto->name, (bfd_vma) 0,
2373                                                    input_bfd, input_section,
2374                                                    rel->r_offset);
2375               break;
2376
2377             case bfd_reloc_undefined:
2378               r = info->callbacks->undefined_symbol (info, name, input_bfd,
2379                                                      input_section,
2380                                                      rel->r_offset, TRUE);
2381               break;
2382
2383             case bfd_reloc_outofrange:
2384               if (msg == NULL)
2385                 msg = _("relocation out of range");
2386               break;
2387
2388             case bfd_reloc_notsupported:
2389               if (msg == NULL)
2390                 msg = _("unsupported relocation");
2391               break;
2392
2393             case bfd_reloc_dangerous:
2394               if (msg == NULL)
2395                 msg = _("dangerous relocation");
2396               break;
2397
2398             default:
2399               if (msg == NULL)
2400                 msg = _("unknown error");
2401               break;
2402             }
2403
2404           if (msg)
2405             {
2406               r = info->callbacks->warning
2407                 (info, msg, name, input_bfd, input_section, rel->r_offset);
2408               return FALSE;
2409             }
2410         }
2411     }
2412   return TRUE;
2413 }
2414
2415 /* Implement elf-backend_section_flags:
2416    Convert NIOS2 specific section flags to bfd internal section flags.  */
2417 static bfd_boolean
2418 nios2_elf32_section_flags (flagword *flags, const Elf_Internal_Shdr *hdr)
2419 {
2420   if (hdr->sh_flags & SHF_NIOS2_GPREL)
2421     *flags |= SEC_SMALL_DATA;
2422
2423   return TRUE;
2424 }
2425
2426 /* Implement elf_backend_fake_sections:
2427    Set the correct type for an NIOS2 ELF section.  We do this by the
2428    section name, which is a hack, but ought to work.  */
2429 static bfd_boolean
2430 nios2_elf32_fake_sections (bfd *abfd ATTRIBUTE_UNUSED,
2431                            Elf_Internal_Shdr *hdr, asection *sec)
2432 {
2433   register const char *name = bfd_get_section_name (abfd, sec);
2434
2435   if ((sec->flags & SEC_SMALL_DATA)
2436       || strcmp (name, ".sdata") == 0
2437       || strcmp (name, ".sbss") == 0
2438       || strcmp (name, ".lit4") == 0 || strcmp (name, ".lit8") == 0)
2439     hdr->sh_flags |= SHF_NIOS2_GPREL;
2440
2441   return TRUE;
2442 }
2443
2444 /* Create .got, .gotplt, and .rela.got sections in DYNOBJ, and set up
2445    shortcuts to them in our hash table.  */
2446 static bfd_boolean
2447 create_got_section (bfd *dynobj, struct bfd_link_info *info)
2448 {
2449   struct elf32_nios2_link_hash_table *htab;
2450
2451   htab = elf32_nios2_hash_table (info);
2452
2453   if (! _bfd_elf_create_got_section (dynobj, info))
2454     return FALSE;
2455
2456   /* In order for the two loads in .PLTresolve to share the same %hiadj,
2457      _GLOBAL_OFFSET_TABLE_ must be aligned to a 16-byte boundary.  */
2458   if (!bfd_set_section_alignment (dynobj, htab->root.sgotplt, 4))
2459     return FALSE;
2460
2461   return TRUE;
2462 }
2463
2464 /* Implement elf_backend_create_dynamic_sections:
2465    Create .plt, .rela.plt, .got, .got.plt, .rela.got, .dynbss, and
2466    .rela.bss sections in DYNOBJ, and set up shortcuts to them in our
2467    hash table.  */
2468 static bfd_boolean
2469 nios2_elf32_create_dynamic_sections (bfd *dynobj, struct bfd_link_info *info)
2470 {
2471   struct elf32_nios2_link_hash_table *htab;
2472
2473   htab = elf32_nios2_hash_table (info);
2474   if (!htab->root.sgot && !create_got_section (dynobj, info))
2475     return FALSE;
2476
2477   _bfd_elf_create_dynamic_sections (dynobj, info);
2478
2479   /* In order for the two loads in a shared object .PLTresolve to share the
2480      same %hiadj, the start of the PLT (as well as the GOT) must be aligned
2481      to a 16-byte boundary.  This is because the addresses for these loads
2482      include the -(.plt+4) PIC correction.  */
2483   if (!bfd_set_section_alignment (dynobj, htab->root.splt, 4))
2484     return FALSE;
2485
2486   htab->sdynbss = bfd_get_linker_section (dynobj, ".dynbss");
2487   if (!htab->sdynbss)
2488     return FALSE;
2489   if (!info->shared)
2490     {
2491       htab->srelbss = bfd_get_linker_section (dynobj, ".rela.bss");
2492       if (!htab->srelbss)
2493         return FALSE;
2494     }
2495
2496   return TRUE;
2497 }
2498
2499 /* Implement elf_backend_copy_indirect_symbol:
2500    Copy the extra info we tack onto an elf_link_hash_entry.  */
2501 static void
2502 nios2_elf32_copy_indirect_symbol (struct bfd_link_info *info,
2503                                   struct elf_link_hash_entry *dir,
2504                                   struct elf_link_hash_entry *ind)
2505 {
2506   struct elf32_nios2_link_hash_entry *edir, *eind;
2507
2508   edir = (struct elf32_nios2_link_hash_entry *) dir;
2509   eind = (struct elf32_nios2_link_hash_entry *) ind;
2510
2511   if (eind->dyn_relocs != NULL)
2512     {
2513       if (edir->dyn_relocs != NULL)
2514         {
2515           struct elf32_nios2_dyn_relocs **pp;
2516           struct elf32_nios2_dyn_relocs *p;
2517
2518           /* Add reloc counts against the indirect sym to the direct sym
2519              list.  Merge any entries against the same section.  */
2520           for (pp = &eind->dyn_relocs; (p = *pp) != NULL; )
2521             {
2522               struct elf32_nios2_dyn_relocs *q;
2523
2524               for (q = edir->dyn_relocs; q != NULL; q = q->next)
2525                 if (q->sec == p->sec)
2526                   {
2527                     q->pc_count += p->pc_count;
2528                     q->count += p->count;
2529                     *pp = p->next;
2530                     break;
2531                   }
2532               if (q == NULL)
2533                 pp = &p->next;
2534             }
2535           *pp = edir->dyn_relocs;
2536         }
2537
2538       edir->dyn_relocs = eind->dyn_relocs;
2539       eind->dyn_relocs = NULL;
2540     }
2541
2542   if (ind->root.type == bfd_link_hash_indirect
2543       && dir->got.refcount <= 0)
2544     {
2545       edir->tls_type = eind->tls_type;
2546       eind->tls_type = GOT_UNKNOWN;
2547     }
2548
2549   edir->got_types_used |= eind->got_types_used;
2550
2551   _bfd_elf_link_hash_copy_indirect (info, dir, ind);
2552 }
2553
2554 /* Implement elf_backend_check_relocs:
2555    Look through the relocs for a section during the first phase.  */
2556 static bfd_boolean
2557 nios2_elf32_check_relocs (bfd *abfd, struct bfd_link_info *info,
2558                           asection *sec, const Elf_Internal_Rela *relocs)
2559 {
2560   bfd *dynobj;
2561   Elf_Internal_Shdr *symtab_hdr;
2562   struct elf_link_hash_entry **sym_hashes, **sym_hashes_end;
2563   const Elf_Internal_Rela *rel;
2564   const Elf_Internal_Rela *rel_end;
2565   struct elf32_nios2_link_hash_table *htab;
2566   asection *sgot;
2567   asection *srelgot;
2568   asection *sreloc = NULL;
2569   bfd_signed_vma *local_got_refcounts;
2570
2571   if (info->relocatable)
2572     return TRUE;
2573
2574   dynobj = elf_hash_table (info)->dynobj;
2575   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
2576   sym_hashes = elf_sym_hashes (abfd);
2577   sym_hashes_end = (sym_hashes
2578                     + symtab_hdr->sh_size / sizeof (Elf32_External_Sym));
2579   if (!elf_bad_symtab (abfd))
2580     sym_hashes_end -= symtab_hdr->sh_info;
2581   local_got_refcounts = elf_local_got_refcounts (abfd);
2582
2583   htab = elf32_nios2_hash_table (info);
2584   sgot = htab->root.sgot;
2585   srelgot = htab->root.srelgot;
2586
2587   rel_end = relocs + sec->reloc_count;
2588   for (rel = relocs; rel < rel_end; rel++)
2589     {
2590       unsigned int r_type;
2591       struct elf_link_hash_entry *h;
2592       unsigned long r_symndx;
2593
2594       r_symndx = ELF32_R_SYM (rel->r_info);
2595       if (r_symndx < symtab_hdr->sh_info)
2596         h = NULL;
2597       else
2598         {
2599           h = sym_hashes[r_symndx - symtab_hdr->sh_info];
2600           while (h->root.type == bfd_link_hash_indirect
2601                  || h->root.type == bfd_link_hash_warning)
2602             h = (struct elf_link_hash_entry *) h->root.u.i.link;
2603
2604           /* PR15323, ref flags aren't set for references in the same
2605              object.  */
2606           h->root.non_ir_ref = 1;
2607         }
2608
2609       r_type = ELF32_R_TYPE (rel->r_info);
2610
2611       switch (r_type)
2612         {
2613         case R_NIOS2_GOT16:
2614         case R_NIOS2_CALL16:
2615         case R_NIOS2_TLS_GD16:
2616         case R_NIOS2_TLS_IE16:
2617           /* This symbol requires a global offset table entry.  */
2618           {
2619             int tls_type, old_tls_type;
2620
2621             switch (r_type)
2622               {
2623               default:
2624               case R_NIOS2_GOT16:
2625               case R_NIOS2_CALL16:
2626                 tls_type = GOT_NORMAL;
2627                 break;
2628               case R_NIOS2_TLS_GD16:
2629                 tls_type = GOT_TLS_GD;
2630                 break;
2631               case R_NIOS2_TLS_IE16:
2632                 tls_type = GOT_TLS_IE;
2633                 break;
2634               }
2635
2636             if (dynobj == NULL)
2637               {
2638                 /* Create the .got section.  */
2639                 elf_hash_table (info)->dynobj = dynobj = abfd;
2640                 nios2_elf32_create_dynamic_sections (dynobj, info);
2641               }
2642
2643             if (sgot == NULL)
2644               {
2645                 sgot = htab->root.sgot;
2646                 BFD_ASSERT (sgot != NULL);
2647               }
2648
2649             if (srelgot == NULL
2650                 && (h != NULL || info->shared))
2651               {
2652                 srelgot = htab->root.srelgot;
2653                 BFD_ASSERT (srelgot != NULL);
2654               }
2655
2656             if (h != NULL)
2657               {
2658                 struct elf32_nios2_link_hash_entry *eh
2659                   = (struct elf32_nios2_link_hash_entry *)h;
2660                 h->got.refcount++;
2661                 old_tls_type = elf32_nios2_hash_entry(h)->tls_type;
2662                 if (r_type == R_NIOS2_CALL16)
2663                   {
2664                     /* Make sure a plt entry is created for this symbol if
2665                        it turns out to be a function defined by a dynamic
2666                        object.  */
2667                     h->plt.refcount++;
2668                     h->needs_plt = 1;
2669                     h->type = STT_FUNC;
2670                     eh->got_types_used |= CALL16_USED;
2671                   }
2672                 else
2673                   eh->got_types_used |= GOT16_USED;
2674               }
2675             else
2676               {
2677                 /* This is a global offset table entry for a local symbol.  */
2678                 if (local_got_refcounts == NULL)
2679                   {
2680                     bfd_size_type size;
2681
2682                     size = symtab_hdr->sh_info;
2683                     size *= (sizeof (bfd_signed_vma) + sizeof (char));
2684                     local_got_refcounts
2685                       = ((bfd_signed_vma *) bfd_zalloc (abfd, size));
2686                     if (local_got_refcounts == NULL)
2687                       return FALSE;
2688                     elf_local_got_refcounts (abfd) = local_got_refcounts;
2689                     elf32_nios2_local_got_tls_type (abfd)
2690                       = (char *) (local_got_refcounts + symtab_hdr->sh_info);
2691                   }
2692                 local_got_refcounts[r_symndx]++;
2693                 old_tls_type = elf32_nios2_local_got_tls_type (abfd) [r_symndx];
2694               }
2695
2696             /* We will already have issued an error message if there is a
2697                TLS / non-TLS mismatch, based on the symbol type.  We don't
2698                support any linker relaxations.  So just combine any TLS
2699                types needed.  */
2700             if (old_tls_type != GOT_UNKNOWN && old_tls_type != GOT_NORMAL
2701                 && tls_type != GOT_NORMAL)
2702               tls_type |= old_tls_type;
2703
2704             if (old_tls_type != tls_type)
2705               {
2706                 if (h != NULL)
2707                   elf32_nios2_hash_entry (h)->tls_type = tls_type;
2708                 else
2709                   elf32_nios2_local_got_tls_type (abfd) [r_symndx] = tls_type;
2710               }
2711           }
2712           /* Fall through */
2713         case R_NIOS2_TLS_LDM16:
2714           if (r_type == R_NIOS2_TLS_LDM16)
2715             htab->tls_ldm_got.refcount++;
2716
2717           if (htab->root.sgot == NULL)
2718             {
2719               if (htab->root.dynobj == NULL)
2720                 htab->root.dynobj = abfd;
2721               if (!create_got_section (htab->root.dynobj, info))
2722                 return FALSE;
2723             }
2724           break;
2725
2726           /* This relocation describes the C++ object vtable hierarchy.
2727              Reconstruct it for later use during GC.  */
2728         case R_NIOS2_GNU_VTINHERIT:
2729           if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
2730             return FALSE;
2731           break;
2732
2733           /* This relocation describes which C++ vtable entries are actually
2734              used.  Record for later use during GC.  */
2735         case R_NIOS2_GNU_VTENTRY:
2736           if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
2737             return FALSE;
2738           break;
2739
2740         case R_NIOS2_BFD_RELOC_32:
2741         case R_NIOS2_CALL26:
2742         case R_NIOS2_HIADJ16:
2743         case R_NIOS2_LO16:
2744
2745           if (h != NULL)
2746             {
2747               /* If this reloc is in a read-only section, we might
2748                    need a copy reloc.  We can't check reliably at this
2749                    stage whether the section is read-only, as input
2750                    sections have not yet been mapped to output sections.
2751                    Tentatively set the flag for now, and correct in
2752                    adjust_dynamic_symbol.  */
2753               if (!info->shared)
2754                 h->non_got_ref = 1;
2755
2756               /* Make sure a plt entry is created for this symbol if it
2757                  turns out to be a function defined by a dynamic object.  */
2758               h->plt.refcount++;
2759
2760               if (r_type == R_NIOS2_CALL26)
2761                 h->needs_plt = 1;
2762             }
2763
2764           /* If we are creating a shared library, we need to copy the
2765              reloc into the shared library.  */
2766           if (info->shared
2767               && (sec->flags & SEC_ALLOC) != 0
2768               && (r_type == R_NIOS2_BFD_RELOC_32
2769                   || (h != NULL && ! h->needs_plt
2770                       && (! info->symbolic || ! h->def_regular))))
2771             {
2772               struct elf32_nios2_dyn_relocs *p;
2773               struct elf32_nios2_dyn_relocs **head;
2774
2775               /* When creating a shared object, we must copy these
2776                  reloc types into the output file.  We create a reloc
2777                  section in dynobj and make room for this reloc.  */
2778               if (sreloc == NULL)
2779                 {
2780                   sreloc = _bfd_elf_make_dynamic_reloc_section
2781                     (sec, dynobj, 2, abfd, TRUE);
2782                   if (sreloc == NULL)
2783                     return FALSE;
2784                 }
2785
2786               /* If this is a global symbol, we count the number of
2787                  relocations we need for this symbol.  */
2788               if (h != NULL)
2789                 head = &((struct elf32_nios2_link_hash_entry *) h)->dyn_relocs;
2790               else
2791                 {
2792                   /* Track dynamic relocs needed for local syms too.
2793                      We really need local syms available to do this
2794                      easily.  Oh well.  */
2795
2796                   asection *s;
2797                   void *vpp;
2798                   Elf_Internal_Sym *isym;
2799
2800                   isym = bfd_sym_from_r_symndx (&htab->sym_cache,
2801                                                 abfd, r_symndx);
2802                   if (isym == NULL)
2803                     return FALSE;
2804
2805                   s = bfd_section_from_elf_index (abfd, isym->st_shndx);
2806                   if (s == NULL)
2807                     s = sec;
2808
2809                   vpp = &elf_section_data (s)->local_dynrel;
2810                   head = (struct elf32_nios2_dyn_relocs **) vpp;
2811                 }
2812
2813               p = *head;
2814               if (p == NULL || p->sec != sec)
2815                 {
2816                   bfd_size_type amt = sizeof *p;
2817                   p = ((struct elf32_nios2_dyn_relocs *)
2818                        bfd_alloc (htab->root.dynobj, amt));
2819                   if (p == NULL)
2820                     return FALSE;
2821                   p->next = *head;
2822                   *head = p;
2823                   p->sec = sec;
2824                   p->count = 0;
2825                   p->pc_count = 0;
2826                 }
2827
2828               p->count += 1;
2829
2830             }
2831           break;
2832         }
2833     }
2834
2835   return TRUE;
2836 }
2837
2838
2839 /* Implement elf_backend_gc_mark_hook:
2840    Return the section that should be marked against GC for a given
2841    relocation.  */
2842 static asection *
2843 nios2_elf32_gc_mark_hook (asection *sec,
2844                           struct bfd_link_info *info,
2845                           Elf_Internal_Rela *rel,
2846                           struct elf_link_hash_entry *h,
2847                           Elf_Internal_Sym *sym)
2848 {
2849   if (h != NULL)
2850     switch (ELF32_R_TYPE (rel->r_info))
2851       {
2852       case R_NIOS2_GNU_VTINHERIT:
2853       case R_NIOS2_GNU_VTENTRY:
2854         return NULL;
2855       }
2856   return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
2857 }
2858
2859 /* Implement elf_backend_gc_sweep_hook:
2860    Update the got entry reference counts for the section being removed.  */
2861 static bfd_boolean
2862 nios2_elf32_gc_sweep_hook (bfd *abfd,
2863                            struct bfd_link_info *info,
2864                            asection *sec,
2865                            const Elf_Internal_Rela *relocs)
2866 {
2867   Elf_Internal_Shdr *symtab_hdr;
2868   struct elf_link_hash_entry **sym_hashes;
2869   bfd_signed_vma *local_got_refcounts;
2870   const Elf_Internal_Rela *rel, *relend;
2871   bfd *dynobj;
2872
2873   if (info->relocatable)
2874     return TRUE;
2875
2876   elf_section_data (sec)->local_dynrel = NULL;
2877
2878   dynobj = elf_hash_table (info)->dynobj;
2879   if (dynobj == NULL)
2880     return TRUE;
2881
2882   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
2883   sym_hashes = elf_sym_hashes (abfd);
2884   local_got_refcounts = elf_local_got_refcounts (abfd);
2885
2886   relend = relocs + sec->reloc_count;
2887   for (rel = relocs; rel < relend; rel++)
2888     {
2889       unsigned long r_symndx;
2890       struct elf_link_hash_entry *h = NULL;
2891       int r_type;
2892
2893       r_symndx = ELF32_R_SYM (rel->r_info);
2894       if (r_symndx >= symtab_hdr->sh_info)
2895         {
2896           h = sym_hashes[r_symndx - symtab_hdr->sh_info];
2897           while (h->root.type == bfd_link_hash_indirect
2898                  || h->root.type == bfd_link_hash_warning)
2899             h = (struct elf_link_hash_entry *) h->root.u.i.link;
2900         }
2901
2902       r_type = ELF32_R_TYPE (rel->r_info);
2903       switch (r_type)
2904         {
2905         case R_NIOS2_GOT16:
2906         case R_NIOS2_CALL16:
2907           if (h != NULL)
2908             {
2909               if (h->got.refcount > 0)
2910                 --h->got.refcount;
2911             }
2912           else if (local_got_refcounts != NULL)
2913             {
2914               if (local_got_refcounts[r_symndx] > 0)
2915                 --local_got_refcounts[r_symndx];
2916             }
2917           break;
2918
2919         case R_NIOS2_PCREL_LO:
2920         case R_NIOS2_PCREL_HA:
2921         case R_NIOS2_BFD_RELOC_32:
2922         case R_NIOS2_CALL26:
2923           if (h != NULL)
2924             {
2925               struct elf32_nios2_link_hash_entry *eh;
2926               struct elf32_nios2_dyn_relocs **pp;
2927               struct elf32_nios2_dyn_relocs *p;
2928
2929               eh = (struct elf32_nios2_link_hash_entry *) h;
2930
2931               if (h->plt.refcount > 0)
2932                 --h->plt.refcount;
2933
2934               if (r_type == R_NIOS2_PCREL_LO || r_type == R_NIOS2_PCREL_HA
2935                   || r_type == R_NIOS2_BFD_RELOC_32)
2936                 {
2937                   for (pp = &eh->dyn_relocs; (p = *pp) != NULL;
2938                        pp = &p->next)
2939                     if (p->sec == sec)
2940                       {
2941                         p->count -= 1;
2942                         if (p->count == 0)
2943                           *pp = p->next;
2944                         break;
2945                       }
2946                 }
2947             }
2948           break;
2949
2950         default:
2951           break;
2952         }
2953     }
2954
2955   return TRUE;
2956 }
2957
2958 /* Install 16-bit immediate value VALUE at offset OFFSET into section SEC.  */
2959 static void
2960 nios2_elf32_install_imm16 (asection *sec, bfd_vma offset, bfd_vma value)
2961 {
2962   bfd_vma word = bfd_get_32 (sec->owner, sec->contents + offset);
2963
2964   BFD_ASSERT(value <= 0xffff);
2965
2966   bfd_put_32 (sec->owner, word | ((value & 0xffff) << 6),
2967               sec->contents + offset);
2968 }
2969
2970 /* Install COUNT 32-bit values DATA starting at offset OFFSET into
2971    section SEC. */
2972 static void
2973 nios2_elf32_install_data (asection *sec, const bfd_vma *data, bfd_vma offset,
2974                           int count)
2975 {
2976   while (count--)
2977     {
2978       bfd_put_32 (sec->owner, *data, sec->contents + offset);
2979       offset += 4;
2980       ++data;
2981     }
2982 }
2983
2984 /* Implement elf_backend_finish_dynamic_symbols:
2985    Finish up dynamic symbol handling.  We set the contents of various
2986    dynamic sections here.  */
2987 static bfd_boolean
2988 nios2_elf32_finish_dynamic_symbol (bfd *output_bfd,
2989                                    struct bfd_link_info *info,
2990                                    struct elf_link_hash_entry *h,
2991                                    Elf_Internal_Sym *sym)
2992 {
2993   struct elf32_nios2_link_hash_table *htab;
2994   struct elf32_nios2_link_hash_entry *eh
2995     = (struct elf32_nios2_link_hash_entry *)h;
2996   int use_plt;
2997
2998   htab = elf32_nios2_hash_table (info);
2999
3000   if (h->plt.offset != (bfd_vma) -1)
3001     {
3002       asection *splt;
3003       asection *sgotplt;
3004       asection *srela;
3005       bfd_vma plt_index;
3006       bfd_vma got_offset;
3007       Elf_Internal_Rela rela;
3008       bfd_byte *loc;
3009       bfd_vma got_address;
3010
3011       /* This symbol has an entry in the procedure linkage table.  Set
3012          it up.  */
3013       BFD_ASSERT (h->dynindx != -1);
3014       splt = htab->root.splt;
3015       sgotplt = htab->root.sgotplt;
3016       srela = htab->root.srelplt;
3017       BFD_ASSERT (splt != NULL && sgotplt != NULL && srela != NULL);
3018
3019       /* Emit the PLT entry.  */
3020       if (info->shared)
3021         {
3022           nios2_elf32_install_data (splt, nios2_so_plt_entry, h->plt.offset,
3023                                     3);
3024           plt_index = (h->plt.offset - 24) / 12;
3025           got_offset = (plt_index + 3) * 4;
3026           nios2_elf32_install_imm16 (splt, h->plt.offset,
3027                                      hiadj(plt_index * 4));
3028           nios2_elf32_install_imm16 (splt, h->plt.offset + 4,
3029                                      (plt_index * 4) & 0xffff);
3030           nios2_elf32_install_imm16 (splt, h->plt.offset + 8,
3031                                      0xfff4 - h->plt.offset);
3032           got_address = (sgotplt->output_section->vma + sgotplt->output_offset
3033                          + got_offset);
3034
3035           /* Fill in the entry in the global offset table.  There are no
3036              res_n slots for a shared object PLT, instead the .got.plt entries
3037              point to the PLT entries.  */
3038           bfd_put_32 (output_bfd,
3039                       splt->output_section->vma + splt->output_offset
3040                       + h->plt.offset, sgotplt->contents + got_offset);
3041         }
3042       else
3043         {
3044           plt_index = (h->plt.offset - 28 - htab->res_n_size) / 12;
3045           got_offset = (plt_index + 3) * 4;
3046
3047           nios2_elf32_install_data (splt, nios2_plt_entry, h->plt.offset, 3);
3048           got_address = (sgotplt->output_section->vma + sgotplt->output_offset
3049                          + got_offset);
3050           nios2_elf32_install_imm16 (splt, h->plt.offset, hiadj(got_address));
3051           nios2_elf32_install_imm16 (splt, h->plt.offset + 4,
3052                                      got_address & 0xffff);
3053
3054           /* Fill in the entry in the global offset table.  */
3055           bfd_put_32 (output_bfd,
3056                       splt->output_section->vma + splt->output_offset
3057                       + plt_index * 4, sgotplt->contents + got_offset);
3058         }
3059
3060       /* Fill in the entry in the .rela.plt section.  */
3061       rela.r_offset = got_address;
3062       rela.r_info = ELF32_R_INFO (h->dynindx, R_NIOS2_JUMP_SLOT);
3063       rela.r_addend = 0;
3064       loc = srela->contents + plt_index * sizeof (Elf32_External_Rela);
3065       bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
3066
3067       if (!h->def_regular)
3068         {
3069           /* Mark the symbol as undefined, rather than as defined in
3070              the .plt section.  Leave the value alone.  */
3071           sym->st_shndx = SHN_UNDEF;
3072           /* If the symbol is weak, we do need to clear the value.
3073              Otherwise, the PLT entry would provide a definition for
3074              the symbol even if the symbol wasn't defined anywhere,
3075              and so the symbol would never be NULL.  */
3076           if (!h->ref_regular_nonweak)
3077             sym->st_value = 0;
3078         }
3079     }
3080
3081   use_plt = (eh->got_types_used == CALL16_USED
3082              && h->plt.offset != (bfd_vma) -1);
3083
3084   if (!use_plt && h->got.offset != (bfd_vma) -1
3085       && (elf32_nios2_hash_entry (h)->tls_type & GOT_TLS_GD) == 0
3086       && (elf32_nios2_hash_entry (h)->tls_type & GOT_TLS_IE) == 0)
3087     {
3088       asection *sgot;
3089       asection *srela;
3090       Elf_Internal_Rela rela;
3091       bfd_byte *loc;
3092       bfd_vma offset;
3093
3094       /* This symbol has an entry in the global offset table.  Set it
3095          up.  */
3096       sgot = htab->root.sgot;
3097       srela = htab->root.srelgot;
3098       BFD_ASSERT (sgot != NULL && srela != NULL);
3099
3100       offset = (h->got.offset & ~(bfd_vma) 1);
3101       rela.r_offset = (sgot->output_section->vma
3102                        + sgot->output_offset + offset);
3103
3104       /* If this is a -Bsymbolic link, and the symbol is defined
3105          locally, we just want to emit a RELATIVE reloc.  Likewise if
3106          the symbol was forced to be local because of a version file.
3107          The entry in the global offset table will already have been
3108          initialized in the relocate_section function.  */
3109
3110       if (info->shared && SYMBOL_REFERENCES_LOCAL (info, h))
3111         {
3112           rela.r_info = ELF32_R_INFO (0, R_NIOS2_RELATIVE);
3113           rela.r_addend = bfd_get_signed_32 (output_bfd,
3114                                              (sgot->contents + offset));
3115           bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + offset);
3116         }
3117       else
3118         {
3119           bfd_put_32 (output_bfd, (bfd_vma) 0,
3120                       sgot->contents + offset);
3121           rela.r_info = ELF32_R_INFO (h->dynindx, R_NIOS2_GLOB_DAT);
3122           rela.r_addend = 0;
3123         }
3124
3125       loc = srela->contents;
3126       loc += srela->reloc_count++ * sizeof (Elf32_External_Rela);
3127       bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
3128     }
3129
3130   if (use_plt && h->got.offset != (bfd_vma) -1)
3131     {
3132       bfd_vma offset = (h->got.offset & ~(bfd_vma) 1);
3133       asection *sgot = htab->root.sgot;
3134       asection *splt = htab->root.splt;
3135       bfd_put_32 (output_bfd, (splt->output_section->vma + splt->output_offset
3136                                + h->plt.offset),
3137                   sgot->contents + offset);
3138     }
3139
3140   if (h->needs_copy)
3141     {
3142       asection *s;
3143       Elf_Internal_Rela rela;
3144       bfd_byte *loc;
3145
3146       /* This symbol needs a copy reloc.  Set it up.  */
3147       BFD_ASSERT (h->dynindx != -1
3148                   && (h->root.type == bfd_link_hash_defined
3149                       || h->root.type == bfd_link_hash_defweak));
3150
3151       s = htab->srelbss;
3152       BFD_ASSERT (s != NULL);
3153
3154       rela.r_offset = (h->root.u.def.value
3155                        + h->root.u.def.section->output_section->vma
3156                        + h->root.u.def.section->output_offset);
3157       rela.r_info = ELF32_R_INFO (h->dynindx, R_NIOS2_COPY);
3158       rela.r_addend = 0;
3159       loc = s->contents + s->reloc_count++ * sizeof (Elf32_External_Rela);
3160       bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
3161     }
3162
3163   /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute.  */
3164   if (strcmp (h->root.root.string, "_DYNAMIC") == 0
3165       || h == elf_hash_table (info)->hgot)
3166     sym->st_shndx = SHN_ABS;
3167
3168   return TRUE;
3169 }
3170
3171 /* Implement elf_backend_finish_dynamic_sections.  */
3172 static bfd_boolean
3173 nios2_elf32_finish_dynamic_sections (bfd *output_bfd,
3174                                      struct bfd_link_info *info)
3175 {
3176   bfd *dynobj;
3177   asection *sgotplt;
3178   asection *sdyn;
3179   struct elf32_nios2_link_hash_table *htab;
3180
3181   htab = elf32_nios2_hash_table (info);
3182   dynobj = elf_hash_table (info)->dynobj;
3183   sgotplt = htab->root.sgotplt;
3184   BFD_ASSERT (sgotplt != NULL);
3185   sdyn = bfd_get_linker_section (dynobj, ".dynamic");
3186
3187   if (elf_hash_table (info)->dynamic_sections_created)
3188     {
3189       asection *splt;
3190       Elf32_External_Dyn *dyncon, *dynconend;
3191
3192       splt = htab->root.splt;
3193       BFD_ASSERT (splt != NULL && sdyn != NULL);
3194
3195       dyncon = (Elf32_External_Dyn *) sdyn->contents;
3196       dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
3197       for (; dyncon < dynconend; dyncon++)
3198         {
3199           Elf_Internal_Dyn dyn;
3200           asection *s;
3201
3202           bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
3203
3204           switch (dyn.d_tag)
3205             {
3206             default:
3207               break;
3208
3209             case DT_PLTGOT:
3210               s = htab->root.sgot;
3211               BFD_ASSERT (s != NULL);
3212               dyn.d_un.d_ptr = s->output_section->vma;
3213               bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
3214               break;
3215
3216             case DT_JMPREL:
3217               s = htab->root.srelplt;
3218               BFD_ASSERT (s != NULL);
3219               dyn.d_un.d_ptr = s->output_section->vma;
3220               bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
3221               break;
3222
3223             case DT_PLTRELSZ:
3224               s = htab->root.srelplt;
3225               BFD_ASSERT (s != NULL);
3226               dyn.d_un.d_val = s->size;
3227               bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
3228               break;
3229
3230             case DT_RELASZ:
3231               /* The procedure linkage table relocs (DT_JMPREL) should
3232                  not be included in the overall relocs (DT_RELA).
3233                  Therefore, we override the DT_RELASZ entry here to
3234                  make it not include the JMPREL relocs.  Since the
3235                  linker script arranges for .rela.plt to follow all
3236                  other relocation sections, we don't have to worry
3237                  about changing the DT_RELA entry.  */
3238               s = htab->root.srelplt;
3239               if (s != NULL)
3240                 dyn.d_un.d_val -= s->size;
3241               bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
3242               break;
3243
3244             case DT_NIOS2_GP:
3245               s = htab->root.sgot;
3246               BFD_ASSERT (s != NULL);
3247               dyn.d_un.d_ptr = s->output_section->vma + 0x7ff0;
3248               bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
3249               break;
3250             }
3251         }
3252
3253       /* Fill in the first entry in the procedure linkage table.  */
3254       if (splt->size > 0)
3255         {
3256           bfd_vma got_address = (sgotplt->output_section->vma
3257                                  + sgotplt->output_offset);
3258           if (info->shared)
3259             {
3260               bfd_vma corrected = got_address - (splt->output_section->vma
3261                                                  + splt->output_offset + 4);
3262               nios2_elf32_install_data (splt, nios2_so_plt0_entry, 0, 6);
3263               nios2_elf32_install_imm16 (splt, 4, hiadj (corrected));
3264               nios2_elf32_install_imm16 (splt, 12, (corrected & 0xffff) + 4);
3265               nios2_elf32_install_imm16 (splt, 16, (corrected & 0xffff) + 8);
3266             }
3267           else
3268             {
3269               /* Divide by 4 here, not 3 because we already corrected for the
3270                  res_N branches.  */
3271               bfd_vma res_size = (splt->size - 28) / 4;
3272               bfd_vma res_start = (splt->output_section->vma
3273                                    + splt->output_offset);
3274               bfd_vma res_offset;
3275
3276               for (res_offset = 0; res_offset < res_size; res_offset += 4)
3277                 bfd_put_32 (output_bfd,
3278                             6 | ((res_size - (res_offset + 4)) << 6),
3279                             splt->contents + res_offset);
3280
3281               nios2_elf32_install_data (splt, nios2_plt0_entry, res_size, 7);
3282               nios2_elf32_install_imm16 (splt, res_size, hiadj (res_start));
3283               nios2_elf32_install_imm16 (splt, res_size + 4,
3284                                          res_start & 0xffff);
3285               nios2_elf32_install_imm16 (splt, res_size + 12,
3286                                          hiadj (got_address));
3287               nios2_elf32_install_imm16 (splt, res_size + 16,
3288                                          (got_address & 0xffff) + 4);
3289               nios2_elf32_install_imm16 (splt, res_size + 20,
3290                                          (got_address & 0xffff) + 8);
3291             }
3292         }
3293     }
3294   /* Fill in the first three entries in the global offset table.  */
3295   if (sgotplt->size > 0)
3296     {
3297       if (sdyn == NULL)
3298         bfd_put_32 (output_bfd, (bfd_vma) 0, sgotplt->contents);
3299       else
3300         bfd_put_32 (output_bfd,
3301                     sdyn->output_section->vma + sdyn->output_offset,
3302                     sgotplt->contents);
3303       bfd_put_32 (output_bfd, (bfd_vma) 0, sgotplt->contents + 4);
3304       bfd_put_32 (output_bfd, (bfd_vma) 0, sgotplt->contents + 8);
3305     }
3306
3307   elf_section_data (sgotplt->output_section)->this_hdr.sh_entsize = 4;
3308
3309   return TRUE;
3310 }
3311
3312 /* Implement elf_backend_adjust_dynamic_symbol:
3313    Adjust a symbol defined by a dynamic object and referenced by a
3314    regular object.  The current definition is in some section of the
3315    dynamic object, but we're not including those sections.  We have to
3316    change the definition to something the rest of the link can
3317    understand.  */
3318 static bfd_boolean
3319 nios2_elf32_adjust_dynamic_symbol (struct bfd_link_info *info,
3320                                    struct elf_link_hash_entry *h)
3321 {
3322   struct elf32_nios2_link_hash_table *htab;
3323   bfd *dynobj;
3324   asection *s;
3325   unsigned align2;
3326
3327   htab = elf32_nios2_hash_table (info);
3328   dynobj = elf_hash_table (info)->dynobj;
3329
3330   /* Make sure we know what is going on here.  */
3331   BFD_ASSERT (dynobj != NULL
3332               && (h->needs_plt
3333                   || h->u.weakdef != NULL
3334                   || (h->def_dynamic
3335                       && h->ref_regular
3336                       && !h->def_regular)));
3337
3338   /* If this is a function, put it in the procedure linkage table.  We
3339      will fill in the contents of the procedure linkage table later,
3340      when we know the address of the .got section.  */
3341   if (h->type == STT_FUNC || h->needs_plt)
3342     {
3343       if (h->plt.refcount <= 0
3344           || SYMBOL_CALLS_LOCAL (info, h)
3345           || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
3346               && h->root.type == bfd_link_hash_undefweak))
3347         {
3348           /* This case can occur if we saw a PLT reloc in an input
3349              file, but the symbol was never referred to by a dynamic
3350              object, or if all references were garbage collected.  In
3351              such a case, we don't actually need to build a procedure
3352              linkage table, and we can just do a PCREL reloc instead.  */
3353           h->plt.offset = (bfd_vma) -1;
3354           h->needs_plt = 0;
3355         }
3356
3357       return TRUE;
3358     }
3359
3360   /* Reinitialize the plt offset now that it is not used as a reference
3361      count any more.  */
3362   h->plt.offset = (bfd_vma) -1;
3363
3364   /* If this is a weak symbol, and there is a real definition, the
3365      processor independent code will have arranged for us to see the
3366      real definition first, and we can just use the same value.  */
3367   if (h->u.weakdef != NULL)
3368     {
3369       BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
3370                   || h->u.weakdef->root.type == bfd_link_hash_defweak);
3371       h->root.u.def.section = h->u.weakdef->root.u.def.section;
3372       h->root.u.def.value = h->u.weakdef->root.u.def.value;
3373       return TRUE;
3374     }
3375
3376   /* If there are no non-GOT references, we do not need a copy
3377      relocation.  */
3378   if (!h->non_got_ref)
3379     return TRUE;
3380
3381   /* This is a reference to a symbol defined by a dynamic object which
3382      is not a function.
3383      If we are creating a shared library, we must presume that the
3384      only references to the symbol are via the global offset table.
3385      For such cases we need not do anything here; the relocations will
3386      be handled correctly by relocate_section.  */
3387   if (info->shared)
3388     return TRUE;
3389
3390   if (h->size == 0)
3391     {
3392       (*_bfd_error_handler) (_("dynamic variable `%s' is zero size"),
3393                              h->root.root.string);
3394       return TRUE;
3395     }
3396
3397   /* We must allocate the symbol in our .dynbss section, which will
3398      become part of the .bss section of the executable.  There will be
3399      an entry for this symbol in the .dynsym section.  The dynamic
3400      object will contain position independent code, so all references
3401      from the dynamic object to this symbol will go through the global
3402      offset table.  The dynamic linker will use the .dynsym entry to
3403      determine the address it must put in the global offset table, so
3404      both the dynamic object and the regular object will refer to the
3405      same memory location for the variable.  */
3406   s = htab->sdynbss;
3407   BFD_ASSERT (s != NULL);
3408
3409   /* We must generate a R_NIOS2_COPY reloc to tell the dynamic linker to
3410      copy the initial value out of the dynamic object and into the
3411      runtime process image.  We need to remember the offset into the
3412      .rela.bss section we are going to use.  */
3413   if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
3414     {
3415       asection *srel;
3416
3417       srel = htab->srelbss;
3418       BFD_ASSERT (srel != NULL);
3419       srel->size += sizeof (Elf32_External_Rela);
3420       h->needs_copy = 1;
3421     }
3422
3423   align2 = bfd_log2 (h->size);
3424   if (align2 > h->root.u.def.section->alignment_power)
3425     align2 = h->root.u.def.section->alignment_power;
3426
3427   /* Align dynbss.  */
3428   s->size = BFD_ALIGN (s->size, (bfd_size_type)1 << align2);
3429   if (align2 > bfd_get_section_alignment (dynobj, s)
3430       && !bfd_set_section_alignment (dynobj, s, align2))
3431     return FALSE;
3432
3433   /* Define the symbol as being at this point in the section.  */
3434   h->root.u.def.section = s;
3435   h->root.u.def.value = s->size;
3436
3437   /* Increment the section size to make room for the symbol.  */
3438   s->size += h->size;
3439
3440   return TRUE;
3441 }
3442
3443 /* Worker function for nios2_elf32_size_dynamic_sections.  */
3444 static bfd_boolean
3445 adjust_dynrelocs (struct elf_link_hash_entry *h, PTR inf)
3446 {
3447   struct bfd_link_info *info;
3448   struct elf32_nios2_link_hash_table *htab;
3449
3450   if (h->root.type == bfd_link_hash_indirect)
3451     return TRUE;
3452
3453   if (h->root.type == bfd_link_hash_warning)
3454     /* When warning symbols are created, they **replace** the "real"
3455        entry in the hash table, thus we never get to see the real
3456        symbol in a hash traversal.  So look at it now.  */
3457     h = (struct elf_link_hash_entry *) h->root.u.i.link;
3458
3459   info = (struct bfd_link_info *) inf;
3460   htab = elf32_nios2_hash_table (info);
3461
3462   if (h->plt.offset != (bfd_vma)-1)
3463     h->plt.offset += htab->res_n_size;
3464   if (htab->root.splt == h->root.u.def.section)
3465     h->root.u.def.value += htab->res_n_size;
3466
3467   return TRUE;
3468 }
3469
3470 /* Another worker function for nios2_elf32_size_dynamic_sections.
3471    Allocate space in .plt, .got and associated reloc sections for
3472    dynamic relocs.  */
3473 static bfd_boolean
3474 allocate_dynrelocs (struct elf_link_hash_entry *h, PTR inf)
3475 {
3476   struct bfd_link_info *info;
3477   struct elf32_nios2_link_hash_table *htab;
3478   struct elf32_nios2_link_hash_entry *eh;
3479   struct elf32_nios2_dyn_relocs *p;
3480   int use_plt;
3481
3482   if (h->root.type == bfd_link_hash_indirect)
3483     return TRUE;
3484
3485   if (h->root.type == bfd_link_hash_warning)
3486     /* When warning symbols are created, they **replace** the "real"
3487        entry in the hash table, thus we never get to see the real
3488        symbol in a hash traversal.  So look at it now.  */
3489     h = (struct elf_link_hash_entry *) h->root.u.i.link;
3490
3491   info = (struct bfd_link_info *) inf;
3492   htab = elf32_nios2_hash_table (info);
3493
3494   if (htab->root.dynamic_sections_created
3495       && h->plt.refcount > 0)
3496     {
3497       /* Make sure this symbol is output as a dynamic symbol.
3498          Undefined weak syms won't yet be marked as dynamic.  */
3499       if (h->dynindx == -1
3500           && !h->forced_local
3501           && !bfd_elf_link_record_dynamic_symbol (info, h))
3502         return FALSE;
3503
3504       if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, info->shared, h))
3505         {
3506           asection *s = htab->root.splt;
3507
3508           /* Allocate room for the header.  */
3509           if (s->size == 0)
3510             {
3511               if (info->shared)
3512                 s->size = 24;
3513               else
3514                 s->size = 28;
3515             }
3516
3517           h->plt.offset = s->size;
3518
3519           /* If this symbol is not defined in a regular file, and we are
3520              not generating a shared library, then set the symbol to this
3521              location in the .plt.  This is required to make function
3522              pointers compare as equal between the normal executable and
3523              the shared library.  */
3524           if (! info->shared
3525               && !h->def_regular)
3526             {
3527               h->root.u.def.section = s;
3528               h->root.u.def.value = h->plt.offset;
3529             }
3530
3531           /* Make room for this entry.  */
3532           s->size += 12;
3533
3534           /* We also need to make an entry in the .rela.plt section.  */
3535           htab->root.srelplt->size += sizeof (Elf32_External_Rela);
3536
3537           /* And the .got.plt section.  */
3538           htab->root.sgotplt->size += 4;
3539         }
3540       else
3541         {
3542           h->plt.offset = (bfd_vma) -1;
3543           h->needs_plt = 0;
3544         }
3545     }
3546   else
3547     {
3548       h->plt.offset = (bfd_vma) -1;
3549       h->needs_plt = 0;
3550     }
3551
3552   eh = (struct elf32_nios2_link_hash_entry *) h;
3553   use_plt = (eh->got_types_used == CALL16_USED
3554              && h->plt.offset != (bfd_vma) -1);
3555
3556   if (h->got.refcount > 0)
3557     {
3558       asection *s;
3559       bfd_boolean dyn;
3560       int tls_type = eh->tls_type;
3561       int indx;
3562
3563       /* Make sure this symbol is output as a dynamic symbol.
3564          Undefined weak syms won't yet be marked as dynamic.  */
3565       if (h->dynindx == -1
3566           && !h->forced_local
3567           && !bfd_elf_link_record_dynamic_symbol (info, h))
3568         return FALSE;
3569
3570       s = htab->root.sgot;
3571       h->got.offset = s->size;
3572
3573       if (tls_type == GOT_UNKNOWN)
3574         abort ();
3575
3576       if (tls_type == GOT_NORMAL)
3577         /* Non-TLS symbols need one GOT slot.  */
3578         s->size += 4;
3579       else
3580         {
3581           if (tls_type & GOT_TLS_GD)
3582             /* R_NIOS2_TLS_GD16 needs 2 consecutive GOT slots.  */
3583             s->size += 8;
3584           if (tls_type & GOT_TLS_IE)
3585             /* R_NIOS2_TLS_IE16 needs one GOT slot.  */
3586             s->size += 4;
3587         }
3588
3589       dyn = htab->root.dynamic_sections_created;
3590
3591       indx = 0;
3592       if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
3593           && (!info->shared
3594               || !SYMBOL_REFERENCES_LOCAL (info, h)))
3595         indx = h->dynindx;
3596
3597       if (tls_type != GOT_NORMAL
3598           && (info->shared || indx != 0)
3599           && (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
3600               || h->root.type != bfd_link_hash_undefweak))
3601         {
3602           if (tls_type & GOT_TLS_IE)
3603             htab->root.srelgot->size += sizeof (Elf32_External_Rela);
3604
3605           if (tls_type & GOT_TLS_GD)
3606             htab->root.srelgot->size += sizeof (Elf32_External_Rela);
3607
3608           if ((tls_type & GOT_TLS_GD) && indx != 0)
3609             htab->root.srelgot->size += sizeof (Elf32_External_Rela);
3610         }
3611       else if ((ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
3612                 || h->root.type != bfd_link_hash_undefweak)
3613                && !use_plt
3614                && (info->shared
3615                    || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h)))
3616         htab->root.srelgot->size += sizeof (Elf32_External_Rela);
3617     }
3618   else
3619     h->got.offset = (bfd_vma) -1;
3620
3621   if (eh->dyn_relocs == NULL)
3622     return TRUE;
3623
3624   /* In the shared -Bsymbolic case, discard space allocated for
3625      dynamic pc-relative relocs against symbols which turn out to be
3626      defined in regular objects.  For the normal shared case, discard
3627      space for pc-relative relocs that have become local due to symbol
3628      visibility changes.  */
3629
3630   if (info->shared)
3631     {
3632       if (h->def_regular
3633           && (h->forced_local || info->symbolic))
3634         {
3635           struct elf32_nios2_dyn_relocs **pp;
3636
3637           for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
3638             {
3639               p->count -= p->pc_count;
3640               p->pc_count = 0;
3641               if (p->count == 0)
3642                 *pp = p->next;
3643               else
3644                 pp = &p->next;
3645             }
3646         }
3647
3648       /* Also discard relocs on undefined weak syms with non-default
3649          visibility.  */
3650       if (eh->dyn_relocs != NULL
3651           && h->root.type == bfd_link_hash_undefweak)
3652         {
3653           if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
3654             eh->dyn_relocs = NULL;
3655
3656           /* Make sure undefined weak symbols are output as a dynamic
3657              symbol in PIEs.  */
3658           else if (h->dynindx == -1
3659                    && !h->forced_local
3660                    && !bfd_elf_link_record_dynamic_symbol (info, h))
3661             return FALSE;
3662         }
3663     }
3664   else
3665     {
3666       /* For the non-shared case, discard space for relocs against
3667          symbols which turn out to need copy relocs or are not
3668          dynamic.  */
3669
3670       if (!h->non_got_ref
3671           && ((h->def_dynamic && !h->def_regular)
3672               || (htab->root.dynamic_sections_created
3673                   && (h->root.type == bfd_link_hash_undefweak
3674                       || h->root.type == bfd_link_hash_undefined))))
3675         {
3676           /* Make sure this symbol is output as a dynamic symbol.
3677              Undefined weak syms won't yet be marked as dynamic.  */
3678           if (h->dynindx == -1
3679               && !h->forced_local
3680               && !bfd_elf_link_record_dynamic_symbol (info, h))
3681             return FALSE;
3682
3683           /* If that succeeded, we know we'll be keeping all the
3684              relocs.  */
3685           if (h->dynindx != -1)
3686             goto keep;
3687         }
3688
3689       eh->dyn_relocs = NULL;
3690
3691     keep: ;
3692     }
3693
3694   /* Finally, allocate space.  */
3695   for (p = eh->dyn_relocs; p != NULL; p = p->next)
3696     {
3697       asection *sreloc = elf_section_data (p->sec)->sreloc;
3698       sreloc->size += p->count * sizeof (Elf32_External_Rela);
3699     }
3700
3701   return TRUE;
3702 }
3703
3704 /* Implement elf_backend_size_dynamic_sections:
3705    Set the sizes of the dynamic sections.  */
3706 static bfd_boolean
3707 nios2_elf32_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
3708                                    struct bfd_link_info *info)
3709 {
3710   bfd *dynobj;
3711   asection *s;
3712   bfd_boolean plt;
3713   bfd_boolean got;
3714   bfd_boolean relocs;
3715   bfd *ibfd;
3716   struct elf32_nios2_link_hash_table *htab;
3717
3718   htab = elf32_nios2_hash_table (info);
3719   dynobj = elf_hash_table (info)->dynobj;
3720   BFD_ASSERT (dynobj != NULL);
3721
3722   htab->res_n_size = 0;
3723   if (elf_hash_table (info)->dynamic_sections_created)
3724     {
3725       /* Set the contents of the .interp section to the interpreter.  */
3726       if (info->executable)
3727         {
3728           s = bfd_get_linker_section (dynobj, ".interp");
3729           BFD_ASSERT (s != NULL);
3730           s->size = sizeof ELF_DYNAMIC_INTERPRETER;
3731           s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
3732         }
3733     }
3734   else
3735     {
3736       /* We may have created entries in the .rela.got section.
3737          However, if we are not creating the dynamic sections, we will
3738          not actually use these entries.  Reset the size of .rela.got,
3739          which will cause it to get stripped from the output file
3740          below.  */
3741       s = htab->root.srelgot;
3742       if (s != NULL)
3743         s->size = 0;
3744     }
3745
3746   /* Set up .got offsets for local syms, and space for local dynamic
3747      relocs.  */
3748   for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
3749     {
3750       bfd_signed_vma *local_got;
3751       bfd_signed_vma *end_local_got;
3752       char *local_tls_type;
3753       bfd_size_type locsymcount;
3754       Elf_Internal_Shdr *symtab_hdr;
3755       asection *srel;
3756
3757       if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour)
3758         continue;
3759
3760       for (s = ibfd->sections; s != NULL; s = s->next)
3761         {
3762           struct elf32_nios2_dyn_relocs *p;
3763
3764           for (p = elf_section_data (s)->local_dynrel; p != NULL; p = p->next)
3765             {
3766               if (!bfd_is_abs_section (p->sec)
3767                   && bfd_is_abs_section (p->sec->output_section))
3768                 {
3769                   /* Input section has been discarded, either because
3770                      it is a copy of a linkonce section or due to
3771                      linker script /DISCARD/, so we'll be discarding
3772                      the relocs too.  */
3773                 }
3774               else if (p->count != 0)
3775                 {
3776                   srel = elf_section_data (p->sec)->sreloc;
3777                   srel->size += p->count * sizeof (Elf32_External_Rela);
3778                   if ((p->sec->output_section->flags & SEC_READONLY) != 0)
3779                     info->flags |= DF_TEXTREL;
3780                 }
3781             }
3782         }
3783
3784       local_got = elf_local_got_refcounts (ibfd);
3785       if (!local_got)
3786         continue;
3787
3788       symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
3789       locsymcount = symtab_hdr->sh_info;
3790       end_local_got = local_got + locsymcount;
3791       local_tls_type = elf32_nios2_local_got_tls_type (ibfd);
3792       s = htab->root.sgot;
3793       srel = htab->root.srelgot;
3794       for (; local_got < end_local_got; ++local_got, ++local_tls_type)
3795         {
3796           if (*local_got > 0)
3797             {
3798               *local_got = s->size;
3799               if (*local_tls_type & GOT_TLS_GD)
3800                 /* TLS_GD relocs need an 8-byte structure in the GOT.  */
3801                 s->size += 8;
3802               if (*local_tls_type & GOT_TLS_IE)
3803                 s->size += 4;
3804               if (*local_tls_type == GOT_NORMAL)
3805                 s->size += 4;
3806
3807               if (info->shared || *local_tls_type == GOT_TLS_GD)
3808                 srel->size += sizeof (Elf32_External_Rela);
3809             }
3810           else
3811             *local_got = (bfd_vma) -1;
3812         }
3813     }
3814
3815   if (htab->tls_ldm_got.refcount > 0)
3816     {
3817       /* Allocate two GOT entries and one dynamic relocation (if necessary)
3818          for R_NIOS2_TLS_LDM16 relocations.  */
3819       htab->tls_ldm_got.offset = htab->root.sgot->size;
3820       htab->root.sgot->size += 8;
3821       if (info->shared)
3822         htab->root.srelgot->size += sizeof (Elf32_External_Rela);
3823     }
3824   else
3825     htab->tls_ldm_got.offset = -1;
3826
3827   /* Allocate global sym .plt and .got entries, and space for global
3828      sym dynamic relocs.  */
3829   elf_link_hash_traverse (& htab->root, allocate_dynrelocs, info);
3830
3831   /* The check_relocs and adjust_dynamic_symbol entry points have
3832      determined the sizes of the various dynamic sections.  Allocate
3833      memory for them.  */
3834   plt = FALSE;
3835   got = FALSE;
3836   relocs = FALSE;
3837   for (s = dynobj->sections; s != NULL; s = s->next)
3838     {
3839       const char *name;
3840
3841       if ((s->flags & SEC_LINKER_CREATED) == 0)
3842         continue;
3843
3844       /* It's OK to base decisions on the section name, because none
3845          of the dynobj section names depend upon the input files.  */
3846       name = bfd_get_section_name (dynobj, s);
3847
3848       if (strcmp (name, ".plt") == 0)
3849         {
3850           /* Remember whether there is a PLT.  */
3851           plt = s->size != 0;
3852
3853           /* Correct for the number of res_N branches.  */
3854           if (plt && !info->shared)
3855             {
3856               htab->res_n_size = (s->size-28) / 3;
3857               s->size += htab->res_n_size;
3858             }
3859         }
3860       else if (CONST_STRNEQ (name, ".rela"))
3861         {
3862           if (s->size != 0)
3863             {
3864               relocs = TRUE;
3865
3866               /* We use the reloc_count field as a counter if we need
3867                  to copy relocs into the output file.  */
3868               s->reloc_count = 0;
3869             }
3870         }
3871       else if (CONST_STRNEQ (name, ".got"))
3872         got = s->size != 0;
3873       else if (strcmp (name, ".dynbss") != 0)
3874         /* It's not one of our sections, so don't allocate space.  */
3875         continue;
3876
3877       if (s->size == 0)
3878         {
3879           /* If we don't need this section, strip it from the
3880              output file.  This is mostly to handle .rela.bss and
3881              .rela.plt.  We must create both sections in
3882              create_dynamic_sections, because they must be created
3883              before the linker maps input sections to output
3884              sections.  The linker does that before
3885              adjust_dynamic_symbol is called, and it is that
3886              function which decides whether anything needs to go
3887              into these sections.  */
3888           s->flags |= SEC_EXCLUDE;
3889           continue;
3890         }
3891
3892       if ((s->flags & SEC_HAS_CONTENTS) == 0)
3893         continue;
3894
3895       /* Allocate memory for the section contents.  */
3896       /* FIXME: This should be a call to bfd_alloc not bfd_zalloc.
3897          Unused entries should be reclaimed before the section's contents
3898          are written out, but at the moment this does not happen.  Thus in
3899          order to prevent writing out garbage, we initialize the section's
3900          contents to zero.  */
3901       s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->size);
3902       if (s->contents == NULL)
3903         return FALSE;
3904     }
3905
3906   /* Adjust dynamic symbols that point to the plt to account for the
3907      now-known number of resN slots.  */
3908   if (htab->res_n_size)
3909     elf_link_hash_traverse (& htab->root, adjust_dynrelocs, info);
3910
3911   if (elf_hash_table (info)->dynamic_sections_created)
3912     {
3913       /* Add some entries to the .dynamic section.  We fill in the
3914          values later, in elf_nios2_finish_dynamic_sections, but we
3915          must add the entries now so that we get the correct size for
3916          the .dynamic section.  The DT_DEBUG entry is filled in by the
3917          dynamic linker and used by the debugger.  */
3918 #define add_dynamic_entry(TAG, VAL) \
3919   _bfd_elf_add_dynamic_entry (info, TAG, VAL)
3920
3921       if (!info->shared && !add_dynamic_entry (DT_DEBUG, 0))
3922         return FALSE;
3923
3924       if (got && !add_dynamic_entry (DT_PLTGOT, 0))
3925         return FALSE;
3926
3927       if (plt
3928           && (!add_dynamic_entry (DT_PLTRELSZ, 0)
3929               || !add_dynamic_entry (DT_PLTREL, DT_RELA)
3930               || !add_dynamic_entry (DT_JMPREL, 0)))
3931         return FALSE;
3932
3933       if (relocs
3934           && (!add_dynamic_entry (DT_RELA, 0)
3935               || !add_dynamic_entry (DT_RELASZ, 0)
3936               || !add_dynamic_entry (DT_RELAENT, sizeof (Elf32_External_Rela))))
3937         return FALSE;
3938
3939       if (!info->shared && !add_dynamic_entry (DT_NIOS2_GP, 0))
3940         return FALSE;
3941
3942       if ((info->flags & DF_TEXTREL) != 0
3943           && !add_dynamic_entry (DT_TEXTREL, 0))
3944         return FALSE;
3945     }
3946 #undef add_dynamic_entry
3947
3948   return TRUE;
3949 }
3950
3951 /* Implement bfd_elf32_bfd_link_hash_table_create.  */
3952 static struct bfd_link_hash_table *
3953 nios2_elf32_link_hash_table_create (bfd *abfd)
3954 {
3955   struct elf32_nios2_link_hash_table *ret;
3956   bfd_size_type amt = sizeof (struct elf32_nios2_link_hash_table);
3957
3958   ret = bfd_zmalloc (amt);
3959   if (ret == NULL)
3960     return NULL;
3961
3962   if (!_bfd_elf_link_hash_table_init (&ret->root, abfd,
3963                                       link_hash_newfunc,
3964                                       sizeof (struct
3965                                               elf32_nios2_link_hash_entry),
3966                                       NIOS2_ELF_DATA))
3967     {
3968       free (ret);
3969       return NULL;
3970     }
3971
3972   return &ret->root.root;
3973 }
3974
3975 /* Implement elf_backend_reloc_type_class.  */
3976 static enum elf_reloc_type_class
3977 nios2_elf32_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED,
3978                               const asection *rel_sec ATTRIBUTE_UNUSED,
3979                               const Elf_Internal_Rela *rela)
3980 {
3981   switch ((int) ELF32_R_TYPE (rela->r_info))
3982     {
3983     case R_NIOS2_RELATIVE:
3984       return reloc_class_relative;
3985     case R_NIOS2_JUMP_SLOT:
3986       return reloc_class_plt;
3987     case R_NIOS2_COPY:
3988       return reloc_class_copy;
3989     default:
3990       return reloc_class_normal;
3991     }
3992 }
3993
3994 /* Return 1 if target is one of ours.  */
3995 static bfd_boolean
3996 is_nios2_elf_target (const struct bfd_target *targ)
3997 {
3998   return (targ == &bfd_elf32_littlenios2_vec
3999           || targ == &bfd_elf32_bignios2_vec);
4000 }
4001
4002 /* Implement elf_backend_add_symbol_hook.
4003    This hook is called by the linker when adding symbols from an object
4004    file.  We use it to put .comm items in .sbss, and not .bss.  */
4005 static bfd_boolean
4006 nios2_elf_add_symbol_hook (bfd *abfd,
4007                            struct bfd_link_info *info,
4008                            Elf_Internal_Sym *sym,
4009                            const char **namep ATTRIBUTE_UNUSED,
4010                            flagword *flagsp ATTRIBUTE_UNUSED,
4011                            asection **secp,
4012                            bfd_vma *valp)
4013 {
4014   bfd *dynobj;
4015
4016   if (sym->st_shndx == SHN_COMMON
4017       && !info->relocatable
4018       && sym->st_size <= elf_gp_size (abfd)
4019       && is_nios2_elf_target (info->output_bfd->xvec))
4020     {
4021       /* Common symbols less than or equal to -G nn bytes are automatically
4022          put into .sbss.  */
4023       struct elf32_nios2_link_hash_table *htab;
4024
4025       htab = elf32_nios2_hash_table (info);
4026       if (htab->sbss == NULL)
4027         {
4028           flagword flags = SEC_IS_COMMON | SEC_LINKER_CREATED;
4029
4030           dynobj = elf_hash_table (info)->dynobj;
4031           if (!dynobj)
4032             dynobj = abfd;
4033
4034           htab->sbss = bfd_make_section_anyway_with_flags (dynobj, ".sbss",
4035                                                            flags);
4036           if (htab->sbss == NULL)
4037             return FALSE;
4038         }
4039
4040       *secp = htab->sbss;
4041       *valp = sym->st_size;
4042     }
4043
4044   return TRUE;
4045 }
4046
4047 /* Implement elf_backend_can_make_relative_eh_frame:
4048    Decide whether to attempt to turn absptr or lsda encodings in
4049    shared libraries into pcrel within the given input section.  */
4050 static bfd_boolean
4051 nios2_elf32_can_make_relative_eh_frame (bfd *input_bfd ATTRIBUTE_UNUSED,
4052                                         struct bfd_link_info *info
4053                                         ATTRIBUTE_UNUSED,
4054                                         asection *eh_frame_section
4055                                         ATTRIBUTE_UNUSED)
4056 {
4057   /* We can't use PC-relative encodings in the .eh_frame section.  */
4058   return FALSE;
4059 }
4060
4061 /* Implement elf_backend_special_sections.  */
4062 const struct bfd_elf_special_section elf32_nios2_special_sections[] =
4063 {
4064   { STRING_COMMA_LEN (".sbss"),  -2, SHT_NOBITS,
4065     SHF_ALLOC + SHF_WRITE + SHF_NIOS2_GPREL },
4066   { STRING_COMMA_LEN (".sdata"), -2, SHT_PROGBITS,
4067     SHF_ALLOC + SHF_WRITE + SHF_NIOS2_GPREL },
4068   { NULL,                     0,  0, 0,              0 }
4069 };
4070
4071 #define ELF_ARCH                        bfd_arch_nios2
4072 #define ELF_TARGET_ID                   NIOS2_ELF_DATA
4073 #define ELF_MACHINE_CODE                EM_ALTERA_NIOS2
4074
4075 /* The Nios II MMU uses a 4K page size.  */
4076
4077 #define ELF_MAXPAGESIZE                 0x1000
4078
4079 #define bfd_elf32_bfd_link_hash_table_create \
4080                                           nios2_elf32_link_hash_table_create
4081
4082 /* Relocation table lookup macros.  */
4083
4084 #define bfd_elf32_bfd_reloc_type_lookup   nios2_elf32_bfd_reloc_type_lookup
4085 #define bfd_elf32_bfd_reloc_name_lookup   nios2_elf32_bfd_reloc_name_lookup
4086
4087 /* JUMP_TABLE_LINK macros.  */
4088
4089 /* elf_info_to_howto (using RELA relocations).  */
4090
4091 #define elf_info_to_howto                 nios2_elf32_info_to_howto
4092
4093 /* elf backend functions.  */
4094
4095 #define elf_backend_can_gc_sections     1
4096 #define elf_backend_can_refcount        1
4097 #define elf_backend_plt_readonly        1
4098 #define elf_backend_want_got_plt        1
4099 #define elf_backend_rela_normal         1
4100
4101 #define elf_backend_relocate_section      nios2_elf32_relocate_section
4102 #define elf_backend_section_flags         nios2_elf32_section_flags
4103 #define elf_backend_fake_sections         nios2_elf32_fake_sections
4104 #define elf_backend_check_relocs          nios2_elf32_check_relocs
4105
4106 #define elf_backend_gc_mark_hook          nios2_elf32_gc_mark_hook
4107 #define elf_backend_gc_sweep_hook         nios2_elf32_gc_sweep_hook
4108 #define elf_backend_create_dynamic_sections \
4109                                           nios2_elf32_create_dynamic_sections
4110 #define elf_backend_finish_dynamic_symbol nios2_elf32_finish_dynamic_symbol
4111 #define elf_backend_finish_dynamic_sections \
4112                                           nios2_elf32_finish_dynamic_sections
4113 #define elf_backend_adjust_dynamic_symbol nios2_elf32_adjust_dynamic_symbol
4114 #define elf_backend_reloc_type_class      nios2_elf32_reloc_type_class
4115 #define elf_backend_size_dynamic_sections nios2_elf32_size_dynamic_sections
4116 #define elf_backend_add_symbol_hook       nios2_elf_add_symbol_hook
4117 #define elf_backend_copy_indirect_symbol  nios2_elf32_copy_indirect_symbol
4118
4119 #define elf_backend_grok_prstatus         nios2_grok_prstatus
4120 #define elf_backend_grok_psinfo           nios2_grok_psinfo
4121
4122 #undef elf_backend_can_make_relative_eh_frame
4123 #define elf_backend_can_make_relative_eh_frame \
4124                                           nios2_elf32_can_make_relative_eh_frame
4125
4126 #define elf_backend_special_sections      elf32_nios2_special_sections
4127
4128 #define TARGET_LITTLE_SYM               bfd_elf32_littlenios2_vec
4129 #define TARGET_LITTLE_NAME              "elf32-littlenios2"
4130 #define TARGET_BIG_SYM                  bfd_elf32_bignios2_vec
4131 #define TARGET_BIG_NAME                 "elf32-bignios2"
4132
4133 #define elf_backend_got_header_size     12
4134
4135 #include "elf32-target.h"