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