Coverage Report

Created: 2026-03-10 08:46

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/binutils-gdb/bfd/elf32-bfin.c
Line
Count
Source
1
/* ADI Blackfin BFD support for 32-bit ELF.
2
   Copyright (C) 2005-2026 Free Software Foundation, Inc.
3
4
   This file is part of BFD, the Binary File Descriptor library.
5
6
   This program is free software; you can redistribute it and/or modify
7
   it under the terms of the GNU General Public License as published by
8
   the Free Software Foundation; either version 3 of the License, or
9
   (at your option) any later version.
10
11
   This program is distributed in the hope that it will be useful,
12
   but WITHOUT ANY WARRANTY; without even the implied warranty of
13
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
   GNU General Public License for more details.
15
16
   You should have received a copy of the GNU General Public License
17
   along with this program; if not, write to the Free Software
18
   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
19
   MA 02110-1301, USA.  */
20
21
#include "sysdep.h"
22
#include "bfd.h"
23
#include "libbfd.h"
24
#include "elf-bfd.h"
25
#include "elf/bfin.h"
26
#include "dwarf2.h"
27
#include "hashtab.h"
28
#include "elf32-bfin.h"
29
30
/* FUNCTION : bfin_pltpc_reloc
31
   ABSTRACT : TODO : figure out how to handle pltpc relocs.  */
32
static bfd_reloc_status_type
33
bfin_pltpc_reloc (
34
     bfd *abfd ATTRIBUTE_UNUSED,
35
     arelent *reloc_entry ATTRIBUTE_UNUSED,
36
     asymbol *symbol ATTRIBUTE_UNUSED,
37
     void * data ATTRIBUTE_UNUSED,
38
     asection *input_section ATTRIBUTE_UNUSED,
39
     bfd *output_bfd ATTRIBUTE_UNUSED,
40
     char **error_message ATTRIBUTE_UNUSED)
41
0
{
42
0
  bfd_reloc_status_type flag = bfd_reloc_ok;
43
0
  return flag;
44
0
}
45

46
47
static bfd_reloc_status_type
48
bfin_pcrel24_reloc (bfd *abfd,
49
        arelent *reloc_entry,
50
        asymbol *symbol,
51
        void * data,
52
        asection *input_section,
53
        bfd *output_bfd,
54
        char **error_message ATTRIBUTE_UNUSED)
55
0
{
56
0
  bfd_vma relocation;
57
0
  bfd_size_type addr = reloc_entry->address;
58
0
  bfd_vma output_base = 0;
59
0
  reloc_howto_type *howto = reloc_entry->howto;
60
0
  asection *output_section;
61
0
  bool relocatable = (output_bfd != NULL);
62
63
0
  if (!bfd_reloc_offset_in_range (howto, abfd, input_section, addr - 2))
64
0
    return bfd_reloc_outofrange;
65
66
0
  if (bfd_is_und_section (symbol->section)
67
0
      && (symbol->flags & BSF_WEAK) == 0
68
0
      && !relocatable)
69
0
    return bfd_reloc_undefined;
70
71
0
  if (bfd_is_com_section (symbol->section))
72
0
    relocation = 0;
73
0
  else
74
0
    relocation = symbol->value;
75
76
0
  output_section = symbol->section->output_section;
77
78
0
  if (relocatable)
79
0
    output_base = 0;
80
0
  else
81
0
    output_base = output_section->vma;
82
83
0
  if (!relocatable || !strcmp (symbol->name, symbol->section->name))
84
0
    relocation += output_base + symbol->section->output_offset;
85
86
0
  if (!relocatable && !strcmp (symbol->name, symbol->section->name))
87
0
    relocation += reloc_entry->addend;
88
89
0
  relocation -= input_section->output_section->vma + input_section->output_offset;
90
0
  relocation -= reloc_entry->address;
91
92
0
  if (howto->complain_on_overflow != complain_overflow_dont)
93
0
    {
94
0
      bfd_reloc_status_type status;
95
0
      status = bfd_check_overflow (howto->complain_on_overflow,
96
0
           howto->bitsize,
97
0
           howto->rightshift,
98
0
           bfd_arch_bits_per_address(abfd),
99
0
           relocation);
100
0
      if (status != bfd_reloc_ok)
101
0
  return status;
102
0
    }
103
104
  /* if rightshift is 1 and the number odd, return error.  */
105
0
  if (howto->rightshift && (relocation & 0x01))
106
0
    {
107
0
      _bfd_error_handler (_("relocation should be even number"));
108
0
      return bfd_reloc_overflow;
109
0
    }
110
111
0
  relocation >>= (bfd_vma) howto->rightshift;
112
  /* Shift everything up to where it's going to be used.  */
113
114
0
  relocation <<= (bfd_vma) howto->bitpos;
115
116
0
  if (relocatable)
117
0
    {
118
0
      reloc_entry->address += input_section->output_offset;
119
0
      reloc_entry->addend += symbol->section->output_offset;
120
0
    }
121
122
0
  {
123
0
    short x;
124
125
    /* We are getting reloc_entry->address 2 byte off from
126
       the start of instruction. Assuming absolute postion
127
       of the reloc data. But, following code had been written assuming
128
       reloc address is starting at begining of instruction.
129
       To compensate that I have increased the value of
130
       relocation by 1 (effectively 2) and used the addr -2 instead of addr.  */
131
132
0
    relocation += 1;
133
0
    x = bfd_get_16 (abfd, (bfd_byte *) data + addr - 2);
134
0
    x = (x & 0xff00) | ((relocation >> 16) & 0xff);
135
0
    bfd_put_16 (abfd, x, (unsigned char *) data + addr - 2);
136
137
0
    x = bfd_get_16 (abfd, (bfd_byte *) data + addr);
138
0
    x = relocation & 0xFFFF;
139
0
    bfd_put_16 (abfd, x, (unsigned char *) data + addr );
140
0
  }
141
0
  return bfd_reloc_ok;
142
0
}
143
144
static bfd_reloc_status_type
145
bfin_imm16_reloc (bfd *abfd,
146
      arelent *reloc_entry,
147
      asymbol *symbol,
148
      void * data,
149
      asection *input_section,
150
      bfd *output_bfd,
151
      char **error_message ATTRIBUTE_UNUSED)
152
0
{
153
0
  bfd_vma relocation, x;
154
0
  bfd_size_type reloc_addr = reloc_entry->address;
155
0
  bfd_vma output_base = 0;
156
0
  reloc_howto_type *howto = reloc_entry->howto;
157
0
  asection *output_section;
158
0
  bool relocatable = (output_bfd != NULL);
159
160
  /* Is the address of the relocation really within the section?  */
161
0
  if (!bfd_reloc_offset_in_range (howto, abfd, input_section, reloc_addr))
162
0
    return bfd_reloc_outofrange;
163
164
0
  if (bfd_is_und_section (symbol->section)
165
0
      && (symbol->flags & BSF_WEAK) == 0
166
0
      && !relocatable)
167
0
    return bfd_reloc_undefined;
168
169
0
  output_section = symbol->section->output_section;
170
0
  relocation = symbol->value;
171
172
  /* Convert input-section-relative symbol value to absolute.  */
173
0
  if (relocatable)
174
0
    output_base = 0;
175
0
  else
176
0
    output_base = output_section->vma;
177
178
0
  if (!relocatable || !strcmp (symbol->name, symbol->section->name))
179
0
    relocation += output_base + symbol->section->output_offset;
180
181
  /* Add in supplied addend.  */
182
0
  relocation += reloc_entry->addend;
183
184
0
  if (relocatable)
185
0
    {
186
0
      reloc_entry->address += input_section->output_offset;
187
0
      reloc_entry->addend += symbol->section->output_offset;
188
0
    }
189
0
  else
190
0
    {
191
0
      reloc_entry->addend = 0;
192
0
    }
193
194
0
  if (howto->complain_on_overflow != complain_overflow_dont)
195
0
    {
196
0
      bfd_reloc_status_type flag;
197
0
      flag = bfd_check_overflow (howto->complain_on_overflow,
198
0
         howto->bitsize,
199
0
         howto->rightshift,
200
0
         bfd_arch_bits_per_address(abfd),
201
0
         relocation);
202
0
      if (flag != bfd_reloc_ok)
203
0
  return flag;
204
0
    }
205
206
  /* Here the variable relocation holds the final address of the
207
     symbol we are relocating against, plus any addend.  */
208
209
0
  relocation >>= (bfd_vma) howto->rightshift;
210
0
  x = relocation;
211
0
  bfd_put_16 (abfd, x, (unsigned char *) data + reloc_addr);
212
0
  return bfd_reloc_ok;
213
0
}
214
215
216
static bfd_reloc_status_type
217
bfin_byte4_reloc (bfd *abfd,
218
      arelent *reloc_entry,
219
      asymbol *symbol,
220
      void * data,
221
      asection *input_section,
222
      bfd *output_bfd,
223
      char **error_message ATTRIBUTE_UNUSED)
224
0
{
225
0
  bfd_vma relocation, x;
226
0
  bfd_size_type addr = reloc_entry->address;
227
0
  bfd_vma output_base = 0;
228
0
  asection *output_section;
229
0
  bool relocatable = (output_bfd != NULL);
230
231
  /* Is the address of the relocation really within the section?  */
232
0
  if (!bfd_reloc_offset_in_range (reloc_entry->howto, abfd, input_section,
233
0
          addr))
234
0
    return bfd_reloc_outofrange;
235
236
0
  if (bfd_is_und_section (symbol->section)
237
0
      && (symbol->flags & BSF_WEAK) == 0
238
0
      && !relocatable)
239
0
    return bfd_reloc_undefined;
240
241
0
  output_section = symbol->section->output_section;
242
0
  relocation = symbol->value;
243
  /* Convert input-section-relative symbol value to absolute.  */
244
0
  if (relocatable)
245
0
    output_base = 0;
246
0
  else
247
0
    output_base = output_section->vma;
248
249
0
  if ((symbol->name
250
0
       && symbol->section->name
251
0
       && !strcmp (symbol->name, symbol->section->name))
252
0
      || !relocatable)
253
0
    {
254
0
      relocation += output_base + symbol->section->output_offset;
255
0
    }
256
257
0
  relocation += reloc_entry->addend;
258
259
0
  if (relocatable)
260
0
    {
261
      /* This output will be relocatable ... like ld -r. */
262
0
      reloc_entry->address += input_section->output_offset;
263
0
      reloc_entry->addend += symbol->section->output_offset;
264
0
    }
265
0
  else
266
0
    {
267
0
      reloc_entry->addend = 0;
268
0
    }
269
270
  /* Here the variable relocation holds the final address of the
271
     symbol we are relocating against, plus any addend.  */
272
0
  x = relocation & 0xFFFF0000;
273
0
  x >>=16;
274
0
  bfd_put_16 (abfd, x, (unsigned char *) data + addr + 2);
275
276
0
  x = relocation & 0x0000FFFF;
277
0
  bfd_put_16 (abfd, x, (unsigned char *) data + addr);
278
0
  return bfd_reloc_ok;
279
0
}
280
281
/* bfin_bfd_reloc handles the blackfin arithmetic relocations.
282
   Use this instead of bfd_perform_relocation.  */
283
static bfd_reloc_status_type
284
bfin_bfd_reloc (bfd *abfd,
285
    arelent *reloc_entry,
286
    asymbol *symbol,
287
    void * data,
288
    asection *input_section,
289
    bfd *output_bfd,
290
    char **error_message ATTRIBUTE_UNUSED)
291
0
{
292
0
  bfd_vma relocation;
293
0
  bfd_size_type addr = reloc_entry->address;
294
0
  bfd_vma output_base = 0;
295
0
  reloc_howto_type *howto = reloc_entry->howto;
296
0
  asection *output_section;
297
0
  bool relocatable = (output_bfd != NULL);
298
299
  /* Is the address of the relocation really within the section?  */
300
0
  if (!bfd_reloc_offset_in_range (howto, abfd, input_section, addr))
301
0
    return bfd_reloc_outofrange;
302
303
0
  if (bfd_is_und_section (symbol->section)
304
0
      && (symbol->flags & BSF_WEAK) == 0
305
0
      && !relocatable)
306
0
    return bfd_reloc_undefined;
307
308
  /* Get symbol value.  (Common symbols are special.)  */
309
0
  if (bfd_is_com_section (symbol->section))
310
0
    relocation = 0;
311
0
  else
312
0
    relocation = symbol->value;
313
314
0
  output_section = symbol->section->output_section;
315
316
  /* Convert input-section-relative symbol value to absolute.  */
317
0
  if (relocatable)
318
0
    output_base = 0;
319
0
  else
320
0
    output_base = output_section->vma;
321
322
0
  if (!relocatable || !strcmp (symbol->name, symbol->section->name))
323
0
    relocation += output_base + symbol->section->output_offset;
324
325
0
  if (!relocatable && !strcmp (symbol->name, symbol->section->name))
326
0
    {
327
      /* Add in supplied addend.  */
328
0
      relocation += reloc_entry->addend;
329
0
    }
330
331
  /* Here the variable relocation holds the final address of the
332
     symbol we are relocating against, plus any addend.  */
333
334
0
  if (howto->pc_relative)
335
0
    {
336
0
      relocation -= input_section->output_section->vma + input_section->output_offset;
337
338
0
      if (howto->pcrel_offset)
339
0
  relocation -= reloc_entry->address;
340
0
    }
341
342
0
  if (relocatable)
343
0
    {
344
0
      reloc_entry->address += input_section->output_offset;
345
0
      reloc_entry->addend += symbol->section->output_offset;
346
0
    }
347
348
0
  if (howto->complain_on_overflow != complain_overflow_dont)
349
0
    {
350
0
      bfd_reloc_status_type status;
351
352
0
      status = bfd_check_overflow (howto->complain_on_overflow,
353
0
          howto->bitsize,
354
0
          howto->rightshift,
355
0
          bfd_arch_bits_per_address(abfd),
356
0
          relocation);
357
0
      if (status != bfd_reloc_ok)
358
0
  return status;
359
0
    }
360
361
  /* If rightshift is 1 and the number odd, return error.  */
362
0
  if (howto->rightshift && (relocation & 0x01))
363
0
    {
364
0
      _bfd_error_handler (_("relocation should be even number"));
365
0
      return bfd_reloc_overflow;
366
0
    }
367
368
0
  relocation >>= (bfd_vma) howto->rightshift;
369
370
  /* Shift everything up to where it's going to be used.  */
371
372
0
  relocation <<= (bfd_vma) howto->bitpos;
373
374
0
#define DOIT(x)               \
375
0
  x = ( (x & ~howto->dst_mask) | (relocation & howto->dst_mask))
376
377
  /* handle 8 and 16 bit relocations here. */
378
0
  switch (bfd_get_reloc_size (howto))
379
0
    {
380
0
    case 1:
381
0
      {
382
0
  char x = bfd_get_8 (abfd, (char *) data + addr);
383
0
  DOIT (x);
384
0
  bfd_put_8 (abfd, x, (unsigned char *) data + addr);
385
0
      }
386
0
      break;
387
388
0
    case 2:
389
0
      {
390
0
  unsigned short x = bfd_get_16 (abfd, (bfd_byte *) data + addr);
391
0
  DOIT (x);
392
0
  bfd_put_16 (abfd, (bfd_vma) x, (unsigned char *) data + addr);
393
0
      }
394
0
      break;
395
396
0
    default:
397
0
      return bfd_reloc_other;
398
0
    }
399
400
0
  return bfd_reloc_ok;
401
0
}
402
403
/* HOWTO Table for blackfin.
404
   Blackfin relocations are fairly complicated.
405
   Some of the salient features are
406
   a. Even numbered offsets. A number of (not all) relocations are
407
      even numbered. This means that the rightmost bit is not stored.
408
      Needs to right shift by 1 and check to see if value is not odd
409
   b. A relocation can be an expression. An expression takes on
410
      a variety of relocations arranged in a stack.
411
   As a result, we cannot use the standard generic function as special
412
   function. We will have our own, which is very similar to the standard
413
   generic function except that it understands how to get the value from
414
   the relocation stack. .  */
