Coverage Report

Created: 2023-08-28 06:26

/src/binutils-gdb/bfd/elf32-or1k.c
Line
Count
Source (jump to first uncovered line)
1
/* Or1k-specific support for 32-bit ELF.
2
   Copyright (C) 2001-2023 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
0
#define N_ONES(X) (((bfd_vma)2 << (X)) - 1)
31
32
0
#define PLT_ENTRY_SIZE 16
33
0
#define PLT_ENTRY_SIZE_LARGE (6*4)
34
#define PLT_MAX_INSN_COUNT 6
35
36
0
#define OR1K_MOVHI(D)   (0x18000000 | (D << 21))
37
0
#define OR1K_ADRP(D)    (0x08000000 | (D << 21))
38
0
#define OR1K_LWZ(D,A)   (0x84000000 | (D << 21) | (A << 16))
39
0
#define OR1K_ADD(D,A,B)   (0xE0000000 | (D << 21) | (A << 16) | (B << 11))
40
0
#define OR1K_ORI(D,A)   (0xA8000000 | (D << 21) | (A << 16))
41
0
#define OR1K_ORI0(D)    (0xA8000000 | (D << 21))
42
0
#define OR1K_JR(B)    (0x44000000 | (B << 11))
43
0
#define OR1K_NOP    0x15000000
44
45
0
#define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so.1"
46
47
static reloc_howto_type or1k_elf_howto_table[] =
48
{
49
  /* This reloc does nothing.  */
50
  HOWTO (R_OR1K_NONE,   /* type */
51
   0,     /* rightshift */
52
   0,     /* size */
53
   0,     /* bitsize */
54
   false,     /* pc_relative */
55
   0,     /* bitpos */
56
   complain_overflow_dont, /* complain_on_overflow */
57
   bfd_elf_generic_reloc, /* special_function */
58
   "R_OR1K_NONE",   /* name */
59
   false,     /* partial_inplace */
60
   0,     /* src_mask */
61
   0,     /* dst_mask */
62
   false),    /* pcrel_offset */
63
64
  HOWTO (R_OR1K_32,
65
   0,     /* rightshift */
66
   4,     /* size */
67
   32,      /* bitsize */
68
   false,     /* pc_relative */
69
   0,     /* bitpos */
70
   complain_overflow_unsigned, /* complain_on_overflow */
71
   bfd_elf_generic_reloc, /* special_function */
72
   "R_OR1K_32",   /* name */
73
   false,     /* partial_inplace */
74
   0,     /* src_mask */
75
   0xffffffff,    /* dst_mask */
76
   false),    /* pcrel_offset */
77
78
  HOWTO (R_OR1K_16,
79
   0,     /* rightshift */
80
   2,     /* size */
81
   16,      /* bitsize */
82
   false,     /* pc_relative */
83
   0,     /* bitpos */
84
   complain_overflow_unsigned, /* complain_on_overflow */
85
   bfd_elf_generic_reloc, /* special_function */
86
   "R_OR1K_16",   /* name */
87
   false,     /* partial_inplace */
88
   0,     /* src_mask */
89
   0xffff,    /* dst_mask */
90
   false),    /* pcrel_offset */
91
92
  HOWTO (R_OR1K_8,
93
   0,     /* rightshift */
94
   1,     /* size */
95
   8,     /* bitsize */
96
   false,     /* pc_relative */
97
   0,     /* bitpos */
98
   complain_overflow_unsigned, /* complain_on_overflow */
99
   bfd_elf_generic_reloc, /* special_function */
100
   "R_OR1K_8",    /* name */
101
   false,     /* partial_inplace */
102
   0,     /* src_mask */
103
   0xff,      /* dst_mask */
104
   false),    /* pcrel_offset */
105
106
  HOWTO (R_OR1K_LO_16_IN_INSN, /* type */
107
   0,     /* rightshift */
108
   4,     /* size */
109
   16,      /* bitsize */
110
   false,     /* pc_relative */
111
   0,     /* bitpos */
112
   complain_overflow_dont, /* complain_on_overflow */
113
   bfd_elf_generic_reloc, /* special_function */
114
   "R_OR1K_LO_16_IN_INSN", /* name */
115
   false,     /* partial_inplace */
116
   0,     /* src_mask */
117
   0x0000ffff,    /* dst_mask */
118
   false),    /* pcrel_offset */
119
120
  HOWTO (R_OR1K_HI_16_IN_INSN, /* type */
121
   16,      /* rightshift */
122
   4,     /* size */
123
   16,      /* bitsize */
124
   false,     /* pc_relative */
125
   0,     /* bitpos */
126
   complain_overflow_dont, /* complain_on_overflow */
127
   bfd_elf_generic_reloc, /* special_function */
128
   "R_OR1K_HI_16_IN_INSN", /* name */
129
   false,     /* partial_inplace */
130
   0,     /* src_mask */
131
   0x0000ffff,    /* dst_mask */
132
   false),    /* pcrel_offset */
133
134
  /* A PC relative 26 bit relocation, right shifted by 2.  */
135
  HOWTO (R_OR1K_INSN_REL_26, /* type */
136
   2,     /* rightshift */
137
   4,     /* size */
138
   26,      /* bitsize */
139
   true,      /* pc_relative */
140
   0,     /* bitpos */
141
   complain_overflow_signed, /* complain_on_overflow */
142
   bfd_elf_generic_reloc, /* special_function */
143
   "R_OR1K_INSN_REL_26", /* name */
144
   false,     /* partial_inplace */
145
   0,     /* src_mask */
146
   0x03ffffff,    /* dst_mask */
147
   true),     /* pcrel_offset */
148
149
  /* GNU extension to record C++ vtable hierarchy.  */
150
  HOWTO (R_OR1K_GNU_VTINHERIT, /* type */
151
   0,     /* rightshift */
152
   4,     /* size */
153
   0,     /* bitsize */
154
   false,     /* pc_relative */
155
   0,     /* bitpos */
156
   complain_overflow_dont, /* complain_on_overflow */
157
   NULL,      /* special_function */
158
   "R_OR1K_GNU_VTINHERIT", /* name */
159
   false,     /* partial_inplace */
160
   0,     /* src_mask */
161
   0,     /* dst_mask */
162
   false),    /* pcrel_offset */
163
164
  /* GNU extension to record C++ vtable member usage.  */
165
  HOWTO (R_OR1K_GNU_VTENTRY, /* type */
166
   0,     /* rightshift */
167
   4,     /* size */
168
   0,     /* bitsize */
169
   false,     /* pc_relative */
170
   0,     /* bitpos */
171
   complain_overflow_dont, /* complain_on_overflow */
172
   _bfd_elf_rel_vtable_reloc_fn, /* special_function */
173
   "R_OR1K_GNU_VTENTRY", /* name */
174
   false,     /* partial_inplace */
175
   0,     /* src_mask */
176
   0,     /* dst_mask */
177
   false),    /* pcrel_offset */
178
179
  HOWTO (R_OR1K_32_PCREL,
180
   0,     /* rightshift */
181
   4,     /* size */
182
   32,      /* bitsize */
183
   true,      /* pc_relative */
184
   0,     /* bitpos */
185
   complain_overflow_signed, /* complain_on_overflow */
186
   bfd_elf_generic_reloc, /* special_function */
187
   "R_OR1K_32_PCREL", /* name */
188
   false,     /* partial_inplace */
189
   0,     /* src_mask */
190
   0xffffffff,    /* dst_mask */
191
   true),     /* pcrel_offset */
192
193
  HOWTO (R_OR1K_16_PCREL,
194
   0,     /* rightshift */
195
   2,     /* size */
196
   16,      /* bitsize */
197
   true,      /* pc_relative */
198
   0,     /* bitpos */
199
   complain_overflow_signed, /* complain_on_overflow */
200
   bfd_elf_generic_reloc, /* special_function */
201
   "R_OR1K_16_PCREL", /* name */
202
   false,     /* partial_inplace */
203
   0,     /* src_mask */
204
   0xffff,    /* dst_mask */
205
   true),     /* pcrel_offset */
206
207
  HOWTO (R_OR1K_8_PCREL,
208
   0,     /* rightshift */
209
   1,     /* size */
210
   8,     /* bitsize */
211
   true,      /* pc_relative */
212
   0,     /* bitpos */
213
   complain_overflow_signed, /* complain_on_overflow */
214
   bfd_elf_generic_reloc, /* special_function */
215
   "R_OR1K_8_PCREL",  /* name */
216
   false,     /* partial_inplace */
217
   0,     /* src_mask */
218
   0xff,      /* dst_mask */
219
   true),     /* pcrel_offset */
220
221
   HOWTO (R_OR1K_GOTPC_HI16,  /* Type.  */
222
   16,      /* Rightshift.  */
223
   4,     /* Size.  */
224
   16,      /* Bitsize.  */
225
   true,      /* PC_relative.  */
226
   0,     /* Bitpos.  */
227
   complain_overflow_dont, /* Complain on overflow.  */
228
   bfd_elf_generic_reloc, /* Special Function.  */
229
   "R_OR1K_GOTPC_HI16", /* Name.  */
230
   false,   /* Partial Inplace.  */
231
   0,     /* Source Mask.  */
232
   0xffff,    /* Dest Mask.  */
233
   true),     /* PC relative offset?  */
234
235
   HOWTO (R_OR1K_GOTPC_LO16,  /* Type.  */
236
   0,     /* Rightshift.  */
237
   4,     /* Size.  */
238
   16,      /* Bitsize.  */
239
   true,      /* PC_relative.  */
240
   0,     /* Bitpos.  */
241
   complain_overflow_dont, /* Complain on overflow.  */
242
   bfd_elf_generic_reloc, /* Special Function.  */
243
   "R_OR1K_GOTPC_LO16", /* Name.  */
244
   false,   /* Partial Inplace.  */
245
   0,     /* Source Mask.  */
246
   0xffff,    /* Dest Mask.  */
247
   true),     /* PC relative offset?  */
248
249
  HOWTO (R_OR1K_GOT16,    /* type */
250
   0,     /* rightshift */
251
   4,     /* size */
252
   16,      /* bitsize */
253
   false,     /* pc_relative */
254
   0,     /* bitpos */
255
   complain_overflow_signed, /* complain_on_overflow */
256
   bfd_elf_generic_reloc, /* special_function */
257
   "R_OR1K_GOT16",  /* name */
258
   false,     /* partial_inplace */
259
   0,     /* src_mask */
260
   0xffff,    /* dst_mask */
261
   false),    /* pcrel_offset */
262
263
  /* A 26 bit PLT relocation.  Shifted by 2.  */
264
  HOWTO (R_OR1K_PLT26,    /* Type.  */
265
   2,     /* Rightshift.  */
266
   4,     /* Size.  */
267
   26,      /* Bitsize.  */
268
   true,      /* pc_relative.  */
269
   0,     /* Bitpos.  */
270
   complain_overflow_signed, /* Complain on overflow.  */
271
   bfd_elf_generic_reloc, /* Special Function.  */
272
   "R_OR1K_PLT26",  /* Name.  */
273
   false,     /* Partial Inplace.  */
274
   0,     /* Source Mask.  */
275
   0x03ffffff,    /* Dest Mask.  */
276
   true),     /* PC relative offset?  */
277
278
  HOWTO (R_OR1K_GOTOFF_HI16,  /* type */
279
   16,      /* rightshift */
280
   4,     /* size */
281
   16,      /* bitsize */
282
   false,     /* pc_relative */
283
   0,     /* bitpos */
284
   complain_overflow_dont, /* complain_on_overflow */
285
   bfd_elf_generic_reloc, /* special_function */
286
   "R_OR1K_GOTOFF_HI16",  /* name */
287
   false,     /* partial_inplace */
288
   0x0,     /* src_mask */
289
   0xffff,    /* dst_mask */
290
   false),    /* pcrel_offset */
291
292
  HOWTO (R_OR1K_GOTOFF_LO16,  /* type */
293
   0,     /* rightshift */
294
   4,     /* size */
295
   16,      /* bitsize */
296
   false,     /* pc_relative */
297
   0,     /* bitpos */
298
   complain_overflow_dont, /* complain_on_overflow */
299
   bfd_elf_generic_reloc, /* special_function */
300
   "R_OR1K_GOTOFF_LO16",  /* name */
301
   false,     /* partial_inplace */
302
   0x0,     /* src_mask */
303
   0xffff,    /* dst_mask */
304
   false),    /* pcrel_offset */
305
306
  HOWTO (R_OR1K_COPY,   /* type */
307
   0,     /* rightshift */
308
   4,     /* size */
309
   32,      /* bitsize */
310
   false,     /* pc_relative */
311
   0,     /* bitpos */
312
   complain_overflow_bitfield, /* complain_on_overflow */
313
   bfd_elf_generic_reloc, /* special_function */
314
   "R_OR1K_COPY",   /* name */
315
   false,     /* partial_inplace */
316
   0xffffffff,    /* src_mask */
317
   0xffffffff,    /* dst_mask */
318
   false),    /* pcrel_offset */
319
320
  HOWTO (R_OR1K_GLOB_DAT, /* type */
321
   0,     /* rightshift */
322
   4,     /* size */
323
   32,      /* bitsize */
324
   false,     /* pc_relative */
325
   0,     /* bitpos */
326
   complain_overflow_bitfield, /* complain_on_overflow */
327
   bfd_elf_generic_reloc, /* special_function */
328
   "R_OR1K_GLOB_DAT", /* name */
329
   false,     /* partial_inplace */
330
   0xffffffff,    /* src_mask */
331
   0xffffffff,    /* dst_mask */
332
   false),    /* pcrel_offset */
333
334
  HOWTO (R_OR1K_JMP_SLOT, /* type */
335
   0,     /* rightshift */
336
   4,     /* size */
337
   32,      /* bitsize */
338
   false,     /* pc_relative */
339
   0,     /* bitpos */
340
   complain_overflow_bitfield, /* complain_on_overflow */
341
   bfd_elf_generic_reloc, /* special_function */
342
   "R_OR1K_JMP_SLOT", /* name */
343
   false,     /* partial_inplace */
344
   0xffffffff,    /* src_mask */
345
   0xffffffff,    /* dst_mask */
346
   false),    /* pcrel_offset */
347
348
  HOWTO (R_OR1K_RELATIVE, /* type */
349
   0,     /* rightshift */
350
   4,     /* size */
351
   32,      /* bitsize */
352
   false,     /* pc_relative */
353
   0,     /* bitpos */
354
   complain_overflow_bitfield, /* complain_on_overflow */
355
   bfd_elf_generic_reloc, /* special_function */
356
   "R_OR1K_RELATIVE", /* name */
357
   false,     /* partial_inplace */
358
   0xffffffff,    /* src_mask */
359
   0xffffffff,    /* dst_mask */
360
   false),    /* pcrel_offset */
361
362
  HOWTO (R_OR1K_TLS_GD_HI16,  /* type */
363
   16,      /* rightshift */
364
   4,     /* size */
365
   16,      /* bitsize */
366
   false,     /* pc_relative */
367
   0,     /* bitpos */
368
   complain_overflow_dont, /* complain_on_overflow */
369
   bfd_elf_generic_reloc, /* special_function */
370
   "R_OR1K_TLS_GD_HI16",  /* name */
371
   false,     /* partial_inplace */
372
   0x0,     /* src_mask */
373
   0xffff,    /* dst_mask */
374
   false),    /* pcrel_offset */
375
376
  HOWTO (R_OR1K_TLS_GD_LO16,  /* type */
377
   0,     /* rightshift */
378
   4,     /* size */
379
   16,      /* bitsize */
380
   false,     /* pc_relative */
381
   0,     /* bitpos */
382
   complain_overflow_dont, /* complain_on_overflow */
383
   bfd_elf_generic_reloc, /* special_function */
384
   "R_OR1K_TLS_GD_LO16",  /* name */
385
   false,     /* partial_inplace */
386
   0x0,     /* src_mask */
387
   0xffff,    /* dst_mask */
388
   false),    /* pcrel_offset */
389
390
  HOWTO (R_OR1K_TLS_LDM_HI16, /* type */
391
   16,      /* rightshift */
392
   4,     /* size */
393
   16,      /* bitsize */
394
   false,     /* pc_relative */
395
   0,     /* bitpos */
396
   complain_overflow_dont, /* complain_on_overflow */
397
   bfd_elf_generic_reloc, /* special_function */
398
   "R_OR1K_TLS_LDM_HI16", /* name */
399
   false,     /* partial_inplace */
400
   0x0,     /* src_mask */
401
   0xffff,    /* dst_mask */
402
   false),    /* pcrel_offset */
403
404
  HOWTO (R_OR1K_TLS_LDM_LO16, /* type */
405
   0,     /* rightshift */
406
   4,     /* size */
407
   16,      /* bitsize */
408
   false,     /* pc_relative */
409
   0,     /* bitpos */
410
   complain_overflow_dont, /* complain_on_overflow */
411
   bfd_elf_generic_reloc, /* special_function */
412
   "R_OR1K_TLS_LDM_LO16", /* name */
413
   false,     /* partial_inplace */
414
   0x0,     /* src_mask */
415
   0xffff,    /* dst_mask */
416
   false),    /* pcrel_offset */
417
418
  HOWTO (R_OR1K_TLS_LDO_HI16, /* type */
419
   16,      /* rightshift */
420
   4,     /* size */
421
   16,      /* bitsize */
422
   false,     /* pc_relative */
423
   0,     /* bitpos */
424
   complain_overflow_dont, /* complain_on_overflow */
425
   bfd_elf_generic_reloc, /* special_function */
426
   "R_OR1K_TLS_LDO_HI16", /* name */
427
   false,     /* partial_inplace */
428
   0x0,     /* src_mask */
429
   0xffff,    /* dst_mask */
430
   false),    /* pcrel_offset */
431
432
  HOWTO (R_OR1K_TLS_LDO_LO16, /* type */
433
   0,     /* rightshift */
434
   4,     /* size */
435
   16,      /* bitsize */
436
   false,     /* pc_relative */
437
   0,     /* bitpos */
438
   complain_overflow_dont, /* complain_on_overflow */
439
   bfd_elf_generic_reloc, /* special_function */
440
   "R_OR1K_TLS_LDO_LO16", /* name */
441
   false,     /* partial_inplace */
442
   0x0,     /* src_mask */
443
   0xffff,    /* dst_mask */
444
   false),    /* pcrel_offset */
