* elf32-m68k.c (rtype_to_howto): If the reloc index is out of
[external/binutils.git] / bfd / elf32-bfin.c
1 /* ADI Blackfin BFD support for 32-bit ELF.
2    Copyright 2005, 2006, 2007, 2008, 2009 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                                            ".rela.bss",
3563                                            flags | SEC_READONLY);
3564           if (s == NULL
3565               || ! bfd_set_section_alignment (abfd, s, bed->s->log_file_align))
3566             return FALSE;
3567         }
3568     }
3569
3570   return TRUE;
3571 }
3572
3573 /* Compute the total GOT size required by each symbol in each range.
3574    Symbols may require up to 4 words in the GOT: an entry pointing to
3575    the symbol, an entry pointing to its function descriptor, and a
3576    private function descriptors taking two words.  */
3577
3578 static void
3579 _bfinfdpic_count_nontls_entries (struct bfinfdpic_relocs_info *entry,
3580                                  struct _bfinfdpic_dynamic_got_info *dinfo)
3581 {
3582   /* Allocate space for a GOT entry pointing to the symbol.  */
3583   if (entry->got17m4)
3584     dinfo->got17m4 += 4;
3585   else if (entry->gothilo)
3586     dinfo->gothilo += 4;
3587   else
3588     entry->relocs32--;
3589   entry->relocs32++;
3590
3591   /* Allocate space for a GOT entry pointing to the function
3592      descriptor.  */
3593   if (entry->fdgot17m4)
3594     dinfo->got17m4 += 4;
3595   else if (entry->fdgothilo)
3596     dinfo->gothilo += 4;
3597   else
3598     entry->relocsfd--;
3599   entry->relocsfd++;
3600
3601   /* Decide whether we need a PLT entry, a function descriptor in the
3602      GOT, and a lazy PLT entry for this symbol.  */
3603   entry->plt = entry->call
3604     && entry->symndx == -1 && ! BFINFDPIC_SYM_LOCAL (dinfo->info, entry->d.h)
3605     && elf_hash_table (dinfo->info)->dynamic_sections_created;
3606   entry->privfd = entry->plt
3607     || entry->fdgoff17m4 || entry->fdgoffhilo
3608     || ((entry->fd || entry->fdgot17m4 || entry->fdgothilo)
3609         && (entry->symndx != -1
3610             || BFINFDPIC_FUNCDESC_LOCAL (dinfo->info, entry->d.h)));
3611   entry->lazyplt = entry->privfd
3612     && entry->symndx == -1 && ! BFINFDPIC_SYM_LOCAL (dinfo->info, entry->d.h)
3613     && ! (dinfo->info->flags & DF_BIND_NOW)
3614     && elf_hash_table (dinfo->info)->dynamic_sections_created;
3615
3616   /* Allocate space for a function descriptor.  */
3617   if (entry->fdgoff17m4)
3618     dinfo->fd17m4 += 8;
3619   else if (entry->privfd && entry->plt)
3620     dinfo->fdplt += 8;
3621   else if (entry->privfd)
3622     dinfo->fdhilo += 8;
3623   else
3624     entry->relocsfdv--;
3625   entry->relocsfdv++;
3626
3627   if (entry->lazyplt)
3628     dinfo->lzplt += LZPLT_NORMAL_SIZE;
3629 }
3630
3631 /* Compute the number of dynamic relocations and fixups that a symbol
3632    requires, and add (or subtract) from the grand and per-symbol
3633    totals.  */
3634
3635 static void
3636 _bfinfdpic_count_relocs_fixups (struct bfinfdpic_relocs_info *entry,
3637                                 struct _bfinfdpic_dynamic_got_info *dinfo,
3638                                 bfd_boolean subtract)
3639 {
3640   bfd_vma relocs = 0, fixups = 0;
3641
3642   if (!dinfo->info->executable || dinfo->info->pie)
3643     relocs = entry->relocs32 + entry->relocsfd + entry->relocsfdv;
3644   else
3645     {
3646       if (entry->symndx != -1 || BFINFDPIC_SYM_LOCAL (dinfo->info, entry->d.h))
3647         {
3648           if (entry->symndx != -1
3649               || entry->d.h->root.type != bfd_link_hash_undefweak)
3650             fixups += entry->relocs32 + 2 * entry->relocsfdv;
3651         }
3652       else
3653         relocs += entry->relocs32 + entry->relocsfdv;
3654
3655       if (entry->symndx != -1
3656           || BFINFDPIC_FUNCDESC_LOCAL (dinfo->info, entry->d.h))
3657         {
3658           if (entry->symndx != -1
3659               || entry->d.h->root.type != bfd_link_hash_undefweak)
3660             fixups += entry->relocsfd;
3661         }
3662       else
3663         relocs += entry->relocsfd;
3664     }
3665
3666   if (subtract)
3667     {
3668       relocs = - relocs;
3669       fixups = - fixups;
3670     }
3671
3672   entry->dynrelocs += relocs;
3673   entry->fixups += fixups;
3674   dinfo->relocs += relocs;
3675   dinfo->fixups += fixups;
3676 }
3677
3678 /* Compute the total GOT and PLT size required by each symbol in each range. *
3679    Symbols may require up to 4 words in the GOT: an entry pointing to
3680    the symbol, an entry pointing to its function descriptor, and a
3681    private function descriptors taking two words.  */
3682
3683 static int
3684 _bfinfdpic_count_got_plt_entries (void **entryp, void *dinfo_)
3685 {
3686   struct bfinfdpic_relocs_info *entry = *entryp;
3687   struct _bfinfdpic_dynamic_got_info *dinfo = dinfo_;
3688
3689   _bfinfdpic_count_nontls_entries (entry, dinfo);
3690
3691   _bfinfdpic_count_relocs_fixups (entry, dinfo, FALSE);
3692
3693   return 1;
3694 }
3695
3696 /* This structure is used to assign offsets to got entries, function
3697    descriptors, plt entries and lazy plt entries.  */
3698
3699 struct _bfinfdpic_dynamic_got_plt_info
3700 {
3701   /* Summary information collected with _bfinfdpic_count_got_plt_entries.  */
3702   struct _bfinfdpic_dynamic_got_info g;
3703
3704   /* For each addressable range, we record a MAX (positive) and MIN
3705      (negative) value.  CUR is used to assign got entries, and it's
3706      incremented from an initial positive value to MAX, then from MIN
3707      to FDCUR (unless FDCUR wraps around first).  FDCUR is used to
3708      assign function descriptors, and it's decreased from an initial
3709      non-positive value to MIN, then from MAX down to CUR (unless CUR
3710      wraps around first).  All of MIN, MAX, CUR and FDCUR always point
3711      to even words.  ODD, if non-zero, indicates an odd word to be
3712      used for the next got entry, otherwise CUR is used and
3713      incremented by a pair of words, wrapping around when it reaches
3714      MAX.  FDCUR is decremented (and wrapped) before the next function
3715      descriptor is chosen.  FDPLT indicates the number of remaining
3716      slots that can be used for function descriptors used only by PLT
3717      entries.  */
3718   struct _bfinfdpic_dynamic_got_alloc_data
3719   {
3720     bfd_signed_vma max, cur, odd, fdcur, min;
3721     bfd_vma fdplt;
3722   } got17m4, gothilo;
3723 };
3724
3725 /* Determine the positive and negative ranges to be used by each
3726    offset range in the GOT.  FDCUR and CUR, that must be aligned to a
3727    double-word boundary, are the minimum (negative) and maximum
3728    (positive) GOT offsets already used by previous ranges, except for
3729    an ODD entry that may have been left behind.  GOT and FD indicate
3730    the size of GOT entries and function descriptors that must be
3731    placed within the range from -WRAP to WRAP.  If there's room left,
3732    up to FDPLT bytes should be reserved for additional function
3733    descriptors.  */
3734
3735 inline static bfd_signed_vma
3736 _bfinfdpic_compute_got_alloc_data (struct _bfinfdpic_dynamic_got_alloc_data *gad,
3737                                    bfd_signed_vma fdcur,
3738                                    bfd_signed_vma odd,
3739                                    bfd_signed_vma cur,
3740                                    bfd_vma got,
3741                                    bfd_vma fd,
3742                                    bfd_vma fdplt,
3743                                    bfd_vma wrap)
3744 {
3745   bfd_signed_vma wrapmin = -wrap;
3746
3747   /* Start at the given initial points.  */
3748   gad->fdcur = fdcur;
3749   gad->cur = cur;
3750
3751   /* If we had an incoming odd word and we have any got entries that
3752      are going to use it, consume it, otherwise leave gad->odd at
3753      zero.  We might force gad->odd to zero and return the incoming
3754      odd such that it is used by the next range, but then GOT entries
3755      might appear to be out of order and we wouldn't be able to
3756      shorten the GOT by one word if it turns out to end with an
3757      unpaired GOT entry.  */
3758   if (odd && got)
3759     {
3760       gad->odd = odd;
3761       got -= 4;
3762       odd = 0;
3763     }
3764   else
3765     gad->odd = 0;
3766
3767   /* If we're left with an unpaired GOT entry, compute its location
3768      such that we can return it.  Otherwise, if got doesn't require an
3769      odd number of words here, either odd was already zero in the
3770      block above, or it was set to zero because got was non-zero, or
3771      got was already zero.  In the latter case, we want the value of
3772      odd to carry over to the return statement, so we don't want to
3773      reset odd unless the condition below is true.  */
3774   if (got & 4)
3775     {
3776       odd = cur + got;
3777       got += 4;
3778     }
3779
3780   /* Compute the tentative boundaries of this range.  */
3781   gad->max = cur + got;
3782   gad->min = fdcur - fd;
3783   gad->fdplt = 0;
3784
3785   /* If function descriptors took too much space, wrap some of them
3786      around.  */
3787   if (gad->min < wrapmin)
3788     {
3789       gad->max += wrapmin - gad->min;
3790       gad->min = wrapmin;
3791     }
3792   /* If there is space left and we have function descriptors
3793      referenced in PLT entries that could take advantage of shorter
3794      offsets, place them here.  */
3795   else if (fdplt && gad->min > wrapmin)
3796     {
3797       bfd_vma fds;
3798       if ((bfd_vma) (gad->min - wrapmin) < fdplt)
3799         fds = gad->min - wrapmin;
3800       else
3801         fds = fdplt;
3802
3803       fdplt -= fds;
3804       gad->min -= fds;
3805       gad->fdplt += fds;
3806     }
3807
3808   /* If GOT entries took too much space, wrap some of them around.
3809      This may well cause gad->min to become lower than wrapmin.  This
3810      will cause a relocation overflow later on, so we don't have to
3811      report it here . */
3812   if ((bfd_vma) gad->max > wrap)
3813     {
3814       gad->min -= gad->max - wrap;
3815       gad->max = wrap;
3816     }
3817   /* If there is more space left, try to place some more function
3818      descriptors for PLT entries.  */
3819   else if (fdplt && (bfd_vma) gad->max < wrap)
3820     {
3821       bfd_vma fds;
3822       if ((bfd_vma) (wrap - gad->max) < fdplt)
3823         fds = wrap - gad->max;
3824       else
3825         fds = fdplt;
3826
3827       fdplt -= fds;
3828       gad->max += fds;
3829       gad->fdplt += fds;
3830     }
3831
3832   /* If odd was initially computed as an offset past the wrap point,
3833      wrap it around.  */
3834   if (odd > gad->max)
3835     odd = gad->min + odd - gad->max;
3836
3837   /* _bfinfdpic_get_got_entry() below will always wrap gad->cur if needed
3838      before returning, so do it here too.  This guarantees that,
3839      should cur and fdcur meet at the wrap point, they'll both be
3840      equal to min.  */
3841   if (gad->cur == gad->max)
3842     gad->cur = gad->min;
3843
3844   return odd;
3845 }
3846
3847 /* Compute the location of the next GOT entry, given the allocation
3848    data for a range.  */
3849
3850 inline static bfd_signed_vma
3851 _bfinfdpic_get_got_entry (struct _bfinfdpic_dynamic_got_alloc_data *gad)
3852 {
3853   bfd_signed_vma ret;
3854
3855   if (gad->odd)
3856     {
3857       /* If there was an odd word left behind, use it.  */
3858       ret = gad->odd;
3859       gad->odd = 0;
3860     }
3861   else
3862     {
3863       /* Otherwise, use the word pointed to by cur, reserve the next
3864          as an odd word, and skip to the next pair of words, possibly
3865          wrapping around.  */
3866       ret = gad->cur;
3867       gad->odd = gad->cur + 4;
3868       gad->cur += 8;
3869       if (gad->cur == gad->max)
3870         gad->cur = gad->min;
3871     }
3872
3873   return ret;
3874 }
3875
3876 /* Compute the location of the next function descriptor entry in the
3877    GOT, given the allocation data for a range.  */
3878
3879 inline static bfd_signed_vma
3880 _bfinfdpic_get_fd_entry (struct _bfinfdpic_dynamic_got_alloc_data *gad)
3881 {
3882   /* If we're at the bottom, wrap around, and only then allocate the
3883      next pair of words.  */
3884   if (gad->fdcur == gad->min)
3885     gad->fdcur = gad->max;
3886   return gad->fdcur -= 8;
3887 }
3888
3889 /* Assign GOT offsets for every GOT entry and function descriptor.
3890    Doing everything in a single pass is tricky.  */
3891
3892 static int
3893 _bfinfdpic_assign_got_entries (void **entryp, void *info_)
3894 {
3895   struct bfinfdpic_relocs_info *entry = *entryp;
3896   struct _bfinfdpic_dynamic_got_plt_info *dinfo = info_;
3897
3898   if (entry->got17m4)
3899     entry->got_entry = _bfinfdpic_get_got_entry (&dinfo->got17m4);
3900   else if (entry->gothilo)
3901     entry->got_entry = _bfinfdpic_get_got_entry (&dinfo->gothilo);
3902
3903   if (entry->fdgot17m4)
3904     entry->fdgot_entry = _bfinfdpic_get_got_entry (&dinfo->got17m4);
3905   else if (entry->fdgothilo)
3906     entry->fdgot_entry = _bfinfdpic_get_got_entry (&dinfo->gothilo);
3907
3908   if (entry->fdgoff17m4)
3909     entry->fd_entry = _bfinfdpic_get_fd_entry (&dinfo->got17m4);
3910   else if (entry->plt && dinfo->got17m4.fdplt)
3911     {
3912       dinfo->got17m4.fdplt -= 8;
3913       entry->fd_entry = _bfinfdpic_get_fd_entry (&dinfo->got17m4);
3914     }
3915   else if (entry->plt)
3916     {
3917       dinfo->gothilo.fdplt -= 8;
3918       entry->fd_entry = _bfinfdpic_get_fd_entry (&dinfo->gothilo);
3919     }
3920   else if (entry->privfd)
3921     entry->fd_entry = _bfinfdpic_get_fd_entry (&dinfo->gothilo);
3922
3923   return 1;
3924 }
3925
3926 /* Assign GOT offsets to private function descriptors used by PLT
3927    entries (or referenced by 32-bit offsets), as well as PLT entries
3928    and lazy PLT entries.  */
3929
3930 static int
3931 _bfinfdpic_assign_plt_entries (void **entryp, void *info_)
3932 {
3933   struct bfinfdpic_relocs_info *entry = *entryp;
3934   struct _bfinfdpic_dynamic_got_plt_info *dinfo = info_;
3935
3936   /* If this symbol requires a local function descriptor, allocate
3937      one.  */
3938   if (entry->privfd && entry->fd_entry == 0)
3939     {
3940       if (dinfo->got17m4.fdplt)
3941         {
3942           entry->fd_entry = _bfinfdpic_get_fd_entry (&dinfo->got17m4);
3943           dinfo->got17m4.fdplt -= 8;
3944         }
3945       else
3946         {
3947           BFD_ASSERT (dinfo->gothilo.fdplt);
3948           entry->fd_entry = _bfinfdpic_get_fd_entry (&dinfo->gothilo);
3949           dinfo->gothilo.fdplt -= 8;
3950         }
3951     }
3952
3953   if (entry->plt)
3954     {
3955       int size;
3956
3957       /* We use the section's raw size to mark the location of the
3958          next PLT entry.  */
3959       entry->plt_entry = bfinfdpic_plt_section (dinfo->g.info)->size;
3960
3961       /* Figure out the length of this PLT entry based on the
3962          addressing mode we need to reach the function descriptor.  */
3963       BFD_ASSERT (entry->fd_entry);
3964       if (entry->fd_entry >= -(1 << (18 - 1))
3965           && entry->fd_entry + 4 < (1 << (18 - 1)))
3966         size = 10;
3967       else
3968         size = 16;
3969
3970       bfinfdpic_plt_section (dinfo->g.info)->size += size;
3971     }
3972
3973   if (entry->lazyplt)
3974     {
3975       entry->lzplt_entry = dinfo->g.lzplt;
3976       dinfo->g.lzplt += LZPLT_NORMAL_SIZE;
3977       /* If this entry is the one that gets the resolver stub, account
3978          for the additional instruction.  */
3979       if (entry->lzplt_entry % BFINFDPIC_LZPLT_BLOCK_SIZE
3980           == BFINFDPIC_LZPLT_RESOLV_LOC)
3981         dinfo->g.lzplt += LZPLT_RESOLVER_EXTRA;
3982     }
3983
3984   return 1;
3985 }
3986
3987 /* Cancel out any effects of calling _bfinfdpic_assign_got_entries and
3988    _bfinfdpic_assign_plt_entries.  */
3989
3990 static int
3991 _bfinfdpic_reset_got_plt_entries (void **entryp, void *ignore ATTRIBUTE_UNUSED)
3992 {
3993   struct bfinfdpic_relocs_info *entry = *entryp;
3994
3995   entry->got_entry = 0;
3996   entry->fdgot_entry = 0;
3997   entry->fd_entry = 0;
3998   entry->plt_entry = (bfd_vma)-1;
3999   entry->lzplt_entry = (bfd_vma)-1;
4000
4001   return 1;
4002 }
4003
4004 /* Follow indirect and warning hash entries so that each got entry
4005    points to the final symbol definition.  P must point to a pointer
4006    to the hash table we're traversing.  Since this traversal may
4007    modify the hash table, we set this pointer to NULL to indicate
4008    we've made a potentially-destructive change to the hash table, so
4009    the traversal must be restarted.  */
4010 static int
4011 _bfinfdpic_resolve_final_relocs_info (void **entryp, void *p)
4012 {
4013   struct bfinfdpic_relocs_info *entry = *entryp;
4014   htab_t *htab = p;
4015
4016   if (entry->symndx == -1)
4017     {
4018       struct elf_link_hash_entry *h = entry->d.h;
4019       struct bfinfdpic_relocs_info *oentry;
4020
4021       while (h->root.type == bfd_link_hash_indirect
4022              || h->root.type == bfd_link_hash_warning)
4023         h = (struct elf_link_hash_entry *)h->root.u.i.link;
4024
4025       if (entry->d.h == h)
4026         return 1;
4027
4028       oentry = bfinfdpic_relocs_info_for_global (*htab, 0, h, entry->addend,
4029                                                 NO_INSERT);
4030
4031       if (oentry)
4032         {
4033           /* Merge the two entries.  */
4034           bfinfdpic_pic_merge_early_relocs_info (oentry, entry);
4035           htab_clear_slot (*htab, entryp);
4036           return 1;
4037         }
4038
4039       entry->d.h = h;
4040
4041       /* If we can't find this entry with the new bfd hash, re-insert
4042          it, and get the traversal restarted.  */
4043       if (! htab_find (*htab, entry))
4044         {
4045           htab_clear_slot (*htab, entryp);
4046           entryp = htab_find_slot (*htab, entry, INSERT);
4047           if (! *entryp)
4048             *entryp = entry;
4049           /* Abort the traversal, since the whole table may have
4050              moved, and leave it up to the parent to restart the
4051              process.  */
4052           *(htab_t *)p = NULL;
4053           return 0;
4054         }
4055     }
4056
4057   return 1;
4058 }
4059
4060 /* Compute the total size of the GOT, the PLT, the dynamic relocations
4061    section and the rofixup section.  Assign locations for GOT and PLT
4062    entries.  */
4063
4064 static bfd_boolean
4065 _bfinfdpic_size_got_plt (bfd *output_bfd,
4066                          struct _bfinfdpic_dynamic_got_plt_info *gpinfop)
4067 {
4068   bfd_signed_vma odd;
4069   bfd_vma limit;
4070   struct bfd_link_info *info = gpinfop->g.info;
4071   bfd *dynobj = elf_hash_table (info)->dynobj;
4072
4073   memcpy (bfinfdpic_dynamic_got_plt_info (info), &gpinfop->g,
4074           sizeof (gpinfop->g));
4075
4076   odd = 12;
4077   /* Compute the total size taken by entries in the 18-bit range,
4078      to tell how many PLT function descriptors we can bring into it
4079      without causing it to overflow.  */
4080   limit = odd + gpinfop->g.got17m4 + gpinfop->g.fd17m4;
4081   if (limit < (bfd_vma)1 << 18)
4082     limit = ((bfd_vma)1 << 18) - limit;
4083   else
4084     limit = 0;
4085   if (gpinfop->g.fdplt < limit)
4086     limit = gpinfop->g.fdplt;
4087
4088   /* Determine the ranges of GOT offsets that we can use for each
4089      range of addressing modes.  */
4090   odd = _bfinfdpic_compute_got_alloc_data (&gpinfop->got17m4,
4091                                           0,
4092                                           odd,
4093                                           16,
4094                                           gpinfop->g.got17m4,
4095                                           gpinfop->g.fd17m4,
4096                                           limit,
4097                                           (bfd_vma)1 << (18-1));
4098   odd = _bfinfdpic_compute_got_alloc_data (&gpinfop->gothilo,
4099                                           gpinfop->got17m4.min,
4100                                           odd,
4101                                           gpinfop->got17m4.max,
4102                                           gpinfop->g.gothilo,
4103                                           gpinfop->g.fdhilo,
4104                                           gpinfop->g.fdplt - gpinfop->got17m4.fdplt,
4105                                           (bfd_vma)1 << (32-1));
4106
4107   /* Now assign (most) GOT offsets.  */
4108   htab_traverse (bfinfdpic_relocs_info (info), _bfinfdpic_assign_got_entries,
4109                  gpinfop);
4110
4111   bfinfdpic_got_section (info)->size = gpinfop->gothilo.max
4112     - gpinfop->gothilo.min
4113     /* If an odd word is the last word of the GOT, we don't need this
4114        word to be part of the GOT.  */
4115     - (odd + 4 == gpinfop->gothilo.max ? 4 : 0);
4116   if (bfinfdpic_got_section (info)->size == 0)
4117     bfinfdpic_got_section (info)->flags |= SEC_EXCLUDE;
4118   else if (bfinfdpic_got_section (info)->size == 12
4119            && ! elf_hash_table (info)->dynamic_sections_created)
4120     {
4121       bfinfdpic_got_section (info)->flags |= SEC_EXCLUDE;
4122       bfinfdpic_got_section (info)->size = 0;
4123     }
4124   else
4125     {
4126       bfinfdpic_got_section (info)->contents =
4127         (bfd_byte *) bfd_zalloc (dynobj,
4128                                  bfinfdpic_got_section (info)->size);
4129       if (bfinfdpic_got_section (info)->contents == NULL)
4130         return FALSE;
4131     }
4132
4133   if (elf_hash_table (info)->dynamic_sections_created)
4134     /* Subtract the number of lzplt entries, since those will generate
4135        relocations in the pltrel section.  */
4136     bfinfdpic_gotrel_section (info)->size =
4137       (gpinfop->g.relocs - gpinfop->g.lzplt / LZPLT_NORMAL_SIZE)
4138       * get_elf_backend_data (output_bfd)->s->sizeof_rel;
4139   else
4140     BFD_ASSERT (gpinfop->g.relocs == 0);
4141   if (bfinfdpic_gotrel_section (info)->size == 0)
4142     bfinfdpic_gotrel_section (info)->flags |= SEC_EXCLUDE;
4143   else
4144     {
4145       bfinfdpic_gotrel_section (info)->contents =
4146         (bfd_byte *) bfd_zalloc (dynobj,
4147                                  bfinfdpic_gotrel_section (info)->size);
4148       if (bfinfdpic_gotrel_section (info)->contents == NULL)
4149         return FALSE;
4150     }
4151
4152   bfinfdpic_gotfixup_section (info)->size = (gpinfop->g.fixups + 1) * 4;
4153   if (bfinfdpic_gotfixup_section (info)->size == 0)
4154     bfinfdpic_gotfixup_section (info)->flags |= SEC_EXCLUDE;
4155   else
4156     {
4157       bfinfdpic_gotfixup_section (info)->contents =
4158         (bfd_byte *) bfd_zalloc (dynobj,
4159                                  bfinfdpic_gotfixup_section (info)->size);
4160       if (bfinfdpic_gotfixup_section (info)->contents == NULL)
4161         return FALSE;
4162     }
4163
4164   if (elf_hash_table (info)->dynamic_sections_created)
4165     {
4166       bfinfdpic_pltrel_section (info)->size =
4167         gpinfop->g.lzplt / LZPLT_NORMAL_SIZE * get_elf_backend_data (output_bfd)->s->sizeof_rel;
4168       if (bfinfdpic_pltrel_section (info)->size == 0)
4169         bfinfdpic_pltrel_section (info)->flags |= SEC_EXCLUDE;
4170       else
4171         {
4172           bfinfdpic_pltrel_section (info)->contents =
4173             (bfd_byte *) bfd_zalloc (dynobj,
4174                                      bfinfdpic_pltrel_section (info)->size);
4175           if (bfinfdpic_pltrel_section (info)->contents == NULL)
4176             return FALSE;
4177         }
4178     }
4179
4180   /* Add 4 bytes for every block of at most 65535 lazy PLT entries,
4181      such that there's room for the additional instruction needed to
4182      call the resolver.  Since _bfinfdpic_assign_got_entries didn't
4183      account for them, our block size is 4 bytes smaller than the real
4184      block size.  */
4185   if (elf_hash_table (info)->dynamic_sections_created)
4186     {
4187       bfinfdpic_plt_section (info)->size = gpinfop->g.lzplt
4188         + ((gpinfop->g.lzplt + (BFINFDPIC_LZPLT_BLOCK_SIZE - 4) - LZPLT_NORMAL_SIZE)
4189            / (BFINFDPIC_LZPLT_BLOCK_SIZE - 4) * LZPLT_RESOLVER_EXTRA);
4190     }
4191
4192   /* Reset it, such that _bfinfdpic_assign_plt_entries() can use it to
4193      actually assign lazy PLT entries addresses.  */
4194   gpinfop->g.lzplt = 0;
4195
4196   /* Save information that we're going to need to generate GOT and PLT
4197      entries.  */
4198   bfinfdpic_got_initial_offset (info) = -gpinfop->gothilo.min;
4199
4200   if (get_elf_backend_data (output_bfd)->want_got_sym)
4201     elf_hash_table (info)->hgot->root.u.def.value
4202       = bfinfdpic_got_initial_offset (info);
4203
4204   if (elf_hash_table (info)->dynamic_sections_created)
4205     bfinfdpic_plt_initial_offset (info) =
4206       bfinfdpic_plt_section (info)->size;
4207
4208   htab_traverse (bfinfdpic_relocs_info (info), _bfinfdpic_assign_plt_entries,
4209                  gpinfop);
4210
4211   /* Allocate the PLT section contents only after
4212      _bfinfdpic_assign_plt_entries has a chance to add the size of the
4213      non-lazy PLT entries.  */
4214   if (elf_hash_table (info)->dynamic_sections_created)
4215     {
4216       if (bfinfdpic_plt_section (info)->size == 0)
4217         bfinfdpic_plt_section (info)->flags |= SEC_EXCLUDE;
4218       else
4219         {
4220           bfinfdpic_plt_section (info)->contents =
4221             (bfd_byte *) bfd_zalloc (dynobj,
4222                                      bfinfdpic_plt_section (info)->size);
4223           if (bfinfdpic_plt_section (info)->contents == NULL)
4224             return FALSE;
4225         }
4226     }
4227
4228   return TRUE;
4229 }
4230
4231 /* Set the sizes of the dynamic sections.  */
4232
4233 static bfd_boolean
4234 elf32_bfinfdpic_size_dynamic_sections (bfd *output_bfd,
4235                                       struct bfd_link_info *info)
4236 {
4237   struct elf_link_hash_table *htab;
4238   bfd *dynobj;
4239   asection *s;
4240   struct _bfinfdpic_dynamic_got_plt_info gpinfo;
4241
4242   htab = elf_hash_table (info);
4243   dynobj = htab->dynobj;
4244   BFD_ASSERT (dynobj != NULL);
4245
4246   if (htab->dynamic_sections_created)
4247     {
4248       /* Set the contents of the .interp section to the interpreter.  */
4249       if (info->executable)
4250         {
4251           s = bfd_get_section_by_name (dynobj, ".interp");
4252           BFD_ASSERT (s != NULL);
4253           s->size = sizeof ELF_DYNAMIC_INTERPRETER;
4254           s->contents = (bfd_byte *) ELF_DYNAMIC_INTERPRETER;
4255         }
4256     }
4257
4258   memset (&gpinfo, 0, sizeof (gpinfo));
4259   gpinfo.g.info = info;
4260
4261   for (;;)
4262     {
4263       htab_t relocs = bfinfdpic_relocs_info (info);
4264
4265       htab_traverse (relocs, _bfinfdpic_resolve_final_relocs_info, &relocs);
4266
4267       if (relocs == bfinfdpic_relocs_info (info))
4268         break;
4269     }
4270
4271   htab_traverse (bfinfdpic_relocs_info (info), _bfinfdpic_count_got_plt_entries,
4272                  &gpinfo.g);
4273
4274   /* Allocate space to save the summary information, we're going to
4275      use it if we're doing relaxations.  */
4276   bfinfdpic_dynamic_got_plt_info (info) = bfd_alloc (dynobj, sizeof (gpinfo.g));
4277
4278   if (!_bfinfdpic_size_got_plt (output_bfd, &gpinfo))
4279       return FALSE;
4280
4281   if (elf_hash_table (info)->dynamic_sections_created)
4282     {
4283       if (bfinfdpic_got_section (info)->size)
4284         if (!_bfd_elf_add_dynamic_entry (info, DT_PLTGOT, 0))
4285           return FALSE;
4286
4287       if (bfinfdpic_pltrel_section (info)->size)
4288         if (!_bfd_elf_add_dynamic_entry (info, DT_PLTRELSZ, 0)
4289             || !_bfd_elf_add_dynamic_entry (info, DT_PLTREL, DT_REL)
4290             || !_bfd_elf_add_dynamic_entry (info, DT_JMPREL, 0))
4291           return FALSE;
4292
4293       if (bfinfdpic_gotrel_section (info)->size)
4294         if (!_bfd_elf_add_dynamic_entry (info, DT_REL, 0)
4295             || !_bfd_elf_add_dynamic_entry (info, DT_RELSZ, 0)
4296             || !_bfd_elf_add_dynamic_entry (info, DT_RELENT,
4297                                             sizeof (Elf32_External_Rel)))
4298           return FALSE;
4299     }
4300
4301
4302   s = bfd_get_section_by_name (dynobj, ".rela.bss");
4303   if (s && s->size == 0)
4304     s->flags |= SEC_EXCLUDE;
4305
4306   s = bfd_get_section_by_name (dynobj, ".rel.plt");
4307   if (s && s->size == 0)
4308     s->flags |= SEC_EXCLUDE;
4309
4310   return TRUE;
4311 }
4312
4313 static bfd_boolean
4314 elf32_bfinfdpic_always_size_sections (bfd *output_bfd,
4315                                      struct bfd_link_info *info)
4316 {
4317   if (!info->relocatable)
4318     {
4319       struct elf_link_hash_entry *h;
4320
4321       /* Force a PT_GNU_STACK segment to be created.  */
4322       if (! elf_tdata (output_bfd)->stack_flags)
4323         elf_tdata (output_bfd)->stack_flags = PF_R | PF_W | PF_X;
4324
4325       /* Define __stacksize if it's not defined yet.  */
4326       h = elf_link_hash_lookup (elf_hash_table (info), "__stacksize",
4327                                 FALSE, FALSE, FALSE);
4328       if (! h || h->root.type != bfd_link_hash_defined
4329           || h->type != STT_OBJECT
4330           || !h->def_regular)
4331         {
4332           struct bfd_link_hash_entry *bh = NULL;
4333
4334           if (!(_bfd_generic_link_add_one_symbol
4335                 (info, output_bfd, "__stacksize",
4336                  BSF_GLOBAL, bfd_abs_section_ptr, DEFAULT_STACK_SIZE,
4337                  (const char *) NULL, FALSE,
4338                  get_elf_backend_data (output_bfd)->collect, &bh)))
4339             return FALSE;
4340
4341           h = (struct elf_link_hash_entry *) bh;
4342           h->def_regular = 1;
4343           h->type = STT_OBJECT;
4344         }
4345     }
4346
4347   return TRUE;
4348 }
4349
4350 /* Check whether any of the relocations was optimized away, and
4351    subtract it from the relocation or fixup count.  */
4352 static bfd_boolean
4353 _bfinfdpic_check_discarded_relocs (bfd *abfd, asection *sec,
4354                                   struct bfd_link_info *info,
4355                                   
4356                                   bfd_boolean *changed)
4357 {
4358   Elf_Internal_Shdr *symtab_hdr;
4359   struct elf_link_hash_entry **sym_hashes, **sym_hashes_end;
4360   Elf_Internal_Rela *rel, *erel;
4361
4362   if ((sec->flags & SEC_RELOC) == 0
4363       || sec->reloc_count == 0)
4364     return TRUE;
4365
4366   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
4367   sym_hashes = elf_sym_hashes (abfd);
4368   sym_hashes_end = sym_hashes + symtab_hdr->sh_size/sizeof(Elf32_External_Sym);
4369   if (!elf_bad_symtab (abfd))
4370     sym_hashes_end -= symtab_hdr->sh_info;
4371
4372   rel = elf_section_data (sec)->relocs;
4373
4374   /* Now examine each relocation.  */
4375   for (erel = rel + sec->reloc_count; rel < erel; rel++)
4376     {
4377       struct elf_link_hash_entry *h;
4378       unsigned long r_symndx;
4379       struct bfinfdpic_relocs_info *picrel;
4380       struct _bfinfdpic_dynamic_got_info *dinfo;
4381
4382       if (ELF32_R_TYPE (rel->r_info) != R_BFIN_BYTE4_DATA
4383           && ELF32_R_TYPE (rel->r_info) != R_BFIN_FUNCDESC)
4384         continue;
4385
4386       if (_bfd_elf_section_offset (sec->output_section->owner,
4387                                    info, sec, rel->r_offset)
4388           != (bfd_vma)-1)
4389         continue;
4390
4391       r_symndx = ELF32_R_SYM (rel->r_info);
4392       if (r_symndx < symtab_hdr->sh_info)
4393         h = NULL;
4394       else
4395         {
4396           h = sym_hashes[r_symndx - symtab_hdr->sh_info];
4397           while (h->root.type == bfd_link_hash_indirect
4398                  || h->root.type == bfd_link_hash_warning)
4399             h = (struct elf_link_hash_entry *)h->root.u.i.link;
4400         }
4401
4402       if (h != NULL)
4403         picrel = bfinfdpic_relocs_info_for_global (bfinfdpic_relocs_info (info),
4404                                                   abfd, h,
4405                                                   rel->r_addend, NO_INSERT);
4406       else
4407         picrel = bfinfdpic_relocs_info_for_local (bfinfdpic_relocs_info (info),
4408                                                  abfd, r_symndx,
4409                                                  rel->r_addend, NO_INSERT);
4410
4411       if (! picrel)
4412         return FALSE;
4413
4414       *changed = TRUE;
4415       dinfo = bfinfdpic_dynamic_got_plt_info (info);
4416
4417       _bfinfdpic_count_relocs_fixups (picrel, dinfo, TRUE);
4418       if (ELF32_R_TYPE (rel->r_info) == R_BFIN_BYTE4_DATA)
4419         picrel->relocs32--;
4420       else /* we know (ELF32_R_TYPE (rel->r_info) == R_BFIN_FUNCDESC) */
4421         picrel->relocsfd--;
4422       _bfinfdpic_count_relocs_fixups (picrel, dinfo, FALSE);
4423     }
4424
4425   return TRUE;
4426 }
4427
4428 static bfd_boolean
4429 bfinfdpic_elf_discard_info (bfd *ibfd,
4430                            struct elf_reloc_cookie *cookie ATTRIBUTE_UNUSED,
4431                            struct bfd_link_info *info)
4432 {
4433   bfd_boolean changed = FALSE;
4434   asection *s;
4435   bfd *obfd = NULL;
4436
4437   /* Account for relaxation of .eh_frame section.  */
4438   for (s = ibfd->sections; s; s = s->next)
4439     if (s->sec_info_type == ELF_INFO_TYPE_EH_FRAME)
4440       {
4441         if (!_bfinfdpic_check_discarded_relocs (ibfd, s, info, &changed))
4442           return FALSE;
4443         obfd = s->output_section->owner;
4444       }
4445
4446   if (changed)
4447     {
4448       struct _bfinfdpic_dynamic_got_plt_info gpinfo;
4449
4450       memset (&gpinfo, 0, sizeof (gpinfo));
4451       memcpy (&gpinfo.g, bfinfdpic_dynamic_got_plt_info (info),
4452               sizeof (gpinfo.g));
4453
4454       /* Clear GOT and PLT assignments.  */
4455       htab_traverse (bfinfdpic_relocs_info (info),
4456                      _bfinfdpic_reset_got_plt_entries,
4457                      NULL);
4458
4459       if (!_bfinfdpic_size_got_plt (obfd, &gpinfo))
4460         return FALSE;
4461     }
4462
4463   return TRUE;
4464 }
4465
4466 static bfd_boolean
4467 elf32_bfinfdpic_modify_program_headers (bfd *output_bfd,
4468                                         struct bfd_link_info *info)
4469 {
4470   struct elf_obj_tdata *tdata = elf_tdata (output_bfd);
4471   struct elf_segment_map *m;
4472   Elf_Internal_Phdr *p;
4473
4474   /* objcopy and strip preserve what's already there using
4475      elf32_bfinfdpic_copy_private_bfd_data ().  */
4476   if (! info)
4477     return TRUE;
4478
4479   for (p = tdata->phdr, m = tdata->segment_map; m != NULL; m = m->next, p++)
4480     if (m->p_type == PT_GNU_STACK)
4481       break;
4482
4483   if (m)
4484     {
4485       struct elf_link_hash_entry *h;
4486
4487       /* Obtain the pointer to the __stacksize symbol.  */
4488       h = elf_link_hash_lookup (elf_hash_table (info), "__stacksize",
4489                                 FALSE, FALSE, FALSE);
4490       if (h)
4491         {
4492           while (h->root.type == bfd_link_hash_indirect
4493                  || h->root.type == bfd_link_hash_warning)
4494             h = (struct elf_link_hash_entry *) h->root.u.i.link;
4495           BFD_ASSERT (h->root.type == bfd_link_hash_defined);
4496         }
4497
4498       /* Set the header p_memsz from the symbol value.  We
4499          intentionally ignore the symbol section.  */
4500       if (h && h->root.type == bfd_link_hash_defined)
4501         p->p_memsz = h->root.u.def.value;
4502       else
4503         p->p_memsz = DEFAULT_STACK_SIZE;
4504
4505       p->p_align = 8;
4506     }
4507
4508   return TRUE;
4509 }
4510
4511 static bfd_boolean
4512 elf32_bfinfdpic_finish_dynamic_sections (bfd *output_bfd,
4513                                         struct bfd_link_info *info)
4514 {
4515   bfd *dynobj;
4516   asection *sdyn;
4517
4518   dynobj = elf_hash_table (info)->dynobj;
4519
4520   if (bfinfdpic_got_section (info))
4521     {
4522       BFD_ASSERT (bfinfdpic_gotrel_section (info)->size
4523                   == (bfinfdpic_gotrel_section (info)->reloc_count
4524                       * sizeof (Elf32_External_Rel)));
4525
4526       if (bfinfdpic_gotfixup_section (info))
4527         {
4528           struct elf_link_hash_entry *hgot = elf_hash_table (info)->hgot;
4529           bfd_vma got_value = hgot->root.u.def.value
4530             + hgot->root.u.def.section->output_section->vma
4531             + hgot->root.u.def.section->output_offset;
4532
4533           _bfinfdpic_add_rofixup (output_bfd, bfinfdpic_gotfixup_section (info),
4534                                  got_value, 0);
4535
4536           if (bfinfdpic_gotfixup_section (info)->size
4537               != (bfinfdpic_gotfixup_section (info)->reloc_count * 4))
4538             {
4539               (*_bfd_error_handler)
4540                 ("LINKER BUG: .rofixup section size mismatch");
4541               return FALSE;
4542             }
4543         }
4544     }
4545   if (elf_hash_table (info)->dynamic_sections_created)
4546     {
4547       BFD_ASSERT (bfinfdpic_pltrel_section (info)->size
4548                   == (bfinfdpic_pltrel_section (info)->reloc_count
4549                       * sizeof (Elf32_External_Rel)));
4550     }
4551
4552   sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
4553
4554   if (elf_hash_table (info)->dynamic_sections_created)
4555     {
4556       Elf32_External_Dyn * dyncon;
4557       Elf32_External_Dyn * dynconend;
4558
4559       BFD_ASSERT (sdyn != NULL);
4560
4561       dyncon = (Elf32_External_Dyn *) sdyn->contents;
4562       dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
4563
4564       for (; dyncon < dynconend; dyncon++)
4565         {
4566           Elf_Internal_Dyn dyn;
4567
4568           bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
4569
4570           switch (dyn.d_tag)
4571             {
4572             default:
4573               break;
4574
4575             case DT_PLTGOT:
4576               dyn.d_un.d_ptr = bfinfdpic_got_section (info)->output_section->vma
4577                 + bfinfdpic_got_section (info)->output_offset
4578                 + bfinfdpic_got_initial_offset (info);
4579               bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
4580               break;
4581
4582             case DT_JMPREL:
4583               dyn.d_un.d_ptr = bfinfdpic_pltrel_section (info)
4584                 ->output_section->vma
4585                 + bfinfdpic_pltrel_section (info)->output_offset;
4586               bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
4587               break;
4588
4589             case DT_PLTRELSZ:
4590               dyn.d_un.d_val = bfinfdpic_pltrel_section (info)->size;
4591               bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
4592               break;
4593             }
4594         }
4595     }
4596
4597   return TRUE;
4598 }
4599
4600 /* Adjust a symbol defined by a dynamic object and referenced by a
4601    regular object.  */
4602
4603 static bfd_boolean
4604 elf32_bfinfdpic_adjust_dynamic_symbol
4605 (struct bfd_link_info *info,
4606  struct elf_link_hash_entry *h)
4607 {
4608   bfd * dynobj;
4609
4610   dynobj = elf_hash_table (info)->dynobj;
4611
4612   /* Make sure we know what is going on here.  */
4613   BFD_ASSERT (dynobj != NULL
4614               && (h->u.weakdef != NULL
4615                   || (h->def_dynamic
4616                       && h->ref_regular
4617                       && !h->def_regular)));
4618
4619   /* If this is a weak symbol, and there is a real definition, the
4620      processor independent code will have arranged for us to see the
4621      real definition first, and we can just use the same value.  */
4622   if (h->u.weakdef != NULL)
4623     {
4624       BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
4625                   || h->u.weakdef->root.type == bfd_link_hash_defweak);
4626       h->root.u.def.section = h->u.weakdef->root.u.def.section;
4627       h->root.u.def.value = h->u.weakdef->root.u.def.value;
4628     }
4629
4630   return TRUE;
4631 }
4632
4633 /* Perform any actions needed for dynamic symbols.  */
4634
4635 static bfd_boolean
4636 elf32_bfinfdpic_finish_dynamic_symbol
4637 (bfd *output_bfd ATTRIBUTE_UNUSED,
4638  struct bfd_link_info *info ATTRIBUTE_UNUSED,
4639  struct elf_link_hash_entry *h ATTRIBUTE_UNUSED,
4640  Elf_Internal_Sym *sym ATTRIBUTE_UNUSED)
4641 {
4642   return TRUE;
4643 }
4644
4645 /* Decide whether to attempt to turn absptr or lsda encodings in
4646    shared libraries into pcrel within the given input section.  */
4647
4648 static bfd_boolean
4649 bfinfdpic_elf_use_relative_eh_frame
4650 (bfd *input_bfd ATTRIBUTE_UNUSED,
4651  struct bfd_link_info *info ATTRIBUTE_UNUSED,
4652  asection *eh_frame_section ATTRIBUTE_UNUSED)
4653 {
4654   /* We can't use PC-relative encodings in FDPIC binaries, in general.  */
4655   return FALSE;
4656 }
4657
4658 /* Adjust the contents of an eh_frame_hdr section before they're output.  */
4659
4660 static bfd_byte
4661 bfinfdpic_elf_encode_eh_address (bfd *abfd,
4662                                 struct bfd_link_info *info,
4663                                 asection *osec, bfd_vma offset,
4664                                 asection *loc_sec, bfd_vma loc_offset,
4665                                 bfd_vma *encoded)
4666 {
4667   struct elf_link_hash_entry *h;
4668
4669   h = elf_hash_table (info)->hgot;
4670   BFD_ASSERT (h && h->root.type == bfd_link_hash_defined);
4671
4672   if (! h || (_bfinfdpic_osec_to_segment (abfd, osec)
4673               == _bfinfdpic_osec_to_segment (abfd, loc_sec->output_section)))
4674     return _bfd_elf_encode_eh_address (abfd, info, osec, offset,
4675                                        loc_sec, loc_offset, encoded);
4676
4677   BFD_ASSERT (_bfinfdpic_osec_to_segment (abfd, osec)
4678               == (_bfinfdpic_osec_to_segment
4679                   (abfd, h->root.u.def.section->output_section)));
4680
4681   *encoded = osec->vma + offset
4682     - (h->root.u.def.value
4683        + h->root.u.def.section->output_section->vma
4684        + h->root.u.def.section->output_offset);
4685
4686   return DW_EH_PE_datarel | DW_EH_PE_sdata4;
4687 }
4688
4689
4690
4691 /* Look through the relocs for a section during the first phase.
4692
4693    Besides handling virtual table relocs for gc, we have to deal with
4694    all sorts of PIC-related relocations.  We describe below the
4695    general plan on how to handle such relocations, even though we only
4696    collect information at this point, storing them in hash tables for
4697    perusal of later passes.
4698
4699    32 relocations are propagated to the linker output when creating
4700    position-independent output.  LO16 and HI16 relocations are not
4701    supposed to be encountered in this case.
4702
4703    LABEL16 should always be resolvable by the linker, since it's only
4704    used by branches.
4705
4706    LABEL24, on the other hand, is used by calls.  If it turns out that
4707    the target of a call is a dynamic symbol, a PLT entry must be
4708    created for it, which triggers the creation of a private function
4709    descriptor and, unless lazy binding is disabled, a lazy PLT entry.
4710
4711    GPREL relocations require the referenced symbol to be in the same
4712    segment as _gp, but this can only be checked later.
4713
4714    All GOT, GOTOFF and FUNCDESC relocations require a .got section to
4715    exist.  LABEL24 might as well, since it may require a PLT entry,
4716    that will require a got.
4717
4718    Non-FUNCDESC GOT relocations require a GOT entry to be created
4719    regardless of whether the symbol is dynamic.  However, since a
4720    global symbol that turns out to not be exported may have the same
4721    address of a non-dynamic symbol, we don't assign GOT entries at
4722    this point, such that we can share them in this case.  A relocation
4723    for the GOT entry always has to be created, be it to offset a
4724    private symbol by the section load address, be it to get the symbol
4725    resolved dynamically.
4726
4727    FUNCDESC GOT relocations require a GOT entry to be created, and
4728    handled as if a FUNCDESC relocation was applied to the GOT entry in
4729    an object file.
4730
4731    FUNCDESC relocations referencing a symbol that turns out to NOT be
4732    dynamic cause a private function descriptor to be created.  The
4733    FUNCDESC relocation then decays to a 32 relocation that points at
4734    the private descriptor.  If the symbol is dynamic, the FUNCDESC
4735    relocation is propagated to the linker output, such that the
4736    dynamic linker creates the canonical descriptor, pointing to the
4737    dynamically-resolved definition of the function.
4738
4739    Non-FUNCDESC GOTOFF relocations must always refer to non-dynamic
4740    symbols that are assigned to the same segment as the GOT, but we
4741    can only check this later, after we know the complete set of
4742    symbols defined and/or exported.
4743
4744    FUNCDESC GOTOFF relocations require a function descriptor to be
4745    created and, unless lazy binding is disabled or the symbol is not
4746    dynamic, a lazy PLT entry.  Since we can't tell at this point
4747    whether a symbol is going to be dynamic, we have to decide later
4748    whether to create a lazy PLT entry or bind the descriptor directly
4749    to the private function.
4750
4751    FUNCDESC_VALUE relocations are not supposed to be present in object
4752    files, but they may very well be simply propagated to the linker
4753    output, since they have no side effect.
4754
4755
4756    A function descriptor always requires a FUNCDESC_VALUE relocation.
4757    Whether it's in .plt.rel or not depends on whether lazy binding is
4758    enabled and on whether the referenced symbol is dynamic.
4759
4760    The existence of a lazy PLT requires the resolverStub lazy PLT
4761    entry to be present.
4762
4763
4764    As for assignment of GOT, PLT and lazy PLT entries, and private
4765    descriptors, we might do them all sequentially, but we can do
4766    better than that.  For example, we can place GOT entries and
4767    private function descriptors referenced using 12-bit operands
4768    closer to the PIC register value, such that these relocations don't
4769    overflow.  Those that are only referenced with LO16 relocations
4770    could come next, but we may as well place PLT-required function
4771    descriptors in the 12-bit range to make them shorter.  Symbols
4772    referenced with LO16/HI16 may come next, but we may place
4773    additional function descriptors in the 16-bit range if we can
4774    reliably tell that we've already placed entries that are ever
4775    referenced with only LO16.  PLT entries are therefore generated as
4776    small as possible, while not introducing relocation overflows in
4777    GOT or FUNCDESC_GOTOFF relocations.  Lazy PLT entries could be
4778    generated before or after PLT entries, but not intermingled with
4779    them, such that we can have more lazy PLT entries in range for a
4780    branch to the resolverStub.  The resolverStub should be emitted at
4781    the most distant location from the first lazy PLT entry such that
4782    it's still in range for a branch, or closer, if there isn't a need
4783    for so many lazy PLT entries.  Additional lazy PLT entries may be
4784    emitted after the resolverStub, as long as branches are still in
4785    range.  If the branch goes out of range, longer lazy PLT entries
4786    are emitted.
4787
4788    We could further optimize PLT and lazy PLT entries by giving them
4789    priority in assignment to closer-to-gr17 locations depending on the
4790    number of occurrences of references to them (assuming a function
4791    that's called more often is more important for performance, so its
4792    PLT entry should be faster), or taking hints from the compiler.
4793    Given infinite time and money... :-)  */
4794
4795 static bfd_boolean
4796 bfinfdpic_check_relocs (bfd *abfd, struct bfd_link_info *info,
4797                         asection *sec, const Elf_Internal_Rela *relocs)
4798 {
4799   Elf_Internal_Shdr *symtab_hdr;
4800   struct elf_link_hash_entry **sym_hashes;
4801   const Elf_Internal_Rela *rel;
4802   const Elf_Internal_Rela *rel_end;
4803   bfd *dynobj;
4804   struct bfinfdpic_relocs_info *picrel;
4805
4806   if (info->relocatable)
4807     return TRUE;
4808
4809   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
4810   sym_hashes = elf_sym_hashes (abfd);
4811
4812   dynobj = elf_hash_table (info)->dynobj;
4813   rel_end = relocs + sec->reloc_count;
4814   for (rel = relocs; rel < rel_end; rel++)
4815     {
4816       struct elf_link_hash_entry *h;
4817       unsigned long r_symndx;
4818
4819       r_symndx = ELF32_R_SYM (rel->r_info);
4820       if (r_symndx < symtab_hdr->sh_info)
4821         h = NULL;
4822       else
4823         h = sym_hashes[r_symndx - symtab_hdr->sh_info];
4824
4825       switch (ELF32_R_TYPE (rel->r_info))
4826         {
4827         case R_BFIN_GOT17M4:
4828         case R_BFIN_GOTHI:
4829         case R_BFIN_GOTLO:
4830         case R_BFIN_FUNCDESC_GOT17M4:
4831         case R_BFIN_FUNCDESC_GOTHI:
4832         case R_BFIN_FUNCDESC_GOTLO:
4833         case R_BFIN_GOTOFF17M4:
4834         case R_BFIN_GOTOFFHI:
4835         case R_BFIN_GOTOFFLO:
4836         case R_BFIN_FUNCDESC_GOTOFF17M4:
4837         case R_BFIN_FUNCDESC_GOTOFFHI:
4838         case R_BFIN_FUNCDESC_GOTOFFLO:
4839         case R_BFIN_FUNCDESC:
4840         case R_BFIN_FUNCDESC_VALUE:
4841           if (! IS_FDPIC (abfd))
4842             goto bad_reloc;
4843           /* Fall through.  */
4844         case R_BFIN_PCREL24:
4845         case R_BFIN_PCREL24_JUMP_L:
4846         case R_BFIN_BYTE4_DATA:
4847           if (IS_FDPIC (abfd) && ! dynobj)
4848             {
4849               elf_hash_table (info)->dynobj = dynobj = abfd;
4850               if (! _bfin_create_got_section (abfd, info))
4851                 return FALSE;
4852             }
4853           if (! IS_FDPIC (abfd))
4854             {
4855               picrel = NULL;
4856               break;
4857             }
4858           if (h != NULL)
4859             {
4860               if (h->dynindx == -1)
4861                 switch (ELF_ST_VISIBILITY (h->other))
4862                   {
4863                   case STV_INTERNAL:
4864                   case STV_HIDDEN:
4865                     break;
4866                   default:
4867                     bfd_elf_link_record_dynamic_symbol (info, h);
4868                     break;
4869                   }
4870               picrel
4871                 = bfinfdpic_relocs_info_for_global (bfinfdpic_relocs_info (info),
4872                                                    abfd, h,
4873                                                    rel->r_addend, INSERT);
4874             }
4875           else
4876             picrel = bfinfdpic_relocs_info_for_local (bfinfdpic_relocs_info
4877                                                      (info), abfd, r_symndx,
4878                                                      rel->r_addend, INSERT);
4879           if (! picrel)
4880             return FALSE;
4881           break;
4882
4883         default:
4884           picrel = NULL;
4885           break;
4886         }
4887
4888       switch (ELF32_R_TYPE (rel->r_info))
4889         {
4890         case R_BFIN_PCREL24:
4891         case R_BFIN_PCREL24_JUMP_L:
4892           if (IS_FDPIC (abfd))
4893             picrel->call++;
4894           break;
4895
4896         case R_BFIN_FUNCDESC_VALUE:
4897           picrel->relocsfdv++;
4898           if (bfd_get_section_flags (abfd, sec) & SEC_ALLOC)
4899             picrel->relocs32--;
4900           /* Fall through.  */
4901
4902         case R_BFIN_BYTE4_DATA:
4903           if (! IS_FDPIC (abfd))
4904             break;
4905
4906           picrel->sym++;
4907           if (bfd_get_section_flags (abfd, sec) & SEC_ALLOC)
4908             picrel->relocs32++;
4909           break;
4910
4911         case R_BFIN_GOT17M4:
4912           picrel->got17m4++;
4913           break;
4914
4915         case R_BFIN_GOTHI:
4916         case R_BFIN_GOTLO:
4917           picrel->gothilo++;
4918           break;
4919
4920         case R_BFIN_FUNCDESC_GOT17M4:
4921           picrel->fdgot17m4++;
4922           break;
4923
4924         case R_BFIN_FUNCDESC_GOTHI:
4925         case R_BFIN_FUNCDESC_GOTLO:
4926           picrel->fdgothilo++;
4927           break;
4928
4929         case R_BFIN_GOTOFF17M4:
4930         case R_BFIN_GOTOFFHI:
4931         case R_BFIN_GOTOFFLO:
4932           picrel->gotoff++;
4933           break;
4934
4935         case R_BFIN_FUNCDESC_GOTOFF17M4:
4936           picrel->fdgoff17m4++;
4937           break;
4938
4939         case R_BFIN_FUNCDESC_GOTOFFHI:
4940         case R_BFIN_FUNCDESC_GOTOFFLO:
4941           picrel->fdgoffhilo++;
4942           break;
4943
4944         case R_BFIN_FUNCDESC:
4945           picrel->fd++;
4946           picrel->relocsfd++;
4947           break;
4948
4949         /* This relocation describes the C++ object vtable hierarchy.
4950            Reconstruct it for later use during GC.  */
4951         case R_BFIN_GNU_VTINHERIT:
4952           if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
4953             return FALSE;
4954           break;
4955
4956         /* This relocation describes which C++ vtable entries are actually
4957            used.  Record for later use during GC.  */
4958         case R_BFIN_GNU_VTENTRY:
4959           BFD_ASSERT (h != NULL);
4960           if (h != NULL
4961               && !bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
4962             return FALSE;
4963           break;
4964
4965         case R_BFIN_HUIMM16:
4966         case R_BFIN_LUIMM16:
4967         case R_BFIN_PCREL12_JUMP_S:
4968         case R_BFIN_PCREL10:
4969           break;
4970
4971         default:
4972         bad_reloc:
4973           (*_bfd_error_handler)
4974             (_("%B: unsupported relocation type %i"),
4975              abfd, ELF32_R_TYPE (rel->r_info));
4976           return FALSE;
4977         }
4978     }
4979
4980   return TRUE;
4981 }
4982
4983 /* Set the right machine number for a Blackfin ELF file.  */
4984
4985 static bfd_boolean
4986 elf32_bfin_object_p (bfd *abfd)
4987 {
4988   bfd_default_set_arch_mach (abfd, bfd_arch_bfin, 0);
4989   return (((elf_elfheader (abfd)->e_flags & EF_BFIN_FDPIC) != 0)
4990           == (IS_FDPIC (abfd)));
4991 }
4992
4993 static bfd_boolean
4994 elf32_bfin_set_private_flags (bfd * abfd, flagword flags)
4995 {
4996   elf_elfheader (abfd)->e_flags = flags;
4997   elf_flags_init (abfd) = TRUE;
4998   return TRUE;
4999 }
5000
5001 /* Copy backend specific data from one object module to another.  */
5002
5003 static bfd_boolean
5004 bfin_elf_copy_private_bfd_data (bfd *ibfd, bfd *obfd)
5005 {
5006   if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
5007       || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
5008     return TRUE;
5009
5010   BFD_ASSERT (!elf_flags_init (obfd)
5011               || elf_elfheader (obfd)->e_flags == elf_elfheader (ibfd)->e_flags);
5012
5013   elf_elfheader (obfd)->e_flags = elf_elfheader (ibfd)->e_flags;
5014   elf_flags_init (obfd) = TRUE;
5015
5016   /* Copy object attributes.  */
5017   _bfd_elf_copy_obj_attributes (ibfd, obfd);
5018
5019   return TRUE;
5020 }
5021
5022 static bfd_boolean
5023 elf32_bfinfdpic_copy_private_bfd_data (bfd *ibfd, bfd *obfd)
5024 {
5025   unsigned i;
5026
5027   if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
5028       || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
5029     return TRUE;
5030
5031   if (! bfin_elf_copy_private_bfd_data (ibfd, obfd))
5032     return FALSE;
5033
5034   if (! elf_tdata (ibfd) || ! elf_tdata (ibfd)->phdr
5035       || ! elf_tdata (obfd) || ! elf_tdata (obfd)->phdr)
5036     return TRUE;
5037
5038   /* Copy the stack size.  */
5039   for (i = 0; i < elf_elfheader (ibfd)->e_phnum; i++)
5040     if (elf_tdata (ibfd)->phdr[i].p_type == PT_GNU_STACK)
5041       {
5042         Elf_Internal_Phdr *iphdr = &elf_tdata (ibfd)->phdr[i];
5043
5044         for (i = 0; i < elf_elfheader (obfd)->e_phnum; i++)
5045           if (elf_tdata (obfd)->phdr[i].p_type == PT_GNU_STACK)
5046             {
5047               memcpy (&elf_tdata (obfd)->phdr[i], iphdr, sizeof (*iphdr));
5048
5049               /* Rewrite the phdrs, since we're only called after they
5050                  were first written.  */
5051               if (bfd_seek (obfd, (bfd_signed_vma) get_elf_backend_data (obfd)
5052                             ->s->sizeof_ehdr, SEEK_SET) != 0
5053                   || get_elf_backend_data (obfd)->s
5054                   ->write_out_phdrs (obfd, elf_tdata (obfd)->phdr,
5055                                      elf_elfheader (obfd)->e_phnum) != 0)
5056                 return FALSE;
5057               break;
5058             }
5059
5060         break;
5061       }
5062
5063   return TRUE;
5064 }
5065
5066
5067 /* Display the flags field.  */
5068 static bfd_boolean
5069 elf32_bfin_print_private_bfd_data (bfd * abfd, PTR ptr)
5070 {
5071   FILE *file = (FILE *) ptr;
5072   flagword flags;
5073
5074   BFD_ASSERT (abfd != NULL && ptr != NULL);
5075
5076   /* Print normal ELF private data.  */
5077   _bfd_elf_print_private_bfd_data (abfd, ptr);
5078
5079   flags = elf_elfheader (abfd)->e_flags;
5080
5081   /* xgettext:c-format */
5082   fprintf (file, _("private flags = %lx:"), elf_elfheader (abfd)->e_flags);
5083
5084   if (flags & EF_BFIN_PIC)
5085     fprintf (file, " -fpic");
5086
5087   if (flags & EF_BFIN_FDPIC)
5088     fprintf (file, " -mfdpic");
5089
5090   fputc ('\n', file);
5091
5092   return TRUE;
5093 }
5094
5095 /* Merge backend specific data from an object file to the output
5096    object file when linking.  */
5097
5098 static bfd_boolean
5099 elf32_bfin_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
5100 {
5101   flagword old_flags, new_flags;
5102   bfd_boolean error = FALSE;
5103
5104   new_flags = elf_elfheader (ibfd)->e_flags;
5105   old_flags = elf_elfheader (obfd)->e_flags;
5106
5107   if (new_flags & EF_BFIN_FDPIC)
5108     new_flags &= ~EF_BFIN_PIC;
5109
5110 #ifdef DEBUG
5111   (*_bfd_error_handler) ("old_flags = 0x%.8lx, new_flags = 0x%.8lx, init = %s, filename = %s",
5112                          old_flags, new_flags, elf_flags_init (obfd) ? "yes" : "no",
5113                          bfd_get_filename (ibfd));
5114 #endif
5115
5116   if (!elf_flags_init (obfd))                   /* First call, no flags set.  */
5117     {
5118       elf_flags_init (obfd) = TRUE;
5119       elf_elfheader (obfd)->e_flags = new_flags;
5120     }
5121
5122   if (((new_flags & EF_BFIN_FDPIC) == 0) != (! IS_FDPIC (obfd)))
5123     {
5124       error = TRUE;
5125       if (IS_FDPIC (obfd))
5126         (*_bfd_error_handler)
5127           (_("%s: cannot link non-fdpic object file into fdpic executable"),
5128            bfd_get_filename (ibfd));
5129       else
5130         (*_bfd_error_handler)
5131           (_("%s: cannot link fdpic object file into non-fdpic executable"),
5132            bfd_get_filename (ibfd));
5133     }
5134
5135   if (error)
5136     bfd_set_error (bfd_error_bad_value);
5137
5138   return !error;
5139 }
5140 \f
5141 /* bfin ELF linker hash entry.  */
5142
5143 struct bfin_link_hash_entry
5144 {
5145   struct elf_link_hash_entry root;
5146
5147   /* Number of PC relative relocs copied for this symbol.  */
5148   struct bfin_pcrel_relocs_copied *pcrel_relocs_copied;
5149 };
5150
5151 /* bfin ELF linker hash table.  */
5152
5153 struct bfin_link_hash_table
5154 {
5155   struct elf_link_hash_table root;
5156
5157   /* Small local sym cache.  */
5158   struct sym_cache sym_cache;
5159 };
5160
5161 #define bfin_hash_entry(ent) ((struct bfin_link_hash_entry *) (ent))
5162
5163 static struct bfd_hash_entry *
5164 bfin_link_hash_newfunc (struct bfd_hash_entry *entry,
5165                         struct bfd_hash_table *table, const char *string)
5166 {
5167   struct bfd_hash_entry *ret = entry;
5168
5169   /* Allocate the structure if it has not already been allocated by a
5170      subclass.  */
5171   if (ret == NULL)
5172     ret = bfd_hash_allocate (table, sizeof (struct bfin_link_hash_entry));
5173   if (ret == NULL)
5174     return ret;
5175
5176   /* Call the allocation method of the superclass.  */
5177   ret = _bfd_elf_link_hash_newfunc (ret, table, string);
5178   if (ret != NULL)
5179     bfin_hash_entry (ret)->pcrel_relocs_copied = NULL;
5180
5181   return ret;
5182 }
5183
5184 /* Create an bfin ELF linker hash table.  */
5185
5186 static struct bfd_link_hash_table *
5187 bfin_link_hash_table_create (bfd * abfd)
5188 {
5189   struct bfin_link_hash_table *ret;
5190   bfd_size_type amt = sizeof (struct bfin_link_hash_table);
5191
5192   ret = bfd_zalloc (abfd, amt);
5193   if (ret == NULL)
5194     return NULL;
5195
5196   if (!_bfd_elf_link_hash_table_init (&ret->root, abfd,
5197                                       bfin_link_hash_newfunc,
5198                                       sizeof (struct elf_link_hash_entry)))
5199     {
5200       free (ret);
5201       return NULL;
5202     }
5203
5204   ret->sym_cache.abfd = NULL;
5205
5206   return &ret->root.root;
5207 }
5208
5209 /* The size in bytes of an entry in the procedure linkage table.  */
5210
5211 /* Finish up the dynamic sections.  */
5212
5213 static bfd_boolean
5214 bfin_finish_dynamic_sections (bfd * output_bfd ATTRIBUTE_UNUSED,
5215                                   struct bfd_link_info *info)
5216 {
5217   bfd *dynobj;
5218   asection *sdyn;
5219
5220   dynobj = elf_hash_table (info)->dynobj;
5221
5222   sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
5223
5224   if (elf_hash_table (info)->dynamic_sections_created)
5225     {
5226       Elf32_External_Dyn *dyncon, *dynconend;
5227
5228       BFD_ASSERT (sdyn != NULL);
5229
5230       dyncon = (Elf32_External_Dyn *) sdyn->contents;
5231       dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
5232       for (; dyncon < dynconend; dyncon++)
5233         {
5234           Elf_Internal_Dyn dyn;
5235
5236           bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
5237
5238         }
5239
5240     }
5241   return TRUE;
5242 }
5243
5244 /* Finish up dynamic symbol handling.  We set the contents of various
5245    dynamic sections here.  */
5246
5247 static bfd_boolean
5248 bfin_finish_dynamic_symbol (bfd * output_bfd,
5249                                 struct bfd_link_info *info,
5250                                 struct elf_link_hash_entry *h,
5251                                 Elf_Internal_Sym * sym)
5252 {
5253   bfd *dynobj;
5254
5255   dynobj = elf_hash_table (info)->dynobj;
5256
5257   if (h->got.offset != (bfd_vma) - 1)
5258     {
5259       asection *sgot;
5260       asection *srela;
5261       Elf_Internal_Rela rela;
5262       bfd_byte *loc;
5263
5264       /* This symbol has an entry in the global offset table.
5265          Set it up.  */
5266
5267       sgot = bfd_get_section_by_name (dynobj, ".got");
5268       srela = bfd_get_section_by_name (dynobj, ".rela.got");
5269       BFD_ASSERT (sgot != NULL && srela != NULL);
5270
5271       rela.r_offset = (sgot->output_section->vma
5272                        + sgot->output_offset
5273                        + (h->got.offset & ~(bfd_vma) 1));
5274
5275       /* If this is a -Bsymbolic link, and the symbol is defined
5276          locally, we just want to emit a RELATIVE reloc.  Likewise if
5277          the symbol was forced to be local because of a version file.
5278          The entry in the global offset table will already have been
5279          initialized in the relocate_section function.  */
5280       if (info->shared
5281           && (info->symbolic
5282               || h->dynindx == -1 || h->forced_local) && h->def_regular)
5283         {
5284           fprintf(stderr, "*** check this relocation %s\n", __FUNCTION__);
5285           rela.r_info = ELF32_R_INFO (0, R_BFIN_PCREL24);
5286           rela.r_addend = bfd_get_signed_32 (output_bfd,
5287                                              (sgot->contents
5288                                               +
5289                                               (h->got.
5290                                                offset & ~(bfd_vma) 1)));
5291         }
5292       else
5293         {
5294           bfd_put_32 (output_bfd, (bfd_vma) 0,
5295                       sgot->contents + (h->got.offset & ~(bfd_vma) 1));
5296           rela.r_info = ELF32_R_INFO (h->dynindx, R_BFIN_GOT);
5297           rela.r_addend = 0;
5298         }
5299
5300       loc = srela->contents;
5301       loc += srela->reloc_count++ * sizeof (Elf32_External_Rela);
5302       bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
5303     }
5304
5305   if (h->needs_copy)
5306     {
5307       BFD_ASSERT (0);
5308     }
5309   /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute.  */
5310   if (strcmp (h->root.root.string, "__DYNAMIC") == 0
5311       || h == elf_hash_table (info)->hgot)
5312     sym->st_shndx = SHN_ABS;
5313
5314   return TRUE;
5315 }
5316
5317 /* Adjust a symbol defined by a dynamic object and referenced by a
5318    regular object.  The current definition is in some section of the
5319    dynamic object, but we're not including those sections.  We have to
5320    change the definition to something the rest of the link can
5321    understand.  */
5322
5323 static bfd_boolean
5324 bfin_adjust_dynamic_symbol (struct bfd_link_info *info,
5325                                 struct elf_link_hash_entry *h)
5326 {
5327   bfd *dynobj;
5328   asection *s;
5329   unsigned int power_of_two;
5330
5331   dynobj = elf_hash_table (info)->dynobj;
5332
5333   /* Make sure we know what is going on here.  */
5334   BFD_ASSERT (dynobj != NULL
5335               && (h->needs_plt
5336                   || h->u.weakdef != NULL
5337                   || (h->def_dynamic && h->ref_regular && !h->def_regular)));
5338
5339   /* If this is a function, put it in the procedure linkage table.  We
5340      will fill in the contents of the procedure linkage table later,
5341      when we know the address of the .got section.  */
5342   if (h->type == STT_FUNC || h->needs_plt)
5343     {
5344       BFD_ASSERT(0);
5345     }
5346
5347   /* If this is a weak symbol, and there is a real definition, the
5348      processor independent code will have arranged for us to see the
5349      real definition first, and we can just use the same value.  */
5350   if (h->u.weakdef != NULL)
5351     {
5352       BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
5353                   || h->u.weakdef->root.type == bfd_link_hash_defweak);
5354       h->root.u.def.section = h->u.weakdef->root.u.def.section;
5355       h->root.u.def.value = h->u.weakdef->root.u.def.value;
5356       return TRUE;
5357     }
5358
5359   /* This is a reference to a symbol defined by a dynamic object which
5360      is not a function.  */
5361
5362   /* If we are creating a shared library, we must presume that the
5363      only references to the symbol are via the global offset table.
5364      For such cases we need not do anything here; the relocations will
5365      be handled correctly by relocate_section.  */
5366   if (info->shared)
5367     return TRUE;
5368
5369   /* We must allocate the symbol in our .dynbss section, which will
5370      become part of the .bss section of the executable.  There will be
5371      an entry for this symbol in the .dynsym section.  The dynamic
5372      object will contain position independent code, so all references
5373      from the dynamic object to this symbol will go through the global
5374      offset table.  The dynamic linker will use the .dynsym entry to
5375      determine the address it must put in the global offset table, so
5376      both the dynamic object and the regular object will refer to the
5377      same memory location for the variable.  */
5378
5379   s = bfd_get_section_by_name (dynobj, ".dynbss");
5380   BFD_ASSERT (s != NULL);
5381
5382   /* We must generate a R_68K_COPY reloc to tell the dynamic linker to
5383      copy the initial value out of the dynamic object and into the
5384      runtime process image.  We need to remember the offset into the
5385      .rela.bss section we are going to use.  */
5386   if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
5387     {
5388       asection *srel;
5389
5390       srel = bfd_get_section_by_name (dynobj, ".rela.bss");
5391       BFD_ASSERT (srel != NULL);
5392       srel->size += sizeof (Elf32_External_Rela);
5393       h->needs_copy = 1;
5394     }
5395
5396   /* We need to figure out the alignment required for this symbol.  I
5397      have no idea how ELF linkers handle this.  */
5398   power_of_two = bfd_log2 (h->size);
5399   if (power_of_two > 3)
5400     power_of_two = 3;
5401
5402   /* Apply the required alignment.  */
5403   s->size = BFD_ALIGN (s->size, (bfd_size_type) (1 << power_of_two));
5404   if (power_of_two > bfd_get_section_alignment (dynobj, s))
5405     {
5406       if (!bfd_set_section_alignment (dynobj, s, power_of_two))
5407         return FALSE;
5408     }
5409
5410   /* Define the symbol as being at this point in the section.  */
5411   h->root.u.def.section = s;
5412   h->root.u.def.value = s->size;
5413
5414   /* Increment the section size to make room for the symbol.  */
5415   s->size += h->size;
5416
5417   return TRUE;
5418 }
5419
5420 /* The bfin linker needs to keep track of the number of relocs that it
5421    decides to copy in check_relocs for each symbol.  This is so that it
5422    can discard PC relative relocs if it doesn't need them when linking
5423    with -Bsymbolic.  We store the information in a field extending the
5424    regular ELF linker hash table.  */
5425
5426 /* This structure keeps track of the number of PC relative relocs we have
5427    copied for a given symbol.  */
5428
5429 struct bfin_pcrel_relocs_copied
5430 {
5431   /* Next section.  */
5432   struct bfin_pcrel_relocs_copied *next;
5433   /* A section in dynobj.  */
5434   asection *section;
5435   /* Number of relocs copied in this section.  */
5436   bfd_size_type count;
5437 };
5438
5439 /* This function is called via elf_link_hash_traverse if we are
5440    creating a shared object.  In the -Bsymbolic case it discards the
5441    space allocated to copy PC relative relocs against symbols which
5442    are defined in regular objects.  For the normal shared case, it
5443    discards space for pc-relative relocs that have become local due to
5444    symbol visibility changes.  We allocated space for them in the
5445    check_relocs routine, but we won't fill them in in the
5446    relocate_section routine.
5447
5448    We also check whether any of the remaining relocations apply
5449    against a readonly section, and set the DF_TEXTREL flag in this
5450    case.  */
5451
5452 static bfd_boolean
5453 bfin_discard_copies (struct elf_link_hash_entry *h, PTR inf)
5454 {
5455   struct bfd_link_info *info = (struct bfd_link_info *) inf;
5456   struct bfin_pcrel_relocs_copied *s;
5457
5458   if (h->root.type == bfd_link_hash_warning)
5459     h = (struct elf_link_hash_entry *) h->root.u.i.link;
5460
5461   if (!h->def_regular || (!info->symbolic && !h->forced_local))
5462     {
5463       if ((info->flags & DF_TEXTREL) == 0)
5464         {
5465           /* Look for relocations against read-only sections.  */
5466           for (s = bfin_hash_entry (h)->pcrel_relocs_copied;
5467                s != NULL; s = s->next)
5468             if ((s->section->flags & SEC_READONLY) != 0)
5469               {
5470                 info->flags |= DF_TEXTREL;
5471                 break;
5472               }
5473         }
5474
5475       return TRUE;
5476     }
5477
5478   for (s = bfin_hash_entry (h)->pcrel_relocs_copied;
5479        s != NULL; s = s->next)
5480     s->section->size -= s->count * sizeof (Elf32_External_Rela);
5481
5482   return TRUE;
5483 }
5484
5485 static bfd_boolean
5486 bfin_size_dynamic_sections (bfd * output_bfd ATTRIBUTE_UNUSED,
5487                                 struct bfd_link_info *info)
5488 {
5489   bfd *dynobj;
5490   asection *s;
5491   bfd_boolean relocs;
5492
5493   dynobj = elf_hash_table (info)->dynobj;
5494   BFD_ASSERT (dynobj != NULL);
5495
5496   if (elf_hash_table (info)->dynamic_sections_created)
5497     {
5498       /* Set the contents of the .interp section to the interpreter.  */
5499       if (info->executable)
5500         {
5501           s = bfd_get_section_by_name (dynobj, ".interp");
5502           BFD_ASSERT (s != NULL);
5503           s->size = sizeof ELF_DYNAMIC_INTERPRETER;
5504           s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
5505         }
5506     }
5507   else
5508     {
5509       /* We may have created entries in the .rela.got section.
5510          However, if we are not creating the dynamic sections, we will
5511          not actually use these entries.  Reset the size of .rela.got,
5512          which will cause it to get stripped from the output file
5513          below.  */
5514       s = bfd_get_section_by_name (dynobj, ".rela.got");
5515       if (s != NULL)
5516         s->size = 0;
5517     }
5518
5519   /* If this is a -Bsymbolic shared link, then we need to discard all
5520      PC relative relocs against symbols defined in a regular object.
5521      For the normal shared case we discard the PC relative relocs
5522      against symbols that have become local due to visibility changes.
5523      We allocated space for them in the check_relocs routine, but we
5524      will not fill them in in the relocate_section routine.  */
5525   if (info->shared)
5526     elf_link_hash_traverse (elf_hash_table (info),
5527                             bfin_discard_copies, (PTR) info);
5528
5529   /* The check_relocs and adjust_dynamic_symbol entry points have
5530      determined the sizes of the various dynamic sections.  Allocate
5531      memory for them.  */
5532   relocs = FALSE;
5533   for (s = dynobj->sections; s != NULL; s = s->next)
5534     {
5535       const char *name;
5536       bfd_boolean strip;
5537
5538       if ((s->flags & SEC_LINKER_CREATED) == 0)
5539         continue;
5540
5541       /* It's OK to base decisions on the section name, because none
5542          of the dynobj section names depend upon the input files.  */
5543       name = bfd_get_section_name (dynobj, s);
5544
5545       strip = FALSE;
5546
5547        if (CONST_STRNEQ (name, ".rela"))
5548         {
5549           if (s->size == 0)
5550             {
5551               /* If we don't need this section, strip it from the
5552                  output file.  This is mostly to handle .rela.bss and
5553                  .rela.plt.  We must create both sections in
5554                  create_dynamic_sections, because they must be created
5555                  before the linker maps input sections to output
5556                  sections.  The linker does that before
5557                  adjust_dynamic_symbol is called, and it is that
5558                  function which decides whether anything needs to go
5559                  into these sections.  */
5560               strip = TRUE;
5561             }
5562           else
5563             {
5564               relocs = TRUE;
5565
5566               /* We use the reloc_count field as a counter if we need
5567                  to copy relocs into the output file.  */
5568               s->reloc_count = 0;
5569             }
5570         }
5571       else if (! CONST_STRNEQ (name, ".got"))
5572         {
5573           /* It's not one of our sections, so don't allocate space.  */
5574           continue;
5575         }
5576
5577       if (strip)
5578         {
5579           s->flags |= SEC_EXCLUDE;
5580           continue;
5581         }
5582
5583       /* Allocate memory for the section contents.  */
5584       /* FIXME: This should be a call to bfd_alloc not bfd_zalloc.
5585          Unused entries should be reclaimed before the section's contents
5586          are written out, but at the moment this does not happen.  Thus in
5587          order to prevent writing out garbage, we initialise the section's
5588          contents to zero.  */
5589       s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->size);
5590       if (s->contents == NULL && s->size != 0)
5591         return FALSE;
5592     }
5593
5594   if (elf_hash_table (info)->dynamic_sections_created)
5595     {
5596       /* Add some entries to the .dynamic section.  We fill in the
5597          values later, in bfin_finish_dynamic_sections, but we
5598          must add the entries now so that we get the correct size for
5599          the .dynamic section.  The DT_DEBUG entry is filled in by the
5600          dynamic linker and used by the debugger.  */
5601 #define add_dynamic_entry(TAG, VAL) \
5602   _bfd_elf_add_dynamic_entry (info, TAG, VAL)
5603
5604       if (!info->shared)
5605         {
5606           if (!add_dynamic_entry (DT_DEBUG, 0))
5607             return FALSE;
5608         }
5609
5610
5611       if (relocs)
5612         {
5613           if (!add_dynamic_entry (DT_RELA, 0)
5614               || !add_dynamic_entry (DT_RELASZ, 0)
5615               || !add_dynamic_entry (DT_RELAENT,
5616                                      sizeof (Elf32_External_Rela)))
5617             return FALSE;
5618         }
5619
5620       if ((info->flags & DF_TEXTREL) != 0)
5621         {
5622           if (!add_dynamic_entry (DT_TEXTREL, 0))
5623             return FALSE;
5624         }
5625     }
5626 #undef add_dynamic_entry
5627
5628   return TRUE;
5629 }
5630 \f
5631 /* Given a .data section and a .emreloc in-memory section, store
5632    relocation information into the .emreloc section which can be
5633    used at runtime to relocate the section.  This is called by the
5634    linker when the --embedded-relocs switch is used.  This is called
5635    after the add_symbols entry point has been called for all the
5636    objects, and before the final_link entry point is called.  */
5637
5638 bfd_boolean bfd_bfin_elf32_create_embedded_relocs
5639   PARAMS ((bfd *, struct bfd_link_info *, asection *, asection *, char **));
5640
5641 bfd_boolean
5642 bfd_bfin_elf32_create_embedded_relocs (
5643      bfd *abfd,
5644      struct bfd_link_info *info,
5645      asection *datasec,
5646      asection *relsec,
5647      char **errmsg)
5648 {
5649   Elf_Internal_Shdr *symtab_hdr;
5650   Elf_Internal_Sym *isymbuf = NULL;
5651   Elf_Internal_Rela *internal_relocs = NULL;
5652   Elf_Internal_Rela *irel, *irelend;
5653   bfd_byte *p;
5654   bfd_size_type amt;
5655
5656   BFD_ASSERT (! info->relocatable);
5657
5658   *errmsg = NULL;
5659
5660   if (datasec->reloc_count == 0)
5661     return TRUE;
5662
5663   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
5664
5665   /* Get a copy of the native relocations.  */
5666   internal_relocs = (_bfd_elf_link_read_relocs
5667                      (abfd, datasec, (PTR) NULL, (Elf_Internal_Rela *) NULL,
5668                       info->keep_memory));
5669   if (internal_relocs == NULL)
5670     goto error_return;
5671
5672   amt = (bfd_size_type) datasec->reloc_count * 12;
5673   relsec->contents = (bfd_byte *) bfd_alloc (abfd, amt);
5674   if (relsec->contents == NULL)
5675     goto error_return;
5676
5677   p = relsec->contents;
5678
5679   irelend = internal_relocs + datasec->reloc_count;
5680   for (irel = internal_relocs; irel < irelend; irel++, p += 12)
5681     {
5682       asection *targetsec;
5683
5684       /* We are going to write a four byte longword into the runtime
5685        reloc section.  The longword will be the address in the data
5686        section which must be relocated.  It is followed by the name
5687        of the target section NUL-padded or truncated to 8
5688        characters.  */
5689
5690       /* We can only relocate absolute longword relocs at run time.  */
5691       if (ELF32_R_TYPE (irel->r_info) != (int) R_BFIN_BYTE4_DATA)
5692         {
5693           *errmsg = _("unsupported reloc type");
5694           bfd_set_error (bfd_error_bad_value);
5695           goto error_return;
5696         }
5697
5698       /* Get the target section referred to by the reloc.  */
5699       if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
5700         {
5701           /* A local symbol.  */
5702           Elf_Internal_Sym *isym;
5703
5704           /* Read this BFD's local symbols if we haven't done so already.  */
5705           if (isymbuf == NULL)
5706             {
5707               isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
5708               if (isymbuf == NULL)
5709                 isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
5710                                                 symtab_hdr->sh_info, 0,
5711                                                 NULL, NULL, NULL);
5712               if (isymbuf == NULL)
5713                 goto error_return;
5714             }
5715
5716           isym = isymbuf + ELF32_R_SYM (irel->r_info);
5717           targetsec = bfd_section_from_elf_index (abfd, isym->st_shndx);
5718         }
5719       else
5720         {
5721           unsigned long indx;
5722           struct elf_link_hash_entry *h;
5723
5724           /* An external symbol.  */
5725           indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
5726           h = elf_sym_hashes (abfd)[indx];
5727           BFD_ASSERT (h != NULL);
5728           if (h->root.type == bfd_link_hash_defined
5729               || h->root.type == bfd_link_hash_defweak)
5730             targetsec = h->root.u.def.section;
5731           else
5732             targetsec = NULL;
5733         }
5734
5735       bfd_put_32 (abfd, irel->r_offset + datasec->output_offset, p);
5736       memset (p + 4, 0, 8);
5737       if (targetsec != NULL)
5738         strncpy ((char *) p + 4, targetsec->output_section->name, 8);
5739     }
5740
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 TRUE;
5747
5748 error_return:
5749   if (isymbuf != NULL && symtab_hdr->contents != (unsigned char *) isymbuf)
5750     free (isymbuf);
5751   if (internal_relocs != NULL
5752       && elf_section_data (datasec)->relocs != internal_relocs)
5753     free (internal_relocs);
5754   return FALSE;
5755 }
5756
5757 struct bfd_elf_special_section const elf32_bfin_special_sections[] =
5758 {
5759   { ".l1.text",         8, -2, SHT_PROGBITS, SHF_ALLOC + SHF_EXECINSTR },
5760   { ".l1.data",         8, -2, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
5761   { NULL,               0,  0, 0,            0 }
5762 };
5763
5764 \f
5765 #define TARGET_LITTLE_SYM               bfd_elf32_bfin_vec
5766 #define TARGET_LITTLE_NAME              "elf32-bfin"
5767 #define ELF_ARCH                        bfd_arch_bfin
5768 #define ELF_MACHINE_CODE                EM_BLACKFIN
5769 #define ELF_MAXPAGESIZE                 0x1000
5770 #define elf_symbol_leading_char         '_'
5771
5772 #define bfd_elf32_bfd_reloc_type_lookup bfin_bfd_reloc_type_lookup
5773 #define bfd_elf32_bfd_reloc_name_lookup \
5774                                         bfin_bfd_reloc_name_lookup
5775 #define elf_info_to_howto               bfin_info_to_howto
5776 #define elf_info_to_howto_rel           0
5777 #define elf_backend_object_p            elf32_bfin_object_p
5778
5779 #define bfd_elf32_bfd_is_local_label_name \
5780                                         bfin_is_local_label_name
5781 #define bfin_hash_table(p) \
5782   ((struct bfin_link_hash_table *) (p)->hash)
5783
5784
5785
5786 #define elf_backend_create_dynamic_sections \
5787                                         _bfd_elf_create_dynamic_sections
5788 #define bfd_elf32_bfd_link_hash_table_create \
5789                                         bfin_link_hash_table_create
5790 #define bfd_elf32_bfd_final_link        bfd_elf_gc_common_final_link
5791
5792 #define elf_backend_check_relocs        bfin_check_relocs
5793 #define elf_backend_adjust_dynamic_symbol \
5794                                         bfin_adjust_dynamic_symbol
5795 #define elf_backend_size_dynamic_sections \
5796                                         bfin_size_dynamic_sections
5797 #define elf_backend_relocate_section    bfin_relocate_section
5798 #define elf_backend_finish_dynamic_symbol \
5799                                         bfin_finish_dynamic_symbol
5800 #define elf_backend_finish_dynamic_sections \
5801                                         bfin_finish_dynamic_sections
5802 #define elf_backend_gc_mark_hook        bfin_gc_mark_hook
5803 #define elf_backend_gc_sweep_hook       bfin_gc_sweep_hook
5804 #define bfd_elf32_bfd_merge_private_bfd_data \
5805                                         elf32_bfin_merge_private_bfd_data
5806 #define bfd_elf32_bfd_set_private_flags \
5807                                         elf32_bfin_set_private_flags
5808 #define bfd_elf32_bfd_print_private_bfd_data \
5809                                         elf32_bfin_print_private_bfd_data
5810 #define elf_backend_reloc_type_class    elf32_bfin_reloc_type_class
5811 #define elf_backend_can_gc_sections 1
5812 #define elf_backend_special_sections    elf32_bfin_special_sections
5813 #define elf_backend_can_refcount 1
5814 #define elf_backend_want_got_plt 0
5815 #define elf_backend_plt_readonly 1
5816 #define elf_backend_want_plt_sym 0
5817 #define elf_backend_got_header_size     12
5818 #define elf_backend_rela_normal         1
5819
5820 #include "elf32-target.h"
5821
5822 #undef TARGET_LITTLE_SYM
5823 #define TARGET_LITTLE_SYM          bfd_elf32_bfinfdpic_vec
5824 #undef TARGET_LITTLE_NAME
5825 #define TARGET_LITTLE_NAME              "elf32-bfinfdpic"
5826 #undef  elf32_bed
5827 #define elf32_bed               elf32_bfinfdpic_bed
5828
5829 #undef elf_backend_gc_sweep_hook
5830 #define elf_backend_gc_sweep_hook       bfinfdpic_gc_sweep_hook
5831
5832 #undef elf_backend_got_header_size
5833 #define elf_backend_got_header_size     0
5834
5835 #undef elf_backend_relocate_section
5836 #define elf_backend_relocate_section    bfinfdpic_relocate_section
5837 #undef elf_backend_check_relocs
5838 #define elf_backend_check_relocs        bfinfdpic_check_relocs
5839
5840 #undef bfd_elf32_bfd_link_hash_table_create
5841 #define bfd_elf32_bfd_link_hash_table_create \
5842                 bfinfdpic_elf_link_hash_table_create
5843 #undef elf_backend_always_size_sections
5844 #define elf_backend_always_size_sections \
5845                 elf32_bfinfdpic_always_size_sections
5846 #undef elf_backend_modify_program_headers
5847 #define elf_backend_modify_program_headers \
5848                 elf32_bfinfdpic_modify_program_headers
5849 #undef bfd_elf32_bfd_copy_private_bfd_data
5850 #define bfd_elf32_bfd_copy_private_bfd_data \
5851                 elf32_bfinfdpic_copy_private_bfd_data
5852
5853 #undef elf_backend_create_dynamic_sections
5854 #define elf_backend_create_dynamic_sections \
5855                 elf32_bfinfdpic_create_dynamic_sections
5856 #undef elf_backend_adjust_dynamic_symbol
5857 #define elf_backend_adjust_dynamic_symbol \
5858                 elf32_bfinfdpic_adjust_dynamic_symbol
5859 #undef elf_backend_size_dynamic_sections
5860 #define elf_backend_size_dynamic_sections \
5861                 elf32_bfinfdpic_size_dynamic_sections
5862 #undef elf_backend_finish_dynamic_symbol
5863 #define elf_backend_finish_dynamic_symbol \
5864                 elf32_bfinfdpic_finish_dynamic_symbol
5865 #undef elf_backend_finish_dynamic_sections
5866 #define elf_backend_finish_dynamic_sections \
5867                 elf32_bfinfdpic_finish_dynamic_sections
5868
5869 #undef elf_backend_discard_info
5870 #define elf_backend_discard_info \
5871                 bfinfdpic_elf_discard_info
5872 #undef elf_backend_can_make_relative_eh_frame
5873 #define elf_backend_can_make_relative_eh_frame \
5874                 bfinfdpic_elf_use_relative_eh_frame
5875 #undef elf_backend_can_make_lsda_relative_eh_frame
5876 #define elf_backend_can_make_lsda_relative_eh_frame \
5877                 bfinfdpic_elf_use_relative_eh_frame
5878 #undef elf_backend_encode_eh_address
5879 #define elf_backend_encode_eh_address \
5880                 bfinfdpic_elf_encode_eh_address
5881
5882 #undef elf_backend_may_use_rel_p
5883 #define elf_backend_may_use_rel_p       1
5884 #undef elf_backend_may_use_rela_p
5885 #define elf_backend_may_use_rela_p      1
5886 /* We use REL for dynamic relocations only.  */
5887 #undef elf_backend_default_use_rela_p
5888 #define elf_backend_default_use_rela_p  1
5889
5890 #undef elf_backend_omit_section_dynsym
5891 #define elf_backend_omit_section_dynsym _bfinfdpic_link_omit_section_dynsym
5892
5893 #include "elf32-target.h"