OpenCores
URL https://opencores.org/ocsvn/scarts/scarts/trunk

Subversion Repositories scarts

[/] [scarts/] [trunk/] [toolchain/] [scarts-binutils/] [binutils-2.19.1/] [bfd/] [elf32-bfin.c] - Blame information for rev 6

Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.