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