or1k: Add the l.adrp insn and supporting relocations
[external/binutils.git] / bfd / elf32-or1k.c
1 /* Or1k-specific support for 32-bit ELF.
2    Copyright (C) 2001-2018 Free Software Foundation, Inc.
3    Contributed for OR32 by Johan Rydberg, jrydberg@opencores.org
4
5    PIC parts added by Stefan Kristiansson, stefan.kristiansson@saunalahti.fi,
6    largely based on elf32-m32r.c and elf32-microblaze.c.
7
8    This file is part of BFD, the Binary File Descriptor library.
9
10    This program is free software; you can redistribute it and/or modify
11    it under the terms of the GNU General Public License as published by
12    the Free Software Foundation; either version 3 of the License, or
13    (at your option) any later version.
14
15    This program is distributed in the hope that it will be useful,
16    but WITHOUT ANY WARRANTY; without even the implied warranty of
17    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18    GNU General Public License for more details.
19
20    You should have received a copy of the GNU General Public License
21    along with this program; if not, see <http://www.gnu.org/licenses/>.  */
22
23 #include "sysdep.h"
24 #include "bfd.h"
25 #include "libbfd.h"
26 #include "elf-bfd.h"
27 #include "elf/or1k.h"
28 #include "libiberty.h"
29
30 #define N_ONES(X)       (((bfd_vma)2 << (X)) - 1)
31
32 #define PLT_ENTRY_SIZE 16
33
34 #define OR1K_MOVHI(D)           (0x18000000 | (D << 21))
35 #define OR1K_ADRP(D)            (0x08000000 | (D << 21))
36 #define OR1K_LWZ(D,A)           (0x84000000 | (D << 21) | (A << 16))
37 #define OR1K_ORI0(D)            (0xA8000000 | (D << 21))
38 #define OR1K_JR(B)              (0x44000000 | (B << 11))
39 #define OR1K_NOP                0x15000000
40
41 #define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so.1"
42
43 static reloc_howto_type or1k_elf_howto_table[] =
44 {
45   /* This reloc does nothing.  */
46   HOWTO (R_OR1K_NONE,           /* type */
47          0,                     /* rightshift */
48          3,                     /* size (0 = byte, 1 = short, 2 = long) */
49          0,                     /* bitsize */
50          FALSE,                 /* pc_relative */
51          0,                     /* bitpos */
52          complain_overflow_dont, /* complain_on_overflow */
53          bfd_elf_generic_reloc, /* special_function */
54          "R_OR1K_NONE",         /* name */
55          FALSE,                 /* partial_inplace */
56          0,                     /* src_mask */
57          0,                     /* dst_mask */
58          FALSE),                /* pcrel_offset */
59
60   HOWTO (R_OR1K_32,
61          0,                     /* rightshift */
62          2,                     /* size (0 = byte, 1 = short, 2 = long) */
63          32,                    /* bitsize */
64          FALSE,                 /* pc_relative */
65          0,                     /* bitpos */
66          complain_overflow_unsigned, /* complain_on_overflow */
67          bfd_elf_generic_reloc, /* special_function */
68          "R_OR1K_32",           /* name */
69          FALSE,                 /* partial_inplace */
70          0,                     /* src_mask */
71          0xffffffff,            /* dst_mask */
72          FALSE),                /* pcrel_offset */
73
74   HOWTO (R_OR1K_16,
75          0,                     /* rightshift */
76          1,                     /* size (0 = byte, 1 = short, 2 = long) */
77          16,                    /* bitsize */
78          FALSE,                 /* pc_relative */
79          0,                     /* bitpos */
80          complain_overflow_unsigned, /* complain_on_overflow */
81          bfd_elf_generic_reloc, /* special_function */
82          "R_OR1K_16",           /* name */
83          FALSE,                 /* partial_inplace */
84          0,                     /* src_mask */
85          0xffff,                /* dst_mask */
86          FALSE),                /* pcrel_offset */
87
88   HOWTO (R_OR1K_8,
89          0,                     /* rightshift */
90          0,                     /* size (0 = byte, 1 = short, 2 = long) */
91          8,                     /* bitsize */
92          FALSE,                 /* pc_relative */
93          0,                     /* bitpos */
94          complain_overflow_unsigned, /* complain_on_overflow */
95          bfd_elf_generic_reloc, /* special_function */
96          "R_OR1K_8",            /* name */
97          FALSE,                 /* partial_inplace */
98          0,                     /* src_mask */
99          0xff,                  /* dst_mask */
100          FALSE),                /* pcrel_offset */
101
102   HOWTO (R_OR1K_LO_16_IN_INSN, /* type */
103          0,                     /* rightshift */
104          2,                     /* size (0 = byte, 1 = short, 2 = long) */
105          16,                    /* bitsize */
106          FALSE,                 /* pc_relative */
107          0,                     /* bitpos */
108          complain_overflow_dont, /* complain_on_overflow */
109          bfd_elf_generic_reloc, /* special_function */
110          "R_OR1K_LO_16_IN_INSN", /* name */
111          FALSE,                 /* partial_inplace */
112          0,                     /* src_mask */
113          0x0000ffff,            /* dst_mask */
114          FALSE),                /* pcrel_offset */
115
116   HOWTO (R_OR1K_HI_16_IN_INSN, /* type */
117          16,                    /* rightshift */
118          2,                     /* size (0 = byte, 1 = short, 2 = long) */
119          16,                    /* bitsize */
120          FALSE,                 /* pc_relative */
121          0,                     /* bitpos */
122          complain_overflow_dont, /* complain_on_overflow */
123          bfd_elf_generic_reloc, /* special_function */
124          "R_OR1K_HI_16_IN_INSN", /* name */
125          FALSE,                 /* partial_inplace */
126          0,                     /* src_mask */
127          0x0000ffff,            /* dst_mask */
128          FALSE),                /* pcrel_offset */
129
130   /* A PC relative 26 bit relocation, right shifted by 2.  */
131   HOWTO (R_OR1K_INSN_REL_26, /* type */
132          2,                     /* rightshift */
133          2,                     /* size (0 = byte, 1 = short, 2 = long) */
134          26,                    /* bitsize */
135          TRUE,                  /* pc_relative */
136          0,                     /* bitpos */
137          complain_overflow_signed, /* complain_on_overflow */
138          bfd_elf_generic_reloc, /* special_function */
139          "R_OR1K_INSN_REL_26", /* name */
140          FALSE,                 /* partial_inplace */
141          0,                     /* src_mask */
142          0x03ffffff,            /* dst_mask */
143          TRUE),                 /* pcrel_offset */
144
145   /* GNU extension to record C++ vtable hierarchy.  */
146   HOWTO (R_OR1K_GNU_VTINHERIT, /* type */
147          0,                     /* rightshift */
148          2,                     /* size (0 = byte, 1 = short, 2 = long) */
149          0,                     /* bitsize */
150          FALSE,                 /* pc_relative */
151          0,                     /* bitpos */
152          complain_overflow_dont, /* complain_on_overflow */
153          NULL,                  /* special_function */
154          "R_OR1K_GNU_VTINHERIT", /* name */
155          FALSE,                 /* partial_inplace */
156          0,                     /* src_mask */
157          0,                     /* dst_mask */
158          FALSE),                /* pcrel_offset */
159
160   /* GNU extension to record C++ vtable member usage.  */
161   HOWTO (R_OR1K_GNU_VTENTRY, /* type */
162          0,                     /* rightshift */
163          2,                     /* size (0 = byte, 1 = short, 2 = long) */
164          0,                     /* bitsize */
165          FALSE,                 /* pc_relative */
166          0,                     /* bitpos */
167          complain_overflow_dont, /* complain_on_overflow */
168          _bfd_elf_rel_vtable_reloc_fn, /* special_function */
169          "R_OR1K_GNU_VTENTRY", /* name */
170          FALSE,                 /* partial_inplace */
171          0,                     /* src_mask */
172          0,                     /* dst_mask */
173          FALSE),                /* pcrel_offset */
174
175   HOWTO (R_OR1K_32_PCREL,
176          0,                     /* rightshift */
177          2,                     /* size (0 = byte, 1 = short, 2 = long) */
178          32,                    /* bitsize */
179          TRUE,                  /* pc_relative */
180          0,                     /* bitpos */
181          complain_overflow_signed, /* complain_on_overflow */
182          bfd_elf_generic_reloc, /* special_function */
183          "R_OR1K_32_PCREL",     /* name */
184          FALSE,                 /* partial_inplace */
185          0,                     /* src_mask */
186          0xffffffff,            /* dst_mask */
187          TRUE),                 /* pcrel_offset */
188
189   HOWTO (R_OR1K_16_PCREL,
190          0,                     /* rightshift */
191          1,                     /* size (0 = byte, 1 = short, 2 = long) */
192          16,                    /* bitsize */
193          TRUE,                  /* pc_relative */
194          0,                     /* bitpos */
195          complain_overflow_signed, /* complain_on_overflow */
196          bfd_elf_generic_reloc, /* special_function */
197          "R_OR1K_16_PCREL",     /* name */
198          FALSE,                 /* partial_inplace */
199          0,                     /* src_mask */
200          0xffff,                /* dst_mask */
201          TRUE),                 /* pcrel_offset */
202
203   HOWTO (R_OR1K_8_PCREL,
204          0,                     /* rightshift */
205          0,                     /* size (0 = byte, 1 = short, 2 = long) */
206          8,                     /* bitsize */
207          TRUE,                  /* pc_relative */
208          0,                     /* bitpos */
209          complain_overflow_signed, /* complain_on_overflow */
210          bfd_elf_generic_reloc, /* special_function */
211          "R_OR1K_8_PCREL",      /* name */
212          FALSE,                 /* partial_inplace */
213          0,                     /* src_mask */
214          0xff,                  /* dst_mask */
215          TRUE),                 /* pcrel_offset */
216
217    HOWTO (R_OR1K_GOTPC_HI16,    /* Type.  */
218          16,                    /* Rightshift.  */
219          2,                     /* Size (0 = byte, 1 = short, 2 = long).  */
220          16,                    /* Bitsize.  */
221          TRUE,                  /* PC_relative.  */
222          0,                     /* Bitpos.  */
223          complain_overflow_dont, /* Complain on overflow.  */
224          bfd_elf_generic_reloc, /* Special Function.  */
225          "R_OR1K_GOTPC_HI16",   /* Name.  */
226          FALSE,         /* Partial Inplace.  */
227          0,                     /* Source Mask.  */
228          0xffff,                /* Dest Mask.  */
229          TRUE),                 /* PC relative offset?  */
230
231    HOWTO (R_OR1K_GOTPC_LO16,    /* Type.  */
232          0,                     /* Rightshift.  */
233          2,                     /* Size (0 = byte, 1 = short, 2 = long).  */
234          16,                    /* Bitsize.  */
235          TRUE,                  /* PC_relative.  */
236          0,                     /* Bitpos.  */
237          complain_overflow_dont, /* Complain on overflow.  */
238          bfd_elf_generic_reloc, /* Special Function.  */
239          "R_OR1K_GOTPC_LO16",   /* Name.  */
240          FALSE,         /* Partial Inplace.  */
241          0,                     /* Source Mask.  */
242          0xffff,                /* Dest Mask.  */
243          TRUE),                 /* PC relative offset?  */
244
245   HOWTO (R_OR1K_GOT16,          /* type */
246          0,                     /* rightshift */
247          2,                     /* size (0 = byte, 1 = short, 2 = long) */
248          16,                    /* bitsize */
249          FALSE,                 /* pc_relative */
250          0,                     /* bitpos */
251          complain_overflow_signed, /* complain_on_overflow */
252          bfd_elf_generic_reloc, /* special_function */
253          "R_OR1K_GOT16",        /* name */
254          FALSE,                 /* partial_inplace */
255          0,                     /* src_mask */
256          0xffff,                /* dst_mask */
257          FALSE),                /* pcrel_offset */
258
259   /* A 26 bit PLT relocation.  Shifted by 2.  */
260   HOWTO (R_OR1K_PLT26,          /* Type.  */
261          2,                     /* Rightshift.  */
262          2,                     /* Size (0 = byte, 1 = short, 2 = long).  */
263          26,                    /* Bitsize.  */
264          TRUE,                  /* pc_relative.  */
265          0,                     /* Bitpos.  */
266          complain_overflow_signed, /* Complain on overflow.  */
267          bfd_elf_generic_reloc, /* Special Function.  */
268          "R_OR1K_PLT26",        /* Name.  */
269          FALSE,                 /* Partial Inplace.  */
270          0,                     /* Source Mask.  */
271          0x03ffffff,            /* Dest Mask.  */
272          TRUE),                 /* PC relative offset?  */
273
274   HOWTO (R_OR1K_GOTOFF_HI16,    /* type */
275          16,                    /* rightshift */
276          2,                     /* size (0 = byte, 1 = short, 2 = long) */
277          16,                    /* bitsize */
278          FALSE,                 /* pc_relative */
279          0,                     /* bitpos */
280          complain_overflow_dont, /* complain_on_overflow */
281          bfd_elf_generic_reloc, /* special_function */
282          "R_OR1K_GOTOFF_HI16",  /* name */
283          FALSE,                 /* partial_inplace */
284          0x0,                   /* src_mask */
285          0xffff,                /* dst_mask */
286          FALSE),                /* pcrel_offset */
287
288   HOWTO (R_OR1K_GOTOFF_LO16,    /* type */
289          0,                     /* rightshift */
290          2,                     /* size (0 = byte, 1 = short, 2 = long) */
291          16,                    /* bitsize */
292          FALSE,                 /* pc_relative */
293          0,                     /* bitpos */
294          complain_overflow_dont, /* complain_on_overflow */
295          bfd_elf_generic_reloc, /* special_function */
296          "R_OR1K_GOTOFF_LO16",  /* name */
297          FALSE,                 /* partial_inplace */
298          0x0,                   /* src_mask */
299          0xffff,                /* dst_mask */
300          FALSE),                /* pcrel_offset */
301
302   HOWTO (R_OR1K_COPY,           /* type */
303          0,                     /* rightshift */
304          2,                     /* size (0 = byte, 1 = short, 2 = long) */
305          32,                    /* bitsize */
306          FALSE,                 /* pc_relative */
307          0,                     /* bitpos */
308          complain_overflow_bitfield, /* complain_on_overflow */
309          bfd_elf_generic_reloc, /* special_function */
310          "R_OR1K_COPY",         /* name */
311          FALSE,                 /* partial_inplace */
312          0xffffffff,            /* src_mask */
313          0xffffffff,            /* dst_mask */
314          FALSE),                /* pcrel_offset */
315
316   HOWTO (R_OR1K_GLOB_DAT,       /* type */
317          0,                     /* rightshift */
318          2,                     /* size (0 = byte, 1 = short, 2 = long) */
319          32,                    /* bitsize */
320          FALSE,                 /* pc_relative */
321          0,                     /* bitpos */
322          complain_overflow_bitfield, /* complain_on_overflow */
323          bfd_elf_generic_reloc, /* special_function */
324          "R_OR1K_GLOB_DAT",     /* name */
325          FALSE,                 /* partial_inplace */
326          0xffffffff,            /* src_mask */
327          0xffffffff,            /* dst_mask */
328          FALSE),                /* pcrel_offset */
329
330   HOWTO (R_OR1K_JMP_SLOT,       /* type */
331          0,                     /* rightshift */
332          2,                     /* size (0 = byte, 1 = short, 2 = long) */
333          32,                    /* bitsize */
334          FALSE,                 /* pc_relative */
335          0,                     /* bitpos */
336          complain_overflow_bitfield, /* complain_on_overflow */
337          bfd_elf_generic_reloc, /* special_function */
338          "R_OR1K_JMP_SLOT",     /* name */
339          FALSE,                 /* partial_inplace */
340          0xffffffff,            /* src_mask */
341          0xffffffff,            /* dst_mask */
342          FALSE),                /* pcrel_offset */
343
344   HOWTO (R_OR1K_RELATIVE,       /* type */
345          0,                     /* rightshift */
346          2,                     /* size (0 = byte, 1 = short, 2 = long) */
347          32,                    /* bitsize */
348          FALSE,                 /* pc_relative */
349          0,                     /* bitpos */
350          complain_overflow_bitfield, /* complain_on_overflow */
351          bfd_elf_generic_reloc, /* special_function */
352          "R_OR1K_RELATIVE",     /* name */
353          FALSE,                 /* partial_inplace */
354          0xffffffff,            /* src_mask */
355          0xffffffff,            /* dst_mask */
356          FALSE),                /* pcrel_offset */
357
358   HOWTO (R_OR1K_TLS_GD_HI16,    /* type */
359          16,                    /* rightshift */
360          2,                     /* size (0 = byte, 1 = short, 2 = long) */
361          16,                    /* bitsize */
362          FALSE,                 /* pc_relative */
363          0,                     /* bitpos */
364          complain_overflow_dont, /* complain_on_overflow */
365          bfd_elf_generic_reloc, /* special_function */
366          "R_OR1K_TLS_GD_HI16",  /* name */
367          FALSE,                 /* partial_inplace */
368          0x0,                   /* src_mask */
369          0xffff,                /* dst_mask */
370          FALSE),                /* pcrel_offset */
371
372   HOWTO (R_OR1K_TLS_GD_LO16,    /* type */
373          0,                     /* rightshift */
374          2,                     /* size (0 = byte, 1 = short, 2 = long) */
375          16,                    /* bitsize */
376          FALSE,                 /* pc_relative */
377          0,                     /* bitpos */
378          complain_overflow_dont, /* complain_on_overflow */
379          bfd_elf_generic_reloc, /* special_function */
380          "R_OR1K_TLS_GD_LO16",  /* name */
381          FALSE,                 /* partial_inplace */
382          0x0,                   /* src_mask */
383          0xffff,                /* dst_mask */
384          FALSE),                /* pcrel_offset */
385
386   HOWTO (R_OR1K_TLS_LDM_HI16,   /* type */
387          16,                    /* rightshift */
388          2,                     /* size (0 = byte, 1 = short, 2 = long) */
389          16,                    /* bitsize */
390          FALSE,                 /* pc_relative */
391          0,                     /* bitpos */
392          complain_overflow_dont, /* complain_on_overflow */
393          bfd_elf_generic_reloc, /* special_function */
394          "R_OR1K_TLS_LDM_HI16", /* name */
395          FALSE,                 /* partial_inplace */
396          0x0,                   /* src_mask */
397          0xffff,                /* dst_mask */
398          FALSE),                /* pcrel_offset */
399
400   HOWTO (R_OR1K_TLS_LDM_LO16,   /* type */
401          0,                     /* rightshift */
402          2,                     /* size (0 = byte, 1 = short, 2 = long) */
403          16,                    /* bitsize */
404          FALSE,                 /* pc_relative */
405          0,                     /* bitpos */
406          complain_overflow_dont, /* complain_on_overflow */
407          bfd_elf_generic_reloc, /* special_function */
408          "R_OR1K_TLS_LDM_LO16", /* name */
409          FALSE,                 /* partial_inplace */
410          0x0,                   /* src_mask */
411          0xffff,                /* dst_mask */
412          FALSE),                /* pcrel_offset */
413
414   HOWTO (R_OR1K_TLS_LDO_HI16,   /* type */
415          16,                    /* rightshift */
416          2,                     /* size (0 = byte, 1 = short, 2 = long) */
417          16,                    /* bitsize */
418          FALSE,                 /* pc_relative */
419          0,                     /* bitpos */
420          complain_overflow_dont, /* complain_on_overflow */
421          bfd_elf_generic_reloc, /* special_function */
422          "R_OR1K_TLS_LDO_HI16", /* name */
423          FALSE,                 /* partial_inplace */
424          0x0,                   /* src_mask */
425          0xffff,                /* dst_mask */
426          FALSE),                /* pcrel_offset */
427
428   HOWTO (R_OR1K_TLS_LDO_LO16,   /* type */
429          0,                     /* rightshift */
430          2,                     /* size (0 = byte, 1 = short, 2 = long) */
431          16,                    /* bitsize */
432          FALSE,                 /* pc_relative */
433          0,                     /* bitpos */
434          complain_overflow_dont, /* complain_on_overflow */
435          bfd_elf_generic_reloc, /* special_function */
436          "R_OR1K_TLS_LDO_LO16", /* name */
437          FALSE,                 /* partial_inplace */
438          0x0,                   /* src_mask */
439          0xffff,                /* dst_mask */
440          FALSE),                /* pcrel_offset */
441
442   HOWTO (R_OR1K_TLS_IE_HI16,    /* type */
443          16,                    /* rightshift */
444          2,                     /* size (0 = byte, 1 = short, 2 = long) */
445          16,                    /* bitsize */
446          FALSE,                 /* pc_relative */
447          0,                     /* bitpos */
448          complain_overflow_dont, /* complain_on_overflow */
449          bfd_elf_generic_reloc, /* special_function */
450          "R_OR1K_TLS_IE_HI16",  /* name */
451          FALSE,                 /* partial_inplace */
452          0x0,                   /* src_mask */
453          0xffff,                /* dst_mask */
454          FALSE),                /* pcrel_offset */
455
456   HOWTO (R_OR1K_TLS_IE_LO16,    /* type */
457          0,                     /* rightshift */
458          2,                     /* size (0 = byte, 1 = short, 2 = long) */
459          16,                    /* bitsize */
460          FALSE,                 /* pc_relative */
461          0,                     /* bitpos */
462          complain_overflow_dont, /* complain_on_overflow */
463          bfd_elf_generic_reloc, /* special_function */
464          "R_OR1K_TLS_IE_LO16",  /* name */
465          FALSE,                 /* partial_inplace */
466          0x0,                   /* src_mask */
467          0xffff,                /* dst_mask */
468          FALSE),                /* pcrel_offset */
469
470   HOWTO (R_OR1K_TLS_LE_HI16,    /* type */
471          16,                    /* rightshift */
472          2,                     /* size (0 = byte, 1 = short, 2 = long) */
473          16,                    /* bitsize */
474          FALSE,                 /* pc_relative */
475          0,                     /* bitpos */
476          complain_overflow_dont, /* complain_on_overflow */
477          bfd_elf_generic_reloc, /* special_function */
478          "R_OR1K_TLS_LE_HI16",  /* name */
479          FALSE,                 /* partial_inplace */
480          0x0,                   /* src_mask */
481          0xffff,                /* dst_mask */
482          FALSE),                /* pcrel_offset */
483
484   HOWTO (R_OR1K_TLS_LE_LO16,    /* type */
485          0,                     /* rightshift */
486          2,                     /* size (0 = byte, 1 = short, 2 = long) */
487          16,                    /* bitsize */
488          FALSE,                 /* pc_relative */
489          0,                     /* bitpos */
490          complain_overflow_dont, /* complain_on_overflow */
491          bfd_elf_generic_reloc, /* special_function */
492          "R_OR1K_TLS_LE_LO16",  /* name */
493          FALSE,                 /* partial_inplace */
494          0x0,                   /* src_mask */
495          0xffff,                /* dst_mask */
496          FALSE),                /* pcrel_offset */
497
498   HOWTO (R_OR1K_TLS_TPOFF,      /* type */
499          0,                     /* rightshift */
500          2,                     /* size (0 = byte, 1 = short, 2 = long) */
501          32,                    /* bitsize */
502          FALSE,                 /* pc_relative */
503          0,                     /* bitpos */
504          complain_overflow_bitfield, /* complain_on_overflow */
505          bfd_elf_generic_reloc, /* special_function */
506          "R_OR1K_TLS_TPOFF",    /* name */
507          FALSE,                 /* partial_inplace */
508          0xffffffff,            /* src_mask */
509          0xffffffff,            /* dst_mask */
510          FALSE),                /* pcrel_offset */
511
512   HOWTO (R_OR1K_TLS_DTPOFF,     /* type */
513          0,                     /* rightshift */
514          2,                     /* size (0 = byte, 1 = short, 2 = long) */
515          32,                    /* bitsize */
516          FALSE,                 /* pc_relative */
517          0,                     /* bitpos */
518          complain_overflow_bitfield, /* complain_on_overflow */
519          bfd_elf_generic_reloc, /* special_function */
520          "R_OR1K_TLS_DTPOFF",   /* name */
521          FALSE,                 /* partial_inplace */
522          0xffffffff,            /* src_mask */
523          0xffffffff,            /* dst_mask */
524          FALSE),                /* pcrel_offset */
525
526   HOWTO (R_OR1K_TLS_DTPMOD,     /* type */
527          0,                     /* rightshift */
528          2,                     /* size (0 = byte, 1 = short, 2 = long) */
529          32,                    /* bitsize */
530          FALSE,                 /* pc_relative */
531          0,                     /* bitpos */
532          complain_overflow_bitfield, /* complain_on_overflow */
533          bfd_elf_generic_reloc, /* special_function */
534          "R_OR1K_TLS_DTPMOD",   /* name */
535          FALSE,                 /* partial_inplace */
536          0xffffffff,            /* src_mask */
537          0xffffffff,            /* dst_mask */
538          FALSE),                /* pcrel_offset */
539
540   HOWTO (R_OR1K_AHI16,          /* type */
541          16,                    /* rightshift */
542          2,                     /* size (0 = byte, 1 = short, 2 = long) */
543          16,                    /* bitsize */
544          FALSE,                 /* pc_relative */
545          0,                     /* bitpos */
546          complain_overflow_dont, /* complain_on_overflow */
547          bfd_elf_generic_reloc, /* special_function */
548          "R_OR1K_AHI16",        /* name */
549          FALSE,                 /* partial_inplace */
550          0x0,                   /* src_mask */
551          0xffff,                /* dst_mask */
552          FALSE),                /* pcrel_offset */
553
554   HOWTO (R_OR1K_GOTOFF_AHI16,   /* type */
555          16,                    /* rightshift */
556          2,                     /* size (0 = byte, 1 = short, 2 = long) */
557          16,                    /* bitsize */
558          FALSE,                 /* pc_relative */
559          0,                     /* bitpos */
560          complain_overflow_dont, /* complain_on_overflow */
561          bfd_elf_generic_reloc, /* special_function */
562          "R_OR1K_GOTOFF_AHI16", /* name */
563          FALSE,                 /* partial_inplace */
564          0x0,                   /* src_mask */
565          0xffff,                /* dst_mask */
566          FALSE),                /* pcrel_offset */
567
568   HOWTO (R_OR1K_TLS_IE_AHI16,   /* type */
569          16,                    /* rightshift */
570          2,                     /* size (0 = byte, 1 = short, 2 = long) */
571          16,                    /* bitsize */
572          FALSE,                 /* pc_relative */
573          0,                     /* bitpos */
574          complain_overflow_dont, /* complain_on_overflow */
575          bfd_elf_generic_reloc, /* special_function */
576          "R_OR1K_TLS_IE_AHI16", /* name */
577          FALSE,                 /* partial_inplace */
578          0x0,                   /* src_mask */
579          0xffff,                /* dst_mask */
580          FALSE),                /* pcrel_offset */
581
582   HOWTO (R_OR1K_TLS_LE_AHI16,   /* type */
583          16,                    /* rightshift */
584          2,                     /* size (0 = byte, 1 = short, 2 = long) */
585          16,                    /* bitsize */
586          FALSE,                 /* pc_relative */
587          0,                     /* bitpos */
588          complain_overflow_dont, /* complain_on_overflow */
589          bfd_elf_generic_reloc, /* special_function */
590          "R_OR1K_TLS_LE_AHI16", /* name */
591          FALSE,                 /* partial_inplace */
592          0x0,                   /* src_mask */
593          0xffff,                /* dst_mask */
594          FALSE),                /* pcrel_offset */
595
596   HOWTO (R_OR1K_SLO16,          /* type */
597          0,                     /* rightshift */
598          2,                     /* size (0 = byte, 1 = short, 2 = long) */
599          16,                    /* bitsize */
600          FALSE,                 /* pc_relative */
601          0,                     /* bitpos */
602          complain_overflow_dont, /* complain_on_overflow */
603          bfd_elf_generic_reloc, /* special_function */
604          "R_OR1K_SLO16",        /* name */
605          FALSE,                 /* partial_inplace */
606          0x0,                   /* src_mask */
607          0xffff,                /* dst_mask */
608          FALSE),                /* pcrel_offset */
609
610   HOWTO (R_OR1K_GOTOFF_SLO16,   /* type */
611          0,                     /* rightshift */
612          2,                     /* size (0 = byte, 1 = short, 2 = long) */
613          16,                    /* bitsize */
614          FALSE,                 /* pc_relative */
615          0,                     /* bitpos */
616          complain_overflow_dont, /* complain_on_overflow */
617          bfd_elf_generic_reloc, /* special_function */
618          "R_OR1K_GOTOFF_SLO16", /* name */
619          FALSE,                 /* partial_inplace */
620          0x0,                   /* src_mask */
621          0xffff,                /* dst_mask */
622          FALSE),                /* pcrel_offset */
623
624   HOWTO (R_OR1K_TLS_LE_SLO16,   /* type */
625          0,                     /* rightshift */
626          2,                     /* size (0 = byte, 1 = short, 2 = long) */
627          16,                    /* bitsize */
628          FALSE,                 /* pc_relative */
629          0,                     /* bitpos */
630          complain_overflow_dont, /* complain_on_overflow */
631          bfd_elf_generic_reloc, /* special_function */
632          "R_OR1K_TLS_LE_SLO16", /* name */
633          FALSE,                 /* partial_inplace */
634          0x0,                   /* src_mask */
635          0xffff,                /* dst_mask */
636          FALSE),                /* pcrel_offset */
637
638   /* A page relative 21 bit relocation, right shifted by 13, aligned.
639      Note that this is *page* relative, not pc relative.  The idea is
640      similar, but normally the section alignment is not such that the
641      assembler can infer a final value, which it attempts to do with
642      pc-relative relocations to local symbols.  */
643   HOWTO (R_OR1K_PCREL_PG21,    /* type */
644          13,                    /* rightshift */
645          2,                     /* size (0 = byte, 1 = short, 2 = long) */
646          21,                    /* bitsize */
647          FALSE,                 /* pc_relative */
648          0,                     /* bitpos */
649          complain_overflow_signed, /* complain_on_overflow */
650          bfd_elf_generic_reloc, /* special_function */
651          "R_OR1K_PCREL_PG21",   /* name */
652          FALSE,                 /* partial_inplace */
653          0,                     /* src_mask */
654          0x001fffff,            /* dst_mask */
655          TRUE),                 /* pcrel_offset */
656
657   HOWTO (R_OR1K_GOT_PG21,       /* type */
658          13,                    /* rightshift */
659          2,                     /* size (0 = byte, 1 = short, 2 = long) */
660          21,                    /* bitsize */
661          FALSE,                 /* pc_relative */
662          0,                     /* bitpos */
663          complain_overflow_signed, /* complain_on_overflow */
664          bfd_elf_generic_reloc, /* special_function */
665          "R_OR1K_GOT_PG21",     /* name */
666          FALSE,                 /* partial_inplace */
667          0,                     /* src_mask */
668          0x001fffff,            /* dst_mask */
669          TRUE),                 /* pcrel_offset */
670
671   HOWTO (R_OR1K_TLS_GD_PG21,    /* type */
672          13,                    /* rightshift */
673          2,                     /* size (0 = byte, 1 = short, 2 = long) */
674          21,                    /* bitsize */
675          FALSE,                 /* pc_relative */
676          0,                     /* bitpos */
677          complain_overflow_signed, /* complain_on_overflow */
678          bfd_elf_generic_reloc, /* special_function */
679          "R_OR1K_TLS_GD_PG21",  /* name */
680          FALSE,                 /* partial_inplace */
681          0,                     /* src_mask */
682          0x001fffff,            /* dst_mask */
683          TRUE),                 /* pcrel_offset */
684
685   HOWTO (R_OR1K_TLS_LDM_PG21,   /* type */
686          13,                    /* rightshift */
687          2,                     /* size (0 = byte, 1 = short, 2 = long) */
688          21,                    /* bitsize */
689          FALSE,                 /* pc_relative */
690          0,                     /* bitpos */
691          complain_overflow_signed, /* complain_on_overflow */
692          bfd_elf_generic_reloc, /* special_function */
693          "R_OR1K_TLS_LDM_PG21", /* name */
694          FALSE,                 /* partial_inplace */
695          0,                     /* src_mask */
696          0x001fffff,            /* dst_mask */
697          TRUE),                 /* pcrel_offset */
698
699   HOWTO (R_OR1K_TLS_IE_PG21,    /* type */
700          13,                    /* rightshift */
701          2,                     /* size (0 = byte, 1 = short, 2 = long) */
702          21,                    /* bitsize */
703          FALSE,                 /* pc_relative */
704          0,                     /* bitpos */
705          complain_overflow_signed, /* complain_on_overflow */
706          bfd_elf_generic_reloc, /* special_function */
707          "R_OR1K_TLS_IE_PG21",  /* name */
708          FALSE,                 /* partial_inplace */
709          0,                     /* src_mask */
710          0x001fffff,            /* dst_mask */
711          TRUE),                 /* pcrel_offset */
712
713   HOWTO (R_OR1K_LO13,           /* type */
714          0,                     /* rightshift */
715          2,                     /* size (0 = byte, 1 = short, 2 = long) */
716          16,                    /* bitsize */
717          FALSE,                 /* pc_relative */
718          0,                     /* bitpos */
719          complain_overflow_dont, /* complain_on_overflow */
720          bfd_elf_generic_reloc, /* special_function */
721          "R_OR1K_LO13",         /* name */
722          FALSE,                 /* partial_inplace */
723          0x0,                   /* src_mask */
724          0xffff,                /* dst_mask */
725          FALSE),                /* pcrel_offset */
726
727   HOWTO (R_OR1K_GOT_LO13,       /* type */
728          0,                     /* rightshift */
729          2,                     /* size (0 = byte, 1 = short, 2 = long) */
730          16,                    /* bitsize */
731          FALSE,                 /* pc_relative */
732          0,                     /* bitpos */
733          complain_overflow_dont, /* complain_on_overflow */
734          bfd_elf_generic_reloc, /* special_function */
735          "R_OR1K_GOT_LO13",     /* name */
736          FALSE,                 /* partial_inplace */
737          0x0,                   /* src_mask */
738          0xffff,                /* dst_mask */
739          FALSE),                /* pcrel_offset */
740
741   HOWTO (R_OR1K_TLS_GD_LO13,    /* type */
742          0,                     /* rightshift */
743          2,                     /* size (0 = byte, 1 = short, 2 = long) */
744          16,                    /* bitsize */
745          FALSE,                 /* pc_relative */
746          0,                     /* bitpos */
747          complain_overflow_dont, /* complain_on_overflow */
748          bfd_elf_generic_reloc, /* special_function */
749          "R_OR1K_TLS_GD_LO13",  /* name */
750          FALSE,                 /* partial_inplace */
751          0x0,                   /* src_mask */
752          0xffff,                /* dst_mask */
753          FALSE),                /* pcrel_offset */
754
755   HOWTO (R_OR1K_TLS_LDM_LO13,   /* type */
756          0,                     /* rightshift */
757          2,                     /* size (0 = byte, 1 = short, 2 = long) */
758          16,                    /* bitsize */
759          FALSE,                 /* pc_relative */
760          0,                     /* bitpos */
761          complain_overflow_dont, /* complain_on_overflow */
762          bfd_elf_generic_reloc, /* special_function */
763          "R_OR1K_TLD_LDM_LO13", /* name */
764          FALSE,                 /* partial_inplace */
765          0x0,                   /* src_mask */
766          0xffff,                /* dst_mask */
767          FALSE),                /* pcrel_offset */
768
769   HOWTO (R_OR1K_TLS_IE_LO13,    /* type */
770          0,                     /* rightshift */
771          2,                     /* size (0 = byte, 1 = short, 2 = long) */
772          16,                    /* bitsize */
773          FALSE,                 /* pc_relative */
774          0,                     /* bitpos */
775          complain_overflow_dont, /* complain_on_overflow */
776          bfd_elf_generic_reloc, /* special_function */
777          "R_OR1K_TLS_IE_LO13",  /* name */
778          FALSE,                 /* partial_inplace */
779          0x0,                   /* src_mask */
780          0xffff,                /* dst_mask */
781          FALSE),                /* pcrel_offset */
782
783   HOWTO (R_OR1K_SLO13,          /* type */
784          0,                     /* rightshift */
785          2,                     /* size (0 = byte, 1 = short, 2 = long) */
786          16,                    /* bitsize */
787          FALSE,                 /* pc_relative */
788          0,                     /* bitpos */
789          complain_overflow_dont, /* complain_on_overflow */
790          bfd_elf_generic_reloc, /* special_function */
791          "R_OR1K_SLO13",        /* name */
792          FALSE,                 /* partial_inplace */
793          0x0,                   /* src_mask */
794          0xffff,                /* dst_mask */
795          FALSE),                /* pcrel_offset */
796
797   /* A 26 bit PLT relocation, using ADRP.  Shifted by 2.  */
798   HOWTO (R_OR1K_PLTA26,         /* Type.  */
799          2,                     /* Rightshift.  */
800          2,                     /* Size (0 = byte, 1 = short, 2 = long).  */
801          26,                    /* Bitsize.  */
802          TRUE,                  /* pc_relative.  */
803          0,                     /* Bitpos.  */
804          complain_overflow_signed, /* Complain on overflow.  */
805          bfd_elf_generic_reloc, /* Special Function.  */
806          "R_OR1K_PLTA26",       /* Name.  */
807          FALSE,                 /* Partial Inplace.  */
808          0,                     /* Source Mask.  */
809          0x03ffffff,            /* Dest Mask.  */
810          TRUE),                 /* PC relative offset?  */
811 };
812
813 /* Map BFD reloc types to Or1k ELF reloc types.  */
814
815 struct or1k_reloc_map
816 {
817   bfd_reloc_code_real_type bfd_reloc_val;
818   unsigned int or1k_reloc_val;
819 };
820
821 static const struct or1k_reloc_map or1k_reloc_map[] =
822 {
823   { BFD_RELOC_NONE,             R_OR1K_NONE },
824   { BFD_RELOC_32,               R_OR1K_32 },
825   { BFD_RELOC_16,               R_OR1K_16 },
826   { BFD_RELOC_8,                R_OR1K_8 },
827   { BFD_RELOC_LO16,             R_OR1K_LO_16_IN_INSN },
828   { BFD_RELOC_HI16,             R_OR1K_HI_16_IN_INSN },
829   { BFD_RELOC_HI16_S,           R_OR1K_AHI16 },
830   { BFD_RELOC_OR1K_REL_26,      R_OR1K_INSN_REL_26 },
831   { BFD_RELOC_VTABLE_ENTRY,     R_OR1K_GNU_VTENTRY },
832   { BFD_RELOC_VTABLE_INHERIT,   R_OR1K_GNU_VTINHERIT },
833   { BFD_RELOC_32_PCREL,         R_OR1K_32_PCREL },
834   { BFD_RELOC_16_PCREL,         R_OR1K_16_PCREL },
835   { BFD_RELOC_8_PCREL,          R_OR1K_8_PCREL },
836   { BFD_RELOC_LO16_GOTOFF,      R_OR1K_GOTOFF_LO16 },
837   { BFD_RELOC_HI16_GOTOFF,      R_OR1K_GOTOFF_HI16 },
838   { BFD_RELOC_HI16_S_GOTOFF,    R_OR1K_GOTOFF_AHI16 },
839   { BFD_RELOC_OR1K_GOTPC_HI16,  R_OR1K_GOTPC_HI16 },
840   { BFD_RELOC_OR1K_GOTPC_LO16,  R_OR1K_GOTPC_LO16 },
841   { BFD_RELOC_OR1K_GOT16,       R_OR1K_GOT16 },
842   { BFD_RELOC_OR1K_PLT26,       R_OR1K_PLT26 },
843   { BFD_RELOC_OR1K_GLOB_DAT,    R_OR1K_GLOB_DAT },
844   { BFD_RELOC_OR1K_COPY,        R_OR1K_COPY },
845   { BFD_RELOC_OR1K_JMP_SLOT,    R_OR1K_JMP_SLOT },
846   { BFD_RELOC_OR1K_RELATIVE,    R_OR1K_RELATIVE },
847   { BFD_RELOC_OR1K_TLS_GD_HI16, R_OR1K_TLS_GD_HI16 },
848   { BFD_RELOC_OR1K_TLS_GD_LO16, R_OR1K_TLS_GD_LO16 },
849   { BFD_RELOC_OR1K_TLS_LDM_HI16,        R_OR1K_TLS_LDM_HI16 },
850   { BFD_RELOC_OR1K_TLS_LDM_LO16,        R_OR1K_TLS_LDM_LO16 },
851   { BFD_RELOC_OR1K_TLS_LDO_HI16,        R_OR1K_TLS_LDO_HI16 },
852   { BFD_RELOC_OR1K_TLS_LDO_LO16,        R_OR1K_TLS_LDO_LO16 },
853   { BFD_RELOC_OR1K_TLS_IE_HI16, R_OR1K_TLS_IE_HI16 },
854   { BFD_RELOC_OR1K_TLS_IE_LO16, R_OR1K_TLS_IE_LO16 },
855   { BFD_RELOC_OR1K_TLS_IE_AHI16, R_OR1K_TLS_IE_AHI16 },
856   { BFD_RELOC_OR1K_TLS_LE_HI16, R_OR1K_TLS_LE_HI16 },
857   { BFD_RELOC_OR1K_TLS_LE_LO16, R_OR1K_TLS_LE_LO16 },
858   { BFD_RELOC_OR1K_TLS_LE_AHI16, R_OR1K_TLS_LE_AHI16 },
859   { BFD_RELOC_OR1K_SLO16,       R_OR1K_SLO16 },
860   { BFD_RELOC_OR1K_GOTOFF_SLO16, R_OR1K_GOTOFF_SLO16 },
861   { BFD_RELOC_OR1K_TLS_LE_SLO16, R_OR1K_TLS_LE_SLO16 },
862   { BFD_RELOC_OR1K_PCREL_PG21,  R_OR1K_PCREL_PG21 },
863   { BFD_RELOC_OR1K_GOT_PG21,    R_OR1K_GOT_PG21 },
864   { BFD_RELOC_OR1K_TLS_GD_PG21, R_OR1K_TLS_GD_PG21 },
865   { BFD_RELOC_OR1K_TLS_LDM_PG21, R_OR1K_TLS_LDM_PG21 },
866   { BFD_RELOC_OR1K_TLS_IE_PG21, R_OR1K_TLS_IE_PG21 },
867   { BFD_RELOC_OR1K_LO13,        R_OR1K_LO13 },
868   { BFD_RELOC_OR1K_GOT_LO13,    R_OR1K_GOT_LO13 },
869   { BFD_RELOC_OR1K_TLS_GD_LO13, R_OR1K_TLS_GD_LO13 },
870   { BFD_RELOC_OR1K_TLS_LDM_LO13, R_OR1K_TLS_LDM_LO13 },
871   { BFD_RELOC_OR1K_TLS_IE_LO13, R_OR1K_TLS_IE_LO13 },
872   { BFD_RELOC_OR1K_SLO13,       R_OR1K_SLO13 },
873   { BFD_RELOC_OR1K_PLTA26,      R_OR1K_PLTA26 },
874 };
875
876 #define TLS_UNKNOWN    0
877 #define TLS_NONE       1
878 #define TLS_GD         2
879 #define TLS_LD         3
880 #define TLS_IE         4
881 #define TLS_LE         5
882
883 /* ELF linker hash entry.  */
884 struct elf_or1k_link_hash_entry
885 {
886   struct elf_link_hash_entry root;
887
888   /* Track dynamic relocs copied for this symbol.  */
889   struct elf_dyn_relocs *dyn_relocs;
890
891   /* Track type of TLS access.  */
892   unsigned char tls_type;
893 };
894
895 /* ELF object data.  */
896 struct elf_or1k_obj_tdata
897 {
898   struct elf_obj_tdata root;
899
900   /* tls_type for each local got entry.  */
901   unsigned char *local_tls_type;
902 };
903
904 #define elf_or1k_tdata(abfd) \
905   ((struct elf_or1k_obj_tdata *) (abfd)->tdata.any)
906
907 #define elf_or1k_local_tls_type(abfd) \
908   (elf_or1k_tdata (abfd)->local_tls_type)
909
910 /* ELF linker hash table.  */
911 struct elf_or1k_link_hash_table
912 {
913   struct elf_link_hash_table root;
914
915   /* Small local sym to section mapping cache.  */
916   struct sym_cache sym_sec;
917
918   bfd_boolean saw_plta;
919 };
920
921 /* Get the ELF linker hash table from a link_info structure.  */
922 #define or1k_elf_hash_table(p) \
923   (elf_hash_table_id ((struct elf_link_hash_table *) ((p)->hash)) \
924    == OR1K_ELF_DATA ? ((struct elf_or1k_link_hash_table *) ((p)->hash)) : NULL)
925
926 static bfd_boolean
927 elf_or1k_mkobject (bfd *abfd)
928 {
929   return bfd_elf_allocate_object (abfd, sizeof (struct elf_or1k_obj_tdata),
930                                   OR1K_ELF_DATA);
931 }
932
933 /* Create an entry in an or1k ELF linker hash table.  */
934
935 static struct bfd_hash_entry *
936 or1k_elf_link_hash_newfunc (struct bfd_hash_entry *entry,
937                             struct bfd_hash_table *table,
938                             const char *string)
939 {
940   struct elf_or1k_link_hash_entry *ret =
941     (struct elf_or1k_link_hash_entry *) entry;
942
943   /* Allocate the structure if it has not already been allocated by a
944      subclass.  */
945   if (ret == NULL)
946     ret = bfd_hash_allocate (table,
947                              sizeof (struct elf_or1k_link_hash_entry));
948   if (ret == NULL)
949     return NULL;
950
951   /* Call the allocation method of the superclass.  */
952   ret = ((struct elf_or1k_link_hash_entry *)
953          _bfd_elf_link_hash_newfunc ((struct bfd_hash_entry *) ret,
954                                      table, string));
955   if (ret != NULL)
956     {
957       struct elf_or1k_link_hash_entry *eh;
958
959       eh = (struct elf_or1k_link_hash_entry *) ret;
960       eh->dyn_relocs = NULL;
961       eh->tls_type = TLS_UNKNOWN;
962     }
963
964   return (struct bfd_hash_entry *) ret;
965 }
966
967 /* Create an or1k ELF linker hash table.  */
968
969 static struct bfd_link_hash_table *
970 or1k_elf_link_hash_table_create (bfd *abfd)
971 {
972   struct elf_or1k_link_hash_table *ret;
973   bfd_size_type amt = sizeof (struct elf_or1k_link_hash_table);
974
975   ret = bfd_zmalloc (amt);
976   if (ret == NULL)
977     return NULL;
978
979   if (!_bfd_elf_link_hash_table_init (&ret->root, abfd,
980                                       or1k_elf_link_hash_newfunc,
981                                       sizeof (struct elf_or1k_link_hash_entry),
982                                       OR1K_ELF_DATA))
983     {
984       free (ret);
985       return NULL;
986     }
987
988   return &ret->root.root;
989 }
990
991 static reloc_howto_type *
992 or1k_reloc_type_lookup (bfd * abfd ATTRIBUTE_UNUSED,
993                         bfd_reloc_code_real_type bcode)
994 {
995   unsigned int i;
996
997   for (i = 0; i < ARRAY_SIZE (or1k_reloc_map); i++)
998     if (or1k_reloc_map[i].bfd_reloc_val == bcode)
999       {
1000         unsigned int ocode = or1k_reloc_map[i].or1k_reloc_val;
1001         if (ocode < (unsigned int) R_OR1K_max)
1002           return &or1k_elf_howto_table[ocode];
1003         else
1004           break;
1005       }
1006
1007   return NULL;
1008 }
1009
1010 static reloc_howto_type *
1011 or1k_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
1012                         const char *r_name)
1013 {
1014   unsigned int i;
1015
1016   for (i = 0; i < R_OR1K_max; i++)
1017     if (or1k_elf_howto_table[i].name != NULL
1018         && strcasecmp (or1k_elf_howto_table[i].name, r_name) == 0)
1019       return &or1k_elf_howto_table[i];
1020
1021   return NULL;
1022 }
1023
1024 /* Set the howto pointer for an Or1k ELF reloc.  */
1025
1026 static bfd_boolean
1027 or1k_info_to_howto_rela (bfd * abfd,
1028                          arelent * cache_ptr,
1029                          Elf_Internal_Rela * dst)
1030 {
1031   unsigned int r_type;
1032
1033   r_type = ELF32_R_TYPE (dst->r_info);
1034   if (r_type >= (unsigned int) R_OR1K_max)
1035     {
1036       /* xgettext:c-format */
1037       _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
1038                           abfd, r_type);
1039       bfd_set_error (bfd_error_bad_value);
1040       return FALSE;
1041     }
1042   cache_ptr->howto = & or1k_elf_howto_table[r_type];
1043   return TRUE;
1044 }
1045
1046
1047 /* Return the relocation value for @tpoff relocations..  */
1048 static bfd_vma
1049 tpoff (struct bfd_link_info *info, bfd_vma address)
1050 {
1051   /* If tls_sec is NULL, we should have signalled an error already.  */
1052   if (elf_hash_table (info)->tls_sec == NULL)
1053     return 0;
1054
1055   /* The thread pointer on or1k stores the address after the TCB where
1056      the data is, just compute the difference. No need to compensate
1057      for the size of TCB.  */
1058   return (address - elf_hash_table (info)->tls_sec->vma);
1059 }
1060
1061 /* Like _bfd_final_link_relocate, but handles non-contiguous fields.  */
1062
1063 static bfd_reloc_status_type
1064 or1k_final_link_relocate (reloc_howto_type *howto, bfd *input_bfd,
1065                           asection *input_section, bfd_byte *contents,
1066                           bfd_vma offset, bfd_vma value)
1067 {
1068   bfd_reloc_status_type status = bfd_reloc_ok;
1069   int size = bfd_get_reloc_size (howto);
1070   bfd_vma x, place;
1071
1072   /* Sanity check the address.  */
1073   if (offset + size > bfd_get_section_limit_octets (input_bfd, input_section))
1074     return bfd_reloc_outofrange;
1075
1076   place = (input_section->output_section->vma
1077            + input_section->output_offset
1078            + (howto->pcrel_offset ? offset : 0));
1079
1080   switch (howto->type)
1081     {
1082     case R_OR1K_AHI16:
1083     case R_OR1K_GOTOFF_AHI16:
1084     case R_OR1K_TLS_IE_AHI16:
1085     case R_OR1K_TLS_LE_AHI16:
1086       /* Adjust the operand to match with a signed LO16.  */
1087       value += 0x8000;
1088       break;
1089
1090     case R_OR1K_INSN_REL_26:
1091       value -= place;
1092       /* Diagnose mis-aligned branch targets.  */
1093       if (value & 3)
1094         status = bfd_reloc_dangerous;
1095       break;
1096
1097     case R_OR1K_PCREL_PG21:
1098     case R_OR1K_GOT_PG21:
1099     case R_OR1K_TLS_GD_PG21:
1100     case R_OR1K_TLS_LDM_PG21:
1101     case R_OR1K_TLS_IE_PG21:
1102       value = (value & -8192) - (place & -8192);
1103       break;
1104
1105     case R_OR1K_LO13:
1106     case R_OR1K_GOT_LO13:
1107     case R_OR1K_TLS_GD_LO13:
1108     case R_OR1K_TLS_LDM_LO13:
1109     case R_OR1K_TLS_IE_LO13:
1110     case R_OR1K_SLO13:
1111       value &= 8191;
1112       break;
1113
1114     default:
1115       if (howto->pc_relative)
1116         value -= place;
1117       break;
1118     }
1119
1120   status = bfd_check_overflow (howto->complain_on_overflow,
1121                                howto->bitsize,
1122                                howto->rightshift,
1123                                bfd_arch_bits_per_address (input_bfd),
1124                                value);
1125   value >>= howto->rightshift;
1126
1127   /* If we're overwriting the entire destination,
1128      then no need to read the current contents.  */
1129   if (size == 0 || howto->dst_mask == N_ONES (size))
1130     x = 0;
1131   else
1132     {
1133       BFD_ASSERT (size == 4);
1134       x = bfd_get_32 (input_bfd, contents + offset);
1135     }
1136
1137   switch (howto->type)
1138     {
1139     case R_OR1K_SLO16:
1140     case R_OR1K_GOTOFF_SLO16:
1141     case R_OR1K_TLS_LE_SLO16:
1142     case R_OR1K_SLO13:
1143       /* The split imm16 field used for stores.  */
1144       x = (x & ~0x3e007ff) | ((value & 0xf800) << 10) | (value & 0x7ff);
1145       break;
1146
1147     default:
1148       {
1149         bfd_vma fieldmask = howto->dst_mask;
1150         value <<= howto->bitpos;
1151         x = (x & ~fieldmask) | (value & fieldmask);
1152       }
1153       break;
1154     }
1155
1156   /* Put the relocated value back in the object file.  */
1157   switch (size)
1158     {
1159     case 0:
1160       break;
1161     case 1:
1162       bfd_put_8 (input_bfd, x, contents + offset);
1163       break;
1164     case 2:
1165       bfd_put_16 (input_bfd, x, contents + offset);
1166       break;
1167     case 4:
1168       bfd_put_32 (input_bfd, x, contents + offset);
1169       break;
1170 #ifdef BFD64
1171     case 8:
1172       bfd_put_64 (input_bfd, x, contents + offset);
1173       break;
1174 #endif
1175     default:
1176       _bfd_error_handler
1177         (_("%pB: Cannot handle relocation value size of %d"),
1178          input_bfd, size);
1179       abort ();
1180     }
1181   return status;
1182 }
1183
1184 /* Relocate an Or1k ELF section.
1185
1186    The RELOCATE_SECTION function is called by the new ELF backend linker
1187    to handle the relocations for a section.
1188
1189    The relocs are always passed as Rela structures; if the section
1190    actually uses Rel structures, the r_addend field will always be
1191    zero.
1192
1193    This function is responsible for adjusting the section contents as
1194    necessary, and (if using Rela relocs and generating a relocatable
1195    output file) adjusting the reloc addend as necessary.
1196
1197    This function does not have to worry about setting the reloc
1198    address or the reloc symbol index.
1199
1200    LOCAL_SYMS is a pointer to the swapped in local symbols.
1201
1202    LOCAL_SECTIONS is an array giving the section in the input file
1203    corresponding to the st_shndx field of each local symbol.
1204
1205    The global hash table entry for the global symbols can be found
1206    via elf_sym_hashes (input_bfd).
1207
1208    When generating relocatable output, this function must handle
1209    STB_LOCAL/STT_SECTION symbols specially.  The output symbol is
1210    going to be the section symbol corresponding to the output
1211    section, which means that the addend must be adjusted
1212    accordingly.  */
1213
1214 static bfd_boolean
1215 or1k_elf_relocate_section (bfd *output_bfd,
1216                            struct bfd_link_info *info,
1217                            bfd *input_bfd,
1218                            asection *input_section,
1219                            bfd_byte *contents,
1220                            Elf_Internal_Rela *relocs,
1221                            Elf_Internal_Sym *local_syms,
1222                            asection **local_sections)
1223 {
1224   Elf_Internal_Shdr *symtab_hdr;
1225   struct elf_link_hash_entry **sym_hashes;
1226   Elf_Internal_Rela *rel;
1227   Elf_Internal_Rela *relend;
1228   struct elf_or1k_link_hash_table *htab = or1k_elf_hash_table (info);
1229   bfd *dynobj;
1230   asection *sreloc;
1231   bfd_vma *local_got_offsets;
1232   asection *sgot, *splt;
1233   bfd_vma plt_base, got_base, got_sym_value;
1234   bfd_boolean ret_val = TRUE;
1235
1236   if (htab == NULL)
1237     return FALSE;
1238
1239   dynobj = htab->root.dynobj;
1240   local_got_offsets = elf_local_got_offsets (input_bfd);
1241
1242   sreloc = elf_section_data (input_section)->sreloc;
1243
1244   splt = htab->root.splt;
1245   plt_base = 0;
1246   if (splt != NULL)
1247     plt_base = splt->output_section->vma + splt->output_offset;
1248
1249   sgot = htab->root.sgot;
1250   got_sym_value = got_base = 0;
1251   if (sgot != NULL)
1252     {
1253       struct elf_link_hash_entry *hgot = htab->root.hgot;
1254       got_sym_value = (hgot->root.u.def.value
1255                        + hgot->root.u.def.section->output_section->vma
1256                        + hgot->root.u.def.section->output_offset);
1257     got_base = sgot->output_section->vma + sgot->output_offset;
1258     }
1259
1260   symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
1261   sym_hashes = elf_sym_hashes (input_bfd);
1262   relend = relocs + input_section->reloc_count;
1263
1264   for (rel = relocs; rel < relend; rel++)
1265     {
1266       reloc_howto_type *howto;
1267       unsigned long r_symndx;
1268       Elf_Internal_Sym *sym;
1269       asection *sec;
1270       struct elf_link_hash_entry *h;
1271       bfd_vma relocation;
1272       bfd_reloc_status_type r;
1273       const char *name = NULL;
1274       int r_type;
1275
1276       r_type = ELF32_R_TYPE (rel->r_info);
1277       r_symndx = ELF32_R_SYM (rel->r_info);
1278
1279       if (r_type == R_OR1K_GNU_VTINHERIT
1280           || r_type == R_OR1K_GNU_VTENTRY)
1281         continue;
1282
1283       if (r_type < 0 || r_type >= (int) R_OR1K_max)
1284         {
1285           _bfd_error_handler
1286             (_("%pB: unknown relocation type %d"),
1287              input_bfd, (int) r_type);
1288           bfd_set_error (bfd_error_bad_value);
1289           ret_val = FALSE;
1290           continue;
1291         }
1292
1293       howto = or1k_elf_howto_table + ELF32_R_TYPE (rel->r_info);
1294       h = NULL;
1295       sym = NULL;
1296       sec = NULL;
1297
1298       if (r_symndx < symtab_hdr->sh_info)
1299         {
1300           sym = local_syms + r_symndx;
1301           sec = local_sections[r_symndx];
1302           relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
1303
1304           name = bfd_elf_string_from_elf_section
1305             (input_bfd, symtab_hdr->sh_link, sym->st_name);
1306           name = (name == NULL) ? bfd_section_name (input_bfd, sec) : name;
1307         }
1308       else
1309         {
1310           bfd_boolean unresolved_reloc, warned, ignored;
1311
1312           RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
1313                                    r_symndx, symtab_hdr, sym_hashes,
1314                                    h, sec, relocation,
1315                                    unresolved_reloc, warned, ignored);
1316           name = h->root.root.string;
1317         }
1318
1319       if (sec != NULL && discarded_section (sec))
1320         RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
1321                                          rel, 1, relend, howto, 0, contents);
1322
1323       if (bfd_link_relocatable (info))
1324         continue;
1325
1326       switch (howto->type)
1327         {
1328         case R_OR1K_PLT26:
1329         case R_OR1K_PLTA26:
1330           /* If the call is not local, redirect the branch to the PLT.
1331              Otherwise do nothing to send the branch to the symbol direct.  */
1332           if (!SYMBOL_CALLS_LOCAL (info, h)
1333               && h->plt.offset != (bfd_vma) -1)
1334             relocation = plt_base + h->plt.offset;
1335
1336           /* Addend should be zero.  */
1337           if (rel->r_addend != 0)
1338             {
1339               _bfd_error_handler
1340                 (_("%pB: addend should be zero for plt relocations"),
1341                  input_bfd);
1342               bfd_set_error (bfd_error_bad_value);
1343               ret_val = FALSE;
1344             }
1345           break;
1346
1347         case R_OR1K_GOT16:
1348         case R_OR1K_GOT_PG21:
1349         case R_OR1K_GOT_LO13:
1350           {
1351             bfd_vma off;
1352
1353             /* Relocation is to the entry for this symbol
1354                in the global offset table.  */
1355           BFD_ASSERT (sgot != NULL);
1356           if (h != NULL)
1357             {
1358               bfd_boolean dyn;
1359
1360               off = h->got.offset;
1361               BFD_ASSERT (off != (bfd_vma) -1);
1362
1363               dyn = htab->root.dynamic_sections_created;
1364               if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn,
1365                                                      bfd_link_pic (info),
1366                                                      h)
1367                   || (bfd_link_pic (info)
1368                       && SYMBOL_REFERENCES_LOCAL (info, h)))
1369                 {
1370                     /* This is actually a static link, or it is a -Bsymbolic
1371                        link and the symbol is defined locally, or the symbol
1372                        was forced to be local because of a version file.
1373                        We must initialize this entry in the GOT.  Since the
1374                        offset must always be a multiple of 4, we use the least
1375                        significant bit to record whether we have initialized
1376                        it already.
1377
1378                      When doing a dynamic link, we create a .rela.got
1379                      relocation entry to initialize the value.  This
1380                      is done in the finish_dynamic_symbol routine.  */
1381                   if ((off & 1) != 0)
1382                     off &= ~1;
1383                   else
1384                     {
1385                       /* Write entry in GOT.  */
1386                       bfd_put_32 (output_bfd, relocation,
1387                                   sgot->contents + off);
1388                       /* Mark GOT entry as having been written.  */
1389                       h->got.offset |= 1;
1390                     }
1391                 }
1392             }
1393           else
1394             {
1395               bfd_byte *loc;
1396
1397               BFD_ASSERT (local_got_offsets != NULL
1398                           && local_got_offsets[r_symndx] != (bfd_vma) -1);
1399
1400               /* Get offset into GOT table.  */
1401               off = local_got_offsets[r_symndx];
1402
1403               /* The offset must always be a multiple of 4.  We use
1404                  the least significant bit to record whether we have
1405                  already processed this entry.  */
1406               if ((off & 1) != 0)
1407                 off &= ~1;
1408               else
1409                 {
1410                   /* Write entry in GOT.  */
1411                   bfd_put_32 (output_bfd, relocation, sgot->contents + off);
1412                   if (bfd_link_pic (info))
1413                     {
1414                       asection *srelgot;
1415                       Elf_Internal_Rela outrel;
1416
1417                       /* We need to generate a R_OR1K_RELATIVE reloc
1418                          for the dynamic linker.  */
1419                         srelgot = bfd_get_section_by_name (dynobj, ".rela.got");
1420                       BFD_ASSERT (srelgot != NULL);
1421
1422                       outrel.r_offset = got_base + off;
1423                       outrel.r_info = ELF32_R_INFO (0, R_OR1K_RELATIVE);
1424                       outrel.r_addend = relocation;
1425                       loc = srelgot->contents;
1426                         loc += (srelgot->reloc_count
1427                                 * sizeof (Elf32_External_Rela));
1428                       bfd_elf32_swap_reloca_out (output_bfd, &outrel,loc);
1429                       ++srelgot->reloc_count;
1430                     }
1431                   local_got_offsets[r_symndx] |= 1;
1432                 }
1433             }
1434
1435             /* The GOT_PG21 and GOT_LO13 relocs are pc-relative,
1436                while the GOT16 reloc is GOT relative.  */
1437             relocation = got_base + off;
1438             if (r_type == R_OR1K_GOT16)
1439               relocation -= got_sym_value;
1440
1441           /* Addend should be zero.  */
1442           if (rel->r_addend != 0)
1443             {
1444               _bfd_error_handler
1445                 (_("%pB: addend should be zero for got relocations"),
1446                  input_bfd);
1447               bfd_set_error (bfd_error_bad_value);
1448               ret_val = FALSE;
1449             }
1450           }
1451           break;
1452
1453         case R_OR1K_GOTOFF_LO16:
1454         case R_OR1K_GOTOFF_HI16:
1455         case R_OR1K_GOTOFF_AHI16:
1456         case R_OR1K_GOTOFF_SLO16:
1457           /* Relocation is offset from GOT.  */
1458           BFD_ASSERT (sgot != NULL);
1459           if (!SYMBOL_REFERENCES_LOCAL (info, h))
1460             {
1461               _bfd_error_handler
1462                 (_("%pB: gotoff relocation against dynamic symbol %s"),
1463                  input_bfd, h->root.root.string);
1464               ret_val = FALSE;
1465               bfd_set_error (bfd_error_bad_value);
1466             }
1467           relocation -= got_sym_value;
1468           break;
1469
1470         case R_OR1K_INSN_REL_26:
1471         case R_OR1K_PCREL_PG21:
1472         case R_OR1K_LO13:
1473         case R_OR1K_SLO13:
1474           /* For a non-shared link, these will reference either the plt
1475              or a .dynbss copy of the symbol.  */
1476           if (bfd_link_pic (info) && !SYMBOL_REFERENCES_LOCAL (info, h))
1477             {
1478               _bfd_error_handler
1479                 (_("%pB: pc-relative relocation against dynamic symbol %s"),
1480                  input_bfd, name);
1481               ret_val = FALSE;
1482               bfd_set_error (bfd_error_bad_value);
1483             }
1484           break;
1485
1486         case R_OR1K_HI_16_IN_INSN:
1487         case R_OR1K_LO_16_IN_INSN:
1488         case R_OR1K_AHI16:
1489         case R_OR1K_SLO16:
1490           if (bfd_link_pic (info))
1491             {
1492               _bfd_error_handler
1493                 (_("%pB: non-pic relocation against symbol %s"),
1494                  input_bfd, name);
1495               ret_val = FALSE;
1496               bfd_set_error (bfd_error_bad_value);
1497             }
1498           break;
1499
1500         case R_OR1K_32:
1501           /* R_OR1K_16? */
1502           {
1503             /* r_symndx will be STN_UNDEF (zero) only for relocs against symbols
1504                from removed linkonce sections, or sections discarded by
1505                a linker script.  */
1506             if (r_symndx == STN_UNDEF
1507                 || (input_section->flags & SEC_ALLOC) == 0)
1508               break;
1509
1510             /* Emit a direct relocation if the symbol is dynamic,
1511                or a RELATIVE reloc for shared objects.  We can omit
1512                RELATIVE relocs to local undefweak symbols.  */
1513             if (bfd_link_pic (info)
1514                 ? (h == NULL
1515                      || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
1516                      || h->root.type != bfd_link_hash_undefweak)
1517                 : (h != NULL
1518                     && h->dynindx != -1
1519                     && !h->non_got_ref
1520                    && ((h->def_dynamic && !h->def_regular)
1521                         || h->root.type == bfd_link_hash_undefweak
1522                         || h->root.type == bfd_link_hash_undefined)))
1523               {
1524                 Elf_Internal_Rela outrel;
1525                 bfd_byte *loc;
1526                 bfd_boolean skip;
1527
1528                 /* When generating a shared object, these relocations
1529                    are copied into the output file to be resolved at run
1530                    time.  */
1531
1532                 BFD_ASSERT (sreloc != NULL);
1533
1534                 skip = FALSE;
1535
1536                 outrel.r_offset =
1537                   _bfd_elf_section_offset (output_bfd, info, input_section,
1538                                            rel->r_offset);
1539                 if (outrel.r_offset == (bfd_vma) -1)
1540                   skip = TRUE;
1541                 else if (outrel.r_offset == (bfd_vma) -2)
1542                   skip = TRUE;
1543                 outrel.r_offset += (input_section->output_section->vma
1544                                     + input_section->output_offset);
1545
1546                 if (skip)
1547                   memset (&outrel, 0, sizeof outrel);
1548                 else if (SYMBOL_REFERENCES_LOCAL (info, h))
1549                   {
1550                     outrel.r_info = ELF32_R_INFO (0, R_OR1K_RELATIVE);
1551                     outrel.r_addend = relocation + rel->r_addend;
1552                   }
1553                 else
1554                   {
1555                     BFD_ASSERT (h->dynindx != -1);
1556                     outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
1557                     outrel.r_addend = rel->r_addend;
1558                   }
1559
1560                 loc = sreloc->contents;
1561                 loc += sreloc->reloc_count++ * sizeof (Elf32_External_Rela);
1562                 bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
1563                 break;
1564               }
1565             break;
1566           }
1567
1568         case R_OR1K_TLS_LDM_HI16:
1569         case R_OR1K_TLS_LDM_LO16:
1570         case R_OR1K_TLS_LDM_PG21:
1571         case R_OR1K_TLS_LDM_LO13:
1572         case R_OR1K_TLS_LDO_HI16:
1573         case R_OR1K_TLS_LDO_LO16:
1574           /* TODO: implement support for local dynamic.  */
1575           BFD_FAIL ();
1576           _bfd_error_handler
1577             (_("%pB: support for local dynamic not implemented"),
1578              input_bfd);
1579           bfd_set_error (bfd_error_bad_value);
1580           return FALSE;
1581
1582         case R_OR1K_TLS_GD_HI16:
1583         case R_OR1K_TLS_GD_LO16:
1584         case R_OR1K_TLS_GD_PG21:
1585         case R_OR1K_TLS_GD_LO13:
1586         case R_OR1K_TLS_IE_HI16:
1587         case R_OR1K_TLS_IE_LO16:
1588         case R_OR1K_TLS_IE_PG21:
1589         case R_OR1K_TLS_IE_LO13:
1590         case R_OR1K_TLS_IE_AHI16:
1591           {
1592             bfd_vma gotoff;
1593             Elf_Internal_Rela rela;
1594             bfd_byte *loc;
1595             int dynamic;
1596
1597             sreloc = bfd_get_section_by_name (dynobj, ".rela.got");
1598
1599             /* Mark as TLS related GOT entry by setting
1600                bit 2 as well as bit 1.  */
1601             if (h != NULL)
1602               {
1603                 gotoff = h->got.offset;
1604                 h->got.offset |= 3;
1605               }
1606             else
1607               {
1608                 gotoff = local_got_offsets[r_symndx];
1609                 local_got_offsets[r_symndx] |= 3;
1610               }
1611
1612             /* Only process the relocation once.  */
1613             if (gotoff & 1)
1614               {
1615                 relocation = sgot->output_offset + (gotoff  & ~3);
1616                 break;
1617               }
1618
1619             BFD_ASSERT (elf_hash_table (info)->hgot == NULL
1620                         || elf_hash_table (info)->hgot->root.u.def.value == 0);
1621
1622             /* Dynamic entries will require relocations. if we do not need
1623                them we will just use the default R_OR1K_NONE and
1624                not set anything.  */
1625             dynamic = bfd_link_pic (info)
1626               || (sec && (sec->flags & SEC_ALLOC) != 0
1627                   && h != NULL
1628                   && (h->root.type == bfd_link_hash_defweak || !h->def_regular));
1629
1630             /* Shared GD.  */
1631             if (dynamic
1632                 && (howto->type == R_OR1K_TLS_GD_HI16
1633                     || howto->type == R_OR1K_TLS_GD_LO16
1634                     || howto->type == R_OR1K_TLS_GD_PG21
1635                     || howto->type == R_OR1K_TLS_GD_LO13))
1636               {
1637                 int i;
1638
1639                 /* Add DTPMOD and DTPOFF GOT and rela entries.  */
1640                 for (i = 0; i < 2; ++i)
1641                   {
1642                     rela.r_offset = got_base + gotoff + i*4;
1643                     if (h != NULL && h->dynindx != -1)
1644                       {
1645                         rela.r_info = ELF32_R_INFO (h->dynindx,
1646                             (i == 0 ? R_OR1K_TLS_DTPMOD : R_OR1K_TLS_DTPOFF));
1647                         rela.r_addend = 0;
1648                       }
1649                     else
1650                       {
1651                         rela.r_info = ELF32_R_INFO (0,
1652                             (i == 0 ? R_OR1K_TLS_DTPMOD : R_OR1K_TLS_DTPOFF));
1653                         rela.r_addend = tpoff (info, relocation);
1654                       }
1655
1656                     loc = sreloc->contents;
1657                     loc += sreloc->reloc_count++ *
1658                       sizeof (Elf32_External_Rela);
1659
1660                     bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
1661                     bfd_put_32 (output_bfd, 0, sgot->contents + gotoff + i*4);
1662                   }
1663               }
1664             /* Static GD.  */
1665             else if (howto->type == R_OR1K_TLS_GD_HI16
1666                      || howto->type == R_OR1K_TLS_GD_LO16
1667                      || howto->type == R_OR1K_TLS_GD_PG21
1668                      || howto->type == R_OR1K_TLS_GD_LO13)
1669               {
1670                 bfd_put_32 (output_bfd, 1, sgot->contents + gotoff);
1671                 bfd_put_32 (output_bfd, tpoff (info, relocation),
1672                     sgot->contents + gotoff + 4);
1673               }
1674             /* Shared IE.  */
1675             else if (dynamic)
1676               {
1677                 /* Add TPOFF GOT and rela entries.  */
1678                 rela.r_offset = got_base + gotoff;
1679                 if (h != NULL && h->dynindx != -1)
1680                   {
1681                     rela.r_info = ELF32_R_INFO (h->dynindx, R_OR1K_TLS_TPOFF);
1682                     rela.r_addend = 0;
1683                   }
1684                 else
1685                   {
1686                     rela.r_info = ELF32_R_INFO (0, R_OR1K_TLS_TPOFF);
1687                     rela.r_addend = tpoff (info, relocation);
1688                   }
1689
1690                 loc = sreloc->contents;
1691                 loc += sreloc->reloc_count++ * sizeof (Elf32_External_Rela);
1692
1693                 bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
1694                 bfd_put_32 (output_bfd, 0, sgot->contents + gotoff);
1695               }
1696             /* Static IE.  */
1697             else
1698               {
1699                 bfd_put_32 (output_bfd, tpoff (info, relocation),
1700                             sgot->contents + gotoff);
1701               }
1702
1703             /* The PG21 and LO13 relocs are pc-relative, while the
1704                rest are GOT relative.  */
1705             relocation = got_base + gotoff;
1706             if (!(r_type == R_OR1K_TLS_GD_PG21
1707                   || r_type == R_OR1K_TLS_GD_LO13
1708                   || r_type == R_OR1K_TLS_IE_PG21
1709                   || r_type == R_OR1K_TLS_IE_LO13))
1710               relocation -= got_sym_value;
1711           }
1712           break;
1713
1714         case R_OR1K_TLS_LE_HI16:
1715         case R_OR1K_TLS_LE_LO16:
1716         case R_OR1K_TLS_LE_AHI16:
1717         case R_OR1K_TLS_LE_SLO16:
1718           /* Relocation is offset from TP.  */
1719           relocation = tpoff (info, relocation);
1720           break;
1721
1722         case R_OR1K_TLS_DTPMOD:
1723         case R_OR1K_TLS_DTPOFF:
1724         case R_OR1K_TLS_TPOFF:
1725           /* These are resolved dynamically on load and shouldn't
1726              be used as linker input.  */
1727           BFD_FAIL ();
1728           _bfd_error_handler
1729             (_("%pB: will not resolve runtime TLS relocation"),
1730              input_bfd);
1731           bfd_set_error (bfd_error_bad_value);
1732           return FALSE;
1733
1734         default:
1735           break;
1736         }
1737
1738       r = or1k_final_link_relocate (howto, input_bfd, input_section, contents,
1739                                     rel->r_offset, relocation + rel->r_addend);
1740
1741       if (r != bfd_reloc_ok)
1742         {
1743           const char *msg = NULL;
1744
1745           switch (r)
1746             {
1747             case bfd_reloc_overflow:
1748               (*info->callbacks->reloc_overflow)
1749                 (info, (h ? &h->root : NULL), name, howto->name,
1750                  (bfd_vma) 0, input_bfd, input_section, rel->r_offset);
1751               break;
1752
1753             case bfd_reloc_undefined:
1754               (*info->callbacks->undefined_symbol)
1755                 (info, name, input_bfd, input_section, rel->r_offset, TRUE);
1756               break;
1757
1758             case bfd_reloc_outofrange:
1759               msg = _("internal error: out of range error");
1760               break;
1761
1762             case bfd_reloc_notsupported:
1763               msg = _("internal error: unsupported relocation error");
1764               break;
1765
1766             case bfd_reloc_dangerous:
1767               msg = _("internal error: dangerous relocation");
1768               break;
1769
1770             default:
1771               msg = _("internal error: unknown error");
1772               break;
1773             }
1774
1775           if (msg)
1776             (*info->callbacks->warning) (info, msg, name, input_bfd,
1777                                          input_section, rel->r_offset);
1778         }
1779     }
1780
1781   return ret_val;
1782 }
1783
1784 /* Return the section that should be marked against GC for a given
1785    relocation.  */
1786
1787 static asection *
1788 or1k_elf_gc_mark_hook (asection *sec,
1789                        struct bfd_link_info *info,
1790                        Elf_Internal_Rela *rel,
1791                        struct elf_link_hash_entry *h,
1792                        Elf_Internal_Sym *sym)
1793 {
1794   if (h != NULL)
1795     switch (ELF32_R_TYPE (rel->r_info))
1796       {
1797       case R_OR1K_GNU_VTINHERIT:
1798       case R_OR1K_GNU_VTENTRY:
1799         return NULL;
1800       }
1801
1802   return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
1803 }
1804
1805 /* Look through the relocs for a section during the first phase.  */
1806
1807 static bfd_boolean
1808 or1k_elf_check_relocs (bfd *abfd,
1809                        struct bfd_link_info *info,
1810                        asection *sec,
1811                        const Elf_Internal_Rela *relocs)
1812 {
1813   Elf_Internal_Shdr *symtab_hdr;
1814   struct elf_link_hash_entry **sym_hashes;
1815   const Elf_Internal_Rela *rel;
1816
1817   const Elf_Internal_Rela *rel_end;
1818   struct elf_or1k_link_hash_table *htab;
1819   bfd *dynobj;
1820   asection *sreloc = NULL;
1821
1822   if (bfd_link_relocatable (info))
1823     return TRUE;
1824
1825   /* Don't do anything special with non-loaded, non-alloced sections.
1826      In particular, any relocs in such sections should not affect GOT
1827      and PLT reference counting (ie. we don't allow them to create GOT
1828      or PLT entries), there's no possibility or desire to optimize TLS
1829      relocs, and there's not much point in propagating relocs to shared
1830      libs that the dynamic linker won't relocate.  */
1831   if ((sec->flags & SEC_ALLOC) == 0)
1832     return TRUE;
1833
1834   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1835   sym_hashes = elf_sym_hashes (abfd);
1836
1837   htab = or1k_elf_hash_table (info);
1838   if (htab == NULL)
1839     return FALSE;
1840
1841   dynobj = htab->root.dynobj;
1842
1843   rel_end = relocs + sec->reloc_count;
1844   for (rel = relocs; rel < rel_end; rel++)
1845     {
1846       struct elf_link_hash_entry *h;
1847       unsigned long r_symndx;
1848       unsigned char tls_type;
1849       int r_type;
1850
1851       r_symndx = ELF32_R_SYM (rel->r_info);
1852       if (r_symndx < symtab_hdr->sh_info)
1853         h = NULL;
1854       else
1855         {
1856           h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1857           while (h->root.type == bfd_link_hash_indirect
1858                  || h->root.type == bfd_link_hash_warning)
1859             h = (struct elf_link_hash_entry *) h->root.u.i.link;
1860         }
1861
1862       r_type = ELF32_R_TYPE (rel->r_info);
1863       switch (r_type)
1864         {
1865         case R_OR1K_TLS_GD_HI16:
1866         case R_OR1K_TLS_GD_LO16:
1867         case R_OR1K_TLS_GD_PG21:
1868         case R_OR1K_TLS_GD_LO13:
1869           tls_type = TLS_GD;
1870           break;
1871         case R_OR1K_TLS_LDM_HI16:
1872         case R_OR1K_TLS_LDM_LO16:
1873         case R_OR1K_TLS_LDM_PG21:
1874         case R_OR1K_TLS_LDM_LO13:
1875         case R_OR1K_TLS_LDO_HI16:
1876         case R_OR1K_TLS_LDO_LO16:
1877           tls_type = TLS_LD;
1878           break;
1879         case R_OR1K_TLS_IE_HI16:
1880         case R_OR1K_TLS_IE_LO16:
1881         case R_OR1K_TLS_IE_PG21:
1882         case R_OR1K_TLS_IE_LO13:
1883         case R_OR1K_TLS_IE_AHI16:
1884           tls_type = TLS_IE;
1885           break;
1886         case R_OR1K_TLS_LE_HI16:
1887         case R_OR1K_TLS_LE_LO16:
1888         case R_OR1K_TLS_LE_AHI16:
1889         case R_OR1K_TLS_LE_SLO16:
1890           tls_type = TLS_LE;
1891           break;
1892         default:
1893           tls_type = TLS_NONE;
1894         }
1895
1896       /* Record TLS type.  */
1897       if (h != NULL)
1898           ((struct elf_or1k_link_hash_entry *) h)->tls_type = tls_type;
1899       else
1900         {
1901           unsigned char *local_tls_type;
1902
1903           /* This is a TLS type record for a local symbol.  */
1904           local_tls_type = (unsigned char *) elf_or1k_local_tls_type (abfd);
1905           if (local_tls_type == NULL)
1906             {
1907               bfd_size_type size;
1908
1909               size = symtab_hdr->sh_info;
1910               local_tls_type = bfd_zalloc (abfd, size);
1911               if (local_tls_type == NULL)
1912                 return FALSE;
1913               elf_or1k_local_tls_type (abfd) = local_tls_type;
1914             }
1915           local_tls_type[r_symndx] = tls_type;
1916         }
1917
1918       switch (r_type)
1919         {
1920           /* This relocation describes the C++ object vtable hierarchy.
1921              Reconstruct it for later use during GC.  */
1922         case R_OR1K_GNU_VTINHERIT:
1923           if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
1924             return FALSE;
1925           break;
1926
1927           /* This relocation describes which C++ vtable entries are actually
1928              used.  Record for later use during GC.  */
1929         case R_OR1K_GNU_VTENTRY:
1930           BFD_ASSERT (h != NULL);
1931           if (h != NULL
1932               && !bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
1933             return FALSE;
1934           break;
1935
1936           /* This relocation requires .plt entry.  */
1937         case R_OR1K_PLTA26:
1938           htab->saw_plta = TRUE;
1939           /* FALLTHRU */
1940         case R_OR1K_PLT26:
1941           if (h != NULL)
1942             {
1943               h->needs_plt = 1;
1944               h->plt.refcount += 1;
1945             }
1946           break;
1947
1948         case R_OR1K_GOT16:
1949         case R_OR1K_GOT_PG21:
1950         case R_OR1K_GOT_LO13:
1951         case R_OR1K_TLS_GD_HI16:
1952         case R_OR1K_TLS_GD_LO16:
1953         case R_OR1K_TLS_GD_PG21:
1954         case R_OR1K_TLS_GD_LO13:
1955         case R_OR1K_TLS_IE_HI16:
1956         case R_OR1K_TLS_IE_LO16:
1957         case R_OR1K_TLS_IE_PG21:
1958         case R_OR1K_TLS_IE_LO13:
1959         case R_OR1K_TLS_IE_AHI16:
1960               if (h != NULL)
1961                 h->got.refcount += 1;
1962               else
1963                 {
1964                   bfd_signed_vma *local_got_refcounts;
1965
1966                   /* This is a global offset table entry for a local symbol.  */
1967                   local_got_refcounts = elf_local_got_refcounts (abfd);
1968                   if (local_got_refcounts == NULL)
1969                     {
1970                       bfd_size_type size;
1971
1972                       size = symtab_hdr->sh_info;
1973                       size *= sizeof (bfd_signed_vma);
1974                       local_got_refcounts = bfd_zalloc (abfd, size);
1975                       if (local_got_refcounts == NULL)
1976                         return FALSE;
1977                       elf_local_got_refcounts (abfd) = local_got_refcounts;
1978                     }
1979                   local_got_refcounts[r_symndx] += 1;
1980                 }
1981           /* FALLTHRU */
1982
1983         case R_OR1K_GOTOFF_HI16:
1984         case R_OR1K_GOTOFF_LO16:
1985         case R_OR1K_GOTOFF_AHI16:
1986         case R_OR1K_GOTOFF_SLO16:
1987           if (htab->root.sgot == NULL)
1988             {
1989               if (dynobj == NULL)
1990                 htab->root.dynobj = dynobj = abfd;
1991               if (!_bfd_elf_create_got_section (dynobj, info))
1992                 return FALSE;
1993             }
1994           break;
1995
1996         case R_OR1K_INSN_REL_26:
1997         case R_OR1K_HI_16_IN_INSN:
1998         case R_OR1K_LO_16_IN_INSN:
1999         case R_OR1K_AHI16:
2000         case R_OR1K_SLO16:
2001         case R_OR1K_32:
2002         case R_OR1K_PCREL_PG21:
2003         case R_OR1K_LO13:
2004         case R_OR1K_SLO13:
2005           {
2006             if (h != NULL && !bfd_link_pic (info))
2007               {
2008                 /* We may need a copy reloc.  */
2009                 h->non_got_ref = 1;
2010
2011                 /* We may also need a .plt entry.  */
2012                 h->plt.refcount += 1;
2013                 if (r_type != R_OR1K_INSN_REL_26)
2014                   h->pointer_equality_needed = 1;
2015               }
2016
2017             /* If we are creating a shared library, and this is a reloc
2018                against a global symbol, or a non PC relative reloc
2019                against a local symbol, then we need to copy the reloc
2020                into the shared library.  However, if we are linking with
2021                -Bsymbolic, we do not need to copy a reloc against a
2022                global symbol which is defined in an object we are
2023                including in the link (i.e., DEF_REGULAR is set).  At
2024                this point we have not seen all the input files, so it is
2025                possible that DEF_REGULAR is not set now but will be set
2026                later (it is never cleared).  In case of a weak definition,
2027                DEF_REGULAR may be cleared later by a strong definition in
2028                a shared library.  We account for that possibility below by
2029                storing information in the relocs_copied field of the hash
2030                table entry.  A similar situation occurs when creating
2031                shared libraries and symbol visibility changes render the
2032                symbol local.
2033
2034                If on the other hand, we are creating an executable, we
2035                may need to keep relocations for symbols satisfied by a
2036                dynamic library if we manage to avoid copy relocs for the
2037                symbol.  */
2038
2039             if ((bfd_link_pic (info)
2040                  && (sec->flags & SEC_ALLOC) != 0
2041                  && (r_type != R_OR1K_INSN_REL_26
2042                      || (h != NULL
2043                          && (!SYMBOLIC_BIND (info, h)
2044                              || h->root.type == bfd_link_hash_defweak
2045                              || !h->def_regular))))
2046                 || (!bfd_link_pic (info)
2047                     && (sec->flags & SEC_ALLOC) != 0
2048                     && h != NULL
2049                     && (h->root.type == bfd_link_hash_defweak
2050                         || !h->def_regular)))
2051               {
2052                 struct elf_dyn_relocs *p;
2053                 struct elf_dyn_relocs **head;
2054
2055                 /* When creating a shared object, we must copy these
2056                    relocs into the output file.  We create a reloc
2057                    section in dynobj and make room for the reloc.  */
2058                 if (sreloc == NULL)
2059                   {
2060                     const char *name;
2061                     unsigned int strndx = elf_elfheader (abfd)->e_shstrndx;
2062                     unsigned int shnam = _bfd_elf_single_rel_hdr (sec)->sh_name;
2063
2064                     name = bfd_elf_string_from_elf_section (abfd, strndx, shnam);
2065                     if (name == NULL)
2066                       return FALSE;
2067
2068                     if (strncmp (name, ".rela", 5) != 0
2069                         || strcmp (bfd_get_section_name (abfd, sec),
2070                                    name + 5) != 0)
2071                       {
2072                         _bfd_error_handler
2073                           /* xgettext:c-format */
2074                           (_("%pB: bad relocation section name `%s\'"),
2075                            abfd, name);
2076                       }
2077
2078                     if (htab->root.dynobj == NULL)
2079                       htab->root.dynobj = abfd;
2080                     dynobj = htab->root.dynobj;
2081
2082                     sreloc = bfd_get_section_by_name (dynobj, name);
2083                     if (sreloc == NULL)
2084                       {
2085                         sreloc = _bfd_elf_make_dynamic_reloc_section
2086                           (sec, dynobj, 2, abfd, /*rela?*/ TRUE);
2087
2088                         if (sreloc == NULL)
2089                           return FALSE;
2090                       }
2091                     elf_section_data (sec)->sreloc = sreloc;
2092                   }
2093
2094                 /* If this is a global symbol, we count the number of
2095                    relocations we need for this symbol.  */
2096                 if (h != NULL)
2097                   head = &((struct elf_or1k_link_hash_entry *) h)->dyn_relocs;
2098                 else
2099                   {
2100                     /* Track dynamic relocs needed for local syms too.
2101                        We really need local syms available to do this
2102                        easily.  Oh well.  */
2103
2104                     asection *s;
2105                     Elf_Internal_Sym *isym;
2106                     void *vpp;
2107
2108                     isym = bfd_sym_from_r_symndx (&htab->sym_sec,
2109                                                   abfd, r_symndx);
2110                     if (isym == NULL)
2111                       return FALSE;
2112
2113                     s = bfd_section_from_elf_index (abfd, isym->st_shndx);
2114                     if (s == NULL)
2115                       return FALSE;
2116
2117                     vpp = &elf_section_data (s)->local_dynrel;
2118                     head = (struct elf_dyn_relocs **) vpp;
2119                   }
2120
2121                 p = *head;
2122                 if (p == NULL || p->sec != sec)
2123                   {
2124                     bfd_size_type amt = sizeof *p;
2125                     p = ((struct elf_dyn_relocs *)
2126                          bfd_alloc (htab->root.dynobj, amt));
2127                     if (p == NULL)
2128                       return FALSE;
2129                     p->next = *head;
2130                     *head = p;
2131                     p->sec = sec;
2132                     p->count = 0;
2133                     p->pc_count = 0;
2134                   }
2135
2136                 p->count += 1;
2137                 if (r_type == R_OR1K_INSN_REL_26)
2138                   p->pc_count += 1;
2139               }
2140           }
2141           break;
2142         }
2143     }
2144
2145   return TRUE;
2146 }
2147
2148 static void
2149 or1k_write_plt_entry (bfd *output_bfd, bfd_byte *contents, unsigned insn1,
2150                       unsigned insn2, unsigned insn3, unsigned insnj)
2151 {
2152   unsigned nodelay = elf_elfheader (output_bfd)->e_flags & EF_OR1K_NODELAY;
2153   unsigned insn4;
2154
2155   /* Honor the no-delay-slot setting.  */
2156   if (insn3 == OR1K_NOP)
2157     {
2158       insn4 = insn3;
2159       if (nodelay)
2160         insn3 = insnj;
2161       else
2162         insn3 = insn2, insn2 = insnj;
2163     }
2164   else
2165     {
2166       if (nodelay)
2167         insn4 = insnj;
2168       else
2169         insn4 = insn3, insn3 = insnj;
2170     }
2171
2172   bfd_put_32 (output_bfd, insn1, contents);
2173   bfd_put_32 (output_bfd, insn2, contents + 4);
2174   bfd_put_32 (output_bfd, insn3, contents + 8);
2175   bfd_put_32 (output_bfd, insn4, contents + 12);
2176 }
2177
2178 /* Finish up the dynamic sections.  */
2179
2180 static bfd_boolean
2181 or1k_elf_finish_dynamic_sections (bfd *output_bfd,
2182                                   struct bfd_link_info *info)
2183 {
2184   bfd *dynobj;
2185   asection *sdyn, *sgot;
2186   struct elf_or1k_link_hash_table *htab;
2187
2188   htab = or1k_elf_hash_table (info);
2189   if (htab == NULL)
2190     return FALSE;
2191
2192   dynobj = htab->root.dynobj;
2193
2194   sgot = htab->root.sgotplt;
2195   sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
2196
2197   if (htab->root.dynamic_sections_created)
2198     {
2199       asection *splt;
2200       Elf32_External_Dyn *dyncon, *dynconend;
2201
2202       BFD_ASSERT (sgot != NULL && sdyn != NULL);
2203
2204       dyncon = (Elf32_External_Dyn *) sdyn->contents;
2205       dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
2206
2207       for (; dyncon < dynconend; dyncon++)
2208         {
2209           Elf_Internal_Dyn dyn;
2210           asection *s;
2211
2212           bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
2213
2214           switch (dyn.d_tag)
2215             {
2216             default:
2217               continue;
2218
2219             case DT_PLTGOT:
2220               s = htab->root.sgotplt;
2221               dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
2222               break;
2223
2224             case DT_JMPREL:
2225               s = htab->root.srelplt;
2226               dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
2227               break;
2228
2229             case DT_PLTRELSZ:
2230               s = htab->root.srelplt;
2231               dyn.d_un.d_val = s->size;
2232               break;
2233             }
2234           bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
2235         }
2236
2237
2238       /* Fill in the first entry in the procedure linkage table.  */
2239       splt = htab->root.splt;
2240       if (splt && splt->size > 0)
2241         {
2242           unsigned plt0, plt1, plt2;
2243           bfd_vma got_addr = sgot->output_section->vma + sgot->output_offset;
2244
2245           /* Note we force 16 byte alignment on the .got, so that
2246              the movhi/adrp can be shared between the two loads.  */
2247
2248           if (htab->saw_plta)
2249             {
2250               bfd_vma pc = splt->output_section->vma + splt->output_offset;
2251               unsigned pa = ((got_addr >> 13) - (pc >> 13)) & 0x1fffff;
2252               unsigned po = got_addr & 0x1fff;
2253               plt0 = OR1K_ADRP(12) | pa;
2254               plt1 = OR1K_LWZ(15,12) | (po + 8);
2255               plt2 = OR1K_LWZ(12,12) | (po + 4);
2256             }
2257           else if (bfd_link_pic (info))
2258             {
2259               plt0 = OR1K_LWZ(15, 16) | 8;      /* .got+8 */
2260               plt1 = OR1K_LWZ(12, 16) | 4;      /* .got+4 */
2261               plt2 = OR1K_NOP;
2262             }
2263           else
2264             {
2265               unsigned ha = ((got_addr + 0x8000) >> 16) & 0xffff;
2266               unsigned lo = got_addr & 0xffff;
2267               plt0 = OR1K_MOVHI(12) | ha;
2268               plt1 = OR1K_LWZ(15,12) | (lo + 8);
2269               plt2 = OR1K_LWZ(12,12) | (lo + 4);
2270             }
2271
2272           or1k_write_plt_entry (output_bfd, splt->contents,
2273                                 plt0, plt1, plt2, OR1K_JR(15));
2274
2275           elf_section_data (splt->output_section)->this_hdr.sh_entsize = 4;
2276         }
2277     }
2278
2279   /* Set the first entry in the global offset table to the address of
2280      the dynamic section.  */
2281   if (sgot && sgot->size > 0)
2282     {
2283       if (sdyn == NULL)
2284         bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents);
2285       else
2286         bfd_put_32 (output_bfd,
2287                     sdyn->output_section->vma + sdyn->output_offset,
2288                     sgot->contents);
2289       elf_section_data (sgot->output_section)->this_hdr.sh_entsize = 4;
2290     }
2291
2292   if (htab->root.sgot && htab->root.sgot->size > 0)
2293     elf_section_data (htab->root.sgot->output_section)->this_hdr.sh_entsize = 4;
2294
2295   return TRUE;
2296 }
2297
2298 /* Finish up dynamic symbol handling.  We set the contents of various
2299    dynamic sections here.  */
2300
2301 static bfd_boolean
2302 or1k_elf_finish_dynamic_symbol (bfd *output_bfd,
2303                                 struct bfd_link_info *info,
2304                                 struct elf_link_hash_entry *h,
2305                                 Elf_Internal_Sym *sym)
2306 {
2307   struct elf_or1k_link_hash_table *htab;
2308   bfd_byte *loc;
2309
2310   htab = or1k_elf_hash_table (info);
2311   if (htab == NULL)
2312     return FALSE;
2313
2314   if (h->plt.offset != (bfd_vma) -1)
2315     {
2316       unsigned int plt0, plt1, plt2;
2317       asection *splt;
2318       asection *sgot;
2319       asection *srela;
2320       bfd_vma plt_base_addr;
2321       bfd_vma plt_addr;
2322       bfd_vma plt_index;
2323       bfd_vma plt_reloc;
2324       bfd_vma got_base_addr;
2325       bfd_vma got_offset;
2326       bfd_vma got_addr;
2327       Elf_Internal_Rela rela;
2328
2329       /* This symbol has an entry in the procedure linkage table.  Set
2330          it up.  */
2331       BFD_ASSERT (h->dynindx != -1);
2332
2333       splt = htab->root.splt;
2334       sgot = htab->root.sgotplt;
2335       srela = htab->root.srelplt;
2336       BFD_ASSERT (splt != NULL && sgot != NULL && srela != NULL);
2337
2338       plt_base_addr = splt->output_section->vma + splt->output_offset;
2339       got_base_addr = sgot->output_section->vma + sgot->output_offset;
2340
2341       /* Get the index in the procedure linkage table which
2342          corresponds to this symbol.  This is the index of this symbol
2343          in all the symbols for which we are making plt entries.  The
2344          first entry in the procedure linkage table is reserved.  */
2345       plt_index = h->plt.offset / PLT_ENTRY_SIZE - 1;
2346       plt_addr = plt_base_addr + h->plt.offset;
2347       plt_reloc = plt_index * sizeof (Elf32_External_Rela);
2348
2349       /* Get the offset into the .got table of the entry that
2350         corresponds to this function.  Each .got entry is 4 bytes.
2351         The first three are reserved.  */
2352       got_offset = (plt_index + 3) * 4;
2353       got_addr = got_base_addr + got_offset;
2354
2355       /* Fill in the entry in the procedure linkage table.  */
2356       if (htab->saw_plta)
2357         {
2358           unsigned pa = ((got_addr >> 13) - (plt_addr >> 13)) & 0x1fffff;
2359           unsigned po = (got_addr & 0x1fff);
2360           plt0 = OR1K_ADRP(12) | pa;
2361           plt1 = OR1K_LWZ(12,12) | po;
2362           plt2 = OR1K_ORI0(11) | plt_reloc;
2363         }
2364       else if (bfd_link_pic (info))
2365         {
2366           plt0 = OR1K_LWZ(12,16) | got_offset;
2367           plt1 = OR1K_ORI0(11) | plt_reloc;
2368           plt2 = OR1K_NOP;
2369         }
2370       else
2371         {
2372           unsigned ha = ((got_addr + 0x8000) >> 16) & 0xffff;
2373           unsigned lo = got_addr & 0xffff;
2374           plt0 = OR1K_MOVHI(12) | ha;
2375           plt1 = OR1K_LWZ(12,12) | lo;
2376           plt2 = OR1K_ORI0(11) | plt_reloc;
2377         }
2378
2379       or1k_write_plt_entry (output_bfd, splt->contents + h->plt.offset,
2380                             plt0, plt1, plt2, OR1K_JR(12));
2381
2382       /* Fill in the entry in the global offset table.  */
2383       bfd_put_32 (output_bfd, plt_addr, sgot->contents + got_offset);
2384
2385       /* Fill in the entry in the .rela.plt section.  */
2386       rela.r_offset = got_addr;
2387       rela.r_info = ELF32_R_INFO (h->dynindx, R_OR1K_JMP_SLOT);
2388       rela.r_addend = 0;
2389       loc = srela->contents;
2390       loc += plt_index * sizeof (Elf32_External_Rela);
2391       bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
2392
2393       if (!h->def_regular)
2394         {
2395           /* Mark the symbol as undefined, rather than as defined in
2396              the .plt section.  Leave the value alone.  */
2397           sym->st_shndx = SHN_UNDEF;
2398         }
2399     }
2400
2401   if (h->got.offset != (bfd_vma) -1
2402       && (h->got.offset & 2) == 0) /* Homemade TLS check.  */
2403     {
2404       asection *sgot;
2405       asection *srela;
2406       Elf_Internal_Rela rela;
2407
2408       /* This symbol has an entry in the global offset table.  Set it
2409          up.  */
2410       sgot = htab->root.sgot;
2411       srela = htab->root.srelgot;
2412       BFD_ASSERT (sgot != NULL && srela != NULL);
2413
2414       rela.r_offset = (sgot->output_section->vma
2415                        + sgot->output_offset
2416                        + (h->got.offset &~ 1));
2417
2418       /* If this is a -Bsymbolic link, and the symbol is defined
2419          locally, we just want to emit a RELATIVE reloc.  Likewise if
2420          the symbol was forced to be local because of a version file.
2421          The entry in the global offset table will already have been
2422          initialized in the relocate_section function.  */
2423       if (bfd_link_pic (info) && SYMBOL_REFERENCES_LOCAL (info, h))
2424         {
2425           rela.r_info = ELF32_R_INFO (0, R_OR1K_RELATIVE);
2426           rela.r_addend = (h->root.u.def.value
2427                            + h->root.u.def.section->output_section->vma
2428                            + h->root.u.def.section->output_offset);
2429         }
2430       else
2431         {
2432           BFD_ASSERT ((h->got.offset & 1) == 0);
2433           bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + h->got.offset);
2434           rela.r_info = ELF32_R_INFO (h->dynindx, R_OR1K_GLOB_DAT);
2435           rela.r_addend = 0;
2436         }
2437
2438       loc = srela->contents;
2439       loc += srela->reloc_count * sizeof (Elf32_External_Rela);
2440       bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
2441       ++srela->reloc_count;
2442     }
2443
2444   if (h->needs_copy)
2445     {
2446       asection *s;
2447       Elf_Internal_Rela rela;
2448
2449       /* This symbols needs a copy reloc.  Set it up.  */
2450       BFD_ASSERT (h->dynindx != -1
2451                   && (h->root.type == bfd_link_hash_defined
2452                       || h->root.type == bfd_link_hash_defweak));
2453
2454       rela.r_offset = (h->root.u.def.value
2455                        + h->root.u.def.section->output_section->vma
2456                        + h->root.u.def.section->output_offset);
2457       rela.r_info = ELF32_R_INFO (h->dynindx, R_OR1K_COPY);
2458       rela.r_addend = 0;
2459       if (h->root.u.def.section == htab->root.sdynrelro)
2460         s = htab->root.sreldynrelro;
2461       else
2462         s = htab->root.srelbss;
2463       loc = s->contents + s->reloc_count * sizeof (Elf32_External_Rela);
2464       bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
2465       ++s->reloc_count;
2466     }
2467
2468   /* Mark some specially defined symbols as absolute.  */
2469   if (strcmp (h->root.root.string, "_DYNAMIC") == 0
2470       || h == htab->root.hgot)
2471     sym->st_shndx = SHN_ABS;
2472
2473   return TRUE;
2474 }
2475
2476 static enum elf_reloc_type_class
2477 or1k_elf_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED,
2478                            const asection *rel_sec ATTRIBUTE_UNUSED,
2479                            const Elf_Internal_Rela *rela)
2480 {
2481   switch ((int) ELF32_R_TYPE (rela->r_info))
2482     {
2483     case R_OR1K_RELATIVE:  return reloc_class_relative;
2484     case R_OR1K_JMP_SLOT:  return reloc_class_plt;
2485     case R_OR1K_COPY:      return reloc_class_copy;
2486     default:               return reloc_class_normal;
2487     }
2488 }
2489
2490 /* Find dynamic relocs for H that apply to read-only sections.  */
2491
2492 static asection *
2493 readonly_dynrelocs (struct elf_link_hash_entry *h)
2494 {
2495   struct elf_dyn_relocs *p;
2496   struct elf_or1k_link_hash_entry *eh = (struct elf_or1k_link_hash_entry *) h;
2497
2498   for (p = eh->dyn_relocs; p != NULL; p = p->next)
2499     {
2500       asection *s = p->sec->output_section;
2501
2502       if (s != NULL && (s->flags & SEC_READONLY) != 0)
2503         return p->sec;
2504     }
2505   return NULL;
2506 }
2507
2508 /* Adjust a symbol defined by a dynamic object and referenced by a
2509    regular object.  The current definition is in some section of the
2510    dynamic object, but we're not including those sections.  We have to
2511    change the definition to something the rest of the link can
2512    understand.  */
2513
2514 static bfd_boolean
2515 or1k_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
2516                                 struct elf_link_hash_entry *h)
2517 {
2518   struct elf_or1k_link_hash_table *htab;
2519   bfd *dynobj;
2520   asection *s, *srel;
2521
2522   dynobj = elf_hash_table (info)->dynobj;
2523
2524   /* Make sure we know what is going on here.  */
2525   BFD_ASSERT (dynobj != NULL
2526               && (h->needs_plt
2527                   || h->is_weakalias
2528                   || (h->def_dynamic
2529                       && h->ref_regular
2530                       && !h->def_regular)));
2531
2532   /* If this is a function, put it in the procedure linkage table.  We
2533      will fill in the contents of the procedure linkage table later,
2534      when we know the address of the .got section.  */
2535   if (h->type == STT_FUNC
2536       || h->needs_plt)
2537     {
2538       if (! bfd_link_pic (info)
2539           && !h->def_dynamic
2540           && !h->ref_dynamic
2541           && h->root.type != bfd_link_hash_undefweak
2542           && h->root.type != bfd_link_hash_undefined)
2543         {
2544           /* This case can occur if we saw a PLT reloc in an input
2545              file, but the symbol was never referred to by a dynamic
2546              object.  In such a case, we don't actually need to build
2547              a procedure linkage table, and we can just do a PCREL
2548              reloc instead.  */
2549           h->plt.offset = (bfd_vma) -1;
2550           h->needs_plt = 0;
2551         }
2552
2553       return TRUE;
2554     }
2555   else
2556     h->plt.offset = (bfd_vma) -1;
2557
2558   /* If this is a weak symbol, and there is a real definition, the
2559      processor independent code will have arranged for us to see the
2560      real definition first, and we can just use the same value.  */
2561   if (h->is_weakalias)
2562     {
2563       struct elf_link_hash_entry *def = weakdef (h);
2564       BFD_ASSERT (def->root.type == bfd_link_hash_defined);
2565       h->root.u.def.section = def->root.u.def.section;
2566       h->root.u.def.value = def->root.u.def.value;
2567       return TRUE;
2568     }
2569
2570   /* This is a reference to a symbol defined by a dynamic object which
2571      is not a function.  */
2572
2573   /* If we are creating a shared library, we must presume that the
2574      only references to the symbol are via the global offset table.
2575      For such cases we need not do anything here; the relocations will
2576      be handled correctly by relocate_section.  */
2577   if (bfd_link_pic (info))
2578     return TRUE;
2579
2580   /* If there are no references to this symbol that do not use the
2581      GOT, we don't need to generate a copy reloc.  */
2582   if (!h->non_got_ref)
2583     return TRUE;
2584
2585   /* If -z nocopyreloc was given, we won't generate them either.  */
2586   if (info->nocopyreloc)
2587     {
2588       h->non_got_ref = 0;
2589       return TRUE;
2590     }
2591
2592   /* If we don't find any dynamic relocs in read-only sections, then
2593      we'll be keeping the dynamic relocs and avoiding the copy reloc.  */
2594   if (!readonly_dynrelocs (h))
2595     {
2596       h->non_got_ref = 0;
2597       return TRUE;
2598     }
2599
2600   /* We must allocate the symbol in our .dynbss section, which will
2601      become part of the .bss section of the executable.  There will be
2602      an entry for this symbol in the .dynsym section.  The dynamic
2603      object will contain position independent code, so all references
2604      from the dynamic object to this symbol will go through the global
2605      offset table.  The dynamic linker will use the .dynsym entry to
2606      determine the address it must put in the global offset table, so
2607      both the dynamic object and the regular object will refer to the
2608      same memory location for the variable.  */
2609
2610   htab = or1k_elf_hash_table (info);
2611   if (htab == NULL)
2612     return FALSE;
2613
2614   /* We must generate a R_OR1K_COPY reloc to tell the dynamic linker
2615      to copy the initial value out of the dynamic object and into the
2616      runtime process image.  We need to remember the offset into the
2617      .rela.bss section we are going to use.  */
2618   if ((h->root.u.def.section->flags & SEC_READONLY) != 0)
2619     {
2620       s = htab->root.sdynrelro;
2621       srel = htab->root.sreldynrelro;
2622     }
2623   else
2624     {
2625       s = htab->root.sdynbss;
2626       srel = htab->root.srelbss;
2627     }
2628   if ((h->root.u.def.section->flags & SEC_ALLOC) != 0 && h->size != 0)
2629     {
2630       srel->size += sizeof (Elf32_External_Rela);
2631       h->needs_copy = 1;
2632     }
2633
2634   return _bfd_elf_adjust_dynamic_copy (info, h, s);
2635 }
2636
2637 /* Allocate space in .plt, .got and associated reloc sections for
2638    dynamic relocs.  */
2639
2640 static bfd_boolean
2641 allocate_dynrelocs (struct elf_link_hash_entry *h, void * inf)
2642 {
2643   struct bfd_link_info *info;
2644   struct elf_or1k_link_hash_table *htab;
2645   struct elf_or1k_link_hash_entry *eh;
2646   struct elf_dyn_relocs *p;
2647
2648   if (h->root.type == bfd_link_hash_indirect)
2649     return TRUE;
2650
2651   info = (struct bfd_link_info *) inf;
2652   htab = or1k_elf_hash_table (info);
2653   if (htab == NULL)
2654     return FALSE;
2655
2656   eh = (struct elf_or1k_link_hash_entry *) h;
2657
2658   if (htab->root.dynamic_sections_created
2659       && h->plt.refcount > 0)
2660     {
2661       /* Make sure this symbol is output as a dynamic symbol.
2662          Undefined weak syms won't yet be marked as dynamic.  */
2663       if (h->dynindx == -1
2664           && !h->forced_local)
2665         {
2666           if (! bfd_elf_link_record_dynamic_symbol (info, h))
2667             return FALSE;
2668         }
2669
2670       if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, bfd_link_pic (info), h))
2671         {
2672           asection *s = htab->root.splt;
2673
2674           /* If this is the first .plt entry, make room for the special
2675              first entry.  */
2676           if (s->size == 0)
2677             s->size = PLT_ENTRY_SIZE;
2678
2679           h->plt.offset = s->size;
2680
2681           /* If this symbol is not defined in a regular file, and we are
2682              not generating a shared library, then set the symbol to this
2683              location in the .plt.  This is required to make function
2684              pointers compare as equal between the normal executable and
2685              the shared library.  */
2686           if (! bfd_link_pic (info)
2687               && !h->def_regular)
2688             {
2689               h->root.u.def.section = s;
2690               h->root.u.def.value = h->plt.offset;
2691             }
2692
2693           /* Make room for this entry.  */
2694           s->size += PLT_ENTRY_SIZE;
2695
2696           /* We also need to make an entry in the .got.plt section, which
2697              will be placed in the .got section by the linker script.  */
2698           htab->root.sgotplt->size += 4;
2699
2700           /* We also need to make an entry in the .rel.plt section.  */
2701           htab->root.srelplt->size += sizeof (Elf32_External_Rela);
2702         }
2703       else
2704         {
2705           h->plt.offset = (bfd_vma) -1;
2706           h->needs_plt = 0;
2707         }
2708     }
2709   else
2710     {
2711       h->plt.offset = (bfd_vma) -1;
2712       h->needs_plt = 0;
2713     }
2714
2715   if (h->got.refcount > 0)
2716     {
2717       asection *s;
2718       bfd_boolean dyn;
2719       unsigned char tls_type;
2720
2721       /* Make sure this symbol is output as a dynamic symbol.
2722          Undefined weak syms won't yet be marked as dynamic.  */
2723       if (h->dynindx == -1
2724           && !h->forced_local)
2725         {
2726           if (! bfd_elf_link_record_dynamic_symbol (info, h))
2727             return FALSE;
2728         }
2729
2730       s = htab->root.sgot;
2731
2732       h->got.offset = s->size;
2733
2734       tls_type = ((struct elf_or1k_link_hash_entry *) h)->tls_type;
2735
2736       /* TLS GD requires two GOT and two relocs.  */
2737       if (tls_type == TLS_GD)
2738         s->size += 8;
2739       else
2740         s->size += 4;
2741       dyn = htab->root.dynamic_sections_created;
2742       if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, bfd_link_pic (info), h))
2743         {
2744           if (tls_type == TLS_GD)
2745             htab->root.srelgot->size += 2 * sizeof (Elf32_External_Rela);
2746           else
2747             htab->root.srelgot->size += sizeof (Elf32_External_Rela);
2748         }
2749     }
2750   else
2751     h->got.offset = (bfd_vma) -1;
2752
2753   if (eh->dyn_relocs == NULL)
2754     return TRUE;
2755
2756   /* In the shared -Bsymbolic case, discard space allocated for
2757      dynamic pc-relative relocs against symbols which turn out to be
2758      defined in regular objects.  For the normal shared case, discard
2759      space for pc-relative relocs that have become local due to symbol
2760      visibility changes.  */
2761
2762   if (bfd_link_pic (info))
2763     {
2764       if (SYMBOL_CALLS_LOCAL (info, h))
2765         {
2766           struct elf_dyn_relocs **pp;
2767
2768           for (pp = &eh->dyn_relocs; (p = *pp) != NULL;)
2769             {
2770               p->count -= p->pc_count;
2771               p->pc_count = 0;
2772               if (p->count == 0)
2773                 *pp = p->next;
2774               else
2775                 pp = &p->next;
2776             }
2777         }
2778
2779       /* Also discard relocs on undefined weak syms with non-default
2780          visibility.  */
2781       if (eh->dyn_relocs != NULL
2782           && h->root.type == bfd_link_hash_undefweak)
2783         {
2784           if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
2785             eh->dyn_relocs = NULL;
2786
2787           /* Make sure undefined weak symbols are output as a dynamic
2788              symbol in PIEs.  */
2789           else if (h->dynindx == -1
2790                    && !h->forced_local)
2791             {
2792               if (! bfd_elf_link_record_dynamic_symbol (info, h))
2793                 return FALSE;
2794             }
2795         }
2796     }
2797   else
2798     {
2799       /* For the non-shared case, discard space for relocs against
2800          symbols which turn out to need copy relocs or are not
2801          dynamic.  */
2802
2803       if (!h->non_got_ref
2804           && ((h->def_dynamic
2805                && !h->def_regular)
2806               || (htab->root.dynamic_sections_created
2807                   && (h->root.type == bfd_link_hash_undefweak
2808                       || h->root.type == bfd_link_hash_undefined))))
2809         {
2810           /* Make sure this symbol is output as a dynamic symbol.
2811              Undefined weak syms won't yet be marked as dynamic.  */
2812           if (h->dynindx == -1
2813               && !h->forced_local)
2814             {
2815               if (! bfd_elf_link_record_dynamic_symbol (info, h))
2816                 return FALSE;
2817             }
2818
2819           /* If that succeeded, we know we'll be keeping all the
2820              relocs.  */
2821           if (h->dynindx != -1)
2822             goto keep;
2823         }
2824
2825       eh->dyn_relocs = NULL;
2826
2827     keep: ;
2828     }
2829
2830   /* Finally, allocate space.  */
2831   for (p = eh->dyn_relocs; p != NULL; p = p->next)
2832     {
2833       asection *sreloc = elf_section_data (p->sec)->sreloc;
2834       sreloc->size += p->count * sizeof (Elf32_External_Rela);
2835     }
2836
2837   return TRUE;
2838 }
2839
2840 /* Set DF_TEXTREL if we find any dynamic relocs that apply to
2841    read-only sections.  */
2842
2843 static bfd_boolean
2844 maybe_set_textrel (struct elf_link_hash_entry *h, void *info_p)
2845 {
2846   asection *sec;
2847
2848   if (h->root.type == bfd_link_hash_indirect)
2849     return TRUE;
2850
2851   sec = readonly_dynrelocs (h);
2852   if (sec != NULL)
2853     {
2854       struct bfd_link_info *info = (struct bfd_link_info *) info_p;
2855
2856       info->flags |= DF_TEXTREL;
2857       info->callbacks->minfo
2858         (_("%pB: dynamic relocation against `%pT' in read-only section `%pA'\n"),
2859          sec->owner, h->root.root.string, sec);
2860
2861       /* Not an error, just cut short the traversal.  */
2862       return FALSE;
2863     }
2864   return TRUE;
2865 }
2866
2867 /* Set the sizes of the dynamic sections.  */
2868
2869 static bfd_boolean
2870 or1k_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
2871                                 struct bfd_link_info *info)
2872 {
2873   struct elf_or1k_link_hash_table *htab;
2874   bfd *dynobj;
2875   asection *s;
2876   bfd_boolean relocs;
2877   bfd *ibfd;
2878
2879   htab = or1k_elf_hash_table (info);
2880   if (htab == NULL)
2881     return FALSE;
2882
2883   dynobj = htab->root.dynobj;
2884   BFD_ASSERT (dynobj != NULL);
2885
2886   if (htab->root.dynamic_sections_created)
2887     {
2888       /* Set the contents of the .interp section to the interpreter.  */
2889       if (bfd_link_executable (info) && !info->nointerp)
2890         {
2891           s = bfd_get_section_by_name (dynobj, ".interp");
2892           BFD_ASSERT (s != NULL);
2893           s->size = sizeof ELF_DYNAMIC_INTERPRETER;
2894           s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
2895         }
2896     }
2897
2898   /* Set up .got offsets for local syms, and space for local dynamic
2899      relocs.  */
2900   for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
2901     {
2902       bfd_signed_vma *local_got;
2903       bfd_signed_vma *end_local_got;
2904       bfd_size_type locsymcount;
2905       Elf_Internal_Shdr *symtab_hdr;
2906       unsigned char *local_tls_type;
2907       asection *srel;
2908
2909       if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour)
2910         continue;
2911
2912       for (s = ibfd->sections; s != NULL; s = s->next)
2913         {
2914           struct elf_dyn_relocs *p;
2915
2916           for (p = ((struct elf_dyn_relocs *)
2917                     elf_section_data (s)->local_dynrel);
2918                p != NULL;
2919                p = p->next)
2920             {
2921               if (! bfd_is_abs_section (p->sec)
2922                   && bfd_is_abs_section (p->sec->output_section))
2923                 {
2924                   /* Input section has been discarded, either because
2925                      it is a copy of a linkonce section or due to
2926                      linker script /DISCARD/, so we'll be discarding
2927                      the relocs too.  */
2928                 }
2929               else if (p->count != 0)
2930                 {
2931                   srel = elf_section_data (p->sec)->sreloc;
2932                   srel->size += p->count * sizeof (Elf32_External_Rela);
2933                   if ((p->sec->output_section->flags & SEC_READONLY) != 0)
2934                     info->flags |= DF_TEXTREL;
2935                 }
2936             }
2937         }
2938
2939       local_got = elf_local_got_refcounts (ibfd);
2940       if (!local_got)
2941         continue;
2942
2943       symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
2944       locsymcount = symtab_hdr->sh_info;
2945       end_local_got = local_got + locsymcount;
2946       s = htab->root.sgot;
2947       srel = htab->root.srelgot;
2948       local_tls_type = (unsigned char *) elf_or1k_local_tls_type (ibfd);
2949       for (; local_got < end_local_got; ++local_got)
2950         {
2951           if (*local_got > 0)
2952             {
2953               *local_got = s->size;
2954
2955               /* TLS GD requires two GOT and two relocs.  */
2956               if (local_tls_type != NULL && *local_tls_type == TLS_GD)
2957                 s->size += 8;
2958               else
2959                 s->size += 4;
2960               if (bfd_link_pic (info))
2961                 {
2962                   if (local_tls_type != NULL && *local_tls_type == TLS_GD)
2963                     srel->size += 2 * sizeof (Elf32_External_Rela);
2964                   else
2965                     srel->size += sizeof (Elf32_External_Rela);
2966                 }
2967             }
2968           else
2969
2970             *local_got = (bfd_vma) -1;
2971
2972           if (local_tls_type)
2973             ++local_tls_type;
2974         }
2975     }
2976
2977   /* Allocate global sym .plt and .got entries, and space for global
2978      sym dynamic relocs.  */
2979   elf_link_hash_traverse (&htab->root, allocate_dynrelocs, info);
2980
2981   /* We now have determined the sizes of the various dynamic sections.
2982      Allocate memory for them.  */
2983   relocs = FALSE;
2984   for (s = dynobj->sections; s != NULL; s = s->next)
2985     {
2986       if ((s->flags & SEC_LINKER_CREATED) == 0)
2987         continue;
2988
2989       if (s == htab->root.splt
2990           || s == htab->root.sgot
2991           || s == htab->root.sgotplt
2992           || s == htab->root.sdynbss
2993           || s == htab->root.sdynrelro)
2994         {
2995           /* Strip this section if we don't need it; see the
2996              comment below.  */
2997         }
2998       else if (CONST_STRNEQ (bfd_get_section_name (dynobj, s), ".rela"))
2999         {
3000           if (s->size != 0 && s != htab->root.srelplt)
3001             relocs = TRUE;
3002
3003           /* We use the reloc_count field as a counter if we need
3004              to copy relocs into the output file.  */
3005           s->reloc_count = 0;
3006         }
3007       else
3008         /* It's not one of our sections, so don't allocate space.  */
3009         continue;
3010
3011       if (s->size == 0)
3012         {
3013           /* If we don't need this section, strip it from the
3014              output file.  This is mostly to handle .rela.bss and
3015              .rela.plt.  We must create both sections in
3016              create_dynamic_sections, because they must be created
3017              before the linker maps input sections to output
3018              sections.  The linker does that before
3019              adjust_dynamic_symbol is called, and it is that
3020              function which decides whether anything needs to go
3021              into these sections.  */
3022           s->flags |= SEC_EXCLUDE;
3023           continue;
3024         }
3025
3026       if ((s->flags & SEC_HAS_CONTENTS) == 0)
3027         continue;
3028
3029       /* Allocate memory for the section contents.  We use bfd_zalloc
3030          here in case unused entries are not reclaimed before the
3031          section's contents are written out.  This should not happen,
3032          but this way if it does, we get a R_OR1K_NONE reloc instead
3033          of garbage.  */
3034       s->contents = bfd_zalloc (dynobj, s->size);
3035
3036       if (s->contents == NULL)
3037         return FALSE;
3038     }
3039
3040   if (htab->root.dynamic_sections_created)
3041     {
3042       /* Add some entries to the .dynamic section.  We fill in the
3043          values later, in or1k_elf_finish_dynamic_sections, but we
3044          must add the entries now so that we get the correct size for
3045          the .dynamic section.  The DT_DEBUG entry is filled in by the
3046          dynamic linker and used by the debugger.  */
3047 #define add_dynamic_entry(TAG, VAL) \
3048   _bfd_elf_add_dynamic_entry (info, TAG, VAL)
3049
3050      if (bfd_link_executable (info))
3051        {
3052          if (! add_dynamic_entry (DT_DEBUG, 0))
3053            return FALSE;
3054        }
3055
3056      if (htab->root.splt->size != 0)
3057        {
3058          if (! add_dynamic_entry (DT_PLTGOT, 0)
3059              || ! add_dynamic_entry (DT_PLTRELSZ, 0)
3060              || ! add_dynamic_entry (DT_PLTREL, DT_RELA)
3061              || ! add_dynamic_entry (DT_JMPREL, 0))
3062            return FALSE;
3063         }
3064
3065      if (relocs)
3066        {
3067          if (! add_dynamic_entry (DT_RELA, 0)
3068              || ! add_dynamic_entry (DT_RELASZ, 0)
3069              || ! add_dynamic_entry (DT_RELAENT,
3070                                      sizeof (Elf32_External_Rela)))
3071            return FALSE;
3072
3073          /* If any dynamic relocs apply to a read-only section,
3074             then we need a DT_TEXTREL entry.  */
3075          if ((info->flags & DF_TEXTREL) == 0)
3076            elf_link_hash_traverse (&htab->root, maybe_set_textrel, info);
3077
3078          if ((info->flags & DF_TEXTREL) != 0)
3079            {
3080              if (! add_dynamic_entry (DT_TEXTREL, 0))
3081                return FALSE;
3082            }
3083        }
3084     }
3085
3086 #undef add_dynamic_entry
3087   return TRUE;
3088 }
3089
3090 /* Copy the extra info we tack onto an elf_link_hash_entry.  */
3091
3092 static void
3093 or1k_elf_copy_indirect_symbol (struct bfd_link_info *info,
3094                                struct elf_link_hash_entry *dir,
3095                                struct elf_link_hash_entry *ind)
3096 {
3097   struct elf_or1k_link_hash_entry * edir;
3098   struct elf_or1k_link_hash_entry * eind;
3099
3100   edir = (struct elf_or1k_link_hash_entry *) dir;
3101   eind = (struct elf_or1k_link_hash_entry *) ind;
3102
3103   if (eind->dyn_relocs != NULL)
3104     {
3105       if (edir->dyn_relocs != NULL)
3106         {
3107           struct elf_dyn_relocs **pp;
3108           struct elf_dyn_relocs *p;
3109
3110           /* Add reloc counts against the indirect sym to the direct sym
3111              list.  Merge any entries against the same section.  */
3112           for (pp = &eind->dyn_relocs; (p = *pp) != NULL;)
3113             {
3114               struct elf_dyn_relocs *q;
3115
3116               for (q = edir->dyn_relocs; q != NULL; q = q->next)
3117                 if (q->sec == p->sec)
3118                   {
3119                     q->pc_count += p->pc_count;
3120                     q->count += p->count;
3121                     *pp = p->next;
3122                     break;
3123                   }
3124               if (q == NULL)
3125                 pp = &p->next;
3126             }
3127           *pp = edir->dyn_relocs;
3128         }
3129
3130       edir->dyn_relocs = eind->dyn_relocs;
3131       eind->dyn_relocs = NULL;
3132     }
3133
3134   if (ind->root.type == bfd_link_hash_indirect)
3135     {
3136       if (dir->got.refcount <= 0)
3137         {
3138           edir->tls_type = eind->tls_type;
3139           eind->tls_type = TLS_UNKNOWN;
3140         }
3141     }
3142
3143   _bfd_elf_link_hash_copy_indirect (info, dir, ind);
3144 }
3145
3146 /* Set the right machine number.  */
3147
3148 static bfd_boolean
3149 or1k_elf_object_p (bfd *abfd)
3150 {
3151   unsigned long mach = bfd_mach_or1k;
3152
3153   if (elf_elfheader (abfd)->e_flags & EF_OR1K_NODELAY)
3154     mach = bfd_mach_or1knd;
3155
3156   return bfd_default_set_arch_mach (abfd, bfd_arch_or1k, mach);
3157 }
3158
3159 /* Store the machine number in the flags field.  */
3160
3161 static void
3162 or1k_elf_final_write_processing (bfd *abfd,
3163                                  bfd_boolean linker ATTRIBUTE_UNUSED)
3164 {
3165   switch (bfd_get_mach (abfd))
3166     {
3167     default:
3168     case bfd_mach_or1k:
3169       break;
3170     case bfd_mach_or1knd:
3171       elf_elfheader (abfd)->e_flags |= EF_OR1K_NODELAY;
3172       break;
3173     }
3174 }
3175
3176 static bfd_boolean
3177 or1k_elf_set_private_flags (bfd *abfd, flagword flags)
3178 {
3179   BFD_ASSERT (!elf_flags_init (abfd)
3180               || elf_elfheader (abfd)->e_flags == flags);
3181
3182   elf_elfheader (abfd)->e_flags = flags;
3183   elf_flags_init (abfd) = TRUE;
3184   return TRUE;
3185 }
3186
3187 /* Make sure all input files are consistent with respect to
3188    EF_OR1K_NODELAY flag setting.  */
3189
3190 static bfd_boolean
3191 elf32_or1k_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
3192 {
3193   bfd *obfd = info->output_bfd;
3194   flagword out_flags;
3195   flagword in_flags;
3196
3197   in_flags  = elf_elfheader (ibfd)->e_flags;
3198   out_flags = elf_elfheader (obfd)->e_flags;
3199
3200   if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
3201       || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
3202     return TRUE;
3203
3204   if (!elf_flags_init (obfd))
3205     {
3206       elf_flags_init (obfd) = TRUE;
3207       elf_elfheader (obfd)->e_flags = in_flags;
3208
3209       return TRUE;
3210     }
3211
3212   if (in_flags == out_flags)
3213     return TRUE;
3214
3215   if ((in_flags & EF_OR1K_NODELAY) != (out_flags & EF_OR1K_NODELAY))
3216     {
3217       _bfd_error_handler
3218         (_("%pB: %s flag mismatch with previous modules"),
3219          ibfd, "EF_OR1K_NODELAY");
3220
3221       bfd_set_error (bfd_error_bad_value);
3222       return FALSE;
3223     }
3224
3225   return TRUE;
3226
3227 }
3228
3229 #define ELF_ARCH                        bfd_arch_or1k
3230 #define ELF_MACHINE_CODE                EM_OR1K
3231 #define ELF_TARGET_ID                   OR1K_ELF_DATA
3232 #define ELF_MAXPAGESIZE                 0x2000
3233
3234 #define TARGET_BIG_SYM                  or1k_elf32_vec
3235 #define TARGET_BIG_NAME                 "elf32-or1k"
3236
3237 #define elf_info_to_howto_rel           NULL
3238 #define elf_info_to_howto               or1k_info_to_howto_rela
3239 #define elf_backend_relocate_section    or1k_elf_relocate_section
3240 #define elf_backend_gc_mark_hook        or1k_elf_gc_mark_hook
3241 #define elf_backend_check_relocs        or1k_elf_check_relocs
3242 #define elf_backend_reloc_type_class    or1k_elf_reloc_type_class
3243 #define elf_backend_can_gc_sections     1
3244 #define elf_backend_rela_normal         1
3245
3246 #define bfd_elf32_mkobject                   elf_or1k_mkobject
3247
3248 #define bfd_elf32_bfd_merge_private_bfd_data elf32_or1k_merge_private_bfd_data
3249 #define bfd_elf32_bfd_set_private_flags or1k_elf_set_private_flags
3250 #define bfd_elf32_bfd_reloc_type_lookup or1k_reloc_type_lookup
3251 #define bfd_elf32_bfd_reloc_name_lookup or1k_reloc_name_lookup
3252
3253 #define elf_backend_object_p                or1k_elf_object_p
3254 #define elf_backend_final_write_processing  or1k_elf_final_write_processing
3255 #define elf_backend_can_refcount                1
3256
3257 #define elf_backend_plt_readonly                1
3258 #define elf_backend_want_got_plt                1
3259 #define elf_backend_want_plt_sym                0
3260 #define elf_backend_got_header_size             12
3261 #define elf_backend_dtrel_excludes_plt          1
3262 #define elf_backend_want_dynrelro               1
3263
3264 #define bfd_elf32_bfd_link_hash_table_create    or1k_elf_link_hash_table_create
3265 #define elf_backend_copy_indirect_symbol        or1k_elf_copy_indirect_symbol
3266 #define elf_backend_create_dynamic_sections     _bfd_elf_create_dynamic_sections
3267 #define elf_backend_finish_dynamic_sections     or1k_elf_finish_dynamic_sections
3268 #define elf_backend_size_dynamic_sections       or1k_elf_size_dynamic_sections
3269 #define elf_backend_adjust_dynamic_symbol       or1k_elf_adjust_dynamic_symbol
3270 #define elf_backend_finish_dynamic_symbol       or1k_elf_finish_dynamic_symbol
3271
3272 #include "elf32-target.h"