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