3752d525bbf4724905eb29e2b2d3c4b7d7c314e2
[external/binutils.git] / bfd / elf32-bfin.c
1 /* ADI Blackfin BFD support for 32-bit ELF.
2    Copyright 2005, 2006, 2007 Free Software Foundation, Inc.
3
4    This file is part of BFD, the Binary File Descriptor library.
5
6    This program is free software; you can redistribute it and/or modify
7    it under the terms of the GNU General Public License as published by
8    the Free Software Foundation; either version 3 of the License, or
9    (at your option) any later version.
10
11    This program is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14    GNU General Public License for more details.
15
16    You should have received a copy of the GNU General Public License
17    along with this program; if not, write to the Free Software
18    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
19    MA 02110-1301, USA.  */
20
21 #include "sysdep.h"
22 #include "bfd.h"
23 #include "libbfd.h"
24 #include "elf-bfd.h"
25 #include "elf/bfin.h"
26 #include "dwarf2.h"
27 #include "hashtab.h"
28
29 /* FUNCTION : bfin_pltpc_reloc
30    ABSTRACT : TODO : figure out how to handle pltpc relocs.  */
31 static bfd_reloc_status_type
32 bfin_pltpc_reloc (
33      bfd *abfd ATTRIBUTE_UNUSED,
34      arelent *reloc_entry ATTRIBUTE_UNUSED,
35      asymbol *symbol ATTRIBUTE_UNUSED,
36      PTR data ATTRIBUTE_UNUSED,
37      asection *input_section ATTRIBUTE_UNUSED,
38      bfd *output_bfd ATTRIBUTE_UNUSED,
39      char **error_message ATTRIBUTE_UNUSED)
40 {
41   bfd_reloc_status_type flag = bfd_reloc_ok;
42   return flag;
43 }
44 \f
45
46 static bfd_reloc_status_type
47 bfin_pcrel24_reloc (bfd *abfd,
48                     arelent *reloc_entry,
49                     asymbol *symbol,
50                     PTR data,
51                     asection *input_section,
52                     bfd *output_bfd,
53                     char **error_message ATTRIBUTE_UNUSED)
54 {
55   bfd_vma relocation;
56   bfd_size_type addr = reloc_entry->address;
57   bfd_vma output_base = 0;
58   reloc_howto_type *howto = reloc_entry->howto;
59   asection *output_section;
60   bfd_boolean relocatable = (output_bfd != NULL);
61
62   if (reloc_entry->address > bfd_get_section_limit (abfd, input_section))
63     return bfd_reloc_outofrange;
64
65   if (bfd_is_und_section (symbol->section)
66       && (symbol->flags & BSF_WEAK) == 0
67       && !relocatable)
68     return bfd_reloc_undefined;
69
70   if (bfd_is_com_section (symbol->section))
71     relocation = 0;
72   else
73     relocation = symbol->value;
74
75   output_section = symbol->section->output_section;
76
77   if (relocatable)
78     output_base = 0;
79   else
80     output_base = output_section->vma;
81
82   if (!relocatable || !strcmp (symbol->name, symbol->section->name))
83     relocation += output_base + symbol->section->output_offset;
84
85   if (!relocatable && !strcmp (symbol->name, symbol->section->name))
86     relocation += reloc_entry->addend;
87
88   relocation -= input_section->output_section->vma + input_section->output_offset;
89   relocation -= reloc_entry->address;
90
91   if (howto->complain_on_overflow != complain_overflow_dont)
92     {
93       bfd_reloc_status_type status;
94       status = bfd_check_overflow (howto->complain_on_overflow,
95                                    howto->bitsize,
96                                    howto->rightshift,
97                                    bfd_arch_bits_per_address(abfd),
98                                    relocation);
99       if (status != bfd_reloc_ok)
100         return status;
101     }
102
103   /* if rightshift is 1 and the number odd, return error.  */
104   if (howto->rightshift && (relocation & 0x01))
105     {
106       fprintf(stderr, "relocation should be even number\n");
107       return bfd_reloc_overflow;
108     }
109
110   relocation >>= (bfd_vma) howto->rightshift;
111   /* Shift everything up to where it's going to be used.  */
112
113   relocation <<= (bfd_vma) howto->bitpos;
114
115   if (relocatable)
116     {
117       reloc_entry->address += input_section->output_offset;
118       reloc_entry->addend += symbol->section->output_offset;
119     }
120
121   {
122     short x;
123
124     /* We are getting reloc_entry->address 2 byte off from
125        the start of instruction. Assuming absolute postion
126        of the reloc data. But, following code had been written assuming
127        reloc address is starting at begining of instruction.
128        To compensate that I have increased the value of
129        relocation by 1 (effectively 2) and used the addr -2 instead of addr.  */
130
131     relocation += 1;
132     x = bfd_get_16 (abfd, (bfd_byte *) data + addr - 2);
133     x = (x & 0xff00) | ((relocation >> 16) & 0xff);
134     bfd_put_16 (abfd, x, (unsigned char *) data + addr - 2);
135
136     x = bfd_get_16 (abfd, (bfd_byte *) data + addr);
137     x = relocation & 0xFFFF;
138     bfd_put_16 (abfd, x, (unsigned char *) data + addr );
139   }
140   return bfd_reloc_ok;
141 }
142
143 static bfd_reloc_status_type
144 bfin_imm16_reloc (bfd *abfd,
145                   arelent *reloc_entry,
146                   asymbol *symbol,
147                   PTR data,
148                   asection *input_section,
149                   bfd *output_bfd,
150                   char **error_message ATTRIBUTE_UNUSED)
151 {
152   bfd_vma relocation, x;
153   bfd_size_type reloc_addr = reloc_entry->address;
154   bfd_vma output_base = 0;
155   reloc_howto_type *howto = reloc_entry->howto;
156   asection *output_section;
157   bfd_boolean relocatable = (output_bfd != NULL);
158
159   /* Is the address of the relocation really within the section?  */
160   if (reloc_entry->address > bfd_get_section_limit (abfd, input_section))
161     return bfd_reloc_outofrange;
162
163   if (bfd_is_und_section (symbol->section)
164       && (symbol->flags & BSF_WEAK) == 0
165       && !relocatable)
166     return bfd_reloc_undefined;
167
168   output_section = symbol->section->output_section;
169   relocation = symbol->value;
170
171   /* Convert input-section-relative symbol value to absolute.  */
172   if (relocatable)
173     output_base = 0;
174   else
175     output_base = output_section->vma;
176
177   if (!relocatable || !strcmp (symbol->name, symbol->section->name))
178     relocation += output_base + symbol->section->output_offset;
179
180   /* Add in supplied addend.  */
181   relocation += reloc_entry->addend;
182
183   if (relocatable)
184     {
185       reloc_entry->address += input_section->output_offset;
186       reloc_entry->addend += symbol->section->output_offset;
187     }
188   else
189     {
190       reloc_entry->addend = 0;
191     }
192
193   if (howto->complain_on_overflow != complain_overflow_dont)
194     {
195       bfd_reloc_status_type flag;
196       flag = bfd_check_overflow (howto->complain_on_overflow,
197                                  howto->bitsize,
198                                  howto->rightshift,
199                                  bfd_arch_bits_per_address(abfd),
200                                  relocation);
201       if (flag != bfd_reloc_ok)
202         return flag;
203     }
204
205   /* Here the variable relocation holds the final address of the
206      symbol we are relocating against, plus any addend.  */
207
208   relocation >>= (bfd_vma) howto->rightshift;
209   x = relocation;
210   bfd_put_16 (abfd, x, (unsigned char *) data + reloc_addr);
211   return bfd_reloc_ok;
212 }
213
214
215 static bfd_reloc_status_type
216 bfin_byte4_reloc (bfd *abfd,
217                   arelent *reloc_entry,
218                   asymbol *symbol,
219                   PTR data,
220                   asection *input_section,
221                   bfd *output_bfd,
222                   char **error_message ATTRIBUTE_UNUSED)
223 {
224   bfd_vma relocation, x;
225   bfd_size_type addr = reloc_entry->address;
226   bfd_vma output_base = 0;
227   asection *output_section;
228   bfd_boolean relocatable = (output_bfd != NULL);
229
230   /* Is the address of the relocation really within the section?  */
231   if (reloc_entry->address > bfd_get_section_limit (abfd, input_section))
232     return bfd_reloc_outofrange;
233
234   if (bfd_is_und_section (symbol->section)
235       && (symbol->flags & BSF_WEAK) == 0
236       && !relocatable)
237     return bfd_reloc_undefined;
238
239   output_section = symbol->section->output_section;
240   relocation = symbol->value;
241   /* Convert input-section-relative symbol value to absolute.  */
242   if (relocatable)
243     output_base = 0;
244   else
245     output_base = output_section->vma;
246
247   if ((symbol->name
248        && symbol->section->name
249        && !strcmp (symbol->name, symbol->section->name))
250       || !relocatable)
251     {
252       relocation += output_base + symbol->section->output_offset;
253     }
254
255   relocation += reloc_entry->addend;
256
257   if (relocatable)
258     {
259       /* This output will be relocatable ... like ld -r. */
260       reloc_entry->address += input_section->output_offset;
261       reloc_entry->addend += symbol->section->output_offset;
262     }
263   else
264     {
265       reloc_entry->addend = 0;
266     }
267
268   /* Here the variable relocation holds the final address of the
269      symbol we are relocating against, plus any addend.  */
270   x = relocation & 0xFFFF0000;
271   x >>=16;
272   bfd_put_16 (abfd, x, (unsigned char *) data + addr + 2);
273
274   x = relocation & 0x0000FFFF;
275   bfd_put_16 (abfd, x, (unsigned char *) data + addr);
276   return bfd_reloc_ok;
277 }
278
279 /* bfin_bfd_reloc handles the blackfin arithmetic relocations.
280    Use this instead of bfd_perform_relocation.  */
281 static bfd_reloc_status_type
282 bfin_bfd_reloc (bfd *abfd,
283                 arelent *reloc_entry,
284                 asymbol *symbol,
285                 PTR data,
286                 asection *input_section,
287                 bfd *output_bfd,
288                 char **error_message ATTRIBUTE_UNUSED)
289 {
290   bfd_vma relocation;
291   bfd_size_type addr = reloc_entry->address;
292   bfd_vma output_base = 0;
293   reloc_howto_type *howto = reloc_entry->howto;
294   asection *output_section;
295   bfd_boolean relocatable = (output_bfd != NULL);
296
297   /* Is the address of the relocation really within the section?  */
298   if (reloc_entry->address > bfd_get_section_limit (abfd, input_section))
299     return bfd_reloc_outofrange;
300
301   if (bfd_is_und_section (symbol->section)
302       && (symbol->flags & BSF_WEAK) == 0
303       && !relocatable)
304     return bfd_reloc_undefined;
305
306   /* Get symbol value.  (Common symbols are special.)  */
307   if (bfd_is_com_section (symbol->section))
308     relocation = 0;
309   else
310     relocation = symbol->value;
311
312   output_section = symbol->section->output_section;
313
314   /* Convert input-section-relative symbol value to absolute.  */
315   if (relocatable)
316     output_base = 0;
317   else
318     output_base = output_section->vma;
319
320   if (!relocatable || !strcmp (symbol->name, symbol->section->name))
321     relocation += output_base + symbol->section->output_offset;
322
323   if (!relocatable && !strcmp (symbol->name, symbol->section->name))
324     {
325       /* Add in supplied addend.  */
326       relocation += reloc_entry->addend;
327     }
328
329   /* Here the variable relocation holds the final address of the
330      symbol we are relocating against, plus any addend.  */
331
332   if (howto->pc_relative == TRUE)
333     {
334       relocation -= input_section->output_section->vma + input_section->output_offset;
335
336       if (howto->pcrel_offset == TRUE)
337         relocation -= reloc_entry->address;
338     }
339
340   if (relocatable)
341     {
342       reloc_entry->address += input_section->output_offset;
343       reloc_entry->addend += symbol->section->output_offset;
344     }
345
346   if (howto->complain_on_overflow != complain_overflow_dont)
347     {
348       bfd_reloc_status_type status;
349
350       status = bfd_check_overflow (howto->complain_on_overflow,
351                                   howto->bitsize,
352                                   howto->rightshift,
353                                   bfd_arch_bits_per_address(abfd),
354                                   relocation);
355       if (status != bfd_reloc_ok)
356         return status;
357     }
358
359   /* If rightshift is 1 and the number odd, return error.  */
360   if (howto->rightshift && (relocation & 0x01))
361     {
362       fprintf(stderr, "relocation should be even number\n");
363       return bfd_reloc_overflow;
364     }
365
366   relocation >>= (bfd_vma) howto->rightshift;
367
368   /* Shift everything up to where it's going to be used.  */
369
370   relocation <<= (bfd_vma) howto->bitpos;
371
372 #define DOIT(x)                                                         \
373   x = ( (x & ~howto->dst_mask) | (relocation & howto->dst_mask))
374
375   /* handle 8 and 16 bit relocations here. */
376   switch (howto->size)
377     {
378     case 0:
379       {
380         char x = bfd_get_8 (abfd, (char *) data + addr);
381         DOIT (x);
382         bfd_put_8 (abfd, x, (unsigned char *) data + addr);
383       }
384       break;
385
386     case 1:
387       {
388         unsigned short x = bfd_get_16 (abfd, (bfd_byte *) data + addr);
389         DOIT (x);
390         bfd_put_16 (abfd, (bfd_vma) x, (unsigned char *) data + addr);
391       }
392       break;
393
394     default:
395       return bfd_reloc_other;
396     }
397
398   return bfd_reloc_ok;
399 }
400
401 /* HOWTO Table for blackfin.
402    Blackfin relocations are fairly complicated.
403    Some of the salient features are
404    a. Even numbered offsets. A number of (not all) relocations are
405       even numbered. This means that the rightmost bit is not stored.
406       Needs to right shift by 1 and check to see if value is not odd
407    b. A relocation can be an expression. An expression takes on
408       a variety of relocations arranged in a stack.
409    As a result, we cannot use the standard generic function as special
410    function. We will have our own, which is very similar to the standard
411    generic function except that it understands how to get the value from
412    the relocation stack. .  */
413
414 #define BFIN_RELOC_MIN 0
415 #define BFIN_RELOC_MAX 0x21
416 #define BFIN_GNUEXT_RELOC_MIN 0x40
417 #define BFIN_GNUEXT_RELOC_MAX 0x43
418 #define BFIN_ARELOC_MIN 0xE0
419 #define BFIN_ARELOC_MAX 0xF3
420
421 static reloc_howto_type bfin_howto_table [] =
422 {
423   /* This reloc does nothing. .  */
424   HOWTO (R_BFIN_UNUSED0,        /* type.  */
425          0,                     /* rightshift.  */
426          2,                     /* size (0 = byte, 1 = short, 2 = long).  */
427          32,                    /* bitsize.  */
428          FALSE,                 /* pc_relative.  */
429          0,                     /* bitpos.  */
430          complain_overflow_bitfield, /* complain_on_overflow.  */
431          bfd_elf_generic_reloc, /* special_function.  */
432          "R_BFIN_UNUSED0",      /* name.  */
433          FALSE,                 /* partial_inplace.  */
434          0,                     /* src_mask.  */
435          0,                     /* dst_mask.  */
436          FALSE),                /* pcrel_offset.  */
437
438   HOWTO (R_BFIN_PCREL5M2,       /* type.  */
439          1,                     /* rightshift.  */
440          1,                     /* size (0 = byte, 1 = short, 2 = long)..  */
441          4,                     /* bitsize.  */
442          TRUE,                  /* pc_relative.  */
443          0,                     /* bitpos.  */
444          complain_overflow_unsigned, /* complain_on_overflow.  */
445          bfin_bfd_reloc,        /* special_function.  */
446          "R_BFIN_PCREL5M2",     /* name.  */
447          FALSE,                 /* partial_inplace.  */
448          0,                     /* src_mask.  */
449          0x0000000F,            /* dst_mask.  */
450          FALSE),                /* pcrel_offset.  */
451
452   HOWTO (R_BFIN_UNUSED1,        /* type.  */
453          0,                     /* rightshift.  */
454          2,                     /* size (0 = byte, 1 = short, 2 = long).  */
455          32,                    /* bitsize.  */
456          FALSE,                 /* pc_relative.  */
457          0,                     /* bitpos.  */
458          complain_overflow_bitfield, /* complain_on_overflow.  */
459          bfd_elf_generic_reloc, /* special_function.  */
460          "R_BFIN_UNUSED1",      /* name.  */
461          FALSE,                 /* partial_inplace.  */
462          0,                     /* src_mask.  */
463          0,                     /* dst_mask.  */
464          FALSE),                /* pcrel_offset.  */
465
466   HOWTO (R_BFIN_PCREL10,        /* type.  */
467          1,                     /* rightshift.  */
468          1,                     /* size (0 = byte, 1 = short, 2 = long).  */
469          10,                    /* bitsize.  */
470          TRUE,                  /* pc_relative.  */
471          0,                     /* bitpos.  */
472          complain_overflow_signed, /* complain_on_overflow.  */
473          bfin_bfd_reloc,        /* special_function.  */
474          "R_BFIN_PCREL10",      /* name.  */
475          FALSE,                 /* partial_inplace.  */
476          0,                     /* src_mask.  */
477          0x000003FF,            /* dst_mask.  */
478          TRUE),                 /* pcrel_offset.  */
479
480   HOWTO (R_BFIN_PCREL12_JUMP,   /* type.  */
481          1,                     /* rightshift.  */
482                                 /* the offset is actually 13 bit
483                                    aligned on a word boundary so
484                                    only 12 bits have to be used.
485                                    Right shift the rightmost bit..  */
486          1,                     /* size (0 = byte, 1 = short, 2 = long).  */
487          12,                    /* bitsize.  */
488          TRUE,                  /* pc_relative.  */
489          0,                     /* bitpos.  */
490          complain_overflow_signed, /* complain_on_overflow.  */
491          bfin_bfd_reloc,        /* special_function.  */
492          "R_BFIN_PCREL12_JUMP", /* name.  */
493          FALSE,                 /* partial_inplace.  */
494          0,                     /* src_mask.  */
495          0x0FFF,                /* dst_mask.  */
496          TRUE),                 /* pcrel_offset.  */
497
498   HOWTO (R_BFIN_RIMM16,         /* type.  */
499          0,                     /* rightshift.  */
500          1,                     /* size (0 = byte, 1 = short, 2 = long).  */
501          16,                    /* bitsize.  */
502          FALSE,                 /* pc_relative.  */
503          0,                     /* bitpos.  */
504          complain_overflow_signed, /* complain_on_overflow.  */
505          bfin_imm16_reloc,      /* special_function.  */
506          "R_BFIN_RIMM16",       /* name.  */
507          FALSE,                 /* partial_inplace.  */
508          0,                     /* src_mask.  */
509          0x0000FFFF,            /* dst_mask.  */
510          TRUE),                 /* pcrel_offset.  */
511
512   HOWTO (R_BFIN_LUIMM16,        /* type.  */
513          0,                     /* rightshift.  */
514          1,                     /* size (0 = byte, 1 = short, 2 = long).  */
515          16,                    /* bitsize.  */
516          FALSE,                 /* pc_relative.  */
517          0,                     /* bitpos.  */
518          complain_overflow_dont, /* complain_on_overflow.  */
519          bfin_imm16_reloc,      /* special_function.  */
520          "R_BFIN_LUIMM16",      /* name.  */
521          FALSE,                 /* partial_inplace.  */
522          0,                     /* src_mask.  */
523          0x0000FFFF,            /* dst_mask.  */
524          TRUE),                 /* pcrel_offset.  */
525
526   HOWTO (R_BFIN_HUIMM16,        /* type.  */
527          16,                    /* rightshift.  */
528          1,                     /* size (0 = byte, 1 = short, 2 = long).  */
529          16,                    /* bitsize.  */
530          FALSE,                 /* pc_relative.  */
531          0,                     /* bitpos.  */
532          complain_overflow_unsigned, /* complain_on_overflow.  */
533          bfin_imm16_reloc,      /* special_function.  */
534          "R_BFIN_HUIMM16",      /* name.  */
535          FALSE,                 /* partial_inplace.  */
536          0,                     /* src_mask.  */
537          0x0000FFFF,            /* dst_mask.  */
538          TRUE),                 /* pcrel_offset.  */
539
540   HOWTO (R_BFIN_PCREL12_JUMP_S, /* type.  */
541          1,                     /* rightshift.  */
542          1,                     /* size (0 = byte, 1 = short, 2 = long).  */
543          12,                    /* bitsize.  */
544          TRUE,                  /* pc_relative.  */
545          0,                     /* bitpos.  */
546          complain_overflow_signed, /* complain_on_overflow.  */
547          bfin_bfd_reloc,        /* special_function.  */
548          "R_BFIN_PCREL12_JUMP_S", /* name.  */
549          FALSE,                 /* partial_inplace.  */
550          0,                     /* src_mask.  */
551          0x00000FFF,            /* dst_mask.  */
552          TRUE),                 /* pcrel_offset.  */
553
554   HOWTO (R_BFIN_PCREL24_JUMP_X, /* type.  */
555          1,                     /* rightshift.  */
556          2,                     /* size (0 = byte, 1 = short, 2 = long).  */
557          24,                    /* bitsize.  */
558          TRUE,                  /* pc_relative.  */
559          0,                     /* bitpos.  */
560          complain_overflow_signed, /* complain_on_overflow.  */
561          bfin_pcrel24_reloc,    /* special_function.  */
562         "R_BFIN_PCREL24_JUMP_X", /* name.  */
563          FALSE,                 /* partial_inplace.  */
564          0,                     /* src_mask.  */
565          0x00FFFFFF,            /* dst_mask.  */
566          TRUE),                 /* pcrel_offset.  */
567
568   HOWTO (R_BFIN_PCREL24,        /* type.  */
569          1,                     /* rightshift.  */
570          2,                     /* size (0 = byte, 1 = short, 2 = long).  */
571          24,                    /* bitsize.  */
572          TRUE,                  /* pc_relative.  */
573          0,                     /* bitpos.  */
574          complain_overflow_signed, /* complain_on_overflow.  */
575          bfin_pcrel24_reloc,    /* special_function.  */
576          "R_BFIN_PCREL24",      /* name.  */
577          FALSE,                 /* partial_inplace.  */
578          0,                     /* src_mask.  */
579          0x00FFFFFF,            /* dst_mask.  */
580          TRUE),                 /* pcrel_offset.  */
581
582   HOWTO (R_BFIN_UNUSEDB,        /* type.  */
583          0,                     /* rightshift.  */
584          2,                     /* size (0 = byte, 1 = short, 2 = long).  */
585          32,                    /* bitsize.  */
586          FALSE,                 /* pc_relative.  */
587          0,                     /* bitpos.  */
588          complain_overflow_dont, /* complain_on_overflow.  */
589          bfd_elf_generic_reloc, /* special_function.  */
590          "R_BFIN_UNUSEDB",      /* name.  */
591          FALSE,                 /* partial_inplace.  */
592          0,                     /* src_mask.  */
593          0,                     /* dst_mask.  */
594          FALSE),                /* pcrel_offset.  */
595
596   HOWTO (R_BFIN_UNUSEDC,        /* type.  */
597          0,                     /* rightshift.  */
598          2,                     /* size (0 = byte, 1 = short, 2 = long).  */
599          32,                    /* bitsize.  */
600          FALSE,                 /* pc_relative.  */
601          0,                     /* bitpos.  */
602          complain_overflow_dont, /* complain_on_overflow.  */
603          bfd_elf_generic_reloc, /* special_function.  */
604          "R_BFIN_UNUSEDC",      /* name.  */
605          FALSE,                 /* partial_inplace.  */
606          0,                     /* src_mask.  */
607          0,                     /* dst_mask.  */
608          FALSE),                /* pcrel_offset.  */
609
610   HOWTO (R_BFIN_PCREL24_JUMP_L, /* type.  */
611          1,                     /* rightshift.  */
612          2,                     /* size (0 = byte, 1 = short, 2 = long).  */
613          24,                    /* bitsize.  */
614          TRUE,                  /* pc_relative.  */
615          0,                     /* bitpos.  */
616          complain_overflow_signed, /* complain_on_overflow.  */
617          bfin_pcrel24_reloc,    /* special_function.  */
618          "R_BFIN_PCREL24_JUMP_L", /* name.  */
619          FALSE,                 /* partial_inplace.  */
620          0,                     /* src_mask.  */
621          0x00FFFFFF,            /* dst_mask.  */
622          TRUE),                 /* pcrel_offset.  */
623
624   HOWTO (R_BFIN_PCREL24_CALL_X, /* type.  */
625          1,                     /* rightshift.  */
626          2,                     /* size (0 = byte, 1 = short, 2 = long).  */
627          24,                    /* bitsize.  */
628          TRUE,                  /* pc_relative.  */
629          0,                     /* bitpos.  */
630          complain_overflow_signed, /* complain_on_overflow.  */
631          bfin_pcrel24_reloc,    /* special_function.  */
632          "R_BFIN_PCREL24_CALL_X", /* name.  */
633          FALSE,                 /* partial_inplace.  */
634          0,                     /* src_mask.  */
635          0x00FFFFFF,            /* dst_mask.  */
636          TRUE),                 /* pcrel_offset.  */
637
638   HOWTO (R_BFIN_VAR_EQ_SYMB,    /* type.  */
639          0,                     /* rightshift.  */
640          2,                     /* size (0 = byte, 1 = short, 2 = long).  */
641          32,                    /* bitsize.  */
642          FALSE,                 /* pc_relative.  */
643          0,                     /* bitpos.  */
644          complain_overflow_bitfield, /* complain_on_overflow.  */
645          bfin_bfd_reloc,        /* special_function.  */
646          "R_BFIN_VAR_EQ_SYMB",  /* name.  */
647          FALSE,                 /* partial_inplace.  */
648          0,                     /* src_mask.  */
649          0,                     /* dst_mask.  */
650          FALSE),                /* pcrel_offset.  */
651
652   HOWTO (R_BFIN_BYTE_DATA,      /* type.  */
653          0,                     /* rightshift.  */
654          0,                     /* size (0 = byte, 1 = short, 2 = long).  */
655          8,                     /* bitsize.  */
656          FALSE,                 /* pc_relative.  */
657          0,                     /* bitpos.  */
658          complain_overflow_unsigned, /* complain_on_overflow.  */
659          bfin_bfd_reloc,        /* special_function.  */
660          "R_BFIN_BYTE_DATA",    /* name.  */
661          FALSE,                 /* partial_inplace.  */
662          0,                     /* src_mask.  */
663          0xFF,                  /* dst_mask.  */
664          TRUE),                 /* pcrel_offset.  */
665
666   HOWTO (R_BFIN_BYTE2_DATA,     /* type.  */
667          0,                     /* rightshift.  */
668          1,                     /* size (0 = byte, 1 = short, 2 = long).  */
669          16,                    /* bitsize.  */
670          FALSE,                 /* pc_relative.  */
671          0,                     /* bitpos.  */
672          complain_overflow_signed, /* complain_on_overflow.  */
673          bfin_bfd_reloc,        /* special_function.  */
674          "R_BFIN_BYTE2_DATA",   /* name.  */
675          FALSE,                 /* partial_inplace.  */
676          0,                     /* src_mask.  */
677          0xFFFF,                /* dst_mask.  */
678          TRUE),                 /* pcrel_offset.  */
679
680   HOWTO (R_BFIN_BYTE4_DATA,     /* type.  */
681          0,                     /* rightshift.  */
682          2,                     /* size (0 = byte, 1 = short, 2 = long).  */
683          32,                    /* bitsize.  */
684          FALSE,                 /* pc_relative.  */
685          0,                     /* bitpos.  */
686          complain_overflow_unsigned, /* complain_on_overflow.  */
687          bfin_byte4_reloc,      /* special_function.  */
688          "R_BFIN_BYTE4_DATA",   /* name.  */
689          FALSE,                 /* partial_inplace.  */
690          0,                     /* src_mask.  */
691          0xFFFFFFFF,            /* dst_mask.  */
692          TRUE),                 /* pcrel_offset.  */
693
694   HOWTO (R_BFIN_PCREL11,        /* type.  */
695          1,                     /* rightshift.  */
696          1,                     /* size (0 = byte, 1 = short, 2 = long).  */
697          10,                    /* bitsize.  */
698          TRUE,                  /* pc_relative.  */
699          0,                     /* bitpos.  */
700          complain_overflow_unsigned, /* complain_on_overflow.  */
701          bfin_bfd_reloc,        /* special_function.  */
702          "R_BFIN_PCREL11",      /* name.  */
703          FALSE,                 /* partial_inplace.  */
704          0,                     /* src_mask.  */
705          0x000003FF,            /* dst_mask.  */
706          FALSE),                /* pcrel_offset.  */
707
708
709   /* A 18-bit signed operand with the GOT offset for the address of
710      the symbol.  */
711   HOWTO (R_BFIN_GOT17M4,        /* type */
712          2,                     /* rightshift */
713          1,                     /* size (0 = byte, 1 = short, 2 = long) */
714          16,                    /* bitsize */
715          FALSE,                 /* pc_relative */
716          0,                     /* bitpos */
717          complain_overflow_signed, /* complain_on_overflow */
718          bfd_elf_generic_reloc, /* special_function */
719          "R_BFIN_GOT17M4",      /* name */
720          FALSE,                 /* partial_inplace */
721          0xffff,                /* src_mask */
722          0xffff,                /* dst_mask */
723          FALSE),                /* pcrel_offset */
724
725   /* The upper 16 bits of the GOT offset for the address of the
726      symbol.  */
727   HOWTO (R_BFIN_GOTHI,          /* type */
728          0,                     /* rightshift */
729          1,                     /* size (0 = byte, 1 = short, 2 = long) */
730          16,                    /* bitsize */
731          FALSE,                 /* pc_relative */
732          0,                     /* bitpos */
733          complain_overflow_dont, /* complain_on_overflow */
734          bfd_elf_generic_reloc, /* special_function */
735          "R_BFIN_GOTHI",                /* name */
736          FALSE,                 /* partial_inplace */
737          0xffff,                        /* src_mask */
738          0xffff,                /* dst_mask */
739          FALSE),                /* pcrel_offset */
740
741   /* The lower 16 bits of the GOT offset for the address of the
742      symbol.  */
743   HOWTO (R_BFIN_GOTLO,          /* type */
744          0,                     /* rightshift */
745          1,                     /* size (0 = byte, 1 = short, 2 = long) */
746          16,                    /* bitsize */
747          FALSE,                 /* pc_relative */
748          0,                     /* bitpos */
749          complain_overflow_dont, /* complain_on_overflow */
750          bfd_elf_generic_reloc, /* special_function */
751          "R_BFIN_GOTLO",                /* name */
752          FALSE,                 /* partial_inplace */
753          0xffff,                /* src_mask */
754          0xffff,                /* dst_mask */
755          FALSE),                /* pcrel_offset */
756
757   /* The 32-bit address of the canonical descriptor of a function.  */
758   HOWTO (R_BFIN_FUNCDESC,       /* type */
759          0,                     /* rightshift */
760          2,                     /* size (0 = byte, 1 = short, 2 = long) */
761          32,                    /* bitsize */
762          FALSE,                 /* pc_relative */
763          0,                     /* bitpos */
764          complain_overflow_bitfield, /* complain_on_overflow */
765          bfd_elf_generic_reloc, /* special_function */
766          "R_BFIN_FUNCDESC",     /* name */
767          FALSE,                 /* partial_inplace */
768          0xffffffff,            /* src_mask */
769          0xffffffff,            /* dst_mask */
770          FALSE),                /* pcrel_offset */
771
772   /* A 12-bit signed operand with the GOT offset for the address of
773      canonical descriptor of a function.  */
774   HOWTO (R_BFIN_FUNCDESC_GOT17M4,       /* type */
775          2,                     /* rightshift */
776          1,                     /* size (0 = byte, 1 = short, 2 = long) */
777          16,                    /* bitsize */
778          FALSE,                 /* pc_relative */
779          0,                     /* bitpos */
780          complain_overflow_signed, /* complain_on_overflow */
781          bfd_elf_generic_reloc, /* special_function */
782          "R_BFIN_FUNCDESC_GOT17M4", /* name */
783          FALSE,                 /* partial_inplace */
784          0xffff,                /* src_mask */
785          0xffff,                /* dst_mask */
786          FALSE),                /* pcrel_offset */
787
788   /* The upper 16 bits of the GOT offset for the address of the
789      canonical descriptor of a function.  */
790   HOWTO (R_BFIN_FUNCDESC_GOTHI, /* type */
791          0,                     /* rightshift */
792          1,                     /* size (0 = byte, 1 = short, 2 = long) */
793          16,                    /* bitsize */
794          FALSE,                 /* pc_relative */
795          0,                     /* bitpos */
796          complain_overflow_dont, /* complain_on_overflow */
797          bfd_elf_generic_reloc, /* special_function */
798          "R_BFIN_FUNCDESC_GOTHI", /* name */
799          FALSE,                 /* partial_inplace */
800          0xffff,                /* src_mask */
801          0xffff,                /* dst_mask */
802          FALSE),                /* pcrel_offset */
803
804   /* The lower 16 bits of the GOT offset for the address of the
805      canonical descriptor of a function.  */
806   HOWTO (R_BFIN_FUNCDESC_GOTLO, /* type */
807          0,                     /* rightshift */
808          1,                     /* size (0 = byte, 1 = short, 2 = long) */
809          16,                    /* bitsize */
810          FALSE,                 /* pc_relative */
811          0,                     /* bitpos */
812          complain_overflow_dont, /* complain_on_overflow */
813          bfd_elf_generic_reloc, /* special_function */
814          "R_BFIN_FUNCDESC_GOTLO", /* name */
815          FALSE,                 /* partial_inplace */
816          0xffff,                /* src_mask */
817          0xffff,                /* dst_mask */
818          FALSE),                /* pcrel_offset */
819
820   /* The 32-bit address of the canonical descriptor of a function.  */
821   HOWTO (R_BFIN_FUNCDESC_VALUE, /* type */
822          0,                     /* rightshift */
823          2,                     /* size (0 = byte, 1 = short, 2 = long) */
824          64,                    /* bitsize */
825          FALSE,                 /* pc_relative */
826          0,                     /* bitpos */
827          complain_overflow_bitfield, /* complain_on_overflow */
828          bfd_elf_generic_reloc, /* special_function */
829          "R_BFIN_FUNCDESC_VALUE", /* name */
830          FALSE,                 /* partial_inplace */
831          0xffffffff,            /* src_mask */
832          0xffffffff,            /* dst_mask */
833          FALSE),                /* pcrel_offset */
834
835   /* A 12-bit signed operand with the GOT offset for the address of
836      canonical descriptor of a function.  */
837   HOWTO (R_BFIN_FUNCDESC_GOTOFF17M4, /* type */
838          2,                     /* rightshift */
839          1,                     /* size (0 = byte, 1 = short, 2 = long) */
840          16,                    /* bitsize */
841          FALSE,                 /* pc_relative */
842          0,                     /* bitpos */
843          complain_overflow_signed, /* complain_on_overflow */
844          bfd_elf_generic_reloc, /* special_function */
845          "R_BFIN_FUNCDESC_GOTOFF17M4", /* name */
846          FALSE,                 /* partial_inplace */
847          0xffff,                /* src_mask */
848          0xffff,                /* dst_mask */
849          FALSE),                /* pcrel_offset */
850
851   /* The upper 16 bits of the GOT offset for the address of the
852      canonical descriptor of a function.  */
853   HOWTO (R_BFIN_FUNCDESC_GOTOFFHI, /* type */
854          0,                     /* rightshift */
855          1,                     /* size (0 = byte, 1 = short, 2 = long) */
856          16,                    /* bitsize */
857          FALSE,                 /* pc_relative */
858          0,                     /* bitpos */
859          complain_overflow_dont, /* complain_on_overflow */
860          bfd_elf_generic_reloc, /* special_function */
861          "R_BFIN_FUNCDESC_GOTOFFHI", /* name */
862          FALSE,                 /* partial_inplace */
863          0xffff,                /* src_mask */
864          0xffff,                /* dst_mask */
865          FALSE),                /* pcrel_offset */
866
867   /* The lower 16 bits of the GOT offset for the address of the
868      canonical descriptor of a function.  */
869   HOWTO (R_BFIN_FUNCDESC_GOTOFFLO, /* type */
870          0,                     /* rightshift */
871          1,                     /* size (0 = byte, 1 = short, 2 = long) */
872          16,                    /* bitsize */
873          FALSE,                 /* pc_relative */
874          0,                     /* bitpos */
875          complain_overflow_dont, /* complain_on_overflow */
876          bfd_elf_generic_reloc, /* special_function */
877          "R_BFIN_FUNCDESC_GOTOFFLO", /* name */
878          FALSE,                 /* partial_inplace */
879          0xffff,                /* src_mask */
880          0xffff,                /* dst_mask */
881          FALSE),                /* pcrel_offset */
882
883   /* A 12-bit signed operand with the GOT offset for the address of
884      the symbol.  */
885   HOWTO (R_BFIN_GOTOFF17M4,     /* type */
886          2,                     /* rightshift */
887          1,                     /* size (0 = byte, 1 = short, 2 = long) */
888          16,                    /* bitsize */
889          FALSE,                 /* pc_relative */
890          0,                     /* bitpos */
891          complain_overflow_signed, /* complain_on_overflow */
892          bfd_elf_generic_reloc, /* special_function */
893          "R_BFIN_GOTOFF17M4",   /* name */
894          FALSE,                 /* partial_inplace */
895          0xffff,                /* src_mask */
896          0xffff,                /* dst_mask */
897          FALSE),                /* pcrel_offset */
898
899   /* The upper 16 bits of the GOT offset for the address of the
900      symbol.  */
901   HOWTO (R_BFIN_GOTOFFHI,        /* type */
902          0,                     /* rightshift */
903          1,                     /* size (0 = byte, 1 = short, 2 = long) */
904          16,                    /* bitsize */
905          FALSE,                 /* pc_relative */
906          0,                     /* bitpos */
907          complain_overflow_dont, /* complain_on_overflow */
908          bfd_elf_generic_reloc, /* special_function */
909          "R_BFIN_GOTOFFHI",     /* name */
910          FALSE,                 /* partial_inplace */
911          0xffff,                /* src_mask */
912          0xffff,                /* dst_mask */
913          FALSE),                /* pcrel_offset */
914
915   /* The lower 16 bits of the GOT offset for the address of the
916      symbol.  */
917   HOWTO (R_BFIN_GOTOFFLO,       /* type */
918          0,                     /* rightshift */
919          1,                     /* size (0 = byte, 1 = short, 2 = long) */
920          16,                    /* bitsize */
921          FALSE,                 /* pc_relative */
922          0,                     /* bitpos */
923          complain_overflow_dont, /* complain_on_overflow */
924          bfd_elf_generic_reloc, /* special_function */
925          "R_BFIN_GOTOFFLO",     /* name */
926          FALSE,                 /* partial_inplace */
927          0xffff,                /* src_mask */
928          0xffff,                /* dst_mask */
929          FALSE),                /* pcrel_offset */
930 };
931
932 static reloc_howto_type bfin_gnuext_howto_table [] =
933 {
934   HOWTO (R_BFIN_PLTPC,          /* type.  */
935          0,                     /* rightshift.  */
936          1,                     /* size (0 = byte, 1 = short, 2 = long).  */
937          16,                    /* bitsize.  */
938          FALSE,                 /* pc_relative.  */
939          0,                     /* bitpos.  */
940          complain_overflow_bitfield, /* complain_on_overflow.  */
941          bfin_pltpc_reloc,      /* special_function.  */
942          "R_BFIN_PLTPC",        /* name.  */
943          FALSE,                 /* partial_inplace.  */
944          0xffff,                /* src_mask.  */
945          0xffff,                /* dst_mask.  */
946          FALSE),                /* pcrel_offset.  */
947
948   HOWTO (R_BFIN_GOT,            /* type.  */
949          0,                     /* rightshift.  */
950          1,                     /* size (0 = byte, 1 = short, 2 = long).  */
951          16,                    /* bitsize.  */
952          FALSE,                 /* pc_relative.  */
953          0,                     /* bitpos.  */
954          complain_overflow_bitfield, /* complain_on_overflow.  */
955          bfd_elf_generic_reloc, /* special_function.  */
956          "R_BFIN_GOT",          /* name.  */
957          FALSE,                 /* partial_inplace.  */
958          0x7fff,                /* src_mask.  */
959          0x7fff,                /* dst_mask.  */
960          FALSE),                /* pcrel_offset.  */
961
962 /* GNU extension to record C++ vtable hierarchy.  */
963   HOWTO (R_BFIN_GNU_VTINHERIT, /* type.  */
964          0,                     /* rightshift.  */
965          2,                     /* size (0 = byte, 1 = short, 2 = long).  */
966          0,                     /* bitsize.  */
967          FALSE,                 /* pc_relative.  */
968          0,                     /* bitpos.  */
969          complain_overflow_dont, /* complain_on_overflow.  */
970          NULL,                  /* special_function.  */
971          "R_BFIN_GNU_VTINHERIT", /* name.  */
972          FALSE,                 /* partial_inplace.  */
973          0,                     /* src_mask.  */
974          0,                     /* dst_mask.  */
975          FALSE),                /* pcrel_offset.  */
976
977 /* GNU extension to record C++ vtable member usage.  */
978   HOWTO (R_BFIN_GNU_VTENTRY,    /* type.  */
979          0,                     /* rightshift.  */
980          2,                     /* size (0 = byte, 1 = short, 2 = long).  */
981          0,                     /* bitsize.  */
982          FALSE,                 /* pc_relative.  */
983          0,                     /* bitpos.  */
984          complain_overflow_dont, /* complain_on_overflow.  */
985          _bfd_elf_rel_vtable_reloc_fn, /* special_function.  */
986          "R_BFIN_GNU_VTENTRY",  /* name.  */
987          FALSE,                 /* partial_inplace.  */
988          0,                     /* src_mask.  */
989          0,                     /* dst_mask.  */
990          FALSE)                 /* pcrel_offset.  */
991 };
992
993 struct bfin_reloc_map
994 {
995   bfd_reloc_code_real_type      bfd_reloc_val;
996   unsigned int                  bfin_reloc_val;
997 };
998
999 static const struct bfin_reloc_map bfin_reloc_map [] =
1000 {
1001   { BFD_RELOC_NONE,                     R_BFIN_UNUSED0 },
1002   { BFD_RELOC_BFIN_5_PCREL,             R_BFIN_PCREL5M2 },
1003   { BFD_RELOC_NONE,                     R_BFIN_UNUSED1 },
1004   { BFD_RELOC_BFIN_10_PCREL,            R_BFIN_PCREL10 },
1005   { BFD_RELOC_BFIN_12_PCREL_JUMP,       R_BFIN_PCREL12_JUMP },
1006   { BFD_RELOC_BFIN_16_IMM,              R_BFIN_RIMM16 },
1007   { BFD_RELOC_BFIN_16_LOW,              R_BFIN_LUIMM16 },
1008   { BFD_RELOC_BFIN_16_HIGH,             R_BFIN_HUIMM16 },
1009   { BFD_RELOC_BFIN_12_PCREL_JUMP_S,     R_BFIN_PCREL12_JUMP_S },
1010   { BFD_RELOC_24_PCREL,                 R_BFIN_PCREL24 },
1011   { BFD_RELOC_24_PCREL,                 R_BFIN_PCREL24 },
1012   { BFD_RELOC_BFIN_24_PCREL_JUMP_L,     R_BFIN_PCREL24_JUMP_L },
1013   { BFD_RELOC_NONE,                     R_BFIN_UNUSEDB },
1014   { BFD_RELOC_NONE,                     R_BFIN_UNUSEDC },
1015   { BFD_RELOC_BFIN_24_PCREL_CALL_X,     R_BFIN_PCREL24_CALL_X },
1016   { BFD_RELOC_8,                        R_BFIN_BYTE_DATA },
1017   { BFD_RELOC_16,                       R_BFIN_BYTE2_DATA },
1018   { BFD_RELOC_32,                       R_BFIN_BYTE4_DATA },
1019   { BFD_RELOC_BFIN_11_PCREL,            R_BFIN_PCREL11 },
1020   { BFD_RELOC_BFIN_GOT,                 R_BFIN_GOT },
1021   { BFD_RELOC_BFIN_PLTPC,               R_BFIN_PLTPC },
1022
1023   { BFD_RELOC_BFIN_GOT17M4,      R_BFIN_GOT17M4 },
1024   { BFD_RELOC_BFIN_GOTHI,      R_BFIN_GOTHI },
1025   { BFD_RELOC_BFIN_GOTLO,      R_BFIN_GOTLO },
1026   { BFD_RELOC_BFIN_FUNCDESC,   R_BFIN_FUNCDESC },
1027   { BFD_RELOC_BFIN_FUNCDESC_GOT17M4, R_BFIN_FUNCDESC_GOT17M4 },
1028   { BFD_RELOC_BFIN_FUNCDESC_GOTHI, R_BFIN_FUNCDESC_GOTHI },
1029   { BFD_RELOC_BFIN_FUNCDESC_GOTLO, R_BFIN_FUNCDESC_GOTLO },
1030   { BFD_RELOC_BFIN_FUNCDESC_VALUE, R_BFIN_FUNCDESC_VALUE },
1031   { BFD_RELOC_BFIN_FUNCDESC_GOTOFF17M4, R_BFIN_FUNCDESC_GOTOFF17M4 },
1032   { BFD_RELOC_BFIN_FUNCDESC_GOTOFFHI, R_BFIN_FUNCDESC_GOTOFFHI },
1033   { BFD_RELOC_BFIN_FUNCDESC_GOTOFFLO, R_BFIN_FUNCDESC_GOTOFFLO },
1034   { BFD_RELOC_BFIN_GOTOFF17M4,   R_BFIN_GOTOFF17M4 },
1035   { BFD_RELOC_BFIN_GOTOFFHI,   R_BFIN_GOTOFFHI },
1036   { BFD_RELOC_BFIN_GOTOFFLO,   R_BFIN_GOTOFFLO },
1037
1038   { BFD_RELOC_VTABLE_INHERIT,           R_BFIN_GNU_VTINHERIT },
1039   { BFD_RELOC_VTABLE_ENTRY,             R_BFIN_GNU_VTENTRY },
1040 };
1041
1042
1043 static void
1044 bfin_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED,
1045                     arelent *cache_ptr,
1046                     Elf_Internal_Rela *dst)
1047 {
1048   unsigned int r_type;
1049
1050   r_type = ELF32_R_TYPE (dst->r_info);
1051
1052   if (r_type <= BFIN_RELOC_MAX)
1053     cache_ptr->howto = &bfin_howto_table [r_type];
1054
1055   else if (r_type >= BFIN_GNUEXT_RELOC_MIN && r_type <= BFIN_GNUEXT_RELOC_MAX)
1056     cache_ptr->howto = &bfin_gnuext_howto_table [r_type - BFIN_GNUEXT_RELOC_MIN];
1057
1058   else
1059     cache_ptr->howto = (reloc_howto_type *) NULL;
1060 }
1061
1062 /* Given a BFD reloc type, return the howto.  */
1063 static reloc_howto_type *
1064 bfin_bfd_reloc_type_lookup (bfd * abfd ATTRIBUTE_UNUSED,
1065                             bfd_reloc_code_real_type code)
1066 {
1067   unsigned int i;
1068   unsigned int r_type = BFIN_RELOC_MIN;
1069
1070   for (i = sizeof (bfin_reloc_map) / sizeof (bfin_reloc_map[0]); --i;)
1071     if (bfin_reloc_map[i].bfd_reloc_val == code)
1072       r_type = bfin_reloc_map[i].bfin_reloc_val;
1073
1074   if (r_type <= BFIN_RELOC_MAX && r_type > BFIN_RELOC_MIN)
1075     return &bfin_howto_table [r_type];
1076
1077   else if (r_type >= BFIN_GNUEXT_RELOC_MIN && r_type <= BFIN_GNUEXT_RELOC_MAX)
1078    return &bfin_gnuext_howto_table [r_type - BFIN_GNUEXT_RELOC_MIN];
1079
1080   return (reloc_howto_type *) NULL;
1081 }
1082
1083 static reloc_howto_type *
1084 bfin_bfd_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
1085                             const char *r_name)
1086 {
1087   unsigned int i;
1088
1089   for (i = 0;
1090        i < (sizeof (bfin_howto_table)
1091             / sizeof (bfin_howto_table[0]));
1092        i++)
1093     if (bfin_howto_table[i].name != NULL
1094         && strcasecmp (bfin_howto_table[i].name, r_name) == 0)
1095       return &bfin_howto_table[i];
1096
1097   for (i = 0;
1098        i < (sizeof (bfin_gnuext_howto_table)
1099             / sizeof (bfin_gnuext_howto_table[0]));
1100        i++)
1101     if (bfin_gnuext_howto_table[i].name != NULL
1102         && strcasecmp (bfin_gnuext_howto_table[i].name, r_name) == 0)
1103       return &bfin_gnuext_howto_table[i];
1104
1105   return NULL;
1106 }
1107
1108 /* Given a bfin relocation type, return the howto.  */
1109 static reloc_howto_type *
1110 bfin_reloc_type_lookup (bfd * abfd ATTRIBUTE_UNUSED,
1111                             unsigned int r_type)
1112 {
1113   if (r_type <= BFIN_RELOC_MAX)
1114     return &bfin_howto_table [r_type];
1115
1116   else if (r_type >= BFIN_GNUEXT_RELOC_MIN && r_type <= BFIN_GNUEXT_RELOC_MAX)
1117    return &bfin_gnuext_howto_table [r_type - BFIN_GNUEXT_RELOC_MIN];
1118
1119   return (reloc_howto_type *) NULL;
1120 }
1121
1122 /* Return TRUE if the name is a local label.
1123    bfin local labels begin with L$.  */
1124 static bfd_boolean
1125 bfin_is_local_label_name (
1126      bfd *abfd,
1127      const char *label)
1128 {
1129   if (label[0] == 'L' && label[1] == '$' )
1130     return TRUE;
1131
1132   return _bfd_elf_is_local_label_name (abfd, label);
1133 }
1134 \f
1135 /* Look through the relocs for a section during the first phase, and
1136    allocate space in the global offset table or procedure linkage
1137    table.  */
1138
1139 static bfd_boolean
1140 bfin_check_relocs (bfd * abfd,
1141                    struct bfd_link_info *info,
1142                    asection *sec,
1143                    const Elf_Internal_Rela *relocs)
1144 {
1145   bfd *dynobj;
1146   Elf_Internal_Shdr *symtab_hdr;
1147   struct elf_link_hash_entry **sym_hashes;
1148   bfd_signed_vma *local_got_refcounts;
1149   const Elf_Internal_Rela *rel;
1150   const Elf_Internal_Rela *rel_end;
1151   asection *sgot;
1152   asection *srelgot;
1153   if (info->relocatable)
1154     return TRUE;
1155
1156   dynobj = elf_hash_table (info)->dynobj;
1157   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1158   sym_hashes = elf_sym_hashes (abfd);
1159   local_got_refcounts = elf_local_got_refcounts (abfd);
1160
1161   sgot = NULL;
1162   srelgot = NULL;
1163
1164   rel_end = relocs + sec->reloc_count;
1165   for (rel = relocs; rel < rel_end; rel++)
1166     {
1167       unsigned long r_symndx;
1168       struct elf_link_hash_entry *h;
1169
1170       r_symndx = ELF32_R_SYM (rel->r_info);
1171       if (r_symndx < symtab_hdr->sh_info)
1172         h = NULL;
1173       else
1174         h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1175
1176       switch (ELF32_R_TYPE (rel->r_info))
1177         {
1178        /* This relocation describes the C++ object vtable hierarchy.
1179            Reconstruct it for later use during GC.  */
1180         case R_BFIN_GNU_VTINHERIT:
1181           if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
1182             return FALSE;
1183           break;
1184
1185         /* This relocation describes which C++ vtable entries
1186            are actually used.  Record for later use during GC.  */
1187         case R_BFIN_GNU_VTENTRY:
1188           BFD_ASSERT (h != NULL);
1189           if (h != NULL
1190               && !bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
1191             return FALSE;
1192           break;
1193
1194         case R_BFIN_GOT:
1195           if (h != NULL
1196               && strcmp (h->root.root.string, "__GLOBAL_OFFSET_TABLE_") == 0)
1197             break;
1198           /* Fall through.  */
1199
1200           if (dynobj == NULL)
1201             {
1202               /* Create the .got section.  */
1203               elf_hash_table (info)->dynobj = dynobj = abfd;
1204               if (!_bfd_elf_create_got_section (dynobj, info))
1205                 return FALSE;
1206             }
1207
1208           if (sgot == NULL)
1209             {
1210               sgot = bfd_get_section_by_name (dynobj, ".got");
1211               BFD_ASSERT (sgot != NULL);
1212             }
1213
1214           if (srelgot == NULL && (h != NULL || info->shared))
1215             {
1216               srelgot = bfd_get_section_by_name (dynobj, ".rela.got");
1217               if (srelgot == NULL)
1218                 {
1219                   flagword flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS
1220                                     | SEC_IN_MEMORY | SEC_LINKER_CREATED
1221                                     | SEC_READONLY);
1222                   srelgot = bfd_make_section_with_flags (dynobj, ".rela.got",
1223                                                          flags);
1224                   if (srelgot == NULL
1225                       || !bfd_set_section_alignment (dynobj, srelgot, 2))
1226                     return FALSE;
1227                 }
1228             }
1229
1230           if (h != NULL)
1231             {
1232               if (h->got.refcount == 0)
1233                 {
1234                   /* Make sure this symbol is output as a dynamic symbol.  */
1235                   if (h->dynindx == -1 && !h->forced_local)
1236                     {
1237                       if (!bfd_elf_link_record_dynamic_symbol (info, h))
1238                         return FALSE;
1239                     }
1240
1241                   /* Allocate space in the .got section.  */
1242                   sgot->size += 4;
1243                   /* Allocate relocation space.  */
1244                   srelgot->size += sizeof (Elf32_External_Rela);
1245                 }
1246               h->got.refcount++;
1247             }
1248           else
1249             {
1250               /* This is a global offset table entry for a local symbol.  */
1251               if (local_got_refcounts == NULL)
1252                 {
1253                   bfd_size_type size;
1254
1255                   size = symtab_hdr->sh_info;
1256                   size *= sizeof (bfd_signed_vma);
1257                   local_got_refcounts = ((bfd_signed_vma *)
1258                                          bfd_zalloc (abfd, size));
1259                   if (local_got_refcounts == NULL)
1260                     return FALSE;
1261                   elf_local_got_refcounts (abfd) = local_got_refcounts;
1262                 }
1263               if (local_got_refcounts[r_symndx] == 0)
1264                 {
1265                   sgot->size += 4;
1266                   if (info->shared)
1267                     {
1268                       /* If we are generating a shared object, we need to
1269                          output a R_68K_RELATIVE reloc so that the dynamic
1270                          linker can adjust this GOT entry.  */
1271                       srelgot->size += sizeof (Elf32_External_Rela);
1272                     }
1273                 }
1274               local_got_refcounts[r_symndx]++;
1275             }
1276           break;
1277
1278         default:
1279           break;
1280         }
1281     }
1282
1283   return TRUE;
1284 }
1285
1286 static enum elf_reloc_type_class
1287 elf32_bfin_reloc_type_class (const Elf_Internal_Rela * rela)
1288 {
1289   switch ((int) ELF32_R_TYPE (rela->r_info))
1290     {
1291     default:
1292       return reloc_class_normal;
1293     }
1294 }
1295 \f
1296 static bfd_reloc_status_type
1297 bfin_final_link_relocate (Elf_Internal_Rela *rel, reloc_howto_type *howto,
1298                           bfd *input_bfd, asection *input_section,
1299                           bfd_byte *contents, bfd_vma address,
1300                           bfd_vma value, bfd_vma addend)
1301 {
1302   int r_type = ELF32_R_TYPE (rel->r_info);
1303
1304   if (r_type == R_BFIN_PCREL24 || r_type == R_BFIN_PCREL24_JUMP_L)
1305     {
1306       bfd_reloc_status_type r = bfd_reloc_ok;
1307       bfd_vma x;
1308
1309       if (address > bfd_get_section_limit (input_bfd, input_section))
1310         return bfd_reloc_outofrange;
1311
1312       value += addend;
1313
1314       /* Perform usual pc-relative correction.  */
1315       value -= input_section->output_section->vma + input_section->output_offset;
1316       value -= address;
1317
1318       /* We are getting reloc_entry->address 2 byte off from
1319          the start of instruction. Assuming absolute postion
1320          of the reloc data. But, following code had been written assuming
1321          reloc address is starting at begining of instruction.
1322          To compensate that I have increased the value of
1323          relocation by 1 (effectively 2) and used the addr -2 instead of addr.  */
1324
1325       value += 2;
1326       address -= 2;
1327
1328       if ((value & 0xFF000000) != 0
1329           && (value & 0xFF000000) != 0xFF000000)
1330         r = bfd_reloc_overflow;
1331
1332       value >>= 1;
1333
1334       x = bfd_get_16 (input_bfd, contents + address);
1335       x = (x & 0xff00) | ((value >> 16) & 0xff);
1336       bfd_put_16 (input_bfd, x, contents + address);
1337
1338       x = bfd_get_16 (input_bfd, contents + address + 2);
1339       x = value & 0xFFFF;
1340       bfd_put_16 (input_bfd, x, contents + address + 2);
1341       return r;
1342     }
1343
1344   return _bfd_final_link_relocate (howto, input_bfd, input_section, contents,
1345                                    rel->r_offset, value, addend);
1346
1347 }
1348
1349 static bfd_boolean
1350 bfin_relocate_section (bfd * output_bfd,
1351                        struct bfd_link_info *info,
1352                        bfd * input_bfd,
1353                        asection * input_section,
1354                        bfd_byte * contents,
1355                        Elf_Internal_Rela * relocs,
1356                        Elf_Internal_Sym * local_syms,
1357                        asection ** local_sections)
1358 {
1359   bfd *dynobj;
1360   Elf_Internal_Shdr *symtab_hdr;
1361   struct elf_link_hash_entry **sym_hashes;
1362   bfd_vma *local_got_offsets;
1363   asection *sgot;
1364   Elf_Internal_Rela *rel;
1365   Elf_Internal_Rela *relend;
1366   int i = 0;
1367
1368   dynobj = elf_hash_table (info)->dynobj;
1369   symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
1370   sym_hashes = elf_sym_hashes (input_bfd);
1371   local_got_offsets = elf_local_got_offsets (input_bfd);
1372
1373   sgot = NULL;
1374
1375   rel = relocs;
1376   relend = relocs + input_section->reloc_count;
1377   for (; rel < relend; rel++, i++)
1378     {
1379       int r_type;
1380       reloc_howto_type *howto;
1381       unsigned long r_symndx;
1382       struct elf_link_hash_entry *h;
1383       Elf_Internal_Sym *sym;
1384       asection *sec;
1385       bfd_vma relocation = 0;
1386       bfd_boolean unresolved_reloc;
1387       bfd_reloc_status_type r;
1388       bfd_vma address;
1389
1390       r_type = ELF32_R_TYPE (rel->r_info);
1391       if (r_type < 0 || r_type >= 243)
1392         {
1393           bfd_set_error (bfd_error_bad_value);
1394           return FALSE;
1395         }
1396
1397       if (r_type == R_BFIN_GNU_VTENTRY
1398           || r_type == R_BFIN_GNU_VTINHERIT)
1399         continue;
1400
1401       howto = bfin_reloc_type_lookup (input_bfd, r_type);
1402       if (howto == NULL)
1403         {
1404           bfd_set_error (bfd_error_bad_value);
1405           return FALSE;
1406         }
1407       r_symndx = ELF32_R_SYM (rel->r_info);
1408
1409       h = NULL;
1410       sym = NULL;
1411       sec = NULL;
1412       unresolved_reloc = FALSE;
1413
1414       if (r_symndx < symtab_hdr->sh_info)
1415         {
1416           sym = local_syms + r_symndx;
1417           sec = local_sections[r_symndx];
1418           relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
1419         }
1420       else
1421         {
1422           bfd_boolean warned;
1423
1424           RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
1425                                    r_symndx, symtab_hdr, sym_hashes,
1426                                    h, sec, relocation,
1427                                    unresolved_reloc, warned);
1428         }
1429
1430       if (sec != NULL && elf_discarded_section (sec))
1431         {
1432           /* For relocs against symbols from removed linkonce sections,
1433              or sections discarded by a linker script, we just want the
1434              section contents zeroed.  Avoid any special processing.  */
1435           _bfd_clear_contents (howto, input_bfd, contents + rel->r_offset);
1436           rel->r_info = 0;
1437           rel->r_addend = 0;
1438           continue;
1439         }
1440
1441       if (info->relocatable)
1442         continue;
1443
1444       address = rel->r_offset;
1445
1446       /* Then, process normally.  */
1447       switch (r_type)
1448         {
1449         case R_BFIN_GNU_VTINHERIT:
1450         case R_BFIN_GNU_VTENTRY:
1451           return bfd_reloc_ok;
1452
1453         case R_BFIN_GOT:
1454           /* Relocation is to the address of the entry for this symbol
1455              in the global offset table.  */
1456           if (h != NULL
1457               && strcmp (h->root.root.string, "__GLOBAL_OFFSET_TABLE_") == 0)
1458             goto do_default;
1459           /* Fall through.  */
1460           /* Relocation is the offset of the entry for this symbol in
1461              the global offset table.  */
1462
1463           {
1464             bfd_vma off;
1465
1466           if (dynobj == NULL)
1467             {
1468               /* Create the .got section.  */
1469               elf_hash_table (info)->dynobj = dynobj = output_bfd;
1470               if (!_bfd_elf_create_got_section (dynobj, info))
1471                 return FALSE;
1472             }
1473
1474             if (sgot == NULL)
1475               {
1476                 sgot = bfd_get_section_by_name (dynobj, ".got");
1477                 BFD_ASSERT (sgot != NULL);
1478               }
1479
1480             if (h != NULL)
1481               {
1482                 bfd_boolean dyn;
1483
1484                 off = h->got.offset;
1485                 BFD_ASSERT (off != (bfd_vma) - 1);
1486                 dyn = elf_hash_table (info)->dynamic_sections_created;
1487
1488                 if (!WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
1489                     || (info->shared
1490                         && (info->symbolic
1491                             || h->dynindx == -1
1492                             || h->forced_local)
1493                         && h->def_regular))
1494                   {
1495                     /* This is actually a static link, or it is a
1496                        -Bsymbolic link and the symbol is defined
1497                        locally, or the symbol was forced to be local
1498                        because of a version file..  We must initialize
1499                        this entry in the global offset table.  Since
1500                        the offset must always be a multiple of 4, we
1501                        use the least significant bit to record whether
1502                        we have initialized it already.
1503
1504                        When doing a dynamic link, we create a .rela.got
1505                        relocation entry to initialize the value.  This
1506                        is done in the finish_dynamic_symbol routine.  */
1507                     if ((off & 1) != 0)
1508                       off &= ~1;
1509                     else
1510                       {
1511                         bfd_put_32 (output_bfd, relocation,
1512                                     sgot->contents + off);
1513                         h->got.offset |= 1;
1514                       }
1515                   }
1516                 else
1517                   unresolved_reloc = FALSE;
1518               }
1519             else
1520               {
1521                 BFD_ASSERT (local_got_offsets != NULL);
1522                 off = local_got_offsets[r_symndx];
1523                 BFD_ASSERT (off != (bfd_vma) - 1);
1524
1525                 /* The offset must always be a multiple of 4.  We use
1526                    the least significant bit to record whether we have
1527                    already generated the necessary reloc.  */
1528                 if ((off & 1) != 0)
1529                   off &= ~1;
1530                 else
1531                   {
1532                     bfd_put_32 (output_bfd, relocation, sgot->contents + off);
1533
1534                     if (info->shared)
1535                       {
1536                         asection *s;
1537                         Elf_Internal_Rela outrel;
1538                         bfd_byte *loc;
1539
1540                         s = bfd_get_section_by_name (dynobj, ".rela.got");
1541                         BFD_ASSERT (s != NULL);
1542
1543                         outrel.r_offset = (sgot->output_section->vma
1544                                            + sgot->output_offset + off);
1545                         outrel.r_info =
1546                           ELF32_R_INFO (0, R_BFIN_PCREL24);
1547                         outrel.r_addend = relocation;
1548                         loc = s->contents;
1549                         loc +=
1550                           s->reloc_count++ * sizeof (Elf32_External_Rela);
1551                         bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
1552                       }
1553
1554                     local_got_offsets[r_symndx] |= 1;
1555                   }
1556               }
1557
1558             relocation = sgot->output_offset + off;
1559             rel->r_addend = 0;
1560             /* bfin : preg = [preg + 17bitdiv4offset] relocation is div by 4.  */
1561             relocation /= 4;
1562           }
1563           goto do_default;
1564
1565         default:
1566         do_default:
1567           r = bfin_final_link_relocate (rel, howto, input_bfd, input_section,
1568                                         contents, address,
1569                                         relocation, rel->r_addend);
1570
1571           break;
1572         }
1573
1574       /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
1575          because such sections are not SEC_ALLOC and thus ld.so will
1576          not process them.  */
1577       if (unresolved_reloc
1578           && !((input_section->flags & SEC_DEBUGGING) != 0 && h->def_dynamic))
1579         {
1580           (*_bfd_error_handler)
1581             (_("%B(%A+0x%lx): unresolvable relocation against symbol `%s'"),
1582              input_bfd,
1583              input_section, (long) rel->r_offset, h->root.root.string);
1584           return FALSE;
1585         }
1586
1587       if (r != bfd_reloc_ok)
1588         {
1589           const char *name;
1590
1591           if (h != NULL)
1592             name = h->root.root.string;
1593           else
1594             {
1595               name = bfd_elf_string_from_elf_section (input_bfd,
1596                                                       symtab_hdr->sh_link,
1597                                                       sym->st_name);
1598               if (name == NULL)
1599                 return FALSE;
1600               if (*name == '\0')
1601                 name = bfd_section_name (input_bfd, sec);
1602             }
1603
1604           if (r == bfd_reloc_overflow)
1605             {
1606               if (!(info->callbacks->reloc_overflow
1607                     (info, (h ? &h->root : NULL), name, howto->name,
1608                      (bfd_vma) 0, input_bfd, input_section, rel->r_offset)))
1609                 return FALSE;
1610             }
1611           else
1612             {
1613               (*_bfd_error_handler)
1614                 (_("%B(%A+0x%lx): reloc against `%s': error %d"),
1615                  input_bfd, input_section,
1616                  (long) rel->r_offset, name, (int) r);
1617               return FALSE;
1618             }
1619         }
1620     }
1621
1622   return TRUE;
1623 }
1624
1625 static asection *
1626 bfin_gc_mark_hook (asection * sec,
1627                    struct bfd_link_info *info,
1628                    Elf_Internal_Rela * rel,
1629                    struct elf_link_hash_entry *h,
1630                    Elf_Internal_Sym * sym)
1631 {
1632   if (h != NULL)
1633     switch (ELF32_R_TYPE (rel->r_info))
1634       {
1635       case R_BFIN_GNU_VTINHERIT:
1636       case R_BFIN_GNU_VTENTRY:
1637         return NULL;
1638       }
1639
1640   return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
1641 }
1642
1643 /* Update the got entry reference counts for the section being removed.  */
1644
1645 static bfd_boolean
1646 bfin_gc_sweep_hook (bfd * abfd,
1647                     struct bfd_link_info *info,
1648                     asection * sec,
1649                     const Elf_Internal_Rela * relocs)
1650 {
1651   Elf_Internal_Shdr *symtab_hdr;
1652   struct elf_link_hash_entry **sym_hashes;
1653   bfd_signed_vma *local_got_refcounts;
1654   const Elf_Internal_Rela *rel, *relend;
1655   bfd *dynobj;
1656   asection *sgot;
1657   asection *srelgot;
1658
1659   dynobj = elf_hash_table (info)->dynobj;
1660   if (dynobj == NULL)
1661     return TRUE;
1662
1663   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1664   sym_hashes = elf_sym_hashes (abfd);
1665   local_got_refcounts = elf_local_got_refcounts (abfd);
1666
1667   sgot = bfd_get_section_by_name (dynobj, ".got");
1668   srelgot = bfd_get_section_by_name (dynobj, ".rela.got");
1669
1670   relend = relocs + sec->reloc_count;
1671   for (rel = relocs; rel < relend; rel++)
1672     {
1673       unsigned long r_symndx;
1674       struct elf_link_hash_entry *h;
1675
1676       switch (ELF32_R_TYPE (rel->r_info))
1677         {
1678         case R_BFIN_GOT:
1679           r_symndx = ELF32_R_SYM (rel->r_info);
1680           if (r_symndx >= symtab_hdr->sh_info)
1681             {
1682               h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1683               if (h->got.refcount > 0)
1684                 {
1685                   --h->got.refcount;
1686                   if (h->got.refcount == 0)
1687                     {
1688                       /* We don't need the .got entry any more.  */
1689                       sgot->size -= 4;
1690                       srelgot->size -= sizeof (Elf32_External_Rela);
1691                     }
1692                 }
1693             }
1694           else if (local_got_refcounts != NULL)
1695             {
1696               if (local_got_refcounts[r_symndx] > 0)
1697                 {
1698                   --local_got_refcounts[r_symndx];
1699                   if (local_got_refcounts[r_symndx] == 0)
1700                     {
1701                       /* We don't need the .got entry any more.  */
1702                       sgot->size -= 4;
1703                       if (info->shared)
1704                         srelgot->size -= sizeof (Elf32_External_Rela);
1705                     }
1706                 }
1707             }
1708           break;
1709         default:
1710           break;
1711         }
1712     }
1713   return TRUE;
1714 }
1715 \f
1716 extern const bfd_target bfd_elf32_bfinfdpic_vec;
1717 #define IS_FDPIC(bfd) ((bfd)->xvec == &bfd_elf32_bfinfdpic_vec)
1718
1719 /* An extension of the elf hash table data structure, containing some
1720    additional Blackfin-specific data.  */
1721 struct bfinfdpic_elf_link_hash_table
1722 {
1723   struct elf_link_hash_table elf;
1724
1725   /* A pointer to the .got section.  */
1726   asection *sgot;
1727   /* A pointer to the .rel.got section.  */
1728   asection *sgotrel;
1729   /* A pointer to the .rofixup section.  */
1730   asection *sgotfixup;
1731   /* A pointer to the .plt section.  */
1732   asection *splt;
1733   /* A pointer to the .rel.plt section.  */
1734   asection *spltrel;
1735   /* GOT base offset.  */
1736   bfd_vma got0;
1737   /* Location of the first non-lazy PLT entry, i.e., the number of
1738      bytes taken by lazy PLT entries.  */
1739   bfd_vma plt0;
1740   /* A hash table holding information about which symbols were
1741      referenced with which PIC-related relocations.  */
1742   struct htab *relocs_info;
1743 };
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_BFIN_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_BFIN_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_BFIN_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_BFIN_PCREL24:
2669         case R_BFIN_PCREL24_JUMP_L:
2670         case R_BFIN_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_BFIN_PCREL24:
2731         case R_BFIN_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_BFIN_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_BFIN_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_BFIN_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_BFIN_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_BFIN_PCREL24:
3157         case R_BFIN_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_BFIN_PCREL24:
3288         case R_BFIN_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_BFIN_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 ATTRIBUTE_UNUSED,
3355                                     asection *p)
3356 {
3357   switch (elf_section_data (p)->this_hdr.sh_type)
3358     {
3359     case SHT_PROGBITS:
3360     case SHT_NOBITS:
3361       /* If sh_type is yet undecided, assume it could be
3362          SHT_PROGBITS/SHT_NOBITS.  */
3363     case SHT_NULL:
3364       return FALSE;
3365
3366       /* There shouldn't be section relative relocations
3367          against any other section.  */
3368     default:
3369       return TRUE;
3370     }
3371 }
3372
3373 /* Create  a .got section, as well as its additional info field.  This
3374    is almost entirely copied from
3375    elflink.c:_bfd_elf_create_got_section().  */
3376
3377 static bfd_boolean
3378 _bfin_create_got_section (bfd *abfd, struct bfd_link_info *info)
3379 {
3380   flagword flags, pltflags;
3381   asection *s;
3382   struct elf_link_hash_entry *h;
3383   const struct elf_backend_data *bed = get_elf_backend_data (abfd);
3384   int ptralign;
3385   int offset;
3386
3387   /* This function may be called more than once.  */
3388   s = bfd_get_section_by_name (abfd, ".got");
3389   if (s != NULL && (s->flags & SEC_LINKER_CREATED) != 0)
3390     return TRUE;
3391
3392   /* Machine specific: although pointers are 32-bits wide, we want the
3393      GOT to be aligned to a 64-bit boundary, such that function
3394      descriptors in it can be accessed with 64-bit loads and
3395      stores.  */
3396   ptralign = 3;
3397
3398   flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
3399            | SEC_LINKER_CREATED);
3400   pltflags = flags;
3401
3402   s = bfd_make_section_with_flags (abfd, ".got", flags);
3403   if (s == NULL
3404       || !bfd_set_section_alignment (abfd, s, ptralign))
3405     return FALSE;
3406
3407   if (bed->want_got_plt)
3408     {
3409       s = bfd_make_section_with_flags (abfd, ".got.plt", flags);
3410       if (s == NULL
3411           || !bfd_set_section_alignment (abfd, s, ptralign))
3412         return FALSE;
3413     }
3414
3415   if (bed->want_got_sym)
3416     {
3417       /* Define the symbol _GLOBAL_OFFSET_TABLE_ at the start of the .got
3418          (or .got.plt) section.  We don't do this in the linker script
3419          because we don't want to define the symbol if we are not creating
3420          a global offset table.  */
3421       h = _bfd_elf_define_linkage_sym (abfd, info, s, "__GLOBAL_OFFSET_TABLE_");
3422       elf_hash_table (info)->hgot = h;
3423       if (h == NULL)
3424         return FALSE;
3425
3426       /* Machine-specific: we want the symbol for executables as
3427          well.  */
3428       if (! bfd_elf_link_record_dynamic_symbol (info, h))
3429         return FALSE;
3430     }
3431
3432   /* The first bit of the global offset table is the header.  */
3433   s->size += bed->got_header_size;
3434
3435   /* This is the machine-specific part.  Create and initialize section
3436      data for the got.  */
3437   if (IS_FDPIC (abfd))
3438     {
3439       bfinfdpic_got_section (info) = s;
3440       bfinfdpic_relocs_info (info) = htab_try_create (1,
3441                                                       bfinfdpic_relocs_info_hash,
3442                                                       bfinfdpic_relocs_info_eq,
3443                                                       (htab_del) NULL);
3444       if (! bfinfdpic_relocs_info (info))
3445         return FALSE;
3446
3447       s = bfd_make_section_with_flags (abfd, ".rel.got",
3448                                        (flags | SEC_READONLY));
3449       if (s == NULL
3450           || ! bfd_set_section_alignment (abfd, s, 2))
3451         return FALSE;
3452
3453       bfinfdpic_gotrel_section (info) = s;
3454
3455       /* Machine-specific.  */
3456       s = bfd_make_section_with_flags (abfd, ".rofixup",
3457                                        (flags | SEC_READONLY));
3458       if (s == NULL
3459           || ! bfd_set_section_alignment (abfd, s, 2))
3460         return FALSE;
3461
3462       bfinfdpic_gotfixup_section (info) = s;
3463       offset = -2048;
3464       flags = BSF_GLOBAL;
3465     }
3466   else
3467     {
3468       offset = 2048;
3469       flags = BSF_GLOBAL | BSF_WEAK;
3470     }
3471
3472   return TRUE;
3473 }
3474
3475 /* Make sure the got and plt sections exist, and that our pointers in
3476    the link hash table point to them.  */
3477
3478 static bfd_boolean
3479 elf32_bfinfdpic_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
3480 {
3481   /* This is mostly copied from
3482      elflink.c:_bfd_elf_create_dynamic_sections().  */
3483   flagword flags, pltflags;
3484   asection *s;
3485   const struct elf_backend_data *bed = get_elf_backend_data (abfd);
3486
3487   /* We need to create .plt, .rel[a].plt, .got, .got.plt, .dynbss, and
3488      .rel[a].bss sections.  */
3489
3490   flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
3491            | SEC_LINKER_CREATED);
3492
3493   pltflags = flags;
3494   pltflags |= SEC_CODE;
3495   if (bed->plt_not_loaded)
3496     pltflags &= ~ (SEC_CODE | SEC_LOAD | SEC_HAS_CONTENTS);
3497   if (bed->plt_readonly)
3498     pltflags |= SEC_READONLY;
3499
3500   s = bfd_make_section_with_flags (abfd, ".plt", pltflags);
3501   if (s == NULL
3502       || ! bfd_set_section_alignment (abfd, s, bed->plt_alignment))
3503     return FALSE;
3504   /* Blackfin-specific: remember it.  */
3505   bfinfdpic_plt_section (info) = s;
3506
3507   if (bed->want_plt_sym)
3508     {
3509       /* Define the symbol _PROCEDURE_LINKAGE_TABLE_ at the start of the
3510          .plt section.  */
3511       struct elf_link_hash_entry *h;
3512       struct bfd_link_hash_entry *bh = NULL;
3513
3514       if (! (_bfd_generic_link_add_one_symbol
3515              (info, abfd, "__PROCEDURE_LINKAGE_TABLE_", BSF_GLOBAL, s, 0, NULL,
3516               FALSE, get_elf_backend_data (abfd)->collect, &bh)))
3517         return FALSE;
3518       h = (struct elf_link_hash_entry *) bh;
3519       h->def_regular = 1;
3520       h->type = STT_OBJECT;
3521
3522       if (! info->executable
3523           && ! bfd_elf_link_record_dynamic_symbol (info, h))
3524         return FALSE;
3525     }
3526
3527   /* Blackfin-specific: we want rel relocations for the plt.  */
3528   s = bfd_make_section_with_flags (abfd, ".rel.plt", flags | SEC_READONLY);
3529   if (s == NULL
3530       || ! bfd_set_section_alignment (abfd, s, bed->s->log_file_align))
3531     return FALSE;
3532   /* Blackfin-specific: remember it.  */
3533   bfinfdpic_pltrel_section (info) = s;
3534
3535   /* Blackfin-specific: we want to create the GOT in the Blackfin way.  */
3536   if (! _bfin_create_got_section (abfd, info))
3537     return FALSE;
3538
3539   /* Blackfin-specific: make sure we created everything we wanted.  */
3540   BFD_ASSERT (bfinfdpic_got_section (info) && bfinfdpic_gotrel_section (info)
3541               /* && bfinfdpic_gotfixup_section (info) */
3542               && bfinfdpic_plt_section (info)
3543               && bfinfdpic_pltrel_section (info));
3544
3545   if (bed->want_dynbss)
3546     {
3547       /* The .dynbss section is a place to put symbols which are defined
3548          by dynamic objects, are referenced by regular objects, and are
3549          not functions.  We must allocate space for them in the process
3550          image and use a R_*_COPY reloc to tell the dynamic linker to
3551          initialize them at run time.  The linker script puts the .dynbss
3552          section into the .bss section of the final image.  */
3553       s = bfd_make_section_with_flags (abfd, ".dynbss",
3554                                        SEC_ALLOC | SEC_LINKER_CREATED);
3555       if (s == NULL)
3556         return FALSE;
3557
3558       /* The .rel[a].bss section holds copy relocs.  This section is not
3559      normally needed.  We need to create it here, though, so that the
3560      linker will map it to an output section.  We can't just create it
3561      only if we need it, because we will not know whether we need it
3562      until we have seen all the input files, and the first time the
3563      main linker code calls BFD after examining all the input files
3564      (size_dynamic_sections) the input sections have already been
3565      mapped to the output sections.  If the section turns out not to
3566      be needed, we can discard it later.  We will never need this
3567      section when generating a shared object, since they do not use
3568      copy relocs.  */
3569       if (! info->shared)
3570         {
3571           s = bfd_make_section_with_flags (abfd,
3572                                            (bed->default_use_rela_p
3573                                             ? ".rela.bss" : ".rel.bss"),
3574                                            flags | SEC_READONLY);
3575           if (s == NULL
3576               || ! bfd_set_section_alignment (abfd, s, bed->s->log_file_align))
3577             return FALSE;
3578         }
3579     }
3580
3581   return TRUE;
3582 }
3583
3584 /* Compute the total GOT size required by each symbol in each range.
3585    Symbols may require up to 4 words in the GOT: an entry pointing to
3586    the symbol, an entry pointing to its function descriptor, and a
3587    private function descriptors taking two words.  */
3588
3589 static int
3590 _bfinfdpic_count_got_plt_entries (void **entryp, void *dinfo_)
3591 {
3592   struct bfinfdpic_relocs_info *entry = *entryp;
3593   struct _bfinfdpic_dynamic_got_info *dinfo = dinfo_;
3594   unsigned relocs = 0, fixups = 0;
3595
3596   /* Allocate space for a GOT entry pointing to the symbol.  */
3597   if (entry->got17m4)
3598     dinfo->got17m4 += 4;
3599   else if (entry->gothilo)
3600     dinfo->gothilo += 4;
3601   else
3602     entry->relocs32--;
3603   entry->relocs32++;
3604
3605   /* Allocate space for a GOT entry pointing to the function
3606      descriptor.  */
3607   if (entry->fdgot17m4)
3608     dinfo->got17m4 += 4;
3609   else if (entry->fdgothilo)
3610     dinfo->gothilo += 4;
3611   else
3612     entry->relocsfd--;
3613   entry->relocsfd++;
3614
3615   /* Decide whether we need a PLT entry, a function descriptor in the
3616      GOT, and a lazy PLT entry for this symbol.  */
3617   entry->plt = entry->call
3618     && entry->symndx == -1 && ! BFINFDPIC_SYM_LOCAL (dinfo->info, entry->d.h)
3619     && elf_hash_table (dinfo->info)->dynamic_sections_created;
3620   entry->privfd = entry->plt
3621     || entry->fdgoff17m4 || entry->fdgoffhilo
3622     || ((entry->fd || entry->fdgot17m4 || entry->fdgothilo)
3623         && (entry->symndx != -1
3624             || BFINFDPIC_FUNCDESC_LOCAL (dinfo->info, entry->d.h)));
3625   entry->lazyplt = entry->privfd
3626     && entry->symndx == -1 && ! BFINFDPIC_SYM_LOCAL (dinfo->info, entry->d.h)
3627     && ! (dinfo->info->flags & DF_BIND_NOW)
3628     && elf_hash_table (dinfo->info)->dynamic_sections_created;
3629
3630   /* Allocate space for a function descriptor.  */
3631   if (entry->fdgoff17m4)
3632     dinfo->fd17m4 += 8;
3633   else if (entry->privfd && entry->plt)
3634     dinfo->fdplt += 8;
3635   else if (entry->privfd)
3636     dinfo->fdhilo += 8;
3637   else
3638     entry->relocsfdv--;
3639   entry->relocsfdv++;
3640
3641   if (entry->lazyplt)
3642     dinfo->lzplt += LZPLT_NORMAL_SIZE;
3643
3644   if (!dinfo->info->executable || dinfo->info->pie)
3645     relocs = entry->relocs32 + entry->relocsfd + entry->relocsfdv;
3646   else
3647     {
3648       if (entry->symndx != -1 || BFINFDPIC_SYM_LOCAL (dinfo->info, entry->d.h))
3649         {
3650           if (entry->symndx != -1
3651               || entry->d.h->root.type != bfd_link_hash_undefweak)
3652             fixups += entry->relocs32 + 2 * entry->relocsfdv;
3653         }
3654       else
3655         relocs += entry->relocs32 + entry->relocsfdv;
3656
3657       if (entry->symndx != -1
3658           || BFINFDPIC_FUNCDESC_LOCAL (dinfo->info, entry->d.h))
3659         {
3660           if (entry->symndx != -1
3661               || entry->d.h->root.type != bfd_link_hash_undefweak)
3662             fixups += entry->relocsfd;
3663         }
3664       else
3665         relocs += entry->relocsfd;
3666     }
3667
3668   entry->dynrelocs += relocs;
3669   entry->fixups += fixups;
3670   dinfo->relocs += relocs;
3671   dinfo->fixups += fixups;
3672
3673   return 1;
3674 }
3675
3676 /* This structure is used to assign offsets to got entries, function
3677    descriptors, plt entries and lazy plt entries.  */
3678
3679 struct _bfinfdpic_dynamic_got_plt_info
3680 {
3681   /* Summary information collected with _bfinfdpic_count_got_plt_entries.  */
3682   struct _bfinfdpic_dynamic_got_info g;
3683
3684   /* For each addressable range, we record a MAX (positive) and MIN
3685      (negative) value.  CUR is used to assign got entries, and it's
3686      incremented from an initial positive value to MAX, then from MIN
3687      to FDCUR (unless FDCUR wraps around first).  FDCUR is used to
3688      assign function descriptors, and it's decreased from an initial
3689      non-positive value to MIN, then from MAX down to CUR (unless CUR
3690      wraps around first).  All of MIN, MAX, CUR and FDCUR always point
3691      to even words.  ODD, if non-zero, indicates an odd word to be
3692      used for the next got entry, otherwise CUR is used and
3693      incremented by a pair of words, wrapping around when it reaches
3694      MAX.  FDCUR is decremented (and wrapped) before the next function
3695      descriptor is chosen.  FDPLT indicates the number of remaining
3696      slots that can be used for function descriptors used only by PLT
3697      entries.  */
3698   struct _bfinfdpic_dynamic_got_alloc_data
3699   {
3700     bfd_signed_vma max, cur, odd, fdcur, min;
3701     bfd_vma fdplt;
3702   } got17m4, gothilo;
3703 };
3704
3705 /* Determine the positive and negative ranges to be used by each
3706    offset range in the GOT.  FDCUR and CUR, that must be aligned to a
3707    double-word boundary, are the minimum (negative) and maximum
3708    (positive) GOT offsets already used by previous ranges, except for
3709    an ODD entry that may have been left behind.  GOT and FD indicate
3710    the size of GOT entries and function descriptors that must be
3711    placed within the range from -WRAP to WRAP.  If there's room left,
3712    up to FDPLT bytes should be reserved for additional function
3713    descriptors.  */
3714
3715 inline static bfd_signed_vma
3716 _bfinfdpic_compute_got_alloc_data (struct _bfinfdpic_dynamic_got_alloc_data *gad,
3717                                    bfd_signed_vma fdcur,
3718                                    bfd_signed_vma odd,
3719                                    bfd_signed_vma cur,
3720                                    bfd_vma got,
3721                                    bfd_vma fd,
3722                                    bfd_vma fdplt,
3723                                    bfd_vma wrap)
3724 {
3725   bfd_signed_vma wrapmin = -wrap;
3726
3727   /* Start at the given initial points.  */
3728   gad->fdcur = fdcur;
3729   gad->cur = cur;
3730
3731   /* If we had an incoming odd word and we have any got entries that
3732      are going to use it, consume it, otherwise leave gad->odd at
3733      zero.  We might force gad->odd to zero and return the incoming
3734      odd such that it is used by the next range, but then GOT entries
3735      might appear to be out of order and we wouldn't be able to
3736      shorten the GOT by one word if it turns out to end with an
3737      unpaired GOT entry.  */
3738   if (odd && got)
3739     {
3740       gad->odd = odd;
3741       got -= 4;
3742       odd = 0;
3743     }
3744   else
3745     gad->odd = 0;
3746
3747   /* If we're left with an unpaired GOT entry, compute its location
3748      such that we can return it.  Otherwise, if got doesn't require an
3749      odd number of words here, either odd was already zero in the
3750      block above, or it was set to zero because got was non-zero, or
3751      got was already zero.  In the latter case, we want the value of
3752      odd to carry over to the return statement, so we don't want to
3753      reset odd unless the condition below is true.  */
3754   if (got & 4)
3755     {
3756       odd = cur + got;
3757       got += 4;
3758     }
3759
3760   /* Compute the tentative boundaries of this range.  */
3761   gad->max = cur + got;
3762   gad->min = fdcur - fd;
3763   gad->fdplt = 0;
3764
3765   /* If function descriptors took too much space, wrap some of them
3766      around.  */
3767   if (gad->min < wrapmin)
3768     {
3769       gad->max += wrapmin - gad->min;
3770       gad->min = wrapmin;
3771     }
3772   /* If there is space left and we have function descriptors
3773      referenced in PLT entries that could take advantage of shorter
3774      offsets, place them here.  */
3775   else if (fdplt && gad->min > wrapmin)
3776     {
3777       bfd_vma fds;
3778       if ((bfd_vma) (gad->min - wrapmin) < fdplt)
3779         fds = gad->min - wrapmin;
3780       else
3781         fds = fdplt;
3782
3783       fdplt -= fds;
3784       gad->min -= fds;
3785       gad->fdplt += fds;
3786     }
3787
3788   /* If GOT entries took too much space, wrap some of them around.
3789      This may well cause gad->min to become lower than wrapmin.  This
3790      will cause a relocation overflow later on, so we don't have to
3791      report it here . */
3792   if ((bfd_vma) gad->max > wrap)
3793     {
3794       gad->min -= gad->max - wrap;
3795       gad->max = wrap;
3796     }
3797   /* If there is more space left, try to place some more function
3798      descriptors for PLT entries.  */
3799   else if (fdplt && (bfd_vma) gad->max < wrap)
3800     {
3801       bfd_vma fds;
3802       if ((bfd_vma) (wrap - gad->max) < fdplt)
3803         fds = wrap - gad->max;
3804       else
3805         fds = fdplt;
3806
3807       fdplt -= fds;
3808       gad->max += fds;
3809       gad->fdplt += fds;
3810     }
3811
3812   /* If odd was initially computed as an offset past the wrap point,
3813      wrap it around.  */
3814   if (odd > gad->max)
3815     odd = gad->min + odd - gad->max;
3816
3817   /* _bfinfdpic_get_got_entry() below will always wrap gad->cur if needed
3818      before returning, so do it here too.  This guarantees that,
3819      should cur and fdcur meet at the wrap point, they'll both be
3820      equal to min.  */
3821   if (gad->cur == gad->max)
3822     gad->cur = gad->min;
3823
3824   return odd;
3825 }
3826
3827 /* Compute the location of the next GOT entry, given the allocation
3828    data for a range.  */
3829
3830 inline static bfd_signed_vma
3831 _bfinfdpic_get_got_entry (struct _bfinfdpic_dynamic_got_alloc_data *gad)
3832 {
3833   bfd_signed_vma ret;
3834
3835   if (gad->odd)
3836     {
3837       /* If there was an odd word left behind, use it.  */
3838       ret = gad->odd;
3839       gad->odd = 0;
3840     }
3841   else
3842     {
3843       /* Otherwise, use the word pointed to by cur, reserve the next
3844          as an odd word, and skip to the next pair of words, possibly
3845          wrapping around.  */
3846       ret = gad->cur;
3847       gad->odd = gad->cur + 4;
3848       gad->cur += 8;
3849       if (gad->cur == gad->max)
3850         gad->cur = gad->min;
3851     }
3852
3853   return ret;
3854 }
3855
3856 /* Compute the location of the next function descriptor entry in the
3857    GOT, given the allocation data for a range.  */
3858
3859 inline static bfd_signed_vma
3860 _bfinfdpic_get_fd_entry (struct _bfinfdpic_dynamic_got_alloc_data *gad)
3861 {
3862   /* If we're at the bottom, wrap around, and only then allocate the
3863      next pair of words.  */
3864   if (gad->fdcur == gad->min)
3865     gad->fdcur = gad->max;
3866   return gad->fdcur -= 8;
3867 }
3868
3869 /* Assign GOT offsets for every GOT entry and function descriptor.
3870    Doing everything in a single pass is tricky.  */
3871
3872 static int
3873 _bfinfdpic_assign_got_entries (void **entryp, void *info_)
3874 {
3875   struct bfinfdpic_relocs_info *entry = *entryp;
3876   struct _bfinfdpic_dynamic_got_plt_info *dinfo = info_;
3877
3878   if (entry->got17m4)
3879     entry->got_entry = _bfinfdpic_get_got_entry (&dinfo->got17m4);
3880   else if (entry->gothilo)
3881     entry->got_entry = _bfinfdpic_get_got_entry (&dinfo->gothilo);
3882
3883   if (entry->fdgot17m4)
3884     entry->fdgot_entry = _bfinfdpic_get_got_entry (&dinfo->got17m4);
3885   else if (entry->fdgothilo)
3886     entry->fdgot_entry = _bfinfdpic_get_got_entry (&dinfo->gothilo);
3887
3888   if (entry->fdgoff17m4)
3889     entry->fd_entry = _bfinfdpic_get_fd_entry (&dinfo->got17m4);
3890   else if (entry->plt && dinfo->got17m4.fdplt)
3891     {
3892       dinfo->got17m4.fdplt -= 8;
3893       entry->fd_entry = _bfinfdpic_get_fd_entry (&dinfo->got17m4);
3894     }
3895   else if (entry->plt)
3896     {
3897       dinfo->gothilo.fdplt -= 8;
3898       entry->fd_entry = _bfinfdpic_get_fd_entry (&dinfo->gothilo);
3899     }
3900   else if (entry->privfd)
3901     entry->fd_entry = _bfinfdpic_get_fd_entry (&dinfo->gothilo);
3902
3903   return 1;
3904 }
3905
3906 /* Assign GOT offsets to private function descriptors used by PLT
3907    entries (or referenced by 32-bit offsets), as well as PLT entries
3908    and lazy PLT entries.  */
3909
3910 static int
3911 _bfinfdpic_assign_plt_entries (void **entryp, void *info_)
3912 {
3913   struct bfinfdpic_relocs_info *entry = *entryp;
3914   struct _bfinfdpic_dynamic_got_plt_info *dinfo = info_;
3915
3916   /* If this symbol requires a local function descriptor, allocate
3917      one.  */
3918   if (entry->privfd && entry->fd_entry == 0)
3919     {
3920       if (dinfo->got17m4.fdplt)
3921         {
3922           entry->fd_entry = _bfinfdpic_get_fd_entry (&dinfo->got17m4);
3923           dinfo->got17m4.fdplt -= 8;
3924         }
3925       else
3926         {
3927           BFD_ASSERT (dinfo->gothilo.fdplt);
3928           entry->fd_entry = _bfinfdpic_get_fd_entry (&dinfo->gothilo);
3929           dinfo->gothilo.fdplt -= 8;
3930         }
3931     }
3932
3933   if (entry->plt)
3934     {
3935       int size;
3936
3937       /* We use the section's raw size to mark the location of the
3938          next PLT entry.  */
3939       entry->plt_entry = bfinfdpic_plt_section (dinfo->g.info)->size;
3940
3941       /* Figure out the length of this PLT entry based on the
3942          addressing mode we need to reach the function descriptor.  */
3943       BFD_ASSERT (entry->fd_entry);
3944       if (entry->fd_entry >= -(1 << (18 - 1))
3945           && entry->fd_entry + 4 < (1 << (18 - 1)))
3946         size = 10;
3947       else
3948         size = 16;
3949
3950       bfinfdpic_plt_section (dinfo->g.info)->size += size;
3951     }
3952
3953   if (entry->lazyplt)
3954     {
3955       entry->lzplt_entry = dinfo->g.lzplt;
3956       dinfo->g.lzplt += LZPLT_NORMAL_SIZE;
3957       /* If this entry is the one that gets the resolver stub, account
3958          for the additional instruction.  */
3959       if (entry->lzplt_entry % BFINFDPIC_LZPLT_BLOCK_SIZE
3960           == BFINFDPIC_LZPLT_RESOLV_LOC)
3961         dinfo->g.lzplt += LZPLT_RESOLVER_EXTRA;
3962     }
3963
3964   return 1;
3965 }
3966
3967 /* Follow indirect and warning hash entries so that each got entry
3968    points to the final symbol definition.  P must point to a pointer
3969    to the hash table we're traversing.  Since this traversal may
3970    modify the hash table, we set this pointer to NULL to indicate
3971    we've made a potentially-destructive change to the hash table, so
3972    the traversal must be restarted.  */
3973 static int
3974 _bfinfdpic_resolve_final_relocs_info (void **entryp, void *p)
3975 {
3976   struct bfinfdpic_relocs_info *entry = *entryp;
3977   htab_t *htab = p;
3978
3979   if (entry->symndx == -1)
3980     {
3981       struct elf_link_hash_entry *h = entry->d.h;
3982       struct bfinfdpic_relocs_info *oentry;
3983
3984       while (h->root.type == bfd_link_hash_indirect
3985              || h->root.type == bfd_link_hash_warning)
3986         h = (struct elf_link_hash_entry *)h->root.u.i.link;
3987
3988       if (entry->d.h == h)
3989         return 1;
3990
3991       oentry = bfinfdpic_relocs_info_for_global (*htab, 0, h, entry->addend,
3992                                                 NO_INSERT);
3993
3994       if (oentry)
3995         {
3996           /* Merge the two entries.  */
3997           bfinfdpic_pic_merge_early_relocs_info (oentry, entry);
3998           htab_clear_slot (*htab, entryp);
3999           return 1;
4000         }
4001
4002       entry->d.h = h;
4003
4004       /* If we can't find this entry with the new bfd hash, re-insert
4005          it, and get the traversal restarted.  */
4006       if (! htab_find (*htab, entry))
4007         {
4008           htab_clear_slot (*htab, entryp);
4009           entryp = htab_find_slot (*htab, entry, INSERT);
4010           if (! *entryp)
4011             *entryp = entry;
4012           /* Abort the traversal, since the whole table may have
4013              moved, and leave it up to the parent to restart the
4014              process.  */
4015           *(htab_t *)p = NULL;
4016           return 0;
4017         }
4018     }
4019
4020   return 1;
4021 }
4022
4023 /* Set the sizes of the dynamic sections.  */
4024
4025 static bfd_boolean
4026 elf32_bfinfdpic_size_dynamic_sections (bfd *output_bfd,
4027                                       struct bfd_link_info *info)
4028 {
4029   bfd *dynobj;
4030   asection *s;
4031   struct _bfinfdpic_dynamic_got_plt_info gpinfo;
4032   bfd_signed_vma odd;
4033   bfd_vma limit;
4034
4035   dynobj = elf_hash_table (info)->dynobj;
4036   BFD_ASSERT (dynobj != NULL);
4037
4038   if (elf_hash_table (info)->dynamic_sections_created)
4039     {
4040       /* Set the contents of the .interp section to the interpreter.  */
4041       if (info->executable)
4042         {
4043           s = bfd_get_section_by_name (dynobj, ".interp");
4044           BFD_ASSERT (s != NULL);
4045           s->size = sizeof ELF_DYNAMIC_INTERPRETER;
4046           s->contents = (bfd_byte *) ELF_DYNAMIC_INTERPRETER;
4047         }
4048     }
4049
4050   memset (&gpinfo, 0, sizeof (gpinfo));
4051   gpinfo.g.info = info;
4052
4053   for (;;)
4054     {
4055       htab_t relocs = bfinfdpic_relocs_info (info);
4056
4057       htab_traverse (relocs, _bfinfdpic_resolve_final_relocs_info, &relocs);
4058
4059       if (relocs == bfinfdpic_relocs_info (info))
4060         break;
4061     }
4062
4063   htab_traverse (bfinfdpic_relocs_info (info), _bfinfdpic_count_got_plt_entries,
4064                  &gpinfo.g);
4065
4066   odd = 12;
4067   /* Compute the total size taken by entries in the 18-bit range,
4068      to tell how many PLT function descriptors we can bring into it
4069      without causing it to overflow.  */
4070   limit = odd + gpinfo.g.got17m4 + gpinfo.g.fd17m4;
4071   if (limit < (bfd_vma)1 << 18)
4072     limit = ((bfd_vma)1 << 18) - limit;
4073   else
4074     limit = 0;
4075   if (gpinfo.g.fdplt < limit)
4076     limit = gpinfo.g.fdplt;
4077
4078   /* Determine the ranges of GOT offsets that we can use for each
4079      range of addressing modes.  */
4080   odd = _bfinfdpic_compute_got_alloc_data (&gpinfo.got17m4,
4081                                           0,
4082                                           odd,
4083                                           16,
4084                                           gpinfo.g.got17m4,
4085                                           gpinfo.g.fd17m4,
4086                                           limit,
4087                                           (bfd_vma)1 << (18-1));
4088   odd = _bfinfdpic_compute_got_alloc_data (&gpinfo.gothilo,
4089                                           gpinfo.got17m4.min,
4090                                           odd,
4091                                           gpinfo.got17m4.max,
4092                                           gpinfo.g.gothilo,
4093                                           gpinfo.g.fdhilo,
4094                                           gpinfo.g.fdplt - gpinfo.got17m4.fdplt,
4095                                           (bfd_vma)1 << (32-1));
4096
4097   /* Now assign (most) GOT offsets.  */
4098   htab_traverse (bfinfdpic_relocs_info (info), _bfinfdpic_assign_got_entries,
4099                  &gpinfo);
4100
4101   bfinfdpic_got_section (info)->size = gpinfo.gothilo.max
4102     - gpinfo.gothilo.min
4103     /* If an odd word is the last word of the GOT, we don't need this
4104        word to be part of the GOT.  */
4105     - (odd + 4 == gpinfo.gothilo.max ? 4 : 0);
4106   if (bfinfdpic_got_section (info)->size == 0)
4107     bfinfdpic_got_section (info)->flags |= SEC_EXCLUDE;
4108   else if (bfinfdpic_got_section (info)->size == 12
4109            && ! elf_hash_table (info)->dynamic_sections_created)
4110     {
4111       bfinfdpic_got_section (info)->flags |= SEC_EXCLUDE;
4112       bfinfdpic_got_section (info)->size = 0;
4113     }
4114   else
4115     {
4116       bfinfdpic_got_section (info)->contents =
4117         (bfd_byte *) bfd_zalloc (dynobj,
4118                                  bfinfdpic_got_section (info)->size);
4119       if (bfinfdpic_got_section (info)->contents == NULL)
4120         return FALSE;
4121     }
4122
4123   if (elf_hash_table (info)->dynamic_sections_created)
4124     /* Subtract the number of lzplt entries, since those will generate
4125        relocations in the pltrel section.  */
4126     bfinfdpic_gotrel_section (info)->size =
4127       (gpinfo.g.relocs - gpinfo.g.lzplt / LZPLT_NORMAL_SIZE)
4128       * get_elf_backend_data (output_bfd)->s->sizeof_rel;
4129   else
4130     BFD_ASSERT (gpinfo.g.relocs == 0);
4131   if (bfinfdpic_gotrel_section (info)->size == 0)
4132     bfinfdpic_gotrel_section (info)->flags |= SEC_EXCLUDE;
4133   else
4134     {
4135       bfinfdpic_gotrel_section (info)->contents =
4136         (bfd_byte *) bfd_zalloc (dynobj,
4137                                  bfinfdpic_gotrel_section (info)->size);
4138       if (bfinfdpic_gotrel_section (info)->contents == NULL)
4139         return FALSE;
4140     }
4141
4142   bfinfdpic_gotfixup_section (info)->size = (gpinfo.g.fixups + 1) * 4;
4143   if (bfinfdpic_gotfixup_section (info)->size == 0)
4144     bfinfdpic_gotfixup_section (info)->flags |= SEC_EXCLUDE;
4145   else
4146     {
4147       bfinfdpic_gotfixup_section (info)->contents =
4148         (bfd_byte *) bfd_zalloc (dynobj,
4149                                  bfinfdpic_gotfixup_section (info)->size);
4150       if (bfinfdpic_gotfixup_section (info)->contents == NULL)
4151         return FALSE;
4152     }
4153
4154   if (elf_hash_table (info)->dynamic_sections_created)
4155     {
4156       bfinfdpic_pltrel_section (info)->size =
4157         gpinfo.g.lzplt / LZPLT_NORMAL_SIZE * get_elf_backend_data (output_bfd)->s->sizeof_rel;
4158       if (bfinfdpic_pltrel_section (info)->size == 0)
4159         bfinfdpic_pltrel_section (info)->flags |= SEC_EXCLUDE;
4160       else
4161         {
4162           bfinfdpic_pltrel_section (info)->contents =
4163             (bfd_byte *) bfd_zalloc (dynobj,
4164                                      bfinfdpic_pltrel_section (info)->size);
4165           if (bfinfdpic_pltrel_section (info)->contents == NULL)
4166             return FALSE;
4167         }
4168     }
4169
4170   /* Add 4 bytes for every block of at most 65535 lazy PLT entries,
4171      such that there's room for the additional instruction needed to
4172      call the resolver.  Since _bfinfdpic_assign_got_entries didn't
4173      account for them, our block size is 4 bytes smaller than the real
4174      block size.  */
4175   if (elf_hash_table (info)->dynamic_sections_created)
4176     {
4177       bfinfdpic_plt_section (info)->size = gpinfo.g.lzplt
4178         + ((gpinfo.g.lzplt + (BFINFDPIC_LZPLT_BLOCK_SIZE - 4) - LZPLT_NORMAL_SIZE)
4179            / (BFINFDPIC_LZPLT_BLOCK_SIZE - 4) * LZPLT_RESOLVER_EXTRA);
4180     }
4181
4182   /* Reset it, such that _bfinfdpic_assign_plt_entries() can use it to
4183      actually assign lazy PLT entries addresses.  */
4184   gpinfo.g.lzplt = 0;
4185
4186   /* Save information that we're going to need to generate GOT and PLT
4187      entries.  */
4188   bfinfdpic_got_initial_offset (info) = -gpinfo.gothilo.min;
4189
4190   if (get_elf_backend_data (output_bfd)->want_got_sym)
4191     elf_hash_table (info)->hgot->root.u.def.value
4192       += bfinfdpic_got_initial_offset (info);
4193
4194   if (elf_hash_table (info)->dynamic_sections_created)
4195     bfinfdpic_plt_initial_offset (info) =
4196       bfinfdpic_plt_section (info)->size;
4197
4198   htab_traverse (bfinfdpic_relocs_info (info), _bfinfdpic_assign_plt_entries,
4199                  &gpinfo);
4200
4201   /* Allocate the PLT section contents only after
4202      _bfinfdpic_assign_plt_entries has a chance to add the size of the
4203      non-lazy PLT entries.  */
4204   if (elf_hash_table (info)->dynamic_sections_created)
4205     {
4206       if (bfinfdpic_plt_section (info)->size == 0)
4207         bfinfdpic_plt_section (info)->flags |= SEC_EXCLUDE;
4208       else
4209         {
4210           bfinfdpic_plt_section (info)->contents =
4211             (bfd_byte *) bfd_zalloc (dynobj,
4212                                      bfinfdpic_plt_section (info)->size);
4213           if (bfinfdpic_plt_section (info)->contents == NULL)
4214             return FALSE;
4215         }
4216     }
4217
4218   if (elf_hash_table (info)->dynamic_sections_created)
4219     {
4220       if (bfinfdpic_got_section (info)->size)
4221         if (!_bfd_elf_add_dynamic_entry (info, DT_PLTGOT, 0))
4222           return FALSE;
4223
4224       if (bfinfdpic_pltrel_section (info)->size)
4225         if (!_bfd_elf_add_dynamic_entry (info, DT_PLTRELSZ, 0)
4226             || !_bfd_elf_add_dynamic_entry (info, DT_PLTREL, DT_REL)
4227             || !_bfd_elf_add_dynamic_entry (info, DT_JMPREL, 0))
4228           return FALSE;
4229
4230       if (bfinfdpic_gotrel_section (info)->size)
4231         if (!_bfd_elf_add_dynamic_entry (info, DT_REL, 0)
4232             || !_bfd_elf_add_dynamic_entry (info, DT_RELSZ, 0)
4233             || !_bfd_elf_add_dynamic_entry (info, DT_RELENT,
4234                                             sizeof (Elf32_External_Rel)))
4235           return FALSE;
4236     }
4237
4238   return TRUE;
4239 }
4240
4241 static bfd_boolean
4242 elf32_bfinfdpic_always_size_sections (bfd *output_bfd,
4243                                      struct bfd_link_info *info)
4244 {
4245   if (!info->relocatable)
4246     {
4247       struct elf_link_hash_entry *h;
4248
4249       /* Force a PT_GNU_STACK segment to be created.  */
4250       if (! elf_tdata (output_bfd)->stack_flags)
4251         elf_tdata (output_bfd)->stack_flags = PF_R | PF_W | PF_X;
4252
4253       /* Define __stacksize if it's not defined yet.  */
4254       h = elf_link_hash_lookup (elf_hash_table (info), "__stacksize",
4255                                 FALSE, FALSE, FALSE);
4256       if (! h || h->root.type != bfd_link_hash_defined
4257           || h->type != STT_OBJECT
4258           || !h->def_regular)
4259         {
4260           struct bfd_link_hash_entry *bh = NULL;
4261
4262           if (!(_bfd_generic_link_add_one_symbol
4263                 (info, output_bfd, "__stacksize",
4264                  BSF_GLOBAL, bfd_abs_section_ptr, DEFAULT_STACK_SIZE,
4265                  (const char *) NULL, FALSE,
4266                  get_elf_backend_data (output_bfd)->collect, &bh)))
4267             return FALSE;
4268
4269           h = (struct elf_link_hash_entry *) bh;
4270           h->def_regular = 1;
4271           h->type = STT_OBJECT;
4272         }
4273     }
4274
4275   return TRUE;
4276 }
4277
4278 static bfd_boolean
4279 elf32_bfinfdpic_modify_program_headers (bfd *output_bfd,
4280                                         struct bfd_link_info *info)
4281 {
4282   struct elf_obj_tdata *tdata = elf_tdata (output_bfd);
4283   struct elf_segment_map *m;
4284   Elf_Internal_Phdr *p;
4285
4286   /* objcopy and strip preserve what's already there using
4287      elf32_bfinfdpic_copy_private_bfd_data ().  */
4288   if (! info)
4289     return TRUE;
4290
4291   for (p = tdata->phdr, m = tdata->segment_map; m != NULL; m = m->next, p++)
4292     if (m->p_type == PT_GNU_STACK)
4293       break;
4294
4295   if (m)
4296     {
4297       struct elf_link_hash_entry *h;
4298
4299       /* Obtain the pointer to the __stacksize symbol.  */
4300       h = elf_link_hash_lookup (elf_hash_table (info), "__stacksize",
4301                                 FALSE, FALSE, FALSE);
4302       if (h)
4303         {
4304           while (h->root.type == bfd_link_hash_indirect
4305                  || h->root.type == bfd_link_hash_warning)
4306             h = (struct elf_link_hash_entry *) h->root.u.i.link;
4307           BFD_ASSERT (h->root.type == bfd_link_hash_defined);
4308         }
4309
4310       /* Set the header p_memsz from the symbol value.  We
4311          intentionally ignore the symbol section.  */
4312       if (h && h->root.type == bfd_link_hash_defined)
4313         p->p_memsz = h->root.u.def.value;
4314       else
4315         p->p_memsz = DEFAULT_STACK_SIZE;
4316
4317       p->p_align = 8;
4318     }
4319
4320   return TRUE;
4321 }
4322
4323 static bfd_boolean
4324 elf32_bfinfdpic_finish_dynamic_sections (bfd *output_bfd,
4325                                         struct bfd_link_info *info)
4326 {
4327   bfd *dynobj;
4328   asection *sdyn;
4329
4330   dynobj = elf_hash_table (info)->dynobj;
4331
4332   if (bfinfdpic_got_section (info))
4333     {
4334       BFD_ASSERT (bfinfdpic_gotrel_section (info)->size
4335                   == (bfinfdpic_gotrel_section (info)->reloc_count
4336                       * sizeof (Elf32_External_Rel)));
4337
4338       if (bfinfdpic_gotfixup_section (info))
4339         {
4340           struct elf_link_hash_entry *hgot = elf_hash_table (info)->hgot;
4341           bfd_vma got_value = hgot->root.u.def.value
4342             + hgot->root.u.def.section->output_section->vma
4343             + hgot->root.u.def.section->output_offset;
4344
4345           _bfinfdpic_add_rofixup (output_bfd, bfinfdpic_gotfixup_section (info),
4346                                  got_value, 0);
4347
4348           if (bfinfdpic_gotfixup_section (info)->size
4349               != (bfinfdpic_gotfixup_section (info)->reloc_count * 4))
4350             {
4351               (*_bfd_error_handler)
4352                 ("LINKER BUG: .rofixup section size mismatch");
4353               return FALSE;
4354             }
4355         }
4356     }
4357   if (elf_hash_table (info)->dynamic_sections_created)
4358     {
4359       BFD_ASSERT (bfinfdpic_pltrel_section (info)->size
4360                   == (bfinfdpic_pltrel_section (info)->reloc_count
4361                       * sizeof (Elf32_External_Rel)));
4362     }
4363
4364   sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
4365
4366   if (elf_hash_table (info)->dynamic_sections_created)
4367     {
4368       Elf32_External_Dyn * dyncon;
4369       Elf32_External_Dyn * dynconend;
4370
4371       BFD_ASSERT (sdyn != NULL);
4372
4373       dyncon = (Elf32_External_Dyn *) sdyn->contents;
4374       dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
4375
4376       for (; dyncon < dynconend; dyncon++)
4377         {
4378           Elf_Internal_Dyn dyn;
4379
4380           bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
4381
4382           switch (dyn.d_tag)
4383             {
4384             default:
4385               break;
4386
4387             case DT_PLTGOT:
4388               dyn.d_un.d_ptr = bfinfdpic_got_section (info)->output_section->vma
4389                 + bfinfdpic_got_section (info)->output_offset
4390                 + bfinfdpic_got_initial_offset (info);
4391               bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
4392               break;
4393
4394             case DT_JMPREL:
4395               dyn.d_un.d_ptr = bfinfdpic_pltrel_section (info)
4396                 ->output_section->vma
4397                 + bfinfdpic_pltrel_section (info)->output_offset;
4398               bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
4399               break;
4400
4401             case DT_PLTRELSZ:
4402               dyn.d_un.d_val = bfinfdpic_pltrel_section (info)->size;
4403               bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
4404               break;
4405             }
4406         }
4407     }
4408
4409   return TRUE;
4410 }
4411
4412 /* Adjust a symbol defined by a dynamic object and referenced by a
4413    regular object.  */
4414
4415 static bfd_boolean
4416 elf32_bfinfdpic_adjust_dynamic_symbol
4417 (struct bfd_link_info *info,
4418  struct elf_link_hash_entry *h)
4419 {
4420   bfd * dynobj;
4421
4422   dynobj = elf_hash_table (info)->dynobj;
4423
4424   /* Make sure we know what is going on here.  */
4425   BFD_ASSERT (dynobj != NULL
4426               && (h->u.weakdef != NULL
4427                   || (h->def_dynamic
4428                       && h->ref_regular
4429                       && !h->def_regular)));
4430
4431   /* If this is a weak symbol, and there is a real definition, the
4432      processor independent code will have arranged for us to see the
4433      real definition first, and we can just use the same value.  */
4434   if (h->u.weakdef != NULL)
4435     {
4436       BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
4437                   || h->u.weakdef->root.type == bfd_link_hash_defweak);
4438       h->root.u.def.section = h->u.weakdef->root.u.def.section;
4439       h->root.u.def.value = h->u.weakdef->root.u.def.value;
4440     }
4441
4442   return TRUE;
4443 }
4444
4445 /* Perform any actions needed for dynamic symbols.  */
4446
4447 static bfd_boolean
4448 elf32_bfinfdpic_finish_dynamic_symbol
4449 (bfd *output_bfd ATTRIBUTE_UNUSED,
4450  struct bfd_link_info *info ATTRIBUTE_UNUSED,
4451  struct elf_link_hash_entry *h ATTRIBUTE_UNUSED,
4452  Elf_Internal_Sym *sym ATTRIBUTE_UNUSED)
4453 {
4454   return TRUE;
4455 }
4456
4457 /* Decide whether to attempt to turn absptr or lsda encodings in
4458    shared libraries into pcrel within the given input section.  */
4459
4460 static bfd_boolean
4461 bfinfdpic_elf_use_relative_eh_frame
4462 (bfd *input_bfd ATTRIBUTE_UNUSED,
4463  struct bfd_link_info *info ATTRIBUTE_UNUSED,
4464  asection *eh_frame_section ATTRIBUTE_UNUSED)
4465 {
4466   /* We can't use PC-relative encodings in FDPIC binaries, in general.  */
4467   return FALSE;
4468 }
4469
4470 /* Adjust the contents of an eh_frame_hdr section before they're output.  */
4471
4472 static bfd_byte
4473 bfinfdpic_elf_encode_eh_address (bfd *abfd,
4474                                 struct bfd_link_info *info,
4475                                 asection *osec, bfd_vma offset,
4476                                 asection *loc_sec, bfd_vma loc_offset,
4477                                 bfd_vma *encoded)
4478 {
4479   struct elf_link_hash_entry *h;
4480
4481   h = elf_hash_table (info)->hgot;
4482   BFD_ASSERT (h && h->root.type == bfd_link_hash_defined);
4483
4484   if (! h || (_bfinfdpic_osec_to_segment (abfd, osec)
4485               == _bfinfdpic_osec_to_segment (abfd, loc_sec->output_section)))
4486     return _bfd_elf_encode_eh_address (abfd, info, osec, offset,
4487                                        loc_sec, loc_offset, encoded);
4488
4489   BFD_ASSERT (_bfinfdpic_osec_to_segment (abfd, osec)
4490               == (_bfinfdpic_osec_to_segment
4491                   (abfd, h->root.u.def.section->output_section)));
4492
4493   *encoded = osec->vma + offset
4494     - (h->root.u.def.value
4495        + h->root.u.def.section->output_section->vma
4496        + h->root.u.def.section->output_offset);
4497
4498   return DW_EH_PE_datarel | DW_EH_PE_sdata4;
4499 }
4500
4501
4502
4503 /* Look through the relocs for a section during the first phase.
4504
4505    Besides handling virtual table relocs for gc, we have to deal with
4506    all sorts of PIC-related relocations.  We describe below the
4507    general plan on how to handle such relocations, even though we only
4508    collect information at this point, storing them in hash tables for
4509    perusal of later passes.
4510
4511    32 relocations are propagated to the linker output when creating
4512    position-independent output.  LO16 and HI16 relocations are not
4513    supposed to be encountered in this case.
4514
4515    LABEL16 should always be resolvable by the linker, since it's only
4516    used by branches.
4517
4518    LABEL24, on the other hand, is used by calls.  If it turns out that
4519    the target of a call is a dynamic symbol, a PLT entry must be
4520    created for it, which triggers the creation of a private function
4521    descriptor and, unless lazy binding is disabled, a lazy PLT entry.
4522
4523    GPREL relocations require the referenced symbol to be in the same
4524    segment as _gp, but this can only be checked later.
4525
4526    All GOT, GOTOFF and FUNCDESC relocations require a .got section to
4527    exist.  LABEL24 might as well, since it may require a PLT entry,
4528    that will require a got.
4529
4530    Non-FUNCDESC GOT relocations require a GOT entry to be created
4531    regardless of whether the symbol is dynamic.  However, since a
4532    global symbol that turns out to not be exported may have the same
4533    address of a non-dynamic symbol, we don't assign GOT entries at
4534    this point, such that we can share them in this case.  A relocation
4535    for the GOT entry always has to be created, be it to offset a
4536    private symbol by the section load address, be it to get the symbol
4537    resolved dynamically.
4538
4539    FUNCDESC GOT relocations require a GOT entry to be created, and
4540    handled as if a FUNCDESC relocation was applied to the GOT entry in
4541    an object file.
4542
4543    FUNCDESC relocations referencing a symbol that turns out to NOT be
4544    dynamic cause a private function descriptor to be created.  The
4545    FUNCDESC relocation then decays to a 32 relocation that points at
4546    the private descriptor.  If the symbol is dynamic, the FUNCDESC
4547    relocation is propagated to the linker output, such that the
4548    dynamic linker creates the canonical descriptor, pointing to the
4549    dynamically-resolved definition of the function.
4550
4551    Non-FUNCDESC GOTOFF relocations must always refer to non-dynamic
4552    symbols that are assigned to the same segment as the GOT, but we
4553    can only check this later, after we know the complete set of
4554    symbols defined and/or exported.
4555
4556    FUNCDESC GOTOFF relocations require a function descriptor to be
4557    created and, unless lazy binding is disabled or the symbol is not
4558    dynamic, a lazy PLT entry.  Since we can't tell at this point
4559    whether a symbol is going to be dynamic, we have to decide later
4560    whether to create a lazy PLT entry or bind the descriptor directly
4561    to the private function.
4562
4563    FUNCDESC_VALUE relocations are not supposed to be present in object
4564    files, but they may very well be simply propagated to the linker
4565    output, since they have no side effect.
4566
4567
4568    A function descriptor always requires a FUNCDESC_VALUE relocation.
4569    Whether it's in .plt.rel or not depends on whether lazy binding is
4570    enabled and on whether the referenced symbol is dynamic.
4571
4572    The existence of a lazy PLT requires the resolverStub lazy PLT
4573    entry to be present.
4574
4575
4576    As for assignment of GOT, PLT and lazy PLT entries, and private
4577    descriptors, we might do them all sequentially, but we can do
4578    better than that.  For example, we can place GOT entries and
4579    private function descriptors referenced using 12-bit operands
4580    closer to the PIC register value, such that these relocations don't
4581    overflow.  Those that are only referenced with LO16 relocations
4582    could come next, but we may as well place PLT-required function
4583    descriptors in the 12-bit range to make them shorter.  Symbols
4584    referenced with LO16/HI16 may come next, but we may place
4585    additional function descriptors in the 16-bit range if we can
4586    reliably tell that we've already placed entries that are ever
4587    referenced with only LO16.  PLT entries are therefore generated as
4588    small as possible, while not introducing relocation overflows in
4589    GOT or FUNCDESC_GOTOFF relocations.  Lazy PLT entries could be
4590    generated before or after PLT entries, but not intermingled with
4591    them, such that we can have more lazy PLT entries in range for a
4592    branch to the resolverStub.  The resolverStub should be emitted at
4593    the most distant location from the first lazy PLT entry such that
4594    it's still in range for a branch, or closer, if there isn't a need
4595    for so many lazy PLT entries.  Additional lazy PLT entries may be
4596    emitted after the resolverStub, as long as branches are still in
4597    range.  If the branch goes out of range, longer lazy PLT entries
4598    are emitted.
4599
4600    We could further optimize PLT and lazy PLT entries by giving them
4601    priority in assignment to closer-to-gr17 locations depending on the
4602    number of occurrences of references to them (assuming a function
4603    that's called more often is more important for performance, so its
4604    PLT entry should be faster), or taking hints from the compiler.
4605    Given infinite time and money... :-)  */
4606
4607 static bfd_boolean
4608 bfinfdpic_check_relocs (bfd *abfd, struct bfd_link_info *info,
4609                         asection *sec, const Elf_Internal_Rela *relocs)
4610 {
4611   Elf_Internal_Shdr *symtab_hdr;
4612   struct elf_link_hash_entry **sym_hashes;
4613   const Elf_Internal_Rela *rel;
4614   const Elf_Internal_Rela *rel_end;
4615   bfd *dynobj;
4616   struct bfinfdpic_relocs_info *picrel;
4617
4618   if (info->relocatable)
4619     return TRUE;
4620
4621   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
4622   sym_hashes = elf_sym_hashes (abfd);
4623
4624   dynobj = elf_hash_table (info)->dynobj;
4625   rel_end = relocs + sec->reloc_count;
4626   for (rel = relocs; rel < rel_end; rel++)
4627     {
4628       struct elf_link_hash_entry *h;
4629       unsigned long r_symndx;
4630
4631       r_symndx = ELF32_R_SYM (rel->r_info);
4632       if (r_symndx < symtab_hdr->sh_info)
4633         h = NULL;
4634       else
4635         h = sym_hashes[r_symndx - symtab_hdr->sh_info];
4636
4637       switch (ELF32_R_TYPE (rel->r_info))
4638         {
4639         case R_BFIN_GOT17M4:
4640         case R_BFIN_GOTHI:
4641         case R_BFIN_GOTLO:
4642         case R_BFIN_FUNCDESC_GOT17M4:
4643         case R_BFIN_FUNCDESC_GOTHI:
4644         case R_BFIN_FUNCDESC_GOTLO:
4645         case R_BFIN_GOTOFF17M4:
4646         case R_BFIN_GOTOFFHI:
4647         case R_BFIN_GOTOFFLO:
4648         case R_BFIN_FUNCDESC_GOTOFF17M4:
4649         case R_BFIN_FUNCDESC_GOTOFFHI:
4650         case R_BFIN_FUNCDESC_GOTOFFLO:
4651         case R_BFIN_FUNCDESC:
4652         case R_BFIN_FUNCDESC_VALUE:
4653           if (! IS_FDPIC (abfd))
4654             goto bad_reloc;
4655           /* Fall through.  */
4656         case R_BFIN_PCREL24:
4657         case R_BFIN_PCREL24_JUMP_L:
4658         case R_BFIN_BYTE4_DATA:
4659           if (IS_FDPIC (abfd) && ! dynobj)
4660             {
4661               elf_hash_table (info)->dynobj = dynobj = abfd;
4662               if (! _bfin_create_got_section (abfd, info))
4663                 return FALSE;
4664             }
4665           if (! IS_FDPIC (abfd))
4666             {
4667               picrel = NULL;
4668               break;
4669             }
4670           if (h != NULL)
4671             {
4672               if (h->dynindx == -1)
4673                 switch (ELF_ST_VISIBILITY (h->other))
4674                   {
4675                   case STV_INTERNAL:
4676                   case STV_HIDDEN:
4677                     break;
4678                   default:
4679                     bfd_elf_link_record_dynamic_symbol (info, h);
4680                     break;
4681                   }
4682               picrel
4683                 = bfinfdpic_relocs_info_for_global (bfinfdpic_relocs_info (info),
4684                                                    abfd, h,
4685                                                    rel->r_addend, INSERT);
4686             }
4687           else
4688             picrel = bfinfdpic_relocs_info_for_local (bfinfdpic_relocs_info
4689                                                      (info), abfd, r_symndx,
4690                                                      rel->r_addend, INSERT);
4691           if (! picrel)
4692             return FALSE;
4693           break;
4694
4695         default:
4696           picrel = NULL;
4697           break;
4698         }
4699
4700       switch (ELF32_R_TYPE (rel->r_info))
4701         {
4702         case R_BFIN_PCREL24:
4703         case R_BFIN_PCREL24_JUMP_L:
4704           if (IS_FDPIC (abfd))
4705             picrel->call++;
4706           break;
4707
4708         case R_BFIN_FUNCDESC_VALUE:
4709           picrel->relocsfdv++;
4710           if (bfd_get_section_flags (abfd, sec) & SEC_ALLOC)
4711             picrel->relocs32--;
4712           /* Fall through.  */
4713
4714         case R_BFIN_BYTE4_DATA:
4715           if (! IS_FDPIC (abfd))
4716             break;
4717
4718           picrel->sym++;
4719           if (bfd_get_section_flags (abfd, sec) & SEC_ALLOC)
4720             picrel->relocs32++;
4721           break;
4722
4723         case R_BFIN_GOT17M4:
4724           picrel->got17m4++;
4725           break;
4726
4727         case R_BFIN_GOTHI:
4728         case R_BFIN_GOTLO:
4729           picrel->gothilo++;
4730           break;
4731
4732         case R_BFIN_FUNCDESC_GOT17M4:
4733           picrel->fdgot17m4++;
4734           break;
4735
4736         case R_BFIN_FUNCDESC_GOTHI:
4737         case R_BFIN_FUNCDESC_GOTLO:
4738           picrel->fdgothilo++;
4739           break;
4740
4741         case R_BFIN_GOTOFF17M4:
4742         case R_BFIN_GOTOFFHI:
4743         case R_BFIN_GOTOFFLO:
4744           picrel->gotoff++;
4745           break;
4746
4747         case R_BFIN_FUNCDESC_GOTOFF17M4:
4748           picrel->fdgoff17m4++;
4749           break;
4750
4751         case R_BFIN_FUNCDESC_GOTOFFHI:
4752         case R_BFIN_FUNCDESC_GOTOFFLO:
4753           picrel->fdgoffhilo++;
4754           break;
4755
4756         case R_BFIN_FUNCDESC:
4757           picrel->fd++;
4758           picrel->relocsfd++;
4759           break;
4760
4761         /* This relocation describes the C++ object vtable hierarchy.
4762            Reconstruct it for later use during GC.  */
4763         case R_BFIN_GNU_VTINHERIT:
4764           if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
4765             return FALSE;
4766           break;
4767
4768         /* This relocation describes which C++ vtable entries are actually
4769            used.  Record for later use during GC.  */
4770         case R_BFIN_GNU_VTENTRY:
4771           BFD_ASSERT (h != NULL);
4772           if (h != NULL
4773               && !bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
4774             return FALSE;
4775           break;
4776
4777         case R_BFIN_HUIMM16:
4778         case R_BFIN_LUIMM16:
4779         case R_BFIN_PCREL12_JUMP_S:
4780         case R_BFIN_PCREL10:
4781           break;
4782
4783         default:
4784         bad_reloc:
4785           (*_bfd_error_handler)
4786             (_("%B: unsupported relocation type %i"),
4787              abfd, ELF32_R_TYPE (rel->r_info));
4788           return FALSE;
4789         }
4790     }
4791
4792   return TRUE;
4793 }
4794
4795 /* Set the right machine number for a Blackfin ELF file.  */
4796
4797 static bfd_boolean
4798 elf32_bfin_object_p (bfd *abfd)
4799 {
4800   bfd_default_set_arch_mach (abfd, bfd_arch_bfin, 0);
4801   return (((elf_elfheader (abfd)->e_flags & EF_BFIN_FDPIC) != 0)
4802           == (IS_FDPIC (abfd)));
4803 }
4804
4805 static bfd_boolean
4806 elf32_bfin_set_private_flags (bfd * abfd, flagword flags)
4807 {
4808   elf_elfheader (abfd)->e_flags = flags;
4809   elf_flags_init (abfd) = TRUE;
4810   return TRUE;
4811 }
4812
4813 /* Copy backend specific data from one object module to another.  */
4814
4815 static bfd_boolean
4816 bfin_elf_copy_private_bfd_data (bfd *ibfd, bfd *obfd)
4817 {
4818   if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
4819       || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
4820     return TRUE;
4821
4822   BFD_ASSERT (!elf_flags_init (obfd)
4823               || elf_elfheader (obfd)->e_flags == elf_elfheader (ibfd)->e_flags);
4824
4825   elf_elfheader (obfd)->e_flags = elf_elfheader (ibfd)->e_flags;
4826   elf_flags_init (obfd) = TRUE;
4827
4828   /* Copy object attributes.  */
4829   _bfd_elf_copy_obj_attributes (ibfd, obfd);
4830
4831   return TRUE;
4832 }
4833
4834 static bfd_boolean
4835 elf32_bfinfdpic_copy_private_bfd_data (bfd *ibfd, bfd *obfd)
4836 {
4837   unsigned i;
4838
4839   if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
4840       || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
4841     return TRUE;
4842
4843   if (! bfin_elf_copy_private_bfd_data (ibfd, obfd))
4844     return FALSE;
4845
4846   if (! elf_tdata (ibfd) || ! elf_tdata (ibfd)->phdr
4847       || ! elf_tdata (obfd) || ! elf_tdata (obfd)->phdr)
4848     return TRUE;
4849
4850   /* Copy the stack size.  */
4851   for (i = 0; i < elf_elfheader (ibfd)->e_phnum; i++)
4852     if (elf_tdata (ibfd)->phdr[i].p_type == PT_GNU_STACK)
4853       {
4854         Elf_Internal_Phdr *iphdr = &elf_tdata (ibfd)->phdr[i];
4855
4856         for (i = 0; i < elf_elfheader (obfd)->e_phnum; i++)
4857           if (elf_tdata (obfd)->phdr[i].p_type == PT_GNU_STACK)
4858             {
4859               memcpy (&elf_tdata (obfd)->phdr[i], iphdr, sizeof (*iphdr));
4860
4861               /* Rewrite the phdrs, since we're only called after they
4862                  were first written.  */
4863               if (bfd_seek (obfd, (bfd_signed_vma) get_elf_backend_data (obfd)
4864                             ->s->sizeof_ehdr, SEEK_SET) != 0
4865                   || get_elf_backend_data (obfd)->s
4866                   ->write_out_phdrs (obfd, elf_tdata (obfd)->phdr,
4867                                      elf_elfheader (obfd)->e_phnum) != 0)
4868                 return FALSE;
4869               break;
4870             }
4871
4872         break;
4873       }
4874
4875   return TRUE;
4876 }
4877
4878
4879 /* Display the flags field.  */
4880 static bfd_boolean
4881 elf32_bfin_print_private_bfd_data (bfd * abfd, PTR ptr)
4882 {
4883   FILE *file = (FILE *) ptr;
4884   flagword flags;
4885
4886   BFD_ASSERT (abfd != NULL && ptr != NULL);
4887
4888   /* Print normal ELF private data.  */
4889   _bfd_elf_print_private_bfd_data (abfd, ptr);
4890
4891   flags = elf_elfheader (abfd)->e_flags;
4892
4893   /* xgettext:c-format */
4894   fprintf (file, _("private flags = %lx:"), elf_elfheader (abfd)->e_flags);
4895
4896   if (flags & EF_BFIN_PIC)
4897     fprintf (file, " -fpic");
4898
4899   if (flags & EF_BFIN_FDPIC)
4900     fprintf (file, " -mfdpic");
4901
4902   fputc ('\n', file);
4903
4904   return TRUE;
4905 }
4906
4907 /* Merge backend specific data from an object file to the output
4908    object file when linking.  */
4909
4910 static bfd_boolean
4911 elf32_bfin_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
4912 {
4913   flagword old_flags, new_flags;
4914   bfd_boolean error = FALSE;
4915
4916   new_flags = elf_elfheader (ibfd)->e_flags;
4917   old_flags = elf_elfheader (obfd)->e_flags;
4918
4919   if (new_flags & EF_BFIN_FDPIC)
4920     new_flags &= ~EF_BFIN_PIC;
4921
4922 #ifdef DEBUG
4923   (*_bfd_error_handler) ("old_flags = 0x%.8lx, new_flags = 0x%.8lx, init = %s, filename = %s",
4924                          old_flags, new_flags, elf_flags_init (obfd) ? "yes" : "no",
4925                          bfd_get_filename (ibfd));
4926 #endif
4927
4928   if (!elf_flags_init (obfd))                   /* First call, no flags set.  */
4929     {
4930       elf_flags_init (obfd) = TRUE;
4931       elf_elfheader (obfd)->e_flags = new_flags;
4932     }
4933
4934   if (((new_flags & EF_BFIN_FDPIC) == 0) != (! IS_FDPIC (obfd)))
4935     {
4936       error = TRUE;
4937       if (IS_FDPIC (obfd))
4938         (*_bfd_error_handler)
4939           (_("%s: cannot link non-fdpic object file into fdpic executable"),
4940            bfd_get_filename (ibfd));
4941       else
4942         (*_bfd_error_handler)
4943           (_("%s: cannot link fdpic object file into non-fdpic executable"),
4944            bfd_get_filename (ibfd));
4945     }
4946
4947   if (error)
4948     bfd_set_error (bfd_error_bad_value);
4949
4950   return !error;
4951 }
4952 \f
4953 /* bfin ELF linker hash entry.  */
4954
4955 struct bfin_link_hash_entry
4956 {
4957   struct elf_link_hash_entry root;
4958
4959   /* Number of PC relative relocs copied for this symbol.  */
4960   struct bfin_pcrel_relocs_copied *pcrel_relocs_copied;
4961 };
4962
4963 /* bfin ELF linker hash table.  */
4964
4965 struct bfin_link_hash_table
4966 {
4967   struct elf_link_hash_table root;
4968
4969   /* Small local sym cache.  */
4970   struct sym_cache sym_cache;
4971 };
4972
4973 #define bfin_hash_entry(ent) ((struct bfin_link_hash_entry *) (ent))
4974
4975 static struct bfd_hash_entry *
4976 bfin_link_hash_newfunc (struct bfd_hash_entry *entry,
4977                         struct bfd_hash_table *table, const char *string)
4978 {
4979   struct bfd_hash_entry *ret = entry;
4980
4981   /* Allocate the structure if it has not already been allocated by a
4982      subclass.  */
4983   if (ret == NULL)
4984     ret = bfd_hash_allocate (table, sizeof (struct bfin_link_hash_entry));
4985   if (ret == NULL)
4986     return ret;
4987
4988   /* Call the allocation method of the superclass.  */
4989   ret = _bfd_elf_link_hash_newfunc (ret, table, string);
4990   if (ret != NULL)
4991     bfin_hash_entry (ret)->pcrel_relocs_copied = NULL;
4992
4993   return ret;
4994 }
4995
4996 /* Create an bfin ELF linker hash table.  */
4997
4998 static struct bfd_link_hash_table *
4999 bfin_link_hash_table_create (bfd * abfd)
5000 {
5001   struct bfin_link_hash_table *ret;
5002   bfd_size_type amt = sizeof (struct bfin_link_hash_table);
5003
5004   ret = bfd_zalloc (abfd, amt);
5005   if (ret == NULL)
5006     return NULL;
5007
5008   if (!_bfd_elf_link_hash_table_init (&ret->root, abfd,
5009                                       bfin_link_hash_newfunc,
5010                                       sizeof (struct elf_link_hash_entry)))
5011     {
5012       free (ret);
5013       return NULL;
5014     }
5015
5016   ret->sym_cache.abfd = NULL;
5017
5018   return &ret->root.root;
5019 }
5020
5021 /* The size in bytes of an entry in the procedure linkage table.  */
5022
5023 /* Finish up the dynamic sections.  */
5024
5025 static bfd_boolean
5026 bfin_finish_dynamic_sections (bfd * output_bfd ATTRIBUTE_UNUSED,
5027                                   struct bfd_link_info *info)
5028 {
5029   bfd *dynobj;
5030   asection *sdyn;
5031
5032   dynobj = elf_hash_table (info)->dynobj;
5033
5034   sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
5035
5036   if (elf_hash_table (info)->dynamic_sections_created)
5037     {
5038       Elf32_External_Dyn *dyncon, *dynconend;
5039
5040       BFD_ASSERT (sdyn != NULL);
5041
5042       dyncon = (Elf32_External_Dyn *) sdyn->contents;
5043       dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
5044       for (; dyncon < dynconend; dyncon++)
5045         {
5046           Elf_Internal_Dyn dyn;
5047
5048           bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
5049
5050         }
5051
5052     }
5053   return TRUE;
5054 }
5055
5056 /* Finish up dynamic symbol handling.  We set the contents of various
5057    dynamic sections here.  */
5058
5059 static bfd_boolean
5060 bfin_finish_dynamic_symbol (bfd * output_bfd,
5061                                 struct bfd_link_info *info,
5062                                 struct elf_link_hash_entry *h,
5063                                 Elf_Internal_Sym * sym)
5064 {
5065   bfd *dynobj;
5066
5067   dynobj = elf_hash_table (info)->dynobj;
5068
5069   if (h->got.offset != (bfd_vma) - 1)
5070     {
5071       asection *sgot;
5072       asection *srela;
5073       Elf_Internal_Rela rela;
5074       bfd_byte *loc;
5075
5076       /* This symbol has an entry in the global offset table.
5077          Set it up.  */
5078
5079       sgot = bfd_get_section_by_name (dynobj, ".got");
5080       srela = bfd_get_section_by_name (dynobj, ".rela.got");
5081       BFD_ASSERT (sgot != NULL && srela != NULL);
5082
5083       rela.r_offset = (sgot->output_section->vma
5084                        + sgot->output_offset
5085                        + (h->got.offset & ~(bfd_vma) 1));
5086
5087       /* If this is a -Bsymbolic link, and the symbol is defined
5088          locally, we just want to emit a RELATIVE reloc.  Likewise if
5089          the symbol was forced to be local because of a version file.
5090          The entry in the global offset table will already have been
5091          initialized in the relocate_section function.  */
5092       if (info->shared
5093           && (info->symbolic
5094               || h->dynindx == -1 || h->forced_local) && h->def_regular)
5095         {
5096           fprintf(stderr, "*** check this relocation %s\n", __FUNCTION__);
5097           rela.r_info = ELF32_R_INFO (0, R_BFIN_PCREL24);
5098           rela.r_addend = bfd_get_signed_32 (output_bfd,
5099                                              (sgot->contents
5100                                               +
5101                                               (h->got.
5102                                                offset & ~(bfd_vma) 1)));
5103         }
5104       else
5105         {
5106           bfd_put_32 (output_bfd, (bfd_vma) 0,
5107                       sgot->contents + (h->got.offset & ~(bfd_vma) 1));
5108           rela.r_info = ELF32_R_INFO (h->dynindx, R_BFIN_GOT);
5109           rela.r_addend = 0;
5110         }
5111
5112       loc = srela->contents;
5113       loc += srela->reloc_count++ * sizeof (Elf32_External_Rela);
5114       bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
5115     }
5116
5117   if (h->needs_copy)
5118     {
5119       BFD_ASSERT (0);
5120     }
5121   /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute.  */
5122   if (strcmp (h->root.root.string, "__DYNAMIC") == 0
5123       || h == elf_hash_table (info)->hgot)
5124     sym->st_shndx = SHN_ABS;
5125
5126   return TRUE;
5127 }
5128
5129 /* Adjust a symbol defined by a dynamic object and referenced by a
5130    regular object.  The current definition is in some section of the
5131    dynamic object, but we're not including those sections.  We have to
5132    change the definition to something the rest of the link can
5133    understand.  */
5134
5135 static bfd_boolean
5136 bfin_adjust_dynamic_symbol (struct bfd_link_info *info,
5137                                 struct elf_link_hash_entry *h)
5138 {
5139   bfd *dynobj;
5140   asection *s;
5141   unsigned int power_of_two;
5142
5143   dynobj = elf_hash_table (info)->dynobj;
5144
5145   /* Make sure we know what is going on here.  */
5146   BFD_ASSERT (dynobj != NULL
5147               && (h->needs_plt
5148                   || h->u.weakdef != NULL
5149                   || (h->def_dynamic && h->ref_regular && !h->def_regular)));
5150
5151   /* If this is a function, put it in the procedure linkage table.  We
5152      will fill in the contents of the procedure linkage table later,
5153      when we know the address of the .got section.  */
5154   if (h->type == STT_FUNC || h->needs_plt)
5155     {
5156       BFD_ASSERT(0);
5157     }
5158
5159   /* If this is a weak symbol, and there is a real definition, the
5160      processor independent code will have arranged for us to see the
5161      real definition first, and we can just use the same value.  */
5162   if (h->u.weakdef != NULL)
5163     {
5164       BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
5165                   || h->u.weakdef->root.type == bfd_link_hash_defweak);
5166       h->root.u.def.section = h->u.weakdef->root.u.def.section;
5167       h->root.u.def.value = h->u.weakdef->root.u.def.value;
5168       return TRUE;
5169     }
5170
5171   /* This is a reference to a symbol defined by a dynamic object which
5172      is not a function.  */
5173
5174   /* If we are creating a shared library, we must presume that the
5175      only references to the symbol are via the global offset table.
5176      For such cases we need not do anything here; the relocations will
5177      be handled correctly by relocate_section.  */
5178   if (info->shared)
5179     return TRUE;
5180
5181   /* We must allocate the symbol in our .dynbss section, which will
5182      become part of the .bss section of the executable.  There will be
5183      an entry for this symbol in the .dynsym section.  The dynamic
5184      object will contain position independent code, so all references
5185      from the dynamic object to this symbol will go through the global
5186      offset table.  The dynamic linker will use the .dynsym entry to
5187      determine the address it must put in the global offset table, so
5188      both the dynamic object and the regular object will refer to the
5189      same memory location for the variable.  */
5190
5191   s = bfd_get_section_by_name (dynobj, ".dynbss");
5192   BFD_ASSERT (s != NULL);
5193
5194   /* We must generate a R_68K_COPY reloc to tell the dynamic linker to
5195      copy the initial value out of the dynamic object and into the
5196      runtime process image.  We need to remember the offset into the
5197      .rela.bss section we are going to use.  */
5198   if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
5199     {
5200       asection *srel;
5201
5202       srel = bfd_get_section_by_name (dynobj, ".rela.bss");
5203       BFD_ASSERT (srel != NULL);
5204       srel->size += sizeof (Elf32_External_Rela);
5205       h->needs_copy = 1;
5206     }
5207
5208   /* We need to figure out the alignment required for this symbol.  I
5209      have no idea how ELF linkers handle this.  */
5210   power_of_two = bfd_log2 (h->size);
5211   if (power_of_two > 3)
5212     power_of_two = 3;
5213
5214   /* Apply the required alignment.  */
5215   s->size = BFD_ALIGN (s->size, (bfd_size_type) (1 << power_of_two));
5216   if (power_of_two > bfd_get_section_alignment (dynobj, s))
5217     {
5218       if (!bfd_set_section_alignment (dynobj, s, power_of_two))
5219         return FALSE;
5220     }
5221
5222   /* Define the symbol as being at this point in the section.  */
5223   h->root.u.def.section = s;
5224   h->root.u.def.value = s->size;
5225
5226   /* Increment the section size to make room for the symbol.  */
5227   s->size += h->size;
5228
5229   return TRUE;
5230 }
5231
5232 /* The bfin linker needs to keep track of the number of relocs that it
5233    decides to copy in check_relocs for each symbol.  This is so that it
5234    can discard PC relative relocs if it doesn't need them when linking
5235    with -Bsymbolic.  We store the information in a field extending the
5236    regular ELF linker hash table.  */
5237
5238 /* This structure keeps track of the number of PC relative relocs we have
5239    copied for a given symbol.  */
5240
5241 struct bfin_pcrel_relocs_copied
5242 {
5243   /* Next section.  */
5244   struct bfin_pcrel_relocs_copied *next;
5245   /* A section in dynobj.  */
5246   asection *section;
5247   /* Number of relocs copied in this section.  */
5248   bfd_size_type count;
5249 };
5250
5251 /* This function is called via elf_link_hash_traverse if we are
5252    creating a shared object.  In the -Bsymbolic case it discards the
5253    space allocated to copy PC relative relocs against symbols which
5254    are defined in regular objects.  For the normal shared case, it
5255    discards space for pc-relative relocs that have become local due to
5256    symbol visibility changes.  We allocated space for them in the
5257    check_relocs routine, but we won't fill them in in the
5258    relocate_section routine.
5259
5260    We also check whether any of the remaining relocations apply
5261    against a readonly section, and set the DF_TEXTREL flag in this
5262    case.  */
5263
5264 static bfd_boolean
5265 bfin_discard_copies (struct elf_link_hash_entry *h, PTR inf)
5266 {
5267   struct bfd_link_info *info = (struct bfd_link_info *) inf;
5268   struct bfin_pcrel_relocs_copied *s;
5269
5270   if (h->root.type == bfd_link_hash_warning)
5271     h = (struct elf_link_hash_entry *) h->root.u.i.link;
5272
5273   if (!h->def_regular || (!info->symbolic && !h->forced_local))
5274     {
5275       if ((info->flags & DF_TEXTREL) == 0)
5276         {
5277           /* Look for relocations against read-only sections.  */
5278           for (s = bfin_hash_entry (h)->pcrel_relocs_copied;
5279                s != NULL; s = s->next)
5280             if ((s->section->flags & SEC_READONLY) != 0)
5281               {
5282                 info->flags |= DF_TEXTREL;
5283                 break;
5284               }
5285         }
5286
5287       return TRUE;
5288     }
5289
5290   for (s = bfin_hash_entry (h)->pcrel_relocs_copied;
5291        s != NULL; s = s->next)
5292     s->section->size -= s->count * sizeof (Elf32_External_Rela);
5293
5294   return TRUE;
5295 }
5296
5297 static bfd_boolean
5298 bfin_size_dynamic_sections (bfd * output_bfd ATTRIBUTE_UNUSED,
5299                                 struct bfd_link_info *info)
5300 {
5301   bfd *dynobj;
5302   asection *s;
5303   bfd_boolean relocs;
5304
5305   dynobj = elf_hash_table (info)->dynobj;
5306   BFD_ASSERT (dynobj != NULL);
5307
5308   if (elf_hash_table (info)->dynamic_sections_created)
5309     {
5310       /* Set the contents of the .interp section to the interpreter.  */
5311       if (info->executable)
5312         {
5313           s = bfd_get_section_by_name (dynobj, ".interp");
5314           BFD_ASSERT (s != NULL);
5315           s->size = sizeof ELF_DYNAMIC_INTERPRETER;
5316           s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
5317         }
5318     }
5319   else
5320     {
5321       /* We may have created entries in the .rela.got section.
5322          However, if we are not creating the dynamic sections, we will
5323          not actually use these entries.  Reset the size of .rela.got,
5324          which will cause it to get stripped from the output file
5325          below.  */
5326       s = bfd_get_section_by_name (dynobj, ".rela.got");
5327       if (s != NULL)
5328         s->size = 0;
5329     }
5330
5331   /* If this is a -Bsymbolic shared link, then we need to discard all
5332      PC relative relocs against symbols defined in a regular object.
5333      For the normal shared case we discard the PC relative relocs
5334      against symbols that have become local due to visibility changes.
5335      We allocated space for them in the check_relocs routine, but we
5336      will not fill them in in the relocate_section routine.  */
5337   if (info->shared)
5338     elf_link_hash_traverse (elf_hash_table (info),
5339                             bfin_discard_copies, (PTR) info);
5340
5341   /* The check_relocs and adjust_dynamic_symbol entry points have
5342      determined the sizes of the various dynamic sections.  Allocate
5343      memory for them.  */
5344   relocs = FALSE;
5345   for (s = dynobj->sections; s != NULL; s = s->next)
5346     {
5347       const char *name;
5348       bfd_boolean strip;
5349
5350       if ((s->flags & SEC_LINKER_CREATED) == 0)
5351         continue;
5352
5353       /* It's OK to base decisions on the section name, because none
5354          of the dynobj section names depend upon the input files.  */
5355       name = bfd_get_section_name (dynobj, s);
5356
5357       strip = FALSE;
5358
5359        if (CONST_STRNEQ (name, ".rela"))
5360         {
5361           if (s->size == 0)
5362             {
5363               /* If we don't need this section, strip it from the
5364                  output file.  This is mostly to handle .rela.bss and
5365                  .rela.plt.  We must create both sections in
5366                  create_dynamic_sections, because they must be created
5367                  before the linker maps input sections to output
5368                  sections.  The linker does that before
5369                  adjust_dynamic_symbol is called, and it is that
5370                  function which decides whether anything needs to go
5371                  into these sections.  */
5372               strip = TRUE;
5373             }
5374           else
5375             {
5376               relocs = TRUE;
5377
5378               /* We use the reloc_count field as a counter if we need
5379                  to copy relocs into the output file.  */
5380               s->reloc_count = 0;
5381             }
5382         }
5383       else if (! CONST_STRNEQ (name, ".got"))
5384         {
5385           /* It's not one of our sections, so don't allocate space.  */
5386           continue;
5387         }
5388
5389       if (strip)
5390         {
5391           s->flags |= SEC_EXCLUDE;
5392           continue;
5393         }
5394
5395       /* Allocate memory for the section contents.  */
5396       /* FIXME: This should be a call to bfd_alloc not bfd_zalloc.
5397          Unused entries should be reclaimed before the section's contents
5398          are written out, but at the moment this does not happen.  Thus in
5399          order to prevent writing out garbage, we initialise the section's
5400          contents to zero.  */
5401       s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->size);
5402       if (s->contents == NULL && s->size != 0)
5403         return FALSE;
5404     }
5405
5406   if (elf_hash_table (info)->dynamic_sections_created)
5407     {
5408       /* Add some entries to the .dynamic section.  We fill in the
5409          values later, in bfin_finish_dynamic_sections, but we
5410          must add the entries now so that we get the correct size for
5411          the .dynamic section.  The DT_DEBUG entry is filled in by the
5412          dynamic linker and used by the debugger.  */
5413 #define add_dynamic_entry(TAG, VAL) \
5414   _bfd_elf_add_dynamic_entry (info, TAG, VAL)
5415
5416       if (!info->shared)
5417         {
5418           if (!add_dynamic_entry (DT_DEBUG, 0))
5419             return FALSE;
5420         }
5421
5422
5423       if (relocs)
5424         {
5425           if (!add_dynamic_entry (DT_RELA, 0)
5426               || !add_dynamic_entry (DT_RELASZ, 0)
5427               || !add_dynamic_entry (DT_RELAENT,
5428                                      sizeof (Elf32_External_Rela)))
5429             return FALSE;
5430         }
5431
5432       if ((info->flags & DF_TEXTREL) != 0)
5433         {
5434           if (!add_dynamic_entry (DT_TEXTREL, 0))
5435             return FALSE;
5436         }
5437     }
5438 #undef add_dynamic_entry
5439
5440   return TRUE;
5441 }
5442 \f
5443 /* Given a .data section and a .emreloc in-memory section, store
5444    relocation information into the .emreloc section which can be
5445    used at runtime to relocate the section.  This is called by the
5446    linker when the --embedded-relocs switch is used.  This is called
5447    after the add_symbols entry point has been called for all the
5448    objects, and before the final_link entry point is called.  */
5449
5450 bfd_boolean bfd_bfin_elf32_create_embedded_relocs
5451   PARAMS ((bfd *, struct bfd_link_info *, asection *, asection *, char **));
5452
5453 bfd_boolean
5454 bfd_bfin_elf32_create_embedded_relocs (
5455      bfd *abfd,
5456      struct bfd_link_info *info,
5457      asection *datasec,
5458      asection *relsec,
5459      char **errmsg)
5460 {
5461   Elf_Internal_Shdr *symtab_hdr;
5462   Elf_Internal_Sym *isymbuf = NULL;
5463   Elf_Internal_Rela *internal_relocs = NULL;
5464   Elf_Internal_Rela *irel, *irelend;
5465   bfd_byte *p;
5466   bfd_size_type amt;
5467
5468   BFD_ASSERT (! info->relocatable);
5469
5470   *errmsg = NULL;
5471
5472   if (datasec->reloc_count == 0)
5473     return TRUE;
5474
5475   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
5476
5477   /* Get a copy of the native relocations.  */
5478   internal_relocs = (_bfd_elf_link_read_relocs
5479                      (abfd, datasec, (PTR) NULL, (Elf_Internal_Rela *) NULL,
5480                       info->keep_memory));
5481   if (internal_relocs == NULL)
5482     goto error_return;
5483
5484   amt = (bfd_size_type) datasec->reloc_count * 12;
5485   relsec->contents = (bfd_byte *) bfd_alloc (abfd, amt);
5486   if (relsec->contents == NULL)
5487     goto error_return;
5488
5489   p = relsec->contents;
5490
5491   irelend = internal_relocs + datasec->reloc_count;
5492   for (irel = internal_relocs; irel < irelend; irel++, p += 12)
5493     {
5494       asection *targetsec;
5495
5496       /* We are going to write a four byte longword into the runtime
5497        reloc section.  The longword will be the address in the data
5498        section which must be relocated.  It is followed by the name
5499        of the target section NUL-padded or truncated to 8
5500        characters.  */
5501
5502       /* We can only relocate absolute longword relocs at run time.  */
5503       if (ELF32_R_TYPE (irel->r_info) != (int) R_BFIN_BYTE4_DATA)
5504         {
5505           *errmsg = _("unsupported reloc type");
5506           bfd_set_error (bfd_error_bad_value);
5507           goto error_return;
5508         }
5509
5510       /* Get the target section referred to by the reloc.  */
5511       if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
5512         {
5513           /* A local symbol.  */
5514           Elf_Internal_Sym *isym;
5515
5516           /* Read this BFD's local symbols if we haven't done so already.  */
5517           if (isymbuf == NULL)
5518             {
5519               isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
5520               if (isymbuf == NULL)
5521                 isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
5522                                                 symtab_hdr->sh_info, 0,
5523                                                 NULL, NULL, NULL);
5524               if (isymbuf == NULL)
5525                 goto error_return;
5526             }
5527
5528           isym = isymbuf + ELF32_R_SYM (irel->r_info);
5529           targetsec = bfd_section_from_elf_index (abfd, isym->st_shndx);
5530         }
5531       else
5532         {
5533           unsigned long indx;
5534           struct elf_link_hash_entry *h;
5535
5536           /* An external symbol.  */
5537           indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
5538           h = elf_sym_hashes (abfd)[indx];
5539           BFD_ASSERT (h != NULL);
5540           if (h->root.type == bfd_link_hash_defined
5541               || h->root.type == bfd_link_hash_defweak)
5542             targetsec = h->root.u.def.section;
5543           else
5544             targetsec = NULL;
5545         }
5546
5547       bfd_put_32 (abfd, irel->r_offset + datasec->output_offset, p);
5548       memset (p + 4, 0, 8);
5549       if (targetsec != NULL)
5550         strncpy ((char *) p + 4, targetsec->output_section->name, 8);
5551     }
5552
5553   if (isymbuf != NULL && symtab_hdr->contents != (unsigned char *) isymbuf)
5554     free (isymbuf);
5555   if (internal_relocs != NULL
5556       && elf_section_data (datasec)->relocs != internal_relocs)
5557     free (internal_relocs);
5558   return TRUE;
5559
5560 error_return:
5561   if (isymbuf != NULL && symtab_hdr->contents != (unsigned char *) isymbuf)
5562     free (isymbuf);
5563   if (internal_relocs != NULL
5564       && elf_section_data (datasec)->relocs != internal_relocs)
5565     free (internal_relocs);
5566   return FALSE;
5567 }
5568
5569 struct bfd_elf_special_section const elf32_bfin_special_sections[] =
5570 {
5571   { ".l1.text",         8, -2, SHT_PROGBITS, SHF_ALLOC + SHF_EXECINSTR },
5572   { ".l1.data",         8, -2, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
5573   { NULL,               0,  0, 0,            0 }
5574 };
5575
5576 \f
5577 #define TARGET_LITTLE_SYM               bfd_elf32_bfin_vec
5578 #define TARGET_LITTLE_NAME              "elf32-bfin"
5579 #define ELF_ARCH                        bfd_arch_bfin
5580 #define ELF_MACHINE_CODE                EM_BLACKFIN
5581 #define ELF_MAXPAGESIZE                 0x1000
5582 #define elf_symbol_leading_char         '_'
5583
5584 #define bfd_elf32_bfd_reloc_type_lookup bfin_bfd_reloc_type_lookup
5585 #define bfd_elf32_bfd_reloc_name_lookup \
5586                                         bfin_bfd_reloc_name_lookup
5587 #define elf_info_to_howto               bfin_info_to_howto
5588 #define elf_info_to_howto_rel           0
5589 #define elf_backend_object_p            elf32_bfin_object_p
5590
5591 #define bfd_elf32_bfd_is_local_label_name \
5592                                         bfin_is_local_label_name
5593 #define bfin_hash_table(p) \
5594   ((struct bfin_link_hash_table *) (p)->hash)
5595
5596
5597
5598 #define elf_backend_create_dynamic_sections \
5599                                         _bfd_elf_create_dynamic_sections
5600 #define bfd_elf32_bfd_link_hash_table_create \
5601                                         bfin_link_hash_table_create
5602 #define bfd_elf32_bfd_final_link        bfd_elf_gc_common_final_link
5603
5604 #define elf_backend_check_relocs        bfin_check_relocs
5605 #define elf_backend_adjust_dynamic_symbol \
5606                                         bfin_adjust_dynamic_symbol
5607 #define elf_backend_size_dynamic_sections \
5608                                         bfin_size_dynamic_sections
5609 #define elf_backend_relocate_section    bfin_relocate_section
5610 #define elf_backend_finish_dynamic_symbol \
5611                                         bfin_finish_dynamic_symbol
5612 #define elf_backend_finish_dynamic_sections \
5613                                         bfin_finish_dynamic_sections
5614 #define elf_backend_gc_mark_hook        bfin_gc_mark_hook
5615 #define elf_backend_gc_sweep_hook       bfin_gc_sweep_hook
5616 #define bfd_elf32_bfd_merge_private_bfd_data \
5617                                         elf32_bfin_merge_private_bfd_data
5618 #define bfd_elf32_bfd_set_private_flags \
5619                                         elf32_bfin_set_private_flags
5620 #define bfd_elf32_bfd_print_private_bfd_data \
5621                                         elf32_bfin_print_private_bfd_data
5622 #define elf_backend_reloc_type_class    elf32_bfin_reloc_type_class
5623 #define elf_backend_can_gc_sections 1
5624 #define elf_backend_special_sections    elf32_bfin_special_sections
5625 #define elf_backend_can_refcount 1
5626 #define elf_backend_want_got_plt 0
5627 #define elf_backend_plt_readonly 1
5628 #define elf_backend_want_plt_sym 0
5629 #define elf_backend_got_header_size     12
5630 #define elf_backend_rela_normal         1
5631
5632 #include "elf32-target.h"
5633
5634 #undef TARGET_LITTLE_SYM
5635 #define TARGET_LITTLE_SYM          bfd_elf32_bfinfdpic_vec
5636 #undef TARGET_LITTLE_NAME
5637 #define TARGET_LITTLE_NAME              "elf32-bfinfdpic"
5638 #undef  elf32_bed
5639 #define elf32_bed               elf32_bfinfdpic_bed
5640
5641 #undef elf_backend_gc_sweep_hook
5642 #define elf_backend_gc_sweep_hook       bfinfdpic_gc_sweep_hook
5643
5644 #undef elf_backend_got_header_size
5645 #define elf_backend_got_header_size     0
5646
5647 #undef elf_backend_relocate_section
5648 #define elf_backend_relocate_section    bfinfdpic_relocate_section
5649 #undef elf_backend_check_relocs
5650 #define elf_backend_check_relocs        bfinfdpic_check_relocs
5651
5652 #undef bfd_elf32_bfd_link_hash_table_create
5653 #define bfd_elf32_bfd_link_hash_table_create \
5654                 bfinfdpic_elf_link_hash_table_create
5655 #undef elf_backend_always_size_sections
5656 #define elf_backend_always_size_sections \
5657                 elf32_bfinfdpic_always_size_sections
5658 #undef elf_backend_modify_program_headers
5659 #define elf_backend_modify_program_headers \
5660                 elf32_bfinfdpic_modify_program_headers
5661 #undef bfd_elf32_bfd_copy_private_bfd_data
5662 #define bfd_elf32_bfd_copy_private_bfd_data \
5663                 elf32_bfinfdpic_copy_private_bfd_data
5664
5665 #undef elf_backend_create_dynamic_sections
5666 #define elf_backend_create_dynamic_sections \
5667                 elf32_bfinfdpic_create_dynamic_sections
5668 #undef elf_backend_adjust_dynamic_symbol
5669 #define elf_backend_adjust_dynamic_symbol \
5670                 elf32_bfinfdpic_adjust_dynamic_symbol
5671 #undef elf_backend_size_dynamic_sections
5672 #define elf_backend_size_dynamic_sections \
5673                 elf32_bfinfdpic_size_dynamic_sections
5674 #undef elf_backend_finish_dynamic_symbol
5675 #define elf_backend_finish_dynamic_symbol \
5676                 elf32_bfinfdpic_finish_dynamic_symbol
5677 #undef elf_backend_finish_dynamic_sections
5678 #define elf_backend_finish_dynamic_sections \
5679                 elf32_bfinfdpic_finish_dynamic_sections
5680
5681 #undef elf_backend_can_make_relative_eh_frame
5682 #define elf_backend_can_make_relative_eh_frame \
5683                 bfinfdpic_elf_use_relative_eh_frame
5684 #undef elf_backend_can_make_lsda_relative_eh_frame
5685 #define elf_backend_can_make_lsda_relative_eh_frame \
5686                 bfinfdpic_elf_use_relative_eh_frame
5687 #undef elf_backend_encode_eh_address
5688 #define elf_backend_encode_eh_address \
5689                 bfinfdpic_elf_encode_eh_address
5690
5691 #undef elf_backend_may_use_rel_p
5692 #define elf_backend_may_use_rel_p       1
5693 #undef elf_backend_may_use_rela_p
5694 #define elf_backend_may_use_rela_p      1
5695 /* We use REL for dynamic relocations only.  */
5696 #undef elf_backend_default_use_rela_p
5697 #define elf_backend_default_use_rela_p  1
5698
5699 #undef elf_backend_omit_section_dynsym
5700 #define elf_backend_omit_section_dynsym _bfinfdpic_link_omit_section_dynsym
5701
5702 #include "elf32-target.h"