445
446
  HOWTO (R_OR1K_TLS_IE_HI16,  /* type */
447
   16,      /* rightshift */
448
   4,     /* size */
449
   16,      /* bitsize */
450
   false,     /* pc_relative */
451
   0,     /* bitpos */
452
   complain_overflow_dont, /* complain_on_overflow */
453
   bfd_elf_generic_reloc, /* special_function */
454
   "R_OR1K_TLS_IE_HI16",  /* name */
455
   false,     /* partial_inplace */
456
   0x0,     /* src_mask */
457
   0xffff,    /* dst_mask */
458
   false),    /* pcrel_offset */
459
460
  HOWTO (R_OR1K_TLS_IE_LO16,  /* type */
461
   0,     /* rightshift */
462
   4,     /* size */
463
   16,      /* bitsize */
464
   false,     /* pc_relative */
465
   0,     /* bitpos */
466
   complain_overflow_dont, /* complain_on_overflow */
467
   bfd_elf_generic_reloc, /* special_function */
468
   "R_OR1K_TLS_IE_LO16",  /* name */
469
   false,     /* partial_inplace */
470
   0x0,     /* src_mask */
471
   0xffff,    /* dst_mask */
472
   false),    /* pcrel_offset */
473
474
  HOWTO (R_OR1K_TLS_LE_HI16,  /* type */
475
   16,      /* rightshift */
476
   4,     /* size */
477
   16,      /* bitsize */
478
   false,     /* pc_relative */
479
   0,     /* bitpos */
480
   complain_overflow_dont, /* complain_on_overflow */
481
   bfd_elf_generic_reloc, /* special_function */
482
   "R_OR1K_TLS_LE_HI16",  /* name */
483
   false,     /* partial_inplace */
484
   0x0,     /* src_mask */
485
   0xffff,    /* dst_mask */
486
   false),    /* pcrel_offset */
487
488
  HOWTO (R_OR1K_TLS_LE_LO16,  /* type */
489
   0,     /* rightshift */
490
   4,     /* size */
491
   16,      /* bitsize */
492
   false,     /* pc_relative */
493
   0,     /* bitpos */
494
   complain_overflow_dont, /* complain_on_overflow */
495
   bfd_elf_generic_reloc, /* special_function */
496
   "R_OR1K_TLS_LE_LO16",  /* name */
497
   false,     /* partial_inplace */
498
   0x0,     /* src_mask */
499
   0xffff,    /* dst_mask */
500
   false),    /* pcrel_offset */
501
502
  HOWTO (R_OR1K_TLS_TPOFF,  /* type */
503
   0,     /* rightshift */
504
   4,     /* size */
505
   32,      /* bitsize */
506
   false,     /* pc_relative */
507
   0,     /* bitpos */
508
   complain_overflow_bitfield, /* complain_on_overflow */
509
   bfd_elf_generic_reloc, /* special_function */
510
   "R_OR1K_TLS_TPOFF",    /* name */
511
   false,     /* partial_inplace */
512
   0xffffffff,    /* src_mask */
513
   0xffffffff,    /* dst_mask */
514
   false),    /* pcrel_offset */
515
516
  HOWTO (R_OR1K_TLS_DTPOFF, /* type */
517
   0,     /* rightshift */
518
   4,     /* size */
519
   32,      /* bitsize */
520
   false,     /* pc_relative */
521
   0,     /* bitpos */
522
   complain_overflow_bitfield, /* complain_on_overflow */
523
   bfd_elf_generic_reloc, /* special_function */
524
   "R_OR1K_TLS_DTPOFF",   /* name */
525
   false,     /* partial_inplace */
526
   0xffffffff,    /* src_mask */
527
   0xffffffff,    /* dst_mask */
528
   false),    /* pcrel_offset */
529
530
  HOWTO (R_OR1K_TLS_DTPMOD, /* type */
531
   0,     /* rightshift */
532
   4,     /* size */
533
   32,      /* bitsize */
534
   false,     /* pc_relative */
535
   0,     /* bitpos */
536
   complain_overflow_bitfield, /* complain_on_overflow */
537
   bfd_elf_generic_reloc, /* special_function */
538
   "R_OR1K_TLS_DTPMOD",   /* name */
539
   false,     /* partial_inplace */
540
   0xffffffff,    /* src_mask */
541
   0xffffffff,    /* dst_mask */
542
   false),    /* pcrel_offset */
543
544
  HOWTO (R_OR1K_AHI16,    /* type */
545
   16,      /* rightshift */
546
   4,     /* size */
547
   16,      /* bitsize */
548
   false,     /* pc_relative */
549
   0,     /* bitpos */
550
   complain_overflow_dont, /* complain_on_overflow */
551
   bfd_elf_generic_reloc, /* special_function */
552
   "R_OR1K_AHI16",  /* name */
553
   false,     /* partial_inplace */
554
   0x0,     /* src_mask */
555
   0xffff,    /* dst_mask */
556
   false),    /* pcrel_offset */
557
558
  HOWTO (R_OR1K_GOTOFF_AHI16, /* type */
559
   16,      /* rightshift */
560
   4,     /* size */
561
   16,      /* bitsize */
562
   false,     /* pc_relative */
563
   0,     /* bitpos */
564
   complain_overflow_dont, /* complain_on_overflow */
565
   bfd_elf_generic_reloc, /* special_function */
566
   "R_OR1K_GOTOFF_AHI16", /* name */
567
   false,     /* partial_inplace */
568
   0x0,     /* src_mask */
569
   0xffff,    /* dst_mask */
570
   false),    /* pcrel_offset */
571
572
  HOWTO (R_OR1K_TLS_IE_AHI16,   /* type */
573
   16,      /* rightshift */
574
   4,     /* size */
575
   16,      /* bitsize */
576
   false,     /* pc_relative */
577
   0,     /* bitpos */
578
   complain_overflow_dont, /* complain_on_overflow */
579
   bfd_elf_generic_reloc, /* special_function */
580
   "R_OR1K_TLS_IE_AHI16", /* name */
581
   false,     /* partial_inplace */
582
   0x0,     /* src_mask */
583
   0xffff,    /* dst_mask */
584
   false),    /* pcrel_offset */
585
586
  HOWTO (R_OR1K_TLS_LE_AHI16, /* type */
587
   16,      /* rightshift */
588
   4,     /* size */
589
   16,      /* bitsize */
590
   false,     /* pc_relative */
591
   0,     /* bitpos */
592
   complain_overflow_dont, /* complain_on_overflow */
593
   bfd_elf_generic_reloc, /* special_function */
594
   "R_OR1K_TLS_LE_AHI16", /* name */
595
   false,     /* partial_inplace */
596
   0x0,     /* src_mask */
597
   0xffff,    /* dst_mask */
598
   false),    /* pcrel_offset */
599
600
  HOWTO (R_OR1K_SLO16,    /* type */
601
   0,     /* rightshift */
602
   4,     /* size */
603
   16,      /* bitsize */
604
   false,     /* pc_relative */
605
   0,     /* bitpos */
606
   complain_overflow_dont, /* complain_on_overflow */
607
   bfd_elf_generic_reloc, /* special_function */
608
   "R_OR1K_SLO16",  /* name */
609
   false,     /* partial_inplace */
610
   0x0,     /* src_mask */
611
   0xffff,    /* dst_mask */
612
   false),    /* pcrel_offset */
613
614
  HOWTO (R_OR1K_GOTOFF_SLO16, /* type */
615
   0,     /* rightshift */
616
   4,     /* size */
617
   16,      /* bitsize */
618
   false,     /* pc_relative */
619
   0,     /* bitpos */
620
   complain_overflow_dont, /* complain_on_overflow */
621
   bfd_elf_generic_reloc, /* special_function */
622
   "R_OR1K_GOTOFF_SLO16", /* name */
623
   false,     /* partial_inplace */
624
   0x0,     /* src_mask */
625
   0xffff,    /* dst_mask */
626
   false),    /* pcrel_offset */
627
628
  HOWTO (R_OR1K_TLS_LE_SLO16,   /* type */
629
   0,     /* rightshift */
630
   4,     /* size */
631
   16,      /* bitsize */
632
   false,     /* pc_relative */
633
   0,     /* bitpos */
634
   complain_overflow_dont, /* complain_on_overflow */
635
   bfd_elf_generic_reloc, /* special_function */
636
   "R_OR1K_TLS_LE_SLO16", /* name */
637
   false,     /* partial_inplace */
638
   0x0,     /* src_mask */
639
   0xffff,    /* dst_mask */
640
   false),    /* pcrel_offset */
641
642
  /* A page relative 21 bit relocation, right shifted by 13, aligned.
643
     Note that this is *page* relative, not pc relative.  The idea is
644
     similar, but normally the section alignment is not such that the
645
     assembler can infer a final value, which it attempts to do with
646
     pc-relative relocations to local symbols.  */
647
  HOWTO (R_OR1K_PCREL_PG21,    /* type */
648
   13,      /* rightshift */
649
   4,     /* size */
650
   21,      /* bitsize */
651
   false,     /* pc_relative */
652
   0,     /* bitpos */
653
   complain_overflow_signed, /* complain_on_overflow */
654
   bfd_elf_generic_reloc, /* special_function */
655
   "R_OR1K_PCREL_PG21",   /* name */
656
   false,     /* partial_inplace */
657
   0,     /* src_mask */
658
   0x001fffff,    /* dst_mask */
659
   true),     /* pcrel_offset */
660
661
  HOWTO (R_OR1K_GOT_PG21,       /* type */
662
   13,      /* rightshift */
663
   4,     /* size */
664
   21,      /* bitsize */
665
   false,     /* pc_relative */
666
   0,     /* bitpos */
667
   complain_overflow_signed, /* complain_on_overflow */
668
   bfd_elf_generic_reloc, /* special_function */
669
   "R_OR1K_GOT_PG21",     /* name */
670
   false,     /* partial_inplace */
671
   0,     /* src_mask */
672
   0x001fffff,    /* dst_mask */
673
   true),     /* pcrel_offset */
674
675
  HOWTO (R_OR1K_TLS_GD_PG21,    /* type */
676
   13,      /* rightshift */
677
   4,     /* size */
678
   21,      /* bitsize */
679
   false,     /* pc_relative */
680
   0,     /* bitpos */
681
   complain_overflow_signed, /* complain_on_overflow */
682
   bfd_elf_generic_reloc, /* special_function */
683
   "R_OR1K_TLS_GD_PG21",  /* name */
684
   false,     /* partial_inplace */
685
   0,     /* src_mask */
686
   0x001fffff,    /* dst_mask */
687
   true),     /* pcrel_offset */
688
689
  HOWTO (R_OR1K_TLS_LDM_PG21,   /* type */
690
   13,      /* rightshift */
691
   4,     /* size */
692
   21,      /* bitsize */
693
   false,     /* pc_relative */
694
   0,     /* bitpos */
695
   complain_overflow_signed, /* complain_on_overflow */
696
   bfd_elf_generic_reloc, /* special_function */
697
   "R_OR1K_TLS_LDM_PG21", /* name */
698
   false,     /* partial_inplace */
699
   0,     /* src_mask */
700
   0x001fffff,    /* dst_mask */
701
   true),     /* pcrel_offset */
702
703
  HOWTO (R_OR1K_TLS_IE_PG21,    /* type */
704
   13,      /* rightshift */
705
   4,     /* size */
706
   21,      /* bitsize */
707
   false,     /* pc_relative */
708
   0,     /* bitpos */
709
   complain_overflow_signed, /* complain_on_overflow */
710
   bfd_elf_generic_reloc, /* special_function */
711
   "R_OR1K_TLS_IE_PG21",  /* name */
712
   false,     /* partial_inplace */
713
   0,     /* src_mask */
714
   0x001fffff,    /* dst_mask */
715
   true),     /* pcrel_offset */
716
717
  HOWTO (R_OR1K_LO13,   /* type */
718
   0,     /* rightshift */
719
   4,     /* size */
720
   16,      /* bitsize */
721
   false,     /* pc_relative */
722
   0,     /* bitpos */
723
   complain_overflow_dont, /* complain_on_overflow */
724
   bfd_elf_generic_reloc, /* special_function */
725
   "R_OR1K_LO13",   /* name */
726
   false,     /* partial_inplace */
727
   0x0,     /* src_mask */
728
   0xffff,    /* dst_mask */
729
   false),    /* pcrel_offset */
730
731
  HOWTO (R_OR1K_GOT_LO13,       /* type */
732
   0,     /* rightshift */
733
   4,     /* size */
734
   16,      /* bitsize */
735
   false,     /* pc_relative */
736
   0,     /* bitpos */
737
   complain_overflow_dont, /* complain_on_overflow */
738
   bfd_elf_generic_reloc, /* special_function */
739
   "R_OR1K_GOT_LO13",     /* name */
740
   false,     /* partial_inplace */
741
   0x0,     /* src_mask */
742
   0xffff,    /* dst_mask */
743
   false),    /* pcrel_offset */
744
745
  HOWTO (R_OR1K_TLS_GD_LO13,    /* type */
746
   0,     /* rightshift */
747
   4,     /* size */
748
   16,      /* bitsize */
749
   false,     /* pc_relative */
750
   0,     /* bitpos */
751
   complain_overflow_dont, /* complain_on_overflow */
752
   bfd_elf_generic_reloc, /* special_function */
753
   "R_OR1K_TLS_GD_LO13",  /* name */
754
   false,     /* partial_inplace */
755
   0x0,     /* src_mask */
756
   0xffff,    /* dst_mask */
757
   false),    /* pcrel_offset */
758
759
  HOWTO (R_OR1K_TLS_LDM_LO13,   /* type */
760
   0,     /* rightshift */
761
   4,     /* size */
762
   16,      /* bitsize */
763
   false,     /* pc_relative */
764
   0,     /* bitpos */
765
   complain_overflow_dont, /* complain_on_overflow */
766
   bfd_elf_generic_reloc, /* special_function */
767
   "R_OR1K_TLD_LDM_LO13", /* name */
768
   false,     /* partial_inplace */
769
   0x0,     /* src_mask */
770
   0xffff,    /* dst_mask */
771
   false),    /* pcrel_offset */
772
773
  HOWTO (R_OR1K_TLS_IE_LO13,    /* type */
774
   0,     /* rightshift */
775
   4,     /* size */
776
   16,      /* bitsize */
777
   false,     /* pc_relative */
778
   0,     /* bitpos */
779
   complain_overflow_dont, /* complain_on_overflow */
780
   bfd_elf_generic_reloc, /* special_function */
781
   "R_OR1K_TLS_IE_LO13",  /* name */
782
   false,     /* partial_inplace */
783
   0x0,     /* src_mask */
784
   0xffff,    /* dst_mask */
785
   false),    /* pcrel_offset */
786
787
  HOWTO (R_OR1K_SLO13,    /* type */
788
   0,     /* rightshift */
789
   4,     /* size */
790
   16,      /* bitsize */
791
   false,     /* pc_relative */
792
   0,     /* bitpos */
793
   complain_overflow_dont, /* complain_on_overflow */
794
   bfd_elf_generic_reloc, /* special_function */
795
   "R_OR1K_SLO13",  /* name */
796
   false,     /* partial_inplace */
797
   0x0,     /* src_mask */
798
   0xffff,    /* dst_mask */
799
   false),    /* pcrel_offset */
800
801
  /* A 26 bit PLT relocation, using ADRP.  Shifted by 2.  */
802
  HOWTO (R_OR1K_PLTA26,   /* Type.  */
803
   2,     /* Rightshift.  */
804
   4,     /* Size.  */
805
   26,      /* Bitsize.  */
806
   true,      /* pc_relative.  */
807
   0,     /* Bitpos.  */
808
   complain_overflow_signed, /* Complain on overflow.  */
809
   bfd_elf_generic_reloc, /* Special Function.  */
810
   "R_OR1K_PLTA26", /* Name.  */
811
   false,     /* Partial Inplace.  */
812
   0,     /* Source Mask.  */
813
   0x03ffffff,    /* Dest Mask.  */
814
   true),     /* PC relative offset?  */
815
816
  HOWTO (R_OR1K_GOT_AHI16,  /* type */
817
   16,      /* rightshift */
818
   4,     /* size */
819
   16,      /* bitsize */
820
   false,     /* pc_relative */
821
   0,     /* bitpos */
822
   complain_overflow_signed, /* complain_on_overflow */
823
   bfd_elf_generic_reloc, /* special_function */
824
   "R_OR1K_GOT_AHI16",  /* name */
825
   false,     /* partial_inplace */
826
   0,     /* src_mask */
827
   0xffff,    /* dst_mask */
828
   false),    /* pcrel_offset */
829
};
830
831
/* A copy of the R_OR1K_GOT16 used in the presense of R_OR1K_GOT_AHI16
832
   relocations when we know we can ignore overflows.  */
833
static reloc_howto_type or1k_elf_got16_no_overflow_howto =
834
  HOWTO (R_OR1K_GOT16,    /* type */
835
   0,     /* rightshift */
836
   4,     /* size */
837
   16,      /* bitsize */
838
   false,     /* pc_relative */
839
   0,     /* bitpos */
840
   complain_overflow_dont, /* complain_on_overflow */
841
   bfd_elf_generic_reloc, /* special_function */
842
   "R_OR1K_GOT16",  /* name */
843
   false,     /* partial_inplace */
844
   0,     /* src_mask */
845
   0xffff,    /* dst_mask */
846
   false);    /* pcrel_offset */