415
416
#define BFIN_RELOC_MIN 0
417
136
#define BFIN_RELOC_MAX 0x21
418
15
#define BFIN_GNUEXT_RELOC_MIN 0x40
419
6
#define BFIN_GNUEXT_RELOC_MAX 0x43
420
#define BFIN_ARELOC_MIN 0xE0
421
#define BFIN_ARELOC_MAX 0xF3
422
423
static reloc_howto_type bfin_howto_table [] =
424
{
425
  /* This reloc does nothing. .  */
426
  HOWTO (R_BFIN_UNUSED0,  /* type.  */
427
   0,     /* rightshift.  */
428
   0,     /* size.  */
429
   0,     /* bitsize.  */
430
   false,     /* pc_relative.  */
431
   0,     /* bitpos.  */
432
   complain_overflow_dont, /* complain_on_overflow.  */
433
   bfd_elf_generic_reloc, /* special_function.  */
434
   "R_BFIN_UNUSED0",  /* name.  */
435
   false,     /* partial_inplace.  */
436
   0,     /* src_mask.  */
437
   0,     /* dst_mask.  */
438
   false),    /* pcrel_offset.  */
439
440
  HOWTO (R_BFIN_PCREL5M2, /* type.  */
441
   1,     /* rightshift.  */
442
   2,     /* size.  */
443
   4,     /* bitsize.  */
444
   true,      /* pc_relative.  */
445
   0,     /* bitpos.  */
446
   complain_overflow_unsigned, /* complain_on_overflow.  */
447
   bfin_bfd_reloc,  /* special_function.  */
448
   "R_BFIN_PCREL5M2", /* name.  */
449
   false,     /* partial_inplace.  */
450
   0,     /* src_mask.  */
451
   0x0000000F,    /* dst_mask.  */
452
   false),    /* pcrel_offset.  */
453
454
  HOWTO (R_BFIN_UNUSED1,  /* type.  */
455
   0,     /* rightshift.  */
456
   0,     /* size.  */
457
   0,     /* bitsize.  */
458
   false,     /* pc_relative.  */
459
   0,     /* bitpos.  */
460
   complain_overflow_dont, /* complain_on_overflow.  */
461
   bfd_elf_generic_reloc, /* special_function.  */
462
   "R_BFIN_UNUSED1",  /* name.  */
463
   false,     /* partial_inplace.  */
464
   0,     /* src_mask.  */
465
   0,     /* dst_mask.  */
466
   false),    /* pcrel_offset.  */
467
468
  HOWTO (R_BFIN_PCREL10,  /* type.  */
469
   1,     /* rightshift.  */
470
   2,     /* size.  */
471
   10,      /* bitsize.  */
472
   true,      /* pc_relative.  */
473
   0,     /* bitpos.  */
474
   complain_overflow_signed, /* complain_on_overflow.  */
475
   bfin_bfd_reloc,  /* special_function.  */
476
   "R_BFIN_PCREL10",  /* name.  */
477
   false,     /* partial_inplace.  */
478
   0,     /* src_mask.  */
479
   0x000003FF,    /* dst_mask.  */
480
   true),     /* pcrel_offset.  */
481
482
  HOWTO (R_BFIN_PCREL12_JUMP, /* type.  */
483
   1,     /* rightshift.  */
484
        /* the offset is actually 13 bit
485
           aligned on a word boundary so
486
           only 12 bits have to be used.
487
           Right shift the rightmost bit..  */
488
   2,     /* size.  */
489
   12,      /* bitsize.  */
490
   true,      /* pc_relative.  */
491
   0,     /* bitpos.  */
492
   complain_overflow_signed, /* complain_on_overflow.  */
493
   bfin_bfd_reloc,  /* special_function.  */
494
   "R_BFIN_PCREL12_JUMP", /* name.  */
495
   false,     /* partial_inplace.  */
496
   0,     /* src_mask.  */
497
   0x0FFF,    /* dst_mask.  */
498
   true),     /* pcrel_offset.  */
499
500
  HOWTO (R_BFIN_RIMM16,   /* type.  */
501
   0,     /* rightshift.  */
502
   2,     /* size.  */
503
   16,      /* bitsize.  */
504
   false,     /* pc_relative.  */
505
   0,     /* bitpos.  */
506
   complain_overflow_signed, /* complain_on_overflow.  */
507
   bfin_imm16_reloc,  /* special_function.  */
508
   "R_BFIN_RIMM16", /* name.  */
509
   false,     /* partial_inplace.  */
510
   0,     /* src_mask.  */
511
   0x0000FFFF,    /* dst_mask.  */
512
   true),     /* pcrel_offset.  */
513
514
  HOWTO (R_BFIN_LUIMM16,  /* type.  */
515
   0,     /* rightshift.  */
516
   2,     /* size.  */
517
   16,      /* bitsize.  */
518
   false,     /* pc_relative.  */
519
   0,     /* bitpos.  */
520
   complain_overflow_dont, /* complain_on_overflow.  */
521
   bfin_imm16_reloc,  /* special_function.  */
522
   "R_BFIN_LUIMM16",  /* name.  */
523
   false,     /* partial_inplace.  */
524
   0,     /* src_mask.  */
525
   0x0000FFFF,    /* dst_mask.  */
526
   true),     /* pcrel_offset.  */
527
528
  HOWTO (R_BFIN_HUIMM16,  /* type.  */
529
   16,      /* rightshift.  */
530
   2,     /* size.  */
531
   16,      /* bitsize.  */
532
   false,     /* pc_relative.  */
533
   0,     /* bitpos.  */
534
   complain_overflow_unsigned, /* complain_on_overflow.  */
535
   bfin_imm16_reloc,  /* special_function.  */
536
   "R_BFIN_HUIMM16",  /* name.  */
537
   false,     /* partial_inplace.  */
538
   0,     /* src_mask.  */
539
   0x0000FFFF,    /* dst_mask.  */
540
   true),     /* pcrel_offset.  */
541
542
  HOWTO (R_BFIN_PCREL12_JUMP_S, /* type.  */
543
   1,     /* rightshift.  */
544
   2,     /* size.  */
545
   12,      /* bitsize.  */
546
   true,      /* pc_relative.  */
547
   0,     /* bitpos.  */
548
   complain_overflow_signed, /* complain_on_overflow.  */
549
   bfin_bfd_reloc,  /* special_function.  */
550
   "R_BFIN_PCREL12_JUMP_S", /* name.  */
551
   false,     /* partial_inplace.  */
552
   0,     /* src_mask.  */
553
   0x00000FFF,    /* dst_mask.  */
554
   true),     /* pcrel_offset.  */
555
556
  HOWTO (R_BFIN_PCREL24_JUMP_X, /* type.  */
557
   1,     /* rightshift.  */
558
   4,     /* size.  */
559
   24,      /* bitsize.  */
560
   true,      /* pc_relative.  */
561
   0,     /* bitpos.  */
562
   complain_overflow_signed, /* complain_on_overflow.  */
563
   bfin_pcrel24_reloc,  /* special_function.  */
564
  "R_BFIN_PCREL24_JUMP_X", /* name.  */
565
   false,     /* partial_inplace.  */
566
   0,     /* src_mask.  */
567
   0x00FFFFFF,    /* dst_mask.  */
568
   true),     /* pcrel_offset.  */
569
570
  HOWTO (R_BFIN_PCREL24,  /* type.  */
571
   1,     /* rightshift.  */
572
   4,     /* size.  */
573
   24,      /* bitsize.  */
574
   true,      /* pc_relative.  */
575
   0,     /* bitpos.  */
576
   complain_overflow_signed, /* complain_on_overflow.  */
577
   bfin_pcrel24_reloc,  /* special_function.  */
578
   "R_BFIN_PCREL24",  /* name.  */
579
   false,     /* partial_inplace.  */
580
   0,     /* src_mask.  */
581
   0x00FFFFFF,    /* dst_mask.  */
582
   true),     /* pcrel_offset.  */
583
584
  HOWTO (R_BFIN_UNUSEDB,  /* type.  */
585
   0,     /* rightshift.  */
586
   0,     /* size.  */
587
   0,     /* bitsize.  */
588
   false,     /* pc_relative.  */
589
   0,     /* bitpos.  */
590
   complain_overflow_dont, /* complain_on_overflow.  */
591
   bfd_elf_generic_reloc, /* special_function.  */
592
   "R_BFIN_UNUSEDB",  /* name.  */
593
   false,     /* partial_inplace.  */
594
   0,     /* src_mask.  */
595
   0,     /* dst_mask.  */
596
   false),    /* pcrel_offset.  */
597
598
  HOWTO (R_BFIN_UNUSEDC,  /* type.  */
599
   0,     /* rightshift.  */
600
   0,     /* size.  */
601
   0,     /* bitsize.  */
602
   false,     /* pc_relative.  */
603
   0,     /* bitpos.  */
604
   complain_overflow_dont, /* complain_on_overflow.  */
605
   bfd_elf_generic_reloc, /* special_function.  */
606
   "R_BFIN_UNUSEDC",  /* name.  */
607
   false,     /* partial_inplace.  */
608
   0,     /* src_mask.  */
609
   0,     /* dst_mask.  */
610
   false),    /* pcrel_offset.  */
611
612
  HOWTO (R_BFIN_PCREL24_JUMP_L, /* type.  */
613
   1,     /* rightshift.  */
614
   4,     /* size.  */
615
   24,      /* bitsize.  */
616
   true,      /* pc_relative.  */
617
   0,     /* bitpos.  */
618
   complain_overflow_signed, /* complain_on_overflow.  */
619
   bfin_pcrel24_reloc,  /* special_function.  */
620
   "R_BFIN_PCREL24_JUMP_L", /* name.  */
621
   false,     /* partial_inplace.  */
622
   0,     /* src_mask.  */
623
   0x00FFFFFF,    /* dst_mask.  */
624
   true),     /* pcrel_offset.  */
625
626
  HOWTO (R_BFIN_PCREL24_CALL_X, /* type.  */
627
   1,     /* rightshift.  */
628
   4,     /* size.  */
629
   24,      /* bitsize.  */
630
   true,      /* pc_relative.  */
631
   0,     /* bitpos.  */
632
   complain_overflow_signed, /* complain_on_overflow.  */
633
   bfin_pcrel24_reloc,  /* special_function.  */
634
   "R_BFIN_PCREL24_CALL_X", /* name.  */
635
   false,     /* partial_inplace.  */
636
   0,     /* src_mask.  */
637
   0x00FFFFFF,    /* dst_mask.  */
638
   true),     /* pcrel_offset.  */
639
640
  HOWTO (R_BFIN_VAR_EQ_SYMB,  /* type.  */
641
   0,     /* rightshift.  */
642
   4,     /* size.  */
643
   32,      /* bitsize.  */
644
   false,     /* pc_relative.  */
645
   0,     /* bitpos.  */
646
   complain_overflow_bitfield, /* complain_on_overflow.  */
647
   bfin_bfd_reloc,  /* special_function.  */
648
   "R_BFIN_VAR_EQ_SYMB",  /* name.  */
649
   false,     /* partial_inplace.  */
650
   0,     /* src_mask.  */
651
   0,     /* dst_mask.  */
652
   false),    /* pcrel_offset.  */
653
654
  HOWTO (R_BFIN_BYTE_DATA,  /* type.  */
655
   0,     /* rightshift.  */
656
   1,     /* size.  */
657
   8,     /* bitsize.  */
658
   false,     /* pc_relative.  */
659
   0,     /* bitpos.  */
660
   complain_overflow_unsigned, /* complain_on_overflow.  */
661
   bfin_bfd_reloc,  /* special_function.  */
662
   "R_BFIN_BYTE_DATA",  /* name.  */
663
   false,     /* partial_inplace.  */
664
   0,     /* src_mask.  */
665
   0xFF,      /* dst_mask.  */
666
   true),     /* pcrel_offset.  */
667
668
  HOWTO (R_BFIN_BYTE2_DATA, /* type.  */
669
   0,     /* rightshift.  */
670
   2,     /* size.  */
671
   16,      /* bitsize.  */
672
   false,     /* pc_relative.  */
673
   0,     /* bitpos.  */
674
   complain_overflow_signed, /* complain_on_overflow.  */
675
   bfin_bfd_reloc,  /* special_function.  */
676
   "R_BFIN_BYTE2_DATA", /* name.  */
677
   false,     /* partial_inplace.  */
678
   0,     /* src_mask.  */
679
   0xFFFF,    /* dst_mask.  */
680
   true),     /* pcrel_offset.  */
681
682
  HOWTO (R_BFIN_BYTE4_DATA, /* type.  */
683
   0,     /* rightshift.  */
684
   4,     /* size.  */
685
   32,      /* bitsize.  */
686
   false,     /* pc_relative.  */
687
   0,     /* bitpos.  */
688
   complain_overflow_unsigned, /* complain_on_overflow.  */
689
   bfin_byte4_reloc,  /* special_function.  */
690
   "R_BFIN_BYTE4_DATA", /* name.  */
691
   false,     /* partial_inplace.  */
692
   0,     /* src_mask.  */
693
   0xFFFFFFFF,    /* dst_mask.  */
694
   true),     /* pcrel_offset.  */
695
696
  HOWTO (R_BFIN_PCREL11,  /* type.  */
697
   1,     /* rightshift.  */
698
   2,     /* size.  */
699
   10,      /* bitsize.  */
700
   true,      /* pc_relative.  */
701
   0,     /* bitpos.  */
702
   complain_overflow_unsigned, /* complain_on_overflow.  */
703
   bfin_bfd_reloc,  /* special_function.  */
704
   "R_BFIN_PCREL11",  /* name.  */
705
   false,     /* partial_inplace.  */
706
   0,     /* src_mask.  */
707
   0x000003FF,    /* dst_mask.  */
708
   false),    /* pcrel_offset.  */
709
710
711
  /* A 18-bit signed operand with the GOT offset for the address of
712
     the symbol.  */
713
  HOWTO (R_BFIN_GOT17M4,  /* type */
714
   2,     /* rightshift */
715
   2,     /* size */
716
   16,      /* bitsize */
717
   false,     /* pc_relative */
718
   0,     /* bitpos */
719
   complain_overflow_signed, /* complain_on_overflow */
720
   bfd_elf_generic_reloc, /* special_function */
721
   "R_BFIN_GOT17M4",  /* name */
722
   false,     /* partial_inplace */
723
   0xffff,    /* src_mask */
724
   0xffff,    /* dst_mask */
725
   false),    /* pcrel_offset */
726
727
  /* The upper 16 bits of the GOT offset for the address of the
728
     symbol.  */
729
  HOWTO (R_BFIN_GOTHI,    /* type */
730
   0,     /* rightshift */
731
   2,     /* size */
732
   16,      /* bitsize */
733
   false,     /* pc_relative */
734
   0,     /* bitpos */
735
   complain_overflow_dont, /* complain_on_overflow */
736
   bfd_elf_generic_reloc, /* special_function */
737
   "R_BFIN_GOTHI",    /* name */
738
   false,     /* partial_inplace */
739
   0xffff,      /* src_mask */
740
   0xffff,    /* dst_mask */
741
   false),    /* pcrel_offset */
742
743
  /* The lower 16 bits of the GOT offset for the address of the
744
     symbol.  */
745
  HOWTO (R_BFIN_GOTLO,    /* type */
746
   0,     /* rightshift */
747
   2,     /* 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_BFIN_GOTLO",    /* name */
754
   false,     /* partial_inplace */
755
   0xffff,    /* src_mask */
756
   0xffff,    /* dst_mask */
757
   false),    /* pcrel_offset */
758
759
  /* The 32-bit address of the canonical descriptor of a function.  */
760
  HOWTO (R_BFIN_FUNCDESC, /* type */
761
   0,     /* rightshift */
762
   4,     /* size */
763
   32,      /* bitsize */
764
   false,     /* pc_relative */
765
   0,     /* bitpos */
766
   complain_overflow_bitfield, /* complain_on_overflow */
767
   bfd_elf_generic_reloc, /* special_function */
768
   "R_BFIN_FUNCDESC", /* name */
769
   false,     /* partial_inplace */
770
   0xffffffff,    /* src_mask */
771
   0xffffffff,    /* dst_mask */
772
   false),    /* pcrel_offset */
773
774
  /* A 12-bit signed operand with the GOT offset for the address of
775
     canonical descriptor of a function.  */
776
  HOWTO (R_BFIN_FUNCDESC_GOT17M4, /* type */
777
   2,     /* rightshift */
778
   2,     /* size */
779
   16,      /* bitsize */
780
   false,     /* pc_relative */
781
   0,     /* bitpos */
782
   complain_overflow_signed, /* complain_on_overflow */
783
   bfd_elf_generic_reloc, /* special_function */
784
   "R_BFIN_FUNCDESC_GOT17M4", /* name */
785
   false,     /* partial_inplace */
786
   0xffff,    /* src_mask */
787
   0xffff,    /* dst_mask */
788
   false),    /* pcrel_offset */
789
790
  /* The upper 16 bits of the GOT offset for the address of the
791
     canonical descriptor of a function.  */
792
  HOWTO (R_BFIN_FUNCDESC_GOTHI, /* type */
793
   0,     /* rightshift */
794
   2,     /* size */
795
   16,      /* bitsize */
796
   false,     /* pc_relative */
797
   0,     /* bitpos */
798
   complain_overflow_dont, /* complain_on_overflow */
799
   bfd_elf_generic_reloc, /* special_function */
800
   "R_BFIN_FUNCDESC_GOTHI", /* name */
801
   false,     /* partial_inplace */
802
   0xffff,    /* src_mask */
803
   0xffff,    /* dst_mask */
804
   false),    /* pcrel_offset */
805
806
  /* The lower 16 bits of the GOT offset for the address of the
807
     canonical descriptor of a function.  */
808
  HOWTO (R_BFIN_FUNCDESC_GOTLO, /* type */
809
   0,     /* rightshift */
810
   2,     /* size */
811
   16,      /* bitsize */
812
   false,     /* pc_relative */
813
   0,     /* bitpos */
814
   complain_overflow_dont, /* complain_on_overflow */
815
   bfd_elf_generic_reloc, /* special_function */
816
   "R_BFIN_FUNCDESC_GOTLO", /* name */
817
   false,     /* partial_inplace */
818
   0xffff,    /* src_mask */
819
   0xffff,    /* dst_mask */
820
   false),    /* pcrel_offset */
821
822
  /* The 32-bit address of the canonical descriptor of a function.  */
823
  HOWTO (R_BFIN_FUNCDESC_VALUE, /* type */
824
   0,     /* rightshift */
825
   4,     /* size */
826
   64,      /* bitsize */
827
   false,     /* pc_relative */
828
   0,     /* bitpos */
829
   complain_overflow_bitfield, /* complain_on_overflow */
830
   bfd_elf_generic_reloc, /* special_function */
831
   "R_BFIN_FUNCDESC_VALUE", /* name */
832
   false,     /* partial_inplace */
833
   0xffffffff,    /* src_mask */
834
   0xffffffff,    /* dst_mask */
835
   false),    /* pcrel_offset */
836
837
  /* A 12-bit signed operand with the GOT offset for the address of
838
     canonical descriptor of a function.  */
839
  HOWTO (R_BFIN_FUNCDESC_GOTOFF17M4, /* type */
840
   2,     /* rightshift */
841
   2,     /* size */
842
   16,      /* bitsize */
843
   false,     /* pc_relative */
844
   0,     /* bitpos */
845
   complain_overflow_signed, /* complain_on_overflow */
846
   bfd_elf_generic_reloc, /* special_function */
847
   "R_BFIN_FUNCDESC_GOTOFF17M4", /* name */
848
   false,     /* partial_inplace */
849
   0xffff,    /* src_mask */
850
   0xffff,    /* dst_mask */
851
   false),    /* pcrel_offset */
852
853
  /* The upper 16 bits of the GOT offset for the address of the
854
     canonical descriptor of a function.  */
855
  HOWTO (R_BFIN_FUNCDESC_GOTOFFHI, /* type */
856
   0,     /* rightshift */
857
   2,     /* size */
858
   16,      /* bitsize */
859
   false,     /* pc_relative */
860
   0,     /* bitpos */
861
   complain_overflow_dont, /* complain_on_overflow */
862
   bfd_elf_generic_reloc, /* special_function */
863
   "R_BFIN_FUNCDESC_GOTOFFHI", /* name */
864
   false,     /* partial_inplace */
865
   0xffff,    /* src_mask */
866
   0xffff,    /* dst_mask */
867
   false),    /* pcrel_offset */
868
869
  /* The lower 16 bits of the GOT offset for the address of the
870
     canonical descriptor of a function.  */
871
  HOWTO (R_BFIN_FUNCDESC_GOTOFFLO, /* type */
872
   0,     /* rightshift */
873
   2,     /* size */
874
   16,      /* bitsize */
875
   false,     /* pc_relative */
876
   0,     /* bitpos */
877
   complain_overflow_dont, /* complain_on_overflow */
878
   bfd_elf_generic_reloc, /* special_function */
879
   "R_BFIN_FUNCDESC_GOTOFFLO", /* name */
880
   false,     /* partial_inplace */
881
   0xffff,    /* src_mask */
882
   0xffff,    /* dst_mask */
883
   false),    /* pcrel_offset */
884
885
  /* A 12-bit signed operand with the GOT offset for the address of
886
     the symbol.  */
887
  HOWTO (R_BFIN_GOTOFF17M4, /* type */
888
   2,     /* rightshift */
889
   2,     /* size */
890
   16,      /* bitsize */
891
   false,     /* pc_relative */
892
   0,     /* bitpos */
893
   complain_overflow_signed, /* complain_on_overflow */
894
   bfd_elf_generic_reloc, /* special_function */
895
   "R_BFIN_GOTOFF17M4", /* name */
896
   false,     /* partial_inplace */
897
   0xffff,    /* src_mask */
898
   0xffff,    /* dst_mask */
899
   false),    /* pcrel_offset */
900
901
  /* The upper 16 bits of the GOT offset for the address of the
902
     symbol.  */
903
  HOWTO (R_BFIN_GOTOFFHI,  /* type */
904
   0,     /* rightshift */
905
   2,     /* size */
906
   16,      /* bitsize */
907
   false,     /* pc_relative */
908
   0,     /* bitpos */
909
   complain_overflow_dont, /* complain_on_overflow */
910
   bfd_elf_generic_reloc, /* special_function */
911
   "R_BFIN_GOTOFFHI", /* name */
912
   false,     /* partial_inplace */
913
   0xffff,    /* src_mask */
914
   0xffff,    /* dst_mask */
915
   false),    /* pcrel_offset */
916
917
  /* The lower 16 bits of the GOT offset for the address of the
918
     symbol.  */
919
  HOWTO (R_BFIN_GOTOFFLO, /* type */
920
   0,     /* rightshift */
921
   2,     /* size */
922
   16,      /* bitsize */
923
   false,     /* pc_relative */
924
   0,     /* bitpos */
925
   complain_overflow_dont, /* complain_on_overflow */
926
   bfd_elf_generic_reloc, /* special_function */
927
   "R_BFIN_GOTOFFLO", /* name */
928
   false,     /* partial_inplace */
929
   0xffff,    /* src_mask */
930
   0xffff,    /* dst_mask */
931
   false),    /* pcrel_offset */
932
};
933
934
static reloc_howto_type bfin_gnuext_howto_table [] =
935
{
936
  HOWTO (R_BFIN_PLTPC,    /* type.  */
937
   0,     /* rightshift.  */
938
   2,     /* size.  */
939
   16,      /* bitsize.  */
940
   false,     /* pc_relative.  */
941
   0,     /* bitpos.  */
942
   complain_overflow_bitfield, /* complain_on_overflow.  */
943
   bfin_pltpc_reloc,  /* special_function.  */
944
   "R_BFIN_PLTPC",  /* name.  */
945
   false,     /* partial_inplace.  */
946
   0xffff,    /* src_mask.  */
947
   0xffff,    /* dst_mask.  */
948
   false),    /* pcrel_offset.  */
949
950
  HOWTO (R_BFIN_GOT,    /* type.  */
951
   0,     /* rightshift.  */
952
   2,     /* size.  */
953
   16,      /* bitsize.  */
954
   false,     /* pc_relative.  */
955
   0,     /* bitpos.  */
956
   complain_overflow_bitfield, /* complain_on_overflow.  */
957
   bfd_elf_generic_reloc, /* special_function.  */
958
   "R_BFIN_GOT",    /* name.  */
959
   false,     /* partial_inplace.  */
960
   0x7fff,    /* src_mask.  */
961
   0x7fff,    /* dst_mask.  */
962
   false),    /* pcrel_offset.  */
963
964
/* GNU extension to record C++ vtable hierarchy.  */
965
  HOWTO (R_BFIN_GNU_VTINHERIT,  /* type.  */
966
   0,     /* rightshift.  */
967
   4,     /* size.  */
968
   0,     /* bitsize.  */
969
   false,     /* pc_relative.  */
970
   0,     /* bitpos.  */
971
   complain_overflow_dont, /* complain_on_overflow.  */
972
   NULL,      /* special_function.  */
973
   "R_BFIN_GNU_VTINHERIT", /* name.  */
974
   false,     /* partial_inplace.  */
975
   0,     /* src_mask.  */
976
   0,     /* dst_mask.  */
977
   false),    /* pcrel_offset.  */
978
979
/* GNU extension to record C++ vtable member usage.  */
980
  HOWTO (R_BFIN_GNU_VTENTRY,  /* type.  */
981
   0,     /* rightshift.  */
982
   4,     /* size.  */
983
   0,     /* bitsize.  */
984
   false,     /* pc_relative.  */
985
   0,     /* bitpos.  */
986
   complain_overflow_dont, /* complain_on_overflow.  */
987
   _bfd_elf_rel_vtable_reloc_fn, /* special_function.  */
988
   "R_BFIN_GNU_VTENTRY",  /* name.  */
989
   false,     /* partial_inplace.  */
990
   0,     /* src_mask.  */
991
   0,     /* dst_mask.  */
992
   false)     /* pcrel_offset.  */
993
};
994
995
struct bfin_reloc_map
996
{
997
  bfd_reloc_code_real_type  bfd_reloc_val;
998
  unsigned int      bfin_reloc_val;
999
};
1000
1001
static const struct bfin_reloc_map bfin_reloc_map [] =
1002
{
1003
  { BFD_RELOC_NONE,     R_BFIN_UNUSED0 },
1004
  { BFD_RELOC_BFIN_5_PCREL,   R_BFIN_PCREL5M2 },
1005
  { BFD_RELOC_NONE,     R_BFIN_UNUSED1 },
1006
  { BFD_RELOC_BFIN_10_PCREL,    R_BFIN_PCREL10 },
1007
  { BFD_RELOC_BFIN_12_PCREL_JUMP, R_BFIN_PCREL12_JUMP },
1008
  { BFD_RELOC_BFIN_16_IMM,    R_BFIN_RIMM16 },
1009
  { BFD_RELOC_BFIN_16_LOW,    R_BFIN_LUIMM16 },
1010
  { BFD_RELOC_BFIN_16_HIGH,   R_BFIN_HUIMM16 },
1011
  { BFD_RELOC_BFIN_12_PCREL_JUMP_S, R_BFIN_PCREL12_JUMP_S },
1012
  { BFD_RELOC_24_PCREL,     R_BFIN_PCREL24 },
1013
  { BFD_RELOC_24_PCREL,     R_BFIN_PCREL24 },
1014
  { BFD_RELOC_BFIN_24_PCREL_JUMP_L, R_BFIN_PCREL24_JUMP_L },
1015
  { BFD_RELOC_NONE,     R_BFIN_UNUSEDB },
1016
  { BFD_RELOC_NONE,     R_BFIN_UNUSEDC },
1017
  { BFD_RELOC_BFIN_24_PCREL_CALL_X, R_BFIN_PCREL24_CALL_X },
1018
  { BFD_RELOC_8,      R_BFIN_BYTE_DATA },
1019
  { BFD_RELOC_16,     R_BFIN_BYTE2_DATA },
1020
  { BFD_RELOC_32,     R_BFIN_BYTE4_DATA },
1021
  { BFD_RELOC_BFIN_11_PCREL,    R_BFIN_PCREL11 },
1022
  { BFD_RELOC_BFIN_GOT,     R_BFIN_GOT },
1023
  { BFD_RELOC_BFIN_PLTPC,   R_BFIN_PLTPC },
1024
1025
  { BFD_RELOC_BFIN_GOT17M4,      R_BFIN_GOT17M4 },
1026
  { BFD_RELOC_BFIN_GOTHI,      R_BFIN_GOTHI },
1027
  { BFD_RELOC_BFIN_GOTLO,      R_BFIN_GOTLO },
1028
  { BFD_RELOC_BFIN_FUNCDESC,   R_BFIN_FUNCDESC },
1029
  { BFD_RELOC_BFIN_FUNCDESC_GOT17M4, R_BFIN_FUNCDESC_GOT17M4 },
1030
  { BFD_RELOC_BFIN_FUNCDESC_GOTHI, R_BFIN_FUNCDESC_GOTHI },
1031
  { BFD_RELOC_BFIN_FUNCDESC_GOTLO, R_BFIN_FUNCDESC_GOTLO },
1032
  { BFD_RELOC_BFIN_FUNCDESC_VALUE, R_BFIN_FUNCDESC_VALUE },
1033
  { BFD_RELOC_BFIN_FUNCDESC_GOTOFF17M4, R_BFIN_FUNCDESC_GOTOFF17M4 },
1034
  { BFD_RELOC_BFIN_FUNCDESC_GOTOFFHI, R_BFIN_FUNCDESC_GOTOFFHI },
1035
  { BFD_RELOC_BFIN_FUNCDESC_GOTOFFLO, R_BFIN_FUNCDESC_GOTOFFLO },
1036
  { BFD_RELOC_BFIN_GOTOFF17M4,   R_BFIN_GOTOFF17M4 },
1037
  { BFD_RELOC_BFIN_GOTOFFHI,   R_BFIN_GOTOFFHI },
1038
  { BFD_RELOC_BFIN_GOTOFFLO,   R_BFIN_GOTOFFLO },
1039
1040
  { BFD_RELOC_VTABLE_INHERIT,   R_BFIN_GNU_VTINHERIT },
1041
  { BFD_RELOC_VTABLE_ENTRY,   R_BFIN_GNU_VTENTRY },
1042
};
1043
1044
1045
static bool
1046
bfin_info_to_howto (bfd *abfd,
1047
        arelent *cache_ptr,
1048
        Elf_Internal_Rela *dst)
1049
136
{
1050
136
  unsigned int r_type;
1051
1052
136
  r_type = ELF32_R_TYPE (dst->r_info);
1053
1054
136
  if (r_type <= BFIN_RELOC_MAX)
1055
129
    cache_ptr->howto = &bfin_howto_table [r_type];
1056
1057
7
  else if (r_type >= BFIN_GNUEXT_RELOC_MIN && r_type <= BFIN_GNUEXT_RELOC_MAX)
1058
1
    cache_ptr->howto = &bfin_gnuext_howto_table [r_type - BFIN_GNUEXT_RELOC_MIN];
1059
1060
6
  else
1061
6
    {
1062
      /* xgettext:c-format */
1063
6
      _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
1064
6
        abfd, r_type);
1065
6
      bfd_set_error (bfd_error_bad_value);
1066
6
      return false;
1067
6
    }
1068
1069
130
  return true;
1070
136
}
1071
1072
/* Given a BFD reloc type, return the howto.  */
1073
static reloc_howto_type *
1074
bfin_bfd_reloc_type_lookup (bfd * abfd ATTRIBUTE_UNUSED,
1075
          bfd_reloc_code_real_type code)
1076
0
{
1077
0
  unsigned int i;
1078
0
  unsigned int r_type = (unsigned int) -1;
1079
1080
0
  for (i = sizeof (bfin_reloc_map) / sizeof (bfin_reloc_map[0]); i--;)
1081
0
    if (bfin_reloc_map[i].bfd_reloc_val == code)
1082
0
      r_type = bfin_reloc_map[i].bfin_reloc_val;
1083
1084
0
  if (r_type <= BFIN_RELOC_MAX)
1085
0
    return &bfin_howto_table [r_type];
1086
1087
0
  else if (r_type >= BFIN_GNUEXT_RELOC_MIN && r_type <= BFIN_GNUEXT_RELOC_MAX)
1088
0
   return &bfin_gnuext_howto_table [r_type - BFIN_GNUEXT_RELOC_MIN];
1089
1090
0
  return (reloc_howto_type *) NULL;
1091
0
}
1092
1093
static reloc_howto_type *
1094
bfin_bfd_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
1095
          const char *r_name)
1096
0
{
1097
0
  unsigned int i;
1098
1099
0
  for (i = 0;
1100
0
       i < (sizeof (bfin_howto_table)
1101
0
      / sizeof (bfin_howto_table[0]));
1102
0
       i++)
1103
0
    if (bfin_howto_table[i].name != NULL
1104
0
  && strcasecmp (bfin_howto_table[i].name, r_name) == 0)
1105
0
      return &bfin_howto_table[i];
1106
1107
0
  for (i = 0;
1108
0
       i < (sizeof (bfin_gnuext_howto_table)
1109
0
      / sizeof (bfin_gnuext_howto_table[0]));
1110
0
       i++)
1111
0
    if (bfin_gnuext_howto_table[i].name != NULL
1112
0
  && strcasecmp (bfin_gnuext_howto_table[i].name, r_name) == 0)
1113
0
      return &bfin_gnuext_howto_table[i];
1114
1115
0
  return NULL;
1116
0
}
1117
1118
/* Given a bfin relocation type, return the howto.  */
1119
static reloc_howto_type *
1120
bfin_reloc_type_lookup (bfd * abfd ATTRIBUTE_UNUSED,
1121
      unsigned int r_type)
1122
0
{
1123
0
  if (r_type <= BFIN_RELOC_MAX)
1124
0
    return &bfin_howto_table [r_type];
1125
1126
0
  else if (r_type >= BFIN_GNUEXT_RELOC_MIN && r_type <= BFIN_GNUEXT_RELOC_MAX)
1127
0
   return &bfin_gnuext_howto_table [r_type - BFIN_GNUEXT_RELOC_MIN];
1128
1129
0
  return (reloc_howto_type *) NULL;
1130
0
}
1131
1132
/* Set by ld emulation if --code-in-l1.  */
1133
bool elf32_bfin_code_in_l1 = 0;
1134
1135
/* Set by ld emulation if --data-in-l1.  */
1136
bool elf32_bfin_data_in_l1 = 0;
1137
1138
static bool
1139
elf32_bfin_final_write_processing (bfd *abfd)
1140
1
{
1141
1
  if (elf32_bfin_code_in_l1)
1142
0
    elf_elfheader (abfd)->e_flags |= EF_BFIN_CODE_IN_L1;
1143
1
  if (elf32_bfin_data_in_l1)
1144
0
    elf_elfheader (abfd)->e_flags |= EF_BFIN_DATA_IN_L1;
1145
1
  return _bfd_elf_final_write_processing (abfd);
1146
1
}
1147
1148
/* Return TRUE if the name is a local label.
1149
   bfin local labels begin with L$.  */
1150
static bool
1151
bfin_is_local_label_name (bfd *abfd, const char *label)
1152
0
{
1153
0
  if (label[0] == 'L' && label[1] == '$' )
1154
0
    return true;
1155
1156
0
  return _bfd_elf_is_local_label_name (abfd, label);
1157
0
}
1158

1159
/* Look through the relocs for a section during the first phase, and
1160
   allocate space in the global offset table or procedure linkage
1161
   table.  */
1162
1163
static bool
1164
bfin_check_relocs (bfd * abfd,
1165
       struct bfd_link_info *info,
1166
       asection *sec,
1167
       const Elf_Internal_Rela *relocs)
1168
0
{
1169
0
  bfd *dynobj;
1170
0
  Elf_Internal_Shdr *symtab_hdr;
1171
0
  struct elf_link_hash_entry **sym_hashes;
1172
0
  bfd_signed_vma *local_got_refcounts;
1173
0
  const Elf_Internal_Rela *rel;
1174
0
  const Elf_Internal_Rela *rel_end;
1175
0
  asection *sgot;
1176
0
  asection *srelgot;
1177
1178
0
  if (bfd_link_relocatable (info))
1179
0
    return true;
1180
1181
0
  dynobj = elf_hash_table (info)->dynobj;
1182
0
  symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1183
0
  sym_hashes = elf_sym_hashes (abfd);
1184
0
  local_got_refcounts = elf_local_got_refcounts (abfd);
1185
1186
0
  sgot = NULL;
1187
0
  srelgot = NULL;
1188
1189
0
  rel_end = relocs + sec->reloc_count;
1190
0
  for (rel = relocs; rel < rel_end; rel++)
1191
0
    {
1192
0
      unsigned long r_symndx;
1193
0
      struct elf_link_hash_entry *h;
1194
1195
0
      r_symndx = ELF32_R_SYM (rel->r_info);
1196
0
      if (r_symndx < symtab_hdr->sh_info)
1197
0
  h = NULL;
1198
0
      else
1199
0
  {
1200
0
    h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1201
0
    while (h->root.type == bfd_link_hash_indirect
1202
0
     || h->root.type == bfd_link_hash_warning)
1203
0
      h = (struct elf_link_hash_entry *)h->root.u.i.link;
1204
0
  }
1205
1206
0
      switch (ELF32_R_TYPE (rel->r_info))
1207
0
  {
1208
       /* This relocation describes the C++ object vtable hierarchy.
1209
     Reconstruct it for later use during GC.  */
1210
0
  case R_BFIN_GNU_VTINHERIT:
1211
0
    if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
1212
0
      return false;
1213
0
    break;
1214
1215
  /* This relocation describes which C++ vtable entries
1216
     are actually used.  Record for later use during GC.  */
1217
0
  case R_BFIN_GNU_VTENTRY:
1218
0
    if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
1219
0
      return false;
1220
0
    break;
1221
1222
0
  case R_BFIN_GOT:
1223
0
    if (h != NULL
1224
0
        && strcmp (h->root.root.string, "__GLOBAL_OFFSET_TABLE_") == 0)
1225
0
      break;
1226
    /* Fall through.  */
1227
1228
0
    if (dynobj == NULL)
1229
0
      {
1230
        /* Create the .got section.  */
1231
0
        elf_hash_table (info)->dynobj = dynobj = abfd;
1232
0
        if (!_bfd_elf_create_got_section (dynobj, info))
1233
0
    return false;
1234
0
      }
1235
1236
0
    sgot = elf_hash_table (info)->sgot;
1237
0
    srelgot = elf_hash_table (info)->srelgot;
1238
0
    BFD_ASSERT (sgot != NULL);
1239
1240
0
    if (h != NULL)
1241
0
      {
1242
0
        if (h->got.refcount == 0)
1243
0
    {
1244
      /* Make sure this symbol is output as a dynamic symbol.  */
1245
0
      if (h->dynindx == -1 && !h->forced_local)
1246
0
        {
1247
0
          if (!bfd_elf_link_record_dynamic_symbol (info, h))
1248
0
      return false;
1249
0
        }
1250
1251
      /* Allocate space in the .got section.  */
1252
0
      sgot->size += 4;
1253
      /* Allocate relocation space.  */
1254
0
      srelgot->size += sizeof (Elf32_External_Rela);
1255
0
    }
1256
0
        h->got.refcount++;
1257
0
      }
1258
0
    else
1259
0
      {
1260
        /* This is a global offset table entry for a local symbol.  */
1261
0
        if (local_got_refcounts == NULL)
1262
0
    {
1263
0
      bfd_size_type size;
1264
1265
0
      size = symtab_hdr->sh_info;
1266
0
      size *= sizeof (bfd_signed_vma);
1267
0
      local_got_refcounts = ((bfd_signed_vma *)
1268
0
           bfd_zalloc (abfd, size));
1269
0
      if (local_got_refcounts == NULL)
1270
0
        return false;
1271
0
      elf_local_got_refcounts (abfd) = local_got_refcounts;
1272
0
    }
1273
0
        if (local_got_refcounts[r_symndx] == 0)
1274
0
    {
1275
0
      sgot->size += 4;
1276
0
      if (bfd_link_pic (info))
1277
0
        {
1278
          /* If we are generating a shared object, we need to
1279
       output a R_68K_RELATIVE reloc so that the dynamic
1280
       linker can adjust this GOT entry.  */
1281
0
          srelgot->size += sizeof (Elf32_External_Rela);
1282
0
        }
1283
0
    }
1284
0
        local_got_refcounts[r_symndx]++;
1285
0
      }
1286
0
    break;
1287
1288
0
  default:
1289
0
    break;
1290
0
  }
1291
0
    }
1292
1293
0
  return true;
1294
0
}
1295
1296
static enum elf_reloc_type_class
1297
elf32_bfin_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED,
1298
           const asection *rel_sec ATTRIBUTE_UNUSED,
1299
           const Elf_Internal_Rela * rela)
1300
0
{
1301
0
  switch ((int) ELF32_R_TYPE (rela->r_info))
1302
0
    {
1303
0
    default:
1304
0
      return reloc_class_normal;
1305
0
    }
1306
0
}
1307

1308
static bfd_reloc_status_type
1309
bfin_final_link_relocate (Elf_Internal_Rela *rel, reloc_howto_type *howto,
1310
        bfd *input_bfd, asection *input_section,
1311
        bfd_byte *contents, bfd_vma address,
1312
        bfd_vma value, bfd_vma addend)
1313
0
{
1314
0
  int r_type = ELF32_R_TYPE (rel->r_info);
1315
1316
0
  if (r_type == R_BFIN_PCREL24 || r_type == R_BFIN_PCREL24_JUMP_L)
1317
0
    {
1318
0
      bfd_reloc_status_type r = bfd_reloc_ok;
1319
0
      bfd_vma x;
1320
1321
0
      if (!bfd_reloc_offset_in_range (howto, input_bfd, input_section,
1322
0
              address - 2))
1323
0
    return bfd_reloc_outofrange;
1324
1325
0
      value += addend;
1326
1327
      /* Perform usual pc-relative correction.  */
1328
0
      value -= input_section->output_section->vma + input_section->output_offset;
1329
0
      value -= address;
1330
1331
      /* We are getting reloc_entry->address 2 byte off from
1332
   the start of instruction. Assuming absolute postion
1333
   of the reloc data. But, following code had been written assuming
1334
   reloc address is starting at begining of instruction.
1335
   To compensate that I have increased the value of
1336
   relocation by 1 (effectively 2) and used the addr -2 instead of addr.  */
1337
1338
0
      value += 2;
1339
0
      address -= 2;
1340
1341
0
      if ((value & 0xFF000000) != 0
1342
0
    && (value & 0xFF000000) != 0xFF000000)
1343
0
  r = bfd_reloc_overflow;
1344
1345
0
      value >>= 1;
1346
1347
0
      x = bfd_get_16 (input_bfd, contents + address);
1348
0
      x = (x & 0xff00) | ((value >> 16) & 0xff);
1349
0
      bfd_put_16 (input_bfd, x, contents + address);
1350
1351
0
      x = bfd_get_16 (input_bfd, contents + address + 2);
1352
0
      x = value & 0xFFFF;
1353
0
      bfd_put_16 (input_bfd, x, contents + address + 2);
1354
0
      return r;
1355
0
    }
1356
1357
0
  return _bfd_final_link_relocate (howto, input_bfd, input_section, contents,
1358
0
           rel->r_offset, value, addend);
1359
1360
0
}
1361
1362
static int
1363
bfin_relocate_section (bfd * output_bfd,
1364
           struct bfd_link_info *info,
1365
           bfd * input_bfd,
1366
           asection * input_section,
1367
           bfd_byte * contents,
1368
           Elf_Internal_Rela * relocs,
1369
           Elf_Internal_Sym * local_syms,
1370
           asection ** local_sections)
