* elf32-cris.c: Tweak comments related to dynamic linking.
[platform/upstream/binutils.git] / bfd / elf32-cris.c
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.
6
7 This file is part of BFD, the Binary File Descriptor library.
8
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.
13
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.
18
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.  */
22
23 #include "bfd.h"
24 #include "sysdep.h"
25 #include "libbfd.h"
26 #include "elf-bfd.h"
27 #include "elf/cris.h"
28
29 /* Forward declarations.  */
30 static reloc_howto_type * cris_reloc_type_lookup
31   PARAMS ((bfd *abfd, bfd_reloc_code_real_type code));
32
33 static void cris_info_to_howto_rela
34   PARAMS ((bfd *, arelent *, Elf32_Internal_Rela *));
35
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 **));
39
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));
43
44 static boolean cris_elf_gc_sweep_hook
45   PARAMS ((bfd *, struct bfd_link_info *, asection *,
46            const Elf_Internal_Rela *));
47
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 *));
51
52 static boolean cris_elf_object_p PARAMS ((bfd *));
53
54 static void cris_elf_final_write_processing PARAMS ((bfd *, boolean));
55
56 static boolean cris_elf_print_private_bfd_data PARAMS ((bfd *, PTR));
57
58 static boolean cris_elf_merge_private_bfd_data PARAMS ((bfd *, bfd *));
59
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
72   PARAMS ((bfd *));
73 static boolean elf_cris_adjust_dynamic_symbol
74   PARAMS ((struct bfd_link_info *, struct elf_link_hash_entry *));
75 static boolean elf_cris_size_dynamic_sections
76   PARAMS ((bfd *, struct bfd_link_info *));
77 static boolean elf_cris_finish_dynamic_symbol
78   PARAMS ((bfd *, struct bfd_link_info *, struct elf_link_hash_entry *,
79            Elf_Internal_Sym *));
80 static boolean elf_cris_finish_dynamic_sections
81   PARAMS ((bfd *, struct bfd_link_info *));
82 static void elf_cris_hide_symbol
83   PARAMS ((struct bfd_link_info *, struct elf_link_hash_entry *));
84
85 static reloc_howto_type cris_elf_howto_table [] =
86 {
87   /* This reloc does nothing.  */
88   HOWTO (R_CRIS_NONE,           /* type */
89          0,                     /* rightshift */
90          2,                     /* size (0 = byte, 1 = short, 2 = long) */
91          32,                    /* bitsize */
92          false,                 /* pc_relative */
93          0,                     /* bitpos */
94          complain_overflow_bitfield, /* complain_on_overflow */
95          bfd_elf_generic_reloc, /* special_function */
96          "R_CRIS_NONE",         /* name */
97          false,                 /* partial_inplace */
98          0,                     /* src_mask */
99          0,                     /* dst_mask */
100          false),                /* pcrel_offset */
101
102   /* An 8 bit absolute relocation.  */
103   HOWTO (R_CRIS_8,              /* type */
104          0,                     /* rightshift */
105          0,                     /* size (0 = byte, 1 = short, 2 = long) */
106          8,                     /* bitsize */
107          false,                 /* pc_relative */
108          0,                     /* bitpos */
109          complain_overflow_bitfield, /* complain_on_overflow */
110          bfd_elf_generic_reloc, /* special_function */
111          "R_CRIS_8",            /* name */
112          false,                 /* partial_inplace */
113          0x0000,                /* src_mask */
114          0x00ff,                /* dst_mask */
115          false),                /* pcrel_offset */
116
117   /* A 16 bit absolute relocation.  */
118   HOWTO (R_CRIS_16,             /* type */
119          0,                     /* rightshift */
120          1,                     /* size (0 = byte, 1 = short, 2 = long) */
121          16,                    /* bitsize */
122          false,                 /* pc_relative */
123          0,                     /* bitpos */
124          complain_overflow_bitfield, /* complain_on_overflow */
125          bfd_elf_generic_reloc, /* special_function */
126          "R_CRIS_16",           /* name */
127          false,                 /* partial_inplace */
128          0x00000000,            /* src_mask */
129          0x0000ffff,            /* dst_mask */
130          false),                /* pcrel_offset */
131
132   /* A 32 bit absolute relocation.  */
133   HOWTO (R_CRIS_32,             /* type */
134          0,                     /* rightshift */
135          2,                     /* size (0 = byte, 1 = short, 2 = long) */
136          32,                    /* bitsize */
137          false,                 /* pc_relative */
138          0,                     /* bitpos */
139          complain_overflow_bitfield, /* complain_on_overflow */
140          bfd_elf_generic_reloc, /* special_function */
141          "R_CRIS_32",           /* name */
142          false,                 /* partial_inplace */
143          0x00000000,            /* src_mask */
144          0xffffffff,            /* dst_mask */
145          false),                /* pcrel_offset */
146
147   /* An 8 bit PC-relative relocation.  */
148   HOWTO (R_CRIS_8_PCREL,        /* type */
149          0,                     /* rightshift */
150          0,                     /* size (0 = byte, 1 = short, 2 = long) */
151          8,                     /* bitsize */
152          true,                  /* pc_relative */
153          0,                     /* bitpos */
154          complain_overflow_bitfield, /* complain_on_overflow */
155          bfd_elf_generic_reloc, /* special_function */
156          "R_CRIS_8_PCREL",      /* name */
157          false,                 /* partial_inplace */
158          0x0000,                /* src_mask */
159          0x00ff,                /* dst_mask */
160          true),                 /* pcrel_offset */
161
162   /* A 16 bit PC-relative relocation.  */
163   HOWTO (R_CRIS_16_PCREL,       /* type */
164          0,                     /* rightshift */
165          1,                     /* size (0 = byte, 1 = short, 2 = long) */
166          16,                    /* bitsize */
167          true,                  /* pc_relative */
168          0,                     /* bitpos */
169          complain_overflow_bitfield, /* complain_on_overflow */
170          bfd_elf_generic_reloc, /* special_function */
171          "R_CRIS_16",           /* name */
172          false,                 /* partial_inplace */
173          0x00000000,            /* src_mask */
174          0x0000ffff,            /* dst_mask */
175          true),                 /* pcrel_offset */
176
177   /* A 32 bit PC-relative relocation.  */
178   HOWTO (R_CRIS_32_PCREL,       /* type */
179          0,                     /* rightshift */
180          2,                     /* size (0 = byte, 1 = short, 2 = long) */
181          32,                    /* bitsize */
182          true,                  /* pc_relative */
183          0,                     /* bitpos */
184          complain_overflow_bitfield, /* complain_on_overflow */
185          bfd_elf_generic_reloc, /* special_function */
186          "R_CRIS_32",           /* name */
187          false,                 /* partial_inplace */
188          0x00000000,            /* src_mask */
189          0xffffffff,            /* dst_mask */
190          true),                 /* pcrel_offset */
191
192   /* GNU extension to record C++ vtable hierarchy.  */
193   HOWTO (R_CRIS_GNU_VTINHERIT,  /* type */
194          0,                     /* rightshift */
195          2,                     /* size (0 = byte, 1 = short, 2 = long) */
196          0,                     /* bitsize */
197          false,                 /* pc_relative */
198          0,                     /* bitpos */
199          complain_overflow_dont, /* complain_on_overflow */
200          NULL,                  /* special_function */
201          "R_CRIS_GNU_VTINHERIT", /* name */
202          false,                 /* partial_inplace */
203          0,                     /* src_mask */
204          0,                     /* dst_mask */
205          false),                /* pcrel_offset */
206
207   /* GNU extension to record C++ vtable member usage.  */
208   HOWTO (R_CRIS_GNU_VTENTRY,    /* type */
209          0,                     /* rightshift */
210          2,                     /* size (0 = byte, 1 = short, 2 = long) */
211          0,                     /* bitsize */
212          false,                 /* pc_relative */
213          0,                     /* bitpos */
214          complain_overflow_dont, /* complain_on_overflow */
215          _bfd_elf_rel_vtable_reloc_fn,  /* special_function */
216          "R_CRIS_GNU_VTENTRY",   /* name */
217          false,                 /* partial_inplace */
218          0,                     /* src_mask */
219          0,                     /* dst_mask */
220          false),                /* pcrel_offset */
221
222   /* This is used only by the dynamic linker.  The symbol should exist
223      both in the object being run and in some shared library.  The
224      dynamic linker copies the data addressed by the symbol from the
225      shared library into the object, because the object being
226      run has to have the data at some particular address.  */
227   HOWTO (R_CRIS_COPY,           /* type */
228          0,                     /* rightshift */
229          2,                     /* size (0 = byte, 1 = short, 2 = long) */
230          32,                    /* bitsize */
231          false,                 /* pc_relative */
232          0,                     /* bitpos */
233          complain_overflow_bitfield, /* complain_on_overflow */
234          bfd_elf_generic_reloc, /* special_function */
235          "R_CRIS_COPY",         /* name */
236          false,                 /* partial_inplace */
237          0,                     /* src_mask */
238          0,                     /* dst_mask */
239          false),                /* pcrel_offset */
240
241   /* Like R_CRIS_32, but used when setting global offset table entries.  */
242   HOWTO (R_CRIS_GLOB_DAT,       /* type */
243          0,                     /* rightshift */
244          2,                     /* size (0 = byte, 1 = short, 2 = long) */
245          32,                    /* bitsize */
246          false,                 /* pc_relative */
247          0,                     /* bitpos */
248          complain_overflow_bitfield, /* complain_on_overflow */
249          bfd_elf_generic_reloc, /* special_function */
250          "R_CRIS_GLOB_DAT",     /* name */
251          false,                 /* partial_inplace */
252          0,                     /* src_mask */
253          0xffffffff,            /* dst_mask */
254          false),                /* pcrel_offset */
255
256   /* Marks a procedure linkage table entry for a symbol.  */
257   HOWTO (R_CRIS_JUMP_SLOT,      /* type */
258          0,                     /* rightshift */
259          2,                     /* size (0 = byte, 1 = short, 2 = long) */
260          32,                    /* bitsize */
261          false,                 /* pc_relative */
262          0,                     /* bitpos */
263          complain_overflow_bitfield, /* complain_on_overflow */
264          bfd_elf_generic_reloc, /* special_function */
265          "R_CRIS_JUMP_SLOT",    /* name */
266          false,                 /* partial_inplace */
267          0,                     /* src_mask */
268          0,                     /* dst_mask */
269          false),                /* pcrel_offset */
270
271   /* Used only by the dynamic linker.  When the object is run, this
272      longword is set to the load address of the object, plus the
273      addend.  */
274   HOWTO (R_CRIS_RELATIVE,       /* type */
275          0,                     /* rightshift */
276          2,                     /* size (0 = byte, 1 = short, 2 = long) */
277          32,                    /* bitsize */
278          false,                 /* pc_relative */
279          0,                     /* bitpos */
280          complain_overflow_bitfield, /* complain_on_overflow */
281          bfd_elf_generic_reloc, /* special_function */
282          "R_CRIS_RELATIVE",     /* name */
283          false,                 /* partial_inplace */
284          0,                     /* src_mask */
285          0xffffffff,            /* dst_mask */
286          false),                /* pcrel_offset */
287
288   /* Like R_CRIS_32, but referring to the GOT table entry for the symbol.  */
289   HOWTO (R_CRIS_16_GOT,         /* type */
290          0,                     /* rightshift */
291          1,                     /* size (0 = byte, 1 = short, 2 = long) */
292          16,                    /* bitsize */
293          false,                 /* pc_relative */
294          0,                     /* bitpos */
295          complain_overflow_bitfield, /* complain_on_overflow */
296          bfd_elf_generic_reloc, /* special_function */
297          "R_CRIS_16_GOT",       /* name */
298          false,                 /* partial_inplace */
299          0,                     /* src_mask */
300          0xffff,                /* dst_mask */
301          false),                /* pcrel_offset */
302
303   HOWTO (R_CRIS_32_GOT,         /* type */
304          0,                     /* rightshift */
305          2,                     /* size (0 = byte, 1 = short, 2 = long) */
306          32,                    /* bitsize */
307          false,                 /* pc_relative */
308          0,                     /* bitpos */
309          complain_overflow_bitfield, /* complain_on_overflow */
310          bfd_elf_generic_reloc, /* special_function */
311          "R_CRIS_32_GOT",       /* name */
312          false,                 /* partial_inplace */
313          0,                     /* src_mask */
314          0xffffffff,            /* dst_mask */
315          false),                /* pcrel_offset */
316
317   /* Like R_CRIS_32_GOT, but referring to (and requesting a) PLT part of
318      the GOT table for the symbol.  */
319   HOWTO (R_CRIS_16_GOTPLT,      /* type */
320          0,                     /* rightshift */
321          1,                     /* size (0 = byte, 1 = short, 2 = long) */
322          16,                    /* bitsize */
323          false,                 /* pc_relative */
324          0,                     /* bitpos */
325          complain_overflow_bitfield, /* complain_on_overflow */
326          bfd_elf_generic_reloc, /* special_function */
327          "R_CRIS_16_GOTPLT",    /* name */
328          false,                 /* partial_inplace */
329          0,                     /* src_mask */
330          0xffff,                /* dst_mask */
331          false),                /* pcrel_offset */
332
333   HOWTO (R_CRIS_32_GOTPLT,      /* type */
334          0,                     /* rightshift */
335          2,                     /* size (0 = byte, 1 = short, 2 = long) */
336          32,                    /* bitsize */
337          false,                 /* pc_relative */
338          0,                     /* bitpos */
339          complain_overflow_bitfield, /* complain_on_overflow */
340          bfd_elf_generic_reloc, /* special_function */
341          "R_CRIS_32_GOTPLT",    /* name */
342          false,                 /* partial_inplace */
343          0,                     /* src_mask */
344          0xffffffff,            /* dst_mask */
345          false),                /* pcrel_offset */
346
347   /* A 32-bit offset from GOT to (local const) symbol: no GOT entry should
348      be necessary.  */
349   HOWTO (R_CRIS_32_GOTREL,      /* type */
350          0,                     /* rightshift */
351          2,                     /* size (0 = byte, 1 = short, 2 = long) */
352          32,                    /* bitsize */
353          false,                 /* pc_relative */
354          0,                     /* bitpos */
355          complain_overflow_bitfield, /* complain_on_overflow */
356          bfd_elf_generic_reloc, /* special_function */
357          "R_CRIS_32_GOTREL",    /* name */
358          false,                 /* partial_inplace */
359          0,                     /* src_mask */
360          0xffffffff,            /* dst_mask */
361          false),                /* pcrel_offset */
362
363   /* A 32-bit offset from GOT to entry for this symbol in PLT and request
364      to create PLT entry for symbol.  */
365   HOWTO (R_CRIS_32_PLT_GOTREL,  /* type */
366          0,                     /* rightshift */
367          2,                     /* size (0 = byte, 1 = short, 2 = long) */
368          32,                    /* bitsize */
369          false,                 /* pc_relative */
370          0,                     /* bitpos */
371          complain_overflow_bitfield, /* complain_on_overflow */
372          bfd_elf_generic_reloc, /* special_function */
373          "R_CRIS_32_PLT_GOTREL", /* name */
374          false,                 /* partial_inplace */
375          0,                     /* src_mask */
376          0xffffffff,            /* dst_mask */
377          false),                /* pcrel_offset */
378
379   /* A 32-bit offset from PC (location after the relocation) + addend to
380      entry for this symbol in PLT and request to create PLT entry for
381      symbol.  */
382   HOWTO (R_CRIS_32_PLT_PCREL,   /* type */
383          0,                     /* rightshift */
384          2,                     /* size (0 = byte, 1 = short, 2 = long) */
385          32,                    /* bitsize */
386          true,                  /* pc_relative */
387          0,                     /* bitpos */
388          complain_overflow_bitfield, /* complain_on_overflow */
389          bfd_elf_generic_reloc, /* special_function */
390          "R_CRIS_32_PLT_PCREL", /* name */
391          false,                 /* partial_inplace */
392          0,                     /* src_mask */
393          0xffffffff,            /* dst_mask */
394          true)                  /* pcrel_offset */
395 };
396 \f
397 /* Map BFD reloc types to CRIS ELF reloc types.  */
398
399 struct cris_reloc_map
400 {
401   bfd_reloc_code_real_type bfd_reloc_val;
402   unsigned int cris_reloc_val;
403 };
404
405 static const struct cris_reloc_map cris_reloc_map [] =
406 {
407   { BFD_RELOC_NONE,             R_CRIS_NONE },
408   { BFD_RELOC_8,                R_CRIS_8 },
409   { BFD_RELOC_16,               R_CRIS_16 },
410   { BFD_RELOC_32,               R_CRIS_32 },
411   { BFD_RELOC_8_PCREL,          R_CRIS_8_PCREL },
412   { BFD_RELOC_16_PCREL,         R_CRIS_16_PCREL },
413   { BFD_RELOC_32_PCREL,         R_CRIS_32_PCREL },
414   { BFD_RELOC_VTABLE_INHERIT,   R_CRIS_GNU_VTINHERIT },
415   { BFD_RELOC_VTABLE_ENTRY,     R_CRIS_GNU_VTENTRY },
416   { BFD_RELOC_CRIS_COPY,        R_CRIS_COPY },
417   { BFD_RELOC_CRIS_GLOB_DAT,    R_CRIS_GLOB_DAT },
418   { BFD_RELOC_CRIS_JUMP_SLOT,   R_CRIS_JUMP_SLOT },
419   { BFD_RELOC_CRIS_RELATIVE,    R_CRIS_RELATIVE },
420   { BFD_RELOC_CRIS_16_GOT,      R_CRIS_16_GOT },
421   { BFD_RELOC_CRIS_32_GOT,      R_CRIS_32_GOT },
422   { BFD_RELOC_CRIS_16_GOTPLT,   R_CRIS_16_GOTPLT },
423   { BFD_RELOC_CRIS_32_GOTPLT,   R_CRIS_32_GOTPLT },
424   { BFD_RELOC_CRIS_32_GOTREL,   R_CRIS_32_GOTREL },
425   { BFD_RELOC_CRIS_32_PLT_GOTREL, R_CRIS_32_PLT_GOTREL },
426   { BFD_RELOC_CRIS_32_PLT_PCREL, R_CRIS_32_PLT_PCREL }
427 };
428
429 static reloc_howto_type *
430 cris_reloc_type_lookup (abfd, code)
431      bfd * abfd ATTRIBUTE_UNUSED;
432      bfd_reloc_code_real_type code;
433 {
434   unsigned int i;
435
436   for (i = sizeof (cris_reloc_map) / sizeof (cris_reloc_map[0]);
437        --i;)
438     if (cris_reloc_map [i].bfd_reloc_val == code)
439       return & cris_elf_howto_table [cris_reloc_map[i].cris_reloc_val];
440
441   return NULL;
442 }
443
444 /* Set the howto pointer for an CRIS ELF reloc.  */
445
446 static void
447 cris_info_to_howto_rela (abfd, cache_ptr, dst)
448      bfd * abfd ATTRIBUTE_UNUSED;
449      arelent * cache_ptr;
450      Elf32_Internal_Rela * dst;
451 {
452   unsigned int r_type;
453
454   r_type = ELF32_R_TYPE (dst->r_info);
455   BFD_ASSERT (r_type < (unsigned int) R_CRIS_max);
456   cache_ptr->howto = & cris_elf_howto_table [r_type];
457 }
458 \f
459 /* The name of the dynamic interpreter.  This is put in the .interp
460    section.  */
461
462 #define ELF_DYNAMIC_INTERPRETER "/lib/ld.so.1"
463
464 /* The size in bytes of an entry in the procedure linkage table.  */
465
466 #define PLT_ENTRY_SIZE 20
467
468 /* The first entry in an absolute procedure linkage table looks like this.  */
469
470 static const bfd_byte elf_cris_plt0_entry[PLT_ENTRY_SIZE] =
471 {
472   0xfc, 0xe1,
473   0x7e, 0x7e,   /* push mof. */
474   0x7f, 0x0d,   /*  (dip [pc+]) */
475   0, 0, 0, 0,   /*  Replaced with address of .got + 4.  */
476   0x30, 0x7a,   /* move [...],mof */
477   0x7f, 0x0d,   /*  (dip [pc+]) */
478   0, 0, 0, 0,   /*  Replaced with address of .got + 8.  */
479   0x30, 0x09,   /* jump [...] */
480 };
481
482 /* Subsequent entries in an absolute procedure linkage table look like
483    this.  */
484
485 static const bfd_byte elf_cris_plt_entry[PLT_ENTRY_SIZE] =
486 {
487   0x7f, 0x0d,   /*  (dip [pc+]) */
488   0, 0, 0, 0,   /*  Replaced with address of this symbol in .got.  */
489   0x30, 0x09,   /* jump [...] */
490   0x3f,  0x7e,  /* move [pc+],mof */
491   0, 0, 0, 0,   /*  Replaced with offset into relocation table.  */
492   0x2f, 0xfe,   /* add.d [pc+],pc */
493   0xec, 0xff,
494   0xff, 0xff    /*  Replaced with offset to start of .plt.  */
495 };
496
497 /* The first entry in a PIC procedure linkage table looks like this.  */
498
499 static const bfd_byte elf_cris_pic_plt0_entry[PLT_ENTRY_SIZE] =
500 {
501   0xfc, 0xe1, 0x7e, 0x7e,       /* push mof */
502   0x04, 0x01, 0x30, 0x7a,       /* move [r0+4],mof */
503   0x08, 0x01, 0x30, 0x09,       /* jump [r0+8] */
504   0, 0, 0, 0, 0, 0, 0, 0,       /*  Pad out to 20 bytes.  */
505 };
506
507 /* Subsequent entries in a PIC procedure linkage table look like this.  */
508
509 static const bfd_byte elf_cris_pic_plt_entry[PLT_ENTRY_SIZE] =
510 {
511   0x6f, 0x0d,   /*  (bdap [pc+].d,r0) */
512   0, 0, 0, 0,   /*  Replaced with offset of this symbol in .got.  */
513   0x30, 0x09,   /* jump [...] */
514   0x3f, 0x7e,   /* move [pc+],mof */
515   0, 0, 0, 0,   /*  Replaced with offset into relocation table.  */
516   0x2f, 0xfe,   /* add.d [pc+],pc */
517   0xec, 0xff,   /*  Replaced with offset to start of .plt.  */
518   0xff, 0xff
519 };
520 \f
521 /* We copy elf32-m68k.c and elf32-i386.c for the basic linker hash bits
522    (and most other PIC/shlib stuff).  Check that we don't drift away
523    without reason.
524
525    The CRIS linker, like the m68k and i386 linkers (and probably the rest
526    too) needs to keep track of the number of relocs that it decides to
527    copy in check_relocs for each symbol.  This is so that it can discard
528    PC relative relocs if it doesn't need them when linking with
529    -Bsymbolic.  We store the information in a field extending the regular
530    ELF linker hash table.  */
531
532 /* This structure keeps track of the number of PC relative relocs we have
533    copied for a given symbol.  */
534
535 struct elf_cris_pcrel_relocs_copied
536 {
537   /* Next section.  */
538   struct elf_cris_pcrel_relocs_copied *next;
539   /* A section in dynobj.  */
540   asection *section;
541   /* Number of relocs copied in this section.  */
542   bfd_size_type count;
543 };
544
545 /* CRIS ELF linker hash entry.  */
546
547 struct elf_cris_link_hash_entry
548 {
549   struct elf_link_hash_entry root;
550
551   /* Number of PC relative relocs copied for this symbol.  */
552   struct elf_cris_pcrel_relocs_copied *pcrel_relocs_copied;
553
554   /* The GOTPLT references are CRIS-specific; the goal is to avoid having
555      both a general GOT and a PLT-specific GOT entry for the same symbol,
556      when it is referenced both as a function and as a function pointer.
557
558      Number of GOTPLT references for a function.  */
559   bfd_signed_vma gotplt_refcount;
560
561   /* Actual GOTPLT index for this symbol, if applicable, or zero if not
562      (zero is never used as an index).  FIXME: We should be able to fold
563      this with gotplt_refcount in a union, like the got and plt unions in
564      elf_link_hash_entry.  */
565   bfd_size_type gotplt_offset;
566 };
567
568 /* CRIS ELF linker hash table.  */
569
570 struct elf_cris_link_hash_table
571 {
572   struct elf_link_hash_table root;
573
574   /* We can't use the PLT offset and calculate to get the GOTPLT offset,
575      since we try and avoid creating GOTPLT:s when there's already a GOT.
576      Instead, we keep and update the next available index here.  */
577   bfd_size_type next_gotplt_entry;
578 };
579
580 /* Traverse a CRIS ELF linker hash table.  */
581
582 #define elf_cris_link_hash_traverse(table, func, info)                  \
583   (elf_link_hash_traverse                                               \
584    (&(table)->root,                                                     \
585     (boolean (*) PARAMS ((struct elf_link_hash_entry *, PTR))) (func),  \
586     (info)))
587
588 /* Get the CRIS ELF linker hash table from a link_info structure.  */
589
590 #define elf_cris_hash_table(p) \
591   ((struct elf_cris_link_hash_table *) (p)->hash)
592
593 /* Create an entry in a CRIS ELF linker hash table.  */
594
595 static struct bfd_hash_entry *
596 elf_cris_link_hash_newfunc (entry, table, string)
597      struct bfd_hash_entry *entry;
598      struct bfd_hash_table *table;
599      const char *string;
600 {
601   struct elf_cris_link_hash_entry *ret =
602     (struct elf_cris_link_hash_entry *) entry;
603
604   /* Allocate the structure if it has not already been allocated by a
605      subclass.  */
606   if (ret == (struct elf_cris_link_hash_entry *) NULL)
607     ret = ((struct elf_cris_link_hash_entry *)
608            bfd_hash_allocate (table,
609                               sizeof (struct elf_cris_link_hash_entry)));
610   if (ret == (struct elf_cris_link_hash_entry *) NULL)
611     return (struct bfd_hash_entry *) ret;
612
613   /* Call the allocation method of the superclass.  */
614   ret = ((struct elf_cris_link_hash_entry *)
615          _bfd_elf_link_hash_newfunc ((struct bfd_hash_entry *) ret,
616                                      table, string));
617   if (ret != (struct elf_cris_link_hash_entry *) NULL)
618     {
619       ret->pcrel_relocs_copied = NULL;
620       ret->gotplt_refcount = 0;
621       ret->gotplt_offset = 0;
622     }
623
624   return (struct bfd_hash_entry *) ret;
625 }
626
627 /* Create a CRIS ELF linker hash table.  */
628
629 static struct bfd_link_hash_table *
630 elf_cris_link_hash_table_create (abfd)
631      bfd *abfd;
632 {
633   struct elf_cris_link_hash_table *ret;
634
635   ret = ((struct elf_cris_link_hash_table *)
636          bfd_alloc (abfd, sizeof (struct elf_cris_link_hash_table)));
637   if (ret == (struct elf_cris_link_hash_table *) NULL)
638     return NULL;
639
640   if (! _bfd_elf_link_hash_table_init (&ret->root, abfd,
641                                        elf_cris_link_hash_newfunc))
642     {
643       bfd_release (abfd, ret);
644       return NULL;
645     }
646
647   /* Initialize to skip over the first three entries in the gotplt; they
648      are used for run-time symbol evaluation.  */
649   ret->next_gotplt_entry = 12;
650
651   return &ret->root.root;
652 }
653 \f
654 /* Perform a single relocation.  By default we use the standard BFD
655    routines, with a few tweaks.  */
656
657 static bfd_reloc_status_type
658 cris_final_link_relocate (howto, input_bfd, input_section, contents, rel,
659                           relocation)
660      reloc_howto_type *  howto;
661      bfd *               input_bfd;
662      asection *          input_section;
663      bfd_byte *          contents;
664      Elf_Internal_Rela * rel;
665      bfd_vma             relocation;
666 {
667   bfd_reloc_status_type r;
668
669   /* PC-relative relocations are relative to the position *after*
670      the reloc.  Note that for R_CRIS_8_PCREL the adjustment is
671      not a single byte, since PC must be 16-bit-aligned.  */
672   switch (ELF32_R_TYPE (rel->r_info))
673     {
674       /* Check that the 16-bit GOT relocs are positive.  */
675     case R_CRIS_16_GOTPLT:
676     case R_CRIS_16_GOT:
677       if ((bfd_signed_vma) relocation < 0)
678         return bfd_reloc_overflow;
679       break;
680
681     case R_CRIS_32_PLT_PCREL:
682     case R_CRIS_32_PCREL:
683       relocation -= 2;
684       /* Fall through.  */
685     case R_CRIS_8_PCREL:
686     case R_CRIS_16_PCREL:
687       relocation -= 2;
688       break;
689
690     default:
691       break;
692     }
693
694   r = _bfd_final_link_relocate (howto, input_bfd, input_section,
695                                 contents, rel->r_offset,
696                                 relocation, rel->r_addend);
697   return r;
698 }
699 \f
700 /* Relocate an CRIS ELF section.  See elf32-fr30.c, from where this was
701    copied, for further comments.  */
702
703 static boolean
704 cris_elf_relocate_section (output_bfd, info, input_bfd, input_section,
705                            contents, relocs, local_syms, local_sections)
706      bfd *                   output_bfd ATTRIBUTE_UNUSED;
707      struct bfd_link_info *  info;
708      bfd *                   input_bfd;
709      asection *              input_section;
710      bfd_byte *              contents;
711      Elf_Internal_Rela *     relocs;
712      Elf_Internal_Sym *      local_syms;
713      asection **             local_sections;
714 {
715   bfd *dynobj;
716   Elf_Internal_Shdr *           symtab_hdr;
717   struct elf_link_hash_entry ** sym_hashes;
718   bfd_vma *local_got_offsets;
719   asection *sgot;
720   asection *splt;
721   asection *sreloc;
722   Elf_Internal_Rela *           rel;
723   Elf_Internal_Rela *           relend;
724
725   dynobj = elf_hash_table (info)->dynobj;
726   local_got_offsets = elf_local_got_offsets (input_bfd);
727   symtab_hdr = & elf_tdata (input_bfd)->symtab_hdr;
728   sym_hashes = elf_sym_hashes (input_bfd);
729   relend     = relocs + input_section->reloc_count;
730
731   /* It seems this can happen with erroneous or unsupported input (mixing
732      a.out and elf in an archive, for example.)  */
733   if (sym_hashes == NULL)
734     return false;
735
736   sgot = NULL;
737   splt = NULL;
738   sreloc = NULL;
739
740   if (dynobj != NULL)
741     {
742       splt = bfd_get_section_by_name (dynobj, ".plt");
743       sgot = bfd_get_section_by_name (dynobj, ".got");
744     }
745
746   for (rel = relocs; rel < relend; rel ++)
747     {
748       reloc_howto_type *           howto;
749       unsigned long                r_symndx;
750       Elf_Internal_Sym *           sym;
751       asection *                   sec;
752       struct elf_link_hash_entry * h;
753       bfd_vma                      relocation;
754       bfd_reloc_status_type        r;
755       const char *                 name = NULL;
756       int                          r_type;
757
758       r_type = ELF32_R_TYPE (rel->r_info);
759
760       if (   r_type == R_CRIS_GNU_VTINHERIT
761           || r_type == R_CRIS_GNU_VTENTRY)
762         continue;
763
764       r_symndx = ELF32_R_SYM (rel->r_info);
765
766       if (info->relocateable)
767         {
768           /* This is a relocateable link.  We don't have to change
769              anything, unless the reloc is against a section symbol,
770              in which case we have to adjust according to where the
771              section symbol winds up in the output section.  */
772           if (r_symndx < symtab_hdr->sh_info)
773             {
774               sym = local_syms + r_symndx;
775
776               if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
777                 {
778                   sec = local_sections [r_symndx];
779                   rel->r_addend += sec->output_offset + sym->st_value;
780                 }
781             }
782
783           continue;
784         }
785
786       /* This is a final link.  */
787       howto  = cris_elf_howto_table + r_type;
788       h      = NULL;
789       sym    = NULL;
790       sec    = NULL;
791
792       if (r_symndx < symtab_hdr->sh_info)
793         {
794           sym = local_syms + r_symndx;
795           sec = local_sections [r_symndx];
796           relocation = (sec->output_section->vma
797                         + sec->output_offset
798                         + sym->st_value);
799
800           name = bfd_elf_string_from_elf_section
801             (input_bfd, symtab_hdr->sh_link, sym->st_name);
802           name = (name == NULL) ? bfd_section_name (input_bfd, sec) : name;
803         }
804       else
805         {
806           h = sym_hashes [r_symndx - symtab_hdr->sh_info];
807
808           while (h->root.type == bfd_link_hash_indirect
809                  || h->root.type == bfd_link_hash_warning)
810             h = (struct elf_link_hash_entry *) h->root.u.i.link;
811
812           name = h->root.root.string;
813
814           if (h->root.type == bfd_link_hash_defined
815               || h->root.type == bfd_link_hash_defweak)
816             {
817               sec = h->root.u.def.section;
818
819               /* Perhaps we should detect the cases that
820                  sec->output_section is expected to be NULL like i386 and
821                  m68k, but apparently (and according to elfxx-ia64.c) all
822                  valid cases are where the symbol is defined in a shared
823                  object which we link dynamically against.  This includes
824                  PLT relocs for which we've created a PLT entry and other
825                  relocs for which we're prepared to create dynamic
826                  relocations.
827
828                  For now, new situations cause us to just err when
829                  sec->output_offset is NULL but the object with the symbol
830                  is *not* dynamically linked against.  Thus this will
831                  automatically remind us so we can see if there are other
832                  valid cases we need to revisit.  */
833               if ((sec->output_section == NULL
834                    && (sec->owner->flags & DYNAMIC) != 0)
835
836                   /* Here follow the cases where the relocation value must
837                      be zero (or when further handling is simplified when
838                      zero).  I can't claim to understand the various
839                      conditions and they weren't described in the files
840                      where I copied them from (elf32-m68k.c and
841                      elf32-i386.c), but let's mention examples of where
842                      they happen.  FIXME: Perhaps define and use a
843                      dynamic_symbol_p function like ia64.
844
845                      - When creating a shared library, we can have an
846                      ordinary relocation for a symbol defined in a shared
847                      library (perhaps the one we create).  We then make
848                      the relocation value zero, as the value seen now will
849                      be added into the relocation addend in this shared
850                      library, but must be handled only at dynamic-link
851                      time.  FIXME: Not sure this example covers the
852                      h->elf_link_hash_flags test, though it's there in
853                      other targets.  */
854                   || (info->shared
855                       && ((! info->symbolic && h->dynindx != -1)
856                           || (h->elf_link_hash_flags
857                               & ELF_LINK_HASH_DEF_REGULAR) == 0)
858                       && (input_section->flags & SEC_ALLOC) != 0
859                       && (r_type == R_CRIS_8
860                           || r_type == R_CRIS_16
861                           || r_type == R_CRIS_32
862                           || r_type == R_CRIS_8_PCREL
863                           || r_type == R_CRIS_16_PCREL
864                           || r_type == R_CRIS_32_PCREL)))
865                 relocation = 0;
866               else if (sec->output_section != NULL)
867                 relocation = (h->root.u.def.value
868                               + sec->output_section->vma
869                               + sec->output_offset);
870               else
871                 {
872                   if (input_bfd->my_archive)
873                     (*_bfd_error_handler)
874                       (_("%s(%s): unresolvable relocation %s against symbol `%s' from %s section"),
875                        bfd_get_filename (bfd_my_archive (input_bfd)),
876                        bfd_get_filename (input_bfd),
877                        cris_elf_howto_table[r_type].name,
878                        name,
879                        bfd_get_section_name (input_bfd, input_section));
880                   else
881                     (*_bfd_error_handler)
882                       (_("%s: unresolvable relocation %s against symbol `%s' from %s section"),
883                        bfd_get_filename (input_bfd),
884                        cris_elf_howto_table[r_type].name,
885                        name,
886                        bfd_get_section_name (input_bfd, input_section));
887                   bfd_set_error (bfd_error_bad_value);
888                   return false;
889                 }
890             }
891           else if (h->root.type == bfd_link_hash_undefweak)
892             relocation = 0;
893           else if (info->shared
894                    && !info->symbolic
895                    && !info->no_undefined
896                    && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
897             relocation = 0;
898           else
899             {
900               if (!(info->callbacks->undefined_symbol
901                     (info, name, input_bfd,
902                      input_section, rel->r_offset,
903                      (!info->shared || info->no_undefined
904                       || ELF_ST_VISIBILITY (h->other)))))
905                 return false;
906               relocation = 0;
907             }
908         }
909
910       switch (r_type)
911         {
912         case R_CRIS_16_GOTPLT:
913         case R_CRIS_32_GOTPLT:
914           /* This is like the case for R_CRIS_32_GOT and R_CRIS_16_GOT,
915              but we require a PLT, and the PLT handling will take care of
916              filling in the PLT-specific GOT entry.  For the GOT offset,
917              calculate it as we do when filling it in for the .got.plt
918              section.  If we don't have a PLT, punt to GOT handling.  */
919           if (h != NULL
920               && ((struct elf_cris_link_hash_entry *) h)->gotplt_offset != 0)
921             {
922               asection *sgotplt
923                 = bfd_get_section_by_name (dynobj, ".got.plt");
924               bfd_vma got_offset;
925
926               BFD_ASSERT (h->dynindx != -1);
927               BFD_ASSERT (sgotplt != NULL);
928
929               got_offset
930                 = ((struct elf_cris_link_hash_entry *) h)->gotplt_offset;
931
932               relocation = got_offset;
933               break;
934             }
935
936           /* We didn't make a PLT entry for this symbol.  Maybe everything is
937              folded into the GOT.  Other than folding, this happens when
938              statically linking PIC code, or when using -Bsymbolic.  Check
939              that we instead have a GOT entry as done for us by
940              elf_cris_adjust_dynamic_symbol, and drop through into the
941              ordinary GOT cases.  */
942           if (h != NULL && h->got.offset == (bfd_vma) -1)
943             {
944               (*_bfd_error_handler)
945                 (_("%s: No PLT nor GOT for relocation %s against symbol `%s' from %s section"),
946                  bfd_get_filename (input_bfd),
947                  cris_elf_howto_table[r_type].name,
948                  name[0] != '\0' ? name : _("[whose name is lost]"),
949                  bfd_get_section_name (input_bfd, input_section));
950
951               /* FIXME: Perhaps blaming input is not the right thing to
952                  do; this is probably an internal error.  But it is true
953                  that we didn't like that particular input.  */
954               bfd_set_error (bfd_error_bad_value);
955               return false;
956             }
957           /* Fall through.  */
958
959           /* The size of the actual relocation is not used here; we only
960              fill in the GOT table here.  */
961         case R_CRIS_16_GOT:
962         case R_CRIS_32_GOT:
963           {
964             bfd_vma off;
965
966             /* Note that despite using RELA relocations, the .got contents
967                is always filled in with the link-relative relocation
968                value; the addend.  */
969
970             if (h != NULL)
971               {
972                 off = h->got.offset;
973                 BFD_ASSERT (off != (bfd_vma) -1);
974
975                 if (!elf_hash_table (info)->dynamic_sections_created
976                     || (! info->shared && h->dynindx == -1)
977                     || (info->shared
978                         && (info->symbolic || h->dynindx == -1)
979                         && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR)))
980                   {
981                     /* This wasn't checked above for ! info->shared, but
982                        must hold there if we get here; the symbol must not
983                        be used in, or defined by a DSO.  (Note that
984                        checking for ELF_LINK_HASH_DEF_REGULAR doesn't
985                        catch all cases.)  */
986                     BFD_ASSERT (info->shared
987                                 || (h->elf_link_hash_flags
988                                     & (ELF_LINK_HASH_REF_DYNAMIC
989                                        | ELF_LINK_HASH_DEF_DYNAMIC)) == 0);
990
991                     /* This is actually a static link, or it is a
992                        -Bsymbolic link and the symbol is defined
993                        locally, or the symbol was forced to be local
994                        because of a version file, or we're not creating a
995                        dynamic object and the symbol isn't referred to by
996                        a dynamic object.  We must initialize
997                        this entry in the global offset table.  Since
998                        the offset must always be a multiple of 4, we
999                        use the least significant bit to record whether
1000                        we have initialized it already.
1001
1002                        When doing a dynamic link, we create a .rela.got
1003                        relocation entry to initialize the value.  This
1004                        is done in the finish_dynamic_symbol routine.  */
1005                     if ((off & 1) != 0)
1006                       off &= ~1;
1007                     else
1008                       {
1009                         bfd_put_32 (output_bfd, relocation,
1010                                     sgot->contents + off);
1011                         h->got.offset |= 1;
1012                       }
1013                   }
1014               }
1015             else
1016               {
1017                 BFD_ASSERT (local_got_offsets != NULL
1018                             && local_got_offsets[r_symndx] != (bfd_vma) -1);
1019
1020                 off = local_got_offsets[r_symndx];
1021
1022                 /* The offset must always be a multiple of 4.  We use
1023                    the least significant bit to record whether we have
1024                    already generated the necessary reloc.  */
1025                 if ((off & 1) != 0)
1026                   off &= ~1;
1027                 else
1028                   {
1029                     bfd_put_32 (output_bfd, relocation, sgot->contents + off);
1030
1031                     if (info->shared)
1032                       {
1033                         asection *srelgot;
1034                         Elf_Internal_Rela outrel;
1035
1036                         srelgot = bfd_get_section_by_name (dynobj, ".rela.got");
1037                         BFD_ASSERT (srelgot != NULL);
1038
1039                         outrel.r_offset = (sgot->output_section->vma
1040                                            + sgot->output_offset
1041                                            + off);
1042                         outrel.r_info = ELF32_R_INFO (0, R_CRIS_RELATIVE);
1043                         outrel.r_addend = relocation;
1044                         bfd_elf32_swap_reloca_out (output_bfd, &outrel,
1045                                                    (((Elf32_External_Rela *)
1046                                                      srelgot->contents)
1047                                                     + srelgot->reloc_count));
1048                         ++srelgot->reloc_count;
1049                       }
1050
1051                     local_got_offsets[r_symndx] |= 1;
1052                   }
1053               }
1054
1055             relocation = sgot->output_offset + off;
1056             if (rel->r_addend != 0)
1057               {
1058                 /* We can't do anything for a relocation which is against
1059                    a symbol *plus offset*.  GOT holds relocations for
1060                    symbols.  Make this an error; the compiler isn't
1061                    allowed to pass us these kinds of things.  */
1062                 if (h == NULL)
1063                   (*_bfd_error_handler)
1064                     (_("%s: relocation %s with non-zero addend %d against local symbol from %s section"),
1065                      bfd_get_filename (input_bfd),
1066                      cris_elf_howto_table[r_type].name,
1067                      rel->r_addend,
1068                      bfd_get_section_name (input_bfd, input_section));
1069                 else
1070                   (*_bfd_error_handler)
1071                     (_("%s: relocation %s with non-zero addend %d against symbol `%s' from %s section"),
1072                      bfd_get_filename (input_bfd),
1073                      cris_elf_howto_table[r_type].name,
1074                      rel->r_addend,
1075                      name[0] != '\0' ? name : _("[whose name is lost]"),
1076                      bfd_get_section_name (input_bfd, input_section));
1077
1078                 bfd_set_error (bfd_error_bad_value);
1079                 return false;
1080               }
1081           }
1082           break;
1083
1084         case R_CRIS_32_GOTREL:
1085           /* This relocation must only be performed against local symbols.  */
1086           if (h != NULL)
1087             {
1088               (*_bfd_error_handler)
1089                 (_("%s: relocation %s is not allowed for global symbol: `%s' from %s section"),
1090                  bfd_get_filename (input_bfd),
1091                  cris_elf_howto_table[r_type].name,
1092                  name,
1093                  bfd_get_section_name (input_bfd, input_section));
1094               bfd_set_error (bfd_error_bad_value);
1095               return false;
1096             }
1097
1098           /* This relocation is like a PC-relative one, except the
1099              reference point is the location of GOT.  Note that
1100              sgot->output_offset is not involved in this calculation.  We
1101              always want the start of entire .got section, not the
1102              position after the reserved header.  */
1103           relocation -= sgot->output_section->vma;
1104           break;
1105
1106         case R_CRIS_32_PLT_PCREL:
1107           /* Relocation is to the entry for this symbol in the
1108              procedure linkage table.  */
1109
1110           /* Resolve a PLT_PCREL reloc against a local symbol directly,
1111              without using the procedure linkage table.  */
1112           if (h == NULL)
1113             break;
1114
1115           if (h->plt.offset == (bfd_vma) -1
1116               || splt == NULL)
1117             {
1118               /* We didn't make a PLT entry for this symbol.  This
1119                  happens when statically linking PIC code, or when
1120                  using -Bsymbolic.  */
1121               break;
1122             }
1123
1124           relocation = (splt->output_section->vma
1125                         + splt->output_offset
1126                         + h->plt.offset);
1127           break;
1128
1129         case R_CRIS_32_PLT_GOTREL:
1130           /* Like R_CRIS_32_PLT_PCREL, but the reference point is the
1131              start of the .got section.  See also comment at
1132              R_CRIS_32_GOT.  */
1133           relocation -= sgot->output_section->vma;
1134
1135           /* Resolve a PLT_GOTREL reloc against a local symbol directly,
1136              without using the procedure linkage table.  */
1137           if (h == NULL)
1138             break;
1139
1140           if (h->plt.offset == (bfd_vma) -1
1141               || splt == NULL)
1142             {
1143               /* We didn't make a PLT entry for this symbol.  This
1144                  happens when statically linking PIC code, or when
1145                  using -Bsymbolic.  */
1146               break;
1147             }
1148
1149           relocation = (splt->output_section->vma
1150                         + splt->output_offset
1151                         + h->plt.offset
1152                         - sgot->output_section->vma);
1153           break;
1154
1155         case R_CRIS_8_PCREL:
1156         case R_CRIS_16_PCREL:
1157         case R_CRIS_32_PCREL:
1158           /* If the symbol was local, we need no shlib-specific handling.  */
1159           if (h == NULL)
1160             break;
1161
1162           /* Fall through.  */
1163         case R_CRIS_8:
1164         case R_CRIS_16:
1165         case R_CRIS_32:
1166           if (info->shared
1167               && (input_section->flags & SEC_ALLOC) != 0
1168               && ((r_type != R_CRIS_8_PCREL
1169                    && r_type != R_CRIS_16_PCREL
1170                    && r_type != R_CRIS_32_PCREL)
1171                   || (!info->symbolic
1172                       || (h->elf_link_hash_flags
1173                           & ELF_LINK_HASH_DEF_REGULAR) == 0)))
1174             {
1175               Elf_Internal_Rela outrel;
1176               boolean skip, relocate;
1177
1178               /* When generating a shared object, these relocations
1179                  are copied into the output file to be resolved at run
1180                  time.  */
1181
1182               if (sreloc == NULL)
1183                 {
1184                   const char *name;
1185
1186                   name = (bfd_elf_string_from_elf_section
1187                           (input_bfd,
1188                            elf_elfheader (input_bfd)->e_shstrndx,
1189                            elf_section_data (input_section)->rel_hdr.sh_name));
1190                   if (name == NULL)
1191                     return false;
1192
1193                   BFD_ASSERT (strncmp (name, ".rela", 5) == 0
1194                               && strcmp (bfd_get_section_name (input_bfd,
1195                                                                input_section),
1196                                          name + 5) == 0);
1197
1198                   sreloc = bfd_get_section_by_name (dynobj, name);
1199
1200                   /* That section should have been created in
1201                      cris_elf_check_relocs, but that function will not be
1202                      called for objects which fail in
1203                      cris_elf_merge_private_bfd_data.  */
1204                   if (sreloc == NULL)
1205                     {
1206                       (*_bfd_error_handler)
1207                         (_("%s: Internal inconsistency; no relocation section %s"),
1208                          bfd_get_filename (input_bfd),
1209                          name);
1210
1211                       bfd_set_error (bfd_error_bad_value);
1212                       return false;
1213                     }
1214                 }
1215
1216               skip = false;
1217
1218               if (elf_section_data (input_section)->stab_info == NULL)
1219                 outrel.r_offset = rel->r_offset;
1220               else
1221                 {
1222                   bfd_vma off;
1223
1224                   off = (_bfd_stab_section_offset
1225                          (output_bfd, &elf_hash_table (info)->stab_info,
1226                           input_section,
1227                           &elf_section_data (input_section)->stab_info,
1228                           rel->r_offset));
1229                   if (off == (bfd_vma) -1)
1230                     skip = true;
1231                   outrel.r_offset = off;
1232                 }
1233
1234               outrel.r_offset += (input_section->output_section->vma
1235                                   + input_section->output_offset);
1236
1237               if (skip)
1238                 {
1239                   memset (&outrel, 0, sizeof outrel);
1240                   relocate = false;
1241                 }
1242               /* h->dynindx may be -1 if the symbol was marked to
1243                  become local.  */
1244               else if (h != NULL
1245                        && ((! info->symbolic && h->dynindx != -1)
1246                            || (h->elf_link_hash_flags
1247                                & ELF_LINK_HASH_DEF_REGULAR) == 0))
1248                 {
1249                   BFD_ASSERT (h->dynindx != -1);
1250                   relocate = false;
1251                   outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
1252                   outrel.r_addend = relocation + rel->r_addend;
1253                 }
1254               else
1255                 {
1256                   if (r_type == R_CRIS_32)
1257                     {
1258                       relocate = true;
1259                       outrel.r_info = ELF32_R_INFO (0, R_CRIS_RELATIVE);
1260                       outrel.r_addend = relocation + rel->r_addend;
1261                     }
1262                   else
1263                     {
1264                       long indx;
1265
1266                       if (h == NULL)
1267                         sec = local_sections[r_symndx];
1268                       else
1269                         {
1270                           BFD_ASSERT (h->root.type == bfd_link_hash_defined
1271                                       || (h->root.type
1272                                           == bfd_link_hash_defweak));
1273                           sec = h->root.u.def.section;
1274                         }
1275                       if (sec != NULL && bfd_is_abs_section (sec))
1276                         indx = 0;
1277                       else if (sec == NULL || sec->owner == NULL)
1278                         {
1279                           bfd_set_error (bfd_error_bad_value);
1280                           return false;
1281                         }
1282                       else
1283                         {
1284                           asection *osec;
1285
1286                           osec = sec->output_section;
1287                           indx = elf_section_data (osec)->dynindx;
1288                           BFD_ASSERT (indx > 0);
1289                         }
1290
1291                       relocate = false;
1292                       outrel.r_info = ELF32_R_INFO (indx, r_type);
1293                       outrel.r_addend = relocation + rel->r_addend;
1294                     }
1295                 }
1296
1297               bfd_elf32_swap_reloca_out (output_bfd, &outrel,
1298                                          (((Elf32_External_Rela *)
1299                                            sreloc->contents)
1300                                           + sreloc->reloc_count));
1301               ++sreloc->reloc_count;
1302
1303               /* This reloc will be computed at runtime, so there's no
1304                  need to do anything now, except for R_CRIS_32 relocations
1305                  that have been turned into R_CRIS_RELATIVE.  */
1306               if (!relocate)
1307                 continue;
1308             }
1309
1310           break;
1311         }
1312
1313       r = cris_final_link_relocate (howto, input_bfd, input_section,
1314                                      contents, rel, relocation);
1315
1316       if (r != bfd_reloc_ok)
1317         {
1318           const char * msg = (const char *) NULL;
1319
1320           switch (r)
1321             {
1322             case bfd_reloc_overflow:
1323               r = info->callbacks->reloc_overflow
1324                 (info, name, howto->name, (bfd_vma) 0,
1325                  input_bfd, input_section, rel->r_offset);
1326               break;
1327
1328             case bfd_reloc_undefined:
1329               r = info->callbacks->undefined_symbol
1330                 (info, name, input_bfd, input_section, rel->r_offset,
1331                  true);
1332               break;
1333
1334             case bfd_reloc_outofrange:
1335               msg = _("internal error: out of range error");
1336               break;
1337
1338             case bfd_reloc_notsupported:
1339               msg = _("internal error: unsupported relocation error");
1340               break;
1341
1342             case bfd_reloc_dangerous:
1343               msg = _("internal error: dangerous relocation");
1344               break;
1345
1346             default:
1347               msg = _("internal error: unknown error");
1348               break;
1349             }
1350
1351           if (msg)
1352             r = info->callbacks->warning
1353               (info, msg, name, input_bfd, input_section, rel->r_offset);
1354
1355           if (! r)
1356             return false;
1357         }
1358     }
1359
1360   return true;
1361 }
1362 \f
1363 /* Finish up dynamic symbol handling.  We set the contents of various
1364    dynamic sections here.  */
1365
1366 static boolean
1367 elf_cris_finish_dynamic_symbol (output_bfd, info, h, sym)
1368      bfd *output_bfd;
1369      struct bfd_link_info *info;
1370      struct elf_link_hash_entry *h;
1371      Elf_Internal_Sym *sym;
1372 {
1373   bfd *dynobj;
1374   int plt_off1 = 2, plt_off2 = 10, plt_off3 = 16;
1375
1376   dynobj = elf_hash_table (info)->dynobj;
1377
1378   if (h->plt.offset != (bfd_vma) -1)
1379     {
1380       asection *splt;
1381       asection *sgotplt;
1382       asection *sgot;
1383       asection *srela;
1384       bfd_vma got_base;
1385
1386       bfd_vma gotplt_offset
1387         = ((struct elf_cris_link_hash_entry *) h)->gotplt_offset;
1388       Elf_Internal_Rela rela;
1389       boolean has_gotplt = gotplt_offset != 0;
1390
1391       /* Get the index in the procedure linkage table which
1392          corresponds to this symbol.  This is the index of this symbol
1393          in all the symbols for which we are making plt entries.  The
1394          first entry in the procedure linkage table is reserved.  */
1395       /* We have to count backwards here, and the result is only valid as
1396          an index into .got.plt and its relocations.  FIXME: Constants...  */
1397       bfd_vma gotplt_index = gotplt_offset/4 - 3;
1398
1399       /* Get the offset into the .got table of the entry that corresponds
1400          to this function.  Note that we embed knowledge that "incoming"
1401          .got goes after .got.plt in the output without padding (pointer
1402          aligned).  However, that knowledge is present in several other
1403          places too, here and in elflink.h at least.  */
1404       bfd_vma got_offset
1405         = (has_gotplt
1406            ? gotplt_offset
1407            : h->got.offset + elf_cris_hash_table(info)->next_gotplt_entry);
1408
1409       /* This symbol has an entry in the procedure linkage table.  Set it
1410          up.  */
1411
1412       BFD_ASSERT (h->dynindx != -1);
1413
1414       splt = bfd_get_section_by_name (dynobj, ".plt");
1415       sgot = bfd_get_section_by_name (dynobj, ".got");
1416       sgotplt = bfd_get_section_by_name (dynobj, ".got.plt");
1417       srela = bfd_get_section_by_name (dynobj, ".rela.plt");
1418       BFD_ASSERT (splt != NULL && sgotplt != NULL
1419                   && (! has_gotplt || srela != NULL));
1420
1421       got_base = sgotplt->output_section->vma + sgotplt->output_offset;
1422
1423       /* Fill in the entry in the procedure linkage table.  */
1424       if (! info->shared)
1425         {
1426           memcpy (splt->contents + h->plt.offset, elf_cris_plt_entry,
1427                   PLT_ENTRY_SIZE);
1428
1429           /* We need to enter the absolute address of the GOT entry here.  */
1430           bfd_put_32 (output_bfd, got_base + got_offset,
1431                       splt->contents + h->plt.offset + plt_off1);
1432         }
1433       else
1434         {
1435           memcpy (splt->contents + h->plt.offset, elf_cris_pic_plt_entry,
1436                   PLT_ENTRY_SIZE);
1437           bfd_put_32 (output_bfd, got_offset,
1438                       splt->contents + h->plt.offset + plt_off1);
1439         }
1440
1441       /* Fill in the plt entry and make a relocation, if this is a "real"
1442          PLT entry.  */
1443       if (has_gotplt)
1444         {
1445           /* Fill in the offset into the reloc table.  */
1446           bfd_put_32 (output_bfd,
1447                       gotplt_index * sizeof (Elf32_External_Rela),
1448                       splt->contents + h->plt.offset + plt_off2);
1449
1450           /* Fill in the offset to the first PLT entry, where to "jump".  */
1451           bfd_put_32 (output_bfd, - (h->plt.offset + plt_off3 + 4),
1452                       splt->contents + h->plt.offset + plt_off3);
1453
1454           /* Fill in the entry in the global offset table with the address of
1455              the relocating stub.  */
1456           bfd_put_32 (output_bfd,
1457                       (splt->output_section->vma
1458                        + splt->output_offset
1459                        + h->plt.offset
1460                        + 8),
1461                       sgotplt->contents + got_offset);
1462
1463           /* Fill in the entry in the .rela.plt section.  */
1464           rela.r_offset = (sgotplt->output_section->vma
1465                            + sgotplt->output_offset
1466                            + got_offset);
1467           rela.r_info = ELF32_R_INFO (h->dynindx, R_CRIS_JUMP_SLOT);
1468           rela.r_addend = 0;
1469           bfd_elf32_swap_reloca_out (output_bfd, &rela,
1470                                      ((Elf32_External_Rela *) srela->contents
1471                                       + gotplt_index));
1472         }
1473
1474       if ((h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0)
1475         {
1476           /* Mark the symbol as undefined, rather than as defined in
1477              the .plt section.  Leave the value alone.  */
1478           sym->st_shndx = SHN_UNDEF;
1479
1480           /* FIXME: From elf32-sparc.c 2001-02-19 (1.18).  I still don't
1481              know whether resetting the value is significant; if it really
1482              is, rather than a quirk or bug in the sparc port, then I
1483              believe we'd see this elsewhere.  */
1484           /* If the symbol is weak, we do need to clear the value.
1485              Otherwise, the PLT entry would provide a definition for
1486              the symbol even if the symbol wasn't defined anywhere,
1487              and so the symbol would never be NULL.  */
1488           if ((h->elf_link_hash_flags & ELF_LINK_HASH_REF_REGULAR_NONWEAK)
1489               == 0)
1490             sym->st_value = 0;
1491         }
1492     }
1493
1494   /* We don't emit .got relocs for symbols that aren't in the
1495      dynamic-symbols table for an ordinary program.  */
1496   if (h->got.offset != (bfd_vma) -1
1497       && (info->shared || h->dynindx != -1))
1498     {
1499       asection *sgot;
1500       asection *srela;
1501       Elf_Internal_Rela rela;
1502
1503       /* This symbol has an entry in the global offset table.  Set it up.  */
1504
1505       sgot = bfd_get_section_by_name (dynobj, ".got");
1506       srela = bfd_get_section_by_name (dynobj, ".rela.got");
1507       BFD_ASSERT (sgot != NULL && srela != NULL);
1508
1509       rela.r_offset = (sgot->output_section->vma
1510                        + sgot->output_offset
1511                        + (h->got.offset &~ 1));
1512
1513       /* If this is a static link, or it is a -Bsymbolic link and the
1514          symbol is defined locally or was forced to be local because
1515          of a version file, we just want to emit a RELATIVE reloc.
1516          The entry in the global offset table will already have been
1517          initialized in the relocate_section function.  */
1518       if (! elf_hash_table (info)->dynamic_sections_created
1519           || (info->shared
1520               && (info->symbolic || h->dynindx == -1)
1521               && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR)))
1522         {
1523           rela.r_info = ELF32_R_INFO (0, R_CRIS_RELATIVE);
1524           rela.r_addend = bfd_get_signed_32 (output_bfd,
1525                                              (sgot->contents
1526                                               + (h->got.offset & ~1)));
1527         }
1528       else
1529         {
1530           bfd_put_32 (output_bfd, (bfd_vma) 0,
1531                       sgot->contents + (h->got.offset & ~1));
1532           rela.r_info = ELF32_R_INFO (h->dynindx, R_CRIS_GLOB_DAT);
1533           rela.r_addend = 0;
1534         }
1535
1536       bfd_elf32_swap_reloca_out (output_bfd, &rela,
1537                                  ((Elf32_External_Rela *) srela->contents
1538                                   + srela->reloc_count));
1539       ++srela->reloc_count;
1540     }
1541
1542   if ((h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_COPY) != 0)
1543     {
1544       asection *s;
1545       Elf_Internal_Rela rela;
1546
1547       /* This symbol needs a copy reloc.  Set it up.  */
1548
1549       BFD_ASSERT (h->dynindx != -1
1550                   && (h->root.type == bfd_link_hash_defined
1551                       || h->root.type == bfd_link_hash_defweak));
1552
1553       s = bfd_get_section_by_name (h->root.u.def.section->owner,
1554                                    ".rela.bss");
1555       BFD_ASSERT (s != NULL);
1556
1557       rela.r_offset = (h->root.u.def.value
1558                        + h->root.u.def.section->output_section->vma
1559                        + h->root.u.def.section->output_offset);
1560       rela.r_info = ELF32_R_INFO (h->dynindx, R_CRIS_COPY);
1561       rela.r_addend = 0;
1562       bfd_elf32_swap_reloca_out (output_bfd, &rela,
1563                                  ((Elf32_External_Rela *) s->contents
1564                                   + s->reloc_count));
1565       ++s->reloc_count;
1566     }
1567
1568   /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute.  */
1569   if (strcmp (h->root.root.string, "_DYNAMIC") == 0
1570       || strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0)
1571     sym->st_shndx = SHN_ABS;
1572
1573   return true;
1574 }
1575 \f
1576 /* Finish up the dynamic sections.  */
1577
1578 static boolean
1579 elf_cris_finish_dynamic_sections (output_bfd, info)
1580      bfd *output_bfd;
1581      struct bfd_link_info *info;
1582 {
1583   bfd *dynobj;
1584   asection *sgot;
1585   asection *sdyn;
1586
1587   dynobj = elf_hash_table (info)->dynobj;
1588
1589   sgot = bfd_get_section_by_name (dynobj, ".got.plt");
1590   BFD_ASSERT (sgot != NULL);
1591   sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
1592
1593   if (elf_hash_table (info)->dynamic_sections_created)
1594     {
1595       asection *splt;
1596       Elf32_External_Dyn *dyncon, *dynconend;
1597
1598       splt = bfd_get_section_by_name (dynobj, ".plt");
1599       BFD_ASSERT (splt != NULL && sdyn != NULL);
1600
1601       dyncon = (Elf32_External_Dyn *) sdyn->contents;
1602       dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->_raw_size);
1603       for (; dyncon < dynconend; dyncon++)
1604         {
1605           Elf_Internal_Dyn dyn;
1606           asection *s;
1607
1608           bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
1609
1610           switch (dyn.d_tag)
1611             {
1612             default:
1613               break;
1614
1615             case DT_PLTGOT:
1616               s = bfd_get_section_by_name (output_bfd, ".got");
1617               BFD_ASSERT (s != NULL);
1618               dyn.d_un.d_ptr = s->vma;
1619               bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
1620               break;
1621
1622             case DT_JMPREL:
1623               /* Yes, we *can* have a .plt and no .plt.rela, for instance
1624                  if all symbols are found in the .got (not .got.plt).  */
1625               s = bfd_get_section_by_name (output_bfd, ".rela.plt");
1626               dyn.d_un.d_ptr = s != NULL ? s->vma : 0;
1627               bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
1628               break;
1629
1630             case DT_PLTRELSZ:
1631               s = bfd_get_section_by_name (output_bfd, ".rela.plt");
1632               if (s == NULL)
1633                 dyn.d_un.d_val = 0;
1634               else if (s->_cooked_size != 0)
1635                 dyn.d_un.d_val = s->_cooked_size;
1636               else
1637                 dyn.d_un.d_val = s->_raw_size;
1638               bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
1639               break;
1640
1641             case DT_RELASZ:
1642               /* The procedure linkage table relocs (DT_JMPREL) should
1643                  not be included in the overall relocs (DT_RELA).
1644                  Therefore, we override the DT_RELASZ entry here to
1645                  make it not include the JMPREL relocs.  Since the
1646                  linker script arranges for .rela.plt to follow all
1647                  other relocation sections, we don't have to worry
1648                  about changing the DT_RELA entry.  */
1649               s = bfd_get_section_by_name (output_bfd, ".rela.plt");
1650               if (s != NULL)
1651                 {
1652                   if (s->_cooked_size != 0)
1653                     dyn.d_un.d_val -= s->_cooked_size;
1654                   else
1655                     dyn.d_un.d_val -= s->_raw_size;
1656                 }
1657               bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
1658               break;
1659             }
1660         }
1661
1662       /* Fill in the first entry in the procedure linkage table.  */
1663       if (splt->_raw_size > 0)
1664         {
1665           if (info->shared)
1666             memcpy (splt->contents, elf_cris_pic_plt0_entry, PLT_ENTRY_SIZE);
1667           else
1668             {
1669               memcpy (splt->contents, elf_cris_plt0_entry, PLT_ENTRY_SIZE);
1670               bfd_put_32 (output_bfd,
1671                           sgot->output_section->vma + sgot->output_offset + 4,
1672                           splt->contents + 6);
1673               bfd_put_32 (output_bfd,
1674                           sgot->output_section->vma + sgot->output_offset + 8,
1675                           splt->contents + 14);
1676
1677               elf_section_data (splt->output_section)->this_hdr.sh_entsize
1678                = PLT_ENTRY_SIZE;
1679             }
1680         }
1681     }
1682
1683   /* Fill in the first three entries in the global offset table.  */
1684   if (sgot->_raw_size > 0)
1685     {
1686       if (sdyn == NULL)
1687         bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents);
1688       else
1689         bfd_put_32 (output_bfd,
1690                     sdyn->output_section->vma + sdyn->output_offset,
1691                     sgot->contents);
1692       bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + 4);
1693       bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + 8);
1694     }
1695
1696   elf_section_data (sgot->output_section)->this_hdr.sh_entsize = 4;
1697
1698   return true;
1699 }
1700 \f
1701 /* Return the section that should be marked against GC for a given
1702    relocation.  */
1703
1704 static asection *
1705 cris_elf_gc_mark_hook (abfd, info, rel, h, sym)
1706      bfd *                        abfd;
1707      struct bfd_link_info *       info ATTRIBUTE_UNUSED;
1708      Elf_Internal_Rela *          rel;
1709      struct elf_link_hash_entry * h;
1710      Elf_Internal_Sym *           sym;
1711 {
1712   if (h != NULL)
1713     {
1714       switch (ELF32_R_TYPE (rel->r_info))
1715         {
1716         case R_CRIS_GNU_VTINHERIT:
1717         case R_CRIS_GNU_VTENTRY:
1718           break;
1719
1720         default:
1721           switch (h->root.type)
1722             {
1723             case bfd_link_hash_defined:
1724             case bfd_link_hash_defweak:
1725               return h->root.u.def.section;
1726
1727             case bfd_link_hash_common:
1728               return h->root.u.c.p->section;
1729
1730             default:
1731               break;
1732             }
1733         }
1734     }
1735   else
1736     {
1737       if (!(elf_bad_symtab (abfd)
1738             && ELF_ST_BIND (sym->st_info) != STB_LOCAL)
1739           && ! ((sym->st_shndx <= 0 || sym->st_shndx >= SHN_LORESERVE)
1740                 && sym->st_shndx != SHN_COMMON))
1741         {
1742           return bfd_section_from_elf_index (abfd, sym->st_shndx);
1743         }
1744     }
1745
1746   return NULL;
1747 }
1748
1749 /* Update the got entry reference counts for the section being removed.  */
1750
1751 static boolean
1752 cris_elf_gc_sweep_hook (abfd, info, sec, relocs)
1753      bfd *                     abfd ATTRIBUTE_UNUSED;
1754      struct bfd_link_info *    info ATTRIBUTE_UNUSED;
1755      asection *                sec ATTRIBUTE_UNUSED;
1756      const Elf_Internal_Rela * relocs ATTRIBUTE_UNUSED;
1757 {
1758   Elf_Internal_Shdr *symtab_hdr;
1759   struct elf_link_hash_entry **sym_hashes;
1760   bfd_signed_vma *local_got_refcounts;
1761   const Elf_Internal_Rela *rel, *relend;
1762   unsigned long r_symndx;
1763   struct elf_link_hash_entry *h;
1764   bfd *dynobj;
1765   asection *sgot;
1766   asection *srelgot;
1767
1768   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1769   sym_hashes = elf_sym_hashes (abfd);
1770   local_got_refcounts = elf_local_got_refcounts (abfd);
1771
1772   dynobj = elf_hash_table (info)->dynobj;
1773   if (dynobj == NULL)
1774     return true;
1775
1776   sgot = bfd_get_section_by_name (dynobj, ".got");
1777   srelgot = bfd_get_section_by_name (dynobj, ".rela.got");
1778
1779   relend = relocs + sec->reloc_count;
1780   for (rel = relocs; rel < relend; rel++)
1781     {
1782       switch (ELF32_R_TYPE (rel->r_info))
1783         {
1784         case R_CRIS_16_GOT:
1785         case R_CRIS_32_GOT:
1786           r_symndx = ELF32_R_SYM (rel->r_info);
1787           if (r_symndx >= symtab_hdr->sh_info)
1788             {
1789               h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1790               if (h->got.refcount > 0)
1791                 {
1792                   --h->got.refcount;
1793                   if (h->got.refcount == 0)
1794                     {
1795                       /* We don't need the .got entry any more.  */
1796                       sgot->_raw_size -= 4;
1797                       srelgot->_raw_size -= sizeof (Elf32_External_Rela);
1798                     }
1799                 }
1800               break;
1801             }
1802
1803         local_got_reloc:
1804           if (local_got_refcounts != NULL)
1805             {
1806               if (local_got_refcounts[r_symndx] > 0)
1807                 {
1808                   --local_got_refcounts[r_symndx];
1809                   if (local_got_refcounts[r_symndx] == 0)
1810                     {
1811                       /* We don't need the .got entry any more.  */
1812                       sgot->_raw_size -= 4;
1813                       if (info->shared)
1814                         srelgot->_raw_size -= sizeof (Elf32_External_Rela);
1815                     }
1816                 }
1817             }
1818           break;
1819
1820         case R_CRIS_16_GOTPLT:
1821         case R_CRIS_32_GOTPLT:
1822           /* For local symbols, treat these like GOT relocs.  */
1823           r_symndx = ELF32_R_SYM (rel->r_info);
1824           if (r_symndx < symtab_hdr->sh_info)
1825             goto local_got_reloc;
1826
1827         case R_CRIS_32_PLT_GOTREL:
1828           /* FIXME: We don't garbage-collect away the .got section.  */
1829           if (local_got_refcounts != NULL)
1830             local_got_refcounts[-1]--;
1831           /* Fall through.  */
1832
1833         case R_CRIS_8_PCREL:
1834         case R_CRIS_16_PCREL:
1835         case R_CRIS_32_PCREL:
1836         case R_CRIS_32_PLT_PCREL:
1837           r_symndx = ELF32_R_SYM (rel->r_info);
1838           if (r_symndx >= symtab_hdr->sh_info)
1839             {
1840               h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1841               if (h->plt.refcount > 0)
1842                 --h->plt.refcount;
1843             }
1844           break;
1845
1846         default:
1847           break;
1848         }
1849     }
1850
1851   return true;
1852 }
1853
1854 /* Make sure we emit a GOT entry if the symbol was supposed to have a PLT
1855    entry but we found we will not create any.  Called when we find we will
1856    not have any PLT for this symbol, by for example
1857    elf_cris_adjust_dynamic_symbol when we're doing a proper dynamic link,
1858    or elf_cris_size_dynamic_sections if no dynamic sections will be
1859    created (we're only linking static objects).  */
1860
1861 static boolean
1862 elf_cris_adjust_gotplt_to_got (h, p)
1863      struct elf_cris_link_hash_entry *h;
1864      PTR p;
1865 {
1866   struct bfd_link_info *info = (struct bfd_link_info *) p;
1867   bfd *dynobj = elf_hash_table (info)->dynobj;
1868
1869   BFD_ASSERT (dynobj != NULL);
1870
1871   /* If nobody wanted a GOTPLT with this symbol, we're done.  */
1872   if (h->gotplt_refcount <= 0)
1873     return true;
1874
1875   if (h->root.got.refcount > 0)
1876     {
1877       /* There's a GOT entry for this symbol.  Just adjust the refcount.
1878          Probably not necessary at this stage, but keeping it accurate
1879          helps avoiding surprises later.  */
1880       h->root.got.refcount += h->gotplt_refcount;
1881       h->gotplt_refcount = -1;
1882     }
1883   else
1884     {
1885       /* No GOT entry for this symbol.  We need to create one.  */
1886       asection *sgot = bfd_get_section_by_name (dynobj, ".got");
1887       asection *srelgot
1888         = bfd_get_section_by_name (dynobj, ".rela.got");
1889
1890       /* Put an accurate refcount there.  */
1891       h->root.got.refcount = h->gotplt_refcount;
1892
1893       h->gotplt_refcount = -1;
1894
1895       /* We always have a .got section when there are dynamic
1896          relocs.  */
1897       BFD_ASSERT (sgot != NULL /* Surely have .got section.  */);
1898
1899       /* We might have had a PLT but with no GOT entry and
1900          further no GOT reloc section at all needed before.
1901          Add it.  */
1902       if (srelgot == NULL)
1903         {
1904           srelgot = bfd_make_section (dynobj, ".rela.got");
1905
1906           if (srelgot == NULL
1907               || !bfd_set_section_flags (dynobj, srelgot,
1908                                          (SEC_ALLOC
1909                                           | SEC_LOAD
1910                                           | SEC_HAS_CONTENTS
1911                                           | SEC_IN_MEMORY
1912                                           | SEC_LINKER_CREATED
1913                                           | SEC_READONLY))
1914               || !bfd_set_section_alignment (dynobj, srelgot, 2))
1915             return false;
1916         }
1917
1918       /* Allocate space in the .got section.  */
1919       sgot->_raw_size += 4;
1920
1921       /* Allocate relocation space.  */
1922       srelgot->_raw_size += sizeof (Elf32_External_Rela);
1923     }
1924
1925   return true;
1926 }
1927
1928 /* Try to fold PLT entries with GOT entries.  There are two cases when we
1929    want to do this:
1930
1931    - When all PLT references are GOTPLT references, and there are GOT
1932      references.  We don't have to generate a PLT at all.
1933
1934    - When there are both (ordinary) PLT references and GOT references.
1935      We want to make the PLT reference use the ordinary GOT entry rather
1936      than a run-time dynamically resolved GOTPLT entry (since the GOT
1937      entry will have to be resolved at startup anyway).
1938
1939    Though the latter case is handled when room for the PLT is allocated,
1940    not here.
1941
1942    Note that this function is called before symbols are forced local by
1943    version scripts.  The differing cases are handled by
1944    elf_cris_hide_symbol.  */
1945
1946 static boolean
1947 elf_cris_try_fold_plt_to_got (h, p)
1948      struct elf_cris_link_hash_entry *h;
1949      PTR p;
1950 {
1951   struct bfd_link_info *info = (struct bfd_link_info *) p;
1952
1953   /* If there are no GOT references for this symbol, we can't fold any
1954      other reference so there's nothing to do.  Likewise if there are no
1955      PLT references; GOTPLT references included.  */
1956   if (h->root.got.refcount <= 0 || h->root.plt.refcount <= 0)
1957     return true;
1958
1959   /* GOTPLT relocs are supposed to be included into the PLT refcount.  */
1960   BFD_ASSERT (h->gotplt_refcount <= h->root.plt.refcount);
1961
1962   if (h->gotplt_refcount == h->root.plt.refcount)
1963     {
1964       /* The only PLT references are GOTPLT references, and there are GOT
1965          references.  Convert PLT to GOT references.  */
1966       if (! elf_cris_adjust_gotplt_to_got (h, info))
1967         return false;
1968
1969       /* Clear the PLT references, so no PLT will be created.  */
1970       h->root.plt.offset = (bfd_vma) -1;
1971     }
1972
1973   return true;
1974 }
1975
1976 /* Our own version of hide_symbol, so that we can adjust a GOTPLT reloc
1977    to use a GOT entry (and create one) rather than requiring a GOTPLT
1978    entry.  */
1979
1980 static void
1981 elf_cris_hide_symbol (info, h)
1982      struct bfd_link_info *info;
1983      struct elf_link_hash_entry *h;
1984 {
1985   elf_cris_adjust_gotplt_to_got ((struct elf_cris_link_hash_entry *) h, info);
1986
1987   _bfd_elf_link_hash_hide_symbol (info, h);
1988 }
1989
1990 /* Adjust a symbol defined by a dynamic object and referenced by a
1991    regular object.  The current definition is in some section of the
1992    dynamic object, but we're not including those sections.  We have to
1993    change the definition to something the rest of the link can
1994    understand.  */
1995
1996 static boolean
1997 elf_cris_adjust_dynamic_symbol (info, h)
1998      struct bfd_link_info *info;
1999      struct elf_link_hash_entry *h;
2000 {
2001   bfd *dynobj;
2002   asection *s;
2003   unsigned int power_of_two;
2004
2005   dynobj = elf_hash_table (info)->dynobj;
2006
2007   /* Make sure we know what is going on here.  */
2008   BFD_ASSERT (dynobj != NULL
2009               && ((h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT)
2010                   || h->weakdef != NULL
2011                   || ((h->elf_link_hash_flags
2012                        & ELF_LINK_HASH_DEF_DYNAMIC) != 0
2013                       && (h->elf_link_hash_flags
2014                           & ELF_LINK_HASH_REF_REGULAR) != 0
2015                       && (h->elf_link_hash_flags
2016                           & ELF_LINK_HASH_DEF_REGULAR) == 0)));
2017
2018   /* If this is a function, put it in the procedure linkage table.  We
2019      will fill in the contents of the procedure linkage table later,
2020      when we know the address of the .got section.  */
2021   if (h->type == STT_FUNC
2022       || (h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT) != 0)
2023     {
2024       if (! info->shared
2025           && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) == 0
2026           && (h->elf_link_hash_flags & ELF_LINK_HASH_REF_DYNAMIC) == 0
2027           /* We must always create the plt entry if it was referenced by a
2028              PLT relocation.  In this case we already recorded it as a
2029              dynamic symbol.  */
2030           /* FIXME: m68k and i386 differ here, for unclear reasons.  */
2031           && h->dynindx == -1)
2032         {
2033           /* This case can occur if we saw a PLT reloc in an input file,
2034              but the symbol was never referred to by a dynamic object.  In
2035              such a case, we don't actually need to build a procedure
2036              linkage table, and we can just do a PC reloc instead, or
2037              change a .got.plt index to a .got index for GOTPLT relocs.  */
2038           BFD_ASSERT ((h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT) != 0);
2039           h->plt.offset = (bfd_vma) -1;
2040
2041           return
2042             elf_cris_adjust_gotplt_to_got ((struct
2043                                             elf_cris_link_hash_entry *) h,
2044                                            info);
2045         }
2046
2047       /* If there are only GOT references and GOTPLT references to this
2048          PLT entry, get rid of the PLT.  */
2049       if (! elf_cris_try_fold_plt_to_got ((struct elf_cris_link_hash_entry *)
2050                                           h, info))
2051         return false;
2052
2053       /* GC or folding may have rendered this entry unused.  */
2054       if (h->plt.refcount <= 0)
2055         {
2056           h->elf_link_hash_flags &= ~ELF_LINK_HASH_NEEDS_PLT;
2057           h->plt.offset = (bfd_vma) -1;
2058           return true;
2059         }
2060
2061       /* Make sure this symbol is output as a dynamic symbol.  */
2062       if (h->dynindx == -1)
2063         {
2064           if (! bfd_elf32_link_record_dynamic_symbol (info, h))
2065             return false;
2066         }
2067
2068       s = bfd_get_section_by_name (dynobj, ".plt");
2069       BFD_ASSERT (s != NULL);
2070
2071       /* If this is the first .plt entry, make room for the special
2072          first entry.  */
2073       if (s->_raw_size == 0)
2074         s->_raw_size += PLT_ENTRY_SIZE;
2075
2076       /* If this symbol is not defined in a regular file, and we are
2077          not generating a shared library, then set the symbol to this
2078          location in the .plt.  This is required to make function
2079          pointers compare as equal between the normal executable and
2080          the shared library.  */
2081       if (!info->shared
2082           && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0)
2083         {
2084           h->root.u.def.section = s;
2085           h->root.u.def.value = s->_raw_size;
2086         }
2087
2088       /* If there's already a GOT entry, use that, not a .got.plt.  A
2089          GOT field still has a reference count when we get here; it's
2090          not yet changed to an offset.  */
2091       if (h->got.refcount > 0)
2092         {
2093           h->got.refcount += h->plt.refcount;
2094
2095           /* Mark the PLT offset to use the GOT entry by setting the low
2096              bit in the plt offset; it is always a multiple of
2097              pointer-size.  */
2098           BFD_ASSERT ((s->_raw_size & 3) == 0);
2099
2100           /* Change the PLT refcount to an offset.  */
2101           h->plt.offset = s->_raw_size;
2102
2103           /* By not setting gotplt_offset (i.e. it remains at 0), we signal
2104              that the got entry should be used instead.  */
2105           BFD_ASSERT (((struct elf_cris_link_hash_entry *)
2106                        h)->gotplt_offset == 0);
2107
2108           /* Make room for this entry.  */
2109           s->_raw_size += PLT_ENTRY_SIZE;
2110
2111           return true;
2112         }
2113
2114       /* No GOT reference for this symbol; prepare for an ordinary PLT.  */
2115       h->plt.offset = s->_raw_size;
2116
2117       /* Make room for this entry.  */
2118       s->_raw_size += PLT_ENTRY_SIZE;
2119
2120       /* We also need to make an entry in the .got.plt section, which
2121          will be placed in the .got section by the linker script.  */
2122       ((struct elf_cris_link_hash_entry *) h)->gotplt_offset
2123         = elf_cris_hash_table (info)->next_gotplt_entry;
2124       elf_cris_hash_table (info)->next_gotplt_entry += 4;
2125
2126       s = bfd_get_section_by_name (dynobj, ".got.plt");
2127       BFD_ASSERT (s != NULL);
2128       s->_raw_size += 4;
2129
2130       /* We also need to make an entry in the .rela.plt section.  */
2131
2132       s = bfd_get_section_by_name (dynobj, ".rela.plt");
2133       BFD_ASSERT (s != NULL);
2134       s->_raw_size += sizeof (Elf32_External_Rela);
2135
2136       return true;
2137     }
2138
2139   /* Reinitialize the plt offset now that it is not used as a reference
2140      count any more.  */
2141   h->plt.offset = (bfd_vma) -1;
2142
2143   /* If this is a weak symbol, and there is a real definition, the
2144      processor independent code will have arranged for us to see the
2145      real definition first, and we can just use the same value.  */
2146   if (h->weakdef != NULL)
2147     {
2148       BFD_ASSERT (h->weakdef->root.type == bfd_link_hash_defined
2149                   || h->weakdef->root.type == bfd_link_hash_defweak);
2150       h->root.u.def.section = h->weakdef->root.u.def.section;
2151       h->root.u.def.value = h->weakdef->root.u.def.value;
2152       return true;
2153     }
2154
2155   /* This is a reference to a symbol defined by a dynamic object which
2156      is not a function.  */
2157
2158   /* If we are creating a shared library, we must presume that the
2159      only references to the symbol are via the global offset table.
2160      For such cases we need not do anything here; the relocations will
2161      be handled correctly by relocate_section.  */
2162   if (info->shared)
2163     return true;
2164
2165   /* If there are no references to this symbol that do not use the
2166      GOT, we don't need to generate a copy reloc.  */
2167   if ((h->elf_link_hash_flags & ELF_LINK_NON_GOT_REF) == 0)
2168     return true;
2169
2170   /* We must allocate the symbol in our .dynbss section, which will
2171      become part of the .bss section of the executable.  There will be
2172      an entry for this symbol in the .dynsym section.  The dynamic
2173      object will contain position independent code, so all references
2174      from the dynamic object to this symbol will go through the global
2175      offset table.  The dynamic linker will use the .dynsym entry to
2176      determine the address it must put in the global offset table, so
2177      both the dynamic object and the regular object will refer to the
2178      same memory location for the variable.  */
2179
2180   s = bfd_get_section_by_name (dynobj, ".dynbss");
2181   BFD_ASSERT (s != NULL);
2182
2183   /* We must generate a R_CRIS_COPY reloc to tell the dynamic linker to
2184      copy the initial value out of the dynamic object and into the
2185      runtime process image.  We need to remember the offset into the
2186      .rela.bss section we are going to use.  */
2187   if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
2188     {
2189       asection *srel;
2190
2191       srel = bfd_get_section_by_name (dynobj, ".rela.bss");
2192       BFD_ASSERT (srel != NULL);
2193       srel->_raw_size += sizeof (Elf32_External_Rela);
2194       h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_COPY;
2195     }
2196
2197   /* Historic precedent: m68k and i386 allow max 8-byte alignment for the
2198      thing to copy; so do we.  */
2199
2200   /* We need to figure out the alignment required for this symbol.  I
2201      have no idea how ELF linkers handle this.  */
2202   power_of_two = bfd_log2 (h->size);
2203   if (power_of_two > 3)
2204     power_of_two = 3;
2205
2206   /* Apply the required alignment.  */
2207   s->_raw_size = BFD_ALIGN (s->_raw_size,
2208                             (bfd_size_type) (1 << power_of_two));
2209   if (power_of_two > bfd_get_section_alignment (dynobj, s))
2210     {
2211       if (!bfd_set_section_alignment (dynobj, s, power_of_two))
2212         return false;
2213     }
2214
2215   /* Define the symbol as being at this point in the section.  */
2216   h->root.u.def.section = s;
2217   h->root.u.def.value = s->_raw_size;
2218
2219   /* Increment the section size to make room for the symbol.  */
2220   s->_raw_size += h->size;
2221
2222   return true;
2223 }
2224
2225 /* Look through the relocs for a section during the first phase.  */
2226
2227 static boolean
2228 cris_elf_check_relocs (abfd, info, sec, relocs)
2229      bfd *abfd;
2230      struct bfd_link_info *info;
2231      asection *sec;
2232      const Elf_Internal_Rela *relocs;
2233 {
2234   bfd *dynobj;
2235   Elf_Internal_Shdr *symtab_hdr;
2236   struct elf_link_hash_entry **sym_hashes, **sym_hashes_end;
2237   bfd_signed_vma *local_got_refcounts;
2238   const Elf_Internal_Rela *rel;
2239   const Elf_Internal_Rela *rel_end;
2240   asection *sgot;
2241   asection *srelgot;
2242   asection *sreloc;
2243
2244   if (info->relocateable)
2245     return true;
2246
2247   dynobj = elf_hash_table (info)->dynobj;
2248   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
2249   sym_hashes = elf_sym_hashes (abfd);
2250   sym_hashes_end = sym_hashes + symtab_hdr->sh_size/sizeof (Elf32_External_Sym);
2251   local_got_refcounts = elf_local_got_refcounts (abfd);
2252
2253   sgot = NULL;
2254   srelgot = NULL;
2255   sreloc = NULL;
2256
2257   if (!elf_bad_symtab (abfd))
2258     sym_hashes_end -= symtab_hdr->sh_info;
2259
2260   rel_end = relocs + sec->reloc_count;
2261   for (rel = relocs; rel < rel_end; rel++)
2262     {
2263       struct elf_link_hash_entry *h;
2264       unsigned long r_symndx;
2265       enum elf_cris_reloc_type r_type;
2266
2267       r_symndx = ELF32_R_SYM (rel->r_info);
2268       if (r_symndx < symtab_hdr->sh_info)
2269         h = NULL;
2270       else
2271         h = sym_hashes[r_symndx - symtab_hdr->sh_info];
2272
2273       r_type = ELF32_R_TYPE (rel->r_info);
2274
2275       /* Some relocs require linker-created sections; we need to hang them
2276          on the first input bfd we found that contained dynamic relocs.  */
2277       switch (r_type)
2278         {
2279         case R_CRIS_16_GOT:
2280         case R_CRIS_32_GOT:
2281         case R_CRIS_32_GOTREL:
2282         case R_CRIS_32_PLT_GOTREL:
2283         case R_CRIS_32_PLT_PCREL:
2284         case R_CRIS_16_GOTPLT:
2285         case R_CRIS_32_GOTPLT:
2286           if (dynobj == NULL)
2287             {
2288               elf_hash_table (info)->dynobj = dynobj = abfd;
2289
2290               /* Create the .got section, so we can assume it's always
2291                  present whenever there's a dynobj.  */
2292               if (!_bfd_elf_create_got_section (dynobj, info))
2293                 return false;
2294             }
2295           break;
2296
2297         default:
2298           break;
2299         }
2300
2301       /* Some relocs require a global offset table (but perhaps not a
2302          specific GOT entry).  */
2303       switch (r_type)
2304         {
2305         case R_CRIS_16_GOT:
2306         case R_CRIS_32_GOT:
2307         case R_CRIS_32_GOTREL:
2308         case R_CRIS_32_PLT_GOTREL:
2309           if (sgot == NULL)
2310             sgot = bfd_get_section_by_name (dynobj, ".got");
2311
2312           if (local_got_refcounts == NULL)
2313             {
2314               size_t size;
2315
2316               /* We use index local_got_refcounts[-1] to count all
2317                  GOT-relative relocations that do not have explicit
2318                  GOT entries.  */
2319               size = (symtab_hdr->sh_info + 1) * sizeof (bfd_signed_vma);
2320               local_got_refcounts = ((bfd_signed_vma *)
2321                                      bfd_alloc (abfd, size));
2322               if (local_got_refcounts == NULL)
2323                 return false;
2324               memset (local_got_refcounts, -1, size);
2325
2326               local_got_refcounts++;
2327               elf_local_got_refcounts (abfd) = local_got_refcounts;
2328             }
2329           break;
2330
2331         default:
2332           break;
2333         }
2334
2335       switch (r_type)
2336         {
2337         case R_CRIS_16_GOTPLT:
2338         case R_CRIS_32_GOTPLT:
2339           /* Mark that we need a GOT entry if the PLT entry (and its GOT
2340              entry) is eliminated.  We can only do this for a non-local
2341              symbol.  */
2342           if (h != NULL)
2343             {
2344               ((struct elf_cris_link_hash_entry *) h)->gotplt_refcount++;
2345               goto handle_gotplt_reloc;
2346             }
2347           /* If h is NULL then this is a local symbol, and we must make a
2348              GOT entry for it, so handle it like a GOT reloc.  */
2349           /* Fall through.  */
2350
2351         case R_CRIS_16_GOT:
2352         case R_CRIS_32_GOT:
2353           /* This symbol requires a global offset table entry.  */
2354
2355           if (srelgot == NULL
2356               && (h != NULL || info->shared))
2357             {
2358               srelgot = bfd_get_section_by_name (dynobj, ".rela.got");
2359               if (srelgot == NULL)
2360                 {
2361                   srelgot = bfd_make_section (dynobj, ".rela.got");
2362                   if (srelgot == NULL
2363                       || !bfd_set_section_flags (dynobj, srelgot,
2364                                                  (SEC_ALLOC
2365                                                   | SEC_LOAD
2366                                                   | SEC_HAS_CONTENTS
2367                                                   | SEC_IN_MEMORY
2368                                                   | SEC_LINKER_CREATED
2369                                                   | SEC_READONLY))
2370                       || !bfd_set_section_alignment (dynobj, srelgot, 2))
2371                     return false;
2372                 }
2373             }
2374
2375           if (h != NULL)
2376             {
2377               if (h->got.refcount == -1)
2378                 {
2379                   h->got.refcount = 1;
2380
2381                   /* Make sure this symbol is output as a dynamic symbol.  */
2382                   if (h->dynindx == -1)
2383                     {
2384                       if (!bfd_elf32_link_record_dynamic_symbol (info, h))
2385                         return false;
2386                     }
2387
2388                   /* Allocate space in the .got section.  */
2389                   sgot->_raw_size += 4;
2390                   /* Allocate relocation space.  */
2391                   srelgot->_raw_size += sizeof (Elf32_External_Rela);
2392                 }
2393               else
2394                 h->got.refcount++;
2395             }
2396           else
2397             {
2398               /* This is a global offset table entry for a local symbol.  */
2399               if (local_got_refcounts[r_symndx] == -1)
2400                 {
2401                   local_got_refcounts[r_symndx] = 1;
2402
2403                   sgot->_raw_size += 4;
2404                   if (info->shared)
2405                     {
2406                       /* If we are generating a shared object, we need to
2407                          output a R_CRIS_RELATIVE reloc so that the dynamic
2408                          linker can adjust this GOT entry.  */
2409                       srelgot->_raw_size += sizeof (Elf32_External_Rela);
2410                     }
2411                 }
2412               else
2413                 local_got_refcounts[r_symndx]++;
2414             }
2415           break;
2416
2417         case R_CRIS_32_GOTREL:
2418           /* This reference requires a global offset table.
2419              FIXME: The actual refcount isn't used currently; the .got
2420              section can't be removed if there were any references in the
2421              input.  */
2422           local_got_refcounts[-1]++;
2423           break;
2424
2425         handle_gotplt_reloc:
2426
2427         case R_CRIS_32_PLT_GOTREL:
2428           /* This reference requires a global offset table.  */
2429           local_got_refcounts[-1]++;
2430           /* Fall through.  */
2431
2432         case R_CRIS_32_PLT_PCREL:
2433           /* This symbol requires a procedure linkage table entry.  We
2434              actually build the entry in adjust_dynamic_symbol,
2435              because this might be a case of linking PIC code which is
2436              never referenced by a dynamic object, in which case we
2437              don't need to generate a procedure linkage table entry
2438              after all.  */
2439
2440           /* If this is a local symbol, we resolve it directly without
2441              creating a procedure linkage table entry.  */
2442           if (h == NULL)
2443             continue;
2444
2445           h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_PLT;
2446           if (h->plt.refcount == -1)
2447             h->plt.refcount = 1;
2448           else
2449             h->plt.refcount++;
2450           break;
2451
2452         case R_CRIS_8:
2453         case R_CRIS_16:
2454         case R_CRIS_32:
2455           /* Let's help debug shared library creation.  Any of these
2456              relocs can be used in shared libs, but pages containing them
2457              cannot be shared.  Don't warn for sections we don't care
2458              about, such as debug sections or non-constant sections.  We
2459              can't help tables of (global) function pointers, for example,
2460              though they must be emitted in a data section to avoid having
2461              impure text sections.  */
2462           if (info->shared
2463               && (sec->flags & SEC_ALLOC) != 0
2464               && (sec->flags & SEC_READONLY) != 0)
2465             {
2466               /* FIXME: How do we make this optionally a warning only?  */
2467               if (abfd->my_archive)
2468                 (*_bfd_error_handler)
2469                   (_("%s(%s), section %s:\n  relocation %s should not be used in a shared object; recompile with -fPIC"),
2470                    bfd_get_filename (bfd_my_archive (abfd)),
2471                    bfd_get_filename (abfd),
2472                    sec->name,
2473                    cris_elf_howto_table[r_type].name);
2474               else
2475                 (*_bfd_error_handler)
2476                   (_("%s, section %s:\n  relocation %s should not be used in a shared object; recompile with -fPIC"),
2477                    bfd_get_filename (abfd),
2478                    sec->name,
2479                    cris_elf_howto_table[r_type].name);
2480             }
2481           /* Fall through.  */
2482
2483         case R_CRIS_8_PCREL:
2484         case R_CRIS_16_PCREL:
2485         case R_CRIS_32_PCREL:
2486           if (h != NULL)
2487             {
2488               h->elf_link_hash_flags |= ELF_LINK_NON_GOT_REF;
2489
2490               /* Make sure a plt entry is created for this symbol if it
2491                  turns out to be a function defined by a dynamic object.  */
2492               if (h->plt.refcount == -1)
2493                 h->plt.refcount = 1;
2494               else
2495                 h->plt.refcount++;
2496             }
2497
2498           /* If we are creating a shared library and this is not a local
2499              symbol, we need to copy the reloc into the shared library.
2500              However when linking with -Bsymbolic and this is a global
2501              symbol which is defined in an object we are including in the
2502              link (i.e., DEF_REGULAR is set), then we can resolve the
2503              reloc directly.  At this point we have not seen all the input
2504              files, so it is possible that DEF_REGULAR is not set now but
2505              will be set later (it is never cleared).  In case of a weak
2506              definition, DEF_REGULAR may be cleared later by a strong
2507              definition in a shared library.  We account for that
2508              possibility below by storing information in the relocs_copied
2509              field of the hash table entry.  A similar situation occurs
2510              when creating shared libraries and symbol visibility changes
2511              render the symbol local.  */
2512
2513           /* No need to do anything if we're not creating a shared object.  */
2514           if (! info->shared)
2515             break;
2516
2517           /* We don't need to handle relocs into sections not going into
2518              the "real" output.  */
2519           if ((sec->flags & SEC_ALLOC) == 0)
2520             break;
2521
2522           /* We can only eliminate PC-relative relocs.  */
2523           if (r_type == R_CRIS_8_PCREL
2524               || r_type == R_CRIS_16_PCREL
2525               || r_type == R_CRIS_32_PCREL)
2526             {
2527               /* If the symbol is local, then we can eliminate the reloc.  */
2528               if (h == NULL)
2529                 break;
2530
2531               /* If this is with -Bsymbolic and the symbol isn't weak, and
2532                  is defined by an ordinary object (the ones we include in
2533                  this shared library) then we can also eliminate the
2534                  reloc.  See comment above for more eliminable cases which
2535                  we can't identify at this time.  */
2536               if (info->symbolic
2537                   && h->root.type != bfd_link_hash_defweak
2538                   && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) != 0)
2539                 break;
2540             }
2541
2542           /* We create a reloc section in dynobj and make room for this
2543              reloc.  */
2544           if (sreloc == NULL)
2545             {
2546               const char *name;
2547
2548               name = (bfd_elf_string_from_elf_section
2549                       (abfd,
2550                        elf_elfheader (abfd)->e_shstrndx,
2551                        elf_section_data (sec)->rel_hdr.sh_name));
2552               if (name == NULL)
2553                 return false;
2554
2555               BFD_ASSERT (strncmp (name, ".rela", 5) == 0
2556                           && strcmp (bfd_get_section_name (abfd, sec),
2557                                      name + 5) == 0);
2558
2559               sreloc = bfd_get_section_by_name (dynobj, name);
2560               if (sreloc == NULL)
2561                 {
2562                   sreloc = bfd_make_section (dynobj, name);
2563                   if (sreloc == NULL
2564                       || !bfd_set_section_flags (dynobj, sreloc,
2565                                                  (SEC_ALLOC
2566                                                   | SEC_LOAD
2567                                                   | SEC_HAS_CONTENTS
2568                                                   | SEC_IN_MEMORY
2569                                                   | SEC_LINKER_CREATED
2570                                                   | SEC_READONLY))
2571                       || !bfd_set_section_alignment (dynobj, sreloc, 2))
2572                     return false;
2573                 }
2574             }
2575
2576           sreloc->_raw_size += sizeof (Elf32_External_Rela);
2577
2578           /* If we are linking with -Bsymbolic, we count the number of PC
2579              relative relocations we have entered for this symbol, so that
2580              we can discard them again if the symbol is later defined by a
2581              regular object.  We know that h is really a pointer to an
2582              elf_cris_link_hash_entry.  */
2583           if ((r_type == R_CRIS_8_PCREL
2584                || r_type == R_CRIS_16_PCREL
2585                || r_type == R_CRIS_32_PCREL)
2586               && info->symbolic)
2587             {
2588               struct elf_cris_link_hash_entry *eh;
2589               struct elf_cris_pcrel_relocs_copied *p;
2590
2591               eh = (struct elf_cris_link_hash_entry *) h;
2592
2593               for (p = eh->pcrel_relocs_copied; p != NULL; p = p->next)
2594                 if (p->section == sreloc)
2595                   break;
2596
2597               if (p == NULL)
2598                 {
2599                   p = ((struct elf_cris_pcrel_relocs_copied *)
2600                        bfd_alloc (dynobj, sizeof *p));
2601                   if (p == NULL)
2602                     return false;
2603                   p->next = eh->pcrel_relocs_copied;
2604                   eh->pcrel_relocs_copied = p;
2605                   p->section = sreloc;
2606                   p->count = 0;
2607                 }
2608
2609               ++p->count;
2610             }
2611           break;
2612
2613         /* This relocation describes the C++ object vtable hierarchy.
2614            Reconstruct it for later use during GC.  */
2615         case R_CRIS_GNU_VTINHERIT:
2616           if (!_bfd_elf32_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
2617             return false;
2618           break;
2619
2620         /* This relocation describes which C++ vtable entries are actually
2621            used.  Record for later use during GC.  */
2622         case R_CRIS_GNU_VTENTRY:
2623           if (!_bfd_elf32_gc_record_vtentry (abfd, sec, h, rel->r_addend))
2624             return false;
2625           break;
2626
2627         default:
2628           /* Other relocs do not appear here.  */
2629           bfd_set_error (bfd_error_bad_value);
2630           return false;
2631         }
2632     }
2633
2634   return true;
2635 }
2636
2637 /* Set the sizes of the dynamic sections.  */
2638
2639 static boolean
2640 elf_cris_size_dynamic_sections (output_bfd, info)
2641      bfd *output_bfd;
2642      struct bfd_link_info *info;
2643 {
2644   bfd *dynobj;
2645   asection *s;
2646   boolean plt;
2647   boolean relocs;
2648   boolean reltext;
2649
2650   dynobj = elf_hash_table (info)->dynobj;
2651   BFD_ASSERT (dynobj != NULL);
2652
2653   if (elf_hash_table (info)->dynamic_sections_created)
2654     {
2655       /* Set the contents of the .interp section to the interpreter.  */
2656       if (!info->shared)
2657         {
2658           s = bfd_get_section_by_name (dynobj, ".interp");
2659           BFD_ASSERT (s != NULL);
2660           s->_raw_size = sizeof ELF_DYNAMIC_INTERPRETER;
2661           s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
2662         }
2663     }
2664   else
2665     {
2666       /* Adjust all expected GOTPLT uses to use a GOT entry instead.  */
2667       elf_cris_link_hash_traverse (elf_cris_hash_table (info),
2668                                    elf_cris_adjust_gotplt_to_got,
2669                                    (PTR) info);
2670
2671       /* We may have created entries in the .rela.got section.
2672          However, if we are not creating the dynamic sections, we will
2673          not actually use these entries.  Reset the size of .rela.got,
2674          which will cause it to get stripped from the output file
2675          below.  */
2676       s = bfd_get_section_by_name (dynobj, ".rela.got");
2677       if (s != NULL)
2678         s->_raw_size = 0;
2679     }
2680
2681   /* If this is a -Bsymbolic shared link, then we need to discard all PC
2682      relative relocs against symbols defined in a regular object.  We
2683      allocated space for them in the check_relocs routine, but we will not
2684      fill them in in the relocate_section routine.  We also discard space
2685      for relocs that have become for local symbols due to symbol
2686      visibility changes.  For programs, we discard space for relocs for
2687      symbols not referenced by any dynamic object.  */
2688   if (info->shared)
2689     elf_cris_link_hash_traverse (elf_cris_hash_table (info),
2690                                  elf_cris_discard_excess_dso_dynamics,
2691                                  (PTR) info);
2692   else
2693     elf_cris_link_hash_traverse (elf_cris_hash_table (info),
2694                                  elf_cris_discard_excess_program_dynamics,
2695                                  (PTR) info);
2696
2697   /* The check_relocs and adjust_dynamic_symbol entry points have
2698      determined the sizes of the various dynamic sections.  Allocate
2699      memory for them.  */
2700   plt = false;
2701   relocs = false;
2702   reltext = false;
2703   for (s = dynobj->sections; s != NULL; s = s->next)
2704     {
2705       const char *name;
2706       boolean strip;
2707
2708       if ((s->flags & SEC_LINKER_CREATED) == 0)
2709         continue;
2710
2711       /* It's OK to base decisions on the section name, because none
2712          of the dynobj section names depend upon the input files.  */
2713       name = bfd_get_section_name (dynobj, s);
2714
2715       strip = false;
2716
2717       if (strcmp (name, ".plt") == 0)
2718         {
2719           if (s->_raw_size == 0)
2720             {
2721               /* Strip this section if we don't need it; see the
2722                  comment below.  */
2723               strip = true;
2724             }
2725           else
2726             {
2727               /* Remember whether there is a PLT.  */
2728               plt = true;
2729             }
2730         }
2731       else if (strncmp (name, ".rela", 5) == 0)
2732         {
2733           if (s->_raw_size == 0)
2734             {
2735               /* If we don't need this section, strip it from the
2736                  output file.  This is mostly to handle .rela.bss and
2737                  .rela.plt.  We must create both sections in
2738                  create_dynamic_sections, because they must be created
2739                  before the linker maps input sections to output
2740                  sections.  The linker does that before
2741                  adjust_dynamic_symbol is called, and it is that
2742                  function which decides whether anything needs to go
2743                  into these sections.  */
2744               strip = true;
2745             }
2746           else
2747             {
2748               asection *target;
2749
2750               /* Remember whether there are any reloc sections other
2751                  than .rela.plt.  */
2752               if (strcmp (name, ".rela.plt") != 0)
2753                 {
2754                   const char *outname;
2755
2756                   relocs = true;
2757
2758                   /* If this relocation section applies to a read only
2759                      section, then we probably need a DT_TEXTREL entry.
2760                      The entries in the .rela.plt section are actually
2761                      associated with .got.plt, which we created ourselves
2762                      and so know is not readonly.  */
2763                   outname = bfd_get_section_name (output_bfd,
2764                                                   s->output_section);
2765                   target
2766                     = bfd_get_section_by_name (output_bfd,
2767                                                outname + strlen (".rela"));
2768
2769                   /* We have to test the .text section by name, becase for
2770                      some reason it does not have SEC_READONLY set at this
2771                      time.  That flag is actually set in ldmain.c:main
2772                      specifically for ".text" at a time long after this
2773                      function is called.  FIXME: This might be due to a
2774                      general bug.  FIXME: Have testcase for this.  */
2775                   if (target != NULL
2776                       && (target->flags & SEC_ALLOC) != 0
2777                       && ((target->flags & SEC_READONLY) != 0
2778                           || strcmp (outname + strlen (".rela"),
2779                                      ".text") == 0))
2780                     reltext = true;
2781                 }
2782
2783               /* We use the reloc_count field as a counter if we need
2784                  to copy relocs into the output file.  */
2785               s->reloc_count = 0;
2786             }
2787         }
2788       else if (strncmp (name, ".got", 4) != 0)
2789         {
2790           /* It's not one of our sections, so don't allocate space.  */
2791           continue;
2792         }
2793
2794       if (strip)
2795         {
2796           _bfd_strip_section_from_output (info, s);
2797           continue;
2798         }
2799
2800       /* Allocate memory for the section contents. We use bfd_zalloc here
2801          in case unused entries are not reclaimed before the section's
2802          contents are written out.  This should not happen, but this way
2803          if it does, we will not write out garbage.  For reloc sections,
2804          this will make entries have the type R_CRIS_NONE.  */
2805       s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->_raw_size);
2806       if (s->contents == NULL && s->_raw_size != 0)
2807         return false;
2808     }
2809
2810   if (elf_hash_table (info)->dynamic_sections_created)
2811     {
2812       /* Add some entries to the .dynamic section.  We fill in the
2813          values later, in elf_cris_finish_dynamic_sections, but we
2814          must add the entries now so that we get the correct size for
2815          the .dynamic section.  The DT_DEBUG entry is filled in by the
2816          dynamic linker and used by the debugger.  */
2817       if (!info->shared)
2818         {
2819           if (!bfd_elf32_add_dynamic_entry (info, DT_DEBUG, 0))
2820             return false;
2821         }
2822
2823       if (plt)
2824         {
2825           if (!bfd_elf32_add_dynamic_entry (info, DT_PLTGOT, 0)
2826               || !bfd_elf32_add_dynamic_entry (info, DT_PLTRELSZ, 0)
2827               || !bfd_elf32_add_dynamic_entry (info, DT_PLTREL, DT_RELA)
2828               || !bfd_elf32_add_dynamic_entry (info, DT_JMPREL, 0))
2829             return false;
2830         }
2831
2832       if (relocs)
2833         {
2834           if (!bfd_elf32_add_dynamic_entry (info, DT_RELA, 0)
2835               || !bfd_elf32_add_dynamic_entry (info, DT_RELASZ, 0)
2836               || !bfd_elf32_add_dynamic_entry (info, DT_RELAENT,
2837                                                sizeof (Elf32_External_Rela)))
2838             return false;
2839         }
2840
2841       if (reltext)
2842         {
2843           if (!bfd_elf32_add_dynamic_entry (info, DT_TEXTREL, 0))
2844             return false;
2845           info->flags |= DF_TEXTREL;
2846         }
2847     }
2848
2849   return true;
2850 }
2851
2852 /* This function is called via elf_cris_link_hash_traverse if we are
2853    creating a shared object.  In the -Bsymbolic case, it discards the
2854    space allocated to copy PC relative relocs against symbols which
2855    are defined in regular objects.  For the normal non-symbolic case,
2856    we also discard space for relocs that have become local due to
2857    symbol visibility changes.  We allocated space for them in the
2858    check_relocs routine, but we won't fill them in in the
2859    relocate_section routine.  */
2860
2861 static boolean
2862 elf_cris_discard_excess_dso_dynamics (h, inf)
2863      struct elf_cris_link_hash_entry *h;
2864      PTR inf;
2865 {
2866   struct elf_cris_pcrel_relocs_copied *s;
2867   struct bfd_link_info *info = (struct bfd_link_info *) inf;
2868
2869   /* If a symbol has been forced local or we have found a regular
2870      definition for the symbolic link case, then we won't be needing
2871      any relocs.  */
2872   if ((h->root.elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) != 0
2873       && ((h->root.elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) != 0
2874           || info->symbolic))
2875     {
2876       for (s = h->pcrel_relocs_copied; s != NULL; s = s->next)
2877         s->section->_raw_size -= s->count * sizeof (Elf32_External_Rela);
2878     }
2879
2880   return true;
2881 }
2882
2883 /* This function is called via elf_cris_link_hash_traverse if we are *not*
2884    creating a shared object.  We discard space for relocs for symbols put
2885    in the .got, but which we found we do not have to resolve at run-time.  */
2886
2887 static boolean
2888 elf_cris_discard_excess_program_dynamics (h, inf)
2889      struct elf_cris_link_hash_entry *h;
2890      PTR inf;
2891 {
2892   struct bfd_link_info *info = (struct bfd_link_info *) inf;
2893
2894   /* If we're not creating a shared library and have a symbol which is
2895      referred to by .got references, but the symbol is defined locally,
2896      (or rather, not referred to by a DSO and not defined by a DSO) then
2897      lose the reloc for the .got (don't allocate room for it).  */
2898   if ((h->root.elf_link_hash_flags
2899        & (ELF_LINK_HASH_REF_DYNAMIC | ELF_LINK_HASH_DEF_DYNAMIC)) == 0)
2900     {
2901       if (h->root.got.refcount > 0
2902           /* The size of this section is only valid and in sync with the
2903              various reference counts if we do dynamic; don't decrement it
2904              otherwise.  */
2905           && elf_hash_table (info)->dynamic_sections_created)
2906         {
2907           bfd *dynobj = elf_hash_table (info)->dynobj;
2908           asection *srelgot;
2909
2910           BFD_ASSERT (dynobj != NULL);
2911           
2912           srelgot = bfd_get_section_by_name (dynobj, ".rela.got");
2913
2914           BFD_ASSERT (srelgot != NULL);
2915
2916           srelgot->_raw_size -= sizeof (Elf32_External_Rela);
2917         }
2918
2919       /* If the locally-defined symbol isn't used by a DSO, then we don't
2920          have to export it as a dynamic symbol.  This was already done for
2921          functions; doing this for all symbols would presumably not
2922          introduce new problems.  */
2923       h->root.dynindx = -1;
2924     }
2925
2926   return true;
2927 }
2928
2929 /* Reject a file depending on presence and expectation of prefixed
2930    underscores on symbols.  */
2931
2932 static boolean
2933 cris_elf_object_p (abfd)
2934      bfd *abfd;
2935 {
2936   if ((elf_elfheader (abfd)->e_flags & EF_CRIS_UNDERSCORE))
2937     return (bfd_get_symbol_leading_char (abfd) == '_');
2938   else
2939     return (bfd_get_symbol_leading_char (abfd) == 0);
2940 }
2941
2942 /* Mark presence or absence of leading underscore.  */
2943
2944 static void
2945 cris_elf_final_write_processing (abfd, linker)
2946      bfd *abfd;
2947      boolean linker ATTRIBUTE_UNUSED;
2948 {
2949   if (bfd_get_symbol_leading_char (abfd) == '_')
2950     elf_elfheader (abfd)->e_flags |= EF_CRIS_UNDERSCORE;
2951   else
2952     elf_elfheader (abfd)->e_flags &= ~EF_CRIS_UNDERSCORE;
2953 }
2954
2955 /* Display the flags field.  */
2956
2957 static boolean
2958 cris_elf_print_private_bfd_data (abfd, ptr)
2959      bfd *abfd;
2960      PTR ptr;
2961 {
2962   FILE *file = (FILE *) ptr;
2963
2964   BFD_ASSERT (abfd != NULL && ptr != NULL)
2965
2966   _bfd_elf_print_private_bfd_data (abfd, ptr);
2967
2968   fprintf (file, _("private flags = %lx:"), elf_elfheader (abfd)->e_flags);
2969
2970   if (elf_elfheader (abfd)->e_flags & EF_CRIS_UNDERSCORE)
2971     fprintf (file, _(" [symbols have a _ prefix]"));
2972
2973   fputc ('\n', file);
2974   return true;
2975 }
2976
2977 /* Don't mix files with and without a leading underscore.  */
2978
2979 static boolean
2980 cris_elf_merge_private_bfd_data (ibfd, obfd)
2981      bfd *ibfd;
2982      bfd *obfd;
2983 {
2984   flagword old_flags, new_flags;
2985
2986   if (_bfd_generic_verify_endian_match (ibfd, obfd) == false)
2987     return false;
2988
2989   if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
2990       || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
2991     return true;
2992
2993   if (! elf_flags_init (obfd))
2994     {
2995       /* This happens when ld starts out with a 'blank' output file.  */
2996       elf_flags_init (obfd) = true;
2997
2998       /* Set flags according to current bfd_target.  */
2999       cris_elf_final_write_processing (obfd, false);
3000     }
3001
3002   old_flags = elf_elfheader (obfd)->e_flags;
3003   new_flags = elf_elfheader (ibfd)->e_flags;
3004
3005   /* Is this good or bad?  We'll follow with other excluding flags.  */
3006   if ((old_flags & EF_CRIS_UNDERSCORE) != (new_flags & EF_CRIS_UNDERSCORE))
3007     {
3008       (*_bfd_error_handler)
3009         ((new_flags & EF_CRIS_UNDERSCORE)
3010          ? _("%s: uses _-prefixed symbols, but writing file with non-prefixed symbols")
3011          : _("%s: uses non-prefixed symbols, but writing file with _-prefixed symbols"),
3012          bfd_get_filename (ibfd));
3013       bfd_set_error (bfd_error_bad_value);
3014       return false;
3015     }
3016
3017   return true;
3018 }
3019 \f
3020 #define ELF_ARCH                bfd_arch_cris
3021 #define ELF_MACHINE_CODE        EM_CRIS
3022 #define ELF_MAXPAGESIZE         0x2000
3023
3024 #define TARGET_LITTLE_SYM       bfd_elf32_cris_vec
3025 #define TARGET_LITTLE_NAME      "elf32-cris"
3026 #define elf_symbol_leading_char 0
3027
3028 #define elf_info_to_howto_rel                   NULL
3029 #define elf_info_to_howto                       cris_info_to_howto_rela
3030 #define elf_backend_relocate_section            cris_elf_relocate_section
3031 #define elf_backend_gc_mark_hook                cris_elf_gc_mark_hook
3032 #define elf_backend_gc_sweep_hook               cris_elf_gc_sweep_hook
3033 #define elf_backend_check_relocs                cris_elf_check_relocs
3034
3035 #define elf_backend_can_gc_sections             1
3036
3037 #define elf_backend_object_p                    cris_elf_object_p
3038 #define elf_backend_final_write_processing \
3039         cris_elf_final_write_processing
3040 #define bfd_elf32_bfd_print_private_bfd_data \
3041         cris_elf_print_private_bfd_data
3042 #define bfd_elf32_bfd_merge_private_bfd_data \
3043         cris_elf_merge_private_bfd_data
3044
3045 #define bfd_elf32_bfd_reloc_type_lookup         cris_reloc_type_lookup
3046
3047 #define bfd_elf32_bfd_link_hash_table_create \
3048         elf_cris_link_hash_table_create
3049 #define elf_backend_adjust_dynamic_symbol \
3050         elf_cris_adjust_dynamic_symbol
3051 #define elf_backend_size_dynamic_sections \
3052         elf_cris_size_dynamic_sections
3053 #define elf_backend_finish_dynamic_symbol \
3054         elf_cris_finish_dynamic_symbol
3055 #define elf_backend_finish_dynamic_sections \
3056         elf_cris_finish_dynamic_sections
3057 #define elf_backend_create_dynamic_sections \
3058         _bfd_elf_create_dynamic_sections
3059 #define bfd_elf32_bfd_final_link \
3060         _bfd_elf32_gc_common_final_link
3061 #define elf_backend_hide_symbol                 elf_cris_hide_symbol
3062
3063 #define elf_backend_want_got_plt        1
3064 #define elf_backend_plt_readonly        1
3065 #define elf_backend_want_plt_sym        0
3066 #define elf_backend_got_header_size     12
3067 #define elf_backend_plt_header_size     PLT_ENTRY_SIZE
3068
3069 /* Later, we my want to optimize RELA entries into REL entries for dynamic
3070    linking and libraries (if it's a win of any significance).  Until then,
3071    take the easy route.  */
3072 #define elf_backend_may_use_rel_p 0
3073 #define elf_backend_may_use_rela_p 1
3074
3075 #include "elf32-target.h"
3076
3077 #define INCLUDED_TARGET_FILE
3078
3079 #undef TARGET_LITTLE_SYM
3080 #undef TARGET_LITTLE_NAME
3081 #undef elf_symbol_leading_char
3082
3083 #define TARGET_LITTLE_SYM bfd_elf32_us_cris_vec
3084 #define TARGET_LITTLE_NAME "elf32-us-cris"
3085 #define elf_symbol_leading_char '_'
3086
3087 #include "elf32-target.h"