847
848
/* Map BFD reloc types to Or1k ELF reloc types.  */
849
850
struct or1k_reloc_map
851
{
852
  bfd_reloc_code_real_type bfd_reloc_val;
853
  unsigned int or1k_reloc_val;
854
};
855
856
static const struct or1k_reloc_map or1k_reloc_map[] =
857
{
858
  { BFD_RELOC_NONE,   R_OR1K_NONE },
859
  { BFD_RELOC_32,   R_OR1K_32 },
860
  { BFD_RELOC_16,   R_OR1K_16 },
861
  { BFD_RELOC_8,    R_OR1K_8 },
862
  { BFD_RELOC_LO16,   R_OR1K_LO_16_IN_INSN },
863
  { BFD_RELOC_HI16,   R_OR1K_HI_16_IN_INSN },
864
  { BFD_RELOC_HI16_S,   R_OR1K_AHI16 },
865
  { BFD_RELOC_OR1K_REL_26,  R_OR1K_INSN_REL_26 },
866
  { BFD_RELOC_VTABLE_ENTRY, R_OR1K_GNU_VTENTRY },
867
  { BFD_RELOC_VTABLE_INHERIT, R_OR1K_GNU_VTINHERIT },
868
  { BFD_RELOC_32_PCREL,   R_OR1K_32_PCREL },
869
  { BFD_RELOC_16_PCREL,   R_OR1K_16_PCREL },
870
  { BFD_RELOC_8_PCREL,    R_OR1K_8_PCREL },
871
  { BFD_RELOC_LO16_GOTOFF,  R_OR1K_GOTOFF_LO16 },
872
  { BFD_RELOC_HI16_GOTOFF,  R_OR1K_GOTOFF_HI16 },
873
  { BFD_RELOC_HI16_S_GOTOFF,  R_OR1K_GOTOFF_AHI16 },
874
  { BFD_RELOC_OR1K_GOTPC_HI16,  R_OR1K_GOTPC_HI16 },
875
  { BFD_RELOC_OR1K_GOTPC_LO16,  R_OR1K_GOTPC_LO16 },
876
  { BFD_RELOC_OR1K_GOT16, R_OR1K_GOT16 },
877
  { BFD_RELOC_OR1K_PLT26, R_OR1K_PLT26 },
878
  { BFD_RELOC_OR1K_GLOB_DAT,  R_OR1K_GLOB_DAT },
879
  { BFD_RELOC_OR1K_COPY,  R_OR1K_COPY },
880
  { BFD_RELOC_OR1K_JMP_SLOT,  R_OR1K_JMP_SLOT },
881
  { BFD_RELOC_OR1K_RELATIVE,  R_OR1K_RELATIVE },
882
  { BFD_RELOC_OR1K_TLS_GD_HI16, R_OR1K_TLS_GD_HI16 },
883
  { BFD_RELOC_OR1K_TLS_GD_LO16, R_OR1K_TLS_GD_LO16 },
884
  { BFD_RELOC_OR1K_TLS_LDM_HI16,  R_OR1K_TLS_LDM_HI16 },
885
  { BFD_RELOC_OR1K_TLS_LDM_LO16,  R_OR1K_TLS_LDM_LO16 },
886
  { BFD_RELOC_OR1K_TLS_LDO_HI16,  R_OR1K_TLS_LDO_HI16 },
887
  { BFD_RELOC_OR1K_TLS_LDO_LO16,  R_OR1K_TLS_LDO_LO16 },
888
  { BFD_RELOC_OR1K_TLS_IE_HI16, R_OR1K_TLS_IE_HI16 },
889
  { BFD_RELOC_OR1K_TLS_IE_LO16, R_OR1K_TLS_IE_LO16 },
890
  { BFD_RELOC_OR1K_TLS_IE_AHI16, R_OR1K_TLS_IE_AHI16 },
891
  { BFD_RELOC_OR1K_TLS_LE_HI16, R_OR1K_TLS_LE_HI16 },
892
  { BFD_RELOC_OR1K_TLS_LE_LO16, R_OR1K_TLS_LE_LO16 },
893
  { BFD_RELOC_OR1K_TLS_LE_AHI16, R_OR1K_TLS_LE_AHI16 },
894
  { BFD_RELOC_OR1K_SLO16, R_OR1K_SLO16 },
895
  { BFD_RELOC_OR1K_GOTOFF_SLO16, R_OR1K_GOTOFF_SLO16 },
896
  { BFD_RELOC_OR1K_TLS_LE_SLO16, R_OR1K_TLS_LE_SLO16 },
897
  { BFD_RELOC_OR1K_PCREL_PG21,  R_OR1K_PCREL_PG21 },
898
  { BFD_RELOC_OR1K_GOT_PG21,  R_OR1K_GOT_PG21 },
899
  { BFD_RELOC_OR1K_TLS_GD_PG21, R_OR1K_TLS_GD_PG21 },
900
  { BFD_RELOC_OR1K_TLS_LDM_PG21, R_OR1K_TLS_LDM_PG21 },
901
  { BFD_RELOC_OR1K_TLS_IE_PG21, R_OR1K_TLS_IE_PG21 },
902
  { BFD_RELOC_OR1K_LO13,  R_OR1K_LO13 },
903
  { BFD_RELOC_OR1K_GOT_LO13,  R_OR1K_GOT_LO13 },
904
  { BFD_RELOC_OR1K_TLS_GD_LO13, R_OR1K_TLS_GD_LO13 },
905
  { BFD_RELOC_OR1K_TLS_LDM_LO13, R_OR1K_TLS_LDM_LO13 },
906
  { BFD_RELOC_OR1K_TLS_IE_LO13, R_OR1K_TLS_IE_LO13 },
907
  { BFD_RELOC_OR1K_SLO13, R_OR1K_SLO13 },
908
  { BFD_RELOC_OR1K_PLTA26,  R_OR1K_PLTA26 },
909
  { BFD_RELOC_OR1K_GOT_AHI16, R_OR1K_GOT_AHI16 },
910
};
911
912
/* tls_type is a mask used to track how each symbol is accessed,
913
   it may be accessed via multiple types of TLS access methods.
914
   We track this for sizing (allocating got + relocation section space) and
915
   for how to process relocations.  */
916
0
#define TLS_UNKNOWN    0
917
0
#define TLS_NONE       1
918
0
#define TLS_GD         2
919
0
#define TLS_LD         4
920
0
#define TLS_IE         8
921
0
#define TLS_LE        16
922
923
/* The size of the TLS thread control block, used to offset LE access.  */
924
0
#define TCB_SIZE      16
925
926
/* ELF linker hash entry.  */
927
struct elf_or1k_link_hash_entry
928
{
929
  struct elf_link_hash_entry root;
930
931
  /* For calculating PLT size.  */
932
  bfd_vma plt_index;
933
  /* Track type of TLS access.  */
934
  unsigned char tls_type;
935
};
936
937
/* ELF object data.  */
938
struct elf_or1k_obj_tdata
939
{
940
  struct elf_obj_tdata root;
941
942
  /* tls_type for each local got entry.  */
943
  unsigned char *local_tls_type;
944
};
945
946
#define elf_or1k_tdata(abfd) \
947
0
  ((struct elf_or1k_obj_tdata *) (abfd)->tdata.any)
948
949
#define elf_or1k_local_tls_type(abfd) \
950
0
  (elf_or1k_tdata (abfd)->local_tls_type)
951
952
/* ELF linker hash table.  */
953
struct elf_or1k_link_hash_table
954
{
955
  struct elf_link_hash_table root;
956
957
  bfd_vma plt_count;
958
  bool saw_plta;
959
};
960
961
static size_t
962
elf_or1k_plt_entry_size (bfd_vma plt_index)
963
0
{
964
0
  bfd_vma plt_reloc;
965
966
0
  plt_reloc = plt_index * sizeof (Elf32_External_Rela);
967
968
0
  return (plt_reloc > 0xffff) ? PLT_ENTRY_SIZE_LARGE : PLT_ENTRY_SIZE;
969
0
}
970
971
/* Get the ELF linker hash table from a link_info structure.  */
972
#define or1k_elf_hash_table(p) \
973
0
  ((is_elf_hash_table ((p)->hash)          \
974
0
    && elf_hash_table_id (elf_hash_table (p)) == OR1K_ELF_DATA)   \
975
0
   ? (struct elf_or1k_link_hash_table *) (p)->hash : NULL)
976
977
static bool
978
elf_or1k_mkobject (bfd *abfd)
979
0
{
980
0
  return bfd_elf_allocate_object (abfd, sizeof (struct elf_or1k_obj_tdata),
981
0
          OR1K_ELF_DATA);
982
0
}
983
984
/* Create an entry in an or1k ELF linker hash table.  */
985
986
static struct bfd_hash_entry *
987
or1k_elf_link_hash_newfunc (struct bfd_hash_entry *entry,
988
          struct bfd_hash_table *table,
989
          const char *string)
990
0
{
991
0
  struct elf_or1k_link_hash_entry *ret =
992
0
    (struct elf_or1k_link_hash_entry *) entry;
993
994
  /* Allocate the structure if it has not already been allocated by a
995
     subclass.  */
996
0
  if (ret == NULL)
997
0
    ret = bfd_hash_allocate (table,
998
0
           sizeof (struct elf_or1k_link_hash_entry));
999
0
  if (ret == NULL)
1000
0
    return NULL;
1001
1002
  /* Call the allocation method of the superclass.  */
1003
0
  ret = ((struct elf_or1k_link_hash_entry *)
1004
0
   _bfd_elf_link_hash_newfunc ((struct bfd_hash_entry *) ret,
1005
0
             table, string));
1006
0
  if (ret != NULL)
1007
0
    {
1008
0
      struct elf_or1k_link_hash_entry *eh;
1009
1010
0
      eh = (struct elf_or1k_link_hash_entry *) ret;
1011
0
      eh->tls_type = TLS_UNKNOWN;
1012
0
    }
1013
1014
0
  return (struct bfd_hash_entry *) ret;
1015
0
}
1016
1017
/* Create an or1k ELF linker hash table.  */
1018
1019
static struct bfd_link_hash_table *
1020
or1k_elf_link_hash_table_create (bfd *abfd)
1021
0
{
1022
0
  struct elf_or1k_link_hash_table *ret;
1023
0
  size_t amt = sizeof (struct elf_or1k_link_hash_table);
1024
1025
0
  ret = bfd_zmalloc (amt);
1026
0
  if (ret == NULL)
1027
0
    return NULL;
1028
1029
0
  if (!_bfd_elf_link_hash_table_init (&ret->root, abfd,
1030
0
              or1k_elf_link_hash_newfunc,
1031
0
              sizeof (struct elf_or1k_link_hash_entry),
1032
0
              OR1K_ELF_DATA))
1033
0
    {
1034
0
      free (ret);
1035
0
      return NULL;
1036
0
    }
1037
1038
0
  return &ret->root.root;
1039
0
}
1040
1041
static reloc_howto_type *
1042
or1k_reloc_type_lookup (bfd * abfd ATTRIBUTE_UNUSED,
1043
      bfd_reloc_code_real_type bcode)
1044
0
{
1045
0
  unsigned int i;
1046
1047
0
  for (i = 0; i < ARRAY_SIZE (or1k_reloc_map); i++)
1048
0
    if (or1k_reloc_map[i].bfd_reloc_val == bcode)
1049
0
      {
1050
0
  unsigned int ocode = or1k_reloc_map[i].or1k_reloc_val;
1051
0
  if (ocode < (unsigned int) R_OR1K_max)
1052
0
    return &or1k_elf_howto_table[ocode];
1053
0
  else
1054
0
    break;
1055
0
      }
1056
1057
0
  return NULL;
1058
0
}
1059
1060
static reloc_howto_type *
1061
or1k_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
1062
      const char *r_name)
1063
0
{
1064
0
  unsigned int i;
1065
1066
0
  for (i = 0; i < R_OR1K_max; i++)
1067
0
    if (or1k_elf_howto_table[i].name != NULL
1068
0
  && strcasecmp (or1k_elf_howto_table[i].name, r_name) == 0)
1069
0
      return &or1k_elf_howto_table[i];
1070
1071
0
  return NULL;
1072
0
}
1073
1074
/* Set the howto pointer for an Or1k ELF reloc.  */
1075
1076
static bool
1077
or1k_info_to_howto_rela (bfd * abfd,
1078
       arelent * cache_ptr,
1079
       Elf_Internal_Rela * dst)
1080
0
{
1081
0
  unsigned int r_type;
1082
1083
0
  r_type = ELF32_R_TYPE (dst->r_info);
1084
0
  if (r_type >= (unsigned int) R_OR1K_max)
1085
0
    {
1086
      /* xgettext:c-format */
1087
0
      _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
1088
0
        abfd, r_type);
1089
0
      bfd_set_error (bfd_error_bad_value);
1090
0
      return false;
1091
0
    }
1092
0
  cache_ptr->howto = & or1k_elf_howto_table[r_type];
1093
0
  return true;
1094
0
}
1095
1096
/* Return the relocation value for @tpoff relocations..  */
1097
static bfd_vma
1098
tpoff (struct bfd_link_info *info, bfd_vma address, bool dynamic)
1099
0
{
1100
0
  struct elf_link_hash_table *htab = elf_hash_table (info);
1101
0
  bfd_vma base;
1102
1103
  /* If tls_sec is NULL, we should have signalled an error already.  */
1104
0
  if (htab->tls_sec == NULL)
1105
0
    return 0;
1106
1107
0
  if (dynamic)
1108
0
    return address - htab->tls_sec->vma;
1109
0
  else
1110
0
    {
1111
      /* On or1k, the tp points to just after the tcb, if we have an alignment
1112
   greater than the tcb size we need to offset by the alignment difference.  */
1113
0
      base = align_power ((bfd_vma) TCB_SIZE, htab->tls_sec->alignment_power)
1114
0
       - TCB_SIZE;
1115
1116
      /* The thread pointer on or1k stores the address after the TCB where
1117
   the data is, just compute the difference. No need to compensate
1118
   for the size of TCB.  */
1119
0
      return address - htab->tls_sec->vma + base;
1120
0
    }
1121
0
}
1122
1123
/* If we have both IE and GD accesses to a symbol the IE relocations should be
1124
   offset by 8 bytes because the got contains both GD and IE entries.  */
1125
static bfd_vma
1126
or1k_initial_exec_offset (reloc_howto_type *howto, unsigned char tls_type_mask)
1127
0
{
1128
0
   switch (howto->type)
1129
0
     {
1130
0
     case R_OR1K_TLS_IE_HI16:
1131
0
     case R_OR1K_TLS_IE_LO16:
1132
0
     case R_OR1K_TLS_IE_PG21:
1133
0
     case R_OR1K_TLS_IE_LO13:
1134
0
     case R_OR1K_TLS_IE_AHI16:
1135
0
       return (tls_type_mask & TLS_GD) != 0 ? 8 : 0;
1136
0
     default:
1137
0
       return 0;
1138
0
     }
1139
0
}
1140
1141
/* Like _bfd_final_link_relocate, but handles non-contiguous fields.  */
1142
1143
static bfd_reloc_status_type
1144
or1k_final_link_relocate (reloc_howto_type *howto, bfd *input_bfd,
1145
        asection *input_section, bfd_byte *contents,
1146
        bfd_vma offset, bfd_vma value)
1147
0
{
1148
0
  bfd_reloc_status_type status = bfd_reloc_ok;
1149
0
  int size = bfd_get_reloc_size (howto);
1150
0
  bfd_vma x, place;
1151
1152
  /* Sanity check the address.  */
1153
0
  if (offset + size > bfd_get_section_limit_octets (input_bfd, input_section))
1154
0
    return bfd_reloc_outofrange;
1155
1156
0
  place = (input_section->output_section->vma
1157
0
     + input_section->output_offset
1158
0
     + (howto->pcrel_offset ? offset : 0));
1159
1160
0
  switch (howto->type)
1161
0
    {
1162
0
    case R_OR1K_AHI16:
1163
0
    case R_OR1K_GOT_AHI16:
1164
0
    case R_OR1K_GOTOFF_AHI16:
1165
0
    case R_OR1K_TLS_IE_AHI16:
1166
0
    case R_OR1K_TLS_LE_AHI16:
1167
      /* Adjust the operand to match with a signed LO16.  */
1168
0
      value += 0x8000;
1169
0
      break;
1170
1171
0
    case R_OR1K_INSN_REL_26:
1172
0
      value -= place;
1173
      /* Diagnose mis-aligned branch targets.  */
1174
0
      if (value & 3)
1175
0
  status = bfd_reloc_dangerous;
1176
0
      break;
1177
1178
0
    case R_OR1K_PCREL_PG21:
1179
0
    case R_OR1K_GOT_PG21:
1180
0
    case R_OR1K_TLS_GD_PG21:
1181
0
    case R_OR1K_TLS_LDM_PG21:
1182
0
    case R_OR1K_TLS_IE_PG21:
1183
0
      value = (value & -8192) - (place & -8192);
1184
0
      break;
1185
1186
0
    case R_OR1K_LO13:
1187
0
    case R_OR1K_GOT_LO13:
1188
0
    case R_OR1K_TLS_GD_LO13:
1189
0
    case R_OR1K_TLS_LDM_LO13:
1190
0
    case R_OR1K_TLS_IE_LO13:
1191
0
    case R_OR1K_SLO13:
1192
0
      value &= 8191;
1193
0
      break;
1194
1195
0
    default:
1196
0
      if (howto->pc_relative)
1197
0
  value -= place;
1198
0
      break;
1199
0
    }
1200
1201
0
  status = bfd_check_overflow (howto->complain_on_overflow,
1202
0
             howto->bitsize,
1203
0
             howto->rightshift,
1204
0
             bfd_arch_bits_per_address (input_bfd),
1205
0
             value);
1206
0
  value >>= howto->rightshift;
1207
1208
  /* If we're overwriting the entire destination,
1209
     then no need to read the current contents.  */
1210
0
  if (size == 0 || howto->dst_mask == N_ONES (size))
1211
0
    x = 0;
1212
0
  else
1213
0
    {
1214
0
      BFD_ASSERT (size == 4);
1215
0
      x = bfd_get_32 (input_bfd, contents + offset);
1216
0
    }
1217
1218
0
  switch (howto->type)
1219
0
    {
1220
0
    case R_OR1K_SLO16:
1221
0
    case R_OR1K_GOTOFF_SLO16:
1222
0
    case R_OR1K_TLS_LE_SLO16:
1223
0
    case R_OR1K_SLO13:
1224
      /* The split imm16 field used for stores.  */
1225
0
      x = (x & ~0x3e007ff) | ((value & 0xf800) << 10) | (value & 0x7ff);
1226
0
      break;
1227
1228
0
    default:
1229
0
      {
1230
0
  bfd_vma fieldmask = howto->dst_mask;
1231
0
  value <<= howto->bitpos;
1232
0
  x = (x & ~fieldmask) | (value & fieldmask);
1233
0
      }
1234
0
      break;
1235
0
    }
1236
1237
  /* Put the relocated value back in the object file.  */
1238
0
  switch (size)
1239
0
    {
1240
0
    case 0:
1241
0
      break;
1242
0
    case 1:
1243
0
      bfd_put_8 (input_bfd, x, contents + offset);
1244
0
      break;
1245
0
    case 2:
1246
0
      bfd_put_16 (input_bfd, x, contents + offset);
1247
0
      break;
1248
0
    case 4:
1249
0
      bfd_put_32 (input_bfd, x, contents + offset);
1250
0
      break;
1251
0
#ifdef BFD64
1252
0
    case 8:
1253
0
      bfd_put_64 (input_bfd, x, contents + offset);
1254
0
      break;
1255
0
#endif
1256
0
    default:
1257
0
      _bfd_error_handler
1258
0
  (_("%pB: Cannot handle relocation value size of %d"),
1259
0
   input_bfd, size);
1260
0
      abort ();
1261
0
    }
1262
0
  return status;
1263
0
}
1264
1265
/* Relocate an Or1k ELF section.
1266
1267
   The RELOCATE_SECTION function is called by the new ELF backend linker
1268
   to handle the relocations for a section.
1269
1270
   The relocs are always passed as Rela structures; if the section
1271
   actually uses Rel structures, the r_addend field will always be
1272
   zero.
1273
1274
   This function is responsible for adjusting the section contents as
1275
   necessary, and (if using Rela relocs and generating a relocatable
1276
   output file) adjusting the reloc addend as necessary.
1277
1278
   This function does not have to worry about setting the reloc
1279
   address or the reloc symbol index.
1280
1281
   LOCAL_SYMS is a pointer to the swapped in local symbols.
1282
1283
   LOCAL_SECTIONS is an array giving the section in the input file
1284
   corresponding to the st_shndx field of each local symbol.
1285
1286
   The global hash table entry for the global symbols can be found
1287
   via elf_sym_hashes (input_bfd).
1288
1289
   When generating relocatable output, this function must handle
1290
   STB_LOCAL/STT_SECTION symbols specially.  The output symbol is
1291
   going to be the section symbol corresponding to the output
1292
   section, which means that the addend must be adjusted
1293
   accordingly.  */
