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