1371
0
{
1372
0
  bfd *dynobj;
1373
0
  Elf_Internal_Shdr *symtab_hdr;
1374
0
  struct elf_link_hash_entry **sym_hashes;
1375
0
  bfd_vma *local_got_offsets;
1376
0
  asection *sgot;
1377
0
  Elf_Internal_Rela *rel;
1378
0
  Elf_Internal_Rela *relend;
1379
1380
0
  dynobj = elf_hash_table (info)->dynobj;
1381
0
  symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
1382
0
  sym_hashes = elf_sym_hashes (input_bfd);
1383
0
  local_got_offsets = elf_local_got_offsets (input_bfd);
1384
1385
0
  sgot = NULL;
1386
1387
0
  rel = relocs;
1388
0
  relend = relocs + input_section->reloc_count;
1389
0
  for (; rel < relend; rel++)
1390
0
    {
1391
0
      int r_type;
1392
0
      reloc_howto_type *howto;
1393
0
      unsigned long r_symndx;
1394
0
      struct elf_link_hash_entry *h;
1395
0
      Elf_Internal_Sym *sym;
1396
0
      asection *sec;
1397
0
      bfd_vma relocation = 0;
1398
0
      bool unresolved_reloc;
1399
0
      bfd_reloc_status_type r;
1400
0
      bfd_vma address;
1401
1402
0
      r_type = ELF32_R_TYPE (rel->r_info);
1403
0
      if (r_type < 0 || r_type >= 243)
1404
0
  {
1405
0
    bfd_set_error (bfd_error_bad_value);
1406
0
    return false;
1407
0
  }
1408
1409
0
      if (r_type == R_BFIN_GNU_VTENTRY
1410
0
    || r_type == R_BFIN_GNU_VTINHERIT)
1411
0
  continue;
1412
1413
0
      howto = bfin_reloc_type_lookup (input_bfd, r_type);
1414
0
      if (howto == NULL)
1415
0
  {
1416
0
    bfd_set_error (bfd_error_bad_value);
1417
0
    return false;
1418
0
  }
1419
0
      r_symndx = ELF32_R_SYM (rel->r_info);
1420
1421
0
      h = NULL;
1422
0
      sym = NULL;
1423
0
      sec = NULL;
1424
0
      unresolved_reloc = false;
1425
1426
0
      if (r_symndx < symtab_hdr->sh_info)
1427
0
  {
1428
0
    sym = local_syms + r_symndx;
1429
0
    sec = local_sections[r_symndx];
1430
0
    relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
1431
0
  }
1432
0
      else
1433
0
  {
1434
0
    bool warned, ignored;
1435
1436
0
    RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
1437
0
           r_symndx, symtab_hdr, sym_hashes,
1438
0
           h, sec, relocation,
1439
0
           unresolved_reloc, warned, ignored);
1440
0
  }
1441
1442
0
      if (sec != NULL && discarded_section (sec))
1443
0
  RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
1444
0
           rel, 1, relend, R_BFIN_UNUSED0,
1445
0
           howto, 0, contents);
1446
1447
0
      if (bfd_link_relocatable (info))
1448
0
  continue;
1449
1450
0
      address = rel->r_offset;
1451
1452
      /* Then, process normally.  */
1453
0
      switch (r_type)
1454
0
  {
1455
0
  case R_BFIN_GNU_VTINHERIT:
1456
0
  case R_BFIN_GNU_VTENTRY:
1457
0
    return bfd_reloc_ok;
1458
1459
0
  case R_BFIN_GOT:
1460
    /* Relocation is to the address of the entry for this symbol
1461
       in the global offset table.  */
1462
0
    if (h != NULL
1463
0
        && strcmp (h->root.root.string, "__GLOBAL_OFFSET_TABLE_") == 0)
1464
0
      goto do_default;
1465
    /* Fall through.  */
1466
    /* Relocation is the offset of the entry for this symbol in
1467
       the global offset table.  */
1468
1469
0
    {
1470
0
      bfd_vma off;
1471
1472
0
      if (dynobj == NULL)
1473
0
        {
1474
    /* Create the .got section.  */
1475
0
    elf_hash_table (info)->dynobj = dynobj = output_bfd;
1476
0
    if (!_bfd_elf_create_got_section (dynobj, info))
1477
0
      return false;
1478
0
        }
1479
1480
0
      sgot = elf_hash_table (info)->sgot;
1481
0
      BFD_ASSERT (sgot != NULL);
1482
1483
0
      if (h != NULL)
1484
0
        {
1485
0
    bool dyn;
1486
1487
0
    off = h->got.offset;
1488
0
    BFD_ASSERT (off != (bfd_vma) - 1);
1489
0
    dyn = elf_hash_table (info)->dynamic_sections_created;
1490
1491
0
    if (!WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn,
1492
0
                  bfd_link_pic (info),
1493
0
                  h)
1494
0
        || (bfd_link_pic (info)
1495
0
      && (info->symbolic
1496
0
          || h->dynindx == -1
1497
0
          || h->forced_local)
1498
0
      && h->def_regular))
1499
0
      {
1500
        /* This is actually a static link, or it is a
1501
           -Bsymbolic link and the symbol is defined
1502
           locally, or the symbol was forced to be local
1503
           because of a version file..  We must initialize
1504
           this entry in the global offset table.  Since
1505
           the offset must always be a multiple of 4, we
1506
           use the least significant bit to record whether
1507
           we have initialized it already.
1508
1509
           When doing a dynamic link, we create a .rela.got
1510
           relocation entry to initialize the value.  This
1511
           is done in the finish_dynamic_symbol routine.  */
1512
0
        if ((off & 1) != 0)
1513
0
          off &= ~1;
1514
0
        else
1515
0
          {
1516
0
      bfd_put_32 (output_bfd, relocation,
1517
0
            sgot->contents + off);
1518
0
      h->got.offset |= 1;
1519
0
          }
1520
0
      }
1521
0
    else
1522
0
      unresolved_reloc = false;
1523
0
        }
1524
0
      else
1525
0
        {
1526
0
    BFD_ASSERT (local_got_offsets != NULL);
1527
0
    off = local_got_offsets[r_symndx];
1528
0
    BFD_ASSERT (off != (bfd_vma) - 1);
1529
1530
    /* The offset must always be a multiple of 4.  We use
1531
       the least significant bit to record whether we have
1532
       already generated the necessary reloc.  */
1533
0
    if ((off & 1) != 0)
1534
0
      off &= ~1;
1535
0
    else
1536
0
      {
1537
0
        bfd_put_32 (output_bfd, relocation, sgot->contents + off);
1538
1539
0
        if (bfd_link_pic (info))
1540
0
          {
1541
0
      asection *s;
1542
0
      Elf_Internal_Rela outrel;
1543
0
      bfd_byte *loc;
1544
1545
0
      s = elf_hash_table (info)->srelgot;
1546
0
      BFD_ASSERT (s != NULL);
1547
1548
0
      outrel.r_offset = (sgot->output_section->vma
1549
0
             + sgot->output_offset + off);
1550
0
      outrel.r_info =
1551
0
        ELF32_R_INFO (0, R_BFIN_PCREL24);
1552
0
      outrel.r_addend = relocation;
1553
0
      loc = s->contents;
1554
0
      loc +=
1555
0
        s->reloc_count++ * sizeof (Elf32_External_Rela);
1556
0
      bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
1557
0
          }
1558
1559
0
        local_got_offsets[r_symndx] |= 1;
1560
0
      }
1561
0
        }
1562
1563
0
      relocation = sgot->output_offset + off;
1564
0
      rel->r_addend = 0;
1565
      /* bfin : preg = [preg + 17bitdiv4offset] relocation is div by 4.  */
1566
0
      relocation /= 4;
1567
0
    }
1568
0
    goto do_default;
1569
1570
0
  default:
1571
0
  do_default:
1572
0
    r = bfin_final_link_relocate (rel, howto, input_bfd, input_section,
1573
0
          contents, address,
1574
0
          relocation, rel->r_addend);
1575
1576
0
    break;
1577
0
  }
1578
1579
      /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
1580
   because such sections are not SEC_ALLOC and thus ld.so will
1581
   not process them.  */
1582
0
      if (unresolved_reloc
1583
0
    && !((input_section->flags & SEC_DEBUGGING) != 0 && h->def_dynamic)
1584
0
    && _bfd_elf_section_offset (output_bfd, info, input_section,
1585
0
              rel->r_offset) != (bfd_vma) -1)
1586
0
  {
1587
0
    _bfd_error_handler
1588
      /* xgettext:c-format */
1589
0
      (_("%pB(%pA+%#" PRIx64 "): "
1590
0
         "unresolvable relocation against symbol `%s'"),
1591
0
       input_bfd, input_section, (uint64_t) rel->r_offset,
1592
0
       h->root.root.string);
1593
0
    return false;
1594
0
  }
1595
1596
0
      if (r != bfd_reloc_ok)
1597
0
  {
1598
0
    const char *name;
1599
1600
0
    if (h != NULL)
1601
0
      name = h->root.root.string;
1602
0
    else
1603
0
      {
1604
0
        name = bfd_elf_string_from_elf_section (input_bfd,
1605
0
                  symtab_hdr->sh_link,
1606
0
                  sym->st_name);
1607
0
        if (name == NULL)
1608
0
    return false;
1609
0
        if (*name == '\0')
1610
0
    name = bfd_section_name (sec);
1611
0
      }
1612
1613
0
    if (r == bfd_reloc_overflow)
1614
0
      (*info->callbacks->reloc_overflow)
1615
0
        (info, (h ? &h->root : NULL), name, howto->name,
1616
0
         (bfd_vma) 0, input_bfd, input_section, rel->r_offset);
1617
0
    else
1618
0
      {
1619
0
        _bfd_error_handler
1620
    /* xgettext:c-format */
1621
0
    (_("%pB(%pA+%#" PRIx64 "): reloc against `%s': error %d"),
1622
0
     input_bfd, input_section, (uint64_t) rel->r_offset,
1623
0
     name, (int) r);
1624
0
        return false;
1625
0
      }
1626
0
  }
1627
0
    }
1628
1629
0
  return true;
1630
0
}
1631
1632
static asection *
1633
bfin_gc_mark_hook (asection *sec,
1634
       struct bfd_link_info *info,
1635
       struct elf_reloc_cookie *cookie,
1636
       struct elf_link_hash_entry *h,
1637
       unsigned int symndx)
1638
0
{
1639
0
  if (h != NULL)
1640
0
    switch (ELF32_R_TYPE (cookie->rel->r_info))
1641
0
      {
1642
0
      case R_BFIN_GNU_VTINHERIT:
1643
0
      case R_BFIN_GNU_VTENTRY:
1644
0
  return NULL;
1645
0
      }
1646
1647
0
  return _bfd_elf_gc_mark_hook (sec, info, cookie, h, symndx);
1648
0
}
1649

1650
extern const bfd_target bfin_elf32_fdpic_vec;
1651
1.21k
#define IS_FDPIC(bfd) ((bfd)->xvec == &bfin_elf32_fdpic_vec)
1652
1653
/* An extension of the elf hash table data structure,
1654
   containing some additional Blackfin-specific data.  */
1655
struct bfinfdpic_elf_link_hash_table
1656
{
1657
  struct elf_link_hash_table elf;
1658
1659
  /* A pointer to the .rofixup section.  */
1660
  asection *sgotfixup;
1661
  /* GOT base offset.  */
1662
  bfd_vma got0;
1663
  /* Location of the first non-lazy PLT entry, i.e., the number of
1664
     bytes taken by lazy PLT entries.  */
1665
  bfd_vma plt0;
1666
  /* A hash table holding information about which symbols were
1667
     referenced with which PIC-related relocations.  */
1668
  struct htab *relocs_info;
1669
  /* Summary reloc information collected by
1670
     _bfinfdpic_count_got_plt_entries.  */
1671
  struct _bfinfdpic_dynamic_got_info *g;
1672
};
1673
1674
/* Get the Blackfin ELF linker hash table from a link_info structure.  */
1675
1676
#define bfinfdpic_hash_table(p) \
1677
0
  ((is_elf_hash_table ((p)->hash)          \
1678
0
    && elf_hash_table_id (elf_hash_table (p)) == BFIN_ELF_DATA)   \
1679
0
   ? (struct bfinfdpic_elf_link_hash_table *) (p)->hash : NULL)
1680
1681
#define bfinfdpic_got_section(info) \
1682
0
  (bfinfdpic_hash_table (info)->elf.sgot)
1683
#define bfinfdpic_gotrel_section(info) \
1684
0
  (bfinfdpic_hash_table (info)->elf.srelgot)
1685
#define bfinfdpic_gotfixup_section(info) \
1686
0
  (bfinfdpic_hash_table (info)->sgotfixup)
1687
#define bfinfdpic_plt_section(info) \
1688
0
  (bfinfdpic_hash_table (info)->elf.splt)
1689
#define bfinfdpic_pltrel_section(info) \
1690
0
  (bfinfdpic_hash_table (info)->elf.srelplt)
1691
#define bfinfdpic_relocs_info(info) \
1692
0
  (bfinfdpic_hash_table (info)->relocs_info)
1693
#define bfinfdpic_got_initial_offset(info) \
1694
0
  (bfinfdpic_hash_table (info)->got0)
1695
#define bfinfdpic_plt_initial_offset(info) \
1696
0
  (bfinfdpic_hash_table (info)->plt0)
1697
#define bfinfdpic_dynamic_got_plt_info(info) \
1698
0
  (bfinfdpic_hash_table (info)->g)
1699
1700
/* The name of the dynamic interpreter.  This is put in the .interp
1701
   section.  */
1702
1703
0
#define ELF_DYNAMIC_INTERPRETER "/lib/ld.so.1"
1704
1705
0
#define DEFAULT_STACK_SIZE 0x20000
1706
1707
/* This structure is used to collect the number of entries present in
1708
   each addressable range of the got.  */
1709
struct _bfinfdpic_dynamic_got_info
1710
{
1711
  /* Several bits of information about the current link.  */
1712
  struct bfd_link_info *info;
1713
  /* Total size needed for GOT entries within the 18- or 32-bit
1714
     ranges.  */
1715
  bfd_vma got17m4, gothilo;
1716
  /* Total size needed for function descriptor entries within the 18-
1717
     or 32-bit ranges.  */
1718
  bfd_vma fd17m4, fdhilo;
1719
  /* Total size needed function descriptor entries referenced in PLT
1720
     entries, that would be profitable to place in offsets close to
1721
     the PIC register.  */
1722
  bfd_vma fdplt;
1723
  /* Total size needed by lazy PLT entries.  */
1724
  bfd_vma lzplt;
1725
  /* Number of relocations carried over from input object files.  */
1726
  unsigned long relocs;
1727
  /* Number of fixups introduced by relocations in input object files.  */
1728
  unsigned long fixups;
1729
};
1730
1731
/* Create a Blackfin ELF linker hash table.  */
1732
1733
static struct bfd_link_hash_table *
1734
bfinfdpic_elf_link_hash_table_create (bfd *abfd)
1735
0
{
1736
0
  struct bfinfdpic_elf_link_hash_table *ret;
1737
0
  size_t amt = sizeof (struct bfinfdpic_elf_link_hash_table);
1738
1739
0
  ret = bfd_zmalloc (amt);
1740
0
  if (ret == NULL)
1741
0
    return NULL;
1742
1743
0
  if (!_bfd_elf_link_hash_table_init (&ret->elf, abfd,
1744
0
              _bfd_elf_link_hash_newfunc,
1745
0
              sizeof (struct elf_link_hash_entry)))
1746
0
    {
1747
0
      free (ret);
1748
0
      return NULL;
1749
0
    }
1750
1751
0
  return &ret->elf.root;
1752
0
}
1753
1754
/* Decide whether a reference to a symbol can be resolved locally or
1755
   not.  If the symbol is protected, we want the local address, but
1756
   its function descriptor must be assigned by the dynamic linker.  */
1757
#define BFINFDPIC_SYM_LOCAL(INFO, H) \
1758
0
  (_bfd_elf_symbol_refs_local_p ((H), (INFO), 1) \
1759
0
   || ! elf_hash_table (INFO)->dynamic_sections_created)
1760
#define BFINFDPIC_FUNCDESC_LOCAL(INFO, H) \
1761
0
  ((H)->dynindx == -1 || ! elf_hash_table (INFO)->dynamic_sections_created)
1762
1763
/* This structure collects information on what kind of GOT, PLT or
1764
   function descriptors are required by relocations that reference a
1765
   certain symbol.  */
1766
struct bfinfdpic_relocs_info
1767
{
1768
  /* The index of the symbol, as stored in the relocation r_info, if
1769
     we have a local symbol; -1 otherwise.  */
1770
  long symndx;
1771
  union
1772
  {
1773
    /* The input bfd in which the symbol is defined, if it's a local
1774
       symbol.  */
1775
    bfd *abfd;
1776
    /* If symndx == -1, the hash table entry corresponding to a global
1777
       symbol (even if it turns out to bind locally, in which case it
1778
       should ideally be replaced with section's symndx + addend).  */
1779
    struct elf_link_hash_entry *h;
1780
  } d;
1781
  /* The addend of the relocation that references the symbol.  */
1782
  bfd_vma addend;
1783
1784
  /* The fields above are used to identify an entry.  The fields below
1785
     contain information on how an entry is used and, later on, which
1786
     locations it was assigned.  */
1787
  /* The following 2 fields record whether the symbol+addend above was
1788
     ever referenced with a GOT relocation.  The 17M4 suffix indicates a
1789
     GOT17M4 relocation; hilo is used for GOTLO/GOTHI pairs.  */
1790
  unsigned got17m4;
1791
  unsigned gothilo;
1792
  /* Whether a FUNCDESC relocation references symbol+addend.  */
1793
  unsigned fd;
1794
  /* Whether a FUNCDESC_GOT relocation references symbol+addend.  */
1795
  unsigned fdgot17m4;
1796
  unsigned fdgothilo;
1797
  /* Whether a FUNCDESC_GOTOFF relocation references symbol+addend.  */
1798
  unsigned fdgoff17m4;
1799
  unsigned fdgoffhilo;
1800
  /* Whether symbol+addend is referenced with GOTOFF17M4, GOTOFFLO or
1801
     GOTOFFHI relocations.  The addend doesn't really matter, since we
1802
     envision that this will only be used to check whether the symbol
1803
     is mapped to the same segment as the got.  */
1804
  unsigned gotoff;
1805
  /* Whether symbol+addend is referenced by a LABEL24 relocation.  */
1806
  unsigned call;
1807
  /* Whether symbol+addend is referenced by a 32 or FUNCDESC_VALUE
1808
     relocation.  */
1809
  unsigned sym;
1810
  /* Whether we need a PLT entry for a symbol.  Should be implied by
1811
     something like:
1812
     (call && symndx == -1 && ! BFINFDPIC_SYM_LOCAL (info, d.h))  */
1813
  unsigned plt:1;
1814
  /* Whether a function descriptor should be created in this link unit
1815
     for symbol+addend.  Should be implied by something like:
1816
     (plt || fdgotoff17m4 || fdgotofflohi
1817
      || ((fd || fdgot17m4 || fdgothilo)
1818
    && (symndx != -1 || BFINFDPIC_FUNCDESC_LOCAL (info, d.h))))  */
1819
  unsigned privfd:1;
1820
  /* Whether a lazy PLT entry is needed for this symbol+addend.
1821
     Should be implied by something like:
1822
     (privfd && symndx == -1 && ! BFINFDPIC_SYM_LOCAL (info, d.h)
1823
      && ! (info->flags & DF_BIND_NOW))  */
1824
  unsigned lazyplt:1;
1825
  /* Whether we've already emitted GOT relocations and PLT entries as
1826
     needed for this symbol.  */
1827
  unsigned done:1;
1828
1829
  /* The number of R_BFIN_BYTE4_DATA, R_BFIN_FUNCDESC and R_BFIN_FUNCDESC_VALUE
1830
     relocations referencing the symbol.  */
1831
  unsigned relocs32, relocsfd, relocsfdv;
1832
1833
  /* The number of .rofixups entries and dynamic relocations allocated
1834
     for this symbol, minus any that might have already been used.  */
1835
  unsigned fixups, dynrelocs;
1836
1837
  /* The offsets of the GOT entries assigned to symbol+addend, to the
1838
     function descriptor's address, and to a function descriptor,
1839
     respectively.  Should be zero if unassigned.  The offsets are
1840
     counted from the value that will be assigned to the PIC register,
1841
     not from the beginning of the .got section.  */
1842
  bfd_signed_vma got_entry, fdgot_entry, fd_entry;
1843
  /* The offsets of the PLT entries assigned to symbol+addend,
1844
     non-lazy and lazy, respectively.  If unassigned, should be
1845
     (bfd_vma)-1.  */
1846
  bfd_vma plt_entry, lzplt_entry;
1847
};
1848
1849
/* Compute a hash with the key fields of an bfinfdpic_relocs_info entry.  */
1850
static hashval_t
1851
bfinfdpic_relocs_info_hash (const void *entry_)
1852
0
{
1853
0
  const struct bfinfdpic_relocs_info *entry = entry_;
1854
1855
0
  return (entry->symndx == -1
1856
0
    ? (long) entry->d.h->root.root.hash
1857
0
    : entry->symndx + (long) entry->d.abfd->id * 257) + entry->addend;
1858
0
}
1859
1860
/* Test whether the key fields of two bfinfdpic_relocs_info entries are
1861
   identical.  */
1862
static int
1863
bfinfdpic_relocs_info_eq (const void *entry1, const void *entry2)
1864
0
{
1865
0
  const struct bfinfdpic_relocs_info *e1 = entry1;
1866
0
  const struct bfinfdpic_relocs_info *e2 = entry2;
1867
1868
0
  return e1->symndx == e2->symndx && e1->addend == e2->addend
1869
0
    && (e1->symndx == -1 ? e1->d.h == e2->d.h : e1->d.abfd == e2->d.abfd);
1870
0
}
1871
1872
/* Find or create an entry in a hash table HT that matches the key
1873
   fields of the given ENTRY.  If it's not found, memory for a new
1874
   entry is allocated in ABFD's obstack.  */
1875
static struct bfinfdpic_relocs_info *
1876
bfinfdpic_relocs_info_find (struct htab *ht,
1877
         bfd *abfd,
1878
         const struct bfinfdpic_relocs_info *entry,
1879
         enum insert_option insert)
1880
0
{
1881
0
  struct bfinfdpic_relocs_info **loc;
1882
1883
0
  if (!ht)
1884
0
    return NULL;
1885
1886
0
  loc = (struct bfinfdpic_relocs_info **) htab_find_slot (ht, entry, insert);
1887
1888
0
  if (! loc)
1889
0
    return NULL;
1890
1891
0
  if (*loc)
1892
0
    return *loc;
1893
1894
0
  *loc = bfd_zalloc (abfd, sizeof (**loc));
1895
1896
0
  if (! *loc)
1897
0
    return *loc;
1898
1899
0
  (*loc)->symndx = entry->symndx;
1900
0
  (*loc)->d = entry->d;
1901
0
  (*loc)->addend = entry->addend;
1902
0
  (*loc)->plt_entry = (bfd_vma)-1;
1903
0
  (*loc)->lzplt_entry = (bfd_vma)-1;
1904
1905
0
  return *loc;
1906
0
}
1907
1908
/* Obtain the address of the entry in HT associated with H's symbol +
1909
   addend, creating a new entry if none existed.  ABFD is only used
1910
   for memory allocation purposes.  */
1911
inline static struct bfinfdpic_relocs_info *
1912
bfinfdpic_relocs_info_for_global (struct htab *ht,
1913
          bfd *abfd,
1914
          struct elf_link_hash_entry *h,
1915
          bfd_vma addend,
1916
          enum insert_option insert)
1917
0
{
1918
0
  struct bfinfdpic_relocs_info entry;
1919
1920
0
  entry.symndx = -1;
1921
0
  entry.d.h = h;
1922
0
  entry.addend = addend;
1923
1924
0
  return bfinfdpic_relocs_info_find (ht, abfd, &entry, insert);
1925
0
}
1926
1927
/* Obtain the address of the entry in HT associated with the SYMNDXth
1928
   local symbol of the input bfd ABFD, plus the addend, creating a new
1929
   entry if none existed.  */
1930
inline static struct bfinfdpic_relocs_info *
1931
bfinfdpic_relocs_info_for_local (struct htab *ht,
1932
        bfd *abfd,
1933
        long symndx,
1934
        bfd_vma addend,
1935
        enum insert_option insert)
1936
0
{
1937
0
  struct bfinfdpic_relocs_info entry;
1938
1939
0
  entry.symndx = symndx;
1940
0
  entry.d.abfd = abfd;
1941
0
  entry.addend = addend;
1942
1943
0
  return bfinfdpic_relocs_info_find (ht, abfd, &entry, insert);
1944
0
}
1945
1946
/* Merge fields set by check_relocs() of two entries that end up being
1947
   mapped to the same (presumably global) symbol.  */
1948
1949
inline static void
1950
bfinfdpic_pic_merge_early_relocs_info (struct bfinfdpic_relocs_info *e2,
1951
               struct bfinfdpic_relocs_info const *e1)
1952
0
{
1953
0
  e2->got17m4 |= e1->got17m4;
1954
0
  e2->gothilo |= e1->gothilo;
1955
0
  e2->fd |= e1->fd;
1956
0
  e2->fdgot17m4 |= e1->fdgot17m4;
1957
0
  e2->fdgothilo |= e1->fdgothilo;
1958
0
  e2->fdgoff17m4 |= e1->fdgoff17m4;
1959
0
  e2->fdgoffhilo |= e1->fdgoffhilo;
1960
0
  e2->gotoff |= e1->gotoff;
1961
0
  e2->call |= e1->call;
1962
0
  e2->sym |= e1->sym;
1963
0
}
1964
1965
/* Every block of 65535 lazy PLT entries shares a single call to the
1966
   resolver, inserted in the 32768th lazy PLT entry (i.e., entry #
1967
   32767, counting from 0).  All other lazy PLT entries branch to it
1968
   in a single instruction.  */
1969
1970
0
#define LZPLT_RESOLVER_EXTRA 10
1971
0
#define LZPLT_NORMAL_SIZE 6
1972
0
#define LZPLT_ENTRIES 1362
1973
1974
0
#define BFINFDPIC_LZPLT_BLOCK_SIZE ((bfd_vma) LZPLT_NORMAL_SIZE * LZPLT_ENTRIES + LZPLT_RESOLVER_EXTRA)
1975
0
#define BFINFDPIC_LZPLT_RESOLV_LOC (LZPLT_NORMAL_SIZE * LZPLT_ENTRIES / 2)
1976
1977
/* Add a dynamic relocation to the SRELOC section.  */
1978
1979
inline static bfd_vma
1980
_bfinfdpic_add_dyn_reloc (bfd *output_bfd, asection *sreloc, bfd_vma offset,
1981
       int reloc_type, long dynindx, bfd_vma addend,
1982
       struct bfinfdpic_relocs_info *entry)
1983
0
{
1984
0
  Elf_Internal_Rela outrel;
1985
0
  bfd_vma reloc_offset;
1986
1987
0
  outrel.r_offset = offset;
1988
0
  outrel.r_info = ELF32_R_INFO (dynindx, reloc_type);
1989
0
  outrel.r_addend = addend;
1990
1991
0
  reloc_offset = sreloc->reloc_count * sizeof (Elf32_External_Rel);
1992
0
  BFD_ASSERT (reloc_offset < sreloc->size);
1993
0
  bfd_elf32_swap_reloc_out (output_bfd, &outrel,
1994
0
          sreloc->contents + reloc_offset);
1995
0
  sreloc->reloc_count++;
1996
1997
  /* If the entry's index is zero, this relocation was probably to a
1998
     linkonce section that got discarded.  We reserved a dynamic
1999
     relocation, but it was for another entry than the one we got at
2000
     the time of emitting the relocation.  Unfortunately there's no
2001
     simple way for us to catch this situation, since the relocation
2002
     is cleared right before calling relocate_section, at which point
2003
     we no longer know what the relocation used to point to.  */
2004
0
  if (entry->symndx)
2005
0
    {
2006
0
      BFD_ASSERT (entry->dynrelocs > 0);
2007
0
      entry->dynrelocs--;
2008
0
    }
2009
2010
0
  return reloc_offset;
2011
0
}
2012
2013
/* Add a fixup to the ROFIXUP section.  */
2014
2015
static bfd_vma
2016
_bfinfdpic_add_rofixup (bfd *output_bfd, asection *rofixup, bfd_vma offset,
2017
      struct bfinfdpic_relocs_info *entry)
2018
0
{
2019
0
  bfd_vma fixup_offset;
2020
2021
0
  if (rofixup->flags & SEC_EXCLUDE)
2022
0
    return -1;
2023
2024
0
  fixup_offset = rofixup->reloc_count * 4;
2025
0
  if (rofixup->contents)
2026
0
    {
2027
0
      BFD_ASSERT (fixup_offset < rofixup->size);
2028
0
      bfd_put_32 (output_bfd, offset, rofixup->contents + fixup_offset);
2029
0
    }
2030
0
  rofixup->reloc_count++;
2031
2032
0
  if (entry && entry->symndx)
2033
0
    {
2034
      /* See discussion about symndx == 0 in _bfinfdpic_add_dyn_reloc
2035
   above.  */
2036
0
      BFD_ASSERT (entry->fixups > 0);
2037
0
      entry->fixups--;
2038
0
    }
2039
2040
0
  return fixup_offset;
2041
0
}
2042
2043
/* Find the segment number in which OSEC, and output section, is
2044
   located.  */
2045
2046
static unsigned
2047
_bfinfdpic_osec_to_segment (bfd *output_bfd, asection *osec)
2048
0
{
2049
0
  Elf_Internal_Phdr *p = _bfd_elf_find_segment_containing_section (output_bfd, osec);
2050
2051
0
  return (p != NULL) ? p - elf_tdata (output_bfd)->phdr : -1;
2052
0
}
2053
2054
inline static bool
2055
_bfinfdpic_osec_readonly_p (bfd *output_bfd, asection *osec)
2056
0
{
2057
0
  unsigned seg = _bfinfdpic_osec_to_segment (output_bfd, osec);
2058
2059
0
  return ! (elf_tdata (output_bfd)->phdr[seg].p_flags & PF_W);
2060
0
}
2061
2062
/* Generate relocations for GOT entries, function descriptors, and
2063
   code for PLT and lazy PLT entries.  */
2064
2065
inline static bool
2066
_bfinfdpic_emit_got_relocs_plt_entries (struct bfinfdpic_relocs_info *entry,
2067
          bfd *output_bfd,
2068
          struct bfd_link_info *info,
2069
          asection *sec,
2070
          Elf_Internal_Sym *sym,
2071
          bfd_vma addend)