1294
1295
static int
1296
or1k_elf_relocate_section (bfd *output_bfd,
1297
         struct bfd_link_info *info,
1298
         bfd *input_bfd,
1299
         asection *input_section,
1300
         bfd_byte *contents,
1301
         Elf_Internal_Rela *relocs,
1302
         Elf_Internal_Sym *local_syms,
1303
         asection **local_sections)
1304
0
{
1305
0
  Elf_Internal_Shdr *symtab_hdr;
1306
0
  struct elf_link_hash_entry **sym_hashes;
1307
0
  Elf_Internal_Rela *rel;
1308
0
  Elf_Internal_Rela *relend;
1309
0
  struct elf_or1k_link_hash_table *htab = or1k_elf_hash_table (info);
1310
0
  asection *sreloc;
1311
0
  bfd_vma *local_got_offsets;
1312
0
  asection *sgot, *splt;
1313
0
  bfd_vma plt_base, got_base, got_sym_value;
1314
0
  bool ret_val = true;
1315
0
  bool saw_gotha = false;
1316
1317
0
  if (htab == NULL)
1318
0
    return false;
1319
1320
0
  local_got_offsets = elf_local_got_offsets (input_bfd);
1321
1322
0
  sreloc = elf_section_data (input_section)->sreloc;
1323
1324
0
  splt = htab->root.splt;
1325
0
  plt_base = 0;
1326
0
  if (splt != NULL)
1327
0
    plt_base = splt->output_section->vma + splt->output_offset;
1328
1329
0
  sgot = htab->root.sgot;
1330
0
  got_sym_value = got_base = 0;
1331
0
  if (sgot != NULL)
1332
0
    {
1333
0
      struct elf_link_hash_entry *hgot = htab->root.hgot;
1334
0
      got_sym_value = (hgot->root.u.def.value
1335
0
           + hgot->root.u.def.section->output_section->vma
1336
0
           + hgot->root.u.def.section->output_offset);
1337
0
      got_base = sgot->output_section->vma + sgot->output_offset;
1338
0
    }
1339
1340
0
  symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
1341
0
  sym_hashes = elf_sym_hashes (input_bfd);
1342
0
  relend = relocs + input_section->reloc_count;
1343
1344
  /* Make a full scan for R_OR1K_GOT_AHI16, since it could be AFTER R_OR1K_GOT16.  */
1345
0
  for (rel = relocs; rel < relend; rel++)
1346
0
    {
1347
0
      int r_type = ELF32_R_TYPE (rel->r_info);
1348
0
      if (r_type==R_OR1K_GOT_AHI16)
1349
0
        {
1350
0
    saw_gotha = true;
1351
0
    break;
1352
0
        }
1353
0
    }
1354
1355
0
  for (rel = relocs; rel < relend; rel++)
1356
0
    {
1357
0
      reloc_howto_type *howto;
1358
0
      unsigned long r_symndx;
1359
0
      Elf_Internal_Sym *sym;
1360
0
      asection *sec;
1361
0
      struct elf_link_hash_entry *h;
1362
0
      bfd_vma relocation;
1363
0
      bfd_reloc_status_type r;
1364
0
      const char *name = NULL;
1365
0
      int r_type;
1366
1367
0
      r_type = ELF32_R_TYPE (rel->r_info);
1368
0
      r_symndx = ELF32_R_SYM (rel->r_info);
1369
1370
0
      if (r_type == R_OR1K_GNU_VTINHERIT
1371
0
    || r_type == R_OR1K_GNU_VTENTRY)
1372
0
  continue;
1373
1374
0
      if (r_type < 0 || r_type >= (int) R_OR1K_max)
1375
0
  {
1376
0
    _bfd_error_handler
1377
0
      (_("%pB: unknown relocation type %d"),
1378
0
       input_bfd, (int) r_type);
1379
0
    bfd_set_error (bfd_error_bad_value);
1380
0
    ret_val = false;
1381
0
    continue;
1382
0
  }
1383
1384
0
      howto = or1k_elf_howto_table + ELF32_R_TYPE (rel->r_info);
1385
0
      h = NULL;
1386
0
      sym = NULL;
1387
0
      sec = NULL;
1388
1389
0
      if (r_symndx < symtab_hdr->sh_info)
1390
0
  {
1391
0
    sym = local_syms + r_symndx;
1392
0
    sec = local_sections[r_symndx];
1393
0
    relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
1394
1395
0
    name = bfd_elf_string_from_elf_section
1396
0
      (input_bfd, symtab_hdr->sh_link, sym->st_name);
1397
0
    name = name == NULL ? bfd_section_name (sec) : name;
1398
0
  }
1399
0
      else
1400
0
  {
1401
0
    bool unresolved_reloc, warned, ignored;
1402
1403
0
    RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
1404
0
           r_symndx, symtab_hdr, sym_hashes,
1405
0
           h, sec, relocation,
1406
0
           unresolved_reloc, warned, ignored);
1407
0
    name = h->root.root.string;
1408
0
  }
1409
1410
0
      if (sec != NULL && discarded_section (sec))
1411
0
  RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
1412
0
           rel, 1, relend, howto, 0, contents);
1413
1414
0
      if (bfd_link_relocatable (info))
1415
0
  continue;
1416
1417
0
      switch (howto->type)
1418
0
  {
1419
0
  case R_OR1K_PLT26:
1420
0
  case R_OR1K_PLTA26:
1421
    /* If the call is not local, redirect the branch to the PLT.
1422
       Otherwise do nothing to send the branch to the symbol direct.  */
1423
0
    if (!SYMBOL_CALLS_LOCAL (info, h)
1424
0
        && h->plt.offset != (bfd_vma) -1)
1425
0
      relocation = plt_base + h->plt.offset;
1426
1427
    /* Addend should be zero.  */
1428
0
    if (rel->r_addend != 0)
1429
0
      {
1430
0
        _bfd_error_handler
1431
0
    (_("%pB: addend should be zero for plt relocations"),
1432
0
     input_bfd);
1433
0
        bfd_set_error (bfd_error_bad_value);
1434
0
        ret_val = false;
1435
0
      }
1436
0
    break;
1437
1438
0
  case R_OR1K_GOT_AHI16:
1439
0
  case R_OR1K_GOT16:
1440
0
  case R_OR1K_GOT_PG21:
1441
0
  case R_OR1K_GOT_LO13:
1442
0
    {
1443
0
      bfd_vma off;
1444
1445
      /* Relocation is to the entry for this symbol
1446
         in the global offset table.  */
1447
0
    BFD_ASSERT (sgot != NULL);
1448
0
    if (h != NULL)
1449
0
      {
1450
0
        bool dyn;
1451
1452
0
        off = h->got.offset;
1453
0
        BFD_ASSERT (off != (bfd_vma) -1);
1454
1455
0
        dyn = htab->root.dynamic_sections_created;
1456
0
        if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn,
1457
0
                 bfd_link_pic (info),
1458
0
                 h)
1459
0
      || (bfd_link_pic (info)
1460
0
          && SYMBOL_REFERENCES_LOCAL (info, h)))
1461
0
    {
1462
        /* This is actually a static link, or it is a -Bsymbolic
1463
           link and the symbol is defined locally, or the symbol
1464
           was forced to be local because of a version file.
1465
           We must initialize this entry in the GOT.  Since the
1466
           offset must always be a multiple of 4, we use the least
1467
           significant bit to record whether we have initialized
1468
           it already.
1469
1470
         When doing a dynamic link, we create a .rela.got
1471
         relocation entry to initialize the value.  This
1472
         is done in the finish_dynamic_symbol routine.  */
1473
0
      if ((off & 1) != 0)
1474
0
        off &= ~1;
1475
0
      else
1476
0
        {
1477
          /* Write entry in GOT.  */
1478
0
          bfd_put_32 (output_bfd, relocation,
1479
0
          sgot->contents + off);
1480
          /* Mark GOT entry as having been written.  */
1481
0
          h->got.offset |= 1;
1482
0
        }
1483
0
    }
1484
0
      }
1485
0
    else
1486
0
      {
1487
0
        bfd_byte *loc;
1488
1489
0
        BFD_ASSERT (local_got_offsets != NULL
1490
0
        && local_got_offsets[r_symndx] != (bfd_vma) -1);
1491
1492
        /* Get offset into GOT table.  */
1493
0
        off = local_got_offsets[r_symndx];
1494
1495
        /* The offset must always be a multiple of 4.  We use
1496
     the least significant bit to record whether we have
1497
     already processed this entry.  */
1498
0
        if ((off & 1) != 0)
1499
0
    off &= ~1;
1500
0
        else
1501
0
    {
1502
      /* Write entry in GOT.  */
1503
0
      bfd_put_32 (output_bfd, relocation, sgot->contents + off);
1504
0
      if (bfd_link_pic (info))
1505
0
        {
1506
0
          asection *srelgot;
1507
0
          Elf_Internal_Rela outrel;
1508
1509
          /* We need to generate a R_OR1K_RELATIVE reloc
1510
       for the dynamic linker.  */
1511
0
          srelgot = htab->root.srelgot;
1512
0
          BFD_ASSERT (srelgot != NULL);
1513
1514
0
          outrel.r_offset = got_base + off;
1515
0
          outrel.r_info = ELF32_R_INFO (0, R_OR1K_RELATIVE);
1516
0
          outrel.r_addend = relocation;
1517
0
          loc = srelgot->contents;
1518
0
          loc += (srelgot->reloc_count
1519
0
            * sizeof (Elf32_External_Rela));
1520
0
          bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
1521
0
          ++srelgot->reloc_count;
1522
0
        }
1523
0
      local_got_offsets[r_symndx] |= 1;
1524
0
    }
1525
0
      }
1526
1527
      /* The GOT_PG21 and GOT_LO13 relocs are pc-relative,
1528
         while the GOT16 reloc is GOT relative.  */
1529
0
      relocation = got_base + off;
1530
0
      if (r_type == R_OR1K_GOT16
1531
0
    || r_type == R_OR1K_GOT_AHI16)
1532
0
        relocation -= got_sym_value;
1533
1534
      /* If we have a R_OR1K_GOT16 following a R_OR1K_GOT_AHI16
1535
         relocation we assume the code is doing the right thing to avoid
1536
         overflows.  */
1537
0
      if (r_type == R_OR1K_GOT16 && saw_gotha)
1538
0
        howto = &or1k_elf_got16_no_overflow_howto;
1539
1540
    /* Addend should be zero.  */
1541
0
    if (rel->r_addend != 0)
1542
0
      {
1543
0
        _bfd_error_handler
1544
0
    (_("%pB: addend should be zero for got relocations"),
1545
0
     input_bfd);
1546
0
        bfd_set_error (bfd_error_bad_value);
1547
0
        ret_val = false;
1548
0
      }
1549
0
    }
1550
0
    break;
1551
1552
0
  case R_OR1K_GOTOFF_LO16:
1553
0
  case R_OR1K_GOTOFF_HI16:
1554
0
  case R_OR1K_GOTOFF_AHI16:
1555
0
  case R_OR1K_GOTOFF_SLO16:
1556
    /* Relocation is offset from GOT.  */
1557
0
    BFD_ASSERT (sgot != NULL);
1558
0
    if (!SYMBOL_REFERENCES_LOCAL (info, h))
1559
0
      {
1560
0
        _bfd_error_handler
1561
0
    (_("%pB: gotoff relocation against dynamic symbol %s"),
1562
0
     input_bfd, h->root.root.string);
1563
0
        ret_val = false;
1564
0
        bfd_set_error (bfd_error_bad_value);
1565
0
      }
1566
0
    relocation -= got_sym_value;
1567
0
    break;
1568
1569
0
  case R_OR1K_INSN_REL_26:
1570
    /* For a non-shared link, these will reference plt or call the
1571
       version of actual object.  */
1572
0
    if (bfd_link_pic (info) && !SYMBOL_CALLS_LOCAL (info, h))
1573
0
      {
1574
0
        _bfd_error_handler
1575
0
    (_("%pB: pc-relative relocation against dynamic symbol %s"),
1576
0
     input_bfd, name);
1577
0
        ret_val = false;
1578
0
        bfd_set_error (bfd_error_bad_value);
1579
0
      }
1580
0
    break;
1581
1582
0
  case R_OR1K_PCREL_PG21:
1583
0
  case R_OR1K_LO13:
1584
0
  case R_OR1K_SLO13:
1585
    /* For a non-shared link, these will reference either the plt
1586
       or a .dynbss copy of the symbol.  */
1587
0
    if (bfd_link_pic (info) && !SYMBOL_REFERENCES_LOCAL (info, h))
1588
0
      {
1589
0
        _bfd_error_handler
1590
0
    (_("%pB: pc-relative relocation against dynamic symbol %s"),
1591
0
     input_bfd, name);
1592
0
        ret_val = false;
1593
0
        bfd_set_error (bfd_error_bad_value);
1594
0
      }
1595
0
    break;
1596
1597
0
  case R_OR1K_HI_16_IN_INSN:
1598
0
  case R_OR1K_LO_16_IN_INSN:
1599
0
  case R_OR1K_AHI16:
1600
0
  case R_OR1K_SLO16:
1601
0
    if (bfd_link_pic (info))
1602
0
      {
1603
0
        _bfd_error_handler
1604
0
    (_("%pB: non-pic relocation against symbol %s"),
1605
0
     input_bfd, name);
1606
0
        ret_val = false;
1607
0
        bfd_set_error (bfd_error_bad_value);
1608
0
      }
1609
0
    break;
1610
1611
0
  case R_OR1K_32:
1612
    /* R_OR1K_16? */
1613
0
    {
1614
      /* r_symndx will be STN_UNDEF (zero) only for relocs against symbols
1615
         from removed linkonce sections, or sections discarded by
1616
         a linker script.  */
1617
0
      if (r_symndx == STN_UNDEF
1618
0
    || (input_section->flags & SEC_ALLOC) == 0)
1619
0
        break;
1620
1621
      /* Emit a direct relocation if the symbol is dynamic,
1622
         or a RELATIVE reloc for shared objects.  We can omit
1623
         RELATIVE relocs to local undefweak symbols.  */
1624
0
      if (bfd_link_pic (info)
1625
0
    ? (h == NULL
1626
0
         || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
1627
0
         || h->root.type != bfd_link_hash_undefweak)
1628
0
    : (h != NULL
1629
0
        && h->dynindx != -1
1630
0
        && !h->non_got_ref
1631
0
       && ((h->def_dynamic && !h->def_regular)
1632
0
      || h->root.type == bfd_link_hash_undefweak
1633
0
      || h->root.type == bfd_link_hash_undefined)))
1634
0
        {
1635
0
    Elf_Internal_Rela outrel;
1636
0
    bfd_byte *loc;
1637
0
    bool skip;
1638
1639
    /* When generating a shared object, these relocations
1640
       are copied into the output file to be resolved at run
1641
       time.  */
1642
1643
0
    BFD_ASSERT (sreloc != NULL);
1644
1645
0
    skip = false;
1646
1647
0
    outrel.r_offset =
1648
0
      _bfd_elf_section_offset (output_bfd, info, input_section,
1649
0
             rel->r_offset);
1650
0
    if (outrel.r_offset == (bfd_vma) -1)
1651
0
      skip = true;
1652
0
    else if (outrel.r_offset == (bfd_vma) -2)
1653
0
      skip = true;
1654
0
    outrel.r_offset += (input_section->output_section->vma
1655
0
            + input_section->output_offset);
1656
1657
0
    if (skip)
1658
0
      memset (&outrel, 0, sizeof outrel);
1659
0
    else if (SYMBOL_REFERENCES_LOCAL (info, h))
1660
0
      {
1661
0
        outrel.r_info = ELF32_R_INFO (0, R_OR1K_RELATIVE);
1662
0
        outrel.r_addend = relocation + rel->r_addend;
1663
0
      }
1664
0
    else
1665
0
      {
1666
0
        BFD_ASSERT (h->dynindx != -1);
1667
0
        outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
1668
0
        outrel.r_addend = rel->r_addend;
1669
0
      }
1670
1671
0
    loc = sreloc->contents;
1672
0
    loc += sreloc->reloc_count++ * sizeof (Elf32_External_Rela);
1673
0
    bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
1674
0
    break;
1675
0
        }
1676
0
      break;
1677
0
    }
1678
1679
0
  case R_OR1K_TLS_LDM_HI16:
1680
0
  case R_OR1K_TLS_LDM_LO16:
1681
0
  case R_OR1K_TLS_LDM_PG21:
1682
0
  case R_OR1K_TLS_LDM_LO13:
1683
0
  case R_OR1K_TLS_LDO_HI16:
1684
0
  case R_OR1K_TLS_LDO_LO16:
1685
    /* TODO: implement support for local dynamic.  */
1686
0
    BFD_FAIL ();
