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