2072
0
{
2073
0
  bfd_vma fd_lazy_rel_offset = (bfd_vma) -1;
2074
0
  int dynindx = -1;
2075
2076
0
  if (entry->done)
2077
0
    return true;
2078
0
  entry->done = 1;
2079
2080
0
  if (entry->got_entry || entry->fdgot_entry || entry->fd_entry)
2081
0
    {
2082
      /* If the symbol is dynamic, consider it for dynamic
2083
   relocations, otherwise decay to section + offset.  */
2084
0
      if (entry->symndx == -1 && entry->d.h->dynindx != -1)
2085
0
  dynindx = entry->d.h->dynindx;
2086
0
      else
2087
0
  {
2088
0
    if (sec
2089
0
        && sec->output_section
2090
0
        && ! bfd_is_abs_section (sec->output_section)
2091
0
        && ! bfd_is_und_section (sec->output_section))
2092
0
      dynindx = elf_section_data (sec->output_section)->dynindx;
2093
0
    else
2094
0
      dynindx = 0;
2095
0
  }
2096
0
    }
2097
2098
  /* Generate relocation for GOT entry pointing to the symbol.  */
2099
0
  if (entry->got_entry)
2100
0
    {
2101
0
      int idx = dynindx;
2102
0
      bfd_vma ad = addend;
2103
2104
      /* If the symbol is dynamic but binds locally, use
2105
   section+offset.  */
2106
0
      if (sec && (entry->symndx != -1
2107
0
      || BFINFDPIC_SYM_LOCAL (info, entry->d.h)))
2108
0
  {
2109
0
    if (entry->symndx == -1)
2110
0
      ad += entry->d.h->root.u.def.value;
2111
0
    else
2112
0
      ad += sym->st_value;
2113
0
    ad += sec->output_offset;
2114
0
    if (sec->output_section && elf_section_data (sec->output_section))
2115
0
      idx = elf_section_data (sec->output_section)->dynindx;
2116
0
    else
2117
0
      idx = 0;
2118
0
  }
2119
2120
      /* If we're linking an executable at a fixed address, we can
2121
   omit the dynamic relocation as long as the symbol is local to
2122
   this module.  */
2123
0
      if (bfd_link_pde (info)
2124
0
    && (entry->symndx != -1
2125
0
        || BFINFDPIC_SYM_LOCAL (info, entry->d.h)))
2126
0
  {
2127
0
    if (sec)
2128
0
      ad += sec->output_section->vma;
2129
0
    if (entry->symndx != -1
2130
0
        || entry->d.h->root.type != bfd_link_hash_undefweak)
2131
0
      _bfinfdpic_add_rofixup (output_bfd,
2132
0
           bfinfdpic_gotfixup_section (info),
2133
0
           bfinfdpic_got_section (info)->output_section
2134
0
           ->vma
2135
0
           + bfinfdpic_got_section (info)->output_offset
2136
0
           + bfinfdpic_got_initial_offset (info)
2137
0
           + entry->got_entry, entry);
2138
0
  }
2139
0
      else
2140
0
  _bfinfdpic_add_dyn_reloc (output_bfd, bfinfdpic_gotrel_section (info),
2141
0
         _bfd_elf_section_offset
2142
0
         (output_bfd, info,
2143
0
          bfinfdpic_got_section (info),
2144
0
          bfinfdpic_got_initial_offset (info)
2145
0
          + entry->got_entry)
2146
0
         + bfinfdpic_got_section (info)
2147
0
         ->output_section->vma
2148
0
         + bfinfdpic_got_section (info)->output_offset,
2149
0
         R_BFIN_BYTE4_DATA, idx, ad, entry);
2150
2151
0
      bfd_put_32 (output_bfd, ad,
2152
0
      bfinfdpic_got_section (info)->contents
2153
0
      + bfinfdpic_got_initial_offset (info)
2154
0
      + entry->got_entry);
2155
0
    }
2156
2157
  /* Generate relocation for GOT entry pointing to a canonical
2158
     function descriptor.  */
2159
0
  if (entry->fdgot_entry)
2160
0
    {
2161
0
      int reloc, idx;
2162
0
      bfd_vma ad = 0;
2163
2164
0
      if (! (entry->symndx == -1
2165
0
       && entry->d.h->root.type == bfd_link_hash_undefweak
2166
0
       && BFINFDPIC_SYM_LOCAL (info, entry->d.h)))
2167
0
  {
2168
    /* If the symbol is dynamic and there may be dynamic symbol
2169
       resolution because we are, or are linked with, a shared
2170
       library, emit a FUNCDESC relocation such that the dynamic
2171
       linker will allocate the function descriptor.  If the
2172
       symbol needs a non-local function descriptor but binds
2173
       locally (e.g., its visibility is protected, emit a
2174
       dynamic relocation decayed to section+offset.  */
2175
0
    if (entry->symndx == -1
2176
0
        && ! BFINFDPIC_FUNCDESC_LOCAL (info, entry->d.h)
2177
0
        && BFINFDPIC_SYM_LOCAL (info, entry->d.h)
2178
0
        && !bfd_link_pde (info))
2179
0
      {
2180
0
        reloc = R_BFIN_FUNCDESC;
2181
0
        idx = elf_section_data (entry->d.h->root.u.def.section
2182
0
              ->output_section)->dynindx;
2183
0
        ad = entry->d.h->root.u.def.section->output_offset
2184
0
    + entry->d.h->root.u.def.value;
2185
0
      }
2186
0
    else if (entry->symndx == -1
2187
0
       && ! BFINFDPIC_FUNCDESC_LOCAL (info, entry->d.h))
2188
0
      {
2189
0
        reloc = R_BFIN_FUNCDESC;
2190
0
        idx = dynindx;
2191
0
        ad = addend;
2192
0
        if (ad)
2193
0
    return false;
2194
0
      }
2195
0
    else
2196
0
      {
2197
        /* Otherwise, we know we have a private function descriptor,
2198
     so reference it directly.  */
2199
0
        if (elf_hash_table (info)->dynamic_sections_created)
2200
0
    BFD_ASSERT (entry->privfd);
2201
0
        reloc = R_BFIN_BYTE4_DATA;
2202
0
        idx = elf_section_data (bfinfdpic_got_section (info)
2203
0
              ->output_section)->dynindx;
2204
0
        ad = bfinfdpic_got_section (info)->output_offset
2205
0
    + bfinfdpic_got_initial_offset (info) + entry->fd_entry;
2206
0
      }
2207
2208
    /* If there is room for dynamic symbol resolution, emit the
2209
       dynamic relocation.  However, if we're linking an
2210
       executable at a fixed location, we won't have emitted a
2211
       dynamic symbol entry for the got section, so idx will be
2212
       zero, which means we can and should compute the address
2213
       of the private descriptor ourselves.  */
2214
0
    if (bfd_link_pde (info)
2215
0
        && (entry->symndx != -1
2216
0
      || BFINFDPIC_FUNCDESC_LOCAL (info, entry->d.h)))
2217
0
      {
2218
0
        ad += bfinfdpic_got_section (info)->output_section->vma;
2219
0
        _bfinfdpic_add_rofixup (output_bfd,
2220
0
             bfinfdpic_gotfixup_section (info),
2221
0
             bfinfdpic_got_section (info)
2222
0
             ->output_section->vma
2223
0
             + bfinfdpic_got_section (info)
2224
0
             ->output_offset
2225
0
             + bfinfdpic_got_initial_offset (info)
2226
0
             + entry->fdgot_entry, entry);
2227
0
      }
2228
0
    else
2229
0
      _bfinfdpic_add_dyn_reloc (output_bfd,
2230
0
             bfinfdpic_gotrel_section (info),
2231
0
             _bfd_elf_section_offset
2232
0
             (output_bfd, info,
2233
0
              bfinfdpic_got_section (info),
2234
0
              bfinfdpic_got_initial_offset (info)
2235
0
              + entry->fdgot_entry)
2236
0
             + bfinfdpic_got_section (info)
2237
0
             ->output_section->vma
2238
0
             + bfinfdpic_got_section (info)
2239
0
             ->output_offset,
2240
0
             reloc, idx, ad, entry);
2241
0
  }
2242
2243
0
      bfd_put_32 (output_bfd, ad,
2244
0
      bfinfdpic_got_section (info)->contents
2245
0
      + bfinfdpic_got_initial_offset (info)
2246
0
      + entry->fdgot_entry);
2247
0
    }
2248
2249
  /* Generate relocation to fill in a private function descriptor in
2250
     the GOT.  */
2251
0
  if (entry->fd_entry)
2252
0
    {
2253
0
      int idx = dynindx;
2254
0
      bfd_vma ad = addend;
2255
0
      bfd_vma ofst;
2256
0
      long lowword, highword;
2257
2258
      /* If the symbol is dynamic but binds locally, use
2259
   section+offset.  */
2260
0
      if (sec && (entry->symndx != -1
2261
0
      || BFINFDPIC_SYM_LOCAL (info, entry->d.h)))
2262
0
  {
2263
0
    if (entry->symndx == -1)
2264
0
      ad += entry->d.h->root.u.def.value;
2265
0
    else
2266
0
      ad += sym->st_value;
2267
0
    ad += sec->output_offset;
2268
0
    if (sec->output_section && elf_section_data (sec->output_section))
2269
0
      idx = elf_section_data (sec->output_section)->dynindx;
2270
0
    else
2271
0
      idx = 0;
2272
0
  }
2273
2274
      /* If we're linking an executable at a fixed address, we can
2275
   omit the dynamic relocation as long as the symbol is local to
2276
   this module.  */
2277
0
      if (bfd_link_pde (info)
2278
0
    && (entry->symndx != -1 || BFINFDPIC_SYM_LOCAL (info, entry->d.h)))
2279
0
  {
2280
0
    if (sec)
2281
0
      ad += sec->output_section->vma;
2282
0
    ofst = 0;
2283
0
    if (entry->symndx != -1
2284
0
        || entry->d.h->root.type != bfd_link_hash_undefweak)
2285
0
      {
2286
0
        _bfinfdpic_add_rofixup (output_bfd,
2287
0
             bfinfdpic_gotfixup_section (info),
2288
0
             bfinfdpic_got_section (info)
2289
0
             ->output_section->vma
2290
0
             + bfinfdpic_got_section (info)
2291
0
             ->output_offset
2292
0
             + bfinfdpic_got_initial_offset (info)
2293
0
             + entry->fd_entry, entry);
2294
0
        _bfinfdpic_add_rofixup (output_bfd,
2295
0
             bfinfdpic_gotfixup_section (info),
2296
0
             bfinfdpic_got_section (info)
2297
0
             ->output_section->vma
2298
0
             + bfinfdpic_got_section (info)
2299
0
             ->output_offset
2300
0
             + bfinfdpic_got_initial_offset (info)
2301
0
             + entry->fd_entry + 4, entry);
2302
0
      }
2303
0
  }
2304
0
      else
2305
0
  {
2306
0
    ofst
2307
0
      = _bfinfdpic_add_dyn_reloc (output_bfd,
2308
0
          entry->lazyplt
2309
0
          ? bfinfdpic_pltrel_section (info)
2310
0
          : bfinfdpic_gotrel_section (info),
2311
0
          _bfd_elf_section_offset
2312
0
          (output_bfd, info,
2313
0
           bfinfdpic_got_section (info),
2314
0
           bfinfdpic_got_initial_offset (info)
2315
0
           + entry->fd_entry)
2316
0
          + bfinfdpic_got_section (info)
2317
0
          ->output_section->vma
2318
0
          + bfinfdpic_got_section (info)
2319
0
          ->output_offset,
2320
0
          R_BFIN_FUNCDESC_VALUE, idx, ad, entry);
2321
0
  }
2322
2323
      /* If we've omitted the dynamic relocation, just emit the fixed
2324
   addresses of the symbol and of the local GOT base offset.  */
2325
0
      if (bfd_link_pde (info)
2326
0
    && sec
2327
0
    && sec->output_section)
2328
0
  {
2329
0
    lowword = ad;
2330
0
    highword = bfinfdpic_got_section (info)->output_section->vma
2331
0
      + bfinfdpic_got_section (info)->output_offset
2332
0
      + bfinfdpic_got_initial_offset (info);
2333
0
  }
2334
0
      else if (entry->lazyplt)
2335
0
  {
2336
0
    if (ad)
2337
0
      return false;
2338
2339
0
    fd_lazy_rel_offset = ofst;
2340
2341
    /* A function descriptor used for lazy or local resolving is
2342
       initialized such that its high word contains the output
2343
       section index in which the PLT entries are located, and
2344
       the low word contains the address of the lazy PLT entry
2345
       entry point, that must be within the memory region
2346
       assigned to that section.  */
2347
0
    lowword = entry->lzplt_entry + 4
2348
0
      + bfinfdpic_plt_section (info)->output_offset
2349
0
      + bfinfdpic_plt_section (info)->output_section->vma;
2350
0
    highword = _bfinfdpic_osec_to_segment
2351
0
      (output_bfd, bfinfdpic_plt_section (info)->output_section);
2352
0
  }
2353
0
      else
2354
0
  {
2355
    /* A function descriptor for a local function gets the index
2356
       of the section.  For a non-local function, it's
2357
       disregarded.  */
2358
0
    lowword = ad;
2359
0
    if (sec == NULL
2360
0
        || (entry->symndx == -1 && entry->d.h->dynindx != -1
2361
0
      && entry->d.h->dynindx == idx))
2362
0
      highword = 0;
2363
0
    else
2364
0
      highword = _bfinfdpic_osec_to_segment
2365
0
        (output_bfd, sec->output_section);
2366
0
  }
2367
2368
0
      bfd_put_32 (output_bfd, lowword,
2369
0
      bfinfdpic_got_section (info)->contents
2370
0
      + bfinfdpic_got_initial_offset (info)
2371
0
      + entry->fd_entry);
2372
0
      bfd_put_32 (output_bfd, highword,
2373
0
      bfinfdpic_got_section (info)->contents
2374
0
      + bfinfdpic_got_initial_offset (info)
2375
0
      + entry->fd_entry + 4);
2376
0
    }
2377
2378
  /* Generate code for the PLT entry.  */
2379
0
  if (entry->plt_entry != (bfd_vma) -1)
2380
0
    {
2381
0
      bfd_byte *plt_code = bfinfdpic_plt_section (info)->contents
2382
0
  + entry->plt_entry;
2383
2384
0
      BFD_ASSERT (entry->fd_entry);
2385
2386
      /* Figure out what kind of PLT entry we need, depending on the
2387
   location of the function descriptor within the GOT.  */
2388
0
      if (entry->fd_entry >= -(1 << (18 - 1))
2389
0
    && entry->fd_entry + 4 < (1 << (18 - 1)))
2390
0
  {
2391
    /* P1 = [P3 + fd_entry]; P3 = [P3 + fd_entry + 4] */
2392
0
    bfd_put_32 (output_bfd,
2393
0
          0xe519 | ((entry->fd_entry << 14) & 0xFFFF0000),
2394
0
          plt_code);
2395
0
    bfd_put_32 (output_bfd,
2396
0
          0xe51b | (((entry->fd_entry + 4) << 14) & 0xFFFF0000),
2397
0
          plt_code + 4);
2398
0
    plt_code += 8;
2399
0
  }
2400
0
      else
2401
0
  {
2402
    /* P1.L = fd_entry; P1.H = fd_entry;
2403
       P3 = P3 + P1;
2404
       P1 = [P3];
2405
       P3 = [P3 + 4];  */
2406
0
    bfd_put_32 (output_bfd,
2407
0
          0xe109 | (entry->fd_entry << 16),
2408
0
          plt_code);
2409
0
    bfd_put_32 (output_bfd,
2410
0
          0xe149 | (entry->fd_entry & 0xFFFF0000),
2411
0
          plt_code + 4);
2412
0
    bfd_put_16 (output_bfd, 0x5ad9, plt_code + 8);
2413
0
    bfd_put_16 (output_bfd, 0x9159, plt_code + 10);
2414
0
    bfd_put_16 (output_bfd, 0xac5b, plt_code + 12);
2415
0
    plt_code += 14;
2416
0
  }
2417
      /* JUMP (P1) */
2418
0
      bfd_put_16 (output_bfd, 0x0051, plt_code);
2419
0
    }
2420
2421
  /* Generate code for the lazy PLT entry.  */
2422
0
  if (entry->lzplt_entry != (bfd_vma) -1)
2423
0
    {
2424
0
      bfd_byte *lzplt_code = bfinfdpic_plt_section (info)->contents
2425
0
  + entry->lzplt_entry;
2426
0
      bfd_vma resolverStub_addr;
2427
2428
0
      bfd_put_32 (output_bfd, fd_lazy_rel_offset, lzplt_code);
2429
0
      lzplt_code += 4;
2430
2431
0
      resolverStub_addr = entry->lzplt_entry / BFINFDPIC_LZPLT_BLOCK_SIZE
2432
0
  * BFINFDPIC_LZPLT_BLOCK_SIZE + BFINFDPIC_LZPLT_RESOLV_LOC;
2433
0
      if (resolverStub_addr >= bfinfdpic_plt_initial_offset (info))
2434
0
  resolverStub_addr = bfinfdpic_plt_initial_offset (info) - LZPLT_NORMAL_SIZE - LZPLT_RESOLVER_EXTRA;
2435
2436
0
      if (entry->lzplt_entry == resolverStub_addr)
2437
0
  {
2438
    /* This is a lazy PLT entry that includes a resolver call.
2439
       P2 = [P3];
2440
       R3 = [P3 + 4];
2441
       JUMP (P2);  */
2442
0
    bfd_put_32 (output_bfd,
2443
0
          0xa05b915a,
2444
0
          lzplt_code);
2445
0
    bfd_put_16 (output_bfd, 0x0052, lzplt_code + 4);
2446
0
  }
2447
0
      else
2448
0
  {
2449
    /* JUMP.S  resolverStub */
2450
0
    bfd_put_16 (output_bfd,
2451
0
          0x2000
2452
0
          | (((resolverStub_addr - entry->lzplt_entry)
2453
0
        / 2) & (((bfd_vma)1 << 12) - 1)),
2454
0
          lzplt_code);
2455
0
  }
2456
0
    }
2457
2458
0
  return true;
2459
0
}
2460

2461
/* Relocate an Blackfin ELF section.
2462
2463
   The RELOCATE_SECTION function is called by the new ELF backend linker
2464
   to handle the relocations for a section.
2465
2466
   The relocs are always passed as Rela structures; if the section
2467
   actually uses Rel structures, the r_addend field will always be
2468
   zero.
2469
2470
   This function is responsible for adjusting the section contents as
2471
   necessary, and (if using Rela relocs and generating a relocatable
2472
   output file) adjusting the reloc addend as necessary.
2473
2474
   This function does not have to worry about setting the reloc
2475
   address or the reloc symbol index.
2476
2477
   LOCAL_SYMS is a pointer to the swapped in local symbols.
2478
2479
   LOCAL_SECTIONS is an array giving the section in the input file
2480
   corresponding to the st_shndx field of each local symbol.
2481
2482
   The global hash table entry for the global symbols can be found
2483
   via elf_sym_hashes (input_bfd).
2484
2485
   When generating relocatable output, this function must handle
2486
   STB_LOCAL/STT_SECTION symbols specially.  The output symbol is
2487
   going to be the section symbol corresponding to the output
2488
   section, which means that the addend must be adjusted
2489
   accordingly.  */
2490
2491
static int
2492
bfinfdpic_relocate_section (bfd * output_bfd,
2493
          struct bfd_link_info *info,
2494
          bfd * input_bfd,
2495
          asection * input_section,
2496
          bfd_byte * contents,
2497
          Elf_Internal_Rela * relocs,
2498
          Elf_Internal_Sym * local_syms,
2499
          asection ** local_sections)
2500
0
{
2501
0
  Elf_Internal_Shdr *symtab_hdr;
2502
0
  struct elf_link_hash_entry **sym_hashes;
2503
0
  Elf_Internal_Rela *rel;
2504
0
  Elf_Internal_Rela *relend;
2505
0
  unsigned isec_segment, got_segment, plt_segment,
2506
0
    check_segment[2];
2507
0
  int silence_segment_error = !bfd_link_pic (info);
2508
2509
0
  symtab_hdr = & elf_tdata (input_bfd)->symtab_hdr;
2510
0
  sym_hashes = elf_sym_hashes (input_bfd);
2511
0
  relend     = relocs + input_section->reloc_count;
2512
2513
0
  isec_segment = _bfinfdpic_osec_to_segment (output_bfd,
2514
0
               input_section->output_section);
2515
0
  if (IS_FDPIC (output_bfd) && bfinfdpic_got_section (info))
2516
0
    got_segment = _bfinfdpic_osec_to_segment (output_bfd,
2517
0
                bfinfdpic_got_section (info)
2518
0
                ->output_section);
2519
0
  else
2520
0
    got_segment = -1;
2521
0
  if (IS_FDPIC (output_bfd) && elf_hash_table (info)->dynamic_sections_created)
2522
0
    plt_segment = _bfinfdpic_osec_to_segment (output_bfd,
2523
0
                bfinfdpic_plt_section (info)
2524
0
                ->output_section);
2525
0
  else
2526
0
    plt_segment = -1;
2527
2528
0
  for (rel = relocs; rel < relend; rel ++)
2529
0
    {
2530
0
      reloc_howto_type *howto;
2531
0
      unsigned long r_symndx;
2532
0
      Elf_Internal_Sym *sym;
2533
0
      asection *sec;
2534
0
      struct elf_link_hash_entry *h;
2535
0
      bfd_vma relocation;
2536
0
      bfd_reloc_status_type r;
2537
0
      const char * name = NULL;
2538
0
      int r_type;
2539
0
      asection *osec;
2540
0
      struct bfinfdpic_relocs_info *picrel;
2541
0
      bfd_vma orig_addend = rel->r_addend;
2542
2543
0
      r_type = ELF32_R_TYPE (rel->r_info);
2544
2545
0
      if (r_type == R_BFIN_GNU_VTINHERIT
2546
0
    || r_type == R_BFIN_GNU_VTENTRY)
2547
0
  continue;
2548
2549
0
      r_symndx = ELF32_R_SYM (rel->r_info);
2550
0
      howto = bfin_reloc_type_lookup (input_bfd, r_type);
2551
0
      if (howto == NULL)
2552
0
  {
2553
0
    bfd_set_error (bfd_error_bad_value);
2554
0
    return false;
2555
0
  }
2556
2557
0
      h      = NULL;
2558
0
      sym    = NULL;
2559
0
      sec    = NULL;
2560
0
      picrel = NULL;
2561
2562
0
      if (r_symndx < symtab_hdr->sh_info)
2563
0
  {
2564
0
    sym = local_syms + r_symndx;
2565
0
    osec = sec = local_sections [r_symndx];
2566
0
    relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
2567
2568
0
    name = bfd_elf_string_from_elf_section
2569
0
      (input_bfd, symtab_hdr->sh_link, sym->st_name);
2570
0
    name = name == NULL ? bfd_section_name (sec) : name;
2571
0
  }
2572
0
      else
2573
0
  {
2574
0
    bool warned, ignored;
2575
0
    bool unresolved_reloc;
2576
2577
0
    RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
2578
0
           r_symndx, symtab_hdr, sym_hashes,
2579
0
           h, sec, relocation,
2580
0
           unresolved_reloc, warned, ignored);
2581
0
    osec = sec;
2582
0
  }
2583
2584
0
      if (sec != NULL && discarded_section (sec))
2585
0
  RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
2586
0
           rel, 1, relend, R_BFIN_UNUSED0,
2587
0
           howto, 0, contents);
2588
2589
0
      if (bfd_link_relocatable (info))
2590
0
  continue;
2591
2592
0
      if (h != NULL
2593
0
    && (h->root.type == bfd_link_hash_defined
2594
0
        || h->root.type == bfd_link_hash_defweak)
2595
0
    && !BFINFDPIC_SYM_LOCAL (info, h))
2596
0
  {
2597
0
    osec = sec = NULL;
2598
0
    relocation = 0;
2599
0
  }
2600
2601
0
      switch (r_type)
2602
0
  {
2603
0
  case R_BFIN_PCREL24:
2604
0
  case R_BFIN_PCREL24_JUMP_L:
2605
0
  case R_BFIN_BYTE4_DATA:
2606
0
    if (! IS_FDPIC (output_bfd))
2607
0
      goto non_fdpic;
2608
    /* Fall through.  */
2609
2610
0
  case R_BFIN_GOT17M4:
2611
0
  case R_BFIN_GOTHI:
2612
0
  case R_BFIN_GOTLO:
2613
0
  case R_BFIN_FUNCDESC_GOT17M4:
2614
0
  case R_BFIN_FUNCDESC_GOTHI:
2615
0
  case R_BFIN_FUNCDESC_GOTLO:
2616
0
  case R_BFIN_GOTOFF17M4:
2617
0
  case R_BFIN_GOTOFFHI:
2618
0
  case R_BFIN_GOTOFFLO:
2619
0
  case R_BFIN_FUNCDESC_GOTOFF17M4:
2620
0
  case R_BFIN_FUNCDESC_GOTOFFHI:
2621
0
  case R_BFIN_FUNCDESC_GOTOFFLO:
2622
0
  case R_BFIN_FUNCDESC:
2623
0
  case R_BFIN_FUNCDESC_VALUE:
2624
0
    if ((input_section->flags & SEC_ALLOC) == 0)
2625
0
      break;
2626
2627
0
    if (h != NULL)
2628
0
      picrel = bfinfdpic_relocs_info_for_global (bfinfdpic_relocs_info
2629
0
                   (info), input_bfd, h,
2630
0
                   orig_addend, INSERT);
2631
0
    else
2632
      /* In order to find the entry we created before, we must
2633
         use the original addend, not the one that may have been
2634
         modified by _bfd_elf_rela_local_sym().  */
2635
0
      picrel = bfinfdpic_relocs_info_for_local (bfinfdpic_relocs_info
2636
0
                  (info), input_bfd, r_symndx,
2637
0
                  orig_addend, INSERT);
2638
0
    if (! picrel)
2639
0
      return false;
2640
2641
0
    if (!_bfinfdpic_emit_got_relocs_plt_entries (picrel, output_bfd, info,
2642
0
                   osec, sym,
2643
0
                   rel->r_addend))
2644
0
      {
2645
0
        _bfd_error_handler
2646
    /* xgettext:c-format */
2647
0
    (_("%pB: relocation at `%pA+%#" PRIx64 "' "
2648
0
       "references symbol `%s' with nonzero addend"),
2649
0
     input_bfd, input_section, (uint64_t) rel->r_offset, name);
2650
0
        return false;
2651
2652
0
      }
2653
2654
0
    break;
2655
2656
0
  default:
2657
0
  non_fdpic:
2658
0
    picrel = NULL;
2659
0
    if (h && ! BFINFDPIC_SYM_LOCAL (info, h)
2660
0
        && _bfd_elf_section_offset (output_bfd, info, input_section,
2661
0
            rel->r_offset) != (bfd_vma) -1)
2662
0
      {
2663
0
        info->callbacks->warning
2664
0
    (info, _("relocation references symbol not defined in the module"),
2665
0
     name, input_bfd, input_section, rel->r_offset);
2666
0
        return false;
2667
0
      }
2668
0
    break;
2669
0
  }
2670
2671
0
      switch (r_type)
