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