Merge branch 'vendor/NVI2'
[dragonfly.git] / contrib / binutils-2.25 / bfd / elf32-or1k.c
1 /* Or1k-specific support for 32-bit ELF.
2    Copyright 2001-2014 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          2,                     /* size (0 = byte, 1 = short, 2 = long) */
64          32,                    /* 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          FALSE),                /* 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          FALSE),                /* 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          FALSE),                /* 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 /* The linker needs to keep track of the number of relocs that it
560    decides to copy as dynamic relocs in check_relocs for each symbol.
561    This is so that it can later discard them if they are found to be
562    unnecessary.  We store the information in a field extending the
563    regular ELF linker hash table.  */
564
565 struct elf_or1k_dyn_relocs
566 {
567   struct elf_or1k_dyn_relocs *next;
568
569   /* The input section of the reloc.  */
570   asection *sec;
571
572   /* Total number of relocs copied for the input section.  */
573   bfd_size_type count;
574
575   /* Number of pc-relative relocs copied for the input section.  */
576   bfd_size_type pc_count;
577 };
578
579 #define TLS_UNKNOWN    0
580 #define TLS_NONE       1
581 #define TLS_GD         2
582 #define TLS_LD         3
583 #define TLS_IE         4
584 #define TLS_LE         5
585
586 /* ELF linker hash entry.  */
587 struct elf_or1k_link_hash_entry
588 {
589   struct elf_link_hash_entry root;
590
591   /* Track dynamic relocs copied for this symbol.  */
592   struct elf_or1k_dyn_relocs *dyn_relocs;
593
594   /* Track type of TLS access.  */
595   unsigned char tls_type;
596 };
597
598 /* ELF object data.  */
599 struct elf_or1k_obj_tdata
600 {
601   struct elf_obj_tdata root;
602
603   /* tls_type for each local got entry.  */
604   unsigned char *local_tls_type;
605 };
606
607 #define elf_or1k_tdata(abfd) \
608   ((struct elf_or1k_obj_tdata *) (abfd)->tdata.any)
609
610 #define elf_or1k_local_tls_type(abfd) \
611   (elf_or1k_tdata (abfd)->local_tls_type)
612
613 /* ELF linker hash table.  */
614 struct elf_or1k_link_hash_table
615 {
616   struct elf_link_hash_table root;
617
618   /* Short-cuts to get to dynamic linker sections.  */
619   asection *sgot;
620   asection *sgotplt;
621   asection *srelgot;
622   asection *splt;
623   asection *srelplt;
624   asection *sdynbss;
625   asection *srelbss;
626
627   /* Small local sym to section mapping cache.  */
628   struct sym_cache sym_sec;
629 };
630
631 /* Get the ELF linker hash table from a link_info structure.  */
632 #define or1k_elf_hash_table(p) \
633   (elf_hash_table_id ((struct elf_link_hash_table *) ((p)->hash)) \
634    == OR1K_ELF_DATA ? ((struct elf_or1k_link_hash_table *) ((p)->hash)) : NULL)
635
636 static bfd_boolean
637 elf_or1k_mkobject (bfd *abfd)
638 {
639   return bfd_elf_allocate_object (abfd, sizeof (struct elf_or1k_obj_tdata),
640                                   OR1K_ELF_DATA);
641 }
642
643 /* Create an entry in an or1k ELF linker hash table.  */
644
645 static struct bfd_hash_entry *
646 or1k_elf_link_hash_newfunc (struct bfd_hash_entry *entry,
647                             struct bfd_hash_table *table,
648                             const char *string)
649 {
650   struct elf_or1k_link_hash_entry *ret =
651     (struct elf_or1k_link_hash_entry *) entry;
652
653   /* Allocate the structure if it has not already been allocated by a
654      subclass.  */
655   if (ret == NULL)
656     ret = bfd_hash_allocate (table,
657                              sizeof (struct elf_or1k_link_hash_entry));
658   if (ret == NULL)
659     return NULL;
660
661   /* Call the allocation method of the superclass.  */
662   ret = ((struct elf_or1k_link_hash_entry *)
663          _bfd_elf_link_hash_newfunc ((struct bfd_hash_entry *) ret,
664                                      table, string));
665   if (ret != NULL)
666     {
667       struct elf_or1k_link_hash_entry *eh;
668
669       eh = (struct elf_or1k_link_hash_entry *) ret;
670       eh->dyn_relocs = NULL;
671       eh->tls_type = TLS_UNKNOWN;
672     }
673
674   return (struct bfd_hash_entry *) ret;
675 }
676
677 /* Create an or1k ELF linker hash table.  */
678
679 static struct bfd_link_hash_table *
680 or1k_elf_link_hash_table_create (bfd *abfd)
681 {
682   struct elf_or1k_link_hash_table *ret;
683   bfd_size_type amt = sizeof (struct elf_or1k_link_hash_table);
684
685   ret = bfd_zmalloc (amt);
686   if (ret == NULL)
687     return NULL;
688
689   if (!_bfd_elf_link_hash_table_init (&ret->root, abfd,
690                                       or1k_elf_link_hash_newfunc,
691                                       sizeof (struct elf_or1k_link_hash_entry),
692                                       OR1K_ELF_DATA))
693     {
694       free (ret);
695       return NULL;
696     }
697
698   return &ret->root.root;
699 }
700
701 static reloc_howto_type *
702 or1k_reloc_type_lookup (bfd * abfd ATTRIBUTE_UNUSED,
703                         bfd_reloc_code_real_type code)
704 {
705   unsigned int i;
706
707   for (i = ARRAY_SIZE (or1k_reloc_map); --i;)
708     if (or1k_reloc_map[i].bfd_reloc_val == code)
709       return & or1k_elf_howto_table[or1k_reloc_map[i].or1k_reloc_val];
710
711   return NULL;
712 }
713
714 static reloc_howto_type *
715 or1k_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
716                         const char *r_name)
717 {
718   unsigned int i;
719
720   for (i = 0;
721        i < (sizeof (or1k_elf_howto_table)
722             / sizeof (or1k_elf_howto_table[0]));
723        i++)
724     if (or1k_elf_howto_table[i].name != NULL
725         && strcasecmp (or1k_elf_howto_table[i].name, r_name) == 0)
726       return &or1k_elf_howto_table[i];
727
728   return NULL;
729 }
730
731 /* Set the howto pointer for an Or1k ELF reloc.  */
732
733 static void
734 or1k_info_to_howto_rela (bfd * abfd ATTRIBUTE_UNUSED,
735                          arelent * cache_ptr,
736                          Elf_Internal_Rela * dst)
737 {
738   unsigned int r_type;
739
740   r_type = ELF32_R_TYPE (dst->r_info);
741   BFD_ASSERT (r_type < (unsigned int) R_OR1K_max);
742   cache_ptr->howto = & or1k_elf_howto_table[r_type];
743 }
744
745
746 /* Return the relocation value for @tpoff relocations..  */
747 static bfd_vma
748 tpoff (struct bfd_link_info *info, bfd_vma address)
749 {
750   /* If tls_sec is NULL, we should have signalled an error already.  */
751   if (elf_hash_table (info)->tls_sec == NULL)
752     return 0;
753
754   /* The thread pointer on or1k stores the address after the TCB where
755      the data is, just compute the difference. No need to compensate
756      for the size of TCB.  */
757   return (address - elf_hash_table (info)->tls_sec->vma);
758 }
759
760 /* Relocate an Or1k ELF section.
761
762    The RELOCATE_SECTION function is called by the new ELF backend linker
763    to handle the relocations for a section.
764
765    The relocs are always passed as Rela structures; if the section
766    actually uses Rel structures, the r_addend field will always be
767    zero.
768
769    This function is responsible for adjusting the section contents as
770    necessary, and (if using Rela relocs and generating a relocatable
771    output file) adjusting the reloc addend as necessary.
772
773    This function does not have to worry about setting the reloc
774    address or the reloc symbol index.
775
776    LOCAL_SYMS is a pointer to the swapped in local symbols.
777
778    LOCAL_SECTIONS is an array giving the section in the input file
779    corresponding to the st_shndx field of each local symbol.
780
781    The global hash table entry for the global symbols can be found
782    via elf_sym_hashes (input_bfd).
783
784    When generating relocatable output, this function must handle
785    STB_LOCAL/STT_SECTION symbols specially.  The output symbol is
786    going to be the section symbol corresponding to the output
787    section, which means that the addend must be adjusted
788    accordingly.  */
789
790 static bfd_boolean
791 or1k_elf_relocate_section (bfd *output_bfd,
792                            struct bfd_link_info *info,
793                            bfd *input_bfd,
794                            asection *input_section,
795                            bfd_byte *contents,
796                            Elf_Internal_Rela *relocs,
797                            Elf_Internal_Sym *local_syms,
798                            asection **local_sections)
799 {
800   Elf_Internal_Shdr *symtab_hdr;
801   struct elf_link_hash_entry **sym_hashes;
802   Elf_Internal_Rela *rel;
803   Elf_Internal_Rela *relend;
804   struct elf_or1k_link_hash_table *htab = or1k_elf_hash_table (info);
805   bfd *dynobj;
806   asection *sreloc;
807   bfd_vma *local_got_offsets;
808   asection *sgot;
809
810   if (htab == NULL)
811     return FALSE;
812
813   dynobj = htab->root.dynobj;
814   local_got_offsets = elf_local_got_offsets (input_bfd);
815
816   sreloc = elf_section_data (input_section)->sreloc;
817
818   sgot = htab->sgot;
819
820   symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
821   sym_hashes = elf_sym_hashes (input_bfd);
822   relend = relocs + input_section->reloc_count;
823
824   for (rel = relocs; rel < relend; rel++)
825     {
826       reloc_howto_type *howto;
827       unsigned long r_symndx;
828       Elf_Internal_Sym *sym;
829       asection *sec;
830       struct elf_link_hash_entry *h;
831       bfd_vma relocation;
832       bfd_reloc_status_type r;
833       const char *name = NULL;
834       int r_type;
835
836       r_type = ELF32_R_TYPE (rel->r_info);
837       r_symndx = ELF32_R_SYM (rel->r_info);
838
839       if (r_type == R_OR1K_GNU_VTINHERIT
840           || r_type == R_OR1K_GNU_VTENTRY)
841         continue;
842
843       if (r_type < 0 || r_type >= (int) R_OR1K_max)
844         {
845           bfd_set_error (bfd_error_bad_value);
846           return FALSE;
847         }
848
849       howto = or1k_elf_howto_table + ELF32_R_TYPE (rel->r_info);
850       h = NULL;
851       sym = NULL;
852       sec = NULL;
853
854       if (r_symndx < symtab_hdr->sh_info)
855         {
856           sym = local_syms + r_symndx;
857           sec = local_sections[r_symndx];
858           relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
859
860           name = bfd_elf_string_from_elf_section
861             (input_bfd, symtab_hdr->sh_link, sym->st_name);
862           name = (name == NULL) ? bfd_section_name (input_bfd, sec) : name;
863         }
864       else
865         {
866           bfd_boolean unresolved_reloc, warned, ignored;
867
868           RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
869                                    r_symndx, symtab_hdr, sym_hashes,
870                                    h, sec, relocation,
871                                    unresolved_reloc, warned, ignored);
872         }
873
874       if (sec != NULL && discarded_section (sec))
875         RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
876                                          rel, 1, relend, howto, 0, contents);
877
878       if (info->relocatable)
879         continue;
880
881       switch (howto->type)
882         {
883         case R_OR1K_PLT26:
884           {
885             if (htab->splt != NULL && h != NULL
886                 && h->plt.offset != (bfd_vma) -1)
887               {
888                 relocation = (htab->splt->output_section->vma
889                               + htab->splt->output_offset
890                               + h->plt.offset);
891               }
892             break;
893           }
894
895         case R_OR1K_GOT16:
896           /* Relocation is to the entry for this symbol in the global
897              offset table.  */
898           BFD_ASSERT (sgot != NULL);
899           if (h != NULL)
900             {
901               bfd_boolean dyn;
902               bfd_vma off;
903
904               off = h->got.offset;
905               BFD_ASSERT (off != (bfd_vma) -1);
906
907               dyn = htab->root.dynamic_sections_created;
908               if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
909                   || (info->shared
910                       && SYMBOL_REFERENCES_LOCAL (info, h)))
911                 {
912                   /* This is actually a static link, or it is a
913                      -Bsymbolic link and the symbol is defined
914                      locally, or the symbol was forced to be local
915                      because of a version file.  We must initialize
916                      this entry in the global offset table.  Since the
917                      offset must always be a multiple of 4, we use the
918                      least significant bit to record whether we have
919                      initialized it already.
920
921                      When doing a dynamic link, we create a .rela.got
922                      relocation entry to initialize the value.  This
923                      is done in the finish_dynamic_symbol routine.  */
924                   if ((off & 1) != 0)
925                     off &= ~1;
926                   else
927                     {
928                       /* Write entry in GOT.  */
929                       bfd_put_32 (output_bfd, relocation,
930                                   sgot->contents + off);
931                       /* Mark GOT entry as having been written.  */
932                       h->got.offset |= 1;
933                     }
934                 }
935
936               relocation = sgot->output_offset + off;
937             }
938           else
939             {
940               bfd_vma off;
941               bfd_byte *loc;
942
943               BFD_ASSERT (local_got_offsets != NULL
944                           && local_got_offsets[r_symndx] != (bfd_vma) -1);
945
946               /* Get offset into GOT table.  */
947               off = local_got_offsets[r_symndx];
948
949               /* The offset must always be a multiple of 4.  We use
950                  the least significant bit to record whether we have
951                  already processed this entry.  */
952               if ((off & 1) != 0)
953                 off &= ~1;
954               else
955                 {
956                   /* Write entry in GOT.  */
957                   bfd_put_32 (output_bfd, relocation, sgot->contents + off);
958                   if (info->shared)
959                     {
960                       asection *srelgot;
961                       Elf_Internal_Rela outrel;
962
963                       /* We need to generate a R_OR1K_RELATIVE reloc
964                          for the dynamic linker.  */
965                       srelgot = bfd_get_section_by_name (dynobj, ".rela.got");
966                       BFD_ASSERT (srelgot != NULL);
967
968                       outrel.r_offset = (sgot->output_section->vma
969                                          + sgot->output_offset
970                                          + off);
971                       outrel.r_info = ELF32_R_INFO (0, R_OR1K_RELATIVE);
972                       outrel.r_addend = relocation;
973                       loc = srelgot->contents;
974                       loc += srelgot->reloc_count * sizeof (Elf32_External_Rela);
975                       bfd_elf32_swap_reloca_out (output_bfd, &outrel,loc);
976                       ++srelgot->reloc_count;
977                     }
978
979                   local_got_offsets[r_symndx] |= 1;
980                 }
981               relocation = sgot->output_offset + off;
982             }
983
984           /* Addend should be zero.  */
985           if (rel->r_addend != 0)
986             (*_bfd_error_handler)
987               (_("internal error: addend should be zero for R_OR1K_GOT16"));
988
989           break;
990
991         case R_OR1K_GOTOFF_LO16:
992         case R_OR1K_GOTOFF_HI16:
993           /* Relocation is offset from GOT.  */
994           BFD_ASSERT (sgot != NULL);
995           relocation -= sgot->output_section->vma;
996           break;
997
998         case R_OR1K_INSN_REL_26:
999         case R_OR1K_HI_16_IN_INSN:
1000         case R_OR1K_LO_16_IN_INSN:
1001         case R_OR1K_32:
1002           /* R_OR1K_16? */
1003           {
1004             /* r_symndx will be STN_UNDEF (zero) only for relocs against symbols
1005                from removed linkonce sections, or sections discarded by
1006                a linker script.  */
1007             if (r_symndx == STN_UNDEF
1008                 || (input_section->flags & SEC_ALLOC) == 0)
1009               break;
1010
1011             if ((info->shared
1012                  && (h == NULL
1013                      || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
1014                      || h->root.type != bfd_link_hash_undefweak)
1015                  && (howto->type != R_OR1K_INSN_REL_26
1016                      || !SYMBOL_CALLS_LOCAL (info, h)))
1017                 || (!info->shared
1018                     && h != NULL
1019                     && h->dynindx != -1
1020                     && !h->non_got_ref
1021                     && ((h->def_dynamic
1022                          && !h->def_regular)
1023                         || h->root.type == bfd_link_hash_undefweak
1024                         || h->root.type == bfd_link_hash_undefined)))
1025               {
1026                 Elf_Internal_Rela outrel;
1027                 bfd_byte *loc;
1028                 bfd_boolean skip;
1029
1030                 /* When generating a shared object, these relocations
1031                    are copied into the output file to be resolved at run
1032                    time.  */
1033
1034                 BFD_ASSERT (sreloc != NULL);
1035
1036                 skip = FALSE;
1037
1038                 outrel.r_offset =
1039                   _bfd_elf_section_offset (output_bfd, info, input_section,
1040                                            rel->r_offset);
1041                 if (outrel.r_offset == (bfd_vma) -1)
1042                   skip = TRUE;
1043                 else if (outrel.r_offset == (bfd_vma) -2)
1044                   skip = TRUE;
1045                 outrel.r_offset += (input_section->output_section->vma
1046                                     + input_section->output_offset);
1047
1048                 if (skip)
1049                   memset (&outrel, 0, sizeof outrel);
1050                 /* h->dynindx may be -1 if the symbol was marked to
1051                    become local.  */
1052                 else if (h != NULL
1053                          && ((! info->symbolic && h->dynindx != -1)
1054                              || !h->def_regular))
1055                   {
1056                     BFD_ASSERT (h->dynindx != -1);
1057                     outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
1058                     outrel.r_addend = rel->r_addend;
1059                   }
1060                 else
1061                   {
1062                     if (r_type == R_OR1K_32)
1063                       {
1064                         outrel.r_info = ELF32_R_INFO (0, R_OR1K_RELATIVE);
1065                         outrel.r_addend = relocation + rel->r_addend;
1066                       }
1067                     else
1068                       {
1069                         BFD_FAIL ();
1070                         (*_bfd_error_handler)
1071                           (_("%B: probably compiled without -fPIC?"),
1072                            input_bfd);
1073                         bfd_set_error (bfd_error_bad_value);
1074                         return FALSE;
1075                       }
1076                   }
1077
1078                 loc = sreloc->contents;
1079                 loc += sreloc->reloc_count++ * sizeof (Elf32_External_Rela);
1080                 bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
1081                 break;
1082               }
1083             break;
1084           }
1085
1086         case R_OR1K_TLS_LDM_HI16:
1087         case R_OR1K_TLS_LDM_LO16:
1088         case R_OR1K_TLS_LDO_HI16:
1089         case R_OR1K_TLS_LDO_LO16:
1090           /* TODO: implement support for local dynamic.  */
1091           BFD_FAIL ();
1092           (*_bfd_error_handler)
1093             (_("%B: support for local dynamic not implemented"),
1094              input_bfd);
1095           bfd_set_error (bfd_error_bad_value);
1096           return FALSE;
1097
1098
1099         case R_OR1K_TLS_GD_HI16:
1100         case R_OR1K_TLS_GD_LO16:
1101         case R_OR1K_TLS_IE_HI16:
1102         case R_OR1K_TLS_IE_LO16:
1103           {
1104             bfd_vma gotoff;
1105             Elf_Internal_Rela rela;
1106             bfd_byte *loc;
1107             int dynamic;
1108
1109             sreloc = bfd_get_section_by_name (dynobj, ".rela.got");
1110
1111             /* Mark as TLS related GOT entry by setting
1112                bit 2 as well as bit 1.  */
1113             if (h != NULL)
1114               {
1115                 gotoff = h->got.offset;
1116                 h->got.offset |= 3;
1117               }
1118             else
1119               {
1120                 gotoff = local_got_offsets[r_symndx];
1121                 local_got_offsets[r_symndx] |= 3;
1122               }
1123
1124             /* Only process the relocation once.  */
1125             if (gotoff & 1)
1126               {
1127                 relocation = sgot->output_offset + (gotoff  & ~3);
1128                 break;
1129               }
1130
1131             BFD_ASSERT (elf_hash_table (info)->hgot == NULL
1132                         || elf_hash_table (info)->hgot->root.u.def.value == 0);
1133
1134             /* Dynamic entries will require relocations. if we do not need
1135                them we will just use the default R_OR1K_NONE and
1136                not set anything.  */
1137             dynamic = info->shared
1138               || (sec && (sec->flags & SEC_ALLOC) != 0
1139                   && h != NULL
1140                   && (h->root.type == bfd_link_hash_defweak || !h->def_regular));
1141
1142             /* Shared GD.  */
1143             if (dynamic && (howto->type == R_OR1K_TLS_GD_HI16
1144                             || howto->type == R_OR1K_TLS_GD_LO16))
1145               {
1146                 int i;
1147
1148                 /* Add DTPMOD and DTPOFF GOT and rela entries.  */
1149                 for (i = 0; i < 2; ++i)
1150                   {
1151                     rela.r_offset = sgot->output_section->vma +
1152                       sgot->output_offset + gotoff + i*4;
1153                     if (h != NULL && h->dynindx != -1)
1154                       {
1155                         rela.r_info = ELF32_R_INFO (h->dynindx,
1156                             (i == 0 ? R_OR1K_TLS_DTPMOD : R_OR1K_TLS_DTPOFF));
1157                         rela.r_addend = 0;
1158                       }
1159                     else
1160                       {
1161                         rela.r_info = ELF32_R_INFO (0,
1162                             (i == 0 ? R_OR1K_TLS_DTPMOD : R_OR1K_TLS_DTPOFF));
1163                         rela.r_addend = tpoff (info, relocation);
1164                       }
1165
1166                     loc = sreloc->contents;
1167                     loc += sreloc->reloc_count++ *
1168                       sizeof (Elf32_External_Rela);
1169
1170                     bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
1171                     bfd_put_32 (output_bfd, 0, sgot->contents + gotoff + i*4);
1172                   }
1173               }
1174             /* Static GD.  */
1175             else if (howto->type == R_OR1K_TLS_GD_HI16
1176                      || howto->type == R_OR1K_TLS_GD_LO16)
1177               {
1178                 bfd_put_32 (output_bfd, 1, sgot->contents + gotoff);
1179                 bfd_put_32 (output_bfd, tpoff (info, relocation),
1180                     sgot->contents + gotoff + 4);
1181               }
1182             /* Shared IE.  */
1183             else if (dynamic)
1184               {
1185                 /* Add TPOFF GOT and rela entries.  */
1186                 rela.r_offset = sgot->output_section->vma +
1187                   sgot->output_offset + gotoff;
1188                 if (h != NULL && h->dynindx != -1)
1189                   {
1190                     rela.r_info = ELF32_R_INFO (h->dynindx, R_OR1K_TLS_TPOFF);
1191                     rela.r_addend = 0;
1192                   }
1193                 else
1194                   {
1195                     rela.r_info = ELF32_R_INFO (0, R_OR1K_TLS_TPOFF);
1196                     rela.r_addend = tpoff (info, relocation);
1197                   }
1198
1199                 loc = sreloc->contents;
1200                 loc += sreloc->reloc_count++ * sizeof (Elf32_External_Rela);
1201
1202                 bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
1203                 bfd_put_32 (output_bfd, 0, sgot->contents + gotoff);
1204               }
1205             /* Static IE.  */
1206             else
1207               {
1208                 bfd_put_32 (output_bfd, tpoff (info, relocation),
1209                             sgot->contents + gotoff);
1210               }
1211             relocation = sgot->output_offset + gotoff;
1212             break;
1213           }
1214         case R_OR1K_TLS_LE_HI16:
1215         case R_OR1K_TLS_LE_LO16:
1216
1217           /* Relocation is offset from TP.  */
1218           relocation = tpoff (info, relocation);
1219           break;
1220
1221         case R_OR1K_TLS_DTPMOD:
1222         case R_OR1K_TLS_DTPOFF:
1223         case R_OR1K_TLS_TPOFF:
1224           /* These are resolved dynamically on load and shouldn't
1225              be used as linker input.  */
1226           BFD_FAIL ();
1227           (*_bfd_error_handler)
1228             (_("%B: will not resolve runtime TLS relocation"),
1229              input_bfd);
1230           bfd_set_error (bfd_error_bad_value);
1231           return FALSE;
1232
1233         default:
1234           break;
1235         }
1236       r = _bfd_final_link_relocate (howto, input_bfd, input_section, contents,
1237                                     rel->r_offset, relocation, rel->r_addend);
1238
1239       if (r != bfd_reloc_ok)
1240         {
1241           const char *msg = NULL;
1242
1243           switch (r)
1244             {
1245             case bfd_reloc_overflow:
1246               r = info->callbacks->reloc_overflow
1247                 (info, (h ? &h->root : NULL), name, howto->name,
1248                  (bfd_vma) 0, input_bfd, input_section, rel->r_offset);
1249               break;
1250
1251             case bfd_reloc_undefined:
1252               r = info->callbacks->undefined_symbol
1253                 (info, name, input_bfd, input_section, rel->r_offset, TRUE);
1254               break;
1255
1256             case bfd_reloc_outofrange:
1257               msg = _("internal error: out of range error");
1258               break;
1259
1260             case bfd_reloc_notsupported:
1261               msg = _("internal error: unsupported relocation error");
1262               break;
1263
1264             case bfd_reloc_dangerous:
1265               msg = _("internal error: dangerous relocation");
1266               break;
1267
1268             default:
1269               msg = _("internal error: unknown error");
1270               break;
1271             }
1272
1273           if (msg)
1274             r = info->callbacks->warning
1275               (info, msg, name, input_bfd, input_section, rel->r_offset);
1276
1277           if (!r)
1278             return FALSE;
1279         }
1280     }
1281
1282   return TRUE;
1283 }
1284
1285 /* Return the section that should be marked against GC for a given
1286    relocation.  */
1287
1288 static asection *
1289 or1k_elf_gc_mark_hook (asection *sec,
1290                        struct bfd_link_info *info,
1291                        Elf_Internal_Rela *rel,
1292                        struct elf_link_hash_entry *h,
1293                        Elf_Internal_Sym *sym)
1294 {
1295   if (h != NULL)
1296     switch (ELF32_R_TYPE (rel->r_info))
1297       {
1298       case R_OR1K_GNU_VTINHERIT:
1299       case R_OR1K_GNU_VTENTRY:
1300         return NULL;
1301       }
1302
1303   return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
1304 }
1305
1306 static bfd_boolean
1307 or1k_elf_gc_sweep_hook (bfd *abfd,
1308                         struct bfd_link_info *info ATTRIBUTE_UNUSED,
1309                         asection *sec,
1310                         const Elf_Internal_Rela *relocs ATTRIBUTE_UNUSED)
1311 {
1312   /* Update the got entry reference counts for the section being removed.  */
1313   Elf_Internal_Shdr *symtab_hdr;
1314   struct elf_link_hash_entry **sym_hashes;
1315   bfd_signed_vma *local_got_refcounts;
1316   const Elf_Internal_Rela *rel, *relend;
1317
1318   elf_section_data (sec)->local_dynrel = NULL;
1319
1320   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1321   sym_hashes = elf_sym_hashes (abfd);
1322   local_got_refcounts = elf_local_got_refcounts (abfd);
1323
1324   relend = relocs + sec->reloc_count;
1325   for (rel = relocs; rel < relend; rel++)
1326     {
1327       unsigned long r_symndx;
1328       struct elf_link_hash_entry *h = NULL;
1329
1330       r_symndx = ELF32_R_SYM (rel->r_info);
1331       if (r_symndx >= symtab_hdr->sh_info)
1332         {
1333           h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1334           while (h->root.type == bfd_link_hash_indirect
1335                  || h->root.type == bfd_link_hash_warning)
1336             h = (struct elf_link_hash_entry *) h->root.u.i.link;
1337         }
1338
1339       switch (ELF32_R_TYPE (rel->r_info))
1340         {
1341         case R_OR1K_GOT16:
1342           if (h != NULL)
1343             {
1344               if (h->got.refcount > 0)
1345                 h->got.refcount--;
1346             }
1347           else
1348             {
1349               if (local_got_refcounts && local_got_refcounts[r_symndx] > 0)
1350                 local_got_refcounts[r_symndx]--;
1351             }
1352           break;
1353
1354         default:
1355           break;
1356         }
1357     }
1358   return TRUE;
1359 }
1360
1361 /* Create .got, .gotplt, and .rela.got sections in DYNOBJ, and set up
1362    shortcuts to them in our hash table.  */
1363
1364 static bfd_boolean
1365 create_got_section (bfd *dynobj, struct bfd_link_info *info)
1366 {
1367   struct elf_or1k_link_hash_table *htab;
1368   asection *s;
1369
1370   /* This function may be called more than once.  */
1371   s = bfd_get_section_by_name (dynobj, ".got");
1372   if (s != NULL && (s->flags & SEC_LINKER_CREATED) != 0)
1373     return TRUE;
1374
1375   htab = or1k_elf_hash_table (info);
1376   if (htab == NULL)
1377     return FALSE;
1378
1379   if (! _bfd_elf_create_got_section (dynobj, info))
1380     return FALSE;
1381
1382   htab->sgot = bfd_get_section_by_name (dynobj, ".got");
1383   htab->sgotplt = bfd_get_section_by_name (dynobj, ".got.plt");
1384   htab->srelgot = bfd_get_section_by_name (dynobj, ".rela.got");
1385
1386   if (! htab->sgot || ! htab->sgotplt || ! htab->srelgot)
1387     abort ();
1388
1389   if (! bfd_set_section_flags (dynobj, htab->srelgot, SEC_ALLOC
1390                                | SEC_LOAD
1391                                | SEC_HAS_CONTENTS
1392                                | SEC_IN_MEMORY
1393                                | SEC_LINKER_CREATED
1394                                | SEC_READONLY)
1395       || ! bfd_set_section_alignment (dynobj, htab->srelgot, 2))
1396     return FALSE;
1397
1398   return TRUE;
1399 }
1400
1401 /* Look through the relocs for a section during the first phase.  */
1402
1403 static bfd_boolean
1404 or1k_elf_check_relocs (bfd *abfd,
1405                        struct bfd_link_info *info,
1406                        asection *sec,
1407                        const Elf_Internal_Rela *relocs)
1408 {
1409   Elf_Internal_Shdr *symtab_hdr;
1410   struct elf_link_hash_entry **sym_hashes;
1411   const Elf_Internal_Rela *rel;
1412
1413   const Elf_Internal_Rela *rel_end;
1414   struct elf_or1k_link_hash_table *htab;
1415   bfd *dynobj;
1416   asection *sreloc = NULL;
1417
1418   if (info->relocatable)
1419     return TRUE;
1420
1421   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1422   sym_hashes = elf_sym_hashes (abfd);
1423
1424   htab = or1k_elf_hash_table (info);
1425   if (htab == NULL)
1426     return FALSE;
1427
1428   dynobj = htab->root.dynobj;
1429
1430   rel_end = relocs + sec->reloc_count;
1431   for (rel = relocs; rel < rel_end; rel++)
1432     {
1433       struct elf_link_hash_entry *h;
1434       unsigned long r_symndx;
1435       unsigned char tls_type;
1436
1437       r_symndx = ELF32_R_SYM (rel->r_info);
1438       if (r_symndx < symtab_hdr->sh_info)
1439         h = NULL;
1440       else
1441         {
1442           h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1443           while (h->root.type == bfd_link_hash_indirect
1444                  || h->root.type == bfd_link_hash_warning)
1445             h = (struct elf_link_hash_entry *) h->root.u.i.link;
1446
1447           /* PR15323, ref flags aren't set for references in the same
1448              object.  */
1449           h->root.non_ir_ref = 1;
1450         }
1451
1452       switch (ELF32_R_TYPE (rel->r_info))
1453         {
1454         case R_OR1K_TLS_GD_HI16:
1455         case R_OR1K_TLS_GD_LO16:
1456           tls_type = TLS_GD;
1457           break;
1458         case R_OR1K_TLS_LDM_HI16:
1459         case R_OR1K_TLS_LDM_LO16:
1460         case R_OR1K_TLS_LDO_HI16:
1461         case R_OR1K_TLS_LDO_LO16:
1462           tls_type = TLS_LD;
1463           break;
1464         case R_OR1K_TLS_IE_HI16:
1465         case R_OR1K_TLS_IE_LO16:
1466           tls_type = TLS_IE;
1467           break;
1468         case R_OR1K_TLS_LE_HI16:
1469         case R_OR1K_TLS_LE_LO16:
1470           tls_type = TLS_LE;
1471           break;
1472         default:
1473           tls_type = TLS_NONE;
1474         }
1475
1476       /* Record TLS type.  */
1477       if (h != NULL)
1478           ((struct elf_or1k_link_hash_entry *) h)->tls_type = tls_type;
1479       else
1480         {
1481           unsigned char *local_tls_type;
1482
1483           /* This is a TLS type record for a local symbol.  */
1484           local_tls_type = (unsigned char *) elf_or1k_local_tls_type (abfd);
1485           if (local_tls_type == NULL)
1486             {
1487               bfd_size_type size;
1488
1489               size = symtab_hdr->sh_info;
1490               local_tls_type = bfd_zalloc (abfd, size);
1491               if (local_tls_type == NULL)
1492                 return FALSE;
1493               elf_or1k_local_tls_type (abfd) = local_tls_type;
1494             }
1495           local_tls_type[r_symndx] = tls_type;
1496         }
1497
1498       switch (ELF32_R_TYPE (rel->r_info))
1499         {
1500           /* This relocation describes the C++ object vtable hierarchy.
1501              Reconstruct it for later use during GC.  */
1502         case R_OR1K_GNU_VTINHERIT:
1503           if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
1504             return FALSE;
1505           break;
1506
1507           /* This relocation describes which C++ vtable entries are actually
1508              used.  Record for later use during GC.  */
1509         case R_OR1K_GNU_VTENTRY:
1510           BFD_ASSERT (h != NULL);
1511           if (h != NULL
1512               && !bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
1513             return FALSE;
1514           break;
1515
1516           /* This relocation requires .plt entry.  */
1517         case R_OR1K_PLT26:
1518           if (h != NULL)
1519             {
1520               h->needs_plt = 1;
1521               h->plt.refcount += 1;
1522             }
1523           break;
1524
1525         case R_OR1K_GOT16:
1526         case R_OR1K_GOTOFF_HI16:
1527         case R_OR1K_GOTOFF_LO16:
1528         case R_OR1K_TLS_GD_HI16:
1529         case R_OR1K_TLS_GD_LO16:
1530         case R_OR1K_TLS_IE_HI16:
1531         case R_OR1K_TLS_IE_LO16:
1532           if (htab->sgot == NULL)
1533             {
1534               if (dynobj == NULL)
1535                 htab->root.dynobj = dynobj = abfd;
1536               if (! create_got_section (dynobj, info))
1537                 return FALSE;
1538             }
1539
1540           if (ELF32_R_TYPE (rel->r_info) != R_OR1K_GOTOFF_HI16 &&
1541               ELF32_R_TYPE (rel->r_info) != R_OR1K_GOTOFF_LO16)
1542             {
1543               if (h != NULL)
1544                 h->got.refcount += 1;
1545               else
1546                 {
1547                   bfd_signed_vma *local_got_refcounts;
1548
1549                   /* This is a global offset table entry for a local symbol.  */
1550                   local_got_refcounts = elf_local_got_refcounts (abfd);
1551                   if (local_got_refcounts == NULL)
1552                     {
1553                       bfd_size_type size;
1554
1555                       size = symtab_hdr->sh_info;
1556                       size *= sizeof (bfd_signed_vma);
1557                       local_got_refcounts = bfd_zalloc (abfd, size);
1558                       if (local_got_refcounts == NULL)
1559                         return FALSE;
1560                       elf_local_got_refcounts (abfd) = local_got_refcounts;
1561                     }
1562                   local_got_refcounts[r_symndx] += 1;
1563                 }
1564             }
1565           break;
1566
1567         case R_OR1K_INSN_REL_26:
1568         case R_OR1K_HI_16_IN_INSN:
1569         case R_OR1K_LO_16_IN_INSN:
1570         case R_OR1K_32:
1571           /* R_OR1K_16? */
1572           {
1573             if (h != NULL && !info->shared)
1574               {
1575                 /* We may need a copy reloc.  */
1576                 h->non_got_ref = 1;
1577
1578                 /* We may also need a .plt entry.  */
1579                 h->plt.refcount += 1;
1580                 if (ELF32_R_TYPE (rel->r_info) != R_OR1K_INSN_REL_26)
1581                   h->pointer_equality_needed = 1;
1582               }
1583
1584             /* If we are creating a shared library, and this is a reloc
1585                against a global symbol, or a non PC relative reloc
1586                against a local symbol, then we need to copy the reloc
1587                into the shared library.  However, if we are linking with
1588                -Bsymbolic, we do not need to copy a reloc against a
1589                global symbol which is defined in an object we are
1590                including in the link (i.e., DEF_REGULAR is set).  At
1591                this point we have not seen all the input files, so it is
1592                possible that DEF_REGULAR is not set now but will be set
1593                later (it is never cleared).  In case of a weak definition,
1594                DEF_REGULAR may be cleared later by a strong definition in
1595                a shared library.  We account for that possibility below by
1596                storing information in the relocs_copied field of the hash
1597                table entry.  A similar situation occurs when creating
1598                shared libraries and symbol visibility changes render the
1599                symbol local.
1600
1601                If on the other hand, we are creating an executable, we
1602                may need to keep relocations for symbols satisfied by a
1603                dynamic library if we manage to avoid copy relocs for the
1604                symbol.  */
1605
1606             if ((info->shared
1607                  && (sec->flags & SEC_ALLOC) != 0
1608                  && (ELF32_R_TYPE (rel->r_info) != R_OR1K_INSN_REL_26
1609                      || (h != NULL
1610                          && (!SYMBOLIC_BIND (info, h)
1611                              || h->root.type == bfd_link_hash_defweak
1612                              || !h->def_regular))))
1613                 || (!info->shared
1614                     && (sec->flags & SEC_ALLOC) != 0
1615                     && h != NULL
1616                     && (h->root.type == bfd_link_hash_defweak
1617                         || !h->def_regular)))
1618               {
1619                 struct elf_or1k_dyn_relocs *p;
1620                 struct elf_or1k_dyn_relocs **head;
1621
1622                 /* When creating a shared object, we must copy these
1623                    relocs into the output file.  We create a reloc
1624                    section in dynobj and make room for the reloc.  */
1625                 if (sreloc == NULL)
1626                   {
1627                     const char *name;
1628                     unsigned int strndx = elf_elfheader (abfd)->e_shstrndx;
1629                     unsigned int shnam = _bfd_elf_single_rel_hdr (sec)->sh_name;
1630
1631                     name = bfd_elf_string_from_elf_section (abfd, strndx, shnam);
1632                     if (name == NULL)
1633                       return FALSE;
1634
1635                     if (strncmp (name, ".rela", 5) != 0
1636                         || strcmp (bfd_get_section_name (abfd, sec),
1637                                    name + 5) != 0)
1638                       {
1639                         (*_bfd_error_handler)
1640                           (_("%B: bad relocation section name `%s\'"),
1641                            abfd, name);
1642                       }
1643
1644                     if (htab->root.dynobj == NULL)
1645                       htab->root.dynobj = abfd;
1646                     dynobj = htab->root.dynobj;
1647
1648                     sreloc = bfd_get_section_by_name (dynobj, name);
1649                     if (sreloc == NULL)
1650                       {
1651                         sreloc = _bfd_elf_make_dynamic_reloc_section
1652                           (sec, dynobj, 2, abfd, /*rela?*/ TRUE);
1653
1654                         if (sreloc == NULL)
1655                           return FALSE;
1656                       }
1657                     elf_section_data (sec)->sreloc = sreloc;
1658                   }
1659
1660                 /* If this is a global symbol, we count the number of
1661                    relocations we need for this symbol.  */
1662                 if (h != NULL)
1663                   head = &((struct elf_or1k_link_hash_entry *) h)->dyn_relocs;
1664                 else
1665                   {
1666                     /* Track dynamic relocs needed for local syms too.
1667                        We really need local syms available to do this
1668                        easily.  Oh well.  */
1669
1670                     asection *s;
1671                     Elf_Internal_Sym *isym;
1672                     void *vpp;
1673
1674                     isym = bfd_sym_from_r_symndx (&htab->sym_sec,
1675                                                   abfd, r_symndx);
1676                     if (isym == NULL)
1677                       return FALSE;
1678
1679                     s = bfd_section_from_elf_index (abfd, isym->st_shndx);
1680                     if (s == NULL)
1681                       return FALSE;
1682
1683                     vpp = &elf_section_data (s)->local_dynrel;
1684                     head = (struct elf_or1k_dyn_relocs **) vpp;
1685                   }
1686
1687                 p = *head;
1688                 if (p == NULL || p->sec != sec)
1689                   {
1690                     bfd_size_type amt = sizeof *p;
1691                     p = ((struct elf_or1k_dyn_relocs *)
1692                          bfd_alloc (htab->root.dynobj, amt));
1693                     if (p == NULL)
1694                       return FALSE;
1695                     p->next = *head;
1696                     *head = p;
1697                     p->sec = sec;
1698                     p->count = 0;
1699                     p->pc_count = 0;
1700                   }
1701
1702                 p->count += 1;
1703                 if (ELF32_R_TYPE (rel->r_info) == R_OR1K_INSN_REL_26)
1704                   p->pc_count += 1;
1705               }
1706           }
1707           break;
1708         }
1709     }
1710
1711   return TRUE;
1712 }
1713
1714 /* Finish up the dynamic sections.  */
1715
1716 static bfd_boolean
1717 or1k_elf_finish_dynamic_sections (bfd *output_bfd,
1718                                   struct bfd_link_info *info)
1719 {
1720   bfd *dynobj;
1721   asection *sdyn, *sgot;
1722   struct elf_or1k_link_hash_table *htab;
1723
1724   htab = or1k_elf_hash_table (info);
1725   if (htab == NULL)
1726     return FALSE;
1727
1728   dynobj = htab->root.dynobj;
1729
1730   sgot = htab->sgotplt;
1731   sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
1732
1733   if (htab->root.dynamic_sections_created)
1734     {
1735       asection *splt;
1736       Elf32_External_Dyn *dyncon, *dynconend;
1737
1738       BFD_ASSERT (sgot != NULL && sdyn != NULL);
1739
1740       dyncon = (Elf32_External_Dyn *) sdyn->contents;
1741       dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
1742
1743       for (; dyncon < dynconend; dyncon++)
1744         {
1745           Elf_Internal_Dyn dyn;
1746           asection *s;
1747
1748           bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
1749
1750           switch (dyn.d_tag)
1751             {
1752             default:
1753               continue;
1754
1755             case DT_PLTGOT:
1756               s = htab->sgot->output_section;
1757               BFD_ASSERT (s != NULL);
1758               dyn.d_un.d_ptr = s->vma;
1759               break;
1760
1761             case DT_JMPREL:
1762               s = htab->srelplt->output_section;
1763               BFD_ASSERT (s != NULL);
1764               dyn.d_un.d_ptr = s->vma;
1765               break;
1766
1767             case DT_PLTRELSZ:
1768               s = htab->srelplt->output_section;
1769               BFD_ASSERT (s != NULL);
1770               dyn.d_un.d_val = s->size;
1771               break;
1772
1773             case DT_RELASZ:
1774               /* My reading of the SVR4 ABI indicates that the
1775                  procedure linkage table relocs (DT_JMPREL) should be
1776                  included in the overall relocs (DT_RELA).  This is
1777                  what Solaris does.  However, UnixWare can not handle
1778                  that case.  Therefore, we override the DT_RELASZ entry
1779                  here to make it not include the JMPREL relocs.  Since
1780                  the linker script arranges for .rela.plt to follow all
1781                  other relocation sections, we don't have to worry
1782                  about changing the DT_RELA entry.  */
1783               if (htab->srelplt != NULL)
1784                 {
1785                   /* FIXME: this calculation sometimes produces
1786                      wrong result, the problem is that the dyn.d_un.d_val
1787                      is not always correct, needs investigation why
1788                      that happens. In the meantime, reading the
1789                      ".rela.dyn" section by name seems to yield
1790                      correct result.
1791
1792                   s = htab->srelplt->output_section;
1793                   dyn.d_un.d_val -= s->size;
1794                   */
1795
1796                   s = bfd_get_section_by_name (output_bfd, ".rela.dyn");
1797                   dyn.d_un.d_val = s ? s->size : 0;
1798                 }
1799               break;
1800             }
1801           bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
1802         }
1803
1804
1805       /* Fill in the first entry in the procedure linkage table.  */
1806       splt = htab->splt;
1807       if (splt && splt->size > 0)
1808         {
1809           if (info->shared)
1810             {
1811               bfd_put_32 (output_bfd, PLT0_PIC_ENTRY_WORD0,
1812                           splt->contents);
1813               bfd_put_32 (output_bfd, PLT0_PIC_ENTRY_WORD1,
1814                           splt->contents + 4);
1815               bfd_put_32 (output_bfd, PLT0_PIC_ENTRY_WORD2,
1816                           splt->contents + 8);
1817               bfd_put_32 (output_bfd, PLT0_PIC_ENTRY_WORD3,
1818                           splt->contents + 12);
1819               bfd_put_32 (output_bfd, PLT0_PIC_ENTRY_WORD4,
1820                           splt->contents + 16);
1821             }
1822           else
1823             {
1824               unsigned long addr;
1825               /* addr = .got + 4 */
1826               addr = sgot->output_section->vma + sgot->output_offset + 4;
1827               bfd_put_32 (output_bfd,
1828                           PLT0_ENTRY_WORD0 | ((addr >> 16) & 0xffff),
1829                           splt->contents);
1830               bfd_put_32 (output_bfd,
1831                           PLT0_ENTRY_WORD1 | (addr & 0xffff),
1832                           splt->contents + 4);
1833               bfd_put_32 (output_bfd, PLT0_ENTRY_WORD2, splt->contents + 8);
1834               bfd_put_32 (output_bfd, PLT0_ENTRY_WORD3, splt->contents + 12);
1835               bfd_put_32 (output_bfd, PLT0_ENTRY_WORD4, splt->contents + 16);
1836             }
1837
1838           elf_section_data (splt->output_section)->this_hdr.sh_entsize = 4;
1839         }
1840     }
1841
1842   /* Set the first entry in the global offset table to the address of
1843      the dynamic section.  */
1844   if (sgot && sgot->size > 0)
1845     {
1846       if (sdyn == NULL)
1847         bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents);
1848       else
1849         bfd_put_32 (output_bfd,
1850                     sdyn->output_section->vma + sdyn->output_offset,
1851                     sgot->contents);
1852       elf_section_data (sgot->output_section)->this_hdr.sh_entsize = 4;
1853     }
1854
1855   if (htab->sgot && htab->sgot->size > 0)
1856     elf_section_data (htab->sgot->output_section)->this_hdr.sh_entsize = 4;
1857
1858   return TRUE;
1859 }
1860
1861 /* Finish up dynamic symbol handling.  We set the contents of various
1862    dynamic sections here.  */
1863
1864 static bfd_boolean
1865 or1k_elf_finish_dynamic_symbol (bfd *output_bfd,
1866                                 struct bfd_link_info *info,
1867                                 struct elf_link_hash_entry *h,
1868                                 Elf_Internal_Sym *sym)
1869 {
1870   struct elf_or1k_link_hash_table *htab;
1871   bfd_byte *loc;
1872
1873   htab = or1k_elf_hash_table (info);
1874   if (htab == NULL)
1875     return FALSE;
1876
1877   if (h->plt.offset != (bfd_vma) -1)
1878     {
1879       asection *splt;
1880       asection *sgot;
1881       asection *srela;
1882
1883       bfd_vma plt_index;
1884       bfd_vma got_offset;
1885       bfd_vma got_addr;
1886       Elf_Internal_Rela rela;
1887
1888       /* This symbol has an entry in the procedure linkage table.  Set
1889          it up.  */
1890       BFD_ASSERT (h->dynindx != -1);
1891
1892       splt = htab->splt;
1893       sgot = htab->sgotplt;
1894       srela = htab->srelplt;
1895       BFD_ASSERT (splt != NULL && sgot != NULL && srela != NULL);
1896
1897       /* Get the index in the procedure linkage table which
1898          corresponds to this symbol.  This is the index of this symbol
1899          in all the symbols for which we are making plt entries.  The
1900          first entry in the procedure linkage table is reserved.  */
1901       plt_index = h->plt.offset / PLT_ENTRY_SIZE - 1;
1902
1903       /* Get the offset into the .got table of the entry that
1904         corresponds to this function.  Each .got entry is 4 bytes.
1905         The first three are reserved.  */
1906       got_offset = (plt_index + 3) * 4;
1907       got_addr = got_offset;
1908
1909       /* Fill in the entry in the procedure linkage table.  */
1910       if (! info->shared)
1911         {
1912           got_addr += htab->sgotplt->output_section->vma
1913             + htab->sgotplt->output_offset;
1914           bfd_put_32 (output_bfd, PLT_ENTRY_WORD0 | ((got_addr >> 16) & 0xffff),
1915                       splt->contents + h->plt.offset);
1916           bfd_put_32 (output_bfd, PLT_ENTRY_WORD1 | (got_addr & 0xffff),
1917                       splt->contents + h->plt.offset + 4);
1918           bfd_put_32 (output_bfd, (bfd_vma) PLT_ENTRY_WORD2,
1919                       splt->contents + h->plt.offset + 8);
1920           bfd_put_32 (output_bfd, (bfd_vma) PLT_ENTRY_WORD3,
1921                       splt->contents + h->plt.offset + 12);
1922           bfd_put_32 (output_bfd, PLT_ENTRY_WORD4
1923                       | plt_index * sizeof (Elf32_External_Rela),
1924                       splt->contents + h->plt.offset + 16);
1925         }
1926       else
1927         {
1928           bfd_put_32 (output_bfd, PLT_PIC_ENTRY_WORD0 | (got_addr & 0xffff),
1929                       splt->contents + h->plt.offset);
1930           bfd_put_32 (output_bfd, PLT_PIC_ENTRY_WORD1
1931                       | plt_index * sizeof (Elf32_External_Rela),
1932                       splt->contents + h->plt.offset + 4);
1933           bfd_put_32 (output_bfd, (bfd_vma) PLT_PIC_ENTRY_WORD2,
1934                       splt->contents + h->plt.offset + 8);
1935           bfd_put_32 (output_bfd, (bfd_vma) PLT_PIC_ENTRY_WORD3,
1936                       splt->contents + h->plt.offset + 12);
1937           bfd_put_32 (output_bfd, (bfd_vma) PLT_PIC_ENTRY_WORD4,
1938                       splt->contents + h->plt.offset + 16);
1939         }
1940
1941       /* Fill in the entry in the global offset table.  */
1942       bfd_put_32 (output_bfd,
1943                   (splt->output_section->vma
1944                    + splt->output_offset), /* Same offset.  */
1945                   sgot->contents + got_offset);
1946
1947       /* Fill in the entry in the .rela.plt section.  */
1948       rela.r_offset = (sgot->output_section->vma
1949                        + sgot->output_offset
1950                        + got_offset);
1951       rela.r_info = ELF32_R_INFO (h->dynindx, R_OR1K_JMP_SLOT);
1952       rela.r_addend = 0;
1953       loc = srela->contents;
1954       loc += plt_index * sizeof (Elf32_External_Rela);
1955       bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
1956
1957       if (!h->def_regular)
1958         {
1959           /* Mark the symbol as undefined, rather than as defined in
1960              the .plt section.  Leave the value alone.  */
1961           sym->st_shndx = SHN_UNDEF;
1962         }
1963
1964     }
1965
1966   if (h->got.offset != (bfd_vma) -1
1967       && (h->got.offset & 2) == 0) /* Homemade TLS check.  */
1968     {
1969       asection *sgot;
1970       asection *srela;
1971       Elf_Internal_Rela rela;
1972
1973       /* This symbol has an entry in the global offset table.  Set it
1974          up.  */
1975       sgot = htab->sgot;
1976       srela = htab->srelgot;
1977       BFD_ASSERT (sgot != NULL && srela != NULL);
1978
1979       rela.r_offset = (sgot->output_section->vma
1980                        + sgot->output_offset
1981                        + (h->got.offset &~ 1));
1982
1983       /* If this is a -Bsymbolic link, and the symbol is defined
1984          locally, we just want to emit a RELATIVE reloc.  Likewise if
1985          the symbol was forced to be local because of a version file.
1986          The entry in the global offset table will already have been
1987          initialized in the relocate_section function.  */
1988       if (info->shared && SYMBOL_REFERENCES_LOCAL (info, h))
1989         {
1990           rela.r_info = ELF32_R_INFO (0, R_OR1K_RELATIVE);
1991           rela.r_addend = (h->root.u.def.value
1992                            + h->root.u.def.section->output_section->vma
1993                            + h->root.u.def.section->output_offset);
1994         }
1995       else
1996         {
1997           BFD_ASSERT ((h->got.offset & 1) == 0);
1998           bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + h->got.offset);
1999           rela.r_info = ELF32_R_INFO (h->dynindx, R_OR1K_GLOB_DAT);
2000           rela.r_addend = 0;
2001         }
2002
2003       loc = srela->contents;
2004       loc += srela->reloc_count * sizeof (Elf32_External_Rela);
2005       bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
2006       ++srela->reloc_count;
2007     }
2008
2009   if (h->needs_copy)
2010     {
2011       asection *s;
2012       Elf_Internal_Rela rela;
2013
2014       /* This symbols needs a copy reloc.  Set it up.  */
2015       BFD_ASSERT (h->dynindx != -1
2016                   && (h->root.type == bfd_link_hash_defined
2017                       || h->root.type == bfd_link_hash_defweak));
2018
2019       s = bfd_get_section_by_name (h->root.u.def.section->owner,
2020                                    ".rela.bss");
2021       BFD_ASSERT (s != NULL);
2022
2023       rela.r_offset = (h->root.u.def.value
2024                        + h->root.u.def.section->output_section->vma
2025                        + h->root.u.def.section->output_offset);
2026       rela.r_info = ELF32_R_INFO (h->dynindx, R_OR1K_COPY);
2027       rela.r_addend = 0;
2028       loc = s->contents;
2029       loc += s->reloc_count * sizeof (Elf32_External_Rela);
2030       bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
2031       ++s->reloc_count;
2032     }
2033
2034   /* Mark some specially defined symbols as absolute.  */
2035   if (strcmp (h->root.root.string, "_DYNAMIC") == 0
2036       || h == htab->root.hgot)
2037     sym->st_shndx = SHN_ABS;
2038
2039   return TRUE;
2040 }
2041
2042 static enum elf_reloc_type_class
2043 or1k_elf_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED,
2044                            const asection *rel_sec ATTRIBUTE_UNUSED,
2045                            const Elf_Internal_Rela *rela)
2046 {
2047   switch ((int) ELF32_R_TYPE (rela->r_info))
2048     {
2049     case R_OR1K_RELATIVE:  return reloc_class_relative;
2050     case R_OR1K_JMP_SLOT:  return reloc_class_plt;
2051     case R_OR1K_COPY:      return reloc_class_copy;
2052     default:               return reloc_class_normal;
2053     }
2054 }
2055
2056 /* Adjust a symbol defined by a dynamic object and referenced by a
2057    regular object.  The current definition is in some section of the
2058    dynamic object, but we're not including those sections.  We have to
2059    change the definition to something the rest of the link can
2060    understand.  */
2061
2062 static bfd_boolean
2063 or1k_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
2064                                 struct elf_link_hash_entry *h)
2065 {
2066   struct elf_or1k_link_hash_table *htab;
2067   struct elf_or1k_link_hash_entry *eh;
2068   struct elf_or1k_dyn_relocs *p;
2069   bfd *dynobj;
2070   asection *s;
2071
2072   dynobj = elf_hash_table (info)->dynobj;
2073
2074   /* Make sure we know what is going on here.  */
2075   BFD_ASSERT (dynobj != NULL
2076               && (h->needs_plt
2077                   || h->u.weakdef != NULL
2078                   || (h->def_dynamic
2079                       && h->ref_regular
2080                       && !h->def_regular)));
2081
2082   /* If this is a function, put it in the procedure linkage table.  We
2083      will fill in the contents of the procedure linkage table later,
2084      when we know the address of the .got section.  */
2085   if (h->type == STT_FUNC
2086       || h->needs_plt)
2087     {
2088       if (! info->shared
2089           && !h->def_dynamic
2090           && !h->ref_dynamic
2091           && h->root.type != bfd_link_hash_undefweak
2092           && h->root.type != bfd_link_hash_undefined)
2093         {
2094           /* This case can occur if we saw a PLT reloc in an input
2095              file, but the symbol was never referred to by a dynamic
2096              object.  In such a case, we don't actually need to build
2097              a procedure linkage table, and we can just do a PCREL
2098              reloc instead.  */
2099           h->plt.offset = (bfd_vma) -1;
2100           h->needs_plt = 0;
2101         }
2102
2103       return TRUE;
2104     }
2105   else
2106     h->plt.offset = (bfd_vma) -1;
2107
2108   /* If this is a weak symbol, and there is a real definition, the
2109      processor independent code will have arranged for us to see the
2110      real definition first, and we can just use the same value.  */
2111   if (h->u.weakdef != NULL)
2112     {
2113       BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
2114                   || h->u.weakdef->root.type == bfd_link_hash_defweak);
2115       h->root.u.def.section = h->u.weakdef->root.u.def.section;
2116       h->root.u.def.value = h->u.weakdef->root.u.def.value;
2117       return TRUE;
2118     }
2119
2120   /* This is a reference to a symbol defined by a dynamic object which
2121      is not a function.  */
2122
2123   /* If we are creating a shared library, we must presume that the
2124      only references to the symbol are via the global offset table.
2125      For such cases we need not do anything here; the relocations will
2126      be handled correctly by relocate_section.  */
2127   if (info->shared)
2128     return TRUE;
2129
2130   /* If there are no references to this symbol that do not use the
2131      GOT, we don't need to generate a copy reloc.  */
2132   if (!h->non_got_ref)
2133     return TRUE;
2134
2135   /* If -z nocopyreloc was given, we won't generate them either.  */
2136   if (info->nocopyreloc)
2137     {
2138       h->non_got_ref = 0;
2139       return TRUE;
2140     }
2141
2142   eh = (struct elf_or1k_link_hash_entry *) h;
2143   for (p = eh->dyn_relocs; p != NULL; p = p->next)
2144     {
2145       s = p->sec->output_section;
2146       if (s != NULL && (s->flags & (SEC_READONLY | SEC_HAS_CONTENTS)) != 0)
2147         break;
2148     }
2149
2150   /* If we didn't find any dynamic relocs in sections which needs the
2151      copy reloc, then we'll be keeping the dynamic relocs and avoiding
2152      the copy reloc.  */
2153   if (p == NULL)
2154     {
2155       h->non_got_ref = 0;
2156       return TRUE;
2157     }
2158
2159   /* We must allocate the symbol in our .dynbss section, which will
2160      become part of the .bss section of the executable.  There will be
2161      an entry for this symbol in the .dynsym section.  The dynamic
2162      object will contain position independent code, so all references
2163      from the dynamic object to this symbol will go through the global
2164      offset table.  The dynamic linker will use the .dynsym entry to
2165      determine the address it must put in the global offset table, so
2166      both the dynamic object and the regular object will refer to the
2167      same memory location for the variable.  */
2168
2169   htab = or1k_elf_hash_table (info);
2170   if (htab == NULL)
2171     return FALSE;
2172
2173   s = htab->sdynbss;
2174   BFD_ASSERT (s != NULL);
2175
2176   /* We must generate a R_OR1K_COPY reloc to tell the dynamic linker
2177      to copy the initial value out of the dynamic object and into the
2178      runtime process image.  We need to remember the offset into the
2179      .rela.bss section we are going to use.  */
2180   if ((h->root.u.def.section->flags & SEC_ALLOC) != 0 && h->size != 0)
2181     {
2182       asection *srel;
2183
2184       srel = htab->srelbss;
2185       BFD_ASSERT (srel != NULL);
2186       srel->size += sizeof (Elf32_External_Rela);
2187       h->needs_copy = 1;
2188     }
2189
2190   return _bfd_elf_adjust_dynamic_copy (h, s);
2191 }
2192
2193 /* Allocate space in .plt, .got and associated reloc sections for
2194    dynamic relocs.  */
2195
2196 static bfd_boolean
2197 allocate_dynrelocs (struct elf_link_hash_entry *h, void * inf)
2198 {
2199   struct bfd_link_info *info;
2200   struct elf_or1k_link_hash_table *htab;
2201   struct elf_or1k_link_hash_entry *eh;
2202   struct elf_or1k_dyn_relocs *p;
2203
2204   if (h->root.type == bfd_link_hash_indirect)
2205     return TRUE;
2206
2207   info = (struct bfd_link_info *) inf;
2208   htab = or1k_elf_hash_table (info);
2209   if (htab == NULL)
2210     return FALSE;
2211
2212   eh = (struct elf_or1k_link_hash_entry *) h;
2213
2214   if (htab->root.dynamic_sections_created
2215       && h->plt.refcount > 0)
2216     {
2217       /* Make sure this symbol is output as a dynamic symbol.
2218          Undefined weak syms won't yet be marked as dynamic.  */
2219       if (h->dynindx == -1
2220           && !h->forced_local)
2221         {
2222           if (! bfd_elf_link_record_dynamic_symbol (info, h))
2223             return FALSE;
2224         }
2225
2226       if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, info->shared, h))
2227         {
2228           asection *s = htab->splt;
2229
2230           /* If this is the first .plt entry, make room for the special
2231              first entry.  */
2232           if (s->size == 0)
2233             s->size = PLT_ENTRY_SIZE;
2234
2235           h->plt.offset = s->size;
2236
2237           /* If this symbol is not defined in a regular file, and we are
2238              not generating a shared library, then set the symbol to this
2239              location in the .plt.  This is required to make function
2240              pointers compare as equal between the normal executable and
2241              the shared library.  */
2242           if (! info->shared
2243               && !h->def_regular)
2244             {
2245               h->root.u.def.section = s;
2246               h->root.u.def.value = h->plt.offset;
2247             }
2248
2249           /* Make room for this entry.  */
2250           s->size += PLT_ENTRY_SIZE;
2251
2252           /* We also need to make an entry in the .got.plt section, which
2253              will be placed in the .got section by the linker script.  */
2254           htab->sgotplt->size += 4;
2255
2256           /* We also need to make an entry in the .rel.plt section.  */
2257           htab->srelplt->size += sizeof (Elf32_External_Rela);
2258         }
2259       else
2260         {
2261           h->plt.offset = (bfd_vma) -1;
2262           h->needs_plt = 0;
2263         }
2264     }
2265   else
2266     {
2267       h->plt.offset = (bfd_vma) -1;
2268       h->needs_plt = 0;
2269     }
2270
2271   if (h->got.refcount > 0)
2272     {
2273       asection *s;
2274       bfd_boolean dyn;
2275       unsigned char tls_type;
2276
2277       /* Make sure this symbol is output as a dynamic symbol.
2278          Undefined weak syms won't yet be marked as dynamic.  */
2279       if (h->dynindx == -1
2280           && !h->forced_local)
2281         {
2282           if (! bfd_elf_link_record_dynamic_symbol (info, h))
2283             return FALSE;
2284         }
2285
2286       s = htab->sgot;
2287
2288       h->got.offset = s->size;
2289
2290       tls_type = ((struct elf_or1k_link_hash_entry *) h)->tls_type;
2291
2292       /* TLS GD requires two GOT and two relocs.  */
2293       if (tls_type == TLS_GD)
2294         s->size += 8;
2295       else
2296         s->size += 4;
2297       dyn = htab->root.dynamic_sections_created;
2298       if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h))
2299         {
2300           if (tls_type == TLS_GD)
2301             htab->srelgot->size += 2 * sizeof (Elf32_External_Rela);
2302           else
2303             htab->srelgot->size += sizeof (Elf32_External_Rela);
2304         }
2305     }
2306   else
2307     h->got.offset = (bfd_vma) -1;
2308
2309   if (eh->dyn_relocs == NULL)
2310     return TRUE;
2311
2312   /* In the shared -Bsymbolic case, discard space allocated for
2313      dynamic pc-relative relocs against symbols which turn out to be
2314      defined in regular objects.  For the normal shared case, discard
2315      space for pc-relative relocs that have become local due to symbol
2316      visibility changes.  */
2317
2318   if (info->shared)
2319     {
2320       if (SYMBOL_CALLS_LOCAL (info, h))
2321         {
2322           struct elf_or1k_dyn_relocs **pp;
2323
2324           for (pp = &eh->dyn_relocs; (p = *pp) != NULL;)
2325             {
2326               p->count -= p->pc_count;
2327               p->pc_count = 0;
2328               if (p->count == 0)
2329                 *pp = p->next;
2330               else
2331                 pp = &p->next;
2332             }
2333         }
2334
2335       /* Also discard relocs on undefined weak syms with non-default
2336          visibility.  */
2337       if (eh->dyn_relocs != NULL
2338           && h->root.type == bfd_link_hash_undefweak)
2339         {
2340           if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
2341             eh->dyn_relocs = NULL;
2342
2343           /* Make sure undefined weak symbols are output as a dynamic
2344              symbol in PIEs.  */
2345           else if (h->dynindx == -1
2346                    && !h->forced_local)
2347             {
2348               if (! bfd_elf_link_record_dynamic_symbol (info, h))
2349                 return FALSE;
2350             }
2351         }
2352     }
2353   else
2354     {
2355       /* For the non-shared case, discard space for relocs against
2356          symbols which turn out to need copy relocs or are not
2357          dynamic.  */
2358
2359       if (!h->non_got_ref
2360           && ((h->def_dynamic
2361                && !h->def_regular)
2362               || (htab->root.dynamic_sections_created
2363                   && (h->root.type == bfd_link_hash_undefweak
2364                       || h->root.type == bfd_link_hash_undefined))))
2365         {
2366           /* Make sure this symbol is output as a dynamic symbol.
2367              Undefined weak syms won't yet be marked as dynamic.  */
2368           if (h->dynindx == -1
2369               && !h->forced_local)
2370             {
2371               if (! bfd_elf_link_record_dynamic_symbol (info, h))
2372                 return FALSE;
2373             }
2374
2375           /* If that succeeded, we know we'll be keeping all the
2376              relocs.  */
2377           if (h->dynindx != -1)
2378             goto keep;
2379         }
2380
2381       eh->dyn_relocs = NULL;
2382
2383     keep: ;
2384     }
2385
2386   /* Finally, allocate space.  */
2387   for (p = eh->dyn_relocs; p != NULL; p = p->next)
2388     {
2389       asection *sreloc = elf_section_data (p->sec)->sreloc;
2390       sreloc->size += p->count * sizeof (Elf32_External_Rela);
2391     }
2392
2393   return TRUE;
2394 }
2395
2396 /* Find any dynamic relocs that apply to read-only sections.  */
2397
2398 static bfd_boolean
2399 readonly_dynrelocs (struct elf_link_hash_entry *h, void * inf)
2400 {
2401   struct elf_or1k_link_hash_entry *eh;
2402   struct elf_or1k_dyn_relocs *p;
2403
2404   eh = (struct elf_or1k_link_hash_entry *) h;
2405   for (p = eh->dyn_relocs; p != NULL; p = p->next)
2406     {
2407       asection *s = p->sec->output_section;
2408
2409       if (s != NULL && (s->flags & SEC_READONLY) != 0)
2410         {
2411           struct bfd_link_info *info = (struct bfd_link_info *) inf;
2412
2413           info->flags |= DF_TEXTREL;
2414
2415           /* Not an error, just cut short the traversal.  */
2416           return FALSE;
2417         }
2418     }
2419   return TRUE;
2420 }
2421
2422 /* Set the sizes of the dynamic sections.  */
2423
2424 static bfd_boolean
2425 or1k_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
2426                                 struct bfd_link_info *info)
2427 {
2428   struct elf_or1k_link_hash_table *htab;
2429   bfd *dynobj;
2430   asection *s;
2431   bfd_boolean relocs;
2432   bfd *ibfd;
2433
2434   htab = or1k_elf_hash_table (info);
2435   if (htab == NULL)
2436     return FALSE;
2437
2438   dynobj = htab->root.dynobj;
2439   BFD_ASSERT (dynobj != NULL);
2440
2441   if (htab->root.dynamic_sections_created)
2442     {
2443       /* Set the contents of the .interp section to the interpreter.  */
2444       if (info->executable)
2445         {
2446           s = bfd_get_section_by_name (dynobj, ".interp");
2447           BFD_ASSERT (s != NULL);
2448           s->size = sizeof ELF_DYNAMIC_INTERPRETER;
2449           s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
2450         }
2451     }
2452
2453   /* Set up .got offsets for local syms, and space for local dynamic
2454      relocs.  */
2455   for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
2456     {
2457       bfd_signed_vma *local_got;
2458       bfd_signed_vma *end_local_got;
2459       bfd_size_type locsymcount;
2460       Elf_Internal_Shdr *symtab_hdr;
2461       unsigned char *local_tls_type;
2462       asection *srel;
2463
2464       if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour)
2465         continue;
2466
2467       for (s = ibfd->sections; s != NULL; s = s->next)
2468         {
2469           struct elf_or1k_dyn_relocs *p;
2470
2471           for (p = ((struct elf_or1k_dyn_relocs *)
2472                     elf_section_data (s)->local_dynrel);
2473                p != NULL;
2474                p = p->next)
2475             {
2476               if (! bfd_is_abs_section (p->sec)
2477                   && bfd_is_abs_section (p->sec->output_section))
2478                 {
2479                   /* Input section has been discarded, either because
2480                      it is a copy of a linkonce section or due to
2481                      linker script /DISCARD/, so we'll be discarding
2482                      the relocs too.  */
2483                 }
2484               else if (p->count != 0)
2485                 {
2486                   srel = elf_section_data (p->sec)->sreloc;
2487                   srel->size += p->count * sizeof (Elf32_External_Rela);
2488                   if ((p->sec->output_section->flags & SEC_READONLY) != 0)
2489                     info->flags |= DF_TEXTREL;
2490                 }
2491             }
2492         }
2493
2494       local_got = elf_local_got_refcounts (ibfd);
2495       if (!local_got)
2496         continue;
2497
2498       symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
2499       locsymcount = symtab_hdr->sh_info;
2500       end_local_got = local_got + locsymcount;
2501       s = htab->sgot;
2502       srel = htab->srelgot;
2503       local_tls_type = (unsigned char *) elf_or1k_local_tls_type (ibfd);
2504       for (; local_got < end_local_got; ++local_got)
2505         {
2506           if (*local_got > 0)
2507             {
2508               *local_got = s->size;
2509
2510               /* TLS GD requires two GOT and two relocs.  */
2511               if (local_tls_type != NULL && *local_tls_type == TLS_GD)
2512                 s->size += 8;
2513               else
2514                 s->size += 4;
2515               if (info->shared)
2516                 {
2517                   if (local_tls_type != NULL && *local_tls_type == TLS_GD)
2518                     srel->size += 2 * sizeof (Elf32_External_Rela);
2519                   else
2520                     srel->size += sizeof (Elf32_External_Rela);
2521                 }
2522             }
2523           else
2524
2525             *local_got = (bfd_vma) -1;
2526
2527           if (local_tls_type)
2528             ++local_tls_type;
2529         }
2530     }
2531
2532   /* Allocate global sym .plt and .got entries, and space for global
2533      sym dynamic relocs.  */
2534   elf_link_hash_traverse (&htab->root, allocate_dynrelocs, info);
2535
2536   /* We now have determined the sizes of the various dynamic sections.
2537      Allocate memory for them.  */
2538   relocs = FALSE;
2539   for (s = dynobj->sections; s != NULL; s = s->next)
2540     {
2541       if ((s->flags & SEC_LINKER_CREATED) == 0)
2542         continue;
2543
2544       if (s == htab->splt
2545           || s == htab->sgot
2546           || s == htab->sgotplt
2547           || s == htab->sdynbss)
2548         {
2549           /* Strip this section if we don't need it; see the
2550              comment below.  */
2551         }
2552       else if (CONST_STRNEQ (bfd_get_section_name (dynobj, s), ".rela"))
2553         {
2554           if (s->size != 0 && s != htab->srelplt)
2555             relocs = TRUE;
2556
2557           /* We use the reloc_count field as a counter if we need
2558              to copy relocs into the output file.  */
2559           s->reloc_count = 0;
2560         }
2561       else
2562         /* It's not one of our sections, so don't allocate space.  */
2563         continue;
2564
2565       if (s->size == 0)
2566         {
2567           /* If we don't need this section, strip it from the
2568              output file.  This is mostly to handle .rela.bss and
2569              .rela.plt.  We must create both sections in
2570              create_dynamic_sections, because they must be created
2571              before the linker maps input sections to output
2572              sections.  The linker does that before
2573              adjust_dynamic_symbol is called, and it is that
2574              function which decides whether anything needs to go
2575              into these sections.  */
2576           s->flags |= SEC_EXCLUDE;
2577           continue;
2578         }
2579
2580       if ((s->flags & SEC_HAS_CONTENTS) == 0)
2581         continue;
2582
2583       /* Allocate memory for the section contents.  We use bfd_zalloc
2584          here in case unused entries are not reclaimed before the
2585          section's contents are written out.  This should not happen,
2586          but this way if it does, we get a R_OR1K_NONE reloc instead
2587          of garbage.  */
2588       s->contents = bfd_zalloc (dynobj, s->size);
2589
2590       if (s->contents == NULL)
2591         return FALSE;
2592     }
2593
2594   if (htab->root.dynamic_sections_created)
2595     {
2596       /* Add some entries to the .dynamic section.  We fill in the
2597          values later, in or1k_elf_finish_dynamic_sections, but we
2598          must add the entries now so that we get the correct size for
2599          the .dynamic section.  The DT_DEBUG entry is filled in by the
2600          dynamic linker and used by the debugger.  */
2601 #define add_dynamic_entry(TAG, VAL) \
2602   _bfd_elf_add_dynamic_entry (info, TAG, VAL)
2603
2604      if (info->executable)
2605        {
2606          if (! add_dynamic_entry (DT_DEBUG, 0))
2607            return FALSE;
2608        }
2609
2610      if (htab->splt->size != 0)
2611        {
2612          if (! add_dynamic_entry (DT_PLTGOT, 0)
2613              || ! add_dynamic_entry (DT_PLTRELSZ, 0)
2614              || ! add_dynamic_entry (DT_PLTREL, DT_RELA)
2615              || ! add_dynamic_entry (DT_JMPREL, 0))
2616            return FALSE;
2617         }
2618
2619      if (relocs)
2620        {
2621          if (! add_dynamic_entry (DT_RELA, 0)
2622              || ! add_dynamic_entry (DT_RELASZ, 0)
2623              || ! add_dynamic_entry (DT_RELAENT,
2624                                      sizeof (Elf32_External_Rela)))
2625            return FALSE;
2626
2627          /* If any dynamic relocs apply to a read-only section,
2628             then we need a DT_TEXTREL entry.  */
2629          if ((info->flags & DF_TEXTREL) == 0)
2630            elf_link_hash_traverse (&htab->root, readonly_dynrelocs,
2631                                    info);
2632
2633          if ((info->flags & DF_TEXTREL) != 0)
2634            {
2635              if (! add_dynamic_entry (DT_TEXTREL, 0))
2636                return FALSE;
2637            }
2638        }
2639     }
2640
2641 #undef add_dynamic_entry
2642   return TRUE;
2643 }
2644
2645 /* Create dynamic sections when linking against a dynamic object.  */
2646
2647 static bfd_boolean
2648 or1k_elf_create_dynamic_sections (bfd *dynobj, struct bfd_link_info *info)
2649 {
2650   struct elf_or1k_link_hash_table *htab;
2651
2652   htab = or1k_elf_hash_table (info);
2653   if (htab == NULL)
2654     return FALSE;
2655
2656   if (!htab->sgot && !create_got_section (dynobj, info))
2657     return FALSE;
2658
2659   if (!_bfd_elf_create_dynamic_sections (dynobj, info))
2660     return FALSE;
2661
2662   htab->splt = bfd_get_section_by_name (dynobj, ".plt");
2663   htab->srelplt = bfd_get_section_by_name (dynobj, ".rela.plt");
2664   htab->sdynbss = bfd_get_section_by_name (dynobj, ".dynbss");
2665   if (!info->shared)
2666     htab->srelbss = bfd_get_section_by_name (dynobj, ".rela.bss");
2667
2668   if (!htab->splt || !htab->srelplt || !htab->sdynbss
2669       || (!info->shared && !htab->srelbss))
2670     abort ();
2671
2672   return TRUE;
2673 }
2674
2675 /* Copy the extra info we tack onto an elf_link_hash_entry.  */
2676
2677 static void
2678 or1k_elf_copy_indirect_symbol (struct bfd_link_info *info,
2679                                struct elf_link_hash_entry *dir,
2680                                struct elf_link_hash_entry *ind)
2681 {
2682   struct elf_or1k_link_hash_entry * edir;
2683   struct elf_or1k_link_hash_entry * eind;
2684
2685   edir = (struct elf_or1k_link_hash_entry *) dir;
2686   eind = (struct elf_or1k_link_hash_entry *) ind;
2687
2688   if (eind->dyn_relocs != NULL)
2689     {
2690       if (edir->dyn_relocs != NULL)
2691         {
2692           struct elf_or1k_dyn_relocs **pp;
2693           struct elf_or1k_dyn_relocs *p;
2694
2695           /* Add reloc counts against the indirect sym to the direct sym
2696              list.  Merge any entries against the same section.  */
2697           for (pp = &eind->dyn_relocs; (p = *pp) != NULL;)
2698             {
2699               struct elf_or1k_dyn_relocs *q;
2700
2701               for (q = edir->dyn_relocs; q != NULL; q = q->next)
2702                 if (q->sec == p->sec)
2703                   {
2704                     q->pc_count += p->pc_count;
2705                     q->count += p->count;
2706                     *pp = p->next;
2707                     break;
2708                   }
2709               if (q == NULL)
2710                 pp = &p->next;
2711             }
2712           *pp = edir->dyn_relocs;
2713         }
2714
2715       edir->dyn_relocs = eind->dyn_relocs;
2716       eind->dyn_relocs = NULL;
2717     }
2718
2719   if (ind->root.type == bfd_link_hash_indirect)
2720     {
2721       if (dir->got.refcount <= 0)
2722         {
2723           edir->tls_type = eind->tls_type;
2724           eind->tls_type = TLS_UNKNOWN;
2725         }
2726     }
2727
2728   _bfd_elf_link_hash_copy_indirect (info, dir, ind);
2729 }
2730
2731 /* Set the right machine number.  */
2732
2733 static bfd_boolean
2734 or1k_elf_object_p (bfd *abfd)
2735 {
2736   unsigned long mach = bfd_mach_or1k;
2737
2738   if (elf_elfheader (abfd)->e_flags & EF_OR1K_NODELAY)
2739     mach = bfd_mach_or1knd;
2740
2741   return bfd_default_set_arch_mach (abfd, bfd_arch_or1k, mach);
2742 }
2743
2744 /* Store the machine number in the flags field.  */
2745
2746 static void
2747 or1k_elf_final_write_processing (bfd *abfd,
2748                                  bfd_boolean linker ATTRIBUTE_UNUSED)
2749 {
2750   switch (bfd_get_mach (abfd))
2751     {
2752     default:
2753     case bfd_mach_or1k:
2754       break;
2755     case bfd_mach_or1knd:
2756       elf_elfheader (abfd)->e_flags |= EF_OR1K_NODELAY;
2757       break;
2758     }
2759 }
2760
2761 static bfd_boolean
2762 or1k_elf_set_private_flags (bfd *abfd, flagword flags)
2763 {
2764   BFD_ASSERT (!elf_flags_init (abfd)
2765               || elf_elfheader (abfd)->e_flags == flags);
2766
2767   elf_elfheader (abfd)->e_flags = flags;
2768   elf_flags_init (abfd) = TRUE;
2769   return TRUE;
2770 }
2771
2772 /* Make sure all input files are consistent with respect to
2773    EF_OR1K_NODELAY flag setting.  */
2774
2775 static bfd_boolean
2776 elf32_or1k_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
2777 {
2778   flagword out_flags;
2779   flagword in_flags;
2780
2781   in_flags  = elf_elfheader (ibfd)->e_flags;
2782   out_flags = elf_elfheader (obfd)->e_flags;
2783
2784   if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
2785       || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
2786     return TRUE;
2787
2788   if (!elf_flags_init (obfd))
2789     {
2790       elf_flags_init (obfd) = TRUE;
2791       elf_elfheader (obfd)->e_flags = in_flags;
2792
2793       return TRUE;
2794     }
2795
2796   if (in_flags == out_flags)
2797     return TRUE;
2798
2799   if ((in_flags & EF_OR1K_NODELAY) != (out_flags & EF_OR1K_NODELAY))
2800     {
2801       (*_bfd_error_handler)
2802         (_("%B: EF_OR1K_NODELAY flag mismatch with previous modules"), ibfd);
2803
2804       bfd_set_error (bfd_error_bad_value);
2805       return FALSE;
2806     }
2807
2808   return TRUE;
2809
2810 }
2811
2812 #define ELF_ARCH                        bfd_arch_or1k
2813 #define ELF_MACHINE_CODE                EM_OR1K
2814 #define ELF_TARGET_ID                   OR1K_ELF_DATA
2815 #define ELF_MAXPAGESIZE                 0x2000
2816
2817 #define TARGET_BIG_SYM                  or1k_elf32_vec
2818 #define TARGET_BIG_NAME                 "elf32-or1k"
2819
2820 #define elf_info_to_howto_rel           NULL
2821 #define elf_info_to_howto               or1k_info_to_howto_rela
2822 #define elf_backend_relocate_section    or1k_elf_relocate_section
2823 #define elf_backend_gc_mark_hook        or1k_elf_gc_mark_hook
2824 #define elf_backend_gc_sweep_hook       or1k_elf_gc_sweep_hook
2825 #define elf_backend_check_relocs        or1k_elf_check_relocs
2826 #define elf_backend_reloc_type_class    or1k_elf_reloc_type_class
2827 #define elf_backend_can_gc_sections     1
2828 #define elf_backend_rela_normal         1
2829
2830 #define bfd_elf32_mkobject                   elf_or1k_mkobject
2831
2832 #define bfd_elf32_bfd_merge_private_bfd_data elf32_or1k_merge_private_bfd_data
2833 #define bfd_elf32_bfd_set_private_flags or1k_elf_set_private_flags
2834 #define bfd_elf32_bfd_reloc_type_lookup or1k_reloc_type_lookup
2835 #define bfd_elf32_bfd_reloc_name_lookup or1k_reloc_name_lookup
2836
2837 #define elf_backend_object_p                or1k_elf_object_p
2838 #define elf_backend_final_write_processing  or1k_elf_final_write_processing
2839 #define elf_backend_can_refcount                1
2840
2841 #define elf_backend_plt_readonly                1
2842 #define elf_backend_want_got_plt                1
2843 #define elf_backend_want_plt_sym                0
2844 #define elf_backend_got_header_size             12
2845 #define bfd_elf32_bfd_link_hash_table_create    or1k_elf_link_hash_table_create
2846 #define elf_backend_copy_indirect_symbol        or1k_elf_copy_indirect_symbol
2847 #define elf_backend_create_dynamic_sections     or1k_elf_create_dynamic_sections
2848 #define elf_backend_finish_dynamic_sections     or1k_elf_finish_dynamic_sections
2849 #define elf_backend_size_dynamic_sections       or1k_elf_size_dynamic_sections
2850 #define elf_backend_adjust_dynamic_symbol       or1k_elf_adjust_dynamic_symbol
2851 #define elf_backend_finish_dynamic_symbol       or1k_elf_finish_dynamic_symbol
2852
2853 #include "elf32-target.h"