1687
0
    _bfd_error_handler
1688
0
      (_("%pB: support for local dynamic not implemented"),
1689
0
       input_bfd);
1690
0
    bfd_set_error (bfd_error_bad_value);
1691
0
    return false;
1692
1693
0
  case R_OR1K_TLS_GD_HI16:
1694
0
  case R_OR1K_TLS_GD_LO16:
1695
0
  case R_OR1K_TLS_GD_PG21:
1696
0
  case R_OR1K_TLS_GD_LO13:
1697
0
  case R_OR1K_TLS_IE_HI16:
1698
0
  case R_OR1K_TLS_IE_LO16:
1699
0
  case R_OR1K_TLS_IE_PG21:
1700
0
  case R_OR1K_TLS_IE_LO13:
1701
0
  case R_OR1K_TLS_IE_AHI16:
1702
0
    {
1703
0
      bfd_vma gotoff;
1704
0
      Elf_Internal_Rela rela;
1705
0
      asection *srelgot;
1706
0
      bfd_byte *loc;
1707
0
      bool dynamic;
1708
0
      int indx = 0;
1709
0
      unsigned char tls_type;
1710
1711
0
      srelgot = htab->root.srelgot;
1712
1713
      /* Mark as TLS related GOT entry by setting
1714
         bit 2 to indcate TLS and bit 1 to indicate GOT.  */
1715
0
      if (h != NULL)
1716
0
        {
1717
0
    gotoff = h->got.offset;
1718
0
    tls_type = ((struct elf_or1k_link_hash_entry *) h)->tls_type;
1719
0
    h->got.offset |= 3;
1720
0
        }
1721
0
      else
1722
0
        {
1723
0
    unsigned char *local_tls_type;
1724
1725
0
    gotoff = local_got_offsets[r_symndx];
1726
0
    local_tls_type = (unsigned char *) elf_or1k_local_tls_type (input_bfd);
1727
0
    tls_type = local_tls_type == NULL ? TLS_NONE
1728
0
              : local_tls_type[r_symndx];
1729
0
    local_got_offsets[r_symndx] |= 3;
1730
0
        }
1731
1732
      /* Only process the relocation once.  */
1733
0
      if ((gotoff & 1) != 0)
1734
0
        {
1735
0
    gotoff += or1k_initial_exec_offset (howto, tls_type);
1736
1737
    /* The PG21 and LO13 relocs are pc-relative, while the
1738
       rest are GOT relative.  */
1739
0
    relocation = got_base + (gotoff & ~3);
1740
0
    if (!(r_type == R_OR1K_TLS_GD_PG21
1741
0
        || r_type == R_OR1K_TLS_GD_LO13
1742
0
        || r_type == R_OR1K_TLS_IE_PG21
1743
0
        || r_type == R_OR1K_TLS_IE_LO13))
1744
0
      relocation -= got_sym_value;
1745
0
    break;
1746
0
        }
1747
1748
0
      BFD_ASSERT (elf_hash_table (info)->hgot == NULL
1749
0
      || elf_hash_table (info)->hgot->root.u.def.value == 0);
1750
1751
0
      if (h != NULL)
1752
0
        {
1753
0
    bool dyn = htab->root.dynamic_sections_created;
1754
0
    bool pic = bfd_link_pic (info);
1755
1756
0
    if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, pic, h)
1757
0
        && (!pic || !SYMBOL_REFERENCES_LOCAL (info, h)))
1758
0
      indx = h->dynindx;
1759
0
        }
1760
1761
      /* Dynamic entries will require relocations.  If we do not need
1762
         them we will just use the default R_OR1K_NONE and
1763
         not set anything.  */
1764
0
      dynamic = (bfd_link_pic (info) || indx != 0)
1765
0
           && (h == NULL
1766
0
         || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
1767
0
         || h->root.type != bfd_link_hash_undefweak);
1768
1769
      /* Shared GD.  */
1770
0
      if (dynamic && ((tls_type & TLS_GD) != 0))
1771
0
        {
1772
0
    int i;
1773
1774
    /* Add DTPMOD and DTPOFF GOT and rela entries.  */
1775
0
    for (i = 0; i < 2; ++i)
1776
0
      {
1777
0
        BFD_ASSERT (srelgot->contents != NULL);
1778
1779
0
        rela.r_offset = got_base + gotoff + i*4;
1780
0
        if (h != NULL && h->dynindx != -1)
1781
0
          {
1782
0
      rela.r_info = ELF32_R_INFO (h->dynindx,
1783
0
          (i == 0 ? R_OR1K_TLS_DTPMOD : R_OR1K_TLS_DTPOFF));
1784
0
      rela.r_addend = 0;
1785
0
          }
1786
0
        else
1787
0
          {
1788
0
      rela.r_info = ELF32_R_INFO (0,
1789
0
          (i == 0 ? R_OR1K_TLS_DTPMOD : R_OR1K_TLS_DTPOFF));
1790
0
      rela.r_addend =
1791
0
          (i == 0 ? 0 : tpoff (info, relocation, dynamic));
1792
0
          }
1793
1794
0
        loc = srelgot->contents;
1795
0
        loc += (srelgot->reloc_count++
1796
0
          * sizeof (Elf32_External_Rela));
1797
1798
0
        bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
1799
0
        bfd_put_32 (output_bfd, 0, sgot->contents + gotoff + i*4);
1800
0
      }
1801
0
        }
1802
      /* Static GD.  */
1803
0
      else if ((tls_type & TLS_GD) != 0)
1804
0
        {
1805
0
    bfd_put_32 (output_bfd, 1, sgot->contents + gotoff);
1806
0
    bfd_put_32 (output_bfd, tpoff (info, relocation, dynamic),
1807
0
        sgot->contents + gotoff + 4);
1808
0
        }
1809
1810
0
      gotoff += or1k_initial_exec_offset (howto, tls_type);
1811
1812
      /* Shared IE.  */
1813
0
      if (dynamic && ((tls_type & TLS_IE) != 0))
1814
0
        {
1815
0
    BFD_ASSERT (srelgot->contents != NULL);
1816
1817
    /* Add TPOFF GOT and rela entries.  */
1818
0
    rela.r_offset = got_base + gotoff;
1819
0
    if (h != NULL && h->dynindx != -1)
1820
0
      {
1821
0
        rela.r_info = ELF32_R_INFO (h->dynindx, R_OR1K_TLS_TPOFF);
1822
0
        rela.r_addend = 0;
1823
0
      }
1824
0
    else
1825
0
      {
1826
0
        rela.r_info = ELF32_R_INFO (0, R_OR1K_TLS_TPOFF);
1827
0
        rela.r_addend = tpoff (info, relocation, dynamic);
1828
0
      }
1829
1830
0
    loc = srelgot->contents;
1831
0
    loc += srelgot->reloc_count++ * sizeof (Elf32_External_Rela);
1832
1833
0
    bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
1834
0
    bfd_put_32 (output_bfd, 0, sgot->contents + gotoff);
1835
0
        }
1836
      /* Static IE.  */
1837
0
      else if ((tls_type & TLS_IE) != 0)
1838
0
        bfd_put_32 (output_bfd, tpoff (info, relocation, dynamic),
1839
0
        sgot->contents + gotoff);
1840
1841
      /* The PG21 and LO13 relocs are pc-relative, while the
1842
         rest are GOT relative.  */
1843
0
      relocation = got_base + gotoff;
1844
0
      if (!(r_type == R_OR1K_TLS_GD_PG21
1845
0
      || r_type == R_OR1K_TLS_GD_LO13
1846
0
      || r_type == R_OR1K_TLS_IE_PG21
1847
0
      || r_type == R_OR1K_TLS_IE_LO13))
1848
0
        relocation -= got_sym_value;
1849
0
    }
1850
0
    break;
1851
1852
0
  case R_OR1K_TLS_LE_HI16:
1853
0
  case R_OR1K_TLS_LE_LO16:
1854
0
  case R_OR1K_TLS_LE_AHI16:
1855
0
  case R_OR1K_TLS_LE_SLO16:
1856
    /* Relocation is offset from TP.  */
1857
0
    relocation = tpoff (info, relocation, 0);
1858
0
    break;
1859
1860
0
  case R_OR1K_TLS_DTPMOD:
1861
0
  case R_OR1K_TLS_DTPOFF:
1862
0
  case R_OR1K_TLS_TPOFF:
1863
    /* These are resolved dynamically on load and shouldn't
1864
       be used as linker input.  */
1865
0
    BFD_FAIL ();
1866
0
    _bfd_error_handler
1867
0
      (_("%pB: will not resolve runtime TLS relocation"),
1868
0
       input_bfd);
1869
0
    bfd_set_error (bfd_error_bad_value);
1870
0
    return false;
1871
1872
0
  default:
1873
0
    break;
1874
0
  }
1875
1876
0
      r = or1k_final_link_relocate (howto, input_bfd, input_section, contents,
1877
0
            rel->r_offset, relocation + rel->r_addend);
1878
1879
0
      if (r != bfd_reloc_ok)
1880
0
  {
1881
0
    const char *msg = NULL;
1882
1883
0
    switch (r)
1884
0
      {
1885
0
      case bfd_reloc_overflow:
1886
0
        (*info->callbacks->reloc_overflow)
1887
0
    (info, (h ? &h->root : NULL), name, howto->name,
1888
0
     (bfd_vma) 0, input_bfd, input_section, rel->r_offset);
1889
0
        break;
1890
1891
0
      case bfd_reloc_undefined:
1892
0
        (*info->callbacks->undefined_symbol)
1893
0
    (info, name, input_bfd, input_section, rel->r_offset, true);
1894
0
        break;
1895
1896
0
      case bfd_reloc_outofrange:
1897
0
        msg = _("internal error: out of range error");
1898
0
        break;
1899
1900
0
      case bfd_reloc_notsupported:
1901
0
        msg = _("internal error: unsupported relocation error");
1902
0
        break;
1903
1904
0
      case bfd_reloc_dangerous:
1905
0
        msg = _("internal error: dangerous relocation");
1906
0
        break;
1907
1908
0
      default:
1909
0
        msg = _("internal error: unknown error");
1910
0
        break;
1911
0
      }
1912
1913
0
    if (msg)
1914
0
      (*info->callbacks->warning) (info, msg, name, input_bfd,
1915
0
           input_section, rel->r_offset);
1916
0
  }
1917
0
    }
1918
1919
0
  return ret_val;
1920
0
}
1921
1922
/* Return the section that should be marked against GC for a given
1923
   relocation.  */
1924
1925
static asection *
1926
or1k_elf_gc_mark_hook (asection *sec,
1927
           struct bfd_link_info *info,
1928
           Elf_Internal_Rela *rel,
1929
           struct elf_link_hash_entry *h,
1930
           Elf_Internal_Sym *sym)
1931
0
{
1932
0
  if (h != NULL)
1933
0
    switch (ELF32_R_TYPE (rel->r_info))
1934
0
      {
1935
0
      case R_OR1K_GNU_VTINHERIT:
1936
0
      case R_OR1K_GNU_VTENTRY:
1937
0
  return NULL;
1938
0
      }
1939
1940
0
  return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
1941
0
}
1942
1943
/* Look through the relocs for a section during the first phase.  */
1944
1945
static bool
1946
or1k_elf_check_relocs (bfd *abfd,
1947
           struct bfd_link_info *info,
1948
           asection *sec,
1949
           const Elf_Internal_Rela *relocs)
