packaging: Enable testing infrastructure
[external/binutils.git] / bfd / elf32-or1k.c
1 /* Or1k-specific support for 32-bit ELF.
2    Copyright (C) 2001-2019 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           if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
1931             return FALSE;
1932           break;
1933
1934           /* This relocation requires .plt entry.  */
1935         case R_OR1K_PLTA26:
1936           htab->saw_plta = TRUE;
1937           /* FALLTHRU */
1938         case R_OR1K_PLT26:
1939           if (h != NULL)
1940             {
1941               h->needs_plt = 1;
1942               h->plt.refcount += 1;
1943             }
1944           break;
1945
1946         case R_OR1K_GOT16:
1947         case R_OR1K_GOT_PG21:
1948         case R_OR1K_GOT_LO13:
1949         case R_OR1K_TLS_GD_HI16:
1950         case R_OR1K_TLS_GD_LO16:
1951         case R_OR1K_TLS_GD_PG21:
1952         case R_OR1K_TLS_GD_LO13:
1953         case R_OR1K_TLS_IE_HI16:
1954         case R_OR1K_TLS_IE_LO16:
1955         case R_OR1K_TLS_IE_PG21:
1956         case R_OR1K_TLS_IE_LO13:
1957         case R_OR1K_TLS_IE_AHI16:
1958               if (h != NULL)
1959                 h->got.refcount += 1;
1960               else
1961                 {
1962                   bfd_signed_vma *local_got_refcounts;
1963
1964                   /* This is a global offset table entry for a local symbol.  */
1965                   local_got_refcounts = elf_local_got_refcounts (abfd);
1966                   if (local_got_refcounts == NULL)
1967                     {
1968                       bfd_size_type size;
1969
1970                       size = symtab_hdr->sh_info;
1971                       size *= sizeof (bfd_signed_vma);
1972                       local_got_refcounts = bfd_zalloc (abfd, size);
1973                       if (local_got_refcounts == NULL)
1974                         return FALSE;
1975                       elf_local_got_refcounts (abfd) = local_got_refcounts;
1976                     }
1977                   local_got_refcounts[r_symndx] += 1;
1978                 }
1979           /* FALLTHRU */
1980
1981         case R_OR1K_GOTOFF_HI16:
1982         case R_OR1K_GOTOFF_LO16:
1983         case R_OR1K_GOTOFF_AHI16:
1984         case R_OR1K_GOTOFF_SLO16:
1985           if (htab->root.sgot == NULL)
1986             {
1987               if (dynobj == NULL)
1988                 htab->root.dynobj = dynobj = abfd;
1989               if (!_bfd_elf_create_got_section (dynobj, info))
1990                 return FALSE;
1991             }
1992           break;
1993
1994         case R_OR1K_INSN_REL_26:
1995         case R_OR1K_HI_16_IN_INSN:
1996         case R_OR1K_LO_16_IN_INSN:
1997         case R_OR1K_AHI16:
1998         case R_OR1K_SLO16:
1999         case R_OR1K_32:
2000         case R_OR1K_PCREL_PG21:
2001         case R_OR1K_LO13:
2002         case R_OR1K_SLO13:
2003           {
2004             if (h != NULL && !bfd_link_pic (info))
2005               {
2006                 /* We may need a copy reloc.  */
2007                 h->non_got_ref = 1;
2008
2009                 /* We may also need a .plt entry.  */
2010                 h->plt.refcount += 1;
2011                 if (r_type != R_OR1K_INSN_REL_26)
2012                   h->pointer_equality_needed = 1;
2013               }
2014
2015             /* If we are creating a shared library, and this is a reloc
2016                against a global symbol, or a non PC relative reloc
2017                against a local symbol, then we need to copy the reloc
2018                into the shared library.  However, if we are linking with
2019                -Bsymbolic, we do not need to copy a reloc against a
2020                global symbol which is defined in an object we are
2021                including in the link (i.e., DEF_REGULAR is set).  At
2022                this point we have not seen all the input files, so it is
2023                possible that DEF_REGULAR is not set now but will be set
2024                later (it is never cleared).  In case of a weak definition,
2025                DEF_REGULAR may be cleared later by a strong definition in
2026                a shared library.  We account for that possibility below by
2027                storing information in the relocs_copied field of the hash
2028                table entry.  A similar situation occurs when creating
2029                shared libraries and symbol visibility changes render the
2030                symbol local.
2031
2032                If on the other hand, we are creating an executable, we
2033                may need to keep relocations for symbols satisfied by a
2034                dynamic library if we manage to avoid copy relocs for the
2035                symbol.  */
2036
2037             if ((bfd_link_pic (info)
2038                  && (sec->flags & SEC_ALLOC) != 0
2039                  && (r_type != R_OR1K_INSN_REL_26
2040                      || (h != NULL
2041                          && (!SYMBOLIC_BIND (info, h)
2042                              || h->root.type == bfd_link_hash_defweak
2043                              || !h->def_regular))))
2044                 || (!bfd_link_pic (info)
2045                     && (sec->flags & SEC_ALLOC) != 0
2046                     && h != NULL
2047                     && (h->root.type == bfd_link_hash_defweak
2048                         || !h->def_regular)))
2049               {
2050                 struct elf_dyn_relocs *p;
2051                 struct elf_dyn_relocs **head;
2052
2053                 /* When creating a shared object, we must copy these
2054                    relocs into the output file.  We create a reloc
2055                    section in dynobj and make room for the reloc.  */
2056                 if (sreloc == NULL)
2057                   {
2058                     const char *name;
2059                     unsigned int strndx = elf_elfheader (abfd)->e_shstrndx;
2060                     unsigned int shnam = _bfd_elf_single_rel_hdr (sec)->sh_name;
2061
2062                     name = bfd_elf_string_from_elf_section (abfd, strndx, shnam);
2063                     if (name == NULL)
2064                       return FALSE;
2065
2066                     if (strncmp (name, ".rela", 5) != 0
2067                         || strcmp (bfd_get_section_name (abfd, sec),
2068                                    name + 5) != 0)
2069                       {
2070                         _bfd_error_handler
2071                           /* xgettext:c-format */
2072                           (_("%pB: bad relocation section name `%s\'"),
2073                            abfd, name);
2074                       }
2075
2076                     if (htab->root.dynobj == NULL)
2077                       htab->root.dynobj = abfd;
2078                     dynobj = htab->root.dynobj;
2079
2080                     sreloc = bfd_get_section_by_name (dynobj, name);
2081                     if (sreloc == NULL)
2082                       {
2083                         sreloc = _bfd_elf_make_dynamic_reloc_section
2084                           (sec, dynobj, 2, abfd, /*rela?*/ TRUE);
2085
2086                         if (sreloc == NULL)
2087                           return FALSE;
2088                       }
2089                     elf_section_data (sec)->sreloc = sreloc;
2090                   }
2091
2092                 /* If this is a global symbol, we count the number of
2093                    relocations we need for this symbol.  */
2094                 if (h != NULL)
2095                   head = &((struct elf_or1k_link_hash_entry *) h)->dyn_relocs;
2096                 else
2097                   {
2098                     /* Track dynamic relocs needed for local syms too.
2099                        We really need local syms available to do this
2100                        easily.  Oh well.  */
2101
2102                     asection *s;
2103                     Elf_Internal_Sym *isym;
2104                     void *vpp;
2105
2106                     isym = bfd_sym_from_r_symndx (&htab->sym_sec,
2107                                                   abfd, r_symndx);
2108                     if (isym == NULL)
2109                       return FALSE;
2110
2111                     s = bfd_section_from_elf_index (abfd, isym->st_shndx);
2112                     if (s == NULL)
2113                       return FALSE;
2114
2115                     vpp = &elf_section_data (s)->local_dynrel;
2116                     head = (struct elf_dyn_relocs **) vpp;
2117                   }
2118
2119                 p = *head;
2120                 if (p == NULL || p->sec != sec)
2121                   {
2122                     bfd_size_type amt = sizeof *p;
2123                     p = ((struct elf_dyn_relocs *)
2124                          bfd_alloc (htab->root.dynobj, amt));
2125                     if (p == NULL)
2126                       return FALSE;
2127                     p->next = *head;
2128                     *head = p;
2129                     p->sec = sec;
2130                     p->count = 0;
2131                     p->pc_count = 0;
2132                   }
2133
2134                 p->count += 1;
2135                 if (r_type == R_OR1K_INSN_REL_26)
2136                   p->pc_count += 1;
2137               }
2138           }
2139           break;
2140         }
2141     }
2142
2143   return TRUE;
2144 }
2145
2146 static void
2147 or1k_write_plt_entry (bfd *output_bfd, bfd_byte *contents, unsigned insn1,
2148                       unsigned insn2, unsigned insn3, unsigned insnj)
2149 {
2150   unsigned nodelay = elf_elfheader (output_bfd)->e_flags & EF_OR1K_NODELAY;
2151   unsigned insn4;
2152
2153   /* Honor the no-delay-slot setting.  */
2154   if (insn3 == OR1K_NOP)
2155     {
2156       insn4 = insn3;
2157       if (nodelay)
2158         insn3 = insnj;
2159       else
2160         insn3 = insn2, insn2 = insnj;
2161     }
2162   else
2163     {
2164       if (nodelay)
2165         insn4 = insnj;
2166       else
2167         insn4 = insn3, insn3 = insnj;
2168     }
2169
2170   bfd_put_32 (output_bfd, insn1, contents);
2171   bfd_put_32 (output_bfd, insn2, contents + 4);
2172   bfd_put_32 (output_bfd, insn3, contents + 8);
2173   bfd_put_32 (output_bfd, insn4, contents + 12);
2174 }
2175
2176 /* Finish up the dynamic sections.  */
2177
2178 static bfd_boolean
2179 or1k_elf_finish_dynamic_sections (bfd *output_bfd,
2180                                   struct bfd_link_info *info)
2181 {
2182   bfd *dynobj;
2183   asection *sdyn, *sgot;
2184   struct elf_or1k_link_hash_table *htab;
2185
2186   htab = or1k_elf_hash_table (info);
2187   if (htab == NULL)
2188     return FALSE;
2189
2190   dynobj = htab->root.dynobj;
2191
2192   sgot = htab->root.sgotplt;
2193   sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
2194
2195   if (htab->root.dynamic_sections_created)
2196     {
2197       asection *splt;
2198       Elf32_External_Dyn *dyncon, *dynconend;
2199
2200       BFD_ASSERT (sgot != NULL && sdyn != NULL);
2201
2202       dyncon = (Elf32_External_Dyn *) sdyn->contents;
2203       dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
2204
2205       for (; dyncon < dynconend; dyncon++)
2206         {
2207           Elf_Internal_Dyn dyn;
2208           asection *s;
2209
2210           bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
2211
2212           switch (dyn.d_tag)
2213             {
2214             default:
2215               continue;
2216
2217             case DT_PLTGOT:
2218               s = htab->root.sgotplt;
2219               dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
2220               break;
2221
2222             case DT_JMPREL:
2223               s = htab->root.srelplt;
2224               dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
2225               break;
2226
2227             case DT_PLTRELSZ:
2228               s = htab->root.srelplt;
2229               dyn.d_un.d_val = s->size;
2230               break;
2231             }
2232           bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
2233         }
2234
2235
2236       /* Fill in the first entry in the procedure linkage table.  */
2237       splt = htab->root.splt;
2238       if (splt && splt->size > 0)
2239         {
2240           unsigned plt0, plt1, plt2;
2241           bfd_vma got_addr = sgot->output_section->vma + sgot->output_offset;
2242
2243           /* Note we force 16 byte alignment on the .got, so that
2244              the movhi/adrp can be shared between the two loads.  */
2245
2246           if (htab->saw_plta)
2247             {
2248               bfd_vma pc = splt->output_section->vma + splt->output_offset;
2249               unsigned pa = ((got_addr >> 13) - (pc >> 13)) & 0x1fffff;
2250               unsigned po = got_addr & 0x1fff;
2251               plt0 = OR1K_ADRP(12) | pa;
2252               plt1 = OR1K_LWZ(15,12) | (po + 8);
2253               plt2 = OR1K_LWZ(12,12) | (po + 4);
2254             }
2255           else if (bfd_link_pic (info))
2256             {
2257               plt0 = OR1K_LWZ(15, 16) | 8;      /* .got+8 */
2258               plt1 = OR1K_LWZ(12, 16) | 4;      /* .got+4 */
2259               plt2 = OR1K_NOP;
2260             }
2261           else
2262             {
2263               unsigned ha = ((got_addr + 0x8000) >> 16) & 0xffff;
2264               unsigned lo = got_addr & 0xffff;
2265               plt0 = OR1K_MOVHI(12) | ha;
2266               plt1 = OR1K_LWZ(15,12) | (lo + 8);
2267               plt2 = OR1K_LWZ(12,12) | (lo + 4);
2268             }
2269
2270           or1k_write_plt_entry (output_bfd, splt->contents,
2271                                 plt0, plt1, plt2, OR1K_JR(15));
2272
2273           elf_section_data (splt->output_section)->this_hdr.sh_entsize = 4;
2274         }
2275     }
2276
2277   /* Set the first entry in the global offset table to the address of
2278      the dynamic section.  */
2279   if (sgot && sgot->size > 0)
2280     {
2281       if (sdyn == NULL)
2282         bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents);
2283       else
2284         bfd_put_32 (output_bfd,
2285                     sdyn->output_section->vma + sdyn->output_offset,
2286                     sgot->contents);
2287       elf_section_data (sgot->output_section)->this_hdr.sh_entsize = 4;
2288     }
2289
2290   if (htab->root.sgot && htab->root.sgot->size > 0)
2291     elf_section_data (htab->root.sgot->output_section)->this_hdr.sh_entsize = 4;
2292
2293   return TRUE;
2294 }
2295
2296 /* Finish up dynamic symbol handling.  We set the contents of various
2297    dynamic sections here.  */
2298
2299 static bfd_boolean
2300 or1k_elf_finish_dynamic_symbol (bfd *output_bfd,
2301                                 struct bfd_link_info *info,
2302                                 struct elf_link_hash_entry *h,
2303                                 Elf_Internal_Sym *sym)
2304 {
2305   struct elf_or1k_link_hash_table *htab;
2306   bfd_byte *loc;
2307
2308   htab = or1k_elf_hash_table (info);
2309   if (htab == NULL)
2310     return FALSE;
2311
2312   if (h->plt.offset != (bfd_vma) -1)
2313     {
2314       unsigned int plt0, plt1, plt2;
2315       asection *splt;
2316       asection *sgot;
2317       asection *srela;
2318       bfd_vma plt_base_addr;
2319       bfd_vma plt_addr;
2320       bfd_vma plt_index;
2321       bfd_vma plt_reloc;
2322       bfd_vma got_base_addr;
2323       bfd_vma got_offset;
2324       bfd_vma got_addr;
2325       Elf_Internal_Rela rela;
2326
2327       /* This symbol has an entry in the procedure linkage table.  Set
2328          it up.  */
2329       BFD_ASSERT (h->dynindx != -1);
2330
2331       splt = htab->root.splt;
2332       sgot = htab->root.sgotplt;
2333       srela = htab->root.srelplt;
2334       BFD_ASSERT (splt != NULL && sgot != NULL && srela != NULL);
2335
2336       plt_base_addr = splt->output_section->vma + splt->output_offset;
2337       got_base_addr = sgot->output_section->vma + sgot->output_offset;
2338
2339       /* Get the index in the procedure linkage table which
2340          corresponds to this symbol.  This is the index of this symbol
2341          in all the symbols for which we are making plt entries.  The
2342          first entry in the procedure linkage table is reserved.  */
2343       plt_index = h->plt.offset / PLT_ENTRY_SIZE - 1;
2344       plt_addr = plt_base_addr + h->plt.offset;
2345       plt_reloc = plt_index * sizeof (Elf32_External_Rela);
2346
2347       /* Get the offset into the .got table of the entry that
2348         corresponds to this function.  Each .got entry is 4 bytes.
2349         The first three are reserved.  */
2350       got_offset = (plt_index + 3) * 4;
2351       got_addr = got_base_addr + got_offset;
2352
2353       /* Fill in the entry in the procedure linkage table.  */
2354       if (htab->saw_plta)
2355         {
2356           unsigned pa = ((got_addr >> 13) - (plt_addr >> 13)) & 0x1fffff;
2357           unsigned po = (got_addr & 0x1fff);
2358           plt0 = OR1K_ADRP(12) | pa;
2359           plt1 = OR1K_LWZ(12,12) | po;
2360           plt2 = OR1K_ORI0(11) | plt_reloc;
2361         }
2362       else if (bfd_link_pic (info))
2363         {
2364           plt0 = OR1K_LWZ(12,16) | got_offset;
2365           plt1 = OR1K_ORI0(11) | plt_reloc;
2366           plt2 = OR1K_NOP;
2367         }
2368       else
2369         {
2370           unsigned ha = ((got_addr + 0x8000) >> 16) & 0xffff;
2371           unsigned lo = got_addr & 0xffff;
2372           plt0 = OR1K_MOVHI(12) | ha;
2373           plt1 = OR1K_LWZ(12,12) | lo;
2374           plt2 = OR1K_ORI0(11) | plt_reloc;
2375         }
2376
2377       or1k_write_plt_entry (output_bfd, splt->contents + h->plt.offset,
2378                             plt0, plt1, plt2, OR1K_JR(12));
2379
2380       /* Fill in the entry in the global offset table.  We initialize it to
2381          point to the top of the plt.  This is done to lazy lookup the actual
2382          symbol as the first plt entry will be setup by libc to call the
2383          runtime dynamic linker.  */
2384       bfd_put_32 (output_bfd, plt_base_addr, sgot->contents + got_offset);
2385
2386       /* Fill in the entry in the .rela.plt section.  */
2387       rela.r_offset = got_addr;
2388       rela.r_info = ELF32_R_INFO (h->dynindx, R_OR1K_JMP_SLOT);
2389       rela.r_addend = 0;
2390       loc = srela->contents;
2391       loc += plt_index * sizeof (Elf32_External_Rela);
2392       bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
2393
2394       if (!h->def_regular)
2395         {
2396           /* Mark the symbol as undefined, rather than as defined in
2397              the .plt section.  Leave the value alone.  */
2398           sym->st_shndx = SHN_UNDEF;
2399         }
2400     }
2401
2402   if (h->got.offset != (bfd_vma) -1
2403       && (h->got.offset & 2) == 0) /* Homemade TLS check.  */
2404     {
2405       asection *sgot;
2406       asection *srela;
2407       Elf_Internal_Rela rela;
2408
2409       /* This symbol has an entry in the global offset table.  Set it
2410          up.  */
2411       sgot = htab->root.sgot;
2412       srela = htab->root.srelgot;
2413       BFD_ASSERT (sgot != NULL && srela != NULL);
2414
2415       rela.r_offset = (sgot->output_section->vma
2416                        + sgot->output_offset
2417                        + (h->got.offset &~ 1));
2418
2419       /* If this is a -Bsymbolic link, and the symbol is defined
2420          locally, we just want to emit a RELATIVE reloc.  Likewise if
2421          the symbol was forced to be local because of a version file.
2422          The entry in the global offset table will already have been
2423          initialized in the relocate_section function.  */
2424       if (bfd_link_pic (info) && SYMBOL_REFERENCES_LOCAL (info, h))
2425         {
2426           rela.r_info = ELF32_R_INFO (0, R_OR1K_RELATIVE);
2427           rela.r_addend = (h->root.u.def.value
2428                            + h->root.u.def.section->output_section->vma
2429                            + h->root.u.def.section->output_offset);
2430         }
2431       else
2432         {
2433           BFD_ASSERT ((h->got.offset & 1) == 0);
2434           bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + h->got.offset);
2435           rela.r_info = ELF32_R_INFO (h->dynindx, R_OR1K_GLOB_DAT);
2436           rela.r_addend = 0;
2437         }
2438
2439       loc = srela->contents;
2440       loc += srela->reloc_count * sizeof (Elf32_External_Rela);
2441       bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
2442       ++srela->reloc_count;
2443     }
2444
2445   if (h->needs_copy)
2446     {
2447       asection *s;
2448       Elf_Internal_Rela rela;
2449
2450       /* This symbols needs a copy reloc.  Set it up.  */
2451       BFD_ASSERT (h->dynindx != -1
2452                   && (h->root.type == bfd_link_hash_defined
2453                       || h->root.type == bfd_link_hash_defweak));
2454
2455       rela.r_offset = (h->root.u.def.value
2456                        + h->root.u.def.section->output_section->vma
2457                        + h->root.u.def.section->output_offset);
2458       rela.r_info = ELF32_R_INFO (h->dynindx, R_OR1K_COPY);
2459       rela.r_addend = 0;
2460       if (h->root.u.def.section == htab->root.sdynrelro)
2461         s = htab->root.sreldynrelro;
2462       else
2463         s = htab->root.srelbss;
2464       loc = s->contents + s->reloc_count * sizeof (Elf32_External_Rela);
2465       bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
2466       ++s->reloc_count;
2467     }
2468
2469   /* Mark some specially defined symbols as absolute.  */
2470   if (strcmp (h->root.root.string, "_DYNAMIC") == 0
2471       || h == htab->root.hgot)
2472     sym->st_shndx = SHN_ABS;
2473
2474   return TRUE;
2475 }
2476
2477 static enum elf_reloc_type_class
2478 or1k_elf_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED,
2479                            const asection *rel_sec ATTRIBUTE_UNUSED,
2480                            const Elf_Internal_Rela *rela)
2481 {
2482   switch ((int) ELF32_R_TYPE (rela->r_info))
2483     {
2484     case R_OR1K_RELATIVE:  return reloc_class_relative;
2485     case R_OR1K_JMP_SLOT:  return reloc_class_plt;
2486     case R_OR1K_COPY:      return reloc_class_copy;
2487     default:               return reloc_class_normal;
2488     }
2489 }
2490
2491 /* Find dynamic relocs for H that apply to read-only sections.  */
2492
2493 static asection *
2494 readonly_dynrelocs (struct elf_link_hash_entry *h)
2495 {
2496   struct elf_dyn_relocs *p;
2497   struct elf_or1k_link_hash_entry *eh = (struct elf_or1k_link_hash_entry *) h;
2498
2499   for (p = eh->dyn_relocs; p != NULL; p = p->next)
2500     {
2501       asection *s = p->sec->output_section;
2502
2503       if (s != NULL && (s->flags & SEC_READONLY) != 0)
2504         return p->sec;
2505     }
2506   return NULL;
2507 }
2508
2509 /* Adjust a symbol defined by a dynamic object and referenced by a
2510    regular object.  The current definition is in some section of the
2511    dynamic object, but we're not including those sections.  We have to
2512    change the definition to something the rest of the link can
2513    understand.  */
2514
2515 static bfd_boolean
2516 or1k_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
2517                                 struct elf_link_hash_entry *h)
2518 {
2519   struct elf_or1k_link_hash_table *htab;
2520   bfd *dynobj;
2521   asection *s, *srel;
2522
2523   dynobj = elf_hash_table (info)->dynobj;
2524
2525   /* Make sure we know what is going on here.  */
2526   BFD_ASSERT (dynobj != NULL
2527               && (h->needs_plt
2528                   || h->is_weakalias
2529                   || (h->def_dynamic
2530                       && h->ref_regular
2531                       && !h->def_regular)));
2532
2533   /* If this is a function, put it in the procedure linkage table.  We
2534      will fill in the contents of the procedure linkage table later,
2535      when we know the address of the .got section.  */
2536   if (h->type == STT_FUNC
2537       || h->needs_plt)
2538     {
2539       if (! bfd_link_pic (info)
2540           && !h->def_dynamic
2541           && !h->ref_dynamic
2542           && h->root.type != bfd_link_hash_undefweak
2543           && h->root.type != bfd_link_hash_undefined)
2544         {
2545           /* This case can occur if we saw a PLT reloc in an input
2546              file, but the symbol was never referred to by a dynamic
2547              object.  In such a case, we don't actually need to build
2548              a procedure linkage table, and we can just do a PCREL
2549              reloc instead.  */
2550           h->plt.offset = (bfd_vma) -1;
2551           h->needs_plt = 0;
2552         }
2553
2554       return TRUE;
2555     }
2556   else
2557     h->plt.offset = (bfd_vma) -1;
2558
2559   /* If this is a weak symbol, and there is a real definition, the
2560      processor independent code will have arranged for us to see the
2561      real definition first, and we can just use the same value.  */
2562   if (h->is_weakalias)
2563     {
2564       struct elf_link_hash_entry *def = weakdef (h);
2565       BFD_ASSERT (def->root.type == bfd_link_hash_defined);
2566       h->root.u.def.section = def->root.u.def.section;
2567       h->root.u.def.value = def->root.u.def.value;
2568       return TRUE;
2569     }
2570
2571   /* This is a reference to a symbol defined by a dynamic object which
2572      is not a function.  */
2573
2574   /* If we are creating a shared library, we must presume that the
2575      only references to the symbol are via the global offset table.
2576      For such cases we need not do anything here; the relocations will
2577      be handled correctly by relocate_section.  */
2578   if (bfd_link_pic (info))
2579     return TRUE;
2580
2581   /* If there are no references to this symbol that do not use the
2582      GOT, we don't need to generate a copy reloc.  */
2583   if (!h->non_got_ref)
2584     return TRUE;
2585
2586   /* If -z nocopyreloc was given, we won't generate them either.  */
2587   if (info->nocopyreloc)
2588     {
2589       h->non_got_ref = 0;
2590       return TRUE;
2591     }
2592
2593   /* If we don't find any dynamic relocs in read-only sections, then
2594      we'll be keeping the dynamic relocs and avoiding the copy reloc.  */
2595   if (!readonly_dynrelocs (h))
2596     {
2597       h->non_got_ref = 0;
2598       return TRUE;
2599     }
2600
2601   /* We must allocate the symbol in our .dynbss section, which will
2602      become part of the .bss section of the executable.  There will be
2603      an entry for this symbol in the .dynsym section.  The dynamic
2604      object will contain position independent code, so all references
2605      from the dynamic object to this symbol will go through the global
2606      offset table.  The dynamic linker will use the .dynsym entry to
2607      determine the address it must put in the global offset table, so
2608      both the dynamic object and the regular object will refer to the
2609      same memory location for the variable.  */
2610
2611   htab = or1k_elf_hash_table (info);
2612   if (htab == NULL)
2613     return FALSE;
2614
2615   /* We must generate a R_OR1K_COPY reloc to tell the dynamic linker
2616      to copy the initial value out of the dynamic object and into the
2617      runtime process image.  We need to remember the offset into the
2618      .rela.bss section we are going to use.  */
2619   if ((h->root.u.def.section->flags & SEC_READONLY) != 0)
2620     {
2621       s = htab->root.sdynrelro;
2622       srel = htab->root.sreldynrelro;
2623     }
2624   else
2625     {
2626       s = htab->root.sdynbss;
2627       srel = htab->root.srelbss;
2628     }
2629   if ((h->root.u.def.section->flags & SEC_ALLOC) != 0 && h->size != 0)
2630     {
2631       srel->size += sizeof (Elf32_External_Rela);
2632       h->needs_copy = 1;
2633     }
2634
2635   return _bfd_elf_adjust_dynamic_copy (info, h, s);
2636 }
2637
2638 /* Allocate space in .plt, .got and associated reloc sections for
2639    dynamic relocs.  */
2640
2641 static bfd_boolean
2642 allocate_dynrelocs (struct elf_link_hash_entry *h, void * inf)
2643 {
2644   struct bfd_link_info *info;
2645   struct elf_or1k_link_hash_table *htab;
2646   struct elf_or1k_link_hash_entry *eh;
2647   struct elf_dyn_relocs *p;
2648
2649   if (h->root.type == bfd_link_hash_indirect)
2650     return TRUE;
2651
2652   info = (struct bfd_link_info *) inf;
2653   htab = or1k_elf_hash_table (info);
2654   if (htab == NULL)
2655     return FALSE;
2656
2657   eh = (struct elf_or1k_link_hash_entry *) h;
2658
2659   if (htab->root.dynamic_sections_created
2660       && h->plt.refcount > 0)
2661     {
2662       /* Make sure this symbol is output as a dynamic symbol.
2663          Undefined weak syms won't yet be marked as dynamic.  */
2664       if (h->dynindx == -1
2665           && !h->forced_local)
2666         {
2667           if (! bfd_elf_link_record_dynamic_symbol (info, h))
2668             return FALSE;
2669         }
2670
2671       if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, bfd_link_pic (info), h))
2672         {
2673           asection *s = htab->root.splt;
2674
2675           /* If this is the first .plt entry, make room for the special
2676              first entry.  */
2677           if (s->size == 0)
2678             s->size = PLT_ENTRY_SIZE;
2679
2680           h->plt.offset = s->size;
2681
2682           /* If this symbol is not defined in a regular file, and we are
2683              not generating a shared library, then set the symbol to this
2684              location in the .plt.  This is required to make function
2685              pointers compare as equal between the normal executable and
2686              the shared library.  */
2687           if (! bfd_link_pic (info)
2688               && !h->def_regular)
2689             {
2690               h->root.u.def.section = s;
2691               h->root.u.def.value = h->plt.offset;
2692             }
2693
2694           /* Make room for this entry.  */
2695           s->size += PLT_ENTRY_SIZE;
2696
2697           /* We also need to make an entry in the .got.plt section, which
2698              will be placed in the .got section by the linker script.  */
2699           htab->root.sgotplt->size += 4;
2700
2701           /* We also need to make an entry in the .rel.plt section.  */
2702           htab->root.srelplt->size += sizeof (Elf32_External_Rela);
2703         }
2704       else
2705         {
2706           h->plt.offset = (bfd_vma) -1;
2707           h->needs_plt = 0;
2708         }
2709     }
2710   else
2711     {
2712       h->plt.offset = (bfd_vma) -1;
2713       h->needs_plt = 0;
2714     }
2715
2716   if (h->got.refcount > 0)
2717     {
2718       asection *s;
2719       bfd_boolean dyn;
2720       unsigned char tls_type;
2721
2722       /* Make sure this symbol is output as a dynamic symbol.
2723          Undefined weak syms won't yet be marked as dynamic.  */
2724       if (h->dynindx == -1
2725           && !h->forced_local)
2726         {
2727           if (! bfd_elf_link_record_dynamic_symbol (info, h))
2728             return FALSE;
2729         }
2730
2731       s = htab->root.sgot;
2732
2733       h->got.offset = s->size;
2734
2735       tls_type = ((struct elf_or1k_link_hash_entry *) h)->tls_type;
2736
2737       /* TLS GD requires two GOT and two relocs.  */
2738       if (tls_type == TLS_GD)
2739         s->size += 8;
2740       else
2741         s->size += 4;
2742       dyn = htab->root.dynamic_sections_created;
2743       if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, bfd_link_pic (info), h))
2744         {
2745           if (tls_type == TLS_GD)
2746             htab->root.srelgot->size += 2 * sizeof (Elf32_External_Rela);
2747           else
2748             htab->root.srelgot->size += sizeof (Elf32_External_Rela);
2749         }
2750     }
2751   else
2752     h->got.offset = (bfd_vma) -1;
2753
2754   if (eh->dyn_relocs == NULL)
2755     return TRUE;
2756
2757   /* In the shared -Bsymbolic case, discard space allocated for
2758      dynamic pc-relative relocs against symbols which turn out to be
2759      defined in regular objects.  For the normal shared case, discard
2760      space for pc-relative relocs that have become local due to symbol
2761      visibility changes.  */
2762
2763   if (bfd_link_pic (info))
2764     {
2765       if (SYMBOL_CALLS_LOCAL (info, h))
2766         {
2767           struct elf_dyn_relocs **pp;
2768
2769           for (pp = &eh->dyn_relocs; (p = *pp) != NULL;)
2770             {
2771               p->count -= p->pc_count;
2772               p->pc_count = 0;
2773               if (p->count == 0)
2774                 *pp = p->next;
2775               else
2776                 pp = &p->next;
2777             }
2778         }
2779
2780       /* Also discard relocs on undefined weak syms with non-default
2781          visibility.  */
2782       if (eh->dyn_relocs != NULL
2783           && h->root.type == bfd_link_hash_undefweak)
2784         {
2785           if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
2786             eh->dyn_relocs = NULL;
2787
2788           /* Make sure undefined weak symbols are output as a dynamic
2789              symbol in PIEs.  */
2790           else if (h->dynindx == -1
2791                    && !h->forced_local)
2792             {
2793               if (! bfd_elf_link_record_dynamic_symbol (info, h))
2794                 return FALSE;
2795             }
2796         }
2797     }
2798   else
2799     {
2800       /* For the non-shared case, discard space for relocs against
2801          symbols which turn out to need copy relocs or are not
2802          dynamic.  */
2803
2804       if (!h->non_got_ref
2805           && ((h->def_dynamic
2806                && !h->def_regular)
2807               || (htab->root.dynamic_sections_created
2808                   && (h->root.type == bfd_link_hash_undefweak
2809                       || h->root.type == bfd_link_hash_undefined))))
2810         {
2811           /* Make sure this symbol is output as a dynamic symbol.
2812              Undefined weak syms won't yet be marked as dynamic.  */
2813           if (h->dynindx == -1
2814               && !h->forced_local)
2815             {
2816               if (! bfd_elf_link_record_dynamic_symbol (info, h))
2817                 return FALSE;
2818             }
2819
2820           /* If that succeeded, we know we'll be keeping all the
2821              relocs.  */
2822           if (h->dynindx != -1)
2823             goto keep;
2824         }
2825
2826       eh->dyn_relocs = NULL;
2827
2828     keep: ;
2829     }
2830
2831   /* Finally, allocate space.  */
2832   for (p = eh->dyn_relocs; p != NULL; p = p->next)
2833     {
2834       asection *sreloc = elf_section_data (p->sec)->sreloc;
2835       sreloc->size += p->count * sizeof (Elf32_External_Rela);
2836     }
2837
2838   return TRUE;
2839 }
2840
2841 /* Set DF_TEXTREL if we find any dynamic relocs that apply to
2842    read-only sections.  */
2843
2844 static bfd_boolean
2845 maybe_set_textrel (struct elf_link_hash_entry *h, void *info_p)
2846 {
2847   asection *sec;
2848
2849   if (h->root.type == bfd_link_hash_indirect)
2850     return TRUE;
2851
2852   sec = readonly_dynrelocs (h);
2853   if (sec != NULL)
2854     {
2855       struct bfd_link_info *info = (struct bfd_link_info *) info_p;
2856
2857       info->flags |= DF_TEXTREL;
2858       info->callbacks->minfo
2859         (_("%pB: dynamic relocation against `%pT' in read-only section `%pA'\n"),
2860          sec->owner, h->root.root.string, sec);
2861
2862       /* Not an error, just cut short the traversal.  */
2863       return FALSE;
2864     }
2865   return TRUE;
2866 }
2867
2868 /* Set the sizes of the dynamic sections.  */
2869
2870 static bfd_boolean
2871 or1k_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
2872                                 struct bfd_link_info *info)
2873 {
2874   struct elf_or1k_link_hash_table *htab;
2875   bfd *dynobj;
2876   asection *s;
2877   bfd_boolean relocs;
2878   bfd *ibfd;
2879
2880   htab = or1k_elf_hash_table (info);
2881   if (htab == NULL)
2882     return FALSE;
2883
2884   dynobj = htab->root.dynobj;
2885   BFD_ASSERT (dynobj != NULL);
2886
2887   if (htab->root.dynamic_sections_created)
2888     {
2889       /* Set the contents of the .interp section to the interpreter.  */
2890       if (bfd_link_executable (info) && !info->nointerp)
2891         {
2892           s = bfd_get_section_by_name (dynobj, ".interp");
2893           BFD_ASSERT (s != NULL);
2894           s->size = sizeof ELF_DYNAMIC_INTERPRETER;
2895           s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
2896         }
2897     }
2898
2899   /* Set up .got offsets for local syms, and space for local dynamic
2900      relocs.  */
2901   for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
2902     {
2903       bfd_signed_vma *local_got;
2904       bfd_signed_vma *end_local_got;
2905       bfd_size_type locsymcount;
2906       Elf_Internal_Shdr *symtab_hdr;
2907       unsigned char *local_tls_type;
2908       asection *srel;
2909
2910       if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour)
2911         continue;
2912
2913       for (s = ibfd->sections; s != NULL; s = s->next)
2914         {
2915           struct elf_dyn_relocs *p;
2916
2917           for (p = ((struct elf_dyn_relocs *)
2918                     elf_section_data (s)->local_dynrel);
2919                p != NULL;
2920                p = p->next)
2921             {
2922               if (! bfd_is_abs_section (p->sec)
2923                   && bfd_is_abs_section (p->sec->output_section))
2924                 {
2925                   /* Input section has been discarded, either because
2926                      it is a copy of a linkonce section or due to
2927                      linker script /DISCARD/, so we'll be discarding
2928                      the relocs too.  */
2929                 }
2930               else if (p->count != 0)
2931                 {
2932                   srel = elf_section_data (p->sec)->sreloc;
2933                   srel->size += p->count * sizeof (Elf32_External_Rela);
2934                   if ((p->sec->output_section->flags & SEC_READONLY) != 0)
2935                     info->flags |= DF_TEXTREL;
2936                 }
2937             }
2938         }
2939
2940       local_got = elf_local_got_refcounts (ibfd);
2941       if (!local_got)
2942         continue;
2943
2944       symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
2945       locsymcount = symtab_hdr->sh_info;
2946       end_local_got = local_got + locsymcount;
2947       s = htab->root.sgot;
2948       srel = htab->root.srelgot;
2949       local_tls_type = (unsigned char *) elf_or1k_local_tls_type (ibfd);
2950       for (; local_got < end_local_got; ++local_got)
2951         {
2952           if (*local_got > 0)
2953             {
2954               *local_got = s->size;
2955
2956               /* TLS GD requires two GOT and two relocs.  */
2957               if (local_tls_type != NULL && *local_tls_type == TLS_GD)
2958                 s->size += 8;
2959               else
2960                 s->size += 4;
2961               if (bfd_link_pic (info))
2962                 {
2963                   if (local_tls_type != NULL && *local_tls_type == TLS_GD)
2964                     srel->size += 2 * sizeof (Elf32_External_Rela);
2965                   else
2966                     srel->size += sizeof (Elf32_External_Rela);
2967                 }
2968             }
2969           else
2970
2971             *local_got = (bfd_vma) -1;
2972
2973           if (local_tls_type)
2974             ++local_tls_type;
2975         }
2976     }
2977
2978   /* Allocate global sym .plt and .got entries, and space for global
2979      sym dynamic relocs.  */
2980   elf_link_hash_traverse (&htab->root, allocate_dynrelocs, info);
2981
2982   /* We now have determined the sizes of the various dynamic sections.
2983      Allocate memory for them.  */
2984   relocs = FALSE;
2985   for (s = dynobj->sections; s != NULL; s = s->next)
2986     {
2987       if ((s->flags & SEC_LINKER_CREATED) == 0)
2988         continue;
2989
2990       if (s == htab->root.splt
2991           || s == htab->root.sgot
2992           || s == htab->root.sgotplt
2993           || s == htab->root.sdynbss
2994           || s == htab->root.sdynrelro)
2995         {
2996           /* Strip this section if we don't need it; see the
2997              comment below.  */
2998         }
2999       else if (CONST_STRNEQ (bfd_get_section_name (dynobj, s), ".rela"))
3000         {
3001           if (s->size != 0 && s != htab->root.srelplt)
3002             relocs = TRUE;
3003
3004           /* We use the reloc_count field as a counter if we need
3005              to copy relocs into the output file.  */
3006           s->reloc_count = 0;
3007         }
3008       else
3009         /* It's not one of our sections, so don't allocate space.  */
3010         continue;
3011
3012       if (s->size == 0)
3013         {
3014           /* If we don't need this section, strip it from the
3015              output file.  This is mostly to handle .rela.bss and
3016              .rela.plt.  We must create both sections in
3017              create_dynamic_sections, because they must be created
3018              before the linker maps input sections to output
3019              sections.  The linker does that before
3020              adjust_dynamic_symbol is called, and it is that
3021              function which decides whether anything needs to go
3022              into these sections.  */
3023           s->flags |= SEC_EXCLUDE;
3024           continue;
3025         }
3026
3027       if ((s->flags & SEC_HAS_CONTENTS) == 0)
3028         continue;
3029
3030       /* Allocate memory for the section contents.  We use bfd_zalloc
3031          here in case unused entries are not reclaimed before the
3032          section's contents are written out.  This should not happen,
3033          but this way if it does, we get a R_OR1K_NONE reloc instead
3034          of garbage.  */
3035       s->contents = bfd_zalloc (dynobj, s->size);
3036
3037       if (s->contents == NULL)
3038         return FALSE;
3039     }
3040
3041   if (htab->root.dynamic_sections_created)
3042     {
3043       /* Add some entries to the .dynamic section.  We fill in the
3044          values later, in or1k_elf_finish_dynamic_sections, but we
3045          must add the entries now so that we get the correct size for
3046          the .dynamic section.  The DT_DEBUG entry is filled in by the
3047          dynamic linker and used by the debugger.  */
3048 #define add_dynamic_entry(TAG, VAL) \
3049   _bfd_elf_add_dynamic_entry (info, TAG, VAL)
3050
3051      if (bfd_link_executable (info))
3052        {
3053          if (! add_dynamic_entry (DT_DEBUG, 0))
3054            return FALSE;
3055        }
3056
3057      if (htab->root.splt->size != 0)
3058        {
3059          if (! add_dynamic_entry (DT_PLTGOT, 0)
3060              || ! add_dynamic_entry (DT_PLTRELSZ, 0)
3061              || ! add_dynamic_entry (DT_PLTREL, DT_RELA)
3062              || ! add_dynamic_entry (DT_JMPREL, 0))
3063            return FALSE;
3064         }
3065
3066      if (relocs)
3067        {
3068          if (! add_dynamic_entry (DT_RELA, 0)
3069              || ! add_dynamic_entry (DT_RELASZ, 0)
3070              || ! add_dynamic_entry (DT_RELAENT,
3071                                      sizeof (Elf32_External_Rela)))
3072            return FALSE;
3073
3074          /* If any dynamic relocs apply to a read-only section,
3075             then we need a DT_TEXTREL entry.  */
3076          if ((info->flags & DF_TEXTREL) == 0)
3077            elf_link_hash_traverse (&htab->root, maybe_set_textrel, info);
3078
3079          if ((info->flags & DF_TEXTREL) != 0)
3080            {
3081              if (! add_dynamic_entry (DT_TEXTREL, 0))
3082                return FALSE;
3083            }
3084        }
3085     }
3086
3087 #undef add_dynamic_entry
3088   return TRUE;
3089 }
3090
3091 /* Copy the extra info we tack onto an elf_link_hash_entry.  */
3092
3093 static void
3094 or1k_elf_copy_indirect_symbol (struct bfd_link_info *info,
3095                                struct elf_link_hash_entry *dir,
3096                                struct elf_link_hash_entry *ind)
3097 {
3098   struct elf_or1k_link_hash_entry * edir;
3099   struct elf_or1k_link_hash_entry * eind;
3100
3101   edir = (struct elf_or1k_link_hash_entry *) dir;
3102   eind = (struct elf_or1k_link_hash_entry *) ind;
3103
3104   if (eind->dyn_relocs != NULL)
3105     {
3106       if (edir->dyn_relocs != NULL)
3107         {
3108           struct elf_dyn_relocs **pp;
3109           struct elf_dyn_relocs *p;
3110
3111           /* Add reloc counts against the indirect sym to the direct sym
3112              list.  Merge any entries against the same section.  */
3113           for (pp = &eind->dyn_relocs; (p = *pp) != NULL;)
3114             {
3115               struct elf_dyn_relocs *q;
3116
3117               for (q = edir->dyn_relocs; q != NULL; q = q->next)
3118                 if (q->sec == p->sec)
3119                   {
3120                     q->pc_count += p->pc_count;
3121                     q->count += p->count;
3122                     *pp = p->next;
3123                     break;
3124                   }
3125               if (q == NULL)
3126                 pp = &p->next;
3127             }
3128           *pp = edir->dyn_relocs;
3129         }
3130
3131       edir->dyn_relocs = eind->dyn_relocs;
3132       eind->dyn_relocs = NULL;
3133     }
3134
3135   if (ind->root.type == bfd_link_hash_indirect)
3136     {
3137       if (dir->got.refcount <= 0)
3138         {
3139           edir->tls_type = eind->tls_type;
3140           eind->tls_type = TLS_UNKNOWN;
3141         }
3142     }
3143
3144   _bfd_elf_link_hash_copy_indirect (info, dir, ind);
3145 }
3146
3147 /* Set the right machine number.  */
3148
3149 static bfd_boolean
3150 or1k_elf_object_p (bfd *abfd)
3151 {
3152   unsigned long mach = bfd_mach_or1k;
3153
3154   if (elf_elfheader (abfd)->e_flags & EF_OR1K_NODELAY)
3155     mach = bfd_mach_or1knd;
3156
3157   return bfd_default_set_arch_mach (abfd, bfd_arch_or1k, mach);
3158 }
3159
3160 /* Store the machine number in the flags field.  */
3161
3162 static bfd_boolean
3163 or1k_elf_final_write_processing (bfd *abfd)
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   return _bfd_elf_final_write_processing (abfd);
3175 }
3176
3177 static bfd_boolean
3178 or1k_elf_set_private_flags (bfd *abfd, flagword flags)
3179 {
3180   BFD_ASSERT (!elf_flags_init (abfd)
3181               || elf_elfheader (abfd)->e_flags == flags);
3182
3183   elf_elfheader (abfd)->e_flags = flags;
3184   elf_flags_init (abfd) = TRUE;
3185   return TRUE;
3186 }
3187
3188 /* Make sure all input files are consistent with respect to
3189    EF_OR1K_NODELAY flag setting.  */
3190
3191 static bfd_boolean
3192 elf32_or1k_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
3193 {
3194   bfd *obfd = info->output_bfd;
3195   flagword out_flags;
3196   flagword in_flags;
3197
3198   in_flags  = elf_elfheader (ibfd)->e_flags;
3199   out_flags = elf_elfheader (obfd)->e_flags;
3200
3201   if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
3202       || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
3203     return TRUE;
3204
3205   if (!elf_flags_init (obfd))
3206     {
3207       elf_flags_init (obfd) = TRUE;
3208       elf_elfheader (obfd)->e_flags = in_flags;
3209
3210       return TRUE;
3211     }
3212
3213   if (in_flags == out_flags)
3214     return TRUE;
3215
3216   if ((in_flags & EF_OR1K_NODELAY) != (out_flags & EF_OR1K_NODELAY))
3217     {
3218       _bfd_error_handler
3219         (_("%pB: %s flag mismatch with previous modules"),
3220          ibfd, "EF_OR1K_NODELAY");
3221
3222       bfd_set_error (bfd_error_bad_value);
3223       return FALSE;
3224     }
3225
3226   return TRUE;
3227
3228 }
3229
3230 /* Implement elf_backend_grok_prstatus:
3231    Support for core dump NOTE sections.  */
3232 static bfd_boolean
3233 or1k_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
3234 {
3235   int offset;
3236   size_t size;
3237
3238   switch (note->descsz)
3239     {
3240     default:
3241       return FALSE;
3242
3243     case 212:         /* Linux/OpenRISC */
3244       /* pr_cursig */
3245       elf_tdata (abfd)->core->signal = bfd_get_16 (abfd, note->descdata + 12);
3246
3247       /* pr_pid */
3248       elf_tdata (abfd)->core->pid = bfd_get_32 (abfd, note->descdata + 24);
3249
3250       /* pr_reg */
3251       offset = 72;
3252       size = 132;
3253
3254       break;
3255     }
3256
3257   /* Make a ".reg/999" section.  */
3258   return _bfd_elfcore_make_pseudosection (abfd, ".reg",
3259                                           size, note->descpos + offset);
3260 }
3261
3262 /* Implement elf_backend_grok_psinfo.  */
3263 static bfd_boolean
3264 or1k_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
3265 {
3266   switch (note->descsz)
3267     {
3268     default:
3269       return FALSE;
3270
3271     case 128:         /* Linux/OpenRISC elf_prpsinfo */
3272       elf_tdata (abfd)->core->program
3273         = _bfd_elfcore_strndup (abfd, note->descdata + 32, 16);
3274       elf_tdata (abfd)->core->command
3275         = _bfd_elfcore_strndup (abfd, note->descdata + 48, 80);
3276     }
3277
3278   return TRUE;
3279 }
3280
3281
3282 #define ELF_ARCH                        bfd_arch_or1k
3283 #define ELF_MACHINE_CODE                EM_OR1K
3284 #define ELF_TARGET_ID                   OR1K_ELF_DATA
3285 #define ELF_MAXPAGESIZE                 0x2000
3286
3287 #define TARGET_BIG_SYM                  or1k_elf32_vec
3288 #define TARGET_BIG_NAME                 "elf32-or1k"
3289
3290 #define elf_info_to_howto_rel           NULL
3291 #define elf_info_to_howto               or1k_info_to_howto_rela
3292 #define elf_backend_relocate_section    or1k_elf_relocate_section
3293 #define elf_backend_gc_mark_hook        or1k_elf_gc_mark_hook
3294 #define elf_backend_check_relocs        or1k_elf_check_relocs
3295 #define elf_backend_reloc_type_class    or1k_elf_reloc_type_class
3296 #define elf_backend_can_gc_sections     1
3297 #define elf_backend_rela_normal         1
3298
3299 #define bfd_elf32_mkobject                   elf_or1k_mkobject
3300
3301 #define bfd_elf32_bfd_merge_private_bfd_data elf32_or1k_merge_private_bfd_data
3302 #define bfd_elf32_bfd_set_private_flags or1k_elf_set_private_flags
3303 #define bfd_elf32_bfd_reloc_type_lookup or1k_reloc_type_lookup
3304 #define bfd_elf32_bfd_reloc_name_lookup or1k_reloc_name_lookup
3305
3306 #define elf_backend_object_p                or1k_elf_object_p
3307 #define elf_backend_final_write_processing  or1k_elf_final_write_processing
3308 #define elf_backend_can_refcount                1
3309
3310 #define elf_backend_plt_readonly                1
3311 #define elf_backend_want_got_plt                1
3312 #define elf_backend_want_plt_sym                0
3313 #define elf_backend_got_header_size             12
3314 #define elf_backend_dtrel_excludes_plt          1
3315 #define elf_backend_want_dynrelro               1
3316
3317 #define bfd_elf32_bfd_link_hash_table_create    or1k_elf_link_hash_table_create
3318 #define elf_backend_copy_indirect_symbol        or1k_elf_copy_indirect_symbol
3319 #define elf_backend_create_dynamic_sections     _bfd_elf_create_dynamic_sections
3320 #define elf_backend_finish_dynamic_sections     or1k_elf_finish_dynamic_sections
3321 #define elf_backend_size_dynamic_sections       or1k_elf_size_dynamic_sections
3322 #define elf_backend_adjust_dynamic_symbol       or1k_elf_adjust_dynamic_symbol
3323 #define elf_backend_finish_dynamic_symbol       or1k_elf_finish_dynamic_symbol
3324
3325 #define elf_backend_grok_prstatus         or1k_grok_prstatus
3326 #define elf_backend_grok_psinfo           or1k_grok_psinfo
3327
3328 #include "elf32-target.h"