2672
0
  {
2673
0
  case R_BFIN_PCREL24:
2674
0
  case R_BFIN_PCREL24_JUMP_L:
2675
0
    check_segment[0] = isec_segment;
2676
0
    if (! IS_FDPIC (output_bfd))
2677
0
      check_segment[1] = isec_segment;
2678
0
    else if (picrel->plt)
2679
0
      {
2680
0
        relocation = bfinfdpic_plt_section (info)->output_section->vma
2681
0
    + bfinfdpic_plt_section (info)->output_offset
2682
0
    + picrel->plt_entry;
2683
0
        check_segment[1] = plt_segment;
2684
0
      }
2685
    /* We don't want to warn on calls to undefined weak symbols,
2686
       as calls to them must be protected by non-NULL tests
2687
       anyway, and unprotected calls would invoke undefined
2688
       behavior.  */
2689
0
    else if (picrel->symndx == -1
2690
0
       && picrel->d.h->root.type == bfd_link_hash_undefweak)
2691
0
      check_segment[1] = check_segment[0];
2692
0
    else
2693
0
      check_segment[1] = sec
2694
0
        ? _bfinfdpic_osec_to_segment (output_bfd, sec->output_section)
2695
0
        : (unsigned)-1;
2696
0
    break;
2697
2698
0
  case R_BFIN_GOT17M4:
2699
0
  case R_BFIN_GOTHI:
2700
0
  case R_BFIN_GOTLO:
2701
0
    relocation = picrel->got_entry;
2702
0
    check_segment[0] = check_segment[1] = got_segment;
2703
0
    break;
2704
2705
0
  case R_BFIN_FUNCDESC_GOT17M4:
2706
0
  case R_BFIN_FUNCDESC_GOTHI:
2707
0
  case R_BFIN_FUNCDESC_GOTLO:
2708
0
    relocation = picrel->fdgot_entry;
2709
0
    check_segment[0] = check_segment[1] = got_segment;
2710
0
    break;
2711
2712
0
  case R_BFIN_GOTOFFHI:
2713
0
  case R_BFIN_GOTOFF17M4:
2714
0
  case R_BFIN_GOTOFFLO:
2715
0
    relocation -= bfinfdpic_got_section (info)->output_section->vma
2716
0
      + bfinfdpic_got_section (info)->output_offset
2717
0
      + bfinfdpic_got_initial_offset (info);
2718
0
    check_segment[0] = got_segment;
2719
0
    check_segment[1] = sec
2720
0
      ? _bfinfdpic_osec_to_segment (output_bfd, sec->output_section)
2721
0
      : (unsigned)-1;
2722
0
    break;
2723
2724
0
  case R_BFIN_FUNCDESC_GOTOFF17M4:
2725
0
  case R_BFIN_FUNCDESC_GOTOFFHI:
2726
0
  case R_BFIN_FUNCDESC_GOTOFFLO:
2727
0
    relocation = picrel->fd_entry;
2728
0
    check_segment[0] = check_segment[1] = got_segment;
2729
0
    break;
2730
2731
0
  case R_BFIN_FUNCDESC:
2732
0
    if ((input_section->flags & SEC_ALLOC) != 0)
2733
0
      {
2734
0
        int dynindx;
2735
0
        bfd_vma addend = rel->r_addend;
2736
2737
0
        if (! (h && h->root.type == bfd_link_hash_undefweak
2738
0
         && BFINFDPIC_SYM_LOCAL (info, h)))
2739
0
    {
2740
      /* If the symbol is dynamic and there may be dynamic
2741
         symbol resolution because we are or are linked with a
2742
         shared library, emit a FUNCDESC relocation such that
2743
         the dynamic linker will allocate the function
2744
         descriptor.  If the symbol needs a non-local function
2745
         descriptor but binds locally (e.g., its visibility is
2746
         protected, emit a dynamic relocation decayed to
2747
         section+offset.  */
2748
0
      if (h && ! BFINFDPIC_FUNCDESC_LOCAL (info, h)
2749
0
          && BFINFDPIC_SYM_LOCAL (info, h)
2750
0
          && !bfd_link_pde (info))
2751
0
        {
2752
0
          dynindx = elf_section_data (h->root.u.def.section
2753
0
              ->output_section)->dynindx;
2754
0
          addend += h->root.u.def.section->output_offset
2755
0
      + h->root.u.def.value;
2756
0
        }
2757
0
      else if (h && ! BFINFDPIC_FUNCDESC_LOCAL (info, h))
2758
0
        {
2759
0
          if (addend)
2760
0
      {
2761
0
        info->callbacks->warning
2762
0
          (info, _("R_BFIN_FUNCDESC references dynamic symbol with nonzero addend"),
2763
0
           name, input_bfd, input_section, rel->r_offset);
2764
0
        return false;
2765
0
      }
2766
0
          dynindx = h->dynindx;
2767
0
        }
2768
0
      else
2769
0
        {
2770
          /* Otherwise, we know we have a private function
2771
       descriptor, so reference it directly.  */
2772
0
          BFD_ASSERT (picrel->privfd);
2773
0
          r_type = R_BFIN_BYTE4_DATA;
2774
0
          dynindx = elf_section_data (bfinfdpic_got_section (info)
2775
0
              ->output_section)->dynindx;
2776
0
          addend = bfinfdpic_got_section (info)->output_offset
2777
0
      + bfinfdpic_got_initial_offset (info)
2778
0
      + picrel->fd_entry;
2779
0
        }
2780
2781
      /* If there is room for dynamic symbol resolution, emit
2782
         the dynamic relocation.  However, if we're linking an
2783
         executable at a fixed location, we won't have emitted a
2784
         dynamic symbol entry for the got section, so idx will
2785
         be zero, which means we can and should compute the
2786
         address of the private descriptor ourselves.  */
2787
0
      if (bfd_link_pde (info)
2788
0
          && (!h || BFINFDPIC_FUNCDESC_LOCAL (info, h)))
2789
0
        {
2790
0
          bfd_vma offset;
2791
2792
0
          addend += bfinfdpic_got_section (info)->output_section->vma;
2793
0
          if ((bfd_section_flags (input_section->output_section)
2794
0
         & (SEC_ALLOC | SEC_LOAD)) == (SEC_ALLOC | SEC_LOAD))
2795
0
      {
2796
0
        if (_bfinfdpic_osec_readonly_p (output_bfd,
2797
0
                input_section
2798
0
                ->output_section))
2799
0
          {
2800
0
            info->callbacks->warning
2801
0
        (info,
2802
0
         _("cannot emit fixups in read-only section"),
2803
0
         name, input_bfd, input_section, rel->r_offset);
2804
0
            return false;
2805
0
          }
2806
2807
0
        offset = _bfd_elf_section_offset
2808
0
          (output_bfd, info,
2809
0
           input_section, rel->r_offset);
2810
2811
0
        if (offset != (bfd_vma)-1)
2812
0
          _bfinfdpic_add_rofixup (output_bfd,
2813
0
                bfinfdpic_gotfixup_section
2814
0
                (info),
2815
0
                offset + input_section
2816
0
                ->output_section->vma
2817
0
                + input_section->output_offset,
2818
0
                picrel);
2819
0
      }
2820
0
        }
2821
0
      else if ((bfd_section_flags (input_section->output_section)
2822
0
          & (SEC_ALLOC | SEC_LOAD)) == (SEC_ALLOC | SEC_LOAD))
2823
0
        {
2824
0
          bfd_vma offset;
2825
2826
0
          if (_bfinfdpic_osec_readonly_p (output_bfd,
2827
0
                  input_section
2828
0
                  ->output_section))
2829
0
      {
2830
0
        info->callbacks->warning
2831
0
          (info,
2832
0
           _("cannot emit dynamic relocations in read-only section"),
2833
0
           name, input_bfd, input_section, rel->r_offset);
2834
0
        return false;
2835
0
      }
2836
0
          offset = _bfd_elf_section_offset (output_bfd, info,
2837
0
              input_section, rel->r_offset);
2838
2839
0
          if (offset != (bfd_vma)-1)
2840
0
      _bfinfdpic_add_dyn_reloc (output_bfd,
2841
0
              bfinfdpic_gotrel_section (info),
2842
0
              offset + input_section
2843
0
              ->output_section->vma
2844
0
              + input_section->output_offset,
2845
0
              r_type,
2846
0
              dynindx, addend, picrel);
2847
0
        }
2848
0
      else
2849
0
        addend += bfinfdpic_got_section (info)->output_section->vma;
2850
0
    }
2851
2852
        /* We want the addend in-place because dynamic
2853
     relocations are REL.  Setting relocation to it should
2854
     arrange for it to be installed.  */
2855
0
        relocation = addend - rel->r_addend;
2856
0
    }
2857
0
    check_segment[0] = check_segment[1] = got_segment;
2858
0
    break;
2859
2860
0
  case R_BFIN_BYTE4_DATA:
2861
0
    if (! IS_FDPIC (output_bfd))
2862
0
      {
2863
0
        check_segment[0] = check_segment[1] = -1;
2864
0
        break;
2865
0
      }
2866
    /* Fall through.  */
2867
0
  case R_BFIN_FUNCDESC_VALUE:
2868
0
    {
2869
0
      int dynindx;
2870
0
      bfd_vma addend = rel->r_addend;
2871
0
      bfd_vma offset;
2872
0
      offset = _bfd_elf_section_offset (output_bfd, info,
2873
0
                input_section, rel->r_offset);
2874
2875
      /* If the symbol is dynamic but binds locally, use
2876
         section+offset.  */
2877
0
      if (h && ! BFINFDPIC_SYM_LOCAL (info, h))
2878
0
        {
2879
0
    if (addend && r_type == R_BFIN_FUNCDESC_VALUE)
2880
0
      {
2881
0
        info->callbacks->warning
2882
0
          (info, _("R_BFIN_FUNCDESC_VALUE references dynamic symbol with nonzero addend"),
2883
0
           name, input_bfd, input_section, rel->r_offset);
2884
0
        return false;
2885
0
      }
2886
0
    dynindx = h->dynindx;
2887
0
        }
2888
0
      else
2889
0
        {
2890
0
    if (h)
2891
0
      addend += h->root.u.def.value;
2892
0
    else
2893
0
      addend += sym->st_value;
2894
0
    if (osec)
2895
0
      addend += osec->output_offset;
2896
0
    if (osec && osec->output_section
2897
0
        && ! bfd_is_abs_section (osec->output_section)
2898
0
        && ! bfd_is_und_section (osec->output_section))
2899
0
      dynindx = elf_section_data (osec->output_section)->dynindx;
2900
0
    else
2901
0
      dynindx = 0;
2902
0
        }
2903
2904
      /* If we're linking an executable at a fixed address, we
2905
         can omit the dynamic relocation as long as the symbol
2906
         is defined in the current link unit (which is implied
2907
         by its output section not being NULL).  */
2908
0
      if (bfd_link_pde (info)
2909
0
    && (!h || BFINFDPIC_SYM_LOCAL (info, h)))
2910
0
        {
2911
0
    if (osec)
2912
0
      addend += osec->output_section->vma;
2913
0
    if (IS_FDPIC (input_bfd)
2914
0
        && (bfd_section_flags (input_section->output_section)
2915
0
      & (SEC_ALLOC | SEC_LOAD)) == (SEC_ALLOC | SEC_LOAD))
2916
0
      {
2917
0
        if (_bfinfdpic_osec_readonly_p (output_bfd,
2918
0
               input_section
2919
0
               ->output_section))
2920
0
          {
2921
0
      info->callbacks->warning
2922
0
        (info,
2923
0
         _("cannot emit fixups in read-only section"),
2924
0
         name, input_bfd, input_section, rel->r_offset);
2925
0
      return false;
2926
0
          }
2927
0
        if (!h || h->root.type != bfd_link_hash_undefweak)
2928
0
          {
2929
0
      if (offset != (bfd_vma)-1)
2930
0
        {
2931
0
          _bfinfdpic_add_rofixup (output_bfd,
2932
0
                bfinfdpic_gotfixup_section
2933
0
                (info),
2934
0
                offset + input_section
2935
0
                ->output_section->vma
2936
0
                + input_section->output_offset,
2937
0
                picrel);
2938
2939
0
          if (r_type == R_BFIN_FUNCDESC_VALUE)
2940
0
            _bfinfdpic_add_rofixup
2941
0
        (output_bfd,
2942
0
         bfinfdpic_gotfixup_section (info),
2943
0
         offset + input_section->output_section->vma
2944
0
         + input_section->output_offset + 4, picrel);
2945
0
        }
2946
0
          }
2947
0
      }
2948
0
        }
2949
0
      else
2950
0
        {
2951
0
    if ((bfd_section_flags (input_section->output_section)
2952
0
         & (SEC_ALLOC | SEC_LOAD)) == (SEC_ALLOC | SEC_LOAD))
2953
0
      {
2954
0
        if (_bfinfdpic_osec_readonly_p (output_bfd,
2955
0
               input_section
2956
0
               ->output_section))
2957
0
          {
2958
0
      info->callbacks->warning
2959
0
        (info,
2960
0
         _("cannot emit dynamic relocations in read-only section"),
2961
0
         name, input_bfd, input_section, rel->r_offset);
2962
0
      return false;
2963
0
          }
2964
2965
0
        if (offset != (bfd_vma)-1)
2966
0
          _bfinfdpic_add_dyn_reloc (output_bfd,
2967
0
            bfinfdpic_gotrel_section (info),
2968
0
            offset
2969
0
            + input_section->output_section->vma
2970
0
            + input_section->output_offset,
2971
0
            r_type, dynindx, addend, picrel);
2972
0
      }
2973
0
    else if (osec)
2974
0
      addend += osec->output_section->vma;
2975
    /* We want the addend in-place because dynamic
2976
       relocations are REL.  Setting relocation to it
2977
       should arrange for it to be installed.  */
2978
0
    relocation = addend - rel->r_addend;
2979
0
        }
2980
2981
0
      if (r_type == R_BFIN_FUNCDESC_VALUE)
2982
0
        {
2983
    /* If we've omitted the dynamic relocation, just emit
2984
       the fixed addresses of the symbol and of the local
2985
       GOT base offset.  */
2986
0
    if (bfd_link_pde (info)
2987
0
        && (!h || BFINFDPIC_SYM_LOCAL (info, h)))
2988
0
      bfd_put_32 (output_bfd,
2989
0
            bfinfdpic_got_section (info)->output_section->vma
2990
0
            + bfinfdpic_got_section (info)->output_offset
2991
0
            + bfinfdpic_got_initial_offset (info),
2992
0
            contents + rel->r_offset + 4);
2993
0
    else
2994
      /* A function descriptor used for lazy or local
2995
         resolving is initialized such that its high word
2996
         contains the output section index in which the
2997
         PLT entries are located, and the low word
2998
         contains the offset of the lazy PLT entry entry
2999
         point into that section.  */
3000
0
      bfd_put_32 (output_bfd,
3001
0
            h && ! BFINFDPIC_SYM_LOCAL (info, h)
3002
0
            ? 0
3003
0
            : _bfinfdpic_osec_to_segment (output_bfd,
3004
0
                  sec
3005
0
                  ->output_section),
3006
0
            contents + rel->r_offset + 4);
3007
0
        }
3008
0
    }
3009
0
    check_segment[0] = check_segment[1] = got_segment;
3010
0
    break;
3011
3012
0
  default:
3013
0
    check_segment[0] = isec_segment;
3014
0
    check_segment[1] = sec
3015
0
      ? _bfinfdpic_osec_to_segment (output_bfd, sec->output_section)
3016
0
      : (unsigned)-1;
3017
0
    break;
3018
0
  }
3019
3020
0
      if (check_segment[0] != check_segment[1] && IS_FDPIC (output_bfd))
3021
0
  {
3022
0
#if 1 /* If you take this out, remove the #error from fdpic-static-6.d
3023
   in the ld testsuite.  */
3024
    /* This helps catch problems in GCC while we can't do more
3025
       than static linking.  The idea is to test whether the
3026
       input file basename is crt0.o only once.  */
3027
0
    if (silence_segment_error == 1)
3028
0
      silence_segment_error =
3029
0
        (strlen (bfd_get_filename (input_bfd)) == 6
3030
0
         && filename_cmp (bfd_get_filename (input_bfd), "crt0.o") == 0)
3031
0
        || (strlen (bfd_get_filename (input_bfd)) > 6
3032
0
      && filename_cmp (bfd_get_filename (input_bfd)
3033
0
           + strlen (bfd_get_filename (input_bfd)) - 7,
3034
0
           "/crt0.o") == 0)
3035
0
        ? -1 : 0;
3036
0
#endif
3037
0
    if (!silence_segment_error
3038
        /* We don't want duplicate errors for undefined
3039
     symbols.  */
3040
0
        && !(picrel && picrel->symndx == -1
3041
0
       && picrel->d.h->root.type == bfd_link_hash_undefined))
3042
0
      info->callbacks->warning
3043
0
        (info,
3044
0
         bfd_link_pic (info)
3045
0
         ? _("relocations between different segments are not supported")
3046
0
         : _("warning: relocation references a different segment"),
3047
0
         name, input_bfd, input_section, rel->r_offset);
3048
0
    if (!silence_segment_error && bfd_link_pic (info))
3049
0
      return false;
3050
0
    elf_elfheader (output_bfd)->e_flags |= EF_BFIN_PIC;
3051
0
  }
3052
3053
0
      switch (r_type)
3054
0
  {
3055
0
  case R_BFIN_GOTOFFHI:
3056
    /* We need the addend to be applied before we shift the
3057
       value right.  */
3058
0
    relocation += rel->r_addend;
3059
    /* Fall through.  */
3060
0
  case R_BFIN_GOTHI:
3061
0
  case R_BFIN_FUNCDESC_GOTHI:
3062
0
  case R_BFIN_FUNCDESC_GOTOFFHI:
3063
0
    relocation >>= 16;
3064
    /* Fall through.  */
3065
3066
0
  case R_BFIN_GOTLO:
3067
0
  case R_BFIN_FUNCDESC_GOTLO:
3068
0
  case R_BFIN_GOTOFFLO:
3069
0
  case R_BFIN_FUNCDESC_GOTOFFLO:
3070
0
    relocation &= 0xffff;
3071
0
    break;
3072
3073
0
  default:
3074
0
    break;
3075
0
  }
3076
3077
0
      switch (r_type)
3078
0
  {
3079
0
  case R_BFIN_PCREL24:
3080
0
  case R_BFIN_PCREL24_JUMP_L:
3081
0
    if (! IS_FDPIC (output_bfd) || ! picrel->plt)
3082
0
      break;
3083
    /* Fall through.  */
3084
3085
    /* When referencing a GOT entry, a function descriptor or a
3086
       PLT, we don't want the addend to apply to the reference,
3087
       but rather to the referenced symbol.  The actual entry
3088
       will have already been created taking the addend into
3089
       account, so cancel it out here.  */
3090
0
  case R_BFIN_GOT17M4:
3091
0
  case R_BFIN_GOTHI:
3092
0
  case R_BFIN_GOTLO:
3093
0
  case R_BFIN_FUNCDESC_GOT17M4:
3094
0
  case R_BFIN_FUNCDESC_GOTHI:
3095
0
  case R_BFIN_FUNCDESC_GOTLO:
3096
0
  case R_BFIN_FUNCDESC_GOTOFF17M4:
3097
0
  case R_BFIN_FUNCDESC_GOTOFFHI:
3098
0
  case R_BFIN_FUNCDESC_GOTOFFLO:
3099
    /* Note that we only want GOTOFFHI, not GOTOFFLO or GOTOFF17M4
3100
       here, since we do want to apply the addend to the others.
3101
       Note that we've applied the addend to GOTOFFHI before we
3102
       shifted it right.  */
3103
0
  case R_BFIN_GOTOFFHI:
3104
0
    relocation -= rel->r_addend;
3105
0
    break;
3106
3107
0
  default:
3108
0
    break;
3109
0
  }
3110
3111
0
      r = bfin_final_link_relocate (rel, howto, input_bfd, input_section,
3112
0
            contents, rel->r_offset,
3113
0
            relocation, rel->r_addend);
3114
3115
0
      if (r != bfd_reloc_ok)
3116
0
  {
3117
0
    const char * msg = (const char *) NULL;
3118
3119
0
    switch (r)
3120
0
      {
3121
0
      case bfd_reloc_overflow:
3122
0
        (*info->callbacks->reloc_overflow)
3123
0
    (info, (h ? &h->root : NULL), name, howto->name,
3124
0
     (bfd_vma) 0, input_bfd, input_section, rel->r_offset);
3125
0
        break;
3126
3127
0
      case bfd_reloc_undefined:
3128
0
        (*info->callbacks->undefined_symbol)
3129
0
    (info, name, input_bfd, input_section, rel->r_offset, true);
3130
0
        break;
3131
3132
0
      case bfd_reloc_outofrange:
3133
0
        msg = _("internal error: out of range error");
3134
0
        break;
3135
3136
0
      case bfd_reloc_notsupported:
3137
0
        msg = _("internal error: unsupported relocation error");
3138
0
        break;
3139
3140
0
      case bfd_reloc_dangerous:
3141
0
        msg = _("internal error: dangerous relocation");
3142
0
        break;
3143
3144
0
      default:
3145
0
        msg = _("internal error: unknown error");
3146
0
        break;
3147
0
      }
3148
3149
0
    if (msg)
3150
0
      (*info->callbacks->warning) (info, msg, name, input_bfd,
3151
0
           input_section, rel->r_offset);
3152
0
  }
3153
0
    }
3154
3155
0
  return true;
3156
0
}
3157
3158
/* We need dynamic symbols for every section, since segments can
3159
   relocate independently.  */
3160
static bool
3161
_bfinfdpic_link_omit_section_dynsym (bfd *output_bfd ATTRIBUTE_UNUSED,
3162
            struct bfd_link_info *info ATTRIBUTE_UNUSED,
3163
            asection *p)
3164
0
{
3165
0
  switch (elf_section_data (p)->this_hdr.sh_type)
3166
0
    {
3167
0
    case SHT_PROGBITS:
3168
0
    case SHT_NOBITS:
3169
      /* If sh_type is yet undecided, assume it could be
3170
   SHT_PROGBITS/SHT_NOBITS.  */
3171
0
    case SHT_NULL:
3172
0
      return false;
3173
3174
      /* There shouldn't be section relative relocations
3175
   against any other section.  */
3176
0
    default:
3177
0
      return true;
3178
0
    }
3179
0
}
3180
3181
/* Create  a .got section, as well as its additional info field.  This
3182
   is almost entirely copied from
3183
   elflink.c:_bfd_elf_create_got_section().  */
3184
3185
static bool
3186
_bfin_create_got_section (bfd *abfd, struct bfd_link_info *info)
3187
0
{
3188
0
  flagword flags, pltflags;
3189
0
  asection *s;
3190
0
  struct elf_link_hash_entry *h;
3191
0
  elf_backend_data *bed = get_elf_backend_data (abfd);
3192
0
  int ptralign;
3193
3194
  /* This function may be called more than once.  */
3195
0
  s = elf_hash_table (info)->sgot;
3196
0
  if (s != NULL)
3197
0
    return true;
3198
3199
  /* Machine specific: although pointers are 32-bits wide, we want the
3200
     GOT to be aligned to a 64-bit boundary, such that function
3201
     descriptors in it can be accessed with 64-bit loads and
3202
     stores.  */
3203
0
  ptralign = 3;
3204
3205
0
  flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
3206
0
     | SEC_LINKER_CREATED);
3207
0
  pltflags = flags;
3208
3209
0
  s = bfd_make_section_anyway_with_flags (abfd, ".got", flags);
3210
0
  elf_hash_table (info)->sgot = s;
3211
0
  if (s == NULL
3212
0
      || !bfd_set_section_alignment (s, ptralign))
3213
0
    return false;
3214
3215
0
  if (bed->want_got_sym)
3216
0
    {
3217
      /* Define the symbol _GLOBAL_OFFSET_TABLE_ at the start of the .got
3218
   (or .got.plt) section.  We don't do this in the linker script
3219
   because we don't want to define the symbol if we are not creating
3220
   a global offset table.  */
3221
0
      h = _bfd_elf_define_linkage_sym (abfd, info, s, "__GLOBAL_OFFSET_TABLE_");
3222
0
      elf_hash_table (info)->hgot = h;
3223
0
      if (h == NULL)
3224
0
  return false;
3225
3226
      /* Machine-specific: we want the symbol for executables as
3227
   well.  */
3228
0
      if (! bfd_elf_link_record_dynamic_symbol (info, h))
3229
0
  return false;
3230
0
    }
3231
3232
  /* The first bit of the global offset table is the header.  */
3233
0
  s->size += bed->got_header_size;
3234
3235
  /* This is the machine-specific part.  Create and initialize section
3236
     data for the got.  */
3237
0
  if (IS_FDPIC (abfd))
3238
0
    {
3239
0
      bfinfdpic_relocs_info (info) = htab_try_create (1,
3240
0
                  bfinfdpic_relocs_info_hash,
3241
0
                  bfinfdpic_relocs_info_eq,
3242
0
                  (htab_del) NULL);
3243
0
      if (! bfinfdpic_relocs_info (info))
3244
0
  return false;
3245
3246
0
      s = bfd_make_section_anyway_with_flags (abfd, ".rel.got",
3247
0
                (flags | SEC_READONLY));
3248
0
      if (s == NULL
3249
0
    || !bfd_set_section_alignment (s, 2))
3250
0
  return false;
3251
3252
0
      bfinfdpic_gotrel_section (info) = s;
3253
3254
      /* Machine-specific.  */
3255
0
      s = bfd_make_section_anyway_with_flags (abfd, ".rofixup",
3256
0
                (flags | SEC_READONLY));
3257
0
      if (s == NULL
3258
0
    || !bfd_set_section_alignment (s, 2))
3259
0
  return false;
3260
3261
0
      bfinfdpic_gotfixup_section (info) = s;
3262
0
    }
3263
3264
0
  pltflags |= SEC_CODE;
3265
0
  if (bed->plt_not_loaded)
3266
0
    pltflags &= ~ (SEC_CODE | SEC_LOAD | SEC_HAS_CONTENTS);
3267
0
  if (bed->plt_readonly)
3268
0
    pltflags |= SEC_READONLY;
3269
3270
0
  s = bfd_make_section_anyway_with_flags (abfd, ".plt", pltflags);
3271
0
  if (s == NULL
3272
0
      || !bfd_set_section_alignment (s, bed->plt_alignment))
3273
0
    return false;
3274
  /* Blackfin-specific: remember it.  */
3275
0
  bfinfdpic_plt_section (info) = s;
3276
3277
0
  if (bed->want_plt_sym)
3278
0
    {
3279
      /* Define the symbol _PROCEDURE_LINKAGE_TABLE_ at the start of the
3280
   .plt section.  */
3281
0
      struct bfd_link_hash_entry *bh = NULL;
3282
3283
0
      if (! (_bfd_generic_link_add_one_symbol
3284
0
       (info, abfd, "__PROCEDURE_LINKAGE_TABLE_", BSF_GLOBAL, s, 0, NULL,
3285
0
        false, get_elf_backend_data (abfd)->collect, &bh)))
3286
0
  return false;
3287
0
      h = (struct elf_link_hash_entry *) bh;
3288
0
      h->def_regular = 1;
3289
0
      h->type = STT_OBJECT;
3290
3291
0
      if (! bfd_link_executable (info)
3292
0
    && ! bfd_elf_link_record_dynamic_symbol (info, h))
3293
0
  return false;
3294
0
    }
3295
3296
  /* Blackfin-specific: we want rel relocations for the plt.  */
3297
0
  s = bfd_make_section_anyway_with_flags (abfd, ".rel.plt",
3298
0
            flags | SEC_READONLY);
3299
0
  if (s == NULL
3300
0
      || !bfd_set_section_alignment (s, bed->s->log_file_align))
3301
0
    return false;
3302
  /* Blackfin-specific: remember it.  */
3303
0
  bfinfdpic_pltrel_section (info) = s;
3304
3305
0
  return true;
3306
0
}
3307
3308
/* Make sure the got and plt sections exist, and that our pointers in
3309
   the link hash table point to them.  */
3310
3311
static bool
3312
elf32_bfinfdpic_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
3313
0
{
3314
  /* This is mostly copied from
3315
     elflink.c:_bfd_elf_create_dynamic_sections().  */
3316
0
  flagword flags;
3317
0
  asection *s;
3318
0
  elf_backend_data *bed = get_elf_backend_data (abfd);
3319
3320
0
  flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
3321
0
     | SEC_LINKER_CREATED);
3322
3323
  /* We need to create .plt, .rel[a].plt, .got, .got.plt, .dynbss, and
3324
     .rel[a].bss sections.  */
3325
3326
  /* Blackfin-specific: we want to create the GOT in the Blackfin way.  */
3327
0
  if (! _bfin_create_got_section (abfd, info))
3328
0
    return false;
3329
3330
  /* Blackfin-specific: make sure we created everything we wanted.  */
3331
0
  BFD_ASSERT (bfinfdpic_got_section (info) && bfinfdpic_gotrel_section (info)
3332
        /* && bfinfdpic_gotfixup_section (info) */
3333
0
        && bfinfdpic_plt_section (info)
3334
0
        && bfinfdpic_pltrel_section (info));
3335
3336
0
  if (bed->want_dynbss)
3337
0
    {
3338
      /* The .dynbss section is a place to put symbols which are defined
3339
   by dynamic objects, are referenced by regular objects, and are
3340
   not functions.  We must allocate space for them in the process
3341
   image and use a R_*_COPY reloc to tell the dynamic linker to
3342
   initialize them at run time.  The linker script puts the .dynbss
3343
   section into the .bss section of the final image.  */
3344
0
      s = bfd_make_section_anyway_with_flags (abfd, ".dynbss",
3345
0
                SEC_ALLOC | SEC_LINKER_CREATED);
3346
0
      if (s == NULL)
3347
0
  return false;
3348
3349
      /* The .rel[a].bss section holds copy relocs.  This section is not
3350
   normally needed.  We need to create it here, though, so that the
3351
   linker will map it to an output section.  We can't just create it
3352
   only if we need it, because we will not know whether we need it
3353
   until we have seen all the input files, and the first time the
3354
   main linker code calls BFD after examining all the input files
3355
   (size_dynamic_sections) the input sections have already been
3356
   mapped to the output sections.  If the section turns out not to
3357
   be needed, we can discard it later.  We will never need this
3358
   section when generating a shared object, since they do not use
3359
   copy relocs.  */
3360
0
      if (! bfd_link_pic (info))
3361
0
  {
3362
0
    s = bfd_make_section_anyway_with_flags (abfd,
3363
0
              ".rela.bss",
3364
0
              flags | SEC_READONLY);
3365
0
    if (s == NULL
3366
0
        || !bfd_set_section_alignment (s, bed->s->log_file_align))
3367
0
      return false;
3368
0
  }
3369
0
    }
3370
3371
0
  return true;
3372
0
}
3373
3374
/* Compute the total GOT size required by each symbol in each range.
3375
   Symbols may require up to 4 words in the GOT: an entry pointing to
3376
   the symbol, an entry pointing to its function descriptor, and a
3377
   private function descriptors taking two words.  */
3378
3379
static void
3380
_bfinfdpic_count_nontls_entries (struct bfinfdpic_relocs_info *entry,
3381
         struct _bfinfdpic_dynamic_got_info *dinfo)
3382
0
{
3383
  /* Allocate space for a GOT entry pointing to the symbol.  */
3384
0
  if (entry->got17m4)
3385
0
    dinfo->got17m4 += 4;
3386
0
  else if (entry->gothilo)
3387
0
    dinfo->gothilo += 4;
3388
0
  else
3389
0
    entry->relocs32--;
3390
0
  entry->relocs32++;
3391
3392
  /* Allocate space for a GOT entry pointing to the function
3393
     descriptor.  */
3394
0
  if (entry->fdgot17m4)
3395
0
    dinfo->got17m4 += 4;
3396
0
  else if (entry->fdgothilo)
3397
0
    dinfo->gothilo += 4;
3398
0
  else
3399
0
    entry->relocsfd--;
3400
0
  entry->relocsfd++;
3401
3402
  /* Decide whether we need a PLT entry, a function descriptor in the
3403
     GOT, and a lazy PLT entry for this symbol.  */
3404
0
  entry->plt = entry->call
3405
0
    && entry->symndx == -1 && ! BFINFDPIC_SYM_LOCAL (dinfo->info, entry->d.h)
3406
0
    && elf_hash_table (dinfo->info)->dynamic_sections_created;
3407
0
  entry->privfd = entry->plt
3408
0
    || entry->fdgoff17m4 || entry->fdgoffhilo
3409
0
    || ((entry->fd || entry->fdgot17m4 || entry->fdgothilo)
3410
0
  && (entry->symndx != -1
3411
0
      || BFINFDPIC_FUNCDESC_LOCAL (dinfo->info, entry->d.h)));
3412
0
  entry->lazyplt = entry->privfd
3413
0
    && entry->symndx == -1 && ! BFINFDPIC_SYM_LOCAL (dinfo->info, entry->d.h)
3414
0
    && ! (dinfo->info->flags & DF_BIND_NOW)
3415
0
    && elf_hash_table (dinfo->info)->dynamic_sections_created;
3416
3417
  /* Allocate space for a function descriptor.  */
3418
0
  if (entry->fdgoff17m4)
3419
0
    dinfo->fd17m4 += 8;
3420
0
  else if (entry->privfd && entry->plt)
3421
0
    dinfo->fdplt += 8;
3422
0
  else if (entry->privfd)
3423
0
    dinfo->fdhilo += 8;
3424
0
  else
3425
0
    entry->relocsfdv--;
3426
0
  entry->relocsfdv++;
3427
3428
0
  if (entry->lazyplt)
3429
0
    dinfo->lzplt += LZPLT_NORMAL_SIZE;
3430
0
}
3431
3432
/* Compute the number of dynamic relocations and fixups that a symbol
3433
   requires, and add (or subtract) from the grand and per-symbol
3434
   totals.  */
3435
3436
static void
3437
_bfinfdpic_count_relocs_fixups (struct bfinfdpic_relocs_info *entry,
3438
        struct _bfinfdpic_dynamic_got_info *dinfo,
3439
        bool subtract)
