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