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