3440
0
{
3441
0
  bfd_vma relocs = 0, fixups = 0;
3442
3443
0
  if (!bfd_link_pde (dinfo->info))
3444
0
    relocs = entry->relocs32 + entry->relocsfd + entry->relocsfdv;
3445
0
  else
3446
0
    {
3447
0
      if (entry->symndx != -1 || BFINFDPIC_SYM_LOCAL (dinfo->info, entry->d.h))
3448
0
  {
3449
0
    if (entry->symndx != -1
3450
0
        || entry->d.h->root.type != bfd_link_hash_undefweak)
3451
0
      fixups += entry->relocs32 + 2 * entry->relocsfdv;
3452
0
  }
3453
0
      else
3454
0
  relocs += entry->relocs32 + entry->relocsfdv;
3455
3456
0
      if (entry->symndx != -1
3457
0
    || BFINFDPIC_FUNCDESC_LOCAL (dinfo->info, entry->d.h))
3458
0
  {
3459
0
    if (entry->symndx != -1
3460
0
        || entry->d.h->root.type != bfd_link_hash_undefweak)
3461
0
      fixups += entry->relocsfd;
3462
0
  }
3463
0
      else
3464
0
  relocs += entry->relocsfd;
3465
0
    }
3466
3467
0
  if (subtract)
3468
0
    {
3469
0
      relocs = - relocs;
3470
0
      fixups = - fixups;
3471
0
    }
3472
3473
0
  entry->dynrelocs += relocs;
3474
0
  entry->fixups += fixups;
3475
0
  dinfo->relocs += relocs;
3476
0
  dinfo->fixups += fixups;
3477
0
}
3478
3479
/* Compute the total GOT and PLT size required by each symbol in each range. *
3480
   Symbols may require up to 4 words in the GOT: an entry pointing to
3481
   the symbol, an entry pointing to its function descriptor, and a
3482
   private function descriptors taking two words.  */
3483
3484
static int
3485
_bfinfdpic_count_got_plt_entries (void **entryp, void *dinfo_)
3486
0
{
3487
0
  struct bfinfdpic_relocs_info *entry = *entryp;
3488
0
  struct _bfinfdpic_dynamic_got_info *dinfo = dinfo_;
3489
3490
0
  _bfinfdpic_count_nontls_entries (entry, dinfo);
3491
3492
0
  _bfinfdpic_count_relocs_fixups (entry, dinfo, false);
3493
3494
0
  return 1;
3495
0
}
3496
3497
/* This structure is used to assign offsets to got entries, function
3498
   descriptors, plt entries and lazy plt entries.  */
3499
3500
struct _bfinfdpic_dynamic_got_plt_info
3501
{
3502
  /* Summary information collected with _bfinfdpic_count_got_plt_entries.  */
3503
  struct _bfinfdpic_dynamic_got_info g;
3504
3505
  /* For each addressable range, we record a MAX (positive) and MIN
3506
     (negative) value.  CUR is used to assign got entries, and it's
3507
     incremented from an initial positive value to MAX, then from MIN
3508
     to FDCUR (unless FDCUR wraps around first).  FDCUR is used to
3509
     assign function descriptors, and it's decreased from an initial
3510
     non-positive value to MIN, then from MAX down to CUR (unless CUR
3511
     wraps around first).  All of MIN, MAX, CUR and FDCUR always point
3512
     to even words.  ODD, if non-zero, indicates an odd word to be
3513
     used for the next got entry, otherwise CUR is used and
3514
     incremented by a pair of words, wrapping around when it reaches
3515
     MAX.  FDCUR is decremented (and wrapped) before the next function
3516
     descriptor is chosen.  FDPLT indicates the number of remaining
3517
     slots that can be used for function descriptors used only by PLT
3518
     entries.  */
3519
  struct _bfinfdpic_dynamic_got_alloc_data
3520
  {
3521
    bfd_signed_vma max, cur, odd, fdcur, min;
3522
    bfd_vma fdplt;
3523
  } got17m4, gothilo;
3524
};
3525
3526
/* Determine the positive and negative ranges to be used by each
3527
   offset range in the GOT.  FDCUR and CUR, that must be aligned to a
3528
   double-word boundary, are the minimum (negative) and maximum
3529
   (positive) GOT offsets already used by previous ranges, except for
3530
   an ODD entry that may have been left behind.  GOT and FD indicate
3531
   the size of GOT entries and function descriptors that must be
3532
   placed within the range from -WRAP to WRAP.  If there's room left,
3533
   up to FDPLT bytes should be reserved for additional function
3534
   descriptors.  */
3535
3536
inline static bfd_signed_vma
3537
_bfinfdpic_compute_got_alloc_data (struct _bfinfdpic_dynamic_got_alloc_data *gad,
3538
           bfd_signed_vma fdcur,
3539
           bfd_signed_vma odd,
3540
           bfd_signed_vma cur,
3541
           bfd_vma got,
3542
           bfd_vma fd,
3543
           bfd_vma fdplt,
3544
           bfd_vma wrap)
3545
0
{
3546
0
  bfd_signed_vma wrapmin = -wrap;
3547
3548
  /* Start at the given initial points.  */
3549
0
  gad->fdcur = fdcur;
3550
0
  gad->cur = cur;
3551
3552
  /* If we had an incoming odd word and we have any got entries that
3553
     are going to use it, consume it, otherwise leave gad->odd at
3554
     zero.  We might force gad->odd to zero and return the incoming
3555
     odd such that it is used by the next range, but then GOT entries
3556
     might appear to be out of order and we wouldn't be able to
3557
     shorten the GOT by one word if it turns out to end with an
3558
     unpaired GOT entry.  */
3559
0
  if (odd && got)
3560
0
    {
3561
0
      gad->odd = odd;
3562
0
      got -= 4;
3563
0
      odd = 0;
3564
0
    }
3565
0
  else
3566
0
    gad->odd = 0;
3567
3568
  /* If we're left with an unpaired GOT entry, compute its location
3569
     such that we can return it.  Otherwise, if got doesn't require an
3570
     odd number of words here, either odd was already zero in the
3571
     block above, or it was set to zero because got was non-zero, or
3572
     got was already zero.  In the latter case, we want the value of
3573
     odd to carry over to the return statement, so we don't want to
3574
     reset odd unless the condition below is true.  */
3575
0
  if (got & 4)
3576
0
    {
3577
0
      odd = cur + got;
3578
0
      got += 4;
3579
0
    }
3580
3581
  /* Compute the tentative boundaries of this range.  */
3582
0
  gad->max = cur + got;
3583
0
  gad->min = fdcur - fd;
3584
0
  gad->fdplt = 0;
3585
3586
  /* If function descriptors took too much space, wrap some of them
3587
     around.  */
3588
0
  if (gad->min < wrapmin)
3589
0
    {
3590
0
      gad->max += wrapmin - gad->min;
3591
0
      gad->min = wrapmin;
3592
0
    }
3593
  /* If there is space left and we have function descriptors
3594
     referenced in PLT entries that could take advantage of shorter
3595
     offsets, place them here.  */
3596
0
  else if (fdplt && gad->min > wrapmin)
3597
0
    {
3598
0
      bfd_vma fds;
3599
0
      if ((bfd_vma) (gad->min - wrapmin) < fdplt)
3600
0
  fds = gad->min - wrapmin;
3601
0
      else
3602
0
  fds = fdplt;
3603
3604
0
      fdplt -= fds;
3605
0
      gad->min -= fds;
3606
0
      gad->fdplt += fds;
3607
0
    }
3608
3609
  /* If GOT entries took too much space, wrap some of them around.
3610
     This may well cause gad->min to become lower than wrapmin.  This
3611
     will cause a relocation overflow later on, so we don't have to
3612
     report it here . */
3613
0
  if ((bfd_vma) gad->max > wrap)
3614
0
    {
3615
0
      gad->min -= gad->max - wrap;
3616
0
      gad->max = wrap;
3617
0
    }
3618
  /* If there is more space left, try to place some more function
3619
     descriptors for PLT entries.  */
3620
0
  else if (fdplt && (bfd_vma) gad->max < wrap)
3621
0
    {
3622
0
      bfd_vma fds;
3623
0
      if ((bfd_vma) (wrap - gad->max) < fdplt)
3624
0
  fds = wrap - gad->max;
3625
0
      else
3626
0
  fds = fdplt;
3627
3628
0
      fdplt -= fds;
3629
0
      gad->max += fds;
3630
0
      gad->fdplt += fds;
3631
0
    }
3632
3633
  /* If odd was initially computed as an offset past the wrap point,
3634
     wrap it around.  */
3635
0
  if (odd > gad->max)
3636
0
    odd = gad->min + odd - gad->max;
3637
3638
  /* _bfinfdpic_get_got_entry() below will always wrap gad->cur if needed
3639
     before returning, so do it here too.  This guarantees that,
3640
     should cur and fdcur meet at the wrap point, they'll both be
3641
     equal to min.  */
3642
0
  if (gad->cur == gad->max)
3643
0
    gad->cur = gad->min;
3644
3645
0
  return odd;
3646
0
}
3647
3648
/* Compute the location of the next GOT entry, given the allocation
3649
   data for a range.  */
3650
3651
inline static bfd_signed_vma
3652
_bfinfdpic_get_got_entry (struct _bfinfdpic_dynamic_got_alloc_data *gad)
3653
0
{
3654
0
  bfd_signed_vma ret;
3655
3656
0
  if (gad->odd)
3657
0
    {
3658
      /* If there was an odd word left behind, use it.  */
3659
0
      ret = gad->odd;
3660
0
      gad->odd = 0;
3661
0
    }
3662
0
  else
3663
0
    {
3664
      /* Otherwise, use the word pointed to by cur, reserve the next
3665
   as an odd word, and skip to the next pair of words, possibly
3666
   wrapping around.  */
3667
0
      ret = gad->cur;
3668
0
      gad->odd = gad->cur + 4;
3669
0
      gad->cur += 8;
3670
0
      if (gad->cur == gad->max)
3671
0
  gad->cur = gad->min;
3672
0
    }
3673
3674
0
  return ret;
3675
0
}
3676
3677
/* Compute the location of the next function descriptor entry in the
3678
   GOT, given the allocation data for a range.  */
3679
3680
inline static bfd_signed_vma
3681
_bfinfdpic_get_fd_entry (struct _bfinfdpic_dynamic_got_alloc_data *gad)
3682
0
{
3683
  /* If we're at the bottom, wrap around, and only then allocate the
3684
     next pair of words.  */
3685
0
  if (gad->fdcur == gad->min)
3686
0
    gad->fdcur = gad->max;
3687
0
  return gad->fdcur -= 8;
3688
0
}
3689
3690
/* Assign GOT offsets for every GOT entry and function descriptor.
3691
   Doing everything in a single pass is tricky.  */
3692
3693
static int
3694
_bfinfdpic_assign_got_entries (void **entryp, void *info_)
3695
0
{
3696
0
  struct bfinfdpic_relocs_info *entry = *entryp;
3697
0
  struct _bfinfdpic_dynamic_got_plt_info *dinfo = info_;
3698
3699
0
  if (entry->got17m4)
3700
0
    entry->got_entry = _bfinfdpic_get_got_entry (&dinfo->got17m4);
3701
0
  else if (entry->gothilo)
3702
0
    entry->got_entry = _bfinfdpic_get_got_entry (&dinfo->gothilo);
3703
3704
0
  if (entry->fdgot17m4)
3705
0
    entry->fdgot_entry = _bfinfdpic_get_got_entry (&dinfo->got17m4);
3706
0
  else if (entry->fdgothilo)
3707
0
    entry->fdgot_entry = _bfinfdpic_get_got_entry (&dinfo->gothilo);
3708
3709
0
  if (entry->fdgoff17m4)
3710
0
    entry->fd_entry = _bfinfdpic_get_fd_entry (&dinfo->got17m4);
3711
0
  else if (entry->plt && dinfo->got17m4.fdplt)
3712
0
    {
3713
0
      dinfo->got17m4.fdplt -= 8;
3714
0
      entry->fd_entry = _bfinfdpic_get_fd_entry (&dinfo->got17m4);
3715
0
    }
3716
0
  else if (entry->plt)
3717
0
    {
3718
0
      dinfo->gothilo.fdplt -= 8;
3719
0
      entry->fd_entry = _bfinfdpic_get_fd_entry (&dinfo->gothilo);
3720
0
    }
3721
0
  else if (entry->privfd)
3722
0
    entry->fd_entry = _bfinfdpic_get_fd_entry (&dinfo->gothilo);
3723
3724
0
  return 1;
3725
0
}
3726
3727
/* Assign GOT offsets to private function descriptors used by PLT
3728
   entries (or referenced by 32-bit offsets), as well as PLT entries
3729
   and lazy PLT entries.  */
3730
3731
static int
3732
_bfinfdpic_assign_plt_entries (void **entryp, void *info_)
3733
0
{
3734
0
  struct bfinfdpic_relocs_info *entry = *entryp;
3735
0
  struct _bfinfdpic_dynamic_got_plt_info *dinfo = info_;
3736
3737
  /* If this symbol requires a local function descriptor, allocate
3738
     one.  */
3739
0
  if (entry->privfd && entry->fd_entry == 0)
3740
0
    {
3741
0
      if (dinfo->got17m4.fdplt)
3742
0
  {
3743
0
    entry->fd_entry = _bfinfdpic_get_fd_entry (&dinfo->got17m4);
3744
0
    dinfo->got17m4.fdplt -= 8;
3745
0
  }
3746
0
      else
3747
0
  {
3748
0
    BFD_ASSERT (dinfo->gothilo.fdplt);
3749
0
    entry->fd_entry = _bfinfdpic_get_fd_entry (&dinfo->gothilo);
3750
0
    dinfo->gothilo.fdplt -= 8;
3751
0
  }
3752
0
    }
3753
3754
0
  if (entry->plt)
3755
0
    {
3756
0
      int size;
3757
3758
      /* We use the section's raw size to mark the location of the
3759
   next PLT entry.  */
3760
0
      entry->plt_entry = bfinfdpic_plt_section (dinfo->g.info)->size;
3761
3762
      /* Figure out the length of this PLT entry based on the
3763
   addressing mode we need to reach the function descriptor.  */
3764
0
      BFD_ASSERT (entry->fd_entry);
3765
0
      if (entry->fd_entry >= -(1 << (18 - 1))
3766
0
    && entry->fd_entry + 4 < (1 << (18 - 1)))
3767
0
  size = 10;
3768
0
      else
3769
0
  size = 16;
3770
3771
0
      bfinfdpic_plt_section (dinfo->g.info)->size += size;
3772
0
    }
3773
3774
0
  if (entry->lazyplt)
3775
0
    {
3776
0
      entry->lzplt_entry = dinfo->g.lzplt;
3777
0
      dinfo->g.lzplt += LZPLT_NORMAL_SIZE;
3778
      /* If this entry is the one that gets the resolver stub, account
3779
   for the additional instruction.  */
3780
0
      if (entry->lzplt_entry % BFINFDPIC_LZPLT_BLOCK_SIZE
3781
0
    == BFINFDPIC_LZPLT_RESOLV_LOC)
3782
0
  dinfo->g.lzplt += LZPLT_RESOLVER_EXTRA;
3783
0
    }
3784
3785
0
  return 1;
3786
0
}
3787
3788
/* Cancel out any effects of calling _bfinfdpic_assign_got_entries and
3789
   _bfinfdpic_assign_plt_entries.  */
3790
3791
static int
3792
_bfinfdpic_reset_got_plt_entries (void **entryp, void *ignore ATTRIBUTE_UNUSED)
3793
0
{
3794
0
  struct bfinfdpic_relocs_info *entry = *entryp;
3795
3796
0
  entry->got_entry = 0;
3797
0
  entry->fdgot_entry = 0;
3798
0
  entry->fd_entry = 0;
3799
0
  entry->plt_entry = (bfd_vma)-1;
3800
0
  entry->lzplt_entry = (bfd_vma)-1;
3801
3802
0
  return 1;
3803
0
}
3804
3805
/* Follow indirect and warning hash entries so that each got entry
3806
   points to the final symbol definition.  P must point to a pointer
3807
   to the hash table we're traversing.  Since this traversal may
3808
   modify the hash table, we set this pointer to NULL to indicate
3809
   we've made a potentially-destructive change to the hash table, so
3810
   the traversal must be restarted.  */
3811
static int
3812
_bfinfdpic_resolve_final_relocs_info (void **entryp, void *p)
3813
0
{
3814
0
  struct bfinfdpic_relocs_info *entry = *entryp;
3815
0
  htab_t *htab = p;
3816
3817
0
  if (entry->symndx == -1)
3818
0
    {
3819
0
      struct elf_link_hash_entry *h = entry->d.h;
3820
0
      struct bfinfdpic_relocs_info *oentry;
3821
3822
0
      while (h->root.type == bfd_link_hash_indirect
3823
0
       || h->root.type == bfd_link_hash_warning)
3824
0
  h = (struct elf_link_hash_entry *)h->root.u.i.link;
3825
3826
0
      if (entry->d.h == h)
3827
0
  return 1;
3828
3829
0
      oentry = bfinfdpic_relocs_info_for_global (*htab, 0, h, entry->addend,
3830
0
            NO_INSERT);
3831
3832
0
      if (oentry)
3833
0
  {
3834
    /* Merge the two entries.  */
3835
0
    bfinfdpic_pic_merge_early_relocs_info (oentry, entry);
3836
0
    htab_clear_slot (*htab, entryp);
3837
0
    return 1;
3838
0
  }
3839
3840
0
      entry->d.h = h;
3841
3842
      /* If we can't find this entry with the new bfd hash, re-insert
3843
   it, and get the traversal restarted.  */
3844
0
      if (! htab_find (*htab, entry))
3845
0
  {
3846
0
    htab_clear_slot (*htab, entryp);
3847
0
    entryp = htab_find_slot (*htab, entry, INSERT);
3848
0
    if (! *entryp)
3849
0
      *entryp = entry;
3850
    /* Abort the traversal, since the whole table may have
3851
       moved, and leave it up to the parent to restart the
3852
       process.  */
3853
0
    *(htab_t *)p = NULL;
3854
0
    return 0;
3855
0
  }
3856
0
    }
3857
3858
0
  return 1;
3859
0
}
3860
3861
/* Compute the total size of the GOT, the PLT, the dynamic relocations
3862
   section and the rofixup section.  Assign locations for GOT and PLT
3863
   entries.  */
3864
3865
static bool
3866
_bfinfdpic_size_got_plt (bfd *output_bfd,
3867
       struct _bfinfdpic_dynamic_got_plt_info *gpinfop)
3868
0
{
3869
0
  bfd_signed_vma odd;
3870
0
  bfd_vma limit;
3871
0
  struct bfd_link_info *info = gpinfop->g.info;
3872
0
  bfd *dynobj = elf_hash_table (info)->dynobj;
3873
3874
0
  memcpy (bfinfdpic_dynamic_got_plt_info (info), &gpinfop->g,
3875
0
    sizeof (gpinfop->g));
3876
3877
0
  odd = 12;
3878
  /* Compute the total size taken by entries in the 18-bit range,
3879
     to tell how many PLT function descriptors we can bring into it
3880
     without causing it to overflow.  */
3881
0
  limit = odd + gpinfop->g.got17m4 + gpinfop->g.fd17m4;
3882
0
  if (limit < (bfd_vma)1 << 18)
3883
0
    limit = ((bfd_vma)1 << 18) - limit;
3884
0
  else
3885
0
    limit = 0;
3886
0
  if (gpinfop->g.fdplt < limit)
3887
0
    limit = gpinfop->g.fdplt;
3888
3889
  /* Determine the ranges of GOT offsets that we can use for each
3890
     range of addressing modes.  */
3891
0
  odd = _bfinfdpic_compute_got_alloc_data (&gpinfop->got17m4,
3892
0
            0,
3893
0
            odd,
3894
0
            16,
3895
0
            gpinfop->g.got17m4,
3896
0
            gpinfop->g.fd17m4,
3897
0
            limit,
3898
0
            (bfd_vma)1 << (18-1));
3899
0
  odd = _bfinfdpic_compute_got_alloc_data (&gpinfop->gothilo,
3900
0
            gpinfop->got17m4.min,
3901
0
            odd,
3902
0
            gpinfop->got17m4.max,
3903
0
            gpinfop->g.gothilo,
3904
0
            gpinfop->g.fdhilo,
3905
0
            gpinfop->g.fdplt - gpinfop->got17m4.fdplt,
3906
0
            (bfd_vma)1 << (32-1));
3907
3908
  /* Now assign (most) GOT offsets.  */
3909
0
  htab_traverse (bfinfdpic_relocs_info (info), _bfinfdpic_assign_got_entries,
3910
0
     gpinfop);
3911
3912
0
  bfinfdpic_got_section (info)->size = gpinfop->gothilo.max
3913
0
    - gpinfop->gothilo.min
3914
    /* If an odd word is the last word of the GOT, we don't need this
3915
       word to be part of the GOT.  */
3916
0
    - (odd + 4 == gpinfop->gothilo.max ? 4 : 0);
3917
0
  if (bfinfdpic_got_section (info)->size == 0)
3918
0
    bfinfdpic_got_section (info)->flags |= SEC_EXCLUDE;
3919
0
  else if (bfinfdpic_got_section (info)->size == 12
3920
0
     && ! elf_hash_table (info)->dynamic_sections_created)
3921
0
    {
3922
0
      bfinfdpic_got_section (info)->flags |= SEC_EXCLUDE;
3923
0
      bfinfdpic_got_section (info)->size = 0;
3924
0
    }
3925
0
  else
3926
0
    {
3927
0
      bfinfdpic_got_section (info)->contents =
3928
0
  (bfd_byte *) bfd_zalloc (dynobj,
3929
0
         bfinfdpic_got_section (info)->size);
3930
0
      if (bfinfdpic_got_section (info)->contents == NULL)
3931
0
  return false;
3932
0
      bfinfdpic_got_section (info)->alloced = 1;
3933
0
    }
3934
3935
0
  if (elf_hash_table (info)->dynamic_sections_created)
3936
    /* Subtract the number of lzplt entries, since those will generate
3937
       relocations in the pltrel section.  */
3938
0
    bfinfdpic_gotrel_section (info)->size =
3939
0
      (gpinfop->g.relocs - gpinfop->g.lzplt / LZPLT_NORMAL_SIZE)
3940
0
      * get_elf_backend_data (output_bfd)->s->sizeof_rel;
3941
0
  else
3942
0
    BFD_ASSERT (gpinfop->g.relocs == 0);
3943
0
  if (bfinfdpic_gotrel_section (info)->size == 0)
3944
0
    bfinfdpic_gotrel_section (info)->flags |= SEC_EXCLUDE;
3945
0
  else
3946
0
    {
3947
0
      bfinfdpic_gotrel_section (info)->contents =
3948
0
  (bfd_byte *) bfd_zalloc (dynobj,
3949
0
         bfinfdpic_gotrel_section (info)->size);
3950
0
      if (bfinfdpic_gotrel_section (info)->contents == NULL)
3951
0
  return false;
3952
0
      bfinfdpic_gotrel_section (info)->alloced = 1;
3953
0
    }
3954
3955
0
  bfinfdpic_gotfixup_section (info)->size = (gpinfop->g.fixups + 1) * 4;
3956
0
  if (bfinfdpic_gotfixup_section (info)->size == 0)
3957
0
    bfinfdpic_gotfixup_section (info)->flags |= SEC_EXCLUDE;
3958
0
  else
3959
0
    {
3960
0
      bfinfdpic_gotfixup_section (info)->contents =
3961
0
  (bfd_byte *) bfd_zalloc (dynobj,
3962
0
         bfinfdpic_gotfixup_section (info)->size);
3963
0
      if (bfinfdpic_gotfixup_section (info)->contents == NULL)
3964
0
  return false;
3965
0
      bfinfdpic_gotfixup_section (info)->alloced = 1;
3966
0
    }
3967
3968
0
  if (elf_hash_table (info)->dynamic_sections_created)
3969
0
    bfinfdpic_pltrel_section (info)->size =
3970
0
      gpinfop->g.lzplt / LZPLT_NORMAL_SIZE * get_elf_backend_data (output_bfd)->s->sizeof_rel;
3971
0
  if (bfinfdpic_pltrel_section (info)->size == 0)
3972
0
    bfinfdpic_pltrel_section (info)->flags |= SEC_EXCLUDE;
3973
0
  else
3974
0
    {
3975
0
      bfinfdpic_pltrel_section (info)->contents =
3976
0
  (bfd_byte *) bfd_zalloc (dynobj,
3977
0
         bfinfdpic_pltrel_section (info)->size);
3978
0
      if (bfinfdpic_pltrel_section (info)->contents == NULL)
3979
0
  return false;
3980
0
      bfinfdpic_pltrel_section (info)->alloced = 1;
3981
0
    }
3982
3983
  /* Add 4 bytes for every block of at most 65535 lazy PLT entries,
3984
     such that there's room for the additional instruction needed to
3985
     call the resolver.  Since _bfinfdpic_assign_got_entries didn't
3986
     account for them, our block size is 4 bytes smaller than the real
3987
     block size.  */
3988
0
  if (elf_hash_table (info)->dynamic_sections_created)
3989
0
    {
3990
0
      bfinfdpic_plt_section (info)->size = gpinfop->g.lzplt
3991
0
  + ((gpinfop->g.lzplt + (BFINFDPIC_LZPLT_BLOCK_SIZE - 4) - LZPLT_NORMAL_SIZE)
3992
0
     / (BFINFDPIC_LZPLT_BLOCK_SIZE - 4) * LZPLT_RESOLVER_EXTRA);
3993
0
    }
3994
3995
  /* Reset it, such that _bfinfdpic_assign_plt_entries() can use it to
3996
     actually assign lazy PLT entries addresses.  */
3997
0
  gpinfop->g.lzplt = 0;
3998
3999
  /* Save information that we're going to need to generate GOT and PLT
4000
     entries.  */
4001
0
  bfinfdpic_got_initial_offset (info) = -gpinfop->gothilo.min;
4002
4003
0
  if (get_elf_backend_data (output_bfd)->want_got_sym)
4004
0
    elf_hash_table (info)->hgot->root.u.def.value
4005
0
      = bfinfdpic_got_initial_offset (info);
4006
4007
0
  if (elf_hash_table (info)->dynamic_sections_created)
4008
0
    bfinfdpic_plt_initial_offset (info) =
4009
0
      bfinfdpic_plt_section (info)->size;
4010
4011
0
  htab_traverse (bfinfdpic_relocs_info (info), _bfinfdpic_assign_plt_entries,
4012
0
     gpinfop);
4013
4014
  /* Allocate the PLT section contents only after
4015
     _bfinfdpic_assign_plt_entries has a chance to add the size of the
4016
     non-lazy PLT entries.  */
4017
0
  if (bfinfdpic_plt_section (info)->size == 0)
4018
0
    bfinfdpic_plt_section (info)->flags |= SEC_EXCLUDE;
4019
0
  else
4020
0
    {
4021
0
      bfinfdpic_plt_section (info)->contents =
4022
0
  (bfd_byte *) bfd_zalloc (dynobj,
4023
0
         bfinfdpic_plt_section (info)->size);
4024
0
      if (bfinfdpic_plt_section (info)->contents == NULL)
4025
0
  return false;
4026
0
      bfinfdpic_plt_section (info)->alloced = 1;
4027
0
    }
4028
4029
0
  return true;
4030
0
}
4031
4032
/* Set the sizes of the dynamic sections.  */
4033
4034
static bool
4035
elf32_bfinfdpic_late_size_sections (bfd *output_bfd,
4036
            struct bfd_link_info *info)
4037
0
{
4038
0
  struct elf_link_hash_table *htab;
4039
0
  bfd *dynobj;
4040
0
  asection *s;
4041
0
  struct _bfinfdpic_dynamic_got_plt_info gpinfo;
4042
4043
0
  htab = elf_hash_table (info);
4044
0
  dynobj = htab->dynobj;
4045
0
  if (dynobj == NULL)
4046
0
    return true;
4047
4048
0
  if (htab->dynamic_sections_created)
4049
0
    {
4050
      /* Set the contents of the .interp section to the interpreter.  */
4051
0
      if (bfd_link_executable (info) && !info->nointerp)
4052
0
  {
4053
0
    s = htab->interp;
4054
0
    BFD_ASSERT (s != NULL);
4055
0
    s->size = sizeof ELF_DYNAMIC_INTERPRETER;
4056
0
    s->contents = (bfd_byte *) ELF_DYNAMIC_INTERPRETER;
4057
0
    s->alloced = 1;
4058
0
  }
4059
0
    }
4060
4061
0
  memset (&gpinfo, 0, sizeof (gpinfo));
4062
0
  gpinfo.g.info = info;
4063
4064
0
  for (;;)
4065
0
    {
4066
0
      htab_t relocs = bfinfdpic_relocs_info (info);
4067
4068
0
      htab_traverse (relocs, _bfinfdpic_resolve_final_relocs_info, &relocs);
4069
4070
0
      if (relocs == bfinfdpic_relocs_info (info))
4071
0
  break;
4072
0
    }
4073
4074
0
  htab_traverse (bfinfdpic_relocs_info (info), _bfinfdpic_count_got_plt_entries,
4075
0
     &gpinfo.g);
4076
4077
  /* Allocate space to save the summary information, we're going to
4078
     use it if we're doing relaxations.  */
4079
0
  bfinfdpic_dynamic_got_plt_info (info) = bfd_alloc (dynobj, sizeof (gpinfo.g));
4080
4081
0
  if (!_bfinfdpic_size_got_plt (output_bfd, &gpinfo))
4082
0
      return false;
4083
4084
0
  s = bfd_get_linker_section (dynobj, ".dynbss");
4085
0
  if (s && s->size == 0)
4086
0
    s->flags |= SEC_EXCLUDE;
4087
4088
0
  s = bfd_get_linker_section (dynobj, ".rela.bss");
4089
0
  if (s && s->size == 0)
4090
0
    s->flags |= SEC_EXCLUDE;
4091
4092
0
  return _bfd_elf_add_dynamic_tags (output_bfd, info, true);
4093
0
}
4094
4095
static bool
4096
elf32_bfinfdpic_early_size_sections (bfd *output_bfd,
4097
             struct bfd_link_info *info)
