1 /* CRIS-specific support for 32-bit ELF.
2 Copyright 2000, 2001 Free Software Foundation, Inc.
3 Contributed by Axis Communications AB.
4 Written by Hans-Peter Nilsson, based on elf32-fr30.c
5 PIC and shlib bits based primarily on elf32-m68k.c and elf32-i386.c.
7 This file is part of BFD, the Binary File Descriptor library.
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2 of the License, or
12 (at your option) any later version.
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
29 /* Forward declarations. */
30 static reloc_howto_type * cris_reloc_type_lookup
31 PARAMS ((bfd *abfd, bfd_reloc_code_real_type code));
33 static void cris_info_to_howto_rela
34 PARAMS ((bfd *, arelent *, Elf32_Internal_Rela *));
36 static boolean cris_elf_relocate_section
37 PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *,
38 Elf_Internal_Rela *, Elf_Internal_Sym *, asection **));
40 static bfd_reloc_status_type cris_final_link_relocate
41 PARAMS ((reloc_howto_type *, bfd *, asection *, bfd_byte *,
42 Elf_Internal_Rela *, bfd_vma));
44 static boolean cris_elf_gc_sweep_hook
45 PARAMS ((bfd *, struct bfd_link_info *, asection *,
46 const Elf_Internal_Rela *));
48 static asection * cris_elf_gc_mark_hook
49 PARAMS ((bfd *, struct bfd_link_info *, Elf_Internal_Rela *,
50 struct elf_link_hash_entry *, Elf_Internal_Sym *));
52 static boolean cris_elf_object_p PARAMS ((bfd *));
54 static void cris_elf_final_write_processing PARAMS ((bfd *, boolean));
56 static boolean cris_elf_print_private_bfd_data PARAMS ((bfd *, PTR));
58 static boolean cris_elf_merge_private_bfd_data PARAMS ((bfd *, bfd *));
60 struct elf_cris_link_hash_entry;
61 static boolean elf_cris_discard_excess_dso_dynamics
62 PARAMS ((struct elf_cris_link_hash_entry *, PTR));
63 static boolean elf_cris_discard_excess_program_dynamics
64 PARAMS ((struct elf_cris_link_hash_entry *, PTR));
65 static boolean elf_cris_adjust_gotplt_to_got
66 PARAMS ((struct elf_cris_link_hash_entry *, PTR));
67 static boolean elf_cris_try_fold_plt_to_got
68 PARAMS ((struct elf_cris_link_hash_entry *, PTR));
69 static struct bfd_hash_entry *elf_cris_link_hash_newfunc
70 PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *, const char *));
71 static struct bfd_link_hash_table *elf_cris_link_hash_table_create
73 static boolean elf_cris_adjust_dynamic_symbol
74 PARAMS ((struct bfd_link_info *, struct elf_link_hash_entry *));
75 static boolean cris_elf_check_relocs
76 PARAMS ((bfd *, struct bfd_link_info *, asection *,
77 const Elf_Internal_Rela *));
79 static boolean elf_cris_size_dynamic_sections
80 PARAMS ((bfd *, struct bfd_link_info *));
81 static boolean elf_cris_finish_dynamic_symbol
82 PARAMS ((bfd *, struct bfd_link_info *, struct elf_link_hash_entry *,
84 static boolean elf_cris_finish_dynamic_sections
85 PARAMS ((bfd *, struct bfd_link_info *));
86 static void elf_cris_hide_symbol
87 PARAMS ((struct bfd_link_info *, struct elf_link_hash_entry *));
88 static enum elf_reloc_type_class elf_cris_reloc_type_class
89 PARAMS ((const Elf_Internal_Rela *));
91 static reloc_howto_type cris_elf_howto_table [] =
93 /* This reloc does nothing. */
94 HOWTO (R_CRIS_NONE, /* type */
96 2, /* size (0 = byte, 1 = short, 2 = long) */
98 false, /* pc_relative */
100 complain_overflow_bitfield, /* complain_on_overflow */
101 bfd_elf_generic_reloc, /* special_function */
102 "R_CRIS_NONE", /* name */
103 false, /* partial_inplace */
106 false), /* pcrel_offset */
108 /* An 8 bit absolute relocation. */
109 HOWTO (R_CRIS_8, /* type */
111 0, /* size (0 = byte, 1 = short, 2 = long) */
113 false, /* pc_relative */
115 complain_overflow_bitfield, /* complain_on_overflow */
116 bfd_elf_generic_reloc, /* special_function */
117 "R_CRIS_8", /* name */
118 false, /* partial_inplace */
119 0x0000, /* src_mask */
120 0x00ff, /* dst_mask */
121 false), /* pcrel_offset */
123 /* A 16 bit absolute relocation. */
124 HOWTO (R_CRIS_16, /* type */
126 1, /* size (0 = byte, 1 = short, 2 = long) */
128 false, /* pc_relative */
130 complain_overflow_bitfield, /* complain_on_overflow */
131 bfd_elf_generic_reloc, /* special_function */
132 "R_CRIS_16", /* name */
133 false, /* partial_inplace */
134 0x00000000, /* src_mask */
135 0x0000ffff, /* dst_mask */
136 false), /* pcrel_offset */
138 /* A 32 bit absolute relocation. */
139 HOWTO (R_CRIS_32, /* type */
141 2, /* size (0 = byte, 1 = short, 2 = long) */
143 false, /* pc_relative */
145 complain_overflow_bitfield, /* complain_on_overflow */
146 bfd_elf_generic_reloc, /* special_function */
147 "R_CRIS_32", /* name */
148 false, /* partial_inplace */
149 0x00000000, /* src_mask */
150 0xffffffff, /* dst_mask */
151 false), /* pcrel_offset */
153 /* An 8 bit PC-relative relocation. */
154 HOWTO (R_CRIS_8_PCREL, /* type */
156 0, /* size (0 = byte, 1 = short, 2 = long) */
158 true, /* pc_relative */
160 complain_overflow_bitfield, /* complain_on_overflow */
161 bfd_elf_generic_reloc, /* special_function */
162 "R_CRIS_8_PCREL", /* name */
163 false, /* partial_inplace */
164 0x0000, /* src_mask */
165 0x00ff, /* dst_mask */
166 true), /* pcrel_offset */
168 /* A 16 bit PC-relative relocation. */
169 HOWTO (R_CRIS_16_PCREL, /* type */
171 1, /* size (0 = byte, 1 = short, 2 = long) */
173 true, /* pc_relative */
175 complain_overflow_bitfield, /* complain_on_overflow */
176 bfd_elf_generic_reloc, /* special_function */
177 "R_CRIS_16", /* name */
178 false, /* partial_inplace */
179 0x00000000, /* src_mask */
180 0x0000ffff, /* dst_mask */
181 true), /* pcrel_offset */
183 /* A 32 bit PC-relative relocation. */
184 HOWTO (R_CRIS_32_PCREL, /* type */
186 2, /* size (0 = byte, 1 = short, 2 = long) */
188 true, /* pc_relative */
190 complain_overflow_bitfield, /* complain_on_overflow */
191 bfd_elf_generic_reloc, /* special_function */
192 "R_CRIS_32", /* name */
193 false, /* partial_inplace */
194 0x00000000, /* src_mask */
195 0xffffffff, /* dst_mask */
196 true), /* pcrel_offset */
198 /* GNU extension to record C++ vtable hierarchy. */
199 HOWTO (R_CRIS_GNU_VTINHERIT, /* type */
201 2, /* size (0 = byte, 1 = short, 2 = long) */
203 false, /* pc_relative */
205 complain_overflow_dont, /* complain_on_overflow */
206 NULL, /* special_function */
207 "R_CRIS_GNU_VTINHERIT", /* name */
208 false, /* partial_inplace */
211 false), /* pcrel_offset */
213 /* GNU extension to record C++ vtable member usage. */
214 HOWTO (R_CRIS_GNU_VTENTRY, /* type */
216 2, /* size (0 = byte, 1 = short, 2 = long) */
218 false, /* pc_relative */
220 complain_overflow_dont, /* complain_on_overflow */
221 _bfd_elf_rel_vtable_reloc_fn, /* special_function */
222 "R_CRIS_GNU_VTENTRY", /* name */
223 false, /* partial_inplace */
226 false), /* pcrel_offset */
228 /* This is used only by the dynamic linker. The symbol should exist
229 both in the object being run and in some shared library. The
230 dynamic linker copies the data addressed by the symbol from the
231 shared library into the object, because the object being
232 run has to have the data at some particular address. */
233 HOWTO (R_CRIS_COPY, /* type */
235 2, /* size (0 = byte, 1 = short, 2 = long) */
237 false, /* pc_relative */
239 complain_overflow_bitfield, /* complain_on_overflow */
240 bfd_elf_generic_reloc, /* special_function */
241 "R_CRIS_COPY", /* name */
242 false, /* partial_inplace */
245 false), /* pcrel_offset */
247 /* Like R_CRIS_32, but used when setting global offset table entries. */
248 HOWTO (R_CRIS_GLOB_DAT, /* type */
250 2, /* size (0 = byte, 1 = short, 2 = long) */
252 false, /* pc_relative */
254 complain_overflow_bitfield, /* complain_on_overflow */
255 bfd_elf_generic_reloc, /* special_function */
256 "R_CRIS_GLOB_DAT", /* name */
257 false, /* partial_inplace */
259 0xffffffff, /* dst_mask */
260 false), /* pcrel_offset */
262 /* Marks a procedure linkage table entry for a symbol. */
263 HOWTO (R_CRIS_JUMP_SLOT, /* type */
265 2, /* size (0 = byte, 1 = short, 2 = long) */
267 false, /* pc_relative */
269 complain_overflow_bitfield, /* complain_on_overflow */
270 bfd_elf_generic_reloc, /* special_function */
271 "R_CRIS_JUMP_SLOT", /* name */
272 false, /* partial_inplace */
275 false), /* pcrel_offset */
277 /* Used only by the dynamic linker. When the object is run, this
278 longword is set to the load address of the object, plus the
280 HOWTO (R_CRIS_RELATIVE, /* type */
282 2, /* size (0 = byte, 1 = short, 2 = long) */
284 false, /* pc_relative */
286 complain_overflow_bitfield, /* complain_on_overflow */
287 bfd_elf_generic_reloc, /* special_function */
288 "R_CRIS_RELATIVE", /* name */
289 false, /* partial_inplace */
291 0xffffffff, /* dst_mask */
292 false), /* pcrel_offset */
294 /* Like R_CRIS_32, but referring to the GOT table entry for the symbol. */
295 HOWTO (R_CRIS_16_GOT, /* type */
297 1, /* size (0 = byte, 1 = short, 2 = long) */
299 false, /* pc_relative */
301 complain_overflow_bitfield, /* complain_on_overflow */
302 bfd_elf_generic_reloc, /* special_function */
303 "R_CRIS_16_GOT", /* name */
304 false, /* partial_inplace */
306 0xffff, /* dst_mask */
307 false), /* pcrel_offset */
309 HOWTO (R_CRIS_32_GOT, /* type */
311 2, /* size (0 = byte, 1 = short, 2 = long) */
313 false, /* pc_relative */
315 complain_overflow_bitfield, /* complain_on_overflow */
316 bfd_elf_generic_reloc, /* special_function */
317 "R_CRIS_32_GOT", /* name */
318 false, /* partial_inplace */
320 0xffffffff, /* dst_mask */
321 false), /* pcrel_offset */
323 /* Like R_CRIS_32_GOT, but referring to (and requesting a) PLT part of
324 the GOT table for the symbol. */
325 HOWTO (R_CRIS_16_GOTPLT, /* type */
327 1, /* size (0 = byte, 1 = short, 2 = long) */
329 false, /* pc_relative */
331 complain_overflow_bitfield, /* complain_on_overflow */
332 bfd_elf_generic_reloc, /* special_function */
333 "R_CRIS_16_GOTPLT", /* name */
334 false, /* partial_inplace */
336 0xffff, /* dst_mask */
337 false), /* pcrel_offset */
339 HOWTO (R_CRIS_32_GOTPLT, /* type */
341 2, /* size (0 = byte, 1 = short, 2 = long) */
343 false, /* pc_relative */
345 complain_overflow_bitfield, /* complain_on_overflow */
346 bfd_elf_generic_reloc, /* special_function */
347 "R_CRIS_32_GOTPLT", /* name */
348 false, /* partial_inplace */
350 0xffffffff, /* dst_mask */
351 false), /* pcrel_offset */
353 /* A 32-bit offset from GOT to (local const) symbol: no GOT entry should
355 HOWTO (R_CRIS_32_GOTREL, /* type */
357 2, /* size (0 = byte, 1 = short, 2 = long) */
359 false, /* pc_relative */
361 complain_overflow_bitfield, /* complain_on_overflow */
362 bfd_elf_generic_reloc, /* special_function */
363 "R_CRIS_32_GOTREL", /* name */
364 false, /* partial_inplace */
366 0xffffffff, /* dst_mask */
367 false), /* pcrel_offset */
369 /* A 32-bit offset from GOT to entry for this symbol in PLT and request
370 to create PLT entry for symbol. */
371 HOWTO (R_CRIS_32_PLT_GOTREL, /* type */
373 2, /* size (0 = byte, 1 = short, 2 = long) */
375 false, /* pc_relative */
377 complain_overflow_bitfield, /* complain_on_overflow */
378 bfd_elf_generic_reloc, /* special_function */
379 "R_CRIS_32_PLT_GOTREL", /* name */
380 false, /* partial_inplace */
382 0xffffffff, /* dst_mask */
383 false), /* pcrel_offset */
385 /* A 32-bit offset from PC (location after the relocation) + addend to
386 entry for this symbol in PLT and request to create PLT entry for
388 HOWTO (R_CRIS_32_PLT_PCREL, /* type */
390 2, /* size (0 = byte, 1 = short, 2 = long) */
392 true, /* pc_relative */
394 complain_overflow_bitfield, /* complain_on_overflow */
395 bfd_elf_generic_reloc, /* special_function */
396 "R_CRIS_32_PLT_PCREL", /* name */
397 false, /* partial_inplace */
399 0xffffffff, /* dst_mask */
400 true) /* pcrel_offset */
403 /* Map BFD reloc types to CRIS ELF reloc types. */
405 struct cris_reloc_map
407 bfd_reloc_code_real_type bfd_reloc_val;
408 unsigned int cris_reloc_val;
411 static const struct cris_reloc_map cris_reloc_map [] =
413 { BFD_RELOC_NONE, R_CRIS_NONE },
414 { BFD_RELOC_8, R_CRIS_8 },
415 { BFD_RELOC_16, R_CRIS_16 },
416 { BFD_RELOC_32, R_CRIS_32 },
417 { BFD_RELOC_8_PCREL, R_CRIS_8_PCREL },
418 { BFD_RELOC_16_PCREL, R_CRIS_16_PCREL },
419 { BFD_RELOC_32_PCREL, R_CRIS_32_PCREL },
420 { BFD_RELOC_VTABLE_INHERIT, R_CRIS_GNU_VTINHERIT },
421 { BFD_RELOC_VTABLE_ENTRY, R_CRIS_GNU_VTENTRY },
422 { BFD_RELOC_CRIS_COPY, R_CRIS_COPY },
423 { BFD_RELOC_CRIS_GLOB_DAT, R_CRIS_GLOB_DAT },
424 { BFD_RELOC_CRIS_JUMP_SLOT, R_CRIS_JUMP_SLOT },
425 { BFD_RELOC_CRIS_RELATIVE, R_CRIS_RELATIVE },
426 { BFD_RELOC_CRIS_16_GOT, R_CRIS_16_GOT },
427 { BFD_RELOC_CRIS_32_GOT, R_CRIS_32_GOT },
428 { BFD_RELOC_CRIS_16_GOTPLT, R_CRIS_16_GOTPLT },
429 { BFD_RELOC_CRIS_32_GOTPLT, R_CRIS_32_GOTPLT },
430 { BFD_RELOC_CRIS_32_GOTREL, R_CRIS_32_GOTREL },
431 { BFD_RELOC_CRIS_32_PLT_GOTREL, R_CRIS_32_PLT_GOTREL },
432 { BFD_RELOC_CRIS_32_PLT_PCREL, R_CRIS_32_PLT_PCREL }
435 static reloc_howto_type *
436 cris_reloc_type_lookup (abfd, code)
437 bfd * abfd ATTRIBUTE_UNUSED;
438 bfd_reloc_code_real_type code;
442 for (i = sizeof (cris_reloc_map) / sizeof (cris_reloc_map[0]);
444 if (cris_reloc_map [i].bfd_reloc_val == code)
445 return & cris_elf_howto_table [cris_reloc_map[i].cris_reloc_val];
450 /* Set the howto pointer for an CRIS ELF reloc. */
453 cris_info_to_howto_rela (abfd, cache_ptr, dst)
454 bfd * abfd ATTRIBUTE_UNUSED;
456 Elf32_Internal_Rela * dst;
460 r_type = ELF32_R_TYPE (dst->r_info);
461 BFD_ASSERT (r_type < (unsigned int) R_CRIS_max);
462 cache_ptr->howto = & cris_elf_howto_table [r_type];
465 /* The name of the dynamic interpreter. This is put in the .interp
468 #define ELF_DYNAMIC_INTERPRETER "/lib/ld.so.1"
470 /* The size in bytes of an entry in the procedure linkage table. */
472 #define PLT_ENTRY_SIZE 20
474 /* The first entry in an absolute procedure linkage table looks like this. */
476 static const bfd_byte elf_cris_plt0_entry[PLT_ENTRY_SIZE] =
479 0x7e, 0x7e, /* push mof. */
480 0x7f, 0x0d, /* (dip [pc+]) */
481 0, 0, 0, 0, /* Replaced with address of .got + 4. */
482 0x30, 0x7a, /* move [...],mof */
483 0x7f, 0x0d, /* (dip [pc+]) */
484 0, 0, 0, 0, /* Replaced with address of .got + 8. */
485 0x30, 0x09, /* jump [...] */
488 /* Subsequent entries in an absolute procedure linkage table look like
491 static const bfd_byte elf_cris_plt_entry[PLT_ENTRY_SIZE] =
493 0x7f, 0x0d, /* (dip [pc+]) */
494 0, 0, 0, 0, /* Replaced with address of this symbol in .got. */
495 0x30, 0x09, /* jump [...] */
496 0x3f, 0x7e, /* move [pc+],mof */
497 0, 0, 0, 0, /* Replaced with offset into relocation table. */
498 0x2f, 0xfe, /* add.d [pc+],pc */
500 0xff, 0xff /* Replaced with offset to start of .plt. */
503 /* The first entry in a PIC procedure linkage table looks like this. */
505 static const bfd_byte elf_cris_pic_plt0_entry[PLT_ENTRY_SIZE] =
507 0xfc, 0xe1, 0x7e, 0x7e, /* push mof */
508 0x04, 0x01, 0x30, 0x7a, /* move [r0+4],mof */
509 0x08, 0x01, 0x30, 0x09, /* jump [r0+8] */
510 0, 0, 0, 0, 0, 0, 0, 0, /* Pad out to 20 bytes. */
513 /* Subsequent entries in a PIC procedure linkage table look like this. */
515 static const bfd_byte elf_cris_pic_plt_entry[PLT_ENTRY_SIZE] =
517 0x6f, 0x0d, /* (bdap [pc+].d,r0) */
518 0, 0, 0, 0, /* Replaced with offset of this symbol in .got. */
519 0x30, 0x09, /* jump [...] */
520 0x3f, 0x7e, /* move [pc+],mof */
521 0, 0, 0, 0, /* Replaced with offset into relocation table. */
522 0x2f, 0xfe, /* add.d [pc+],pc */
523 0xec, 0xff, /* Replaced with offset to start of .plt. */
527 /* We copy elf32-m68k.c and elf32-i386.c for the basic linker hash bits
528 (and most other PIC/shlib stuff). Check that we don't drift away
531 The CRIS linker, like the m68k and i386 linkers (and probably the rest
532 too) needs to keep track of the number of relocs that it decides to
533 copy in check_relocs for each symbol. This is so that it can discard
534 PC relative relocs if it doesn't need them when linking with
535 -Bsymbolic. We store the information in a field extending the regular
536 ELF linker hash table. */
538 /* This structure keeps track of the number of PC relative relocs we have
539 copied for a given symbol. */
541 struct elf_cris_pcrel_relocs_copied
544 struct elf_cris_pcrel_relocs_copied *next;
545 /* A section in dynobj. */
547 /* Number of relocs copied in this section. */
551 /* CRIS ELF linker hash entry. */
553 struct elf_cris_link_hash_entry
555 struct elf_link_hash_entry root;
557 /* Number of PC relative relocs copied for this symbol. */
558 struct elf_cris_pcrel_relocs_copied *pcrel_relocs_copied;
560 /* The GOTPLT references are CRIS-specific; the goal is to avoid having
561 both a general GOT and a PLT-specific GOT entry for the same symbol,
562 when it is referenced both as a function and as a function pointer.
564 Number of GOTPLT references for a function. */
565 bfd_signed_vma gotplt_refcount;
567 /* Actual GOTPLT index for this symbol, if applicable, or zero if not
568 (zero is never used as an index). FIXME: We should be able to fold
569 this with gotplt_refcount in a union, like the got and plt unions in
570 elf_link_hash_entry. */
571 bfd_size_type gotplt_offset;
574 /* CRIS ELF linker hash table. */
576 struct elf_cris_link_hash_table
578 struct elf_link_hash_table root;
580 /* We can't use the PLT offset and calculate to get the GOTPLT offset,
581 since we try and avoid creating GOTPLT:s when there's already a GOT.
582 Instead, we keep and update the next available index here. */
583 bfd_size_type next_gotplt_entry;
586 /* Traverse a CRIS ELF linker hash table. */
588 #define elf_cris_link_hash_traverse(table, func, info) \
589 (elf_link_hash_traverse \
591 (boolean (*) PARAMS ((struct elf_link_hash_entry *, PTR))) (func), \
594 /* Get the CRIS ELF linker hash table from a link_info structure. */
596 #define elf_cris_hash_table(p) \
597 ((struct elf_cris_link_hash_table *) (p)->hash)
599 /* Create an entry in a CRIS ELF linker hash table. */
601 static struct bfd_hash_entry *
602 elf_cris_link_hash_newfunc (entry, table, string)
603 struct bfd_hash_entry *entry;
604 struct bfd_hash_table *table;
607 struct elf_cris_link_hash_entry *ret =
608 (struct elf_cris_link_hash_entry *) entry;
610 /* Allocate the structure if it has not already been allocated by a
612 if (ret == (struct elf_cris_link_hash_entry *) NULL)
613 ret = ((struct elf_cris_link_hash_entry *)
614 bfd_hash_allocate (table,
615 sizeof (struct elf_cris_link_hash_entry)));
616 if (ret == (struct elf_cris_link_hash_entry *) NULL)
617 return (struct bfd_hash_entry *) ret;
619 /* Call the allocation method of the superclass. */
620 ret = ((struct elf_cris_link_hash_entry *)
621 _bfd_elf_link_hash_newfunc ((struct bfd_hash_entry *) ret,
623 if (ret != (struct elf_cris_link_hash_entry *) NULL)
625 ret->pcrel_relocs_copied = NULL;
626 ret->gotplt_refcount = 0;
627 ret->gotplt_offset = 0;
630 return (struct bfd_hash_entry *) ret;
633 /* Create a CRIS ELF linker hash table. */
635 static struct bfd_link_hash_table *
636 elf_cris_link_hash_table_create (abfd)
639 struct elf_cris_link_hash_table *ret;
640 bfd_size_type amt = sizeof (struct elf_cris_link_hash_table);
642 ret = ((struct elf_cris_link_hash_table *) bfd_alloc (abfd, amt));
643 if (ret == (struct elf_cris_link_hash_table *) NULL)
646 if (! _bfd_elf_link_hash_table_init (&ret->root, abfd,
647 elf_cris_link_hash_newfunc))
649 bfd_release (abfd, ret);
653 /* Initialize to skip over the first three entries in the gotplt; they
654 are used for run-time symbol evaluation. */
655 ret->next_gotplt_entry = 12;
657 return &ret->root.root;
660 /* Perform a single relocation. By default we use the standard BFD
661 routines, with a few tweaks. */
663 static bfd_reloc_status_type
664 cris_final_link_relocate (howto, input_bfd, input_section, contents, rel,
666 reloc_howto_type * howto;
668 asection * input_section;
670 Elf_Internal_Rela * rel;
673 bfd_reloc_status_type r;
675 /* PC-relative relocations are relative to the position *after*
676 the reloc. Note that for R_CRIS_8_PCREL the adjustment is
677 not a single byte, since PC must be 16-bit-aligned. */
678 switch (ELF32_R_TYPE (rel->r_info))
680 /* Check that the 16-bit GOT relocs are positive. */
681 case R_CRIS_16_GOTPLT:
683 if ((bfd_signed_vma) relocation < 0)
684 return bfd_reloc_overflow;
687 case R_CRIS_32_PLT_PCREL:
688 case R_CRIS_32_PCREL:
692 case R_CRIS_16_PCREL:
700 r = _bfd_final_link_relocate (howto, input_bfd, input_section,
701 contents, rel->r_offset,
702 relocation, rel->r_addend);
706 /* Relocate an CRIS ELF section. See elf32-fr30.c, from where this was
707 copied, for further comments. */
710 cris_elf_relocate_section (output_bfd, info, input_bfd, input_section,
711 contents, relocs, local_syms, local_sections)
712 bfd * output_bfd ATTRIBUTE_UNUSED;
713 struct bfd_link_info * info;
715 asection * input_section;
717 Elf_Internal_Rela * relocs;
718 Elf_Internal_Sym * local_syms;
719 asection ** local_sections;
722 Elf_Internal_Shdr * symtab_hdr;
723 struct elf_link_hash_entry ** sym_hashes;
724 bfd_vma *local_got_offsets;
728 Elf_Internal_Rela * rel;
729 Elf_Internal_Rela * relend;
731 dynobj = elf_hash_table (info)->dynobj;
732 local_got_offsets = elf_local_got_offsets (input_bfd);
733 symtab_hdr = & elf_tdata (input_bfd)->symtab_hdr;
734 sym_hashes = elf_sym_hashes (input_bfd);
735 relend = relocs + input_section->reloc_count;
737 /* It seems this can happen with erroneous or unsupported input (mixing
738 a.out and elf in an archive, for example.) */
739 if (sym_hashes == NULL)
748 splt = bfd_get_section_by_name (dynobj, ".plt");
749 sgot = bfd_get_section_by_name (dynobj, ".got");
752 for (rel = relocs; rel < relend; rel ++)
754 reloc_howto_type * howto;
755 unsigned long r_symndx;
756 Elf_Internal_Sym * sym;
758 struct elf_link_hash_entry * h;
760 bfd_reloc_status_type r;
761 const char * symname = NULL;
764 r_type = ELF32_R_TYPE (rel->r_info);
766 if ( r_type == R_CRIS_GNU_VTINHERIT
767 || r_type == R_CRIS_GNU_VTENTRY)
770 r_symndx = ELF32_R_SYM (rel->r_info);
772 if (info->relocateable)
774 /* This is a relocateable link. We don't have to change
775 anything, unless the reloc is against a section symbol,
776 in which case we have to adjust according to where the
777 section symbol winds up in the output section. */
778 if (r_symndx < symtab_hdr->sh_info)
780 sym = local_syms + r_symndx;
782 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
784 sec = local_sections [r_symndx];
785 rel->r_addend += sec->output_offset + sym->st_value;
792 /* This is a final link. */
793 howto = cris_elf_howto_table + r_type;
798 if (r_symndx < symtab_hdr->sh_info)
800 sym = local_syms + r_symndx;
801 sec = local_sections [r_symndx];
802 relocation = (sec->output_section->vma
806 symname = (bfd_elf_string_from_elf_section
807 (input_bfd, symtab_hdr->sh_link, sym->st_name));
809 symname = bfd_section_name (input_bfd, sec);
813 h = sym_hashes [r_symndx - symtab_hdr->sh_info];
815 while (h->root.type == bfd_link_hash_indirect
816 || h->root.type == bfd_link_hash_warning)
817 h = (struct elf_link_hash_entry *) h->root.u.i.link;
819 symname = h->root.root.string;
821 if (h->root.type == bfd_link_hash_defined
822 || h->root.type == bfd_link_hash_defweak)
824 sec = h->root.u.def.section;
826 /* Perhaps we should detect the cases that
827 sec->output_section is expected to be NULL like i386 and
828 m68k, but apparently (and according to elfxx-ia64.c) all
829 valid cases are where the symbol is defined in a shared
830 object which we link dynamically against. This includes
831 PLT relocs for which we've created a PLT entry and other
832 relocs for which we're prepared to create dynamic
835 For now, new situations cause us to just err when
836 sec->output_offset is NULL but the object with the symbol
837 is *not* dynamically linked against. Thus this will
838 automatically remind us so we can see if there are other
839 valid cases we need to revisit. */
840 if ((sec->output_section == NULL
841 && (sec->owner->flags & DYNAMIC) != 0)
843 /* Here follow the cases where the relocation value must
844 be zero (or when further handling is simplified when
845 zero). I can't claim to understand the various
846 conditions and they weren't described in the files
847 where I copied them from (elf32-m68k.c and
848 elf32-i386.c), but let's mention examples of where
849 they happen. FIXME: Perhaps define and use a
850 dynamic_symbol_p function like ia64.
852 - When creating a shared library, we can have an
853 ordinary relocation for a symbol defined in a shared
854 library (perhaps the one we create). We then make
855 the relocation value zero, as the value seen now will
856 be added into the relocation addend in this shared
857 library, but must be handled only at dynamic-link
858 time. FIXME: Not sure this example covers the
859 h->elf_link_hash_flags test, though it's there in
862 && ((! info->symbolic && h->dynindx != -1)
863 || (h->elf_link_hash_flags
864 & ELF_LINK_HASH_DEF_REGULAR) == 0)
865 && (input_section->flags & SEC_ALLOC) != 0
866 && (r_type == R_CRIS_8
867 || r_type == R_CRIS_16
868 || r_type == R_CRIS_32
869 || r_type == R_CRIS_8_PCREL
870 || r_type == R_CRIS_16_PCREL
871 || r_type == R_CRIS_32_PCREL)))
873 else if (sec->output_section != NULL)
874 relocation = (h->root.u.def.value
875 + sec->output_section->vma
876 + sec->output_offset);
879 (*_bfd_error_handler)
880 (_("%s: unresolvable relocation %s against symbol `%s' from %s section"),
881 bfd_archive_filename (input_bfd),
882 cris_elf_howto_table[r_type].name,
884 bfd_get_section_name (input_bfd, input_section));
885 bfd_set_error (bfd_error_bad_value);
889 else if (h->root.type == bfd_link_hash_undefweak)
891 else if (info->shared
892 && (!info->symbolic || info->allow_shlib_undefined)
893 && !info->no_undefined
894 && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
898 if (!(info->callbacks->undefined_symbol
899 (info, symname, input_bfd,
900 input_section, rel->r_offset,
901 (!info->shared || info->no_undefined
902 || ELF_ST_VISIBILITY (h->other)))))
910 case R_CRIS_16_GOTPLT:
911 case R_CRIS_32_GOTPLT:
912 /* This is like the case for R_CRIS_32_GOT and R_CRIS_16_GOT,
913 but we require a PLT, and the PLT handling will take care of
914 filling in the PLT-specific GOT entry. For the GOT offset,
915 calculate it as we do when filling it in for the .got.plt
916 section. If we don't have a PLT, punt to GOT handling. */
918 && ((struct elf_cris_link_hash_entry *) h)->gotplt_offset != 0)
921 = bfd_get_section_by_name (dynobj, ".got.plt");
924 BFD_ASSERT (h->dynindx != -1);
925 BFD_ASSERT (sgotplt != NULL);
928 = ((struct elf_cris_link_hash_entry *) h)->gotplt_offset;
930 relocation = got_offset;
934 /* We didn't make a PLT entry for this symbol. Maybe everything is
935 folded into the GOT. Other than folding, this happens when
936 statically linking PIC code, or when using -Bsymbolic. Check
937 that we instead have a GOT entry as done for us by
938 elf_cris_adjust_dynamic_symbol, and drop through into the
939 ordinary GOT cases. */
940 if (h != NULL && h->got.offset == (bfd_vma) -1)
942 (*_bfd_error_handler)
943 (_("%s: No PLT nor GOT for relocation %s against symbol `%s' from %s section"),
944 bfd_archive_filename (input_bfd),
945 cris_elf_howto_table[r_type].name,
946 symname[0] != '\0' ? symname : _("[whose name is lost]"),
947 bfd_get_section_name (input_bfd, input_section));
949 /* FIXME: Perhaps blaming input is not the right thing to
950 do; this is probably an internal error. But it is true
951 that we didn't like that particular input. */
952 bfd_set_error (bfd_error_bad_value);
957 /* The size of the actual relocation is not used here; we only
958 fill in the GOT table here. */
964 /* Note that despite using RELA relocations, the .got contents
965 is always filled in with the link-relative relocation
966 value; the addend. */
971 BFD_ASSERT (off != (bfd_vma) -1);
973 if (!elf_hash_table (info)->dynamic_sections_created
974 || (! info->shared && h->dynindx == -1)
976 && (info->symbolic || h->dynindx == -1)
977 && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR)))
979 /* This wasn't checked above for ! info->shared, but
980 must hold there if we get here; the symbol must not
981 be used in, or defined by a DSO. (Note that
982 checking for ELF_LINK_HASH_DEF_REGULAR doesn't
984 BFD_ASSERT (info->shared
985 || (h->elf_link_hash_flags
986 & (ELF_LINK_HASH_REF_DYNAMIC
987 | ELF_LINK_HASH_DEF_DYNAMIC)) == 0);
989 /* This is actually a static link, or it is a
990 -Bsymbolic link and the symbol is defined
991 locally, or the symbol was forced to be local
992 because of a version file, or we're not creating a
993 dynamic object and the symbol isn't referred to by
994 a dynamic object. We must initialize
995 this entry in the global offset table. Since
996 the offset must always be a multiple of 4, we
997 use the least significant bit to record whether
998 we have initialized it already.
1000 When doing a dynamic link, we create a .rela.got
1001 relocation entry to initialize the value. This
1002 is done in the finish_dynamic_symbol routine. */
1007 bfd_put_32 (output_bfd, relocation,
1008 sgot->contents + off);
1015 BFD_ASSERT (local_got_offsets != NULL
1016 && local_got_offsets[r_symndx] != (bfd_vma) -1);
1018 off = local_got_offsets[r_symndx];
1020 /* The offset must always be a multiple of 4. We use
1021 the least significant bit to record whether we have
1022 already generated the necessary reloc. */
1027 bfd_put_32 (output_bfd, relocation, sgot->contents + off);
1032 Elf_Internal_Rela outrel;
1034 srelgot = bfd_get_section_by_name (dynobj, ".rela.got");
1035 BFD_ASSERT (srelgot != NULL);
1037 outrel.r_offset = (sgot->output_section->vma
1038 + sgot->output_offset
1040 outrel.r_info = ELF32_R_INFO (0, R_CRIS_RELATIVE);
1041 outrel.r_addend = relocation;
1042 bfd_elf32_swap_reloca_out (output_bfd, &outrel,
1043 (((Elf32_External_Rela *)
1045 + srelgot->reloc_count));
1046 ++srelgot->reloc_count;
1049 local_got_offsets[r_symndx] |= 1;
1053 relocation = sgot->output_offset + off;
1054 if (rel->r_addend != 0)
1056 /* We can't do anything for a relocation which is against
1057 a symbol *plus offset*. GOT holds relocations for
1058 symbols. Make this an error; the compiler isn't
1059 allowed to pass us these kinds of things. */
1061 (*_bfd_error_handler)
1062 (_("%s: relocation %s with non-zero addend %d against local symbol from %s section"),
1063 bfd_archive_filename (input_bfd),
1064 cris_elf_howto_table[r_type].name,
1066 bfd_get_section_name (input_bfd, input_section));
1068 (*_bfd_error_handler)
1069 (_("%s: relocation %s with non-zero addend %d against symbol `%s' from %s section"),
1070 bfd_archive_filename (input_bfd),
1071 cris_elf_howto_table[r_type].name,
1073 symname[0] != '\0' ? symname : _("[whose name is lost]"),
1074 bfd_get_section_name (input_bfd, input_section));
1076 bfd_set_error (bfd_error_bad_value);
1082 case R_CRIS_32_GOTREL:
1083 /* This relocation must only be performed against local symbols. */
1086 (*_bfd_error_handler)
1087 (_("%s: relocation %s is not allowed for global symbol: `%s' from %s section"),
1088 bfd_archive_filename (input_bfd),
1089 cris_elf_howto_table[r_type].name,
1091 bfd_get_section_name (input_bfd, input_section));
1092 bfd_set_error (bfd_error_bad_value);
1096 /* This relocation is like a PC-relative one, except the
1097 reference point is the location of GOT. Note that
1098 sgot->output_offset is not involved in this calculation. We
1099 always want the start of entire .got section, not the
1100 position after the reserved header. */
1101 relocation -= sgot->output_section->vma;
1104 case R_CRIS_32_PLT_PCREL:
1105 /* Relocation is to the entry for this symbol in the
1106 procedure linkage table. */
1108 /* Resolve a PLT_PCREL reloc against a local symbol directly,
1109 without using the procedure linkage table. */
1113 if (h->plt.offset == (bfd_vma) -1
1116 /* We didn't make a PLT entry for this symbol. This
1117 happens when statically linking PIC code, or when
1118 using -Bsymbolic. */
1122 relocation = (splt->output_section->vma
1123 + splt->output_offset
1127 case R_CRIS_32_PLT_GOTREL:
1128 /* Like R_CRIS_32_PLT_PCREL, but the reference point is the
1129 start of the .got section. See also comment at
1131 relocation -= sgot->output_section->vma;
1133 /* Resolve a PLT_GOTREL reloc against a local symbol directly,
1134 without using the procedure linkage table. */
1138 if (h->plt.offset == (bfd_vma) -1
1141 /* We didn't make a PLT entry for this symbol. This
1142 happens when statically linking PIC code, or when
1143 using -Bsymbolic. */
1147 relocation = (splt->output_section->vma
1148 + splt->output_offset
1150 - sgot->output_section->vma);
1153 case R_CRIS_8_PCREL:
1154 case R_CRIS_16_PCREL:
1155 case R_CRIS_32_PCREL:
1156 /* If the symbol was local, we need no shlib-specific handling. */
1165 && (input_section->flags & SEC_ALLOC) != 0
1166 && ((r_type != R_CRIS_8_PCREL
1167 && r_type != R_CRIS_16_PCREL
1168 && r_type != R_CRIS_32_PCREL)
1170 || (h->elf_link_hash_flags
1171 & ELF_LINK_HASH_DEF_REGULAR) == 0)))
1173 Elf_Internal_Rela outrel;
1174 boolean skip, relocate;
1176 /* When generating a shared object, these relocations
1177 are copied into the output file to be resolved at run
1184 name = (bfd_elf_string_from_elf_section
1186 elf_elfheader (input_bfd)->e_shstrndx,
1187 elf_section_data (input_section)->rel_hdr.sh_name));
1191 BFD_ASSERT (strncmp (name, ".rela", 5) == 0
1192 && strcmp (bfd_get_section_name (input_bfd,
1196 sreloc = bfd_get_section_by_name (dynobj, name);
1198 /* That section should have been created in
1199 cris_elf_check_relocs, but that function will not be
1200 called for objects which fail in
1201 cris_elf_merge_private_bfd_data. */
1204 (*_bfd_error_handler)
1205 (_("%s: Internal inconsistency; no relocation section %s"),
1206 bfd_archive_filename (input_bfd),
1209 bfd_set_error (bfd_error_bad_value);
1216 if (elf_section_data (input_section)->stab_info == NULL)
1217 outrel.r_offset = rel->r_offset;
1222 off = (_bfd_stab_section_offset
1223 (output_bfd, &elf_hash_table (info)->stab_info,
1225 &elf_section_data (input_section)->stab_info,
1227 if (off == (bfd_vma) -1)
1229 outrel.r_offset = off;
1232 outrel.r_offset += (input_section->output_section->vma
1233 + input_section->output_offset);
1237 memset (&outrel, 0, sizeof outrel);
1240 /* h->dynindx may be -1 if the symbol was marked to
1243 && ((! info->symbolic && h->dynindx != -1)
1244 || (h->elf_link_hash_flags
1245 & ELF_LINK_HASH_DEF_REGULAR) == 0))
1247 BFD_ASSERT (h->dynindx != -1);
1249 outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
1250 outrel.r_addend = relocation + rel->r_addend;
1254 if (r_type == R_CRIS_32)
1257 outrel.r_info = ELF32_R_INFO (0, R_CRIS_RELATIVE);
1258 outrel.r_addend = relocation + rel->r_addend;
1265 sec = local_sections[r_symndx];
1268 BFD_ASSERT (h->root.type == bfd_link_hash_defined
1270 == bfd_link_hash_defweak));
1271 sec = h->root.u.def.section;
1273 if (sec != NULL && bfd_is_abs_section (sec))
1275 else if (sec == NULL || sec->owner == NULL)
1277 bfd_set_error (bfd_error_bad_value);
1284 osec = sec->output_section;
1285 indx = elf_section_data (osec)->dynindx;
1286 BFD_ASSERT (indx > 0);
1290 outrel.r_info = ELF32_R_INFO (indx, r_type);
1291 outrel.r_addend = relocation + rel->r_addend;
1295 bfd_elf32_swap_reloca_out (output_bfd, &outrel,
1296 (((Elf32_External_Rela *)
1298 + sreloc->reloc_count));
1299 ++sreloc->reloc_count;
1301 /* This reloc will be computed at runtime, so there's no
1302 need to do anything now, except for R_CRIS_32 relocations
1303 that have been turned into R_CRIS_RELATIVE. */
1311 r = cris_final_link_relocate (howto, input_bfd, input_section,
1312 contents, rel, relocation);
1314 if (r != bfd_reloc_ok)
1316 const char * msg = (const char *) NULL;
1320 case bfd_reloc_overflow:
1321 r = info->callbacks->reloc_overflow
1322 (info, symname, howto->name, (bfd_vma) 0,
1323 input_bfd, input_section, rel->r_offset);
1326 case bfd_reloc_undefined:
1327 r = info->callbacks->undefined_symbol
1328 (info, symname, input_bfd, input_section, rel->r_offset,
1332 case bfd_reloc_outofrange:
1333 msg = _("internal error: out of range error");
1336 case bfd_reloc_notsupported:
1337 msg = _("internal error: unsupported relocation error");
1340 case bfd_reloc_dangerous:
1341 msg = _("internal error: dangerous relocation");
1345 msg = _("internal error: unknown error");
1350 r = info->callbacks->warning
1351 (info, msg, symname, input_bfd, input_section, rel->r_offset);
1361 /* Finish up dynamic symbol handling. We set the contents of various
1362 dynamic sections here. */
1365 elf_cris_finish_dynamic_symbol (output_bfd, info, h, sym)
1367 struct bfd_link_info *info;
1368 struct elf_link_hash_entry *h;
1369 Elf_Internal_Sym *sym;
1372 int plt_off1 = 2, plt_off2 = 10, plt_off3 = 16;
1374 dynobj = elf_hash_table (info)->dynobj;
1376 if (h->plt.offset != (bfd_vma) -1)
1384 bfd_vma gotplt_offset
1385 = ((struct elf_cris_link_hash_entry *) h)->gotplt_offset;
1386 Elf_Internal_Rela rela;
1387 boolean has_gotplt = gotplt_offset != 0;
1389 /* Get the index in the procedure linkage table which
1390 corresponds to this symbol. This is the index of this symbol
1391 in all the symbols for which we are making plt entries. The
1392 first entry in the procedure linkage table is reserved. */
1393 /* We have to count backwards here, and the result is only valid as
1394 an index into .got.plt and its relocations. FIXME: Constants... */
1395 bfd_vma gotplt_index = gotplt_offset/4 - 3;
1397 /* Get the offset into the .got table of the entry that corresponds
1398 to this function. Note that we embed knowledge that "incoming"
1399 .got goes after .got.plt in the output without padding (pointer
1400 aligned). However, that knowledge is present in several other
1401 places too, here and in elflink.h at least. */
1405 : h->got.offset + elf_cris_hash_table(info)->next_gotplt_entry);
1407 /* This symbol has an entry in the procedure linkage table. Set it
1410 BFD_ASSERT (h->dynindx != -1);
1412 splt = bfd_get_section_by_name (dynobj, ".plt");
1413 sgot = bfd_get_section_by_name (dynobj, ".got");
1414 sgotplt = bfd_get_section_by_name (dynobj, ".got.plt");
1415 srela = bfd_get_section_by_name (dynobj, ".rela.plt");
1416 BFD_ASSERT (splt != NULL && sgotplt != NULL
1417 && (! has_gotplt || srela != NULL));
1419 got_base = sgotplt->output_section->vma + sgotplt->output_offset;
1421 /* Fill in the entry in the procedure linkage table. */
1424 memcpy (splt->contents + h->plt.offset, elf_cris_plt_entry,
1427 /* We need to enter the absolute address of the GOT entry here. */
1428 bfd_put_32 (output_bfd, got_base + got_offset,
1429 splt->contents + h->plt.offset + plt_off1);
1433 memcpy (splt->contents + h->plt.offset, elf_cris_pic_plt_entry,
1435 bfd_put_32 (output_bfd, got_offset,
1436 splt->contents + h->plt.offset + plt_off1);
1439 /* Fill in the plt entry and make a relocation, if this is a "real"
1443 /* Fill in the offset into the reloc table. */
1444 bfd_put_32 (output_bfd,
1445 gotplt_index * sizeof (Elf32_External_Rela),
1446 splt->contents + h->plt.offset + plt_off2);
1448 /* Fill in the offset to the first PLT entry, where to "jump". */
1449 bfd_put_32 (output_bfd, - (h->plt.offset + plt_off3 + 4),
1450 splt->contents + h->plt.offset + plt_off3);
1452 /* Fill in the entry in the global offset table with the address of
1453 the relocating stub. */
1454 bfd_put_32 (output_bfd,
1455 (splt->output_section->vma
1456 + splt->output_offset
1459 sgotplt->contents + got_offset);
1461 /* Fill in the entry in the .rela.plt section. */
1462 rela.r_offset = (sgotplt->output_section->vma
1463 + sgotplt->output_offset
1465 rela.r_info = ELF32_R_INFO (h->dynindx, R_CRIS_JUMP_SLOT);
1467 bfd_elf32_swap_reloca_out (output_bfd, &rela,
1468 ((Elf32_External_Rela *) srela->contents
1472 if ((h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0)
1474 /* Mark the symbol as undefined, rather than as defined in
1475 the .plt section. Leave the value alone. */
1476 sym->st_shndx = SHN_UNDEF;
1478 /* FIXME: From elf32-sparc.c 2001-02-19 (1.18). I still don't
1479 know whether resetting the value is significant; if it really
1480 is, rather than a quirk or bug in the sparc port, then I
1481 believe we'd see this elsewhere. */
1482 /* If the symbol is weak, we do need to clear the value.
1483 Otherwise, the PLT entry would provide a definition for
1484 the symbol even if the symbol wasn't defined anywhere,
1485 and so the symbol would never be NULL. */
1486 if ((h->elf_link_hash_flags & ELF_LINK_HASH_REF_REGULAR_NONWEAK)
1492 /* We don't emit .got relocs for symbols that aren't in the
1493 dynamic-symbols table for an ordinary program. */
1494 if (h->got.offset != (bfd_vma) -1
1495 && (info->shared || h->dynindx != -1))
1499 Elf_Internal_Rela rela;
1502 /* This symbol has an entry in the global offset table. Set it up. */
1504 sgot = bfd_get_section_by_name (dynobj, ".got");
1505 srela = bfd_get_section_by_name (dynobj, ".rela.got");
1506 BFD_ASSERT (sgot != NULL && srela != NULL);
1508 rela.r_offset = (sgot->output_section->vma
1509 + sgot->output_offset
1510 + (h->got.offset &~ (bfd_vma) 1));
1512 /* If this is a static link, or it is a -Bsymbolic link and the
1513 symbol is defined locally or was forced to be local because
1514 of a version file, we just want to emit a RELATIVE reloc.
1515 The entry in the global offset table will already have been
1516 initialized in the relocate_section function. */
1517 where = sgot->contents + (h->got.offset &~ (bfd_vma) 1);
1518 if (! elf_hash_table (info)->dynamic_sections_created
1520 && (info->symbolic || h->dynindx == -1)
1521 && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR)))
1523 rela.r_info = ELF32_R_INFO (0, R_CRIS_RELATIVE);
1524 rela.r_addend = bfd_get_signed_32 (output_bfd, where);
1528 bfd_put_32 (output_bfd, (bfd_vma) 0, where);
1529 rela.r_info = ELF32_R_INFO (h->dynindx, R_CRIS_GLOB_DAT);
1533 bfd_elf32_swap_reloca_out (output_bfd, &rela,
1534 ((Elf32_External_Rela *) srela->contents
1535 + srela->reloc_count));
1536 ++srela->reloc_count;
1539 if ((h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_COPY) != 0)
1542 Elf_Internal_Rela rela;
1544 /* This symbol needs a copy reloc. Set it up. */
1546 BFD_ASSERT (h->dynindx != -1
1547 && (h->root.type == bfd_link_hash_defined
1548 || h->root.type == bfd_link_hash_defweak));
1550 s = bfd_get_section_by_name (h->root.u.def.section->owner,
1552 BFD_ASSERT (s != NULL);
1554 rela.r_offset = (h->root.u.def.value
1555 + h->root.u.def.section->output_section->vma
1556 + h->root.u.def.section->output_offset);
1557 rela.r_info = ELF32_R_INFO (h->dynindx, R_CRIS_COPY);
1559 bfd_elf32_swap_reloca_out (output_bfd, &rela,
1560 ((Elf32_External_Rela *) s->contents
1565 /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute. */
1566 if (strcmp (h->root.root.string, "_DYNAMIC") == 0
1567 || strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0)
1568 sym->st_shndx = SHN_ABS;
1573 /* Finish up the dynamic sections. */
1576 elf_cris_finish_dynamic_sections (output_bfd, info)
1578 struct bfd_link_info *info;
1584 dynobj = elf_hash_table (info)->dynobj;
1586 sgot = bfd_get_section_by_name (dynobj, ".got.plt");
1587 BFD_ASSERT (sgot != NULL);
1588 sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
1590 if (elf_hash_table (info)->dynamic_sections_created)
1593 Elf32_External_Dyn *dyncon, *dynconend;
1595 splt = bfd_get_section_by_name (dynobj, ".plt");
1596 BFD_ASSERT (splt != NULL && sdyn != NULL);
1598 dyncon = (Elf32_External_Dyn *) sdyn->contents;
1599 dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->_raw_size);
1600 for (; dyncon < dynconend; dyncon++)
1602 Elf_Internal_Dyn dyn;
1605 bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
1613 s = bfd_get_section_by_name (output_bfd, ".got");
1614 BFD_ASSERT (s != NULL);
1615 dyn.d_un.d_ptr = s->vma;
1616 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
1620 /* Yes, we *can* have a .plt and no .plt.rela, for instance
1621 if all symbols are found in the .got (not .got.plt). */
1622 s = bfd_get_section_by_name (output_bfd, ".rela.plt");
1623 dyn.d_un.d_ptr = s != NULL ? s->vma : 0;
1624 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
1628 s = bfd_get_section_by_name (output_bfd, ".rela.plt");
1631 else if (s->_cooked_size != 0)
1632 dyn.d_un.d_val = s->_cooked_size;
1634 dyn.d_un.d_val = s->_raw_size;
1635 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
1639 /* The procedure linkage table relocs (DT_JMPREL) should
1640 not be included in the overall relocs (DT_RELA).
1641 Therefore, we override the DT_RELASZ entry here to
1642 make it not include the JMPREL relocs. Since the
1643 linker script arranges for .rela.plt to follow all
1644 other relocation sections, we don't have to worry
1645 about changing the DT_RELA entry. */
1646 s = bfd_get_section_by_name (output_bfd, ".rela.plt");
1649 if (s->_cooked_size != 0)
1650 dyn.d_un.d_val -= s->_cooked_size;
1652 dyn.d_un.d_val -= s->_raw_size;
1654 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
1659 /* Fill in the first entry in the procedure linkage table. */
1660 if (splt->_raw_size > 0)
1663 memcpy (splt->contents, elf_cris_pic_plt0_entry, PLT_ENTRY_SIZE);
1666 memcpy (splt->contents, elf_cris_plt0_entry, PLT_ENTRY_SIZE);
1667 bfd_put_32 (output_bfd,
1668 sgot->output_section->vma + sgot->output_offset + 4,
1669 splt->contents + 6);
1670 bfd_put_32 (output_bfd,
1671 sgot->output_section->vma + sgot->output_offset + 8,
1672 splt->contents + 14);
1674 elf_section_data (splt->output_section)->this_hdr.sh_entsize
1680 /* Fill in the first three entries in the global offset table. */
1681 if (sgot->_raw_size > 0)
1684 bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents);
1686 bfd_put_32 (output_bfd,
1687 sdyn->output_section->vma + sdyn->output_offset,
1689 bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + 4);
1690 bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + 8);
1693 elf_section_data (sgot->output_section)->this_hdr.sh_entsize = 4;
1698 /* Return the section that should be marked against GC for a given
1702 cris_elf_gc_mark_hook (abfd, info, rel, h, sym)
1704 struct bfd_link_info * info ATTRIBUTE_UNUSED;
1705 Elf_Internal_Rela * rel;
1706 struct elf_link_hash_entry * h;
1707 Elf_Internal_Sym * sym;
1711 switch (ELF32_R_TYPE (rel->r_info))
1713 case R_CRIS_GNU_VTINHERIT:
1714 case R_CRIS_GNU_VTENTRY:
1718 switch (h->root.type)
1720 case bfd_link_hash_defined:
1721 case bfd_link_hash_defweak:
1722 return h->root.u.def.section;
1724 case bfd_link_hash_common:
1725 return h->root.u.c.p->section;
1734 if (!(elf_bad_symtab (abfd)
1735 && ELF_ST_BIND (sym->st_info) != STB_LOCAL)
1736 && ! ((sym->st_shndx <= 0 || sym->st_shndx >= SHN_LORESERVE)
1737 && sym->st_shndx != SHN_COMMON))
1739 return bfd_section_from_elf_index (abfd, sym->st_shndx);
1746 /* Update the got entry reference counts for the section being removed. */
1749 cris_elf_gc_sweep_hook (abfd, info, sec, relocs)
1750 bfd * abfd ATTRIBUTE_UNUSED;
1751 struct bfd_link_info * info ATTRIBUTE_UNUSED;
1752 asection * sec ATTRIBUTE_UNUSED;
1753 const Elf_Internal_Rela * relocs ATTRIBUTE_UNUSED;
1755 Elf_Internal_Shdr *symtab_hdr;
1756 struct elf_link_hash_entry **sym_hashes;
1757 bfd_signed_vma *local_got_refcounts;
1758 const Elf_Internal_Rela *rel, *relend;
1759 unsigned long r_symndx;
1760 struct elf_link_hash_entry *h;
1765 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1766 sym_hashes = elf_sym_hashes (abfd);
1767 local_got_refcounts = elf_local_got_refcounts (abfd);
1769 dynobj = elf_hash_table (info)->dynobj;
1773 sgot = bfd_get_section_by_name (dynobj, ".got");
1774 srelgot = bfd_get_section_by_name (dynobj, ".rela.got");
1776 relend = relocs + sec->reloc_count;
1777 for (rel = relocs; rel < relend; rel++)
1779 switch (ELF32_R_TYPE (rel->r_info))
1783 r_symndx = ELF32_R_SYM (rel->r_info);
1784 if (r_symndx >= symtab_hdr->sh_info)
1786 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1787 if (h->got.refcount > 0)
1790 if (h->got.refcount == 0)
1792 /* We don't need the .got entry any more. */
1793 sgot->_raw_size -= 4;
1794 srelgot->_raw_size -= sizeof (Elf32_External_Rela);
1801 if (local_got_refcounts != NULL)
1803 if (local_got_refcounts[r_symndx] > 0)
1805 --local_got_refcounts[r_symndx];
1806 if (local_got_refcounts[r_symndx] == 0)
1808 /* We don't need the .got entry any more. */
1809 sgot->_raw_size -= 4;
1811 srelgot->_raw_size -= sizeof (Elf32_External_Rela);
1817 case R_CRIS_16_GOTPLT:
1818 case R_CRIS_32_GOTPLT:
1819 /* For local symbols, treat these like GOT relocs. */
1820 r_symndx = ELF32_R_SYM (rel->r_info);
1821 if (r_symndx < symtab_hdr->sh_info)
1822 goto local_got_reloc;
1824 case R_CRIS_32_PLT_GOTREL:
1825 /* FIXME: We don't garbage-collect away the .got section. */
1826 if (local_got_refcounts != NULL)
1827 local_got_refcounts[-1]--;
1830 case R_CRIS_8_PCREL:
1831 case R_CRIS_16_PCREL:
1832 case R_CRIS_32_PCREL:
1833 case R_CRIS_32_PLT_PCREL:
1834 r_symndx = ELF32_R_SYM (rel->r_info);
1835 if (r_symndx >= symtab_hdr->sh_info)
1837 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1838 if (h->plt.refcount > 0)
1851 /* Make sure we emit a GOT entry if the symbol was supposed to have a PLT
1852 entry but we found we will not create any. Called when we find we will
1853 not have any PLT for this symbol, by for example
1854 elf_cris_adjust_dynamic_symbol when we're doing a proper dynamic link,
1855 or elf_cris_size_dynamic_sections if no dynamic sections will be
1856 created (we're only linking static objects). */
1859 elf_cris_adjust_gotplt_to_got (h, p)
1860 struct elf_cris_link_hash_entry *h;
1863 struct bfd_link_info *info = (struct bfd_link_info *) p;
1864 bfd *dynobj = elf_hash_table (info)->dynobj;
1866 BFD_ASSERT (dynobj != NULL);
1868 /* If nobody wanted a GOTPLT with this symbol, we're done. */
1869 if (h->gotplt_refcount <= 0)
1872 if (h->root.got.refcount > 0)
1874 /* There's a GOT entry for this symbol. Just adjust the refcount.
1875 Probably not necessary at this stage, but keeping it accurate
1876 helps avoiding surprises later. */
1877 h->root.got.refcount += h->gotplt_refcount;
1878 h->gotplt_refcount = -1;
1882 /* No GOT entry for this symbol. We need to create one. */
1883 asection *sgot = bfd_get_section_by_name (dynobj, ".got");
1885 = bfd_get_section_by_name (dynobj, ".rela.got");
1887 /* Put an accurate refcount there. */
1888 h->root.got.refcount = h->gotplt_refcount;
1890 h->gotplt_refcount = -1;
1892 /* We always have a .got section when there are dynamic
1894 BFD_ASSERT (sgot != NULL /* Surely have .got section. */);
1896 /* We might have had a PLT but with no GOT entry and
1897 further no GOT reloc section at all needed before.
1899 if (srelgot == NULL)
1901 srelgot = bfd_make_section (dynobj, ".rela.got");
1904 || !bfd_set_section_flags (dynobj, srelgot,
1909 | SEC_LINKER_CREATED
1911 || !bfd_set_section_alignment (dynobj, srelgot, 2))
1915 /* Allocate space in the .got section. */
1916 sgot->_raw_size += 4;
1918 /* Allocate relocation space. */
1919 srelgot->_raw_size += sizeof (Elf32_External_Rela);
1925 /* Try to fold PLT entries with GOT entries. There are two cases when we
1928 - When all PLT references are GOTPLT references, and there are GOT
1929 references. We don't have to generate a PLT at all.
1931 - When there are both (ordinary) PLT references and GOT references.
1932 We want to make the PLT reference use the ordinary GOT entry rather
1933 than a run-time dynamically resolved GOTPLT entry (since the GOT
1934 entry will have to be resolved at startup anyway).
1936 Though the latter case is handled when room for the PLT is allocated,
1939 Note that this function is called before symbols are forced local by
1940 version scripts. The differing cases are handled by
1941 elf_cris_hide_symbol. */
1944 elf_cris_try_fold_plt_to_got (h, p)
1945 struct elf_cris_link_hash_entry *h;
1948 struct bfd_link_info *info = (struct bfd_link_info *) p;
1950 /* If there are no GOT references for this symbol, we can't fold any
1951 other reference so there's nothing to do. Likewise if there are no
1952 PLT references; GOTPLT references included. */
1953 if (h->root.got.refcount <= 0 || h->root.plt.refcount <= 0)
1956 /* GOTPLT relocs are supposed to be included into the PLT refcount. */
1957 BFD_ASSERT (h->gotplt_refcount <= h->root.plt.refcount);
1959 if (h->gotplt_refcount == h->root.plt.refcount)
1961 /* The only PLT references are GOTPLT references, and there are GOT
1962 references. Convert PLT to GOT references. */
1963 if (! elf_cris_adjust_gotplt_to_got (h, info))
1966 /* Clear the PLT references, so no PLT will be created. */
1967 h->root.plt.offset = (bfd_vma) -1;
1973 /* Our own version of hide_symbol, so that we can adjust a GOTPLT reloc
1974 to use a GOT entry (and create one) rather than requiring a GOTPLT
1978 elf_cris_hide_symbol (info, h)
1979 struct bfd_link_info *info;
1980 struct elf_link_hash_entry *h;
1982 elf_cris_adjust_gotplt_to_got ((struct elf_cris_link_hash_entry *) h, info);
1984 _bfd_elf_link_hash_hide_symbol (info, h);
1987 /* Adjust a symbol defined by a dynamic object and referenced by a
1988 regular object. The current definition is in some section of the
1989 dynamic object, but we're not including those sections. We have to
1990 change the definition to something the rest of the link can
1994 elf_cris_adjust_dynamic_symbol (info, h)
1995 struct bfd_link_info *info;
1996 struct elf_link_hash_entry *h;
2000 unsigned int power_of_two;
2002 dynobj = elf_hash_table (info)->dynobj;
2004 /* Make sure we know what is going on here. */
2005 BFD_ASSERT (dynobj != NULL
2006 && ((h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT)
2007 || h->weakdef != NULL
2008 || ((h->elf_link_hash_flags
2009 & ELF_LINK_HASH_DEF_DYNAMIC) != 0
2010 && (h->elf_link_hash_flags
2011 & ELF_LINK_HASH_REF_REGULAR) != 0
2012 && (h->elf_link_hash_flags
2013 & ELF_LINK_HASH_DEF_REGULAR) == 0)));
2015 /* If this is a function, put it in the procedure linkage table. We
2016 will fill in the contents of the procedure linkage table later,
2017 when we know the address of the .got section. */
2018 if (h->type == STT_FUNC
2019 || (h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT) != 0)
2022 && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) == 0
2023 && (h->elf_link_hash_flags & ELF_LINK_HASH_REF_DYNAMIC) == 0
2024 /* We must always create the plt entry if it was referenced by a
2025 PLT relocation. In this case we already recorded it as a
2027 /* FIXME: m68k and i386 differ here, for unclear reasons. */
2028 && h->dynindx == -1)
2030 /* This case can occur if we saw a PLT reloc in an input file,
2031 but the symbol was never referred to by a dynamic object. In
2032 such a case, we don't actually need to build a procedure
2033 linkage table, and we can just do a PC reloc instead, or
2034 change a .got.plt index to a .got index for GOTPLT relocs. */
2035 BFD_ASSERT ((h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT) != 0);
2036 h->plt.offset = (bfd_vma) -1;
2039 elf_cris_adjust_gotplt_to_got ((struct
2040 elf_cris_link_hash_entry *) h,
2044 /* If there are only GOT references and GOTPLT references to this
2045 PLT entry, get rid of the PLT. */
2046 if (! elf_cris_try_fold_plt_to_got ((struct elf_cris_link_hash_entry *)
2050 /* GC or folding may have rendered this entry unused. */
2051 if (h->plt.refcount <= 0)
2053 h->elf_link_hash_flags &= ~ELF_LINK_HASH_NEEDS_PLT;
2054 h->plt.offset = (bfd_vma) -1;
2058 /* Make sure this symbol is output as a dynamic symbol. */
2059 if (h->dynindx == -1)
2061 if (! bfd_elf32_link_record_dynamic_symbol (info, h))
2065 s = bfd_get_section_by_name (dynobj, ".plt");
2066 BFD_ASSERT (s != NULL);
2068 /* If this is the first .plt entry, make room for the special
2070 if (s->_raw_size == 0)
2071 s->_raw_size += PLT_ENTRY_SIZE;
2073 /* If this symbol is not defined in a regular file, and we are
2074 not generating a shared library, then set the symbol to this
2075 location in the .plt. This is required to make function
2076 pointers compare as equal between the normal executable and
2077 the shared library. */
2079 && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0)
2081 h->root.u.def.section = s;
2082 h->root.u.def.value = s->_raw_size;
2085 /* If there's already a GOT entry, use that, not a .got.plt. A
2086 GOT field still has a reference count when we get here; it's
2087 not yet changed to an offset. */
2088 if (h->got.refcount > 0)
2090 h->got.refcount += h->plt.refcount;
2092 /* Mark the PLT offset to use the GOT entry by setting the low
2093 bit in the plt offset; it is always a multiple of
2095 BFD_ASSERT ((s->_raw_size & 3) == 0);
2097 /* Change the PLT refcount to an offset. */
2098 h->plt.offset = s->_raw_size;
2100 /* By not setting gotplt_offset (i.e. it remains at 0), we signal
2101 that the got entry should be used instead. */
2102 BFD_ASSERT (((struct elf_cris_link_hash_entry *)
2103 h)->gotplt_offset == 0);
2105 /* Make room for this entry. */
2106 s->_raw_size += PLT_ENTRY_SIZE;
2111 /* No GOT reference for this symbol; prepare for an ordinary PLT. */
2112 h->plt.offset = s->_raw_size;
2114 /* Make room for this entry. */
2115 s->_raw_size += PLT_ENTRY_SIZE;
2117 /* We also need to make an entry in the .got.plt section, which
2118 will be placed in the .got section by the linker script. */
2119 ((struct elf_cris_link_hash_entry *) h)->gotplt_offset
2120 = elf_cris_hash_table (info)->next_gotplt_entry;
2121 elf_cris_hash_table (info)->next_gotplt_entry += 4;
2123 s = bfd_get_section_by_name (dynobj, ".got.plt");
2124 BFD_ASSERT (s != NULL);
2127 /* We also need to make an entry in the .rela.plt section. */
2129 s = bfd_get_section_by_name (dynobj, ".rela.plt");
2130 BFD_ASSERT (s != NULL);
2131 s->_raw_size += sizeof (Elf32_External_Rela);
2136 /* Reinitialize the plt offset now that it is not used as a reference
2138 h->plt.offset = (bfd_vma) -1;
2140 /* If this is a weak symbol, and there is a real definition, the
2141 processor independent code will have arranged for us to see the
2142 real definition first, and we can just use the same value. */
2143 if (h->weakdef != NULL)
2145 BFD_ASSERT (h->weakdef->root.type == bfd_link_hash_defined
2146 || h->weakdef->root.type == bfd_link_hash_defweak);
2147 h->root.u.def.section = h->weakdef->root.u.def.section;
2148 h->root.u.def.value = h->weakdef->root.u.def.value;
2152 /* This is a reference to a symbol defined by a dynamic object which
2153 is not a function. */
2155 /* If we are creating a shared library, we must presume that the
2156 only references to the symbol are via the global offset table.
2157 For such cases we need not do anything here; the relocations will
2158 be handled correctly by relocate_section. */
2162 /* If there are no references to this symbol that do not use the
2163 GOT, we don't need to generate a copy reloc. */
2164 if ((h->elf_link_hash_flags & ELF_LINK_NON_GOT_REF) == 0)
2167 /* We must allocate the symbol in our .dynbss section, which will
2168 become part of the .bss section of the executable. There will be
2169 an entry for this symbol in the .dynsym section. The dynamic
2170 object will contain position independent code, so all references
2171 from the dynamic object to this symbol will go through the global
2172 offset table. The dynamic linker will use the .dynsym entry to
2173 determine the address it must put in the global offset table, so
2174 both the dynamic object and the regular object will refer to the
2175 same memory location for the variable. */
2177 s = bfd_get_section_by_name (dynobj, ".dynbss");
2178 BFD_ASSERT (s != NULL);
2180 /* We must generate a R_CRIS_COPY reloc to tell the dynamic linker to
2181 copy the initial value out of the dynamic object and into the
2182 runtime process image. We need to remember the offset into the
2183 .rela.bss section we are going to use. */
2184 if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
2188 srel = bfd_get_section_by_name (dynobj, ".rela.bss");
2189 BFD_ASSERT (srel != NULL);
2190 srel->_raw_size += sizeof (Elf32_External_Rela);
2191 h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_COPY;
2194 /* Historic precedent: m68k and i386 allow max 8-byte alignment for the
2195 thing to copy; so do we. */
2197 /* We need to figure out the alignment required for this symbol. I
2198 have no idea how ELF linkers handle this. */
2199 power_of_two = bfd_log2 (h->size);
2200 if (power_of_two > 3)
2203 /* Apply the required alignment. */
2204 s->_raw_size = BFD_ALIGN (s->_raw_size,
2205 (bfd_size_type) (1 << power_of_two));
2206 if (power_of_two > bfd_get_section_alignment (dynobj, s))
2208 if (!bfd_set_section_alignment (dynobj, s, power_of_two))
2212 /* Define the symbol as being at this point in the section. */
2213 h->root.u.def.section = s;
2214 h->root.u.def.value = s->_raw_size;
2216 /* Increment the section size to make room for the symbol. */
2217 s->_raw_size += h->size;
2222 /* Look through the relocs for a section during the first phase. */
2225 cris_elf_check_relocs (abfd, info, sec, relocs)
2227 struct bfd_link_info *info;
2229 const Elf_Internal_Rela *relocs;
2232 Elf_Internal_Shdr *symtab_hdr;
2233 struct elf_link_hash_entry **sym_hashes, **sym_hashes_end;
2234 bfd_signed_vma *local_got_refcounts;
2235 const Elf_Internal_Rela *rel;
2236 const Elf_Internal_Rela *rel_end;
2241 if (info->relocateable)
2244 dynobj = elf_hash_table (info)->dynobj;
2245 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
2246 sym_hashes = elf_sym_hashes (abfd);
2247 sym_hashes_end = sym_hashes + symtab_hdr->sh_size/sizeof (Elf32_External_Sym);
2248 local_got_refcounts = elf_local_got_refcounts (abfd);
2254 if (!elf_bad_symtab (abfd))
2255 sym_hashes_end -= symtab_hdr->sh_info;
2257 rel_end = relocs + sec->reloc_count;
2258 for (rel = relocs; rel < rel_end; rel++)
2260 struct elf_link_hash_entry *h;
2261 unsigned long r_symndx;
2262 enum elf_cris_reloc_type r_type;
2264 r_symndx = ELF32_R_SYM (rel->r_info);
2265 if (r_symndx < symtab_hdr->sh_info)
2268 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
2270 r_type = ELF32_R_TYPE (rel->r_info);
2272 /* Some relocs require linker-created sections; we need to hang them
2273 on the first input bfd we found that contained dynamic relocs. */
2278 case R_CRIS_32_GOTREL:
2279 case R_CRIS_32_PLT_GOTREL:
2280 case R_CRIS_32_PLT_PCREL:
2281 case R_CRIS_16_GOTPLT:
2282 case R_CRIS_32_GOTPLT:
2285 elf_hash_table (info)->dynobj = dynobj = abfd;
2287 /* Create the .got section, so we can assume it's always
2288 present whenever there's a dynobj. */
2289 if (!_bfd_elf_create_got_section (dynobj, info))
2298 /* Some relocs require a global offset table (but perhaps not a
2299 specific GOT entry). */
2304 case R_CRIS_32_GOTREL:
2305 case R_CRIS_32_PLT_GOTREL:
2307 sgot = bfd_get_section_by_name (dynobj, ".got");
2309 if (local_got_refcounts == NULL)
2313 /* We use index local_got_refcounts[-1] to count all
2314 GOT-relative relocations that do not have explicit
2316 amt = symtab_hdr->sh_info + 1;
2317 amt *= sizeof (bfd_signed_vma);
2318 local_got_refcounts = ((bfd_signed_vma *) bfd_zalloc (abfd, amt));
2319 if (local_got_refcounts == NULL)
2322 local_got_refcounts++;
2323 elf_local_got_refcounts (abfd) = local_got_refcounts;
2333 case R_CRIS_16_GOTPLT:
2334 case R_CRIS_32_GOTPLT:
2335 /* Mark that we need a GOT entry if the PLT entry (and its GOT
2336 entry) is eliminated. We can only do this for a non-local
2340 ((struct elf_cris_link_hash_entry *) h)->gotplt_refcount++;
2341 goto handle_gotplt_reloc;
2343 /* If h is NULL then this is a local symbol, and we must make a
2344 GOT entry for it, so handle it like a GOT reloc. */
2349 /* This symbol requires a global offset table entry. */
2352 && (h != NULL || info->shared))
2354 srelgot = bfd_get_section_by_name (dynobj, ".rela.got");
2355 if (srelgot == NULL)
2357 srelgot = bfd_make_section (dynobj, ".rela.got");
2359 || !bfd_set_section_flags (dynobj, srelgot,
2364 | SEC_LINKER_CREATED
2366 || !bfd_set_section_alignment (dynobj, srelgot, 2))
2373 if (h->got.refcount == 0)
2375 /* Make sure this symbol is output as a dynamic symbol. */
2376 if (h->dynindx == -1)
2378 if (!bfd_elf32_link_record_dynamic_symbol (info, h))
2382 /* Allocate space in the .got section. */
2383 sgot->_raw_size += 4;
2384 /* Allocate relocation space. */
2385 srelgot->_raw_size += sizeof (Elf32_External_Rela);
2391 /* This is a global offset table entry for a local symbol. */
2392 if (local_got_refcounts[r_symndx] == 0)
2394 sgot->_raw_size += 4;
2397 /* If we are generating a shared object, we need to
2398 output a R_CRIS_RELATIVE reloc so that the dynamic
2399 linker can adjust this GOT entry. */
2400 srelgot->_raw_size += sizeof (Elf32_External_Rela);
2403 local_got_refcounts[r_symndx]++;
2407 case R_CRIS_32_GOTREL:
2408 /* This reference requires a global offset table.
2409 FIXME: The actual refcount isn't used currently; the .got
2410 section can't be removed if there were any references in the
2412 local_got_refcounts[-1]++;
2415 handle_gotplt_reloc:
2417 case R_CRIS_32_PLT_GOTREL:
2418 /* This reference requires a global offset table. */
2419 local_got_refcounts[-1]++;
2422 case R_CRIS_32_PLT_PCREL:
2423 /* This symbol requires a procedure linkage table entry. We
2424 actually build the entry in adjust_dynamic_symbol,
2425 because this might be a case of linking PIC code which is
2426 never referenced by a dynamic object, in which case we
2427 don't need to generate a procedure linkage table entry
2430 /* If this is a local symbol, we resolve it directly without
2431 creating a procedure linkage table entry. */
2435 h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_PLT;
2442 /* Let's help debug shared library creation. Any of these
2443 relocs can be used in shared libs, but pages containing them
2444 cannot be shared. Don't warn for sections we don't care
2445 about, such as debug sections or non-constant sections. We
2446 can't help tables of (global) function pointers, for example,
2447 though they must be emitted in a data section to avoid having
2448 impure text sections. */
2450 && (sec->flags & SEC_ALLOC) != 0
2451 && (sec->flags & SEC_READONLY) != 0)
2453 /* FIXME: How do we make this optionally a warning only? */
2454 (*_bfd_error_handler)
2455 (_("%s, section %s:\n relocation %s should not be used in a shared object; recompile with -fPIC"),
2456 bfd_archive_filename (abfd),
2458 cris_elf_howto_table[r_type].name);
2462 case R_CRIS_8_PCREL:
2463 case R_CRIS_16_PCREL:
2464 case R_CRIS_32_PCREL:
2467 h->elf_link_hash_flags |= ELF_LINK_NON_GOT_REF;
2469 /* Make sure a plt entry is created for this symbol if it
2470 turns out to be a function defined by a dynamic object. */
2474 /* If we are creating a shared library and this is not a local
2475 symbol, we need to copy the reloc into the shared library.
2476 However when linking with -Bsymbolic and this is a global
2477 symbol which is defined in an object we are including in the
2478 link (i.e., DEF_REGULAR is set), then we can resolve the
2479 reloc directly. At this point we have not seen all the input
2480 files, so it is possible that DEF_REGULAR is not set now but
2481 will be set later (it is never cleared). In case of a weak
2482 definition, DEF_REGULAR may be cleared later by a strong
2483 definition in a shared library. We account for that
2484 possibility below by storing information in the relocs_copied
2485 field of the hash table entry. A similar situation occurs
2486 when creating shared libraries and symbol visibility changes
2487 render the symbol local. */
2489 /* No need to do anything if we're not creating a shared object. */
2493 /* We don't need to handle relocs into sections not going into
2494 the "real" output. */
2495 if ((sec->flags & SEC_ALLOC) == 0)
2498 /* We can only eliminate PC-relative relocs. */
2499 if (r_type == R_CRIS_8_PCREL
2500 || r_type == R_CRIS_16_PCREL
2501 || r_type == R_CRIS_32_PCREL)
2503 /* If the symbol is local, then we can eliminate the reloc. */
2507 /* If this is with -Bsymbolic and the symbol isn't weak, and
2508 is defined by an ordinary object (the ones we include in
2509 this shared library) then we can also eliminate the
2510 reloc. See comment above for more eliminable cases which
2511 we can't identify at this time. */
2513 && h->root.type != bfd_link_hash_defweak
2514 && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) != 0)
2518 /* We create a reloc section in dynobj and make room for this
2524 name = (bfd_elf_string_from_elf_section
2526 elf_elfheader (abfd)->e_shstrndx,
2527 elf_section_data (sec)->rel_hdr.sh_name));
2531 BFD_ASSERT (strncmp (name, ".rela", 5) == 0
2532 && strcmp (bfd_get_section_name (abfd, sec),
2535 sreloc = bfd_get_section_by_name (dynobj, name);
2538 sreloc = bfd_make_section (dynobj, name);
2540 || !bfd_set_section_flags (dynobj, sreloc,
2545 | SEC_LINKER_CREATED
2547 || !bfd_set_section_alignment (dynobj, sreloc, 2))
2550 if (sec->flags & SEC_READONLY)
2551 info->flags |= DF_TEXTREL;
2554 sreloc->_raw_size += sizeof (Elf32_External_Rela);
2556 /* If we are linking with -Bsymbolic, we count the number of PC
2557 relative relocations we have entered for this symbol, so that
2558 we can discard them again if the symbol is later defined by a
2559 regular object. We know that h is really a pointer to an
2560 elf_cris_link_hash_entry. */
2561 if ((r_type == R_CRIS_8_PCREL
2562 || r_type == R_CRIS_16_PCREL
2563 || r_type == R_CRIS_32_PCREL)
2566 struct elf_cris_link_hash_entry *eh;
2567 struct elf_cris_pcrel_relocs_copied *p;
2569 eh = (struct elf_cris_link_hash_entry *) h;
2571 for (p = eh->pcrel_relocs_copied; p != NULL; p = p->next)
2572 if (p->section == sreloc)
2577 p = ((struct elf_cris_pcrel_relocs_copied *)
2578 bfd_alloc (dynobj, (bfd_size_type) sizeof *p));
2581 p->next = eh->pcrel_relocs_copied;
2582 eh->pcrel_relocs_copied = p;
2583 p->section = sreloc;
2591 /* This relocation describes the C++ object vtable hierarchy.
2592 Reconstruct it for later use during GC. */
2593 case R_CRIS_GNU_VTINHERIT:
2594 if (!_bfd_elf32_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
2598 /* This relocation describes which C++ vtable entries are actually
2599 used. Record for later use during GC. */
2600 case R_CRIS_GNU_VTENTRY:
2601 if (!_bfd_elf32_gc_record_vtentry (abfd, sec, h, rel->r_addend))
2606 /* Other relocs do not appear here. */
2607 bfd_set_error (bfd_error_bad_value);
2615 /* Set the sizes of the dynamic sections. */
2618 elf_cris_size_dynamic_sections (output_bfd, info)
2619 bfd *output_bfd ATTRIBUTE_UNUSED;
2620 struct bfd_link_info *info;
2627 dynobj = elf_hash_table (info)->dynobj;
2628 BFD_ASSERT (dynobj != NULL);
2630 if (elf_hash_table (info)->dynamic_sections_created)
2632 /* Set the contents of the .interp section to the interpreter. */
2635 s = bfd_get_section_by_name (dynobj, ".interp");
2636 BFD_ASSERT (s != NULL);
2637 s->_raw_size = sizeof ELF_DYNAMIC_INTERPRETER;
2638 s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
2643 /* Adjust all expected GOTPLT uses to use a GOT entry instead. */
2644 elf_cris_link_hash_traverse (elf_cris_hash_table (info),
2645 elf_cris_adjust_gotplt_to_got,
2648 /* We may have created entries in the .rela.got section.
2649 However, if we are not creating the dynamic sections, we will
2650 not actually use these entries. Reset the size of .rela.got,
2651 which will cause it to get stripped from the output file
2653 s = bfd_get_section_by_name (dynobj, ".rela.got");
2658 /* If this is a -Bsymbolic shared link, then we need to discard all PC
2659 relative relocs against symbols defined in a regular object. We
2660 allocated space for them in the check_relocs routine, but we will not
2661 fill them in in the relocate_section routine. We also discard space
2662 for relocs that have become for local symbols due to symbol
2663 visibility changes. For programs, we discard space for relocs for
2664 symbols not referenced by any dynamic object. */
2666 elf_cris_link_hash_traverse (elf_cris_hash_table (info),
2667 elf_cris_discard_excess_dso_dynamics,
2670 elf_cris_link_hash_traverse (elf_cris_hash_table (info),
2671 elf_cris_discard_excess_program_dynamics,
2674 /* The check_relocs and adjust_dynamic_symbol entry points have
2675 determined the sizes of the various dynamic sections. Allocate
2679 for (s = dynobj->sections; s != NULL; s = s->next)
2684 if ((s->flags & SEC_LINKER_CREATED) == 0)
2687 /* It's OK to base decisions on the section name, because none
2688 of the dynobj section names depend upon the input files. */
2689 name = bfd_get_section_name (dynobj, s);
2693 if (strcmp (name, ".plt") == 0)
2695 if (s->_raw_size == 0)
2697 /* Strip this section if we don't need it; see the
2703 /* Remember whether there is a PLT. */
2707 else if (strncmp (name, ".rela", 5) == 0)
2709 if (s->_raw_size == 0)
2711 /* If we don't need this section, strip it from the
2712 output file. This is mostly to handle .rela.bss and
2713 .rela.plt. We must create both sections in
2714 create_dynamic_sections, because they must be created
2715 before the linker maps input sections to output
2716 sections. The linker does that before
2717 adjust_dynamic_symbol is called, and it is that
2718 function which decides whether anything needs to go
2719 into these sections. */
2724 /* Remember whether there are any reloc sections other
2726 if (strcmp (name, ".rela.plt") != 0)
2729 /* We use the reloc_count field as a counter if we need
2730 to copy relocs into the output file. */
2734 else if (strncmp (name, ".got", 4) != 0)
2736 /* It's not one of our sections, so don't allocate space. */
2742 _bfd_strip_section_from_output (info, s);
2746 /* Allocate memory for the section contents. We use bfd_zalloc here
2747 in case unused entries are not reclaimed before the section's
2748 contents are written out. This should not happen, but this way
2749 if it does, we will not write out garbage. For reloc sections,
2750 this will make entries have the type R_CRIS_NONE. */
2751 s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->_raw_size);
2752 if (s->contents == NULL && s->_raw_size != 0)
2756 if (elf_hash_table (info)->dynamic_sections_created)
2758 /* Add some entries to the .dynamic section. We fill in the
2759 values later, in elf_cris_finish_dynamic_sections, but we
2760 must add the entries now so that we get the correct size for
2761 the .dynamic section. The DT_DEBUG entry is filled in by the
2762 dynamic linker and used by the debugger. */
2763 #define add_dynamic_entry(TAG, VAL) \
2764 bfd_elf32_add_dynamic_entry (info, (bfd_vma) (TAG), (bfd_vma) (VAL))
2768 if (!add_dynamic_entry (DT_DEBUG, 0))
2774 if (!add_dynamic_entry (DT_PLTGOT, 0)
2775 || !add_dynamic_entry (DT_PLTRELSZ, 0)
2776 || !add_dynamic_entry (DT_PLTREL, DT_RELA)
2777 || !add_dynamic_entry (DT_JMPREL, 0))
2783 if (!add_dynamic_entry (DT_RELA, 0)
2784 || !add_dynamic_entry (DT_RELASZ, 0)
2785 || !add_dynamic_entry (DT_RELAENT, sizeof (Elf32_External_Rela)))
2789 if ((info->flags & DF_TEXTREL) != 0)
2791 if (!add_dynamic_entry (DT_TEXTREL, 0))
2793 info->flags |= DF_TEXTREL;
2796 #undef add_dynamic_entry
2801 /* This function is called via elf_cris_link_hash_traverse if we are
2802 creating a shared object. In the -Bsymbolic case, it discards the
2803 space allocated to copy PC relative relocs against symbols which
2804 are defined in regular objects. For the normal non-symbolic case,
2805 we also discard space for relocs that have become local due to
2806 symbol visibility changes. We allocated space for them in the
2807 check_relocs routine, but we won't fill them in in the
2808 relocate_section routine. */
2811 elf_cris_discard_excess_dso_dynamics (h, inf)
2812 struct elf_cris_link_hash_entry *h;
2815 struct elf_cris_pcrel_relocs_copied *s;
2816 struct bfd_link_info *info = (struct bfd_link_info *) inf;
2818 /* If a symbol has been forced local or we have found a regular
2819 definition for the symbolic link case, then we won't be needing
2821 if ((h->root.elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) != 0
2822 && ((h->root.elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) != 0
2825 for (s = h->pcrel_relocs_copied; s != NULL; s = s->next)
2826 s->section->_raw_size -= s->count * sizeof (Elf32_External_Rela);
2832 /* This function is called via elf_cris_link_hash_traverse if we are *not*
2833 creating a shared object. We discard space for relocs for symbols put
2834 in the .got, but which we found we do not have to resolve at run-time. */
2837 elf_cris_discard_excess_program_dynamics (h, inf)
2838 struct elf_cris_link_hash_entry *h;
2841 struct bfd_link_info *info = (struct bfd_link_info *) inf;
2843 /* If we're not creating a shared library and have a symbol which is
2844 referred to by .got references, but the symbol is defined locally,
2845 (or rather, not referred to by a DSO and not defined by a DSO) then
2846 lose the reloc for the .got (don't allocate room for it). */
2847 if ((h->root.elf_link_hash_flags
2848 & (ELF_LINK_HASH_REF_DYNAMIC | ELF_LINK_HASH_DEF_DYNAMIC)) == 0)
2850 if (h->root.got.refcount > 0
2851 /* The size of this section is only valid and in sync with the
2852 various reference counts if we do dynamic; don't decrement it
2854 && elf_hash_table (info)->dynamic_sections_created)
2856 bfd *dynobj = elf_hash_table (info)->dynobj;
2859 BFD_ASSERT (dynobj != NULL);
2861 srelgot = bfd_get_section_by_name (dynobj, ".rela.got");
2863 BFD_ASSERT (srelgot != NULL);
2865 srelgot->_raw_size -= sizeof (Elf32_External_Rela);
2868 /* If the locally-defined symbol isn't used by a DSO, then we don't
2869 have to export it as a dynamic symbol. This was already done for
2870 functions; doing this for all symbols would presumably not
2871 introduce new problems. */
2872 h->root.dynindx = -1;
2878 /* Reject a file depending on presence and expectation of prefixed
2879 underscores on symbols. */
2882 cris_elf_object_p (abfd)
2885 if ((elf_elfheader (abfd)->e_flags & EF_CRIS_UNDERSCORE))
2886 return (bfd_get_symbol_leading_char (abfd) == '_');
2888 return (bfd_get_symbol_leading_char (abfd) == 0);
2891 /* Mark presence or absence of leading underscore. */
2894 cris_elf_final_write_processing (abfd, linker)
2896 boolean linker ATTRIBUTE_UNUSED;
2898 if (bfd_get_symbol_leading_char (abfd) == '_')
2899 elf_elfheader (abfd)->e_flags |= EF_CRIS_UNDERSCORE;
2901 elf_elfheader (abfd)->e_flags &= ~EF_CRIS_UNDERSCORE;
2904 /* Display the flags field. */
2907 cris_elf_print_private_bfd_data (abfd, ptr)
2911 FILE *file = (FILE *) ptr;
2913 BFD_ASSERT (abfd != NULL && ptr != NULL)
2915 _bfd_elf_print_private_bfd_data (abfd, ptr);
2917 fprintf (file, _("private flags = %lx:"), elf_elfheader (abfd)->e_flags);
2919 if (elf_elfheader (abfd)->e_flags & EF_CRIS_UNDERSCORE)
2920 fprintf (file, _(" [symbols have a _ prefix]"));
2926 /* Don't mix files with and without a leading underscore. */
2929 cris_elf_merge_private_bfd_data (ibfd, obfd)
2933 flagword old_flags, new_flags;
2935 if (_bfd_generic_verify_endian_match (ibfd, obfd) == false)
2938 if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
2939 || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
2942 if (! elf_flags_init (obfd))
2944 /* This happens when ld starts out with a 'blank' output file. */
2945 elf_flags_init (obfd) = true;
2947 /* Set flags according to current bfd_target. */
2948 cris_elf_final_write_processing (obfd, false);
2951 old_flags = elf_elfheader (obfd)->e_flags;
2952 new_flags = elf_elfheader (ibfd)->e_flags;
2954 /* Is this good or bad? We'll follow with other excluding flags. */
2955 if ((old_flags & EF_CRIS_UNDERSCORE) != (new_flags & EF_CRIS_UNDERSCORE))
2957 (*_bfd_error_handler)
2958 ((new_flags & EF_CRIS_UNDERSCORE)
2959 ? _("%s: uses _-prefixed symbols, but writing file with non-prefixed symbols")
2960 : _("%s: uses non-prefixed symbols, but writing file with _-prefixed symbols"),
2961 bfd_archive_filename (ibfd));
2962 bfd_set_error (bfd_error_bad_value);
2970 static enum elf_reloc_type_class
2971 elf_cris_reloc_type_class (rela)
2972 const Elf_Internal_Rela *rela;
2974 switch ((int) ELF32_R_TYPE (rela->r_info))
2976 case R_CRIS_RELATIVE:
2977 return reloc_class_relative;
2978 case R_CRIS_JUMP_SLOT:
2979 return reloc_class_plt;
2981 return reloc_class_copy;
2983 return reloc_class_normal;
2987 #define ELF_ARCH bfd_arch_cris
2988 #define ELF_MACHINE_CODE EM_CRIS
2989 #define ELF_MAXPAGESIZE 0x2000
2991 #define TARGET_LITTLE_SYM bfd_elf32_cris_vec
2992 #define TARGET_LITTLE_NAME "elf32-cris"
2993 #define elf_symbol_leading_char 0
2995 #define elf_info_to_howto_rel NULL
2996 #define elf_info_to_howto cris_info_to_howto_rela
2997 #define elf_backend_relocate_section cris_elf_relocate_section
2998 #define elf_backend_gc_mark_hook cris_elf_gc_mark_hook
2999 #define elf_backend_gc_sweep_hook cris_elf_gc_sweep_hook
3000 #define elf_backend_check_relocs cris_elf_check_relocs
3002 #define elf_backend_can_gc_sections 1
3003 #define elf_backend_can_refcount 1
3005 #define elf_backend_object_p cris_elf_object_p
3006 #define elf_backend_final_write_processing \
3007 cris_elf_final_write_processing
3008 #define bfd_elf32_bfd_print_private_bfd_data \
3009 cris_elf_print_private_bfd_data
3010 #define bfd_elf32_bfd_merge_private_bfd_data \
3011 cris_elf_merge_private_bfd_data
3013 #define bfd_elf32_bfd_reloc_type_lookup cris_reloc_type_lookup
3015 #define bfd_elf32_bfd_link_hash_table_create \
3016 elf_cris_link_hash_table_create
3017 #define elf_backend_adjust_dynamic_symbol \
3018 elf_cris_adjust_dynamic_symbol
3019 #define elf_backend_size_dynamic_sections \
3020 elf_cris_size_dynamic_sections
3021 #define elf_backend_finish_dynamic_symbol \
3022 elf_cris_finish_dynamic_symbol
3023 #define elf_backend_finish_dynamic_sections \
3024 elf_cris_finish_dynamic_sections
3025 #define elf_backend_create_dynamic_sections \
3026 _bfd_elf_create_dynamic_sections
3027 #define bfd_elf32_bfd_final_link \
3028 _bfd_elf32_gc_common_final_link
3029 #define elf_backend_hide_symbol elf_cris_hide_symbol
3030 #define elf_backend_reloc_type_class elf_cris_reloc_type_class
3032 #define elf_backend_want_got_plt 1
3033 #define elf_backend_plt_readonly 1
3034 #define elf_backend_want_plt_sym 0
3035 #define elf_backend_got_header_size 12
3036 #define elf_backend_plt_header_size PLT_ENTRY_SIZE
3038 /* Later, we my want to optimize RELA entries into REL entries for dynamic
3039 linking and libraries (if it's a win of any significance). Until then,
3040 take the easy route. */
3041 #define elf_backend_may_use_rel_p 0
3042 #define elf_backend_may_use_rela_p 1
3044 #include "elf32-target.h"
3046 #define INCLUDED_TARGET_FILE
3048 #undef TARGET_LITTLE_SYM
3049 #undef TARGET_LITTLE_NAME
3050 #undef elf_symbol_leading_char
3052 #define TARGET_LITTLE_SYM bfd_elf32_us_cris_vec
3053 #define TARGET_LITTLE_NAME "elf32-us-cris"
3054 #define elf_symbol_leading_char '_'
3056 #include "elf32-target.h"