1950
0
{
1951
0
  Elf_Internal_Shdr *symtab_hdr;
1952
0
  struct elf_link_hash_entry **sym_hashes;
1953
0
  const Elf_Internal_Rela *rel;
1954
1955
0
  const Elf_Internal_Rela *rel_end;
1956
0
  struct elf_or1k_link_hash_table *htab;
1957
0
  bfd *dynobj;
1958
0
  asection *sreloc = NULL;
1959
1960
0
  if (bfd_link_relocatable (info))
1961
0
    return true;
1962
1963
0
  symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1964
0
  sym_hashes = elf_sym_hashes (abfd);
1965
1966
0
  htab = or1k_elf_hash_table (info);
1967
0
  if (htab == NULL)
1968
0
    return false;
1969
1970
0
  dynobj = htab->root.dynobj;
1971
1972
0
  rel_end = relocs + sec->reloc_count;
1973
0
  for (rel = relocs; rel < rel_end; rel++)
1974
0
    {
1975
0
      struct elf_link_hash_entry *h;
1976
0
      unsigned long r_symndx;
1977
0
      unsigned char tls_type;
1978
0
      int r_type;
1979
1980
0
      r_symndx = ELF32_R_SYM (rel->r_info);
1981
0
      if (r_symndx < symtab_hdr->sh_info)
1982
0
  h = NULL;
1983
0
      else
1984
0
  {
1985
0
    h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1986
0
    while (h->root.type == bfd_link_hash_indirect
1987
0
     || h->root.type == bfd_link_hash_warning)
1988
0
      h = (struct elf_link_hash_entry *) h->root.u.i.link;
1989
0
  }
1990
1991
0
      r_type = ELF32_R_TYPE (rel->r_info);
1992
0
      switch (r_type)
1993
0
  {
1994
0
  case R_OR1K_TLS_GD_HI16:
1995
0
  case R_OR1K_TLS_GD_LO16:
1996
0
  case R_OR1K_TLS_GD_PG21:
1997
0
  case R_OR1K_TLS_GD_LO13:
1998
0
    tls_type = TLS_GD;
1999
0
    break;
2000
0
  case R_OR1K_TLS_LDM_HI16:
2001
0
  case R_OR1K_TLS_LDM_LO16:
2002
0
  case R_OR1K_TLS_LDM_PG21:
2003
0
  case R_OR1K_TLS_LDM_LO13:
2004
0
  case R_OR1K_TLS_LDO_HI16:
2005
0
  case R_OR1K_TLS_LDO_LO16:
2006
0
    tls_type = TLS_LD;
2007
0
    break;
2008
0
  case R_OR1K_TLS_IE_HI16:
2009
0
  case R_OR1K_TLS_IE_LO16:
2010
0
  case R_OR1K_TLS_IE_PG21:
2011
0
  case R_OR1K_TLS_IE_LO13:
2012
0
  case R_OR1K_TLS_IE_AHI16:
2013
0
    tls_type = TLS_IE;
2014
0
    break;
2015
0
  case R_OR1K_TLS_LE_HI16:
2016
0
  case R_OR1K_TLS_LE_LO16:
2017
0
  case R_OR1K_TLS_LE_AHI16:
2018
0
  case R_OR1K_TLS_LE_SLO16:
2019
0
    tls_type = TLS_LE;
2020
0
    break;
2021
0
  default:
2022
0
    tls_type = TLS_NONE;
2023
0
  }
2024
2025
      /* Record TLS type.  */
2026
0
      if (h != NULL)
2027
0
    ((struct elf_or1k_link_hash_entry *) h)->tls_type |= tls_type;
2028
0
      else
2029
0
  {
2030
0
    unsigned char *local_tls_type;
2031
2032
    /* This is a TLS type record for a local symbol.  */
2033
0
    local_tls_type = (unsigned char *) elf_or1k_local_tls_type (abfd);
2034
0
    if (local_tls_type == NULL)
2035
0
      {
2036
0
        bfd_size_type size;
2037
2038
0
        size = symtab_hdr->sh_info;
2039
0
        local_tls_type = bfd_zalloc (abfd, size);
2040
0
        if (local_tls_type == NULL)
2041
0
    return false;
2042
0
        elf_or1k_local_tls_type (abfd) = local_tls_type;
2043
0
      }
2044
0
    local_tls_type[r_symndx] |= tls_type;
2045
0
  }
2046
2047
0
      switch (r_type)
2048
0
  {
2049
    /* This relocation describes the C++ object vtable hierarchy.
2050
       Reconstruct it for later use during GC.  */
2051
0
  case R_OR1K_GNU_VTINHERIT:
2052
0
    if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
2053
0
      return false;
2054
0
    break;
2055
2056
    /* This relocation describes which C++ vtable entries are actually
2057
       used.  Record for later use during GC.  */
2058
0
  case R_OR1K_GNU_VTENTRY:
2059
0
    if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
2060
0
      return false;
2061
0
    break;
2062
2063
    /* This relocation requires .plt entry.  */
2064
0
  case R_OR1K_PLTA26:
2065
0
    htab->saw_plta = true;
2066
    /* FALLTHRU */
2067
0
  case R_OR1K_PLT26:
2068
0
    if (h != NULL)
2069
0
      {
2070
0
        h->needs_plt = 1;
2071
0
        h->plt.refcount += 1;
2072
0
      }
2073
0
    break;
2074
2075
0
  case R_OR1K_GOT_AHI16:
2076
0
  case R_OR1K_GOT16:
2077
0
  case R_OR1K_GOT_PG21:
2078
0
  case R_OR1K_GOT_LO13:
2079
0
  case R_OR1K_TLS_GD_HI16:
2080
0
  case R_OR1K_TLS_GD_LO16:
2081
0
  case R_OR1K_TLS_GD_PG21:
2082
0
  case R_OR1K_TLS_GD_LO13:
2083
0
  case R_OR1K_TLS_IE_HI16:
2084
0
  case R_OR1K_TLS_IE_LO16:
2085
0
  case R_OR1K_TLS_IE_PG21:
2086
0
  case R_OR1K_TLS_IE_LO13:
2087
0
  case R_OR1K_TLS_IE_AHI16:
2088
0
        if (h != NULL)
2089
0
    h->got.refcount += 1;
2090
0
        else
2091
0
    {
2092
0
      bfd_signed_vma *local_got_refcounts;
2093
2094
      /* This is a global offset table entry for a local symbol.  */
2095
0
      local_got_refcounts = elf_local_got_refcounts (abfd);
2096
0
      if (local_got_refcounts == NULL)
2097
0
        {
2098
0
          bfd_size_type size;
2099
2100
0
          size = symtab_hdr->sh_info;
2101
0
          size *= sizeof (bfd_signed_vma);
2102
0
          local_got_refcounts = bfd_zalloc (abfd, size);
2103
0
          if (local_got_refcounts == NULL)
2104
0
      return false;
2105
0
          elf_local_got_refcounts (abfd) = local_got_refcounts;
2106
0
        }
2107
0
      local_got_refcounts[r_symndx] += 1;
2108
0
    }
2109
    /* FALLTHRU */
2110
2111
0
  case R_OR1K_GOTOFF_HI16:
2112
0
  case R_OR1K_GOTOFF_LO16:
2113
0
  case R_OR1K_GOTOFF_AHI16:
2114
0
  case R_OR1K_GOTOFF_SLO16:
2115
0
    if (htab->root.sgot == NULL)
2116
0
      {
2117
0
        if (dynobj == NULL)
2118
0
    htab->root.dynobj = dynobj = abfd;
2119
0
        if (!_bfd_elf_create_got_section (dynobj, info))
2120
0
    return false;
2121
0
      }
2122
0
    break;
2123
2124
0
  case R_OR1K_INSN_REL_26:
2125
0
  case R_OR1K_HI_16_IN_INSN:
2126
0
  case R_OR1K_LO_16_IN_INSN:
2127
0
  case R_OR1K_AHI16:
2128
0
  case R_OR1K_SLO16:
2129
0
  case R_OR1K_32:
2130
0
  case R_OR1K_PCREL_PG21:
2131
0
  case R_OR1K_LO13:
2132
0
  case R_OR1K_SLO13:
2133
0
    {
2134
0
      if (h != NULL && !bfd_link_pic (info))
2135
0
        {
2136
    /* We may need a copy reloc.  */
2137
0
    h->non_got_ref = 1;
2138
2139
    /* We may also need a .plt entry.  */
2140
0
    h->plt.refcount += 1;
2141
0
    if (r_type != R_OR1K_INSN_REL_26)
2142
0
      h->pointer_equality_needed = 1;
2143
0
        }
2144
2145
      /* If we are creating a shared library, and this is a reloc
2146
         against a global symbol, or a non PC relative reloc
2147
         against a local symbol, then we need to copy the reloc
2148
         into the shared library.  However, if we are linking with
2149
         -Bsymbolic, we do not need to copy a reloc against a
2150
         global symbol which is defined in an object we are
2151
         including in the link (i.e., DEF_REGULAR is set).  At
2152
         this point we have not seen all the input files, so it is
2153
         possible that DEF_REGULAR is not set now but will be set
2154
         later (it is never cleared).  In case of a weak definition,
2155
         DEF_REGULAR may be cleared later by a strong definition in
2156
         a shared library.  We account for that possibility below by
2157
         storing information in the relocs_copied field of the hash
2158
         table entry.  A similar situation occurs when creating
2159
         shared libraries and symbol visibility changes render the
2160
         symbol local.
2161
2162
         If on the other hand, we are creating an executable, we
2163
         may need to keep relocations for symbols satisfied by a
2164
         dynamic library if we manage to avoid copy relocs for the
2165
         symbol.  */
2166
2167
0
      if ((bfd_link_pic (info)
2168
0
     && (sec->flags & SEC_ALLOC) != 0
2169
0
     && (r_type != R_OR1K_INSN_REL_26
2170
0
         || (h != NULL
2171
0
       && (!SYMBOLIC_BIND (info, h)
2172
0
           || h->root.type == bfd_link_hash_defweak
2173
0
           || !h->def_regular))))
2174
0
    || (!bfd_link_pic (info)
2175
0
        && (sec->flags & SEC_ALLOC) != 0
2176
0
        && h != NULL
2177
0
        && (h->root.type == bfd_link_hash_defweak
2178
0
      || !h->def_regular)))
2179
0
        {
2180
0
    struct elf_dyn_relocs *sec_relocs;
2181
0
    struct elf_dyn_relocs **head;
2182
2183
    /* When creating a shared object, we must copy these
2184
       relocs into the output file.  We create a reloc
2185
       section in dynobj and make room for the reloc.  */
2186
0
    if (sreloc == NULL)
2187
0
      {
2188
0
        const char *name;
2189
0
        unsigned int strndx = elf_elfheader (abfd)->e_shstrndx;
2190
0
        unsigned int shnam = _bfd_elf_single_rel_hdr (sec)->sh_name;
2191
2192
0
        name = bfd_elf_string_from_elf_section (abfd, strndx, shnam);
2193
0
        if (name == NULL)
2194
0
          return false;
2195
2196
0
        if (!startswith (name, ".rela")
2197
0
      || strcmp (bfd_section_name (sec), name + 5) != 0)
2198
0
          {
2199
0
      _bfd_error_handler
2200
        /* xgettext:c-format */
2201
0
        (_("%pB: bad relocation section name `%s\'"),
2202
0
         abfd, name);
2203
0
          }
2204
2205
0
        if (htab->root.dynobj == NULL)
2206
0
          htab->root.dynobj = abfd;
2207
0
        dynobj = htab->root.dynobj;
2208
2209
0
        sreloc = bfd_get_section_by_name (dynobj, name);
2210
0
        if (sreloc == NULL)
2211
0
          {
2212
0
      sreloc = _bfd_elf_make_dynamic_reloc_section
2213
0
        (sec, dynobj, 2, abfd, /*rela?*/ true);
2214
2215
0
      if (sreloc == NULL)
2216
0
        return false;
2217
0
          }
2218
0
        elf_section_data (sec)->sreloc = sreloc;
2219
0
      }
2220
2221
    /* If this is a global symbol, we count the number of
2222
       relocations we need for this symbol.  */
2223
0
    if (h != NULL)
2224
0
      head = &h->dyn_relocs;
2225
0
    else
2226
0
      {
2227
        /* Track dynamic relocs needed for local syms too.
2228
           We really need local syms available to do this
2229
           easily.  Oh well.  */
2230
2231
0
        asection *s;
2232
0
        Elf_Internal_Sym *isym;
2233
0
        void *vpp;
2234
2235
0
        isym = bfd_sym_from_r_symndx (&htab->root.sym_cache,
2236
0
              abfd, r_symndx);
2237
0
        if (isym == NULL)
2238
0
          return false;
2239
2240
0
        s = bfd_section_from_elf_index (abfd, isym->st_shndx);
2241
0
        if (s == NULL)
2242
0
          return false;
2243
2244
0
        vpp = &elf_section_data (s)->local_dynrel;
2245
0
        head = (struct elf_dyn_relocs **) vpp;
2246
0
      }
2247
2248
0
    sec_relocs = *head;
2249
    /* Allocate this sections dynamic reolcations structure if this
2250
       is a new section.  */
2251
0
    if (sec_relocs == NULL || sec_relocs->sec != sec)
2252
0
      {
2253
0
        size_t amt = sizeof *sec_relocs;
2254
0
        sec_relocs = ((struct elf_dyn_relocs *)
2255
0
          bfd_alloc (htab->root.dynobj, amt));
2256
0
        if (sec_relocs == NULL)
2257
0
          return false;
2258
0
        sec_relocs->next = *head;
2259
0
        *head = sec_relocs;
2260
0
        sec_relocs->sec = sec;
2261
0
        sec_relocs->count = 0;
2262
0
        sec_relocs->pc_count = 0;
2263
0
      }
2264
2265
0
    sec_relocs->count += 1;
2266
0
    if (r_type == R_OR1K_INSN_REL_26)
2267
0
      sec_relocs->pc_count += 1;
2268
0
        }
2269
0
    }
2270
0
    break;
2271
0
  }
2272
0
    }
2273
2274
0
  return true;
2275
0
}
2276
2277
static void
2278
or1k_write_plt_entry (bfd *output_bfd, bfd_byte *contents, unsigned insnj,
2279
          unsigned insns[], size_t insn_count)
2280
0
{
2281
0
  unsigned nodelay = elf_elfheader (output_bfd)->e_flags & EF_OR1K_NODELAY;
2282
0
  unsigned output_insns[PLT_MAX_INSN_COUNT];
2283
2284
  /* Copy instructions into the output buffer.  */
2285
0
  for (size_t i = 0; i < insn_count; i++)
2286
0
    output_insns[i] = insns[i];
2287
2288
  /* Honor the no-delay-slot setting.  */
2289
0
  if (insns[insn_count-1] == OR1K_NOP)
2290
0
    {
2291
0
      unsigned slot1, slot2;
2292
2293
0
      if (nodelay)
2294
0
  slot1 = insns[insn_count-2], slot2 = insnj;
2295
0
      else
2296
0
  slot1 = insnj, slot2 = insns[insn_count-2];
2297
2298
0
      output_insns[insn_count-2] = slot1;
2299
0
      output_insns[insn_count-1] = slot2;
2300
0
      output_insns[insn_count]   = OR1K_NOP;
2301
0
    }
2302
0
  else
2303
0
    {
2304
0
      unsigned slot1, slot2;
2305
2306
0
      if (nodelay)
2307
0
  slot1 = insns[insn_count-1], slot2 = insnj;
2308
0
      else
2309
0
  slot1 = insnj, slot2 = insns[insn_count-1];
2310
2311
0
      output_insns[insn_count-1] = slot1;
2312
0
      output_insns[insn_count]   = slot2;
2313
0
    }
2314
2315
  /* Write out the output buffer.  */
2316
0
  for (size_t i = 0; i < (insn_count+1); i++)
2317
0
    bfd_put_32 (output_bfd, output_insns[i], contents + (i*4));
2318
0
}
2319
2320
/* Finish up the dynamic sections.  */
2321
2322
static bool
2323
or1k_elf_finish_dynamic_sections (bfd *output_bfd,
2324
          struct bfd_link_info *info)
2325
0
{
2326
0
  bfd *dynobj;
2327
0
  asection *sdyn, *sgot;
2328
0
  struct elf_or1k_link_hash_table *htab;
2329
2330
0
  htab = or1k_elf_hash_table (info);
2331
0
  if (htab == NULL)
2332
0
    return false;
2333
2334
0
  dynobj = htab->root.dynobj;
2335
2336
0
  sgot = htab->root.sgotplt;
2337
0
  sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
2338
2339
0
  if (htab->root.dynamic_sections_created)
2340
0
    {
2341
0
      asection *splt;
2342
0
      Elf32_External_Dyn *dyncon, *dynconend;
2343
2344
0
      BFD_ASSERT (sgot != NULL && sdyn != NULL);
2345
2346
0
      dyncon = (Elf32_External_Dyn *) sdyn->contents;
2347
0
      dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
2348
2349
0
      for (; dyncon < dynconend; dyncon++)
2350
0
  {
2351
0
    Elf_Internal_Dyn dyn;
2352
0
    asection *s;
2353
2354
0
    bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
2355
2356
0
    switch (dyn.d_tag)
2357
0
      {
2358
0
      default:
2359
0
        continue;
2360
2361
0
      case DT_PLTGOT:
2362
0
        s = htab->root.sgotplt;
2363
0
        dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
2364
0
        break;
2365
2366
0
      case DT_JMPREL:
2367
0
        s = htab->root.srelplt;
2368
0
        dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
2369
0
        break;
2370
2371
0
      case DT_PLTRELSZ:
2372
0
        s = htab->root.srelplt;
2373
0
        dyn.d_un.d_val = s->size;
2374
0
        break;
2375
0
      }
2376
0
    bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
2377
0
  }
2378
2379
2380
      /* Fill in the first entry in the procedure linkage table.  */
2381
0
      splt = htab->root.splt;
2382
0
      if (splt && splt->size > 0)
2383
0
  {
2384
0
    unsigned plt[PLT_MAX_INSN_COUNT];
2385
0
    size_t plt_insn_count = 3;
2386
0
    bfd_vma got_addr = sgot->output_section->vma + sgot->output_offset;
2387
2388
    /* Note we force 16 byte alignment on the .got, so that
2389
       the movhi/adrp can be shared between the two loads.  */
2390
2391
0
    if (htab->saw_plta)
2392
0
      {
2393
0
        bfd_vma pc = splt->output_section->vma + splt->output_offset;
2394
0
        unsigned pa = ((got_addr >> 13) - (pc >> 13)) & 0x1fffff;
2395
0
        unsigned po = got_addr & 0x1fff;
2396
0
        plt[0] = OR1K_ADRP(12) | pa;
2397
0
        plt[1] = OR1K_LWZ(15,12) | (po + 8);
2398
0
        plt[2] = OR1K_LWZ(12,12) | (po + 4);
2399
0
      }
2400
0
    else if (bfd_link_pic (info))
2401
0
      {
2402
0
        plt[0] = OR1K_LWZ(15, 16) | 8; /* .got+8 */
2403
0
        plt[1] = OR1K_LWZ(12, 16) | 4; /* .got+4 */
2404
0
        plt[2] = OR1K_NOP;
2405
0
      }
2406
0
    else
2407
0
      {
2408
0
        unsigned ha = ((got_addr + 0x8000) >> 16) & 0xffff;
2409
0
        unsigned lo = got_addr & 0xffff;
2410
0
        plt[0] = OR1K_MOVHI(12) | ha;
2411
0
        plt[1] = OR1K_LWZ(15,12) | (lo + 8);
2412
0
        plt[2] = OR1K_LWZ(12,12) | (lo + 4);
2413
0
      }
2414
2415
0
    or1k_write_plt_entry (output_bfd, splt->contents, OR1K_JR(15),
2416
0
        plt, plt_insn_count);
2417
2418
0
    elf_section_data (splt->output_section)->this_hdr.sh_entsize = 4;
2419
0
  }
2420
0
    }
2421
2422
  /* Set the first entry in the global offset table to the address of
2423
     the dynamic section.  */
2424
0
  if (sgot && sgot->size > 0)
2425
0
    {
2426
0
      if (sdyn == NULL)
2427
0
  bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents);
2428
0
      else
2429
0
  bfd_put_32 (output_bfd,
2430
0
        sdyn->output_section->vma + sdyn->output_offset,
2431
0
        sgot->contents);
2432
0
      elf_section_data (sgot->output_section)->this_hdr.sh_entsize = 4;
2433
0
    }
2434
2435
0
  if (htab->root.sgot && htab->root.sgot->size > 0)
2436
0
    elf_section_data (htab->root.sgot->output_section)->this_hdr.sh_entsize = 4;
2437
2438
0
  return true;
2439
0
}
2440
2441
/* Finish up dynamic symbol handling.  We set the contents of various
2442
   dynamic sections here.  */
2443
2444
static bool
2445
or1k_elf_finish_dynamic_symbol (bfd *output_bfd,
2446
        struct bfd_link_info *info,
2447
        struct elf_link_hash_entry *h,
2448
        Elf_Internal_Sym *sym)
