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