4098
0
{
4099
0
  if (!bfd_link_relocatable (info)
4100
0
      && !bfd_elf_stack_segment_size (output_bfd, info,
4101
0
              "__stacksize", DEFAULT_STACK_SIZE))
4102
0
    return false;
4103
4104
0
  return true;
4105
0
}
4106
4107
/* Check whether any of the relocations was optimized away, and
4108
   subtract it from the relocation or fixup count.  */
4109
static bool
4110
_bfinfdpic_check_discarded_relocs (bfd *abfd, asection *sec,
4111
           struct bfd_link_info *info,
4112
           bool *changed)
4113
0
{
4114
0
  Elf_Internal_Shdr *symtab_hdr;
4115
0
  struct elf_link_hash_entry **sym_hashes;
4116
0
  Elf_Internal_Rela *rel, *erel;
4117
4118
0
  if ((sec->flags & SEC_RELOC) == 0
4119
0
      || sec->reloc_count == 0)
4120
0
    return true;
4121
4122
0
  symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
4123
0
  sym_hashes = elf_sym_hashes (abfd);
4124
4125
0
  rel = elf_section_data (sec)->relocs;
4126
4127
  /* Now examine each relocation.  */
4128
0
  for (erel = rel + sec->reloc_count; rel < erel; rel++)
4129
0
    {
4130
0
      struct elf_link_hash_entry *h;
4131
0
      unsigned long r_symndx;
4132
0
      struct bfinfdpic_relocs_info *picrel;
4133
0
      struct _bfinfdpic_dynamic_got_info *dinfo;
4134
4135
0
      if (ELF32_R_TYPE (rel->r_info) != R_BFIN_BYTE4_DATA
4136
0
    && ELF32_R_TYPE (rel->r_info) != R_BFIN_FUNCDESC)
4137
0
  continue;
4138
4139
0
      if (_bfd_elf_section_offset (sec->output_section->owner,
4140
0
           info, sec, rel->r_offset)
4141
0
    != (bfd_vma)-1)
4142
0
  continue;
4143
4144
0
      r_symndx = ELF32_R_SYM (rel->r_info);
4145
0
      if (r_symndx < symtab_hdr->sh_info)
4146
0
  h = NULL;
4147
0
      else
4148
0
  {
4149
0
    h = sym_hashes[r_symndx - symtab_hdr->sh_info];
4150
0
    while (h->root.type == bfd_link_hash_indirect
4151
0
     || h->root.type == bfd_link_hash_warning)
4152
0
      h = (struct elf_link_hash_entry *)h->root.u.i.link;
4153
0
  }
4154
4155
0
      if (h != NULL)
4156
0
  picrel = bfinfdpic_relocs_info_for_global (bfinfdpic_relocs_info (info),
4157
0
              abfd, h,
4158
0
              rel->r_addend, NO_INSERT);
4159
0
      else
4160
0
  picrel = bfinfdpic_relocs_info_for_local (bfinfdpic_relocs_info (info),
4161
0
             abfd, r_symndx,
4162
0
             rel->r_addend, NO_INSERT);
4163
4164
0
      if (! picrel)
4165
0
  return false;
4166
4167
0
      *changed = true;
4168
0
      dinfo = bfinfdpic_dynamic_got_plt_info (info);
4169
4170
0
      _bfinfdpic_count_relocs_fixups (picrel, dinfo, true);
4171
0
      if (ELF32_R_TYPE (rel->r_info) == R_BFIN_BYTE4_DATA)
4172
0
  picrel->relocs32--;
4173
0
      else /* we know (ELF32_R_TYPE (rel->r_info) == R_BFIN_FUNCDESC) */
4174
0
  picrel->relocsfd--;
4175
0
      _bfinfdpic_count_relocs_fixups (picrel, dinfo, false);
4176
0
    }
4177
4178
0
  return true;
4179
0
}
4180
4181
static bool
4182
bfinfdpic_elf_discard_info (bfd *ibfd,
4183
         struct elf_reloc_cookie *cookie ATTRIBUTE_UNUSED,
4184
         struct bfd_link_info *info)
4185
0
{
4186
0
  bool changed = false;
4187
0
  asection *s;
4188
0
  bfd *obfd = NULL;
4189
4190
  /* Account for relaxation of .eh_frame section.  */
4191
0
  for (s = ibfd->sections; s; s = s->next)
4192
0
    if (s->sec_info_type == SEC_INFO_TYPE_EH_FRAME)
4193
0
      {
4194
0
  if (!_bfinfdpic_check_discarded_relocs (ibfd, s, info, &changed))
4195
0
    return false;
4196
0
  obfd = s->output_section->owner;
4197
0
      }
4198
4199
0
  if (changed)
4200
0
    {
4201
0
      struct _bfinfdpic_dynamic_got_plt_info gpinfo;
4202
4203
0
      memset (&gpinfo, 0, sizeof (gpinfo));
4204
0
      memcpy (&gpinfo.g, bfinfdpic_dynamic_got_plt_info (info),
4205
0
        sizeof (gpinfo.g));
4206
4207
      /* Clear GOT and PLT assignments.  */
4208
0
      htab_traverse (bfinfdpic_relocs_info (info),
4209
0
         _bfinfdpic_reset_got_plt_entries,
4210
0
         NULL);
4211
4212
0
      if (!_bfinfdpic_size_got_plt (obfd, &gpinfo))
4213
0
  return false;
4214
0
    }
4215
4216
0
  return true;
4217
0
}
4218
4219
static bool
4220
elf32_bfinfdpic_finish_dynamic_sections (bfd *output_bfd,
4221
           struct bfd_link_info *info,
4222
           bfd_byte *buf ATTRIBUTE_UNUSED)
4223
0
{
4224
0
  bfd *dynobj;
4225
0
  asection *sdyn;
4226
4227
0
  dynobj = elf_hash_table (info)->dynobj;
4228
4229
0
  if (bfinfdpic_got_section (info))
4230
0
    {
4231
0
      BFD_ASSERT (bfinfdpic_gotrel_section (info)->size
4232
      /* PR 17334: It appears that the GOT section can end up
4233
         being bigger than the number of relocs.  Presumably
4234
         because some relocs have been deleted.  A test case has
4235
         yet to be generated for verify this, but in the meantime
4236
         the test below has been changed from == to >= so that
4237
         applications can continue to be built.  */
4238
0
      >= (bfinfdpic_gotrel_section (info)->reloc_count
4239
0
          * sizeof (Elf32_External_Rel)));
4240
4241
0
      if (bfinfdpic_gotfixup_section (info))
4242
0
  {
4243
0
    struct elf_link_hash_entry *hgot = elf_hash_table (info)->hgot;
4244
0
    bfd_vma got_value = hgot->root.u.def.value
4245
0
      + hgot->root.u.def.section->output_section->vma
4246
0
      + hgot->root.u.def.section->output_offset;
4247
4248
0
    _bfinfdpic_add_rofixup (output_bfd, bfinfdpic_gotfixup_section (info),
4249
0
         got_value, 0);
4250
4251
0
    if (bfinfdpic_gotfixup_section (info)->size
4252
0
        != (bfinfdpic_gotfixup_section (info)->reloc_count * 4))
4253
0
      {
4254
0
        _bfd_error_handler
4255
0
    ("LINKER BUG: .rofixup section size mismatch");
4256
0
        return false;
4257
0
      }
4258
0
  }
4259
0
    }
4260
0
  if (elf_hash_table (info)->dynamic_sections_created)
4261
0
    {
4262
0
      BFD_ASSERT (bfinfdpic_pltrel_section (info)->size
4263
0
      == (bfinfdpic_pltrel_section (info)->reloc_count
4264
0
          * sizeof (Elf32_External_Rel)));
4265
0
    }
4266
4267
0
  sdyn = bfd_get_linker_section (dynobj, ".dynamic");
4268
4269
0
  if (elf_hash_table (info)->dynamic_sections_created)
4270
0
    {
4271
0
      Elf32_External_Dyn * dyncon;
4272
0
      Elf32_External_Dyn * dynconend;
4273
4274
0
      BFD_ASSERT (sdyn != NULL);
4275
4276
0
      dyncon = (Elf32_External_Dyn *) sdyn->contents;
4277
0
      dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
4278
4279
0
      for (; dyncon < dynconend; dyncon++)
4280
0
  {
4281
0
    Elf_Internal_Dyn dyn;
4282
4283
0
    bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
4284
4285
0
    switch (dyn.d_tag)
4286
0
      {
4287
0
      default:
4288
0
        break;
4289
4290
0
      case DT_PLTGOT:
4291
0
        dyn.d_un.d_ptr = bfinfdpic_got_section (info)->output_section->vma
4292
0
    + bfinfdpic_got_section (info)->output_offset
4293
0
    + bfinfdpic_got_initial_offset (info);
4294
0
        bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
4295
0
        break;
4296
4297
0
      case DT_JMPREL:
4298
0
        dyn.d_un.d_ptr = bfinfdpic_pltrel_section (info)
4299
0
    ->output_section->vma
4300
0
    + bfinfdpic_pltrel_section (info)->output_offset;
4301
0
        bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
4302
0
        break;
4303
4304
0
      case DT_PLTRELSZ:
4305
0
        dyn.d_un.d_val = bfinfdpic_pltrel_section (info)->size;
4306
0
        bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
4307
0
        break;
4308
0
      }
4309
0
  }
4310
0
    }
4311
4312
0
  return true;
4313
0
}
4314
4315
/* Adjust a symbol defined by a dynamic object and referenced by a
4316
   regular object.  */
4317
4318
static bool
4319
elf32_bfinfdpic_adjust_dynamic_symbol (struct bfd_link_info *info,
4320
               struct elf_link_hash_entry *h)
4321
0
{
4322
0
  bfd * dynobj;
4323
4324
0
  dynobj = elf_hash_table (info)->dynobj;
4325
4326
  /* Make sure we know what is going on here.  */
4327
0
  BFD_ASSERT (dynobj != NULL
4328
0
        && (h->is_weakalias
4329
0
      || (h->def_dynamic
4330
0
          && h->ref_regular
4331
0
          && !h->def_regular)));
4332
4333
  /* If this is a weak symbol, and there is a real definition, the
4334
     processor independent code will have arranged for us to see the
4335
     real definition first, and we can just use the same value.  */
4336
0
  if (h->is_weakalias)
4337
0
    {
4338
0
      struct elf_link_hash_entry *def = weakdef (h);
4339
0
      BFD_ASSERT (def->root.type == bfd_link_hash_defined);
4340
0
      h->root.u.def.section = def->root.u.def.section;
4341
0
      h->root.u.def.value = def->root.u.def.value;
4342
0
    }
4343
4344
0
  return true;
4345
0
}
4346
4347
/* Perform any actions needed for dynamic symbols.  */
4348
4349
static bool
4350
elf32_bfinfdpic_finish_dynamic_symbol
4351
(bfd *output_bfd ATTRIBUTE_UNUSED,
4352
 struct bfd_link_info *info ATTRIBUTE_UNUSED,
4353
 struct elf_link_hash_entry *h ATTRIBUTE_UNUSED,
4354
 Elf_Internal_Sym *sym ATTRIBUTE_UNUSED)
4355
0
{
4356
0
  return true;
4357
0
}
4358
4359
/* Decide whether to attempt to turn absptr or lsda encodings in
4360
   shared libraries into pcrel within the given input section.  */
4361
4362
static bool
4363
bfinfdpic_elf_use_relative_eh_frame
4364
(bfd *input_bfd ATTRIBUTE_UNUSED,
4365
 struct bfd_link_info *info ATTRIBUTE_UNUSED,
4366
 asection *eh_frame_section ATTRIBUTE_UNUSED)
4367
0
{
4368
  /* We can't use PC-relative encodings in FDPIC binaries, in general.  */
4369
0
  return false;
4370
0
}
4371
4372
/* Adjust the contents of an eh_frame_hdr section before they're output.  */
4373
4374
static bfd_byte
4375
bfinfdpic_elf_encode_eh_address (bfd *abfd,
4376
        struct bfd_link_info *info,
4377
        asection *osec, bfd_vma offset,
4378
        asection *loc_sec, bfd_vma loc_offset,
4379
        bfd_vma *encoded)
4380
0
{
4381
0
  struct elf_link_hash_entry *h;
4382
4383
0
  h = elf_hash_table (info)->hgot;
4384
0
  BFD_ASSERT (h && h->root.type == bfd_link_hash_defined);
4385
4386
0
  if (! h || (_bfinfdpic_osec_to_segment (abfd, osec)
4387
0
        == _bfinfdpic_osec_to_segment (abfd, loc_sec->output_section)))
4388
0
    return _bfd_elf_encode_eh_address (abfd, info, osec, offset,
4389
0
               loc_sec, loc_offset, encoded);
4390
4391
0
  BFD_ASSERT (_bfinfdpic_osec_to_segment (abfd, osec)
4392
0
        == (_bfinfdpic_osec_to_segment
4393
0
      (abfd, h->root.u.def.section->output_section)));
4394
4395
0
  *encoded = osec->vma + offset
4396
0
    - (h->root.u.def.value
4397
0
       + h->root.u.def.section->output_section->vma
4398
0
       + h->root.u.def.section->output_offset);
4399
4400
0
  return DW_EH_PE_datarel | DW_EH_PE_sdata4;
4401
0
}
4402
4403
4404
4405
/* Look through the relocs for a section during the first phase.
4406
4407
   Besides handling virtual table relocs for gc, we have to deal with
4408
   all sorts of PIC-related relocations.  We describe below the
4409
   general plan on how to handle such relocations, even though we only
4410
   collect information at this point, storing them in hash tables for
4411
   perusal of later passes.
4412
4413
   32 relocations are propagated to the linker output when creating
4414
   position-independent output.  LO16 and HI16 relocations are not
4415
   supposed to be encountered in this case.
4416
4417
   LABEL16 should always be resolvable by the linker, since it's only
4418
   used by branches.
4419
4420
   LABEL24, on the other hand, is used by calls.  If it turns out that
4421
   the target of a call is a dynamic symbol, a PLT entry must be
4422
   created for it, which triggers the creation of a private function
4423
   descriptor and, unless lazy binding is disabled, a lazy PLT entry.
4424
4425
   GPREL relocations require the referenced symbol to be in the same
4426
   segment as _gp, but this can only be checked later.
4427
4428
   All GOT, GOTOFF and FUNCDESC relocations require a .got section to
4429
   exist.  LABEL24 might as well, since it may require a PLT entry,
4430
   that will require a got.
4431
4432
   Non-FUNCDESC GOT relocations require a GOT entry to be created
4433
   regardless of whether the symbol is dynamic.  However, since a
4434
   global symbol that turns out to not be exported may have the same
4435
   address of a non-dynamic symbol, we don't assign GOT entries at
4436
   this point, such that we can share them in this case.  A relocation
4437
   for the GOT entry always has to be created, be it to offset a
4438
   private symbol by the section load address, be it to get the symbol
4439
   resolved dynamically.
4440
4441
   FUNCDESC GOT relocations require a GOT entry to be created, and
4442
   handled as if a FUNCDESC relocation was applied to the GOT entry in
4443
   an object file.
4444
4445
   FUNCDESC relocations referencing a symbol that turns out to NOT be
4446
   dynamic cause a private function descriptor to be created.  The
4447
   FUNCDESC relocation then decays to a 32 relocation that points at
4448
   the private descriptor.  If the symbol is dynamic, the FUNCDESC
4449
   relocation is propagated to the linker output, such that the
4450
   dynamic linker creates the canonical descriptor, pointing to the
4451
   dynamically-resolved definition of the function.
4452
4453
   Non-FUNCDESC GOTOFF relocations must always refer to non-dynamic
4454
   symbols that are assigned to the same segment as the GOT, but we
4455
   can only check this later, after we know the complete set of
4456
   symbols defined and/or exported.
4457
4458
   FUNCDESC GOTOFF relocations require a function descriptor to be
4459
   created and, unless lazy binding is disabled or the symbol is not
4460
   dynamic, a lazy PLT entry.  Since we can't tell at this point
4461
   whether a symbol is going to be dynamic, we have to decide later
4462
   whether to create a lazy PLT entry or bind the descriptor directly
4463
   to the private function.
4464
4465
   FUNCDESC_VALUE relocations are not supposed to be present in object
4466
   files, but they may very well be simply propagated to the linker
4467
   output, since they have no side effect.
4468
4469
4470
   A function descriptor always requires a FUNCDESC_VALUE relocation.
4471
   Whether it's in .plt.rel or not depends on whether lazy binding is
4472
   enabled and on whether the referenced symbol is dynamic.
4473
4474
   The existence of a lazy PLT requires the resolverStub lazy PLT
4475
   entry to be present.
4476
4477
4478
   As for assignment of GOT, PLT and lazy PLT entries, and private
4479
   descriptors, we might do them all sequentially, but we can do
4480
   better than that.  For example, we can place GOT entries and
4481
   private function descriptors referenced using 12-bit operands
4482
   closer to the PIC register value, such that these relocations don't
4483
   overflow.  Those that are only referenced with LO16 relocations
4484
   could come next, but we may as well place PLT-required function
4485
   descriptors in the 12-bit range to make them shorter.  Symbols
4486
   referenced with LO16/HI16 may come next, but we may place
4487
   additional function descriptors in the 16-bit range if we can
4488
   reliably tell that we've already placed entries that are ever
4489
   referenced with only LO16.  PLT entries are therefore generated as
4490
   small as possible, while not introducing relocation overflows in
4491
   GOT or FUNCDESC_GOTOFF relocations.  Lazy PLT entries could be
4492
   generated before or after PLT entries, but not intermingled with
4493
   them, such that we can have more lazy PLT entries in range for a
4494
   branch to the resolverStub.  The resolverStub should be emitted at
4495
   the most distant location from the first lazy PLT entry such that
4496
   it's still in range for a branch, or closer, if there isn't a need
4497
   for so many lazy PLT entries.  Additional lazy PLT entries may be
4498
   emitted after the resolverStub, as long as branches are still in
4499
   range.  If the branch goes out of range, longer lazy PLT entries
4500
   are emitted.
4501
4502
   We could further optimize PLT and lazy PLT entries by giving them
4503
   priority in assignment to closer-to-gr17 locations depending on the
4504
   number of occurrences of references to them (assuming a function
4505
   that's called more often is more important for performance, so its
4506
   PLT entry should be faster), or taking hints from the compiler.
4507
   Given infinite time and money... :-)  */
4508
4509
static bool
4510
bfinfdpic_check_relocs (bfd *abfd, struct bfd_link_info *info,
4511
      asection *sec, const Elf_Internal_Rela *relocs)
4512
0
{
4513
0
  Elf_Internal_Shdr *symtab_hdr;
4514
0
  struct elf_link_hash_entry **sym_hashes;
4515
0
  const Elf_Internal_Rela *rel;
4516
0
  const Elf_Internal_Rela *rel_end;
4517
0
  bfd *dynobj;
4518
0
  struct bfinfdpic_relocs_info *picrel;
4519
4520
0
  if (bfd_link_relocatable (info))
4521
0
    return true;
4522
4523
0
  symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
4524
0
  sym_hashes = elf_sym_hashes (abfd);
4525
4526
0
  dynobj = elf_hash_table (info)->dynobj;
4527
0
  rel_end = relocs + sec->reloc_count;
4528
0
  for (rel = relocs; rel < rel_end; rel++)
4529
0
    {
4530
0
      struct elf_link_hash_entry *h;
4531
0
      unsigned long r_symndx;
4532
4533
0
      r_symndx = ELF32_R_SYM (rel->r_info);
4534
0
      if (r_symndx < symtab_hdr->sh_info)
4535
0
  h = NULL;
4536
0
      else
4537
0
  {
4538
0
    h = sym_hashes[r_symndx - symtab_hdr->sh_info];
4539
0
    while (h->root.type == bfd_link_hash_indirect
4540
0
     || h->root.type == bfd_link_hash_warning)
4541
0
      h = (struct elf_link_hash_entry *) h->root.u.i.link;
4542
0
  }
4543
4544
0
      switch (ELF32_R_TYPE (rel->r_info))
4545
0
  {
4546
0
  case R_BFIN_GOT17M4:
4547
0
  case R_BFIN_GOTHI:
4548
0
  case R_BFIN_GOTLO:
4549
0
  case R_BFIN_FUNCDESC_GOT17M4:
4550
0
  case R_BFIN_FUNCDESC_GOTHI:
4551
0
  case R_BFIN_FUNCDESC_GOTLO:
4552
0
  case R_BFIN_GOTOFF17M4:
4553
0
  case R_BFIN_GOTOFFHI:
4554
0
  case R_BFIN_GOTOFFLO:
4555
0
  case R_BFIN_FUNCDESC_GOTOFF17M4:
4556
0
  case R_BFIN_FUNCDESC_GOTOFFHI:
4557
0
  case R_BFIN_FUNCDESC_GOTOFFLO:
4558
0
  case R_BFIN_FUNCDESC:
4559
0
  case R_BFIN_FUNCDESC_VALUE:
4560
0
    if (! IS_FDPIC (abfd))
4561
0
      goto bad_reloc;
4562
    /* Fall through.  */
4563
0
  case R_BFIN_PCREL24:
4564
0
  case R_BFIN_PCREL24_JUMP_L:
4565
0
  case R_BFIN_BYTE4_DATA:
4566
0
    if (IS_FDPIC (abfd) && ! dynobj)
4567
0
      {
4568
0
        elf_hash_table (info)->dynobj = dynobj = abfd;
4569
0
        if (! _bfin_create_got_section (abfd, info))
4570
0
    return false;
4571
0
      }
4572
0
    if (! IS_FDPIC (abfd))
4573
0
      {
4574
0
        picrel = NULL;
4575
0
        break;
4576
0
      }
4577
0
    if (h != NULL)
4578
0
      {
4579
0
        if (h->dynindx == -1)
4580
0
    switch (ELF_ST_VISIBILITY (h->other))
4581
0
      {
4582
0
      case STV_INTERNAL:
4583
0
      case STV_HIDDEN:
4584
0
        break;
4585
0
      default:
4586
0
        bfd_elf_link_record_dynamic_symbol (info, h);
4587
0
        break;
4588
0
      }
4589
0
        picrel
4590
0
    = bfinfdpic_relocs_info_for_global (bfinfdpic_relocs_info (info),
4591
0
               abfd, h,
4592
0
               rel->r_addend, INSERT);
4593
0
      }
4594
0
    else
4595
0
      picrel = bfinfdpic_relocs_info_for_local (bfinfdpic_relocs_info
4596
0
                 (info), abfd, r_symndx,
4597
0
                 rel->r_addend, INSERT);
4598
0
    if (! picrel)
4599
0
      return false;
4600
0
    break;
4601
4602
0
  default:
4603
0
    picrel = NULL;
4604
0
    break;
4605
0
  }
4606
4607
0
      switch (ELF32_R_TYPE (rel->r_info))
4608
0
  {
4609
0
  case R_BFIN_PCREL24:
4610
0
  case R_BFIN_PCREL24_JUMP_L:
4611
0
    if (IS_FDPIC (abfd))
4612
0
      picrel->call++;
4613
0
    break;
4614
4615
0
  case R_BFIN_FUNCDESC_VALUE:
4616
0
    picrel->relocsfdv++;
4617
0
    if (bfd_section_flags (sec) & SEC_ALLOC)
4618
0
      picrel->relocs32--;
4619
    /* Fall through.  */
4620
4621
0
  case R_BFIN_BYTE4_DATA:
4622
0
    if (! IS_FDPIC (abfd))
4623
0
      break;
4624
4625
0
    picrel->sym++;
4626
0
    if (bfd_section_flags (sec) & SEC_ALLOC)
4627
0
      picrel->relocs32++;
4628
0
    break;
4629
4630
0
  case R_BFIN_GOT17M4:
4631
0
    picrel->got17m4++;
4632
0
    break;
4633
4634
0
  case R_BFIN_GOTHI:
4635
0
  case R_BFIN_GOTLO:
4636
0
    picrel->gothilo++;
4637
0
    break;
4638
4639
0
  case R_BFIN_FUNCDESC_GOT17M4:
4640
0
    picrel->fdgot17m4++;
4641
0
    break;
4642
4643
0
  case R_BFIN_FUNCDESC_GOTHI:
4644
0
  case R_BFIN_FUNCDESC_GOTLO:
4645
0
    picrel->fdgothilo++;
4646
0
    break;
4647
4648
0
  case R_BFIN_GOTOFF17M4:
4649
0
  case R_BFIN_GOTOFFHI:
4650
0
  case R_BFIN_GOTOFFLO:
4651
0
    picrel->gotoff++;
4652
0
    break;
4653
4654
0
  case R_BFIN_FUNCDESC_GOTOFF17M4:
4655
0
    picrel->fdgoff17m4++;
4656
0
    break;
4657
4658
0
  case R_BFIN_FUNCDESC_GOTOFFHI:
4659
0
  case R_BFIN_FUNCDESC_GOTOFFLO:
4660
0
    picrel->fdgoffhilo++;
4661
0
    break;
4662
4663
0
  case R_BFIN_FUNCDESC:
4664
0
    picrel->fd++;
4665
0
    picrel->relocsfd++;
4666
0
    break;
4667
4668
  /* This relocation describes the C++ object vtable hierarchy.
4669
     Reconstruct it for later use during GC.  */
4670
0
  case R_BFIN_GNU_VTINHERIT:
4671
0
    if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
4672
0
      return false;
4673
0
    break;
4674
4675
  /* This relocation describes which C++ vtable entries are actually
4676
     used.  Record for later use during GC.  */
4677
0
  case R_BFIN_GNU_VTENTRY:
4678
0
    BFD_ASSERT (h != NULL);
4679
0
    if (h != NULL
4680
0
        && !bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
4681
0
      return false;
4682
0
    break;
4683
4684
0
  case R_BFIN_HUIMM16:
4685
0
  case R_BFIN_LUIMM16:
4686
0
  case R_BFIN_PCREL12_JUMP_S:
4687
0
  case R_BFIN_PCREL10:
4688
0
    break;
4689
4690
0
  default:
4691
0
  bad_reloc:
4692
0
    _bfd_error_handler
4693
      /* xgettext:c-format */
4694
0
      (_("%pB: unsupported relocation type %#x"),
4695
0
       abfd, (int) ELF32_R_TYPE (rel->r_info));
4696
0
    return false;
4697
0
  }
4698
0
    }
4699
4700
0
  return true;
4701
0
}
4702
4703
/* Set the right machine number for a Blackfin ELF file.  */
4704
4705
static bool
4706
elf32_bfin_object_p (bfd *abfd)
4707
1.21k
{
4708
1.21k
  bfd_default_set_arch_mach (abfd, bfd_arch_bfin, 0);
4709
1.21k
  return (((elf_elfheader (abfd)->e_flags & EF_BFIN_FDPIC) != 0)
4710
1.21k
    == (IS_FDPIC (abfd)));
4711
1.21k
}
4712
4713
static bool
4714
elf32_bfin_set_private_flags (bfd * abfd, flagword flags)
4715
0
{
4716
0
  elf_elfheader (abfd)->e_flags = flags;
4717
0
  elf_flags_init (abfd) = true;
4718
0
  return true;
4719
0
}
4720
4721
/* Display the flags field.  */
4722
static bool
4723
elf32_bfin_print_private_bfd_data (bfd * abfd, void * ptr)
4724
575
{
4725
575
  FILE *file = (FILE *) ptr;
4726
575
  flagword flags;
4727
4728
575
  BFD_ASSERT (abfd != NULL && ptr != NULL);
4729
4730
  /* Print normal ELF private data.  */
4731
575
  _bfd_elf_print_private_bfd_data (abfd, ptr);
4732
4733
575
  flags = elf_elfheader (abfd)->e_flags;
4734
4735
  /* xgettext:c-format */
4736
575
  fprintf (file, _("private flags = %lx:"), elf_elfheader (abfd)->e_flags);
4737
4738
575
  if (flags & EF_BFIN_PIC)
4739
0
    fprintf (file, " -fpic");
4740
4741
575
  if (flags & EF_BFIN_FDPIC)
4742
0
    fprintf (file, " -mfdpic");
4743
4744
575
  fputc ('\n', file);
4745
4746
575
  return true;
4747
575
}
4748
4749
/* Merge backend specific data from an object file to the output
4750
   object file when linking.  */
4751
4752
static bool
4753
elf32_bfin_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
4754
0
{
4755
0
  bfd *obfd = info->output_bfd;
4756
0
  flagword old_flags, new_flags;
4757
0
  bool error = false;
4758
4759
  /* FIXME: What should be checked when linking shared libraries?  */
4760
0
  if ((ibfd->flags & DYNAMIC) != 0)
4761
0
    return true;
4762
4763
0
  if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour)
4764
0
    return true;
4765
4766
0
  new_flags = elf_elfheader (ibfd)->e_flags;
4767
0
  old_flags = elf_elfheader (obfd)->e_flags;
4768
4769
0
  if (new_flags & EF_BFIN_FDPIC)
4770
0
    new_flags &= ~EF_BFIN_PIC;
4771
4772
0
#ifndef DEBUG
4773
0
  if (0)
4774
0
#endif
4775
0
  _bfd_error_handler
4776
0
    ("old_flags = 0x%.8x, new_flags = 0x%.8x, init = %s, filename = %pB",
4777
0
     old_flags, new_flags, elf_flags_init (obfd) ? "yes" : "no", ibfd);
4778
4779
0
  if (!elf_flags_init (obfd))      /* First call, no flags set.  */
4780
0
    {
4781
0
      elf_flags_init (obfd) = true;
4782
0
      elf_elfheader (obfd)->e_flags = new_flags;
4783
0
    }
4784
4785
0
  if (((new_flags & EF_BFIN_FDPIC) == 0) != (! IS_FDPIC (obfd)))
4786
0
    {
4787
0
      error = true;
4788
0
      if (IS_FDPIC (obfd))
4789
0
  _bfd_error_handler
4790
0
    (_("%pB: cannot link non-fdpic object file into fdpic executable"),
4791
0
     ibfd);
4792
0
      else
4793
0
  _bfd_error_handler
4794
0
    (_("%pB: cannot link fdpic object file into non-fdpic executable"),
4795
0
     ibfd);
4796
0
    }
4797
4798
0
  if (error)
4799
0
    bfd_set_error (bfd_error_bad_value);
4800
4801
0
  return !error;
4802
0
}
4803