2449
0
{
2450
0
  struct elf_or1k_link_hash_table *htab;
2451
0
  bfd_byte *loc;
2452
2453
0
  htab = or1k_elf_hash_table (info);
2454
0
  if (htab == NULL)
2455
0
    return false;
2456
2457
0
  if (h->plt.offset != (bfd_vma) -1)
2458
0
    {
2459
0
      unsigned int plt[PLT_MAX_INSN_COUNT];
2460
0
      size_t plt_insn_count = 3;
2461
0
      asection *splt;
2462
0
      asection *sgot;
2463
0
      asection *srela;
2464
0
      bfd_vma plt_base_addr;
2465
0
      bfd_vma plt_addr;
2466
0
      bfd_vma plt_index;
2467
0
      bfd_vma plt_reloc;
2468
0
      bfd_vma got_base_addr;
2469
0
      bfd_vma got_offset;
2470
0
      bfd_vma got_addr;
2471
0
      Elf_Internal_Rela rela;
2472
0
      bool large_plt_entry;
2473
2474
      /* This symbol has an entry in the procedure linkage table.  Set
2475
   it up.  */
2476
0
      BFD_ASSERT (h->dynindx != -1);
2477
2478
0
      splt = htab->root.splt;
2479
0
      sgot = htab->root.sgotplt;
2480
0
      srela = htab->root.srelplt;
2481
0
      BFD_ASSERT (splt != NULL && sgot != NULL && srela != NULL);
2482
2483
0
      plt_base_addr = splt->output_section->vma + splt->output_offset;
2484
0
      got_base_addr = sgot->output_section->vma + sgot->output_offset;
2485
2486
      /* Get the index in the procedure linkage table which
2487
   corresponds to this symbol.  This is the index of this symbol
2488
   in all the symbols for which we are making plt entries.  The
2489
   first entry in the procedure linkage table is reserved.  */
2490
0
      plt_index = ((struct elf_or1k_link_hash_entry *) h)->plt_index;
2491
0
      plt_addr = plt_base_addr + h->plt.offset;
2492
0
      plt_reloc = plt_index * sizeof (Elf32_External_Rela);
2493
2494
0
      large_plt_entry = (elf_or1k_plt_entry_size (plt_index)
2495
0
       == PLT_ENTRY_SIZE_LARGE);
2496
2497
      /* Get the offset into the .got table of the entry that
2498
  corresponds to this function.  Each .got entry is 4 bytes.
2499
  The first three are reserved.  */
2500
0
      got_offset = (plt_index + 3) * 4;
2501
0
      got_addr = got_base_addr + got_offset;
2502
2503
      /* Fill in the entry in the procedure linkage table.  */
2504
0
      if (htab->saw_plta)
2505
0
  {
2506
0
    unsigned pa = ((got_addr >> 13) - (plt_addr >> 13)) & 0x1fffff;
2507
0
    unsigned po = (got_addr & 0x1fff);
2508
0
    plt[0] = OR1K_ADRP(12) | pa;
2509
0
    plt[1] = OR1K_LWZ(12,12) | po;
2510
0
    plt[2] = OR1K_ORI0(11) | plt_reloc;
2511
0
  }
2512
0
      else if (bfd_link_pic (info))
2513
0
  {
2514
0
    if (large_plt_entry)
2515
0
      {
2516
0
        unsigned gotha = ((got_offset + 0x8000) >> 16) & 0xffff;
2517
0
        unsigned got = got_offset & 0xffff;
2518
0
        unsigned pltrelhi = (plt_reloc >> 16) & 0xffff;
2519
0
        unsigned pltrello = plt_reloc & 0xffff;
2520
2521
0
        plt[0] = OR1K_MOVHI(12) | gotha;
2522
0
        plt[1] = OR1K_ADD(12,12,16);
2523
0
        plt[2] = OR1K_LWZ(12,12) | got;
2524
0
        plt[3] = OR1K_MOVHI(11) | pltrelhi;
2525
0
        plt[4] = OR1K_ORI(11,11) | pltrello;
2526
0
        plt_insn_count = 5;
2527
0
      }
2528
0
    else
2529
0
      {
2530
0
        plt[0] = OR1K_LWZ(12,16) | got_offset;
2531
0
        plt[1] = OR1K_ORI0(11) | plt_reloc;
2532
0
        plt[2] = OR1K_NOP;
2533
0
      }
2534
0
  }
2535
0
      else
2536
0
  {
2537
0
    unsigned ha = ((got_addr + 0x8000) >> 16) & 0xffff;
2538
0
    unsigned lo = got_addr & 0xffff;
2539
0
    plt[0] = OR1K_MOVHI(12) | ha;
2540
0
    plt[1] = OR1K_LWZ(12,12) | lo;
2541
0
    plt[2] = OR1K_ORI0(11) | plt_reloc;
2542
0
  }
2543
2544
      /* For large code model we fixup the non-PIC PLT relocation instructions
2545
   here.  */
2546
0
      if (large_plt_entry && !bfd_link_pic (info))
2547
0
  {
2548
0
    unsigned pltrelhi = (plt_reloc >> 16) & 0xffff;
2549
0
    unsigned pltrello = plt_reloc & 0xffff;
2550
2551
0
    plt[2] = OR1K_MOVHI(11) | pltrelhi;
2552
0
    plt[3] = OR1K_ORI(11,11) | pltrello;
2553
0
    plt[4] = OR1K_NOP;
2554
0
    plt_insn_count = 5;
2555
0
  }
2556
2557
0
      or1k_write_plt_entry (output_bfd, splt->contents + h->plt.offset,
2558
0
          OR1K_JR(12), plt, plt_insn_count);
2559
2560
      /* Fill in the entry in the global offset table.  We initialize it to
2561
   point to the top of the plt.  This is done to lazy lookup the actual
2562
   symbol as the first plt entry will be setup by libc to call the
2563
   runtime dynamic linker.  */
2564
0
      bfd_put_32 (output_bfd, plt_base_addr, sgot->contents + got_offset);
2565
2566
      /* Fill in the entry in the .rela.plt section.  */
2567
0
      rela.r_offset = got_addr;
2568
0
      rela.r_info = ELF32_R_INFO (h->dynindx, R_OR1K_JMP_SLOT);
2569
0
      rela.r_addend = 0;
2570
0
      loc = srela->contents;
2571
0
      loc += plt_index * sizeof (Elf32_External_Rela);
2572
0
      bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
2573
2574
0
      if (!h->def_regular)
2575
0
  {
2576
    /* Mark the symbol as undefined, rather than as defined in
2577
       the .plt section.  Leave the value alone.  */
2578
0
    sym->st_shndx = SHN_UNDEF;
2579
0
  }
2580
0
    }
2581
2582
0
  if (h->got.offset != (bfd_vma) -1
2583
0
      && (h->got.offset & 2) == 0) /* Homemade TLS check.  */
2584
0
    {
2585
0
      asection *sgot;
2586
0
      asection *srelgot;
2587
0
      Elf_Internal_Rela rela;
2588
2589
      /* This symbol has an entry in the global offset table.  Set it
2590
   up.  */
2591
0
      sgot = htab->root.sgot;
2592
0
      srelgot = htab->root.srelgot;
2593
0
      BFD_ASSERT (sgot != NULL && srelgot != NULL);
2594
2595
0
      rela.r_offset = (sgot->output_section->vma
2596
0
           + sgot->output_offset
2597
0
           + (h->got.offset &~ 1));
2598
2599
      /* If this is a -Bsymbolic link, and the symbol is defined
2600
   locally, we just want to emit a RELATIVE reloc.  Likewise if
2601
   the symbol was forced to be local because of a version file.
2602
   The entry in the global offset table will already have been
2603
   initialized in the relocate_section function.  */
2604
0
      if (bfd_link_pic (info) && SYMBOL_REFERENCES_LOCAL (info, h))
2605
0
  {
2606
0
    rela.r_info = ELF32_R_INFO (0, R_OR1K_RELATIVE);
2607
0
    rela.r_addend = (h->root.u.def.value
2608
0
         + h->root.u.def.section->output_section->vma
2609
0
         + h->root.u.def.section->output_offset);
2610
0
  }
2611
0
      else
2612
0
  {
2613
0
    BFD_ASSERT ((h->got.offset & 1) == 0);
2614
0
    bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + h->got.offset);
2615
0
    rela.r_info = ELF32_R_INFO (h->dynindx, R_OR1K_GLOB_DAT);
2616
0
    rela.r_addend = 0;
2617
0
  }
2618
2619
0
      loc = srelgot->contents;
2620
0
      loc += srelgot->reloc_count * sizeof (Elf32_External_Rela);
2621
0
      bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
2622
0
      ++srelgot->reloc_count;
2623
0
    }
2624
2625
0
  if (h->needs_copy)
2626
0
    {
2627
0
      asection *s;
2628
0
      Elf_Internal_Rela rela;
2629
2630
      /* This symbols needs a copy reloc.  Set it up.  */
2631
0
      BFD_ASSERT (h->dynindx != -1
2632
0
      && (h->root.type == bfd_link_hash_defined
2633
0
          || h->root.type == bfd_link_hash_defweak));
2634
2635
0
      rela.r_offset = (h->root.u.def.value
2636
0
           + h->root.u.def.section->output_section->vma
2637
0
           + h->root.u.def.section->output_offset);
2638
0
      rela.r_info = ELF32_R_INFO (h->dynindx, R_OR1K_COPY);
2639
0
      rela.r_addend = 0;
2640
0
      if (h->root.u.def.section == htab->root.sdynrelro)
2641
0
  s = htab->root.sreldynrelro;
2642
0
      else
2643
0
  s = htab->root.srelbss;
2644
0
      loc = s->contents + s->reloc_count * sizeof (Elf32_External_Rela);
2645
0
      bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
2646
0
      ++s->reloc_count;
2647
0
    }
2648
2649
  /* Mark some specially defined symbols as absolute.  */
2650
0
  if (strcmp (h->root.root.string, "_DYNAMIC") == 0
2651
0
      || h == htab->root.hgot)
2652
0
    sym->st_shndx = SHN_ABS;
2653
2654
0
  return true;
2655
0
}
2656
2657
static enum elf_reloc_type_class
2658
or1k_elf_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED,
2659
         const asection *rel_sec ATTRIBUTE_UNUSED,
2660
         const Elf_Internal_Rela *rela)
2661
0
{
2662
0
  switch ((int) ELF32_R_TYPE (rela->r_info))
2663
0
    {
2664
0
    case R_OR1K_RELATIVE:  return reloc_class_relative;
2665
0
    case R_OR1K_JMP_SLOT:  return reloc_class_plt;
2666
0
    case R_OR1K_COPY:    return reloc_class_copy;
2667
0
    default:       return reloc_class_normal;
2668
0
    }
2669
0
}
2670
2671
/* Adjust a symbol defined by a dynamic object and referenced by a
2672
   regular object.  The current definition is in some section of the
2673
   dynamic object, but we're not including those sections.  We have to
2674
   change the definition to something the rest of the link can
2675
   understand.  */
2676
2677
static bool
2678
or1k_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
2679
        struct elf_link_hash_entry *h)
2680
0
{
2681
0
  struct elf_or1k_link_hash_table *htab;
2682
0
  bfd *dynobj;
2683
0
  asection *s, *srel;
2684
2685
0
  dynobj = elf_hash_table (info)->dynobj;
2686
2687
  /* Make sure we know what is going on here.  */
2688
0
  BFD_ASSERT (dynobj != NULL
2689
0
        && (h->needs_plt
2690
0
      || h->is_weakalias
2691
0
      || (h->def_dynamic
2692
0
          && h->ref_regular
2693
0
          && !h->def_regular)));
2694
2695
  /* If this is a function, put it in the procedure linkage table.  We
2696
     will fill in the contents of the procedure linkage table later,
2697
     when we know the address of the .got section.  */
2698
0
  if (h->type == STT_FUNC
2699
0
      || h->needs_plt)
2700
0
    {
2701
0
      if (h->plt.refcount <= 0
2702
0
    || (SYMBOL_CALLS_LOCAL (info, h)
2703
0
    || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
2704
0
        && h->root.type == bfd_link_hash_undefweak)))
2705
0
  {
2706
    /* This case can occur if we saw a PLT reloc in an input
2707
       file, but the symbol was never referred to by a dynamic
2708
       object.  In such a case, we don't actually need to build
2709
       a procedure linkage table, and we can just do a PCREL
2710
       reloc instead.  */
2711
0
    h->plt.offset = (bfd_vma) -1;
2712
0
    h->needs_plt = 0;
2713
0
  }
2714
2715
0
      return true;
2716
0
    }
2717
0
  else
2718
0
    h->plt.offset = (bfd_vma) -1;
2719
2720
  /* If this is a weak symbol, and there is a real definition, the
2721
     processor independent code will have arranged for us to see the
2722
     real definition first, and we can just use the same value.  */
2723
0
  if (h->is_weakalias)
2724
0
    {
2725
0
      struct elf_link_hash_entry *def = weakdef (h);
2726
0
      BFD_ASSERT (def->root.type == bfd_link_hash_defined);
2727
0
      h->root.u.def.section = def->root.u.def.section;
2728
0
      h->root.u.def.value = def->root.u.def.value;
2729
0
      return true;
2730
0
    }
2731
2732
  /* This is a reference to a symbol defined by a dynamic object which
2733
     is not a function.  */
2734
2735
  /* If we are creating a shared library, we must presume that the
2736
     only references to the symbol are via the global offset table.
2737
     For such cases we need not do anything here; the relocations will
2738
     be handled correctly by relocate_section.  */
2739
0
  if (bfd_link_pic (info))
2740
0
    return true;
2741
2742
  /* If there are no references to this symbol that do not use the
2743
     GOT, we don't need to generate a copy reloc.  */
2744
0
  if (!h->non_got_ref)
2745
0
    return true;
2746
2747
  /* If -z nocopyreloc was given, we won't generate them either.  */
2748
0
  if (info->nocopyreloc)
2749
0
    {
2750
0
      h->non_got_ref = 0;
2751
0
      return true;
2752
0
    }
2753
2754
  /* If we don't find any dynamic relocs in read-only sections, then
2755
     we'll be keeping the dynamic relocs and avoiding the copy reloc.  */
2756
0
  if (!_bfd_elf_readonly_dynrelocs (h))
2757
0
    {
2758
0
      h->non_got_ref = 0;
2759
0
      return true;
2760
0
    }
2761
2762
  /* We must allocate the symbol in our .dynbss section, which will
2763
     become part of the .bss section of the executable.  There will be
2764
     an entry for this symbol in the .dynsym section.  The dynamic
2765
     object will contain position independent code, so all references
2766
     from the dynamic object to this symbol will go through the global
2767
     offset table.  The dynamic linker will use the .dynsym entry to
2768
     determine the address it must put in the global offset table, so
2769
     both the dynamic object and the regular object will refer to the
2770
     same memory location for the variable.  */
2771
2772
0
  htab = or1k_elf_hash_table (info);
2773
0
  if (htab == NULL)
2774
0
    return false;
2775
2776
  /* We must generate a R_OR1K_COPY reloc to tell the dynamic linker
2777
     to copy the initial value out of the dynamic object and into the
2778
     runtime process image.  We need to remember the offset into the
2779
     .rela.bss section we are going to use.  */
2780
0
  if ((h->root.u.def.section->flags & SEC_READONLY) != 0)
2781
0
    {
2782
0
      s = htab->root.sdynrelro;
2783
0
      srel = htab->root.sreldynrelro;
2784
0
    }
2785
0
  else
2786
0
    {
2787
0
      s = htab->root.sdynbss;
2788
0
      srel = htab->root.srelbss;
2789
0
    }
2790
0
  if ((h->root.u.def.section->flags & SEC_ALLOC) != 0 && h->size != 0)
2791
0
    {
2792
0
      srel->size += sizeof (Elf32_External_Rela);
2793
0
      h->needs_copy = 1;
2794
0
    }
2795
2796
0
  return _bfd_elf_adjust_dynamic_copy (info, h, s);
2797
0
}
2798
2799
/* Caclulate an update the sizes required for a symbol in the GOT and
2800
   RELA relocation section based on the TLS_TYPE and whether or not the symbol
2801
   is DYNAMIC.
2802
2803
   Symbols with TLS_GD access require 8 bytes in the GOT and, if dynamic,
2804
   require two relocation entries.  Symbols with TLS_IE access require 4 bytes
2805
   in the GOT and, if dynamic, require one relocation entry.  Symbols may have
2806
   both TLS_GD and TLS_IE access to be accounted for.
2807
2808
   Other symbols require 4 bytes in the GOT table and, if dynamic, require one
2809
   relocation entry.  */
2810
2811
static void
2812
or1k_set_got_and_rela_sizes (const unsigned char tls_type,
2813
           const bool dynamic,
2814
           bfd_vma *got_size,
2815
           bfd_vma *rela_size)
2816
0
{
2817
0
  bool is_tls_entry = false;
2818
2819
  /* TLS GD requires two GOT entries and two relocs.  */
2820
0
  if ((tls_type & TLS_GD) != 0)
2821
0
    {
2822
0
      *got_size += 8;
2823
0
      is_tls_entry = true;
2824
0
    }
2825
2826
0
  if ((tls_type & TLS_IE) != 0)
2827
0
    {
2828
0
      *got_size += 4;
2829
0
      is_tls_entry = true;
2830
0
    }
2831
2832
0
  if (!is_tls_entry)
2833
0
    *got_size += 4;
2834
2835
0
  if (dynamic)
2836
0
    {
2837
0
      if ((tls_type & TLS_GD) != 0)
2838
0
  *rela_size += 2 * sizeof (Elf32_External_Rela);
2839
2840
0
      if ((tls_type & TLS_IE) != 0)
2841
0
  *rela_size += sizeof (Elf32_External_Rela);
2842
2843
0
      if (!is_tls_entry)
2844
0
  *rela_size += sizeof (Elf32_External_Rela);
2845
0
    }
2846
0
}
2847
2848
2849
/* Allocate space in .plt, .got and associated reloc sections for
2850
   dynamic relocs.  */
2851
2852
static bool
2853
allocate_dynrelocs (struct elf_link_hash_entry *h, void * inf)
2854
0
{
2855
0
  struct bfd_link_info *info;
2856
0
  struct elf_or1k_link_hash_table *htab;
2857
0
  struct elf_dyn_relocs *sec_relocs;
2858
2859
0
  if (h->root.type == bfd_link_hash_indirect)
2860
0
    return true;
2861
2862
0
  info = (struct bfd_link_info *) inf;
2863
0
  htab = or1k_elf_hash_table (info);
2864
0
  if (htab == NULL)
2865
0
    return false;
2866
2867
0
  if (htab->root.dynamic_sections_created
2868
0
      && h->plt.refcount > 0)
2869
0
    {
2870
      /* Make sure this symbol is output as a dynamic symbol.
2871
   Undefined weak syms won't yet be marked as dynamic.  */
2872
0
      if (h->dynindx == -1
2873
0
    && !h->forced_local)
2874
0
  {
2875
0
    if (! bfd_elf_link_record_dynamic_symbol (info, h))
2876
0
      return false;
2877
0
  }
2878
2879
0
      if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, bfd_link_pic (info), h))
2880
0
  {
2881
0
    asection *splt = htab->root.splt;
2882
0
    bfd_vma plt_index;
2883
2884
    /* Track the index of our plt entry for use in calculating size.  */
2885
0
    plt_index = htab->plt_count++;
2886
0
    ((struct elf_or1k_link_hash_entry *) h)->plt_index = plt_index;
2887
2888
    /* If this is the first .plt entry, make room for the special
2889
       first entry.  */
2890
0
    if (splt->size == 0)
2891
0
      splt->size = elf_or1k_plt_entry_size (plt_index);
2892
2893
0
    h->plt.offset = splt->size;
2894
2895
    /* If this symbol is not defined in a regular file, and we are
2896
       not generating a shared library, then set the symbol to this
2897
       location in the .plt.  This is required to make function
2898
       pointers compare as equal between the normal executable and
2899
       the shared library.  */
2900
0
    if (! bfd_link_pic (info)
2901
0
        && !h->def_regular)
2902
0
      {
2903
0
        h->root.u.def.section = splt;
2904
0
        h->root.u.def.value = h->plt.offset;
2905
0
      }
2906
2907
    /* Make room for this entry.  */
2908
0
    splt->size += elf_or1k_plt_entry_size (plt_index);
2909
2910
    /* We also need to make an entry in the .got.plt section, which
2911
       will be placed in the .got section by the linker script.  */
2912
0
    htab->root.sgotplt->size += 4;
2913
2914
    /* We also need to make an entry in the .rel.plt section.  */
2915
0
    htab->root.srelplt->size += sizeof (Elf32_External_Rela);
2916
0
  }
2917
0
      else
2918
0
  {
2919
0
    h->plt.offset = (bfd_vma) -1;
2920
0
    h->needs_plt = 0;
2921
0
  }
2922
0
    }
2923
0
  else
2924
0
    {
2925
0
      h->plt.offset = (bfd_vma) -1;
2926
0
      h->needs_plt = 0;
2927
0
    }
2928
2929
0
  if (h->got.refcount > 0)
2930
0
    {
2931
0
      asection *sgot;
2932
0
      bool dyn;
2933
0
      unsigned char tls_type;
2934
2935
      /* Make sure this symbol is output as a dynamic symbol.
2936
   Undefined weak syms won't yet be marked as dynamic.  */
2937
0
      if (h->dynindx == -1
2938
0
    && !h->forced_local)
2939
0
  {
2940
0
    if (! bfd_elf_link_record_dynamic_symbol (info, h))
2941
0
      return false;
2942
0
  }
2943
2944
0
      sgot = htab->root.sgot;
2945
2946
0
      h->got.offset = sgot->size;
2947
2948
0
      tls_type = ((struct elf_or1k_link_hash_entry *) h)->tls_type;
2949
2950
0
      dyn = htab->root.dynamic_sections_created;
2951
0
      dyn = WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, bfd_link_pic (info), h);
2952
0
      or1k_set_got_and_rela_sizes (tls_type, dyn,
2953
0
           &sgot->size, &htab->root.srelgot->size);
2954
0
    }
2955
0
  else
2956
0
    h->got.offset = (bfd_vma) -1;
2957
2958
0
  if (h->dyn_relocs == NULL)
2959
0
    return true;
2960
2961
  /* In the shared -Bsymbolic case, discard space allocated for
2962
     dynamic pc-relative relocs against symbols which turn out to be
2963
     defined in regular objects.  For the normal shared case, discard
2964
     space for pc-relative relocs that have become local due to symbol
2965
     visibility changes.  */