4804
/* bfin ELF linker hash entry.  */
4805
4806
struct bfin_link_hash_entry
4807
{
4808
  struct elf_link_hash_entry root;
4809
4810
  /* Number of PC relative relocs copied for this symbol.  */
4811
  struct bfin_pcrel_relocs_copied *pcrel_relocs_copied;
4812
};
4813
4814
0
#define bfin_hash_entry(ent) ((struct bfin_link_hash_entry *) (ent))
4815
4816
static struct bfd_hash_entry *
4817
bfin_link_hash_newfunc (struct bfd_hash_entry *entry,
4818
      struct bfd_hash_table *table, const char *string)
4819
0
{
4820
0
  struct bfd_hash_entry *ret = entry;
4821
4822
  /* Allocate the structure if it has not already been allocated by a
4823
     subclass.  */
4824
0
  if (ret == NULL)
4825
0
    ret = bfd_hash_allocate (table, sizeof (struct bfin_link_hash_entry));
4826
0
  if (ret == NULL)
4827
0
    return ret;
4828
4829
  /* Call the allocation method of the superclass.  */
4830
0
  ret = _bfd_elf_link_hash_newfunc (ret, table, string);
4831
0
  if (ret != NULL)
4832
0
    bfin_hash_entry (ret)->pcrel_relocs_copied = NULL;
4833
4834
0
  return ret;
4835
0
}
4836
4837
/* Create an bfin ELF linker hash table.  */
4838
4839
static struct bfd_link_hash_table *
4840
bfin_link_hash_table_create (bfd * abfd)
4841
0
{
4842
0
  struct elf_link_hash_table *ret;
4843
0
  size_t amt = sizeof (struct elf_link_hash_table);
4844
4845
0
  ret = bfd_zmalloc (amt);
4846
0
  if (ret == NULL)
4847
0
    return NULL;
4848
4849
0
  if (!_bfd_elf_link_hash_table_init (ret, abfd, bfin_link_hash_newfunc,
4850
0
              sizeof (struct elf_link_hash_entry)))
4851
0
    {
4852
0
      free (ret);
4853
0
      return NULL;
4854
0
    }
4855
4856
0
  return &ret->root;
4857
0
}
4858
4859
/* The size in bytes of an entry in the procedure linkage table.  */
4860
4861
/* Finish up the dynamic sections.  */
4862
4863
static bool
4864
bfin_finish_dynamic_sections (bfd * output_bfd ATTRIBUTE_UNUSED,
4865
            struct bfd_link_info *info,
4866
            bfd_byte *buf ATTRIBUTE_UNUSED)
4867
0
{
4868
0
  bfd *dynobj;
4869
0
  asection *sdyn;
4870
4871
0
  dynobj = elf_hash_table (info)->dynobj;
4872
4873
0
  sdyn = bfd_get_linker_section (dynobj, ".dynamic");
4874
4875
0
  if (elf_hash_table (info)->dynamic_sections_created)
4876
0
    {
4877
0
      Elf32_External_Dyn *dyncon, *dynconend;
4878
4879
0
      BFD_ASSERT (sdyn != NULL);
4880
4881
0
      dyncon = (Elf32_External_Dyn *) sdyn->contents;
4882
0
      dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
4883
0
      for (; dyncon < dynconend; dyncon++)
4884
0
  {
4885
0
    Elf_Internal_Dyn dyn;
4886
4887
0
    bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
4888
4889
0
  }
4890
4891
0
    }
4892
0
  return true;
4893
0
}
4894
4895
/* Finish up dynamic symbol handling.  We set the contents of various
4896
   dynamic sections here.  */
4897
4898
static bool
4899
bfin_finish_dynamic_symbol (bfd * output_bfd,
4900
          struct bfd_link_info *info,
4901
          struct elf_link_hash_entry *h,
4902
          Elf_Internal_Sym * sym)
4903
0
{
4904
0
  if (h->got.offset != (bfd_vma) - 1)
4905
0
    {
4906
0
      asection *sgot;
4907
0
      asection *srela;
4908
0
      Elf_Internal_Rela rela;
4909
0
      bfd_byte *loc;
4910
4911
      /* This symbol has an entry in the global offset table.
4912
   Set it up.  */
4913
4914
0
      sgot = elf_hash_table (info)->sgot;
4915
0
      srela = elf_hash_table (info)->srelgot;
4916
0
      BFD_ASSERT (sgot != NULL && srela != NULL);
4917
4918
0
      rela.r_offset = (sgot->output_section->vma
4919
0
           + sgot->output_offset
4920
0
           + (h->got.offset & ~(bfd_vma) 1));
4921
4922
      /* If this is a -Bsymbolic link, and the symbol is defined
4923
   locally, we just want to emit a RELATIVE reloc.  Likewise if
4924
   the symbol was forced to be local because of a version file.
4925
   The entry in the global offset table will already have been
4926
   initialized in the relocate_section function.  */
4927
0
      if (bfd_link_pic (info)
4928
0
    && (info->symbolic
4929
0
        || h->dynindx == -1 || h->forced_local) && h->def_regular)
4930
0
  {
4931
0
    _bfd_error_handler (_("*** check this relocation %s"), __func__);
4932
0
    rela.r_info = ELF32_R_INFO (0, R_BFIN_PCREL24);
4933
0
    rela.r_addend = bfd_get_signed_32 (output_bfd,
4934
0
               (sgot->contents
4935
0
                +
4936
0
                (h->got.
4937
0
                 offset & ~(bfd_vma) 1)));
4938
0
  }
4939
0
      else
4940
0
  {
4941
0
    bfd_put_32 (output_bfd, (bfd_vma) 0,
4942
0
          sgot->contents + (h->got.offset & ~(bfd_vma) 1));
4943
0
    rela.r_info = ELF32_R_INFO (h->dynindx, R_BFIN_GOT);
4944
0
    rela.r_addend = 0;
4945
0
  }
4946
4947
0
      loc = srela->contents;
4948
0
      loc += srela->reloc_count++ * sizeof (Elf32_External_Rela);
4949
0
      bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
4950
0
    }
4951
4952
0
  if (h->needs_copy)
4953
0
    {
4954
0
      BFD_ASSERT (0);
4955
0
    }
4956
  /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute.  */
4957
0
  if (strcmp (h->root.root.string, "__DYNAMIC") == 0
4958
0
      || h == elf_hash_table (info)->hgot)
4959
0
    sym->st_shndx = SHN_ABS;
4960
4961
0
  return true;
4962
0
}
4963
4964
/* Adjust a symbol defined by a dynamic object and referenced by a
4965
   regular object.  The current definition is in some section of the
4966
   dynamic object, but we're not including those sections.  We have to
4967
   change the definition to something the rest of the link can
4968
   understand.  */
4969
4970
static bool
4971
bfin_adjust_dynamic_symbol (struct bfd_link_info *info,
4972
          struct elf_link_hash_entry *h)
4973
0
{
4974
0
  bfd *dynobj;
4975
0
  asection *s;
4976
0
  unsigned int power_of_two;
4977
4978
0
  dynobj = elf_hash_table (info)->dynobj;
4979
4980
  /* Make sure we know what is going on here.  */
4981
0
  BFD_ASSERT (dynobj != NULL
4982
0
        && (h->needs_plt
4983
0
      || h->is_weakalias
4984
0
      || (h->def_dynamic && h->ref_regular && !h->def_regular)));
4985
4986
  /* If this is a function, put it in the procedure linkage table.  We
4987
     will fill in the contents of the procedure linkage table later,
4988
     when we know the address of the .got section.  */
4989
0
  if (h->type == STT_FUNC || h->needs_plt)
4990
0
    {
4991
0
      BFD_ASSERT(0);
4992
0
    }
4993
4994
  /* If this is a weak symbol, and there is a real definition, the
4995
     processor independent code will have arranged for us to see the
4996
     real definition first, and we can just use the same value.  */
4997
0
  if (h->is_weakalias)
4998
0
    {
4999
0
      struct elf_link_hash_entry *def = weakdef (h);
5000
0
      BFD_ASSERT (def->root.type == bfd_link_hash_defined);
5001
0
      h->root.u.def.section = def->root.u.def.section;
5002
0
      h->root.u.def.value = def->root.u.def.value;
5003
0
      return true;
5004
0
    }
5005
5006
  /* This is a reference to a symbol defined by a dynamic object which
5007
     is not a function.  */
5008
5009
  /* If we are creating a shared library, we must presume that the
5010
     only references to the symbol are via the global offset table.
5011
     For such cases we need not do anything here; the relocations will
5012
     be handled correctly by relocate_section.  */
5013
0
  if (bfd_link_pic (info))
5014
0
    return true;
5015
5016
  /* We must allocate the symbol in our .dynbss section, which will
5017
     become part of the .bss section of the executable.  There will be
5018
     an entry for this symbol in the .dynsym section.  The dynamic
5019
     object will contain position independent code, so all references
5020
     from the dynamic object to this symbol will go through the global
5021
     offset table.  The dynamic linker will use the .dynsym entry to
5022
     determine the address it must put in the global offset table, so
5023
     both the dynamic object and the regular object will refer to the
5024
     same memory location for the variable.  */
5025
5026
0
  s = bfd_get_linker_section (dynobj, ".dynbss");
5027
0
  BFD_ASSERT (s != NULL);
5028
5029
#if 0 /* Bfin does not currently have a COPY reloc.  */
5030
  /* We must generate a R_BFIN_COPY reloc to tell the dynamic linker to
5031
     copy the initial value out of the dynamic object and into the
5032
     runtime process image.  We need to remember the offset into the
5033
     .rela.bss section we are going to use.  */
5034
  if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
5035
    {
5036
      asection *srel;
5037
5038
      srel = bfd_get_linker_section (dynobj, ".rela.bss");
5039
      BFD_ASSERT (srel != NULL);
5040
      srel->size += sizeof (Elf32_External_Rela);
5041
      h->needs_copy = 1;
5042
    }
5043
#else
5044
0
  if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
5045
0
    {
5046
0
      _bfd_error_handler (_("the bfin target does not currently support the generation of copy relocations"));
5047
0
      return false;
5048
0
    }
5049
0
#endif
5050
  /* We need to figure out the alignment required for this symbol.  I
5051
     have no idea how ELF linkers handle this.  */
5052
0
  power_of_two = bfd_log2 (h->size);
5053
0
  if (power_of_two > 3)
5054
0
    power_of_two = 3;
5055
5056
  /* Apply the required alignment.  */
5057
0
  s->size = BFD_ALIGN (s->size, (bfd_size_type) (1 << power_of_two));
5058
0
  if (!bfd_link_align_section (s, power_of_two))
5059
0
    return false;
5060
5061
  /* Define the symbol as being at this point in the section.  */
5062
0
  h->root.u.def.section = s;
5063
0
  h->root.u.def.value = s->size;
5064
5065
  /* Increment the section size to make room for the symbol.  */
5066
0
  s->size += h->size;
5067
5068
0
  return true;
5069
0
}
5070
5071
/* The bfin linker needs to keep track of the number of relocs that it
5072
   decides to copy in check_relocs for each symbol.  This is so that it
5073
   can discard PC relative relocs if it doesn't need them when linking
5074
   with -Bsymbolic.  We store the information in a field extending the
5075
   regular ELF linker hash table.  */
5076
5077
/* This structure keeps track of the number of PC relative relocs we have
5078
   copied for a given symbol.  */
5079
5080
struct bfin_pcrel_relocs_copied
5081
{
5082
  /* Next section.  */
5083
  struct bfin_pcrel_relocs_copied *next;
5084
  /* A section in dynobj.  */
5085
  asection *section;
5086
  /* Number of relocs copied in this section.  */
5087
  bfd_size_type count;
5088
};
5089
5090
/* This function is called via elf_link_hash_traverse if we are
5091
   creating a shared object.  In the -Bsymbolic case it discards the
5092
   space allocated to copy PC relative relocs against symbols which
5093
   are defined in regular objects.  For the normal shared case, it
5094
   discards space for pc-relative relocs that have become local due to
5095
   symbol visibility changes.  We allocated space for them in the
5096
   check_relocs routine, but we won't fill them in in the
5097
   relocate_section routine.
5098
5099
   We also check whether any of the remaining relocations apply
5100
   against a readonly section, and set the DF_TEXTREL flag in this
5101
   case.  */
5102
5103
static bool
5104
bfin_discard_copies (struct elf_link_hash_entry *h, void * inf)
5105
0
{
5106
0
  struct bfd_link_info *info = (struct bfd_link_info *) inf;
5107
0
  struct bfin_pcrel_relocs_copied *s;
5108
5109
0
  if (!h->def_regular || (!info->symbolic && !h->forced_local))
5110
0
    {
5111
0
      if ((info->flags & DF_TEXTREL) == 0)
5112
0
  {
5113
    /* Look for relocations against read-only sections.  */
5114
0
    for (s = bfin_hash_entry (h)->pcrel_relocs_copied;
5115
0
         s != NULL; s = s->next)
5116
0
      if ((s->section->flags & SEC_READONLY) != 0)
5117
0
        {
5118
0
    info->flags |= DF_TEXTREL;
5119
0
    break;
5120
0
        }
5121
0
  }
5122
5123
0
      return true;
5124
0
    }
5125
5126
0
  for (s = bfin_hash_entry (h)->pcrel_relocs_copied;
5127
0
       s != NULL; s = s->next)
5128
0
    s->section->size -= s->count * sizeof (Elf32_External_Rela);
5129
5130
0
  return true;
5131
0
}
5132
5133
static bool
5134
bfin_late_size_sections (bfd * output_bfd ATTRIBUTE_UNUSED,
5135
       struct bfd_link_info *info)
5136
0
{
5137
0
  bfd *dynobj;
5138
0
  asection *s;
5139
0
  bool relocs;
5140
5141
0
  dynobj = elf_hash_table (info)->dynobj;
5142
0
  if (dynobj == NULL)
5143
0
    return true;
5144
5145
0
  if (elf_hash_table (info)->dynamic_sections_created)
5146
0
    {
5147
      /* Set the contents of the .interp section to the interpreter.  */
5148
0
      if (bfd_link_executable (info) && !info->nointerp)
5149
0
  {
5150
0
    s = elf_hash_table (info)->interp;
5151
0
    BFD_ASSERT (s != NULL);
5152
0
    s->size = sizeof ELF_DYNAMIC_INTERPRETER;
5153
0
    s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
5154
0
    s->alloced = 1;
5155
0
  }
5156
0
    }
5157
0
  else
5158
0
    {
5159
      /* We may have created entries in the .rela.got section.
5160
   However, if we are not creating the dynamic sections, we will
5161
   not actually use these entries.  Reset the size of .rela.got,
5162
   which will cause it to get stripped from the output file
5163
   below.  */
5164
0
      s = elf_hash_table (info)->srelgot;
5165
0
      if (s != NULL)
5166
0
  s->size = 0;
5167
0
    }
5168
5169
  /* If this is a -Bsymbolic shared link, then we need to discard all
5170
     PC relative relocs against symbols defined in a regular object.
5171
     For the normal shared case we discard the PC relative relocs
5172
     against symbols that have become local due to visibility changes.
5173
     We allocated space for them in the check_relocs routine, but we
5174
     will not fill them in in the relocate_section routine.  */
5175
0
  if (bfd_link_pic (info))
5176
0
    elf_link_hash_traverse (elf_hash_table (info),
5177
0
          bfin_discard_copies, info);
5178
5179
  /* The check_relocs and adjust_dynamic_symbol entry points have
5180
     determined the sizes of the various dynamic sections.  Allocate
5181
     memory for them.  */
5182
0
  relocs = false;
5183
0
  for (s = dynobj->sections; s != NULL; s = s->next)
5184
0
    {
5185
0
      const char *name;
5186
0
      bool strip;
5187
5188
0
      if ((s->flags & SEC_LINKER_CREATED) == 0)
5189
0
  continue;
5190
5191
      /* It's OK to base decisions on the section name, because none
5192
   of the dynobj section names depend upon the input files.  */
5193
0
      name = bfd_section_name (s);
5194
5195
0
      strip = false;
5196
5197
0
       if (startswith (name, ".rela"))
5198
0
  {
5199
0
    if (s->size == 0)
5200
0
      {
5201
        /* If we don't need this section, strip it from the
5202
     output file.  This is mostly to handle .rela.bss and
5203
     .rela.plt.  We must create both sections in
5204
     create_dynamic_sections, because they must be created
5205
     before the linker maps input sections to output
5206
     sections.  The linker does that before
5207
     adjust_dynamic_symbol is called, and it is that
5208
     function which decides whether anything needs to go
5209
     into these sections.  */
5210
0
        strip = true;
5211
0
      }
5212
0
    else
5213
0
      {
5214
0
        relocs = true;
5215
5216
        /* We use the reloc_count field as a counter if we need
5217
     to copy relocs into the output file.  */
5218
0
        s->reloc_count = 0;
5219
0
      }
5220
0
  }
5221
0
      else if (! startswith (name, ".got"))
5222
0
  {
5223
    /* It's not one of our sections, so don't allocate space.  */
5224
0
    continue;
5225
0
  }
5226
5227
0
      if (strip)
5228
0
  {
5229
0
    s->flags |= SEC_EXCLUDE;
5230
0
    continue;
5231
0
  }
5232
5233
      /* Allocate memory for the section contents.  */
5234
      /* FIXME: This should be a call to bfd_alloc not bfd_zalloc.
5235
   Unused entries should be reclaimed before the section's contents
5236
   are written out, but at the moment this does not happen.  Thus in
5237
   order to prevent writing out garbage, we initialise the section's
5238
   contents to zero.  */
5239
0
      s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->size);
5240
0
      if (s->contents == NULL && s->size != 0)
5241
0
  return false;
5242
0
      s->alloced = 1;
5243
0
    }
5244
5245
0
  if (elf_hash_table (info)->dynamic_sections_created)
5246
0
    {
5247
      /* Add some entries to the .dynamic section.  We fill in the
5248
   values later, in bfin_finish_dynamic_sections, but we
5249
   must add the entries now so that we get the correct size for
5250
   the .dynamic section.  The DT_DEBUG entry is filled in by the
5251
   dynamic linker and used by the debugger.  */
5252
0
#define add_dynamic_entry(TAG, VAL) \
5253
0
  _bfd_elf_add_dynamic_entry (info, TAG, VAL)
5254
5255
0
      if (!bfd_link_pic (info))
5256
0
  {
5257
0
    if (!add_dynamic_entry (DT_DEBUG, 0))
5258
0
      return false;
5259
0
  }
5260
5261
5262
0
      if (relocs)
5263
0
  {
5264
0
    if (!add_dynamic_entry (DT_RELA, 0)
5265
0
        || !add_dynamic_entry (DT_RELASZ, 0)
5266
0
        || !add_dynamic_entry (DT_RELAENT,
5267
0
             sizeof (Elf32_External_Rela)))
5268
0
      return false;
5269
0
  }
5270
5271
0
      if ((info->flags & DF_TEXTREL) != 0)
5272
0
  {
5273
0
    if (!add_dynamic_entry (DT_TEXTREL, 0))
5274
0
      return false;
5275
0
  }
5276
0
    }
5277
0
#undef add_dynamic_entry
5278
5279
0
  return true;
5280
0
}
5281

5282
/* Given a .data section and a .emreloc in-memory section, store
5283
   relocation information into the .emreloc section which can be
5284
   used at runtime to relocate the section.  This is called by the
5285
   linker when the --embedded-relocs switch is used.  This is called
5286
   after the add_symbols entry point has been called for all the
5287
   objects, and before the final_link entry point is called.  */
5288
5289
bool
5290
bfd_bfin_elf32_create_embedded_relocs (bfd *abfd,
5291
               struct bfd_link_info *info,
5292
               asection *datasec,
5293
               asection *relsec,
5294
               char **errmsg)
5295
0
{
5296
0
  Elf_Internal_Shdr *symtab_hdr;
5297
0
  Elf_Internal_Sym *isymbuf = NULL;
5298
0
  Elf_Internal_Rela *internal_relocs = NULL;
5299
0
  Elf_Internal_Rela *irel, *irelend;
5300
0
  bfd_byte *p;
5301
0
  bfd_size_type amt;
5302
5303
0
  BFD_ASSERT (! bfd_link_relocatable (info));
5304
5305
0
  *errmsg = NULL;
5306
5307
0
  if (datasec->reloc_count == 0)
5308
0
    return true;
5309
5310
0
  symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
5311
5312
  /* Get a copy of the native relocations.  */
5313
0
  internal_relocs = (_bfd_elf_link_read_relocs
5314
0
         (abfd, datasec, NULL, (Elf_Internal_Rela *) NULL,
5315
0
          info->keep_memory));
5316
0
  if (internal_relocs == NULL)
5317
0
    goto error_return;
5318
5319
0
  amt = (bfd_size_type) datasec->reloc_count * 12;
5320
0
  relsec->contents = (bfd_byte *) bfd_alloc (abfd, amt);
5321
0
  if (relsec->contents == NULL)
5322
0
    goto error_return;
5323
0
  relsec->alloced = 1;
5324
5325
0
  p = relsec->contents;
5326
5327
0
  irelend = internal_relocs + datasec->reloc_count;
5328
0
  for (irel = internal_relocs; irel < irelend; irel++, p += 12)
5329
0
    {
5330
0
      asection *targetsec;
5331
5332
      /* We are going to write a four byte longword into the runtime
5333
       reloc section.  The longword will be the address in the data
5334
       section which must be relocated.  It is followed by the name
5335
       of the target section NUL-padded or truncated to 8
5336
       characters.  */
5337
5338
      /* We can only relocate absolute longword relocs at run time.  */
5339
0
      if (ELF32_R_TYPE (irel->r_info) != (int) R_BFIN_BYTE4_DATA)
5340
0
  {
5341
0
    *errmsg = _("unsupported relocation type");
5342
0
    bfd_set_error (bfd_error_bad_value);
5343
0
    goto error_return;
5344
0
  }
5345
5346
      /* Get the target section referred to by the reloc.  */
5347
0
      if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
5348
0
  {
5349
    /* A local symbol.  */
5350
0
    Elf_Internal_Sym *isym;
5351
5352
    /* Read this BFD's local symbols if we haven't done so already.  */
5353
0
    if (isymbuf == NULL)
5354
0
      {
5355
0
        isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
5356
0
        if (isymbuf == NULL)
5357
0
    isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
5358
0
            symtab_hdr->sh_info, 0,
5359
0
            NULL, NULL, NULL);
5360
0
        if (isymbuf == NULL)
5361
0
    goto error_return;
5362
0
      }
5363
5364
0
    isym = isymbuf + ELF32_R_SYM (irel->r_info);
5365
0
    targetsec = bfd_section_from_elf_index (abfd, isym->st_shndx);
5366
0
  }
5367
0
      else
5368
0
  {
5369
0
    unsigned long indx;
5370
0
    struct elf_link_hash_entry *h;
5371
5372
    /* An external symbol.  */
5373
0
    indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
5374
0
    h = elf_sym_hashes (abfd)[indx];
5375
0
    BFD_ASSERT (h != NULL);
5376
0
    if (h->root.type == bfd_link_hash_defined
5377
0
        || h->root.type == bfd_link_hash_defweak)
5378
0
      targetsec = h->root.u.def.section;
5379
0
    else
5380
0
      targetsec = NULL;
5381
0
  }
5382
5383
0
      bfd_put_32 (abfd, irel->r_offset + datasec->output_offset, p);
5384
0
      memset (p + 4, 0, 8);
5385
0
      if (targetsec != NULL)
5386
0
  strncpy ((char *) p + 4, targetsec->output_section->name, 8);
5387
0
    }
5388
5389
0
  if (symtab_hdr->contents != (unsigned char *) isymbuf)
5390
0
    free (isymbuf);
5391
0
  if (elf_section_data (datasec)->relocs != internal_relocs)
5392
0
    free (internal_relocs);
5393
0
  return true;
5394
5395
0
 error_return:
5396
0
  if (symtab_hdr->contents != (unsigned char *) isymbuf)
5397
0
    free (isymbuf);
5398
0
  if (elf_section_data (datasec)->relocs != internal_relocs)
5399
0
    free (internal_relocs);
5400
  return false;
5401
0
}
5402
5403
struct bfd_elf_special_section const elf32_bfin_special_sections[] =
5404
{
5405
  { ".l1.text",   8, -2, SHT_PROGBITS, SHF_ALLOC + SHF_EXECINSTR },
5406
  { ".l1.data",   8, -2, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
5407
  { NULL,   0,  0, 0,      0 }
5408
};
5409
5410

5411
#define TARGET_LITTLE_SYM   bfin_elf32_vec
5412
#define TARGET_LITTLE_NAME    "elf32-bfin"
5413
#define ELF_ARCH      bfd_arch_bfin
5414
#define ELF_TARGET_ID     BFIN_ELF_DATA
5415
#define ELF_MACHINE_CODE    EM_BLACKFIN
5416
#define ELF_MAXPAGESIZE     0x1000
5417
#define elf_symbol_leading_char   '_'
5418
5419
#define bfd_elf32_bfd_reloc_type_lookup bfin_bfd_reloc_type_lookup
5420
#define bfd_elf32_bfd_reloc_name_lookup \
5421
          bfin_bfd_reloc_name_lookup
5422
#define elf_info_to_howto   bfin_info_to_howto
5423
#define elf_info_to_howto_rel   NULL
5424
#define elf_backend_object_p    elf32_bfin_object_p
5425
5426
#define bfd_elf32_bfd_is_local_label_name \
5427
          bfin_is_local_label_name
5428
5429
#define elf_backend_create_dynamic_sections \
5430
          _bfd_elf_create_dynamic_sections
5431
#define bfd_elf32_bfd_link_hash_table_create \
5432
          bfin_link_hash_table_create
5433
#define bfd_elf32_bfd_final_link  _bfd_elf_gc_common_final_link
5434
5435
#define elf_backend_check_relocs  bfin_check_relocs
5436
#define elf_backend_adjust_dynamic_symbol \
5437
          bfin_adjust_dynamic_symbol
5438
#define elf_backend_late_size_sections  bfin_late_size_sections
5439
#define elf_backend_relocate_section  bfin_relocate_section
5440
#define elf_backend_finish_dynamic_symbol \
5441
          bfin_finish_dynamic_symbol
5442
#define elf_backend_finish_dynamic_sections \
5443
          bfin_finish_dynamic_sections
5444
#define elf_backend_gc_mark_hook  bfin_gc_mark_hook
5445
#define bfd_elf32_bfd_merge_private_bfd_data \
5446
          elf32_bfin_merge_private_bfd_data
5447
#define bfd_elf32_bfd_set_private_flags \
5448
          elf32_bfin_set_private_flags
5449
#define bfd_elf32_bfd_print_private_bfd_data \
5450
          elf32_bfin_print_private_bfd_data
5451
#define elf_backend_final_write_processing \
5452
          elf32_bfin_final_write_processing
5453
#define elf_backend_reloc_type_class  elf32_bfin_reloc_type_class
5454
#define elf_backend_stack_align   8
5455
#define elf_backend_can_gc_sections 1
5456
#define elf_backend_special_sections  elf32_bfin_special_sections
5457
#define elf_backend_can_refcount 1
5458
#define elf_backend_want_got_plt 0
5459
#define elf_backend_plt_readonly 1
5460
#define elf_backend_want_plt_sym 0
5461
#define elf_backend_got_header_size 12
5462
#define elf_backend_rela_normal   1
5463
5464
#include "elf32-target.h"
5465
5466
#undef TARGET_LITTLE_SYM
5467
#define TARGET_LITTLE_SYM   bfin_elf32_fdpic_vec
5468
#undef TARGET_LITTLE_NAME
5469
#define TARGET_LITTLE_NAME    "elf32-bfinfdpic"
5470
#undef  elf32_bed
5471
#define elf32_bed     elf32_bfinfdpic_bed
5472
5473
#undef elf_backend_got_header_size
5474
#define elf_backend_got_header_size 0
5475
5476
#undef elf_backend_relocate_section
5477
#define elf_backend_relocate_section  bfinfdpic_relocate_section
5478
#undef elf_backend_check_relocs
5479
#define elf_backend_check_relocs  bfinfdpic_check_relocs
5480
5481
#undef bfd_elf32_bfd_link_hash_table_create
5482
#define bfd_elf32_bfd_link_hash_table_create \
5483
    bfinfdpic_elf_link_hash_table_create
5484
#undef elf_backend_early_size_sections
5485
#define elf_backend_early_size_sections \
5486
    elf32_bfinfdpic_early_size_sections
5487
5488
#undef elf_backend_create_dynamic_sections
5489
#define elf_backend_create_dynamic_sections \
5490
    elf32_bfinfdpic_create_dynamic_sections
5491
#undef elf_backend_adjust_dynamic_symbol
5492
#define elf_backend_adjust_dynamic_symbol \
5493
    elf32_bfinfdpic_adjust_dynamic_symbol
5494
#undef elf_backend_late_size_sections
5495
#define elf_backend_late_size_sections \
5496
    elf32_bfinfdpic_late_size_sections
5497
#undef elf_backend_finish_dynamic_symbol
5498
#define elf_backend_finish_dynamic_symbol \
5499
    elf32_bfinfdpic_finish_dynamic_symbol
5500
#undef elf_backend_finish_dynamic_sections
5501
#define elf_backend_finish_dynamic_sections \
5502
    elf32_bfinfdpic_finish_dynamic_sections
5503
5504
#undef elf_backend_discard_info
5505
#define elf_backend_discard_info \
5506
    bfinfdpic_elf_discard_info
5507
#undef elf_backend_can_make_relative_eh_frame
5508
#define elf_backend_can_make_relative_eh_frame \
5509
    bfinfdpic_elf_use_relative_eh_frame
5510
#undef elf_backend_can_make_lsda_relative_eh_frame
5511
#define elf_backend_can_make_lsda_relative_eh_frame \
5512
    bfinfdpic_elf_use_relative_eh_frame
5513
#undef elf_backend_encode_eh_address
5514
#define elf_backend_encode_eh_address \
5515
    bfinfdpic_elf_encode_eh_address
5516
5517
#undef elf_backend_may_use_rel_p
5518
#define elf_backend_may_use_rel_p 1
5519
#undef elf_backend_may_use_rela_p
5520
#define elf_backend_may_use_rela_p  1
5521
/* We use REL for dynamic relocations only.  */
5522
#undef elf_backend_default_use_rela_p
5523
#define elf_backend_default_use_rela_p  1
5524
5525
#undef elf_backend_omit_section_dynsym
5526
#define elf_backend_omit_section_dynsym _bfinfdpic_link_omit_section_dynsym
5527
5528
#include "elf32-target.h"