2966
2967
0
  if (bfd_link_pic (info))
2968
0
    {
2969
0
      if (SYMBOL_CALLS_LOCAL (info, h))
2970
0
  {
2971
0
    struct elf_dyn_relocs **pp;
2972
2973
0
    for (pp = &h->dyn_relocs; (sec_relocs = *pp) != NULL;)
2974
0
      {
2975
0
        sec_relocs->count -= sec_relocs->pc_count;
2976
0
        sec_relocs->pc_count = 0;
2977
0
        if (sec_relocs->count == 0)
2978
0
    *pp = sec_relocs->next;
2979
0
        else
2980
0
    pp = &sec_relocs->next;
2981
0
      }
2982
0
  }
2983
2984
      /* Also discard relocs on undefined weak syms with non-default
2985
   visibility.  */
2986
0
      if (h->dyn_relocs != NULL
2987
0
    && h->root.type == bfd_link_hash_undefweak)
2988
0
  {
2989
0
    if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
2990
0
      h->dyn_relocs = NULL;
2991
2992
    /* Make sure undefined weak symbols are output as a dynamic
2993
       symbol in PIEs.  */
2994
0
    else if (h->dynindx == -1
2995
0
       && !h->forced_local)
2996
0
      {
2997
0
        if (! bfd_elf_link_record_dynamic_symbol (info, h))
2998
0
    return false;
2999
0
      }
3000
0
  }
3001
0
    }
3002
0
  else
3003
0
    {
3004
      /* For the non-shared case, discard space for relocs against
3005
   symbols which turn out to need copy relocs or are not
3006
   dynamic.  */
3007
3008
0
      if (!h->non_got_ref
3009
0
    && ((h->def_dynamic
3010
0
         && !h->def_regular)
3011
0
        || (htab->root.dynamic_sections_created
3012
0
      && (h->root.type == bfd_link_hash_undefweak
3013
0
          || h->root.type == bfd_link_hash_undefined))))
3014
0
  {
3015
    /* Make sure this symbol is output as a dynamic symbol.
3016
       Undefined weak syms won't yet be marked as dynamic.  */
3017
0
    if (h->dynindx == -1
3018
0
        && !h->forced_local)
3019
0
      {
3020
0
        if (! bfd_elf_link_record_dynamic_symbol (info, h))
3021
0
    return false;
3022
0
      }
3023
3024
    /* If that succeeded, we know we'll be keeping all the
3025
       relocs.  */
3026
0
    if (h->dynindx != -1)
3027
0
      goto keep;
3028
0
  }
3029
3030
0
      h->dyn_relocs = NULL;
3031
3032
0
    keep: ;
3033
0
    }
3034
3035
  /* Finally, allocate space.  */
3036
0
  for (sec_relocs = h->dyn_relocs;
3037
0
       sec_relocs != NULL;
3038
0
       sec_relocs = sec_relocs->next)
3039
0
    {
3040
0
      asection *sreloc = elf_section_data (sec_relocs->sec)->sreloc;
3041
0
      sreloc->size += sec_relocs->count * sizeof (Elf32_External_Rela);
3042
0
    }
3043
3044
0
  return true;
3045
0
}
3046
3047
/* Set the sizes of the dynamic sections.  */
3048
3049
static bool
3050
or1k_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
3051
        struct bfd_link_info *info)
3052
0
{
3053
0
  struct elf_or1k_link_hash_table *htab;
3054
0
  bfd *dynobj;
3055
0
  asection *s;
3056
0
  bool relocs;
3057
0
  bfd *ibfd;
3058
3059
0
  htab = or1k_elf_hash_table (info);
3060
0
  if (htab == NULL)
3061
0
    return false;
3062
3063
0
  dynobj = htab->root.dynobj;
3064
0
  BFD_ASSERT (dynobj != NULL);
3065
3066
0
  if (htab->root.dynamic_sections_created)
3067
0
    {
3068
      /* Set the contents of the .interp section to the interpreter.  */
3069
0
      if (bfd_link_executable (info) && !info->nointerp)
3070
0
  {
3071
0
    s = bfd_get_section_by_name (dynobj, ".interp");
3072
0
    BFD_ASSERT (s != NULL);
3073
0
    s->size = sizeof ELF_DYNAMIC_INTERPRETER;
3074
0
    s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
3075
0
  }
3076
0
    }
3077
3078
  /* Set up .got offsets for local syms, and space for local dynamic
3079
     relocs.  */
3080
0
  for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
3081
0
    {
3082
0
      bfd_signed_vma *local_got;
3083
0
      bfd_signed_vma *end_local_got;
3084
0
      bfd_size_type locsymcount;
3085
0
      Elf_Internal_Shdr *symtab_hdr;
3086
0
      unsigned char *local_tls_type;
3087
0
      asection *srel;
3088
3089
0
      if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour)
3090
0
  continue;
3091
3092
0
      for (s = ibfd->sections; s != NULL; s = s->next)
3093
0
  {
3094
0
    struct elf_dyn_relocs *sec_relocs;
3095
3096
0
    for (sec_relocs = ((struct elf_dyn_relocs *)
3097
0
           elf_section_data (s)->local_dynrel);
3098
0
         sec_relocs != NULL;
3099
0
         sec_relocs = sec_relocs->next)
3100
0
      {
3101
0
        if (! bfd_is_abs_section (sec_relocs->sec)
3102
0
      && bfd_is_abs_section (sec_relocs->sec->output_section))
3103
0
    {
3104
      /* Input section has been discarded, either because
3105
         it is a copy of a linkonce section or due to
3106
         linker script /DISCARD/, so we'll be discarding
3107
         the relocs too.  */
3108
0
    }
3109
0
        else if (sec_relocs->count != 0)
3110
0
    {
3111
0
      srel = elf_section_data (sec_relocs->sec)->sreloc;
3112
0
      srel->size += sec_relocs->count
3113
0
        * sizeof (Elf32_External_Rela);
3114
0
      if ((sec_relocs->sec->output_section->flags & SEC_READONLY)
3115
0
          != 0)
3116
0
        info->flags |= DF_TEXTREL;
3117
0
    }
3118
0
      }
3119
0
  }
3120
3121
0
      local_got = elf_local_got_refcounts (ibfd);
3122
0
      if (!local_got)
3123
0
  continue;
3124
3125
0
      symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
3126
0
      locsymcount = symtab_hdr->sh_info;
3127
0
      end_local_got = local_got + locsymcount;
3128
0
      s = htab->root.sgot;
3129
0
      srel = htab->root.srelgot;
3130
0
      local_tls_type = (unsigned char *) elf_or1k_local_tls_type (ibfd);
3131
0
      for (; local_got < end_local_got; ++local_got)
3132
0
  {
3133
0
    if (*local_got > 0)
3134
0
      {
3135
0
        unsigned char tls_type = (local_tls_type == NULL)
3136
0
          ? TLS_UNKNOWN
3137
0
          : *local_tls_type;
3138
3139
0
        *local_got = s->size;
3140
0
        or1k_set_got_and_rela_sizes (tls_type, bfd_link_pic (info),
3141
0
             &s->size, &srel->size);
3142
0
      }
3143
0
    else
3144
3145
0
      *local_got = (bfd_vma) -1;
3146
3147
0
    if (local_tls_type)
3148
0
      ++local_tls_type;
3149
0
  }
3150
0
    }
3151
3152
  /* Allocate global sym .plt and .got entries, and space for global
3153
     sym dynamic relocs.  */
3154
0
  elf_link_hash_traverse (&htab->root, allocate_dynrelocs, info);
3155
3156
  /* We now have determined the sizes of the various dynamic sections.
3157
     Allocate memory for them.  */
3158
0
  relocs = false;
3159
0
  for (s = dynobj->sections; s != NULL; s = s->next)
3160
0
    {
3161
0
      if ((s->flags & SEC_LINKER_CREATED) == 0)
3162
0
  continue;
3163
3164
0
      if (s == htab->root.splt
3165
0
    || s == htab->root.sgot
3166
0
    || s == htab->root.sgotplt
3167
0
    || s == htab->root.sdynbss
3168
0
    || s == htab->root.sdynrelro)
3169
0
  {
3170
    /* Strip this section if we don't need it; see the
3171
       comment below.  */
3172
0
  }
3173
0
      else if (startswith (bfd_section_name (s), ".rela"))
3174
0
  {
3175
0
    if (s->size != 0 && s != htab->root.srelplt)
3176
0
      relocs = true;
3177
3178
    /* We use the reloc_count field as a counter if we need
3179
       to copy relocs into the output file.  */
3180
0
    s->reloc_count = 0;
3181
0
  }
3182
0
      else
3183
  /* It's not one of our sections, so don't allocate space.  */
3184
0
  continue;
3185
3186
0
      if (s->size == 0)
3187
0
  {
3188
    /* If we don't need this section, strip it from the
3189
       output file.  This is mostly to handle .rela.bss and
3190
       .rela.plt.  We must create both sections in
3191
       create_dynamic_sections, because they must be created
3192
       before the linker maps input sections to output
3193
       sections.  The linker does that before
3194
       adjust_dynamic_symbol is called, and it is that
3195
       function which decides whether anything needs to go
3196
       into these sections.  */
3197
0
    s->flags |= SEC_EXCLUDE;
3198
0
    continue;
3199
0
  }
3200
3201
0
      if ((s->flags & SEC_HAS_CONTENTS) == 0)
3202
0
  continue;
3203
3204
      /* Allocate memory for the section contents.  We use bfd_zalloc
3205
   here in case unused entries are not reclaimed before the
3206
   section's contents are written out.  This should not happen,
3207
   but this way if it does, we get a R_OR1K_NONE reloc instead
3208
   of garbage.  */
3209
0
      s->contents = bfd_zalloc (dynobj, s->size);
3210
3211
0
      if (s->contents == NULL)
3212
0
  return false;
3213
0
    }
3214
3215
0
  return _bfd_elf_add_dynamic_tags (output_bfd, info, relocs);
3216
0
}
3217
3218
/* Copy the extra info we tack onto an elf_link_hash_entry.  */
3219
3220
static void
3221
or1k_elf_copy_indirect_symbol (struct bfd_link_info *info,
3222
             struct elf_link_hash_entry *dir,
3223
             struct elf_link_hash_entry *ind)
3224
0
{
3225
0
  struct elf_or1k_link_hash_entry * edir;
3226
0
  struct elf_or1k_link_hash_entry * eind;
3227
3228
0
  edir = (struct elf_or1k_link_hash_entry *) dir;
3229
0
  eind = (struct elf_or1k_link_hash_entry *) ind;
3230
3231
0
  if (ind->root.type == bfd_link_hash_indirect)
3232
0
    {
3233
0
      if (dir->got.refcount <= 0)
3234
0
  {
3235
0
    edir->tls_type = eind->tls_type;
3236
0
    eind->tls_type = TLS_UNKNOWN;
3237
0
  }
3238
0
    }
3239
3240
0
  _bfd_elf_link_hash_copy_indirect (info, dir, ind);
3241
0
}
3242
3243
/* Set the right machine number.  */
3244
3245
static bool
3246
or1k_elf_object_p (bfd *abfd)
3247
0
{
3248
0
  unsigned long mach = bfd_mach_or1k;
3249
3250
0
  if (elf_elfheader (abfd)->e_flags & EF_OR1K_NODELAY)
3251
0
    mach = bfd_mach_or1knd;
3252
3253
0
  return bfd_default_set_arch_mach (abfd, bfd_arch_or1k, mach);
3254
0
}
3255
3256
/* Store the machine number in the flags field.  */
3257
3258
static bool
3259
or1k_elf_final_write_processing (bfd *abfd)
3260
0
{
3261
0
  switch (bfd_get_mach (abfd))
3262
0
    {
3263
0
    default:
3264
0
    case bfd_mach_or1k:
3265
0
      break;
3266
0
    case bfd_mach_or1knd:
3267
0
      elf_elfheader (abfd)->e_flags |= EF_OR1K_NODELAY;
3268
0
      break;
3269
0
    }
3270
0
  return _bfd_elf_final_write_processing (abfd);
3271
0
}
3272
3273
static bool
3274
or1k_elf_set_private_flags (bfd *abfd, flagword flags)
3275
0
{
3276
0
  BFD_ASSERT (!elf_flags_init (abfd)
3277
0
        || elf_elfheader (abfd)->e_flags == flags);
3278
3279
0
  elf_elfheader (abfd)->e_flags = flags;
3280
0
  elf_flags_init (abfd) = true;
3281
0
  return true;
3282
0
}
3283
3284
/* Make sure all input files are consistent with respect to
3285
   EF_OR1K_NODELAY flag setting.  */
3286
3287
static bool
3288
elf32_or1k_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
3289
0
{
3290
0
  bfd *obfd = info->output_bfd;
3291
0
  flagword out_flags;
3292
0
  flagword in_flags;
3293
3294
0
  in_flags  = elf_elfheader (ibfd)->e_flags;
3295
0
  out_flags = elf_elfheader (obfd)->e_flags;
3296
3297
0
  if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
3298
0
      || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
3299
0
    return true;
3300
3301
0
  if (!elf_flags_init (obfd))
3302
0
    {
3303
0
      elf_flags_init (obfd) = true;
3304
0
      elf_elfheader (obfd)->e_flags = in_flags;
3305
3306
0
      return true;
3307
0
    }
3308
3309
0
  if (in_flags == out_flags)
3310
0
    return true;
3311
3312
0
  if ((in_flags & EF_OR1K_NODELAY) != (out_flags & EF_OR1K_NODELAY))
3313
0
    {
3314
0
      _bfd_error_handler
3315
0
  (_("%pB: %s flag mismatch with previous modules"),
3316
0
   ibfd, "EF_OR1K_NODELAY");
3317
3318
0
      bfd_set_error (bfd_error_bad_value);
3319
0
      return false;
3320
0
    }
3321
3322
0
  return true;
3323
3324
0
}
3325
3326
/* Implement elf_backend_grok_prstatus:
3327
   Support for core dump NOTE sections.  */
3328
static bool
3329
or1k_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
3330
0
{
3331
0
  int offset;
3332
0
  size_t size;
3333
3334
0
  switch (note->descsz)
3335
0
    {
3336
0
    default:
3337
0
      return false;
3338
3339
0
    case 212:       /* Linux/OpenRISC */
3340
      /* pr_cursig */
3341
0
      elf_tdata (abfd)->core->signal = bfd_get_16 (abfd, note->descdata + 12);
3342
3343
      /* pr_pid */
3344
0
      elf_tdata (abfd)->core->pid = bfd_get_32 (abfd, note->descdata + 24);
3345
3346
      /* pr_reg */
3347
0
      offset = 72;
3348
0
      size = 132;
3349
3350
0
      break;
3351
0
    }
3352
3353
  /* Make a ".reg/999" section.  */
3354
0
  return _bfd_elfcore_make_pseudosection (abfd, ".reg",
3355
0
            size, note->descpos + offset);
3356
0
}
3357
3358
/* Implement elf_backend_grok_psinfo.  */
3359
static bool
3360
or1k_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
3361
0
{
3362
0
  switch (note->descsz)
3363
0
    {
3364
0
    default:
3365
0
      return false;
3366
3367
0
    case 128:       /* Linux/OpenRISC elf_prpsinfo */
3368
0
      elf_tdata (abfd)->core->program
3369
0
  = _bfd_elfcore_strndup (abfd, note->descdata + 32, 16);
3370
0
      elf_tdata (abfd)->core->command
3371
0
  = _bfd_elfcore_strndup (abfd, note->descdata + 48, 80);
3372
0
    }
3373
3374
0
  return true;
3375
0
}
3376
3377
3378
#define ELF_ARCH      bfd_arch_or1k
3379
#define ELF_MACHINE_CODE    EM_OR1K
3380
#define ELF_TARGET_ID     OR1K_ELF_DATA
3381
#define ELF_MAXPAGESIZE     0x2000
3382
3383
#define TARGET_BIG_SYM      or1k_elf32_vec
3384
#define TARGET_BIG_NAME     "elf32-or1k"
3385
3386
#define elf_info_to_howto_rel   NULL
3387
#define elf_info_to_howto   or1k_info_to_howto_rela
3388
#define elf_backend_relocate_section  or1k_elf_relocate_section
3389
#define elf_backend_gc_mark_hook  or1k_elf_gc_mark_hook
3390
#define elf_backend_check_relocs  or1k_elf_check_relocs
3391
#define elf_backend_reloc_type_class  or1k_elf_reloc_type_class
3392
#define elf_backend_can_gc_sections 1
3393
#define elf_backend_rela_normal   1
3394
3395
#define bfd_elf32_mkobject         elf_or1k_mkobject
3396
3397
#define bfd_elf32_bfd_merge_private_bfd_data elf32_or1k_merge_private_bfd_data
3398
#define bfd_elf32_bfd_set_private_flags or1k_elf_set_private_flags
3399
#define bfd_elf32_bfd_reloc_type_lookup or1k_reloc_type_lookup
3400
#define bfd_elf32_bfd_reloc_name_lookup or1k_reloc_name_lookup
3401
3402
#define elf_backend_object_p        or1k_elf_object_p
3403
#define elf_backend_final_write_processing  or1k_elf_final_write_processing
3404
#define elf_backend_can_refcount    1
3405
3406
#define elf_backend_plt_readonly    1
3407
#define elf_backend_want_got_plt    1
3408
#define elf_backend_want_plt_sym    0
3409
#define elf_backend_got_header_size   12
3410
#define elf_backend_dtrel_excludes_plt    1
3411
#define elf_backend_want_dynrelro   1
3412
3413
#define bfd_elf32_bfd_link_hash_table_create  or1k_elf_link_hash_table_create
3414
#define elf_backend_copy_indirect_symbol  or1k_elf_copy_indirect_symbol
3415
#define elf_backend_create_dynamic_sections _bfd_elf_create_dynamic_sections
3416
#define elf_backend_finish_dynamic_sections or1k_elf_finish_dynamic_sections
3417
#define elf_backend_size_dynamic_sections or1k_elf_size_dynamic_sections
3418
#define elf_backend_adjust_dynamic_symbol or1k_elf_adjust_dynamic_symbol
3419
#define elf_backend_finish_dynamic_symbol or1k_elf_finish_dynamic_symbol
3420
3421
#define elf_backend_grok_prstatus   or1k_grok_prstatus
3422
#define elf_backend_grok_psinfo     or1k_grok_psinfo
3423
3424
#include "elf32-target.h"