]> Git Repo - binutils.git/blob - bfd/elf32-frv.c
* procfs.c (procfs_detach): Cleanup. Print process ID, not LWP
[binutils.git] / bfd / elf32-frv.c
1 /* FRV-specific support for 32-bit ELF.
2    Copyright 2002, 2003, 2004 Free Software Foundation, Inc.
3
4 This file is part of BFD, the Binary File Descriptor library.
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
19
20 #include "bfd.h"
21 #include "sysdep.h"
22 #include "libbfd.h"
23 #include "elf-bfd.h"
24 #include "elf/frv.h"
25 #include "elf/dwarf2.h"
26 #include "hashtab.h"
27
28 /* Forward declarations.  */
29 static bfd_reloc_status_type elf32_frv_relocate_lo16
30   PARAMS ((bfd *,  Elf_Internal_Rela *, bfd_byte *, bfd_vma));
31 static bfd_reloc_status_type elf32_frv_relocate_hi16
32   PARAMS ((bfd *,  Elf_Internal_Rela *, bfd_byte *, bfd_vma));
33 static bfd_reloc_status_type elf32_frv_relocate_label24
34   PARAMS ((bfd *, asection *, Elf_Internal_Rela *, bfd_byte *, bfd_vma));
35 static bfd_reloc_status_type elf32_frv_relocate_gprel12
36   PARAMS ((struct bfd_link_info *, bfd *, asection *, Elf_Internal_Rela *,
37            bfd_byte *, bfd_vma));
38 static bfd_reloc_status_type elf32_frv_relocate_gprelu12
39   PARAMS ((struct bfd_link_info *, bfd *, asection *, Elf_Internal_Rela *,
40            bfd_byte *, bfd_vma));
41 static bfd_reloc_status_type elf32_frv_relocate_gprello
42   PARAMS ((struct bfd_link_info *, bfd *, asection *, Elf_Internal_Rela *,
43            bfd_byte *, bfd_vma));
44 static bfd_reloc_status_type elf32_frv_relocate_gprelhi
45   PARAMS ((struct bfd_link_info *, bfd *, asection *, Elf_Internal_Rela *,
46            bfd_byte *, bfd_vma));
47 static reloc_howto_type *frv_reloc_type_lookup
48   PARAMS ((bfd *, bfd_reloc_code_real_type));
49 static void frv_info_to_howto_rela
50   PARAMS ((bfd *, arelent *, Elf_Internal_Rela *));
51 static bfd_boolean elf32_frv_relocate_section
52   PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *,
53            Elf_Internal_Rela *, Elf_Internal_Sym *, asection **));
54 static bfd_boolean elf32_frv_add_symbol_hook
55   PARAMS (( bfd *, struct bfd_link_info *, Elf_Internal_Sym *,
56             const char **, flagword *, asection **, bfd_vma *));
57 static bfd_reloc_status_type frv_final_link_relocate
58   PARAMS ((reloc_howto_type *, bfd *, asection *, bfd_byte *,
59            Elf_Internal_Rela *, bfd_vma));
60 static bfd_boolean elf32_frv_gc_sweep_hook
61   PARAMS ((bfd *, struct bfd_link_info *, asection *, const
62            Elf_Internal_Rela *));
63 static asection * elf32_frv_gc_mark_hook
64   PARAMS ((asection *, struct bfd_link_info *, Elf_Internal_Rela *,
65            struct elf_link_hash_entry *, Elf_Internal_Sym *));
66 static bfd_boolean elf32_frv_check_relocs
67   PARAMS ((bfd *, struct bfd_link_info *, asection *,
68            const Elf_Internal_Rela *));
69 static int elf32_frv_machine
70   PARAMS ((bfd *));
71 static bfd_boolean elf32_frv_object_p
72   PARAMS ((bfd *));
73 static bfd_boolean frv_elf_set_private_flags
74   PARAMS ((bfd *, flagword));
75 static bfd_boolean frv_elf_copy_private_bfd_data
76   PARAMS ((bfd *, bfd *));
77 static bfd_boolean frv_elf_merge_private_bfd_data
78   PARAMS ((bfd *, bfd *));
79 static bfd_boolean frv_elf_print_private_bfd_data
80   PARAMS ((bfd *, PTR));
81
82 static reloc_howto_type elf32_frv_howto_table [] =
83 {
84   /* This reloc does nothing.  */
85   HOWTO (R_FRV_NONE,            /* type */
86          0,                     /* rightshift */
87          2,                     /* size (0 = byte, 1 = short, 2 = long) */
88          32,                    /* bitsize */
89          FALSE,                 /* pc_relative */
90          0,                     /* bitpos */
91          complain_overflow_bitfield, /* complain_on_overflow */
92          bfd_elf_generic_reloc, /* special_function */
93          "R_FRV_NONE",          /* name */
94          FALSE,                 /* partial_inplace */
95          0,                     /* src_mask */
96          0,                     /* dst_mask */
97          FALSE),                /* pcrel_offset */
98
99   /* A 32 bit absolute relocation.  */
100   HOWTO (R_FRV_32,              /* type */
101          0,                     /* rightshift */
102          2,                     /* size (0 = byte, 1 = short, 2 = long) */
103          32,                    /* bitsize */
104          FALSE,                 /* pc_relative */
105          0,                     /* bitpos */
106          complain_overflow_bitfield, /* complain_on_overflow */
107          bfd_elf_generic_reloc, /* special_function */
108          "R_FRV_32",            /* name */
109          FALSE,                 /* partial_inplace */
110          0xffffffff,            /* src_mask */
111          0xffffffff,            /* dst_mask */
112          FALSE),                /* pcrel_offset */
113
114   /* A 16 bit pc-relative relocation.  */
115   HOWTO (R_FRV_LABEL16,         /* type */
116          2,                     /* rightshift */
117          2,                     /* size (0 = byte, 1 = short, 2 = long) */
118          16,                    /* bitsize */
119          TRUE,                  /* pc_relative */
120          0,                     /* bitpos */
121          complain_overflow_signed, /* complain_on_overflow */
122          bfd_elf_generic_reloc, /* special_function */
123          "R_FRV_LABEL16",       /* name */
124          FALSE,                 /* partial_inplace */
125          0xffff,                /* src_mask */
126          0xffff,                /* dst_mask */
127          TRUE),                 /* pcrel_offset */
128
129   /* A 24-bit pc-relative relocation.  */
130   HOWTO (R_FRV_LABEL24, /* type */
131          2,                     /* rightshift */
132          2,                     /* size (0 = byte, 1 = short, 2 = long) */
133          26,                    /* bitsize */
134          TRUE,                  /* pc_relative */
135          0,                     /* bitpos */
136          complain_overflow_bitfield, /* complain_on_overflow */
137          bfd_elf_generic_reloc, /* special_function */
138          "R_FRV_LABEL24",       /* name */
139          FALSE,                 /* partial_inplace */
140          0x7e03ffff,            /* src_mask */
141          0x7e03ffff,            /* dst_mask */
142          TRUE),                 /* pcrel_offset */
143
144   HOWTO (R_FRV_LO16,            /* type */
145          0,                     /* rightshift */
146          2,                     /* size (0 = byte, 1 = short, 2 = long) */
147          16,                    /* bitsize */
148          FALSE,                 /* pc_relative */
149          0,                     /* bitpos */
150          complain_overflow_dont, /* complain_on_overflow */
151          bfd_elf_generic_reloc, /* special_function */
152          "R_FRV_LO16",          /* name */
153          FALSE,                 /* partial_inplace */
154          0xffff,                /* src_mask */
155          0xffff,                /* dst_mask */
156          FALSE),                /* pcrel_offset */
157
158   HOWTO (R_FRV_HI16,            /* type */
159          0,                     /* rightshift */
160          2,                     /* size (0 = byte, 1 = short, 2 = long) */
161          16,                    /* bitsize */
162          FALSE,                 /* pc_relative */
163          0,                     /* bitpos */
164          complain_overflow_dont, /* complain_on_overflow */
165          bfd_elf_generic_reloc, /* special_function */
166          "R_FRV_HI16",          /* name */
167          FALSE,                 /* partial_inplace */
168          0xffff,                /* src_mask */
169          0xffff,                /* dst_mask */
170          FALSE),                /* pcrel_offset */
171
172   HOWTO (R_FRV_GPREL12,         /* type */
173          0,                     /* rightshift */
174          2,                     /* size (0 = byte, 1 = short, 2 = long) */
175          12,                    /* bitsize */
176          FALSE,                 /* pc_relative */
177          0,                     /* bitpos */
178          complain_overflow_dont, /* complain_on_overflow */
179          bfd_elf_generic_reloc, /* special_function */
180          "R_FRV_GPREL12",       /* name */
181          FALSE,                 /* partial_inplace */
182          0xfff,                 /* src_mask */
183          0xfff,                 /* dst_mask */
184          FALSE),                /* pcrel_offset */
185
186   HOWTO (R_FRV_GPRELU12,        /* type */
187          0,                     /* rightshift */
188          2,                     /* size (0 = byte, 1 = short, 2 = long) */
189          12,                    /* bitsize */
190          FALSE,                 /* pc_relative */
191          0,                     /* bitpos */
192          complain_overflow_dont, /* complain_on_overflow */
193          bfd_elf_generic_reloc, /* special_function */
194          "R_FRV_GPRELU12",      /* name */
195          FALSE,                 /* partial_inplace */
196          0xfff,                 /* src_mask */
197          0x3f03f,               /* dst_mask */
198          FALSE),                /* pcrel_offset */
199
200   HOWTO (R_FRV_GPREL32,         /* type */
201          0,                     /* rightshift */
202          2,                     /* size (0 = byte, 1 = short, 2 = long) */
203          32,                    /* bitsize */
204          FALSE,                 /* pc_relative */
205          0,                     /* bitpos */
206          complain_overflow_dont, /* complain_on_overflow */
207          bfd_elf_generic_reloc, /* special_function */
208          "R_FRV_GPREL32",       /* name */
209          FALSE,                 /* partial_inplace */
210          0xffffffff,            /* src_mask */
211          0xffffffff,            /* dst_mask */
212          FALSE),                /* pcrel_offset */
213
214   HOWTO (R_FRV_GPRELHI,         /* type */
215          0,                     /* rightshift */
216          2,                     /* size (0 = byte, 1 = short, 2 = long) */
217          16,                    /* bitsize */
218          FALSE,                 /* pc_relative */
219          0,                     /* bitpos */
220          complain_overflow_dont, /* complain_on_overflow */
221          bfd_elf_generic_reloc, /* special_function */
222          "R_FRV_GPRELHI",       /* name */
223          FALSE,                 /* partial_inplace */
224          0xffff,                        /* src_mask */
225          0xffff,                /* dst_mask */
226          FALSE),                /* pcrel_offset */
227
228   HOWTO (R_FRV_GPRELLO,         /* type */
229          0,                     /* rightshift */
230          2,                     /* size (0 = byte, 1 = short, 2 = long) */
231          16,                    /* bitsize */
232          FALSE,                 /* pc_relative */
233          0,                     /* bitpos */
234          complain_overflow_dont, /* complain_on_overflow */
235          bfd_elf_generic_reloc, /* special_function */
236          "R_FRV_GPRELLO",       /* name */
237          FALSE,                 /* partial_inplace */
238          0xffff,                        /* src_mask */
239          0xffff,                /* dst_mask */
240          FALSE),                /* pcrel_offset */
241
242   /* A 12-bit signed operand with the GOT offset for the address of
243      the symbol.  */
244   HOWTO (R_FRV_GOT12,           /* type */
245          0,                     /* rightshift */
246          2,                     /* size (0 = byte, 1 = short, 2 = long) */
247          12,                    /* bitsize */
248          FALSE,                 /* pc_relative */
249          0,                     /* bitpos */
250          complain_overflow_signed, /* complain_on_overflow */
251          bfd_elf_generic_reloc, /* special_function */
252          "R_FRV_GOT12",         /* name */
253          FALSE,                 /* partial_inplace */
254          0xfff,                 /* src_mask */
255          0xfff,                 /* dst_mask */
256          FALSE),                /* pcrel_offset */
257
258   /* The upper 16 bits of the GOT offset for the address of the
259      symbol.  */
260   HOWTO (R_FRV_GOTHI,           /* type */
261          0,                     /* rightshift */
262          2,                     /* size (0 = byte, 1 = short, 2 = long) */
263          16,                    /* bitsize */
264          FALSE,                 /* pc_relative */
265          0,                     /* bitpos */
266          complain_overflow_dont, /* complain_on_overflow */
267          bfd_elf_generic_reloc, /* special_function */
268          "R_FRV_GOTHI",         /* name */
269          FALSE,                 /* partial_inplace */
270          0xffff,                        /* src_mask */
271          0xffff,                /* dst_mask */
272          FALSE),                /* pcrel_offset */
273
274   /* The lower 16 bits of the GOT offset for the address of the
275      symbol.  */
276   HOWTO (R_FRV_GOTLO,           /* type */
277          0,                     /* rightshift */
278          2,                     /* size (0 = byte, 1 = short, 2 = long) */
279          16,                    /* bitsize */
280          FALSE,                 /* pc_relative */
281          0,                     /* bitpos */
282          complain_overflow_dont, /* complain_on_overflow */
283          bfd_elf_generic_reloc, /* special_function */
284          "R_FRV_GOTLO",         /* name */
285          FALSE,                 /* partial_inplace */
286          0xffff,                /* src_mask */
287          0xffff,                /* dst_mask */
288          FALSE),                /* pcrel_offset */
289
290   /* The 32-bit address of the canonical descriptor of a function.  */
291   HOWTO (R_FRV_FUNCDESC,        /* type */
292          0,                     /* rightshift */
293          2,                     /* size (0 = byte, 1 = short, 2 = long) */
294          32,                    /* bitsize */
295          FALSE,                 /* pc_relative */
296          0,                     /* bitpos */
297          complain_overflow_bitfield, /* complain_on_overflow */
298          bfd_elf_generic_reloc, /* special_function */
299          "R_FRV_FUNCDESC",      /* name */
300          FALSE,                 /* partial_inplace */
301          0xffffffff,            /* src_mask */
302          0xffffffff,            /* dst_mask */
303          FALSE),                /* pcrel_offset */
304
305   /* A 12-bit signed operand with the GOT offset for the address of
306      canonical descriptor of a function.  */
307   HOWTO (R_FRV_FUNCDESC_GOT12,  /* type */
308          0,                     /* rightshift */
309          2,                     /* size (0 = byte, 1 = short, 2 = long) */
310          12,                    /* bitsize */
311          FALSE,                 /* pc_relative */
312          0,                     /* bitpos */
313          complain_overflow_signed, /* complain_on_overflow */
314          bfd_elf_generic_reloc, /* special_function */
315          "R_FRV_FUNCDESC_GOT12", /* name */
316          FALSE,                 /* partial_inplace */
317          0xfff,                 /* src_mask */
318          0xfff,                 /* dst_mask */
319          FALSE),                /* pcrel_offset */
320
321   /* The upper 16 bits of the GOT offset for the address of the
322      canonical descriptor of a function.  */
323   HOWTO (R_FRV_FUNCDESC_GOTHI,  /* type */
324          0,                     /* rightshift */
325          2,                     /* size (0 = byte, 1 = short, 2 = long) */
326          16,                    /* bitsize */
327          FALSE,                 /* pc_relative */
328          0,                     /* bitpos */
329          complain_overflow_dont, /* complain_on_overflow */
330          bfd_elf_generic_reloc, /* special_function */
331          "R_FRV_FUNCDESC_GOTHI", /* name */
332          FALSE,                 /* partial_inplace */
333          0xffff,                /* src_mask */
334          0xffff,                /* dst_mask */
335          FALSE),                /* pcrel_offset */
336
337   /* The lower 16 bits of the GOT offset for the address of the
338      canonical descriptor of a function.  */
339   HOWTO (R_FRV_FUNCDESC_GOTLO,  /* type */
340          0,                     /* rightshift */
341          2,                     /* size (0 = byte, 1 = short, 2 = long) */
342          16,                    /* bitsize */
343          FALSE,                 /* pc_relative */
344          0,                     /* bitpos */
345          complain_overflow_dont, /* complain_on_overflow */
346          bfd_elf_generic_reloc, /* special_function */
347          "R_FRV_FUNCDESC_GOTLO", /* name */
348          FALSE,                 /* partial_inplace */
349          0xffff,                /* src_mask */
350          0xffff,                /* dst_mask */
351          FALSE),                /* pcrel_offset */
352
353   /* The 32-bit address of the canonical descriptor of a function.  */
354   HOWTO (R_FRV_FUNCDESC_VALUE,  /* type */
355          0,                     /* rightshift */
356          2,                     /* size (0 = byte, 1 = short, 2 = long) */
357          64,                    /* bitsize */
358          FALSE,                 /* pc_relative */
359          0,                     /* bitpos */
360          complain_overflow_bitfield, /* complain_on_overflow */
361          bfd_elf_generic_reloc, /* special_function */
362          "R_FRV_FUNCDESC_VALUE", /* name */
363          FALSE,                 /* partial_inplace */
364          0xffffffff,            /* src_mask */
365          0xffffffff,            /* dst_mask */
366          FALSE),                /* pcrel_offset */
367
368   /* A 12-bit signed operand with the GOT offset for the address of
369      canonical descriptor of a function.  */
370   HOWTO (R_FRV_FUNCDESC_GOTOFF12, /* type */
371          0,                     /* rightshift */
372          2,                     /* size (0 = byte, 1 = short, 2 = long) */
373          12,                    /* bitsize */
374          FALSE,                 /* pc_relative */
375          0,                     /* bitpos */
376          complain_overflow_signed, /* complain_on_overflow */
377          bfd_elf_generic_reloc, /* special_function */
378          "R_FRV_FUNCDESC_GOTOFF12", /* name */
379          FALSE,                 /* partial_inplace */
380          0xfff,                 /* src_mask */
381          0xfff,                 /* dst_mask */
382          FALSE),                /* pcrel_offset */
383
384   /* The upper 16 bits of the GOT offset for the address of the
385      canonical descriptor of a function.  */
386   HOWTO (R_FRV_FUNCDESC_GOTOFFHI, /* type */
387          0,                     /* rightshift */
388          2,                     /* size (0 = byte, 1 = short, 2 = long) */
389          16,                    /* bitsize */
390          FALSE,                 /* pc_relative */
391          0,                     /* bitpos */
392          complain_overflow_dont, /* complain_on_overflow */
393          bfd_elf_generic_reloc, /* special_function */
394          "R_FRV_FUNCDESC_GOTOFFHI", /* name */
395          FALSE,                 /* partial_inplace */
396          0xffff,                /* src_mask */
397          0xffff,                /* dst_mask */
398          FALSE),                /* pcrel_offset */
399
400   /* The lower 16 bits of the GOT offset for the address of the
401      canonical descriptor of a function.  */
402   HOWTO (R_FRV_FUNCDESC_GOTOFFLO, /* type */
403          0,                     /* rightshift */
404          2,                     /* size (0 = byte, 1 = short, 2 = long) */
405          16,                    /* bitsize */
406          FALSE,                 /* pc_relative */
407          0,                     /* bitpos */
408          complain_overflow_dont, /* complain_on_overflow */
409          bfd_elf_generic_reloc, /* special_function */
410          "R_FRV_FUNCDESC_GOTOFFLO", /* name */
411          FALSE,                 /* partial_inplace */
412          0xffff,                /* src_mask */
413          0xffff,                /* dst_mask */
414          FALSE),                /* pcrel_offset */
415
416   /* A 12-bit signed operand with the GOT offset for the address of
417      the symbol.  */
418   HOWTO (R_FRV_GOTOFF12,        /* type */
419          0,                     /* rightshift */
420          2,                     /* size (0 = byte, 1 = short, 2 = long) */
421          12,                    /* bitsize */
422          FALSE,                 /* pc_relative */
423          0,                     /* bitpos */
424          complain_overflow_signed, /* complain_on_overflow */
425          bfd_elf_generic_reloc, /* special_function */
426          "R_FRV_GOTOFF12",      /* name */
427          FALSE,                 /* partial_inplace */
428          0xfff,                 /* src_mask */
429          0xfff,                 /* dst_mask */
430          FALSE),                /* pcrel_offset */
431
432   /* The upper 16 bits of the GOT offset for the address of the
433      symbol.  */
434   HOWTO (R_FRV_GOTOFFHI,        /* type */
435          0,                     /* rightshift */
436          2,                     /* size (0 = byte, 1 = short, 2 = long) */
437          16,                    /* bitsize */
438          FALSE,                 /* pc_relative */
439          0,                     /* bitpos */
440          complain_overflow_dont, /* complain_on_overflow */
441          bfd_elf_generic_reloc, /* special_function */
442          "R_FRV_GOTOFFHI",      /* name */
443          FALSE,                 /* partial_inplace */
444          0xffff,                /* src_mask */
445          0xffff,                /* dst_mask */
446          FALSE),                /* pcrel_offset */
447
448   /* The lower 16 bits of the GOT offset for the address of the
449      symbol.  */
450   HOWTO (R_FRV_GOTOFFLO,        /* type */
451          0,                     /* rightshift */
452          2,                     /* size (0 = byte, 1 = short, 2 = long) */
453          16,                    /* bitsize */
454          FALSE,                 /* pc_relative */
455          0,                     /* bitpos */
456          complain_overflow_dont, /* complain_on_overflow */
457          bfd_elf_generic_reloc, /* special_function */
458          "R_FRV_GOTOFFLO",      /* name */
459          FALSE,                 /* partial_inplace */
460          0xffff,                /* src_mask */
461          0xffff,                /* dst_mask */
462          FALSE),                /* pcrel_offset */
463
464 };
465
466 /* GNU extension to record C++ vtable hierarchy.  */
467 static reloc_howto_type elf32_frv_vtinherit_howto =
468   HOWTO (R_FRV_GNU_VTINHERIT,   /* type */
469          0,                     /* rightshift */
470          2,                     /* size (0 = byte, 1 = short, 2 = long) */
471          0,                     /* bitsize */
472          FALSE,                 /* pc_relative */
473          0,                     /* bitpos */
474          complain_overflow_dont, /* complain_on_overflow */
475          NULL,                  /* special_function */
476          "R_FRV_GNU_VTINHERIT", /* name */
477          FALSE,                 /* partial_inplace */
478          0,                     /* src_mask */
479          0,                     /* dst_mask */
480          FALSE);                /* pcrel_offset */
481
482   /* GNU extension to record C++ vtable member usage.  */
483 static reloc_howto_type elf32_frv_vtentry_howto =
484   HOWTO (R_FRV_GNU_VTENTRY,     /* type */
485          0,                     /* rightshift */
486          2,                     /* size (0 = byte, 1 = short, 2 = long) */
487          0,                     /* bitsize */
488          FALSE,                 /* pc_relative */
489          0,                     /* bitpos */
490          complain_overflow_dont, /* complain_on_overflow */
491          _bfd_elf_rel_vtable_reloc_fn,  /* special_function */
492          "R_FRV_GNU_VTENTRY",   /* name */
493          FALSE,                 /* partial_inplace */
494          0,                     /* src_mask */
495          0,                     /* dst_mask */
496          FALSE);                /* pcrel_offset */
497
498 /* The following 3 relocations are REL.  The only difference to the
499    entries in the table above are that partial_inplace is TRUE.  */
500 static reloc_howto_type elf32_frv_rel_32_howto =
501   HOWTO (R_FRV_32,              /* type */
502          0,                     /* rightshift */
503          2,                     /* size (0 = byte, 1 = short, 2 = long) */
504          32,                    /* bitsize */
505          FALSE,                 /* pc_relative */
506          0,                     /* bitpos */
507          complain_overflow_bitfield, /* complain_on_overflow */
508          bfd_elf_generic_reloc, /* special_function */
509          "R_FRV_32",            /* name */
510          TRUE,                  /* partial_inplace */
511          0xffffffff,            /* src_mask */
512          0xffffffff,            /* dst_mask */
513          FALSE);                /* pcrel_offset */
514
515 static reloc_howto_type elf32_frv_rel_funcdesc_howto =
516   HOWTO (R_FRV_FUNCDESC,        /* type */
517          0,                     /* rightshift */
518          2,                     /* size (0 = byte, 1 = short, 2 = long) */
519          32,                    /* bitsize */
520          FALSE,                 /* pc_relative */
521          0,                     /* bitpos */
522          complain_overflow_bitfield, /* complain_on_overflow */
523          bfd_elf_generic_reloc, /* special_function */
524          "R_FRV_FUNCDESC",      /* name */
525          TRUE,                  /* partial_inplace */
526          0xffffffff,            /* src_mask */
527          0xffffffff,            /* dst_mask */
528          FALSE);                /* pcrel_offset */
529
530 static reloc_howto_type elf32_frv_rel_funcdesc_value_howto =
531   HOWTO (R_FRV_FUNCDESC_VALUE,  /* type */
532          0,                     /* rightshift */
533          2,                     /* size (0 = byte, 1 = short, 2 = long) */
534          64,                    /* bitsize */
535          FALSE,                 /* pc_relative */
536          0,                     /* bitpos */
537          complain_overflow_bitfield, /* complain_on_overflow */
538          bfd_elf_generic_reloc, /* special_function */
539          "R_FRV_FUNCDESC_VALUE", /* name */
540          TRUE,                  /* partial_inplace */
541          0xffffffff,            /* src_mask */
542          0xffffffff,            /* dst_mask */
543          FALSE);                /* pcrel_offset */
544
545 \f
546 /* Map BFD reloc types to FRV ELF reloc types.  */
547 #if 0
548 struct frv_reloc_map
549 {
550   unsigned int bfd_reloc_val;
551   unsigned int frv_reloc_val;
552 };
553
554 static const struct frv_reloc_map frv_reloc_map [] =
555 {
556   { BFD_RELOC_NONE,           R_FRV_NONE },
557   { BFD_RELOC_32,             R_FRV_32 },
558   { BFD_RELOC_FRV_LABEL16,    R_FRV_LABEL16 },
559   { BFD_RELOC_FRV_LABEL24,    R_FRV_LABEL24 },
560   { BFD_RELOC_FRV_LO16,       R_FRV_LO16 },
561   { BFD_RELOC_FRV_HI16,       R_FRV_HI16 },
562   { BFD_RELOC_FRV_GPREL12,    R_FRV_GPREL12 },
563   { BFD_RELOC_FRV_GPRELU12,   R_FRV_GPRELU12 },
564   { BFD_RELOC_FRV_GPREL32,    R_FRV_GPREL32 },
565   { BFD_RELOC_FRV_GPRELHI,    R_FRV_GPRELHI },
566   { BFD_RELOC_FRV_GPRELLO,    R_FRV_GPRELLO },
567   { BFD_RELOC_FRV_GOT12,      R_FRV_GOT12 },
568   { BFD_RELOC_FRV_GOTHI,      R_FRV_GOTHI },
569   { BFD_RELOC_FRV_GOTLO,      R_FRV_GOTLO },
570   { BFD_RELOC_FRV_FUNCDESC,   R_FRV_FUNCDESC },
571   { BFD_RELOC_FRV_FUNCDESC_GOT12, R_FRV_FUNCDESC_GOT12 },
572   { BFD_RELOC_FRV_FUNCDESC_GOTHI, R_FRV_FUNCDESC_GOTHI },
573   { BFD_RELOC_FRV_FUNCDESC_GOTLO, R_FRV_FUNCDESC_GOTLO },
574   { BFD_RELOC_FRV_FUNCDESC_VALUE, R_FRV_FUNCDESC_VALUE },
575   { BFD_RELOC_FRV_FUNCDESC_GOTOFF12, R_FRV_FUNCDESC_GOTOFF12 },
576   { BFD_RELOC_FRV_FUNCDESC_GOTOFFHI, R_FRV_FUNCDESC_GOTOFFHI },
577   { BFD_RELOC_FRV_FUNCDESC_GOTOFFLO, R_FRV_FUNCDESC_GOTOFFLO },
578   { BFD_RELOC_FRV_GOTOFF12,   R_FRV_GOTOFF12 },
579   { BFD_RELOC_FRV_GOTOFFHI,   R_FRV_GOTOFFHI },
580   { BFD_RELOC_FRV_GOTOFFLO,   R_FRV_GOTOFFLO },
581   { BFD_RELOC_VTABLE_INHERIT, R_FRV_GNU_VTINHERIT },
582   { BFD_RELOC_VTABLE_ENTRY,   R_FRV_GNU_VTENTRY },
583 };
584 #endif
585
586 extern const bfd_target bfd_elf32_frvfdpic_vec;
587 #define IS_FDPIC(bfd) ((bfd)->xvec == &bfd_elf32_frvfdpic_vec)
588
589 /* An extension of the elf hash table data structure, containing some
590    additional FRV-specific data.  */
591 struct frvfdpic_elf_link_hash_table
592 {
593   struct elf_link_hash_table elf;
594
595   /* A pointer to the .got section.  */
596   asection *sgot;
597   /* A pointer to the .rel.got section.  */
598   asection *sgotrel;
599   /* A pointer to the .rofixup section.  */
600   asection *sgotfixup;
601   /* A pointer to the .plt section.  */
602   asection *splt;
603   /* A pointer to the .rel.plt section.  */
604   asection *spltrel;
605   /* GOT base offset.  */
606   bfd_vma got0;
607   /* Location of the first non-lazy PLT entry, i.e., the number of
608      bytes taken by lazy PLT entries.  */
609   bfd_vma plt0;
610   /* A hash table holding information about which symbols were
611      referenced with which PIC-related relocations.  */
612   struct htab *relocs_info;
613 };
614
615 /* Get the FRV ELF linker hash table from a link_info structure.  */
616
617 #define frvfdpic_hash_table(info) \
618   ((struct frvfdpic_elf_link_hash_table *) ((info)->hash))
619
620 #define frvfdpic_got_section(info) \
621   (frvfdpic_hash_table (info)->sgot)
622 #define frvfdpic_gotrel_section(info) \
623   (frvfdpic_hash_table (info)->sgotrel)
624 #define frvfdpic_gotfixup_section(info) \
625   (frvfdpic_hash_table (info)->sgotfixup)
626 #define frvfdpic_plt_section(info) \
627   (frvfdpic_hash_table (info)->splt)
628 #define frvfdpic_pltrel_section(info) \
629   (frvfdpic_hash_table (info)->spltrel)
630 #define frvfdpic_relocs_info(info) \
631   (frvfdpic_hash_table (info)->relocs_info)
632 #define frvfdpic_got_initial_offset(info) \
633   (frvfdpic_hash_table (info)->got0)
634 #define frvfdpic_plt_initial_offset(info) \
635   (frvfdpic_hash_table (info)->plt0)
636
637 /* Create an FRV ELF linker hash table.  */
638
639 static struct bfd_link_hash_table *
640 frvfdpic_elf_link_hash_table_create (bfd *abfd)
641 {
642   struct frvfdpic_elf_link_hash_table *ret;
643   bfd_size_type amt = sizeof (struct frvfdpic_elf_link_hash_table);
644
645   ret = bfd_zalloc (abfd, amt);
646   if (ret == NULL)
647     return NULL;
648
649   if (! _bfd_elf_link_hash_table_init (&ret->elf, abfd,
650                                        _bfd_elf_link_hash_newfunc))
651     {
652       free (ret);
653       return NULL;
654     }
655
656   return &ret->elf.root;
657 }
658
659 /* Decide whether a reference to a symbol can be resolved locally or
660    not.  If the symbol is protected, we want the local address, but
661    its function descriptor must be assigned by the dynamic linker.  */
662 #define FRVFDPIC_SYM_LOCAL(INFO, H) \
663   (_bfd_elf_symbol_refs_local_p ((H), (INFO), 1) \
664    || ! elf_hash_table (INFO)->dynamic_sections_created)
665 #define FRVFDPIC_FUNCDESC_LOCAL(INFO, H) \
666   ((H)->dynindx == -1 || ! elf_hash_table (INFO)->dynamic_sections_created)
667
668 /* This structure collects information on what kind of GOT, PLT or
669    function descriptors are required by relocations that reference a
670    certain symbol.  */
671 struct frvfdpic_relocs_info
672 {
673   /* The index of the symbol, as stored in the relocation r_info, if
674      we have a local symbol; -1 otherwise.  */
675   long symndx;
676   union
677   {
678     /* The input bfd in which the symbol is defined, if it's a local
679        symbol.  */
680     bfd *abfd;
681     /* If symndx == -1, the hash table entry corresponding to a global
682        symbol (even if it turns out to bind locally, in which case it
683        should ideally be replaced with section's symndx + addend).  */
684     struct elf_link_hash_entry *h;
685   } d;
686   /* The addend of the relocation that references the symbol.  */
687   bfd_vma addend;
688
689   /* The fields above are used to identify an entry.  The fields below
690      contain information on how an entry is used and, later on, which
691      locations it was assigned.  */
692   /* The following 3 fields record whether the symbol+addend above was
693      ever referenced with a GOT relocation.  The 12 suffix indicates a
694      GOT12 relocation; los is used for GOTLO relocations that are not
695      matched by a GOTHI relocation; hilo is used for GOTLO/GOTHI
696      pairs.  */
697   unsigned got12:1;
698   unsigned gotlos:1;
699   unsigned gothilo:1;
700   /* Whether a FUNCDESC relocation references symbol+addend.  */
701   unsigned fd:1;
702   /* Whether a FUNCDESC_GOT relocation references symbol+addend.  */
703   unsigned fdgot12:1;
704   unsigned fdgotlos:1;
705   unsigned fdgothilo:1;
706   /* Whether a FUNCDESC_GOTOFF relocation references symbol+addend.  */
707   unsigned fdgoff12:1;
708   unsigned fdgofflos:1;
709   unsigned fdgoffhilo:1;
710   /* Whether symbol+addend is referenced with GOTOFF12, GOTOFFLO or
711      GOTOFFHI relocations.  The addend doesn't really matter, since we
712      envision that this will only be used to check whether the symbol
713      is mapped to the same segment as the got.  */
714   unsigned gotoff:1;
715   /* Whether symbol+addend is referenced by a LABEL24 relocation.  */
716   unsigned call:1;
717   /* Whether symbol+addend is referenced by a 32 or FUNCDESC_VALUE
718      relocation.  */
719   unsigned sym:1;
720   /* Whether we need a PLT entry for a symbol.  Should be implied by
721      something like:
722      (call && symndx == -1 && ! FRVFDPIC_SYM_LOCAL (info, d.h))  */
723   unsigned plt:1;
724   /* Whether a function descriptor should be created in this link unit
725      for symbol+addend.  Should be implied by something like:
726      (plt || fdgotoff12 || fdgotofflos || fdgotofflohi
727       || ((fd || fdgot12 || fdgotlos || fdgothilo)
728           && (symndx != -1 || FRVFDPIC_FUNCDESC_LOCAL (info, d.h))))  */
729   unsigned privfd:1;
730   /* Whether a lazy PLT entry is needed for this symbol+addend.
731      Should be implied by something like:
732      (privfd && symndx == -1 && ! FRVFDPIC_SYM_LOCAL (info, d.h)
733       && ! (info->flags & DF_BIND_NOW))  */
734   unsigned lazyplt:1;
735   /* Whether we've already emitted GOT relocations and PLT entries as
736      needed for this symbol.  */
737   unsigned done:1;
738
739   /* The number of R_FRV_32, R_FRV_FUNCDESC and R_FRV_FUNCDESC_VALUE
740      relocations referencing the symbol.  */
741   unsigned relocs32, relocsfd, relocsfdv;
742
743   /* The number of .rofixups entries and dynamic relocations allocated
744      for this symbol, minus any that might have already been used.  */
745   unsigned fixups, dynrelocs;
746
747   /* The offsets of the GOT entries assigned to symbol+addend, to the
748      function descriptor's address, and to a function descriptor,
749      respectively.  Should be zero if unassigned.  The offsets are
750      counted from the value that will be assigned to the PIC register,
751      not from the beginning of the .got section.  */
752   bfd_signed_vma got_entry, fdgot_entry, fd_entry;
753   /* The offsets of the PLT entries assigned to symbol+addend,
754      non-lazy and lazy, respectively.  If unassigned, should be
755      (bfd_vma)-1.  */
756   bfd_vma plt_entry, lzplt_entry;
757 };
758
759 /* Compute a hash with the key fields of an frvfdpic_relocs_info entry.  */
760 static hashval_t
761 frvfdpic_relocs_info_hash (const void *entry_)
762 {
763   const struct frvfdpic_relocs_info *entry = entry_;
764
765   return (entry->symndx == -1
766           ? entry->d.h->root.root.hash
767           : entry->symndx + entry->d.abfd->id * 257) + entry->addend;
768 }
769
770 /* Test whether the key fields of two frvfdpic_relocs_info entries are
771    identical.  */
772 static int
773 frvfdpic_relocs_info_eq (const void *entry1, const void *entry2)
774 {
775   const struct frvfdpic_relocs_info *e1 = entry1;
776   const struct frvfdpic_relocs_info *e2 = entry2;
777
778   return e1->symndx == e2->symndx && e1->addend == e2->addend
779     && (e1->symndx == -1 ? e1->d.h == e2->d.h : e1->d.abfd == e2->d.abfd);
780 }
781
782 /* Find or create an entry in a hash table HT that matches the key
783    fields of the given ENTRY.  If it's not found, memory for a new
784    entry is allocated in ABFD's obstack.  */
785 static struct frvfdpic_relocs_info *
786 frvfdpic_relocs_info_find (struct htab *ht,
787                            bfd *abfd,
788                            const struct frvfdpic_relocs_info *entry,
789                            enum insert_option insert)
790 {
791   struct frvfdpic_relocs_info **loc =
792     (struct frvfdpic_relocs_info **) htab_find_slot (ht, entry, insert);
793
794   if (! loc)
795     return NULL;
796
797   if (*loc)
798     return *loc;
799
800   *loc = bfd_zalloc (abfd, sizeof (**loc));
801
802   if (! *loc)
803     return *loc;
804
805   (*loc)->symndx = entry->symndx;
806   (*loc)->d = entry->d;
807   (*loc)->addend = entry->addend;
808   (*loc)->plt_entry = (bfd_vma)-1;
809   (*loc)->lzplt_entry = (bfd_vma)-1;
810
811   return *loc;
812 }
813
814 /* Obtain the address of the entry in HT associated with H's symbol +
815    addend, creating a new entry if none existed.  ABFD is only used
816    for memory allocation purposes.  */
817 inline static struct frvfdpic_relocs_info *
818 frvfdpic_relocs_info_for_global (struct htab *ht,
819                                  bfd *abfd,
820                                  struct elf_link_hash_entry *h,
821                                  bfd_vma addend,
822                                  enum insert_option insert)
823 {
824   struct frvfdpic_relocs_info entry;
825
826   entry.symndx = -1;
827   entry.d.h = h;
828   entry.addend = addend;
829
830   return frvfdpic_relocs_info_find (ht, abfd, &entry, insert);
831 }
832
833 /* Obtain the address of the entry in HT associated with the SYMNDXth
834    local symbol of the input bfd ABFD, plus the addend, creating a new
835    entry if none existed.  */  
836 inline static struct frvfdpic_relocs_info *
837 frvfdpic_relocs_info_for_local (struct htab *ht,
838                                 bfd *abfd,
839                                 long symndx,
840                                 bfd_vma addend,
841                                 enum insert_option insert)
842 {
843   struct frvfdpic_relocs_info entry;
844
845   entry.symndx = symndx;
846   entry.d.abfd = abfd;
847   entry.addend = addend;
848
849   return frvfdpic_relocs_info_find (ht, abfd, &entry, insert);
850 }
851
852 /* Merge fields set by check_relocs() of two entries that end up being
853    mapped to the same (presumably global) symbol.  */
854
855 inline static void
856 frvfdpic_pic_merge_early_relocs_info (struct frvfdpic_relocs_info *e2,
857                                       struct frvfdpic_relocs_info const *e1)
858 {
859   e2->got12 |= e1->got12;
860   e2->gotlos |= e1->gotlos;
861   e2->gothilo |= e1->gothilo;
862   e2->fd |= e1->fd;
863   e2->fdgot12 |= e1->fdgot12;
864   e2->fdgotlos |= e1->fdgotlos;
865   e2->fdgothilo |= e1->fdgothilo;
866   e2->fdgoff12 |= e1->fdgoff12;
867   e2->fdgofflos |= e1->fdgofflos;
868   e2->fdgoffhilo |= e1->fdgoffhilo;
869   e2->gotoff |= e1->gotoff;
870   e2->call |= e1->call;
871   e2->sym |= e1->sym;
872
873 #if 0
874   /* These are set in _frvfdpic_count_got_plt_entries() or later, and this
875      function is only called in _frvfdpic_resolve_final_relocs_info(), that
876      runs just before it, so we don't have to worry about the fields
877      below.  */
878
879   e2->plt |= e1->plt;
880   e2->privfd |= e1->privfd;
881   e2->lazyplt |= e1->lazyplt;
882   e2->done |= e1->done;
883
884   e2->relocs32 += e1->relocs32;
885   e2->relocsfd += e1->relocsfd;
886   e2->relocsfdv += e1->relocsfdv;
887   e2->fixups += e1->fixups;
888   e2->dynrelocs += e1->dynrelocs;
889
890   if (abs (e1->got_entry) < abs (e2->got_entry))
891     e2->got_entry = e1->got_entry;
892   if (abs (e1->fdgot_entry) < abs (e2->fdgot_entry))
893     e2->fdgot_entry = e1->fdgot_entry;
894   if (abs (e1->fd_entry) < abs (e2->fd_entry))
895     e2->fd_entry = e1->fd_entry;
896
897   if (e1->plt_entry < e2->plt_entry)
898     e2->plt_entry = e1->plt_entry;
899   if (e1->lzplt_entry < e2->lzplt_entry)
900     e2->lzplt_entry = e1->lzplt_entry;
901 #endif
902 }
903
904 /* Every block of 65535 lazy PLT entries shares a single call to the
905    resolver, inserted in the 32768th lazy PLT entry (i.e., entry #
906    32767, counting from 0).  All other lazy PLT entries branch to it
907    in a single instruction.  */
908
909 #define FRVFDPIC_LZPLT_BLOCK_SIZE ((bfd_vma) 8 * 65535 + 4)
910 #define FRVFDPIC_LZPLT_RESOLV_LOC (8 * 32767)
911
912 /* Add a dynamic relocation to the SRELOC section.  */
913
914 inline static bfd_vma
915 _frvfdpic_add_dyn_reloc (bfd *output_bfd, asection *sreloc, bfd_vma offset,
916                          int reloc_type, long dynindx, bfd_vma addend,
917                          struct frvfdpic_relocs_info *entry)
918 {
919   Elf_Internal_Rela outrel;
920   bfd_vma reloc_offset;
921
922   outrel.r_offset = offset;
923   outrel.r_info = ELF32_R_INFO (dynindx, reloc_type);
924   outrel.r_addend = addend;
925
926   reloc_offset = sreloc->reloc_count * sizeof (Elf32_External_Rel);
927   BFD_ASSERT (reloc_offset < sreloc->size);
928   bfd_elf32_swap_reloc_out (output_bfd, &outrel,
929                             sreloc->contents + reloc_offset);
930   sreloc->reloc_count++;
931
932   /* If the entry's index is zero, this relocation was probably to a
933      linkonce section that got discarded.  We reserved a dynamic
934      relocation, but it was for another entry than the one we got at
935      the time of emitting the relocation.  Unfortunately there's no
936      simple way for us to catch this situation, since the relocation
937      is cleared right before calling relocate_section, at which point
938      we no longer know what the relocation used to point to.  */
939   if (entry->symndx)
940     {
941       BFD_ASSERT (entry->dynrelocs > 0);
942       entry->dynrelocs--;
943     }
944
945   return reloc_offset;
946 }
947
948 /* Add a fixup to the ROFIXUP section.  */
949
950 static bfd_vma
951 _frvfdpic_add_rofixup (bfd *output_bfd, asection *rofixup, bfd_vma offset,
952                        struct frvfdpic_relocs_info *entry)
953 {
954   bfd_vma fixup_offset;
955
956   if (rofixup->flags & SEC_EXCLUDE)
957     return -1;
958
959   fixup_offset = rofixup->reloc_count * 4;
960   if (rofixup->contents)
961     {
962       BFD_ASSERT (fixup_offset < rofixup->size);
963       bfd_put_32 (output_bfd, offset, rofixup->contents + fixup_offset);
964     }
965   rofixup->reloc_count++;
966
967   if (entry && entry->symndx)
968     {
969       /* See discussion about symndx == 0 in _frvfdpic_add_dyn_reloc
970          above.  */
971       BFD_ASSERT (entry->fixups > 0);
972       entry->fixups--;
973     }
974
975   return fixup_offset;
976 }
977
978 /* Find the segment number in which OSEC, and output section, is
979    located.  */
980
981 static unsigned
982 _frvfdpic_osec_to_segment (bfd *output_bfd, asection *osec)
983 {
984   struct elf_segment_map *m;
985   Elf_Internal_Phdr *p;
986
987   /* Find the segment that contains the output_section.  */
988   for (m = elf_tdata (output_bfd)->segment_map,
989          p = elf_tdata (output_bfd)->phdr;
990        m != NULL;
991        m = m->next, p++)
992     {
993       int i;
994
995       for (i = m->count - 1; i >= 0; i--)
996         if (m->sections[i] == osec)
997           break;
998
999       if (i >= 0)
1000         break;
1001     }
1002
1003   return p - elf_tdata (output_bfd)->phdr;
1004 }
1005
1006 inline static bfd_boolean
1007 _frvfdpic_osec_readonly_p (bfd *output_bfd, asection *osec)
1008 {
1009   unsigned seg = _frvfdpic_osec_to_segment (output_bfd, osec);
1010
1011   return ! (elf_tdata (output_bfd)->phdr[seg].p_flags & PF_W);
1012 }
1013
1014 /* Generate relocations for GOT entries, function descriptors, and
1015    code for PLT and lazy PLT entries.  */
1016
1017 inline static bfd_boolean
1018 _frvfdpic_emit_got_relocs_plt_entries (struct frvfdpic_relocs_info *entry,
1019                                        bfd *output_bfd,
1020                                        struct bfd_link_info *info,
1021                                        asection *sec,
1022                                        Elf_Internal_Sym *sym,
1023                                        bfd_vma addend)
1024                                   
1025 {
1026   bfd_vma fd_lazy_rel_offset = (bfd_vma)-1;
1027   int dynindx = -1;
1028
1029   if (entry->done)
1030     return TRUE;
1031   entry->done = 1;
1032
1033   if (entry->got_entry || entry->fdgot_entry || entry->fd_entry)
1034     {
1035       /* If the symbol is dynamic, consider it for dynamic
1036          relocations, otherwise decay to section + offset.  */
1037       if (entry->symndx == -1 && entry->d.h->dynindx != -1)
1038         dynindx = entry->d.h->dynindx;
1039       else
1040         {
1041           if (sec->output_section
1042               && ! bfd_is_abs_section (sec->output_section)
1043               && ! bfd_is_und_section (sec->output_section))
1044             dynindx = elf_section_data (sec->output_section)->dynindx;
1045           else
1046             dynindx = 0;
1047         }
1048     }
1049
1050   /* Generate relocation for GOT entry pointing to the symbol.  */
1051   if (entry->got_entry)
1052     {
1053       int idx = dynindx;
1054       bfd_vma ad = addend;
1055
1056       /* If the symbol is dynamic but binds locally, use
1057          section+offset.  */
1058       if (sec && (entry->symndx != -1
1059                   || FRVFDPIC_SYM_LOCAL (info, entry->d.h)))
1060         {
1061           if (entry->symndx == -1)
1062             ad += entry->d.h->root.u.def.value;
1063           else
1064             ad += sym->st_value;
1065           ad += sec->output_offset;
1066           if (sec->output_section && elf_section_data (sec->output_section))
1067             idx = elf_section_data (sec->output_section)->dynindx;
1068           else
1069             idx = 0;
1070         }
1071
1072       /* If we're linking an executable at a fixed address, we can
1073          omit the dynamic relocation as long as the symbol is local to
1074          this module.  */
1075       if (info->executable && !info->pie
1076           && (entry->symndx != -1
1077               || FRVFDPIC_SYM_LOCAL (info, entry->d.h)))
1078         {
1079           if (sec)
1080             ad += sec->output_section->vma;
1081           if (entry->symndx != -1
1082               || entry->d.h->root.type != bfd_link_hash_undefweak)
1083             _frvfdpic_add_rofixup (output_bfd,
1084                                    frvfdpic_gotfixup_section (info),
1085                                    frvfdpic_got_section (info)->output_section
1086                                    ->vma
1087                                    + frvfdpic_got_section (info)->output_offset
1088                                    + frvfdpic_got_initial_offset (info)
1089                                    + entry->got_entry, entry);
1090         }
1091       else
1092         _frvfdpic_add_dyn_reloc (output_bfd, frvfdpic_gotrel_section (info),
1093                                  _bfd_elf_section_offset
1094                                  (output_bfd, info,
1095                                   frvfdpic_got_section (info),
1096                                   frvfdpic_got_initial_offset (info)
1097                                   + entry->got_entry)
1098                                  + frvfdpic_got_section (info)
1099                                  ->output_section->vma
1100                                  + frvfdpic_got_section (info)->output_offset,
1101                                  R_FRV_32, idx, ad, entry);
1102         
1103       bfd_put_32 (output_bfd, ad,
1104                   frvfdpic_got_section (info)->contents
1105                   + frvfdpic_got_initial_offset (info)
1106                   + entry->got_entry);
1107     }
1108
1109   /* Generate relocation for GOT entry pointing to a canonical
1110      function descriptor.  */
1111   if (entry->fdgot_entry)
1112     {
1113       int reloc, idx;
1114       bfd_vma ad = 0;
1115       
1116       if (! (entry->symndx == -1
1117              && entry->d.h->root.type == bfd_link_hash_undefweak
1118              && FRVFDPIC_SYM_LOCAL (info, entry->d.h)))
1119         {
1120           /* If the symbol is dynamic and there may be dynamic symbol
1121              resolution because we are, or are linked with, a shared
1122              library, emit a FUNCDESC relocation such that the dynamic
1123              linker will allocate the function descriptor.  If the
1124              symbol needs a non-local function descriptor but binds
1125              locally (e.g., its visibility is protected, emit a
1126              dynamic relocation decayed to section+offset.  */
1127           if (entry->symndx == -1
1128               && ! FRVFDPIC_FUNCDESC_LOCAL (info, entry->d.h)
1129               && FRVFDPIC_SYM_LOCAL (info, entry->d.h)
1130               && !(info->executable && !info->pie))
1131             {
1132               reloc = R_FRV_FUNCDESC;
1133               idx = elf_section_data (entry->d.h->root.u.def.section
1134                                       ->output_section)->dynindx;
1135               ad = entry->d.h->root.u.def.section->output_offset
1136                 + entry->d.h->root.u.def.value;
1137             }
1138           else if (entry->symndx == -1
1139                    && ! FRVFDPIC_FUNCDESC_LOCAL (info, entry->d.h))
1140             {
1141               reloc = R_FRV_FUNCDESC;
1142               idx = dynindx;
1143               ad = addend;
1144               if (ad)
1145                 return FALSE;
1146             }
1147           else
1148             {
1149               /* Otherwise, we know we have a private function descriptor,
1150                  so reference it directly.  */
1151               if (elf_hash_table (info)->dynamic_sections_created)
1152                 BFD_ASSERT (entry->privfd);
1153               reloc = R_FRV_32;
1154               idx = elf_section_data (frvfdpic_got_section (info)
1155                                       ->output_section)->dynindx;
1156               ad = frvfdpic_got_section (info)->output_offset
1157                 + frvfdpic_got_initial_offset (info) + entry->fd_entry;
1158             }
1159
1160           /* If there is room for dynamic symbol resolution, emit the
1161              dynamic relocation.  However, if we're linking an
1162              executable at a fixed location, we won't have emitted a
1163              dynamic symbol entry for the got section, so idx will be
1164              zero, which means we can and should compute the address
1165              of the private descriptor ourselves.  */
1166           if (info->executable && !info->pie
1167               && (entry->symndx != -1
1168                   || FRVFDPIC_FUNCDESC_LOCAL (info, entry->d.h)))
1169             {
1170               ad += frvfdpic_got_section (info)->output_section->vma;
1171               _frvfdpic_add_rofixup (output_bfd,
1172                                      frvfdpic_gotfixup_section (info),
1173                                      frvfdpic_got_section (info)
1174                                      ->output_section->vma
1175                                      + frvfdpic_got_section (info)
1176                                      ->output_offset
1177                                      + frvfdpic_got_initial_offset (info)
1178                                      + entry->fdgot_entry, entry);
1179             }
1180           else
1181             _frvfdpic_add_dyn_reloc (output_bfd,
1182                                      frvfdpic_gotrel_section (info),
1183                                      _bfd_elf_section_offset
1184                                      (output_bfd, info,
1185                                       frvfdpic_got_section (info),
1186                                       frvfdpic_got_initial_offset (info)
1187                                       + entry->fdgot_entry)
1188                                      + frvfdpic_got_section (info)
1189                                      ->output_section->vma
1190                                      + frvfdpic_got_section (info)
1191                                      ->output_offset,
1192                                      reloc, idx, ad, entry);
1193         }
1194
1195       bfd_put_32 (output_bfd, ad,
1196                   frvfdpic_got_section (info)->contents
1197                   + frvfdpic_got_initial_offset (info)
1198                   + entry->fdgot_entry);
1199     }
1200
1201   /* Generate relocation to fill in a private function descriptor in
1202      the GOT.  */
1203   if (entry->fd_entry)
1204     {
1205       int idx = dynindx;
1206       bfd_vma ad = addend;
1207       bfd_vma ofst;
1208       long lowword, highword;
1209
1210       /* If the symbol is dynamic but binds locally, use
1211          section+offset.  */
1212       if (sec && (entry->symndx != -1
1213                   || FRVFDPIC_SYM_LOCAL (info, entry->d.h)))
1214         {
1215           if (entry->symndx == -1)
1216             ad += entry->d.h->root.u.def.value;
1217           else
1218             ad += sym->st_value;
1219           ad += sec->output_offset;
1220           if (sec->output_section && elf_section_data (sec->output_section))
1221             idx = elf_section_data (sec->output_section)->dynindx;
1222           else
1223             idx = 0;
1224         }
1225
1226       /* If we're linking an executable at a fixed address, we can
1227          omit the dynamic relocation as long as the symbol is local to
1228          this module.  */
1229       if (info->executable && !info->pie
1230           && (entry->symndx != -1 || FRVFDPIC_SYM_LOCAL (info, entry->d.h)))
1231         {
1232           if (sec)
1233             ad += sec->output_section->vma;
1234           ofst = 0;
1235           if (entry->symndx != -1
1236               || entry->d.h->root.type != bfd_link_hash_undefweak)
1237             {
1238               _frvfdpic_add_rofixup (output_bfd,
1239                                      frvfdpic_gotfixup_section (info),
1240                                      frvfdpic_got_section (info)
1241                                      ->output_section->vma
1242                                      + frvfdpic_got_section (info)
1243                                      ->output_offset
1244                                      + frvfdpic_got_initial_offset (info)
1245                                      + entry->fd_entry, entry);
1246               _frvfdpic_add_rofixup (output_bfd,
1247                                      frvfdpic_gotfixup_section (info),
1248                                      frvfdpic_got_section (info)
1249                                      ->output_section->vma
1250                                      + frvfdpic_got_section (info)
1251                                      ->output_offset
1252                                      + frvfdpic_got_initial_offset (info)
1253                                      + entry->fd_entry + 4, entry);
1254             }
1255         }
1256       else
1257         {
1258           ofst =
1259             _frvfdpic_add_dyn_reloc (output_bfd,
1260                                      entry->lazyplt
1261                                      ? frvfdpic_pltrel_section (info)
1262                                      : frvfdpic_gotrel_section (info),
1263                                      _bfd_elf_section_offset
1264                                      (output_bfd, info,
1265                                       frvfdpic_got_section (info),
1266                                       frvfdpic_got_initial_offset (info)
1267                                       + entry->fd_entry)
1268                                      + frvfdpic_got_section (info)
1269                                      ->output_section->vma
1270                                      + frvfdpic_got_section (info)
1271                                      ->output_offset,
1272                                      R_FRV_FUNCDESC_VALUE, idx, ad, entry);
1273         }
1274
1275       /* If we've omitted the dynamic relocation, just emit the fixed
1276          addresses of the symbol and of the local GOT base offset.  */
1277       if (info->executable && !info->pie && sec && sec->output_section)
1278         {
1279           lowword = ad;
1280           highword = frvfdpic_got_section (info)->output_section->vma
1281             + frvfdpic_got_section (info)->output_offset
1282             + frvfdpic_got_initial_offset (info);
1283         }
1284       else if (entry->lazyplt)
1285         {
1286           if (ad)
1287             return FALSE;
1288           
1289           fd_lazy_rel_offset = ofst;
1290
1291           /* A function descriptor used for lazy or local resolving is
1292              initialized such that its high word contains the output
1293              section index in which the PLT entries are located, and
1294              the low word contains the address of the lazy PLT entry
1295              entry point, that must be within the memory region
1296              assigned to that section.  */
1297           lowword = entry->lzplt_entry + 4
1298             + frvfdpic_plt_section (info)->output_offset
1299             + frvfdpic_plt_section (info)->output_section->vma;
1300           highword = _frvfdpic_osec_to_segment 
1301             (output_bfd, frvfdpic_plt_section (info)->output_section);
1302         }
1303       else
1304         {
1305           /* A function descriptor for a local function gets the index
1306              of the section.  For a non-local function, it's
1307              disregarded.  */
1308           lowword = ad;
1309           if (entry->symndx == -1 && entry->d.h->dynindx != -1
1310               && entry->d.h->dynindx == idx)
1311             highword = 0;
1312           else
1313             highword = _frvfdpic_osec_to_segment
1314               (output_bfd, sec->output_section);
1315         }
1316
1317       bfd_put_32 (output_bfd, lowword,
1318                   frvfdpic_got_section (info)->contents
1319                   + frvfdpic_got_initial_offset (info)
1320                   + entry->fd_entry);
1321       bfd_put_32 (output_bfd, highword,
1322                   frvfdpic_got_section (info)->contents
1323                   + frvfdpic_got_initial_offset (info)
1324                   + entry->fd_entry + 4);
1325     }
1326
1327   /* Generate code for the PLT entry.  */
1328   if (entry->plt_entry != (bfd_vma) -1)
1329     {
1330       bfd_byte *plt_code = frvfdpic_plt_section (info)->contents
1331         + entry->plt_entry;
1332
1333       BFD_ASSERT (entry->fd_entry);
1334
1335       /* Figure out what kind of PLT entry we need, depending on the
1336          location of the function descriptor within the GOT.  */
1337       if (entry->fd_entry >= -(1 << (12 - 1))
1338           && entry->fd_entry < (1 << (12 - 1)))
1339         {
1340           /* lddi @(gr15, fd_entry), gr14 */
1341           bfd_put_32 (output_bfd,
1342                       0x9cccf000 | (entry->fd_entry & ((1 << 12) - 1)),
1343                       plt_code);
1344           plt_code += 4;
1345         }
1346       else
1347         {
1348           if (entry->fd_entry >= -(1 << (16 - 1))
1349               && entry->fd_entry < (1 << (16 - 1)))
1350             {
1351               /* setlos lo(fd_entry), gr14 */
1352               bfd_put_32 (output_bfd,
1353                           0x9cfc0000
1354                           | (entry->fd_entry & (((bfd_vma)1 << 16) - 1)),
1355                           plt_code);
1356               plt_code += 4;
1357             }
1358           else
1359             {
1360               /* sethi.p hi(fd_entry), gr14
1361                  setlo lo(fd_entry), gr14 */
1362               bfd_put_32 (output_bfd,
1363                           0x1cf80000
1364                           | ((entry->fd_entry >> 16)
1365                              & (((bfd_vma)1 << 16) - 1)),
1366                           plt_code);
1367               bfd_put_32 (output_bfd,
1368                           0x9cf40000
1369                           | (entry->fd_entry & (((bfd_vma)1 << 16) - 1)),
1370                           plt_code);
1371               plt_code += 8;
1372             }
1373           /* ldd @(gr14,gr15),gr14 */
1374           bfd_put_32 (output_bfd, 0x9c08e14f, plt_code);
1375           plt_code += 4;
1376         }
1377       /* jmpl @(gr14,gr0) */
1378       bfd_put_32 (output_bfd, 0x8030e000, plt_code);
1379     }
1380
1381   /* Generate code for the lazy PLT entry.  */
1382   if (entry->lzplt_entry != (bfd_vma) -1)
1383     {
1384       bfd_byte *lzplt_code = frvfdpic_plt_section (info)->contents
1385         + entry->lzplt_entry;
1386       bfd_vma resolverStub_addr;
1387
1388       bfd_put_32 (output_bfd, fd_lazy_rel_offset, lzplt_code);
1389       lzplt_code += 4;
1390
1391       resolverStub_addr = entry->lzplt_entry / FRVFDPIC_LZPLT_BLOCK_SIZE
1392         * FRVFDPIC_LZPLT_BLOCK_SIZE + FRVFDPIC_LZPLT_RESOLV_LOC;
1393       if (resolverStub_addr >= frvfdpic_plt_initial_offset (info))
1394         resolverStub_addr = frvfdpic_plt_initial_offset (info) - 12;
1395
1396       if (entry->lzplt_entry == resolverStub_addr)
1397         {
1398           /* This is a lazy PLT entry that includes a resolver call.  */
1399           /* ldd @(gr15,gr0), gr4
1400              jmpl @(gr4,gr0)  */
1401           bfd_put_32 (output_bfd, 0x8808f140, lzplt_code);
1402           bfd_put_32 (output_bfd, 0x80304000, lzplt_code + 4);
1403         }
1404       else
1405         {
1406           /* bra  resolverStub */
1407           bfd_put_32 (output_bfd,
1408                       0xc01a0000
1409                       | (((resolverStub_addr - entry->lzplt_entry)
1410                           / 4) & (((bfd_vma)1 << 16) - 1)),
1411                       lzplt_code);
1412         }
1413     }
1414
1415   return TRUE;
1416 }
1417
1418 /* Handle an FRV small data reloc.  */
1419
1420 static bfd_reloc_status_type
1421 elf32_frv_relocate_gprel12 (info, input_bfd, input_section, relocation,
1422                             contents, value)
1423      struct bfd_link_info *info;
1424      bfd *input_bfd;
1425      asection *input_section;
1426      Elf_Internal_Rela *relocation;
1427      bfd_byte *contents;
1428      bfd_vma value;
1429 {
1430   bfd_vma insn;
1431   bfd_vma gp;
1432   struct bfd_link_hash_entry *h;
1433
1434   h = bfd_link_hash_lookup (info->hash, "_gp", FALSE, FALSE, TRUE);
1435
1436   gp = (h->u.def.value
1437         + h->u.def.section->output_section->vma
1438         + h->u.def.section->output_offset);
1439
1440   value -= input_section->output_section->vma;
1441   value -= (gp - input_section->output_section->vma);
1442
1443   insn = bfd_get_32 (input_bfd, contents + relocation->r_offset);
1444
1445   value += relocation->r_addend;
1446
1447   if ((long) value > 0x7ff || (long) value < -0x800)
1448     return bfd_reloc_overflow;
1449
1450   bfd_put_32 (input_bfd,
1451               (insn & 0xfffff000) | (value & 0xfff),
1452               contents + relocation->r_offset);
1453
1454   return bfd_reloc_ok;
1455 }
1456
1457 /* Handle an FRV small data reloc. for the u12 field.  */
1458
1459 static bfd_reloc_status_type
1460 elf32_frv_relocate_gprelu12 (info, input_bfd, input_section, relocation,
1461                              contents, value)
1462      struct bfd_link_info *info;
1463      bfd *input_bfd;
1464      asection *input_section;
1465      Elf_Internal_Rela *relocation;
1466      bfd_byte *contents;
1467      bfd_vma value;
1468 {
1469   bfd_vma insn;
1470   bfd_vma gp;
1471   struct bfd_link_hash_entry *h;
1472   bfd_vma mask;
1473
1474   h = bfd_link_hash_lookup (info->hash, "_gp", FALSE, FALSE, TRUE);
1475
1476   gp = (h->u.def.value
1477         + h->u.def.section->output_section->vma
1478         + h->u.def.section->output_offset);
1479
1480   value -= input_section->output_section->vma;
1481   value -= (gp - input_section->output_section->vma);
1482
1483   insn = bfd_get_32 (input_bfd, contents + relocation->r_offset);
1484
1485   value += relocation->r_addend;
1486
1487   if ((long) value > 0x7ff || (long) value < -0x800)
1488     return bfd_reloc_overflow;
1489
1490   /* The high 6 bits go into bits 17-12. The low 6 bits go into bits 5-0.  */
1491   mask = 0x3f03f;
1492   insn = (insn & ~mask) | ((value & 0xfc0) << 12) | (value & 0x3f);
1493
1494   bfd_put_32 (input_bfd, insn, contents + relocation->r_offset);
1495
1496   return bfd_reloc_ok;
1497 }
1498
1499 /* Handle an FRV ELF HI16 reloc.  */
1500
1501 static bfd_reloc_status_type
1502 elf32_frv_relocate_hi16 (input_bfd, relhi, contents, value)
1503      bfd *input_bfd;
1504      Elf_Internal_Rela *relhi;
1505      bfd_byte *contents;
1506      bfd_vma value;
1507 {
1508   bfd_vma insn;
1509
1510   insn = bfd_get_32 (input_bfd, contents + relhi->r_offset);
1511
1512   value += relhi->r_addend;
1513   value = ((value >> 16) & 0xffff);
1514
1515   insn = (insn & 0xffff0000) | value;
1516
1517   if ((long) value > 0xffff || (long) value < -0x10000)
1518     return bfd_reloc_overflow;
1519
1520   bfd_put_32 (input_bfd, insn, contents + relhi->r_offset);
1521   return bfd_reloc_ok;
1522
1523 }
1524 static bfd_reloc_status_type
1525 elf32_frv_relocate_lo16 (input_bfd, rello, contents, value)
1526      bfd *input_bfd;
1527      Elf_Internal_Rela *rello;
1528      bfd_byte *contents;
1529      bfd_vma value;
1530 {
1531   bfd_vma insn;
1532
1533   insn = bfd_get_32 (input_bfd, contents + rello->r_offset);
1534
1535   value += rello->r_addend;
1536   value = value & 0xffff;
1537
1538   insn = (insn & 0xffff0000) | value;
1539
1540   if ((long) value > 0xffff || (long) value < -0x10000)
1541     return bfd_reloc_overflow;
1542
1543   bfd_put_32 (input_bfd, insn, contents + rello->r_offset);
1544   return bfd_reloc_ok;
1545 }
1546
1547 /* Perform the relocation for the CALL label24 instruction.  */
1548
1549 static bfd_reloc_status_type
1550 elf32_frv_relocate_label24 (input_bfd, input_section, rello, contents, value)
1551      bfd *input_bfd;
1552      asection *input_section;
1553      Elf_Internal_Rela *rello;
1554      bfd_byte *contents;
1555      bfd_vma value;
1556 {
1557   bfd_vma insn;
1558   bfd_vma label6;
1559   bfd_vma label18;
1560
1561   /* The format for the call instruction is:
1562
1563     0 000000 0001111 000000000000000000
1564       label6 opcode  label18
1565
1566     The branch calculation is: pc + (4*label24)
1567     where label24 is the concatenation of label6 and label18.  */
1568
1569   /* Grab the instruction.  */
1570   insn = bfd_get_32 (input_bfd, contents + rello->r_offset);
1571
1572   value -= input_section->output_section->vma + input_section->output_offset;
1573   value -= rello->r_offset;
1574   value += rello->r_addend;
1575
1576   value = value >> 2;
1577
1578   label6  = value & 0xfc0000;
1579   label6  = label6 << 7;
1580
1581   label18 = value & 0x3ffff;
1582
1583   insn = insn & 0x803c0000;
1584   insn = insn | label6;
1585   insn = insn | label18;
1586
1587   bfd_put_32 (input_bfd, insn, contents + rello->r_offset);
1588
1589   return bfd_reloc_ok;
1590 }
1591
1592 static bfd_reloc_status_type
1593 elf32_frv_relocate_gprelhi (info, input_bfd, input_section, relocation,
1594                             contents, value)
1595      struct bfd_link_info *info;
1596      bfd *input_bfd;
1597      asection *input_section;
1598      Elf_Internal_Rela *relocation;
1599      bfd_byte *contents;
1600      bfd_vma value;
1601 {
1602   bfd_vma insn;
1603   bfd_vma gp;
1604   struct bfd_link_hash_entry *h;
1605
1606   h = bfd_link_hash_lookup (info->hash, "_gp", FALSE, FALSE, TRUE);
1607
1608   gp = (h->u.def.value
1609         + h->u.def.section->output_section->vma
1610         + h->u.def.section->output_offset);
1611
1612   value -= input_section->output_section->vma;
1613   value -= (gp - input_section->output_section->vma);
1614   value += relocation->r_addend;
1615   value = ((value >> 16) & 0xffff);
1616
1617   if ((long) value > 0xffff || (long) value < -0x10000)
1618     return bfd_reloc_overflow;
1619
1620   insn = bfd_get_32 (input_bfd, contents + relocation->r_offset);
1621   insn = (insn & 0xffff0000) | value;
1622
1623   bfd_put_32 (input_bfd, insn, contents + relocation->r_offset);
1624   return bfd_reloc_ok;
1625 }
1626
1627 static bfd_reloc_status_type
1628 elf32_frv_relocate_gprello (info, input_bfd, input_section, relocation,
1629                             contents, value)
1630      struct bfd_link_info *info;
1631      bfd *input_bfd;
1632      asection *input_section;
1633      Elf_Internal_Rela *relocation;
1634      bfd_byte *contents;
1635      bfd_vma value;
1636 {
1637   bfd_vma insn;
1638   bfd_vma gp;
1639   struct bfd_link_hash_entry *h;
1640
1641   h = bfd_link_hash_lookup (info->hash, "_gp", FALSE, FALSE, TRUE);
1642
1643   gp = (h->u.def.value
1644         + h->u.def.section->output_section->vma
1645         + h->u.def.section->output_offset);
1646
1647   value -= input_section->output_section->vma;
1648   value -= (gp - input_section->output_section->vma);
1649   value += relocation->r_addend;
1650   value = value & 0xffff;
1651
1652   if ((long) value > 0xffff || (long) value < -0x10000)
1653     return bfd_reloc_overflow;
1654
1655   insn = bfd_get_32 (input_bfd, contents + relocation->r_offset);
1656   insn = (insn & 0xffff0000) | value;
1657
1658   bfd_put_32 (input_bfd, insn, contents + relocation->r_offset);
1659
1660  return bfd_reloc_ok;
1661 }
1662
1663 static reloc_howto_type *
1664 frv_reloc_type_lookup (abfd, code)
1665      bfd *abfd ATTRIBUTE_UNUSED;
1666      bfd_reloc_code_real_type code;
1667 {
1668   switch (code)
1669     {
1670     default:
1671       break;
1672
1673     case BFD_RELOC_NONE:
1674       return &elf32_frv_howto_table[ (int) R_FRV_NONE];
1675
1676     case BFD_RELOC_32:
1677       if (elf_elfheader (abfd)->e_type == ET_EXEC
1678           || elf_elfheader (abfd)->e_type == ET_DYN)
1679         return &elf32_frv_rel_32_howto;
1680       /* Fall through.  */
1681     case BFD_RELOC_CTOR:
1682       return &elf32_frv_howto_table[ (int) R_FRV_32];
1683
1684     case BFD_RELOC_FRV_LABEL16:
1685       return &elf32_frv_howto_table[ (int) R_FRV_LABEL16];
1686
1687     case BFD_RELOC_FRV_LABEL24:
1688       return &elf32_frv_howto_table[ (int) R_FRV_LABEL24];
1689
1690     case BFD_RELOC_FRV_LO16:
1691       return &elf32_frv_howto_table[ (int) R_FRV_LO16];
1692
1693     case BFD_RELOC_FRV_HI16:
1694       return &elf32_frv_howto_table[ (int) R_FRV_HI16];
1695
1696     case BFD_RELOC_FRV_GPREL12:
1697       return &elf32_frv_howto_table[ (int) R_FRV_GPREL12];
1698
1699     case BFD_RELOC_FRV_GPRELU12:
1700       return &elf32_frv_howto_table[ (int) R_FRV_GPRELU12];
1701
1702     case BFD_RELOC_FRV_GPREL32:
1703       return &elf32_frv_howto_table[ (int) R_FRV_GPREL32];
1704
1705     case BFD_RELOC_FRV_GPRELHI:
1706       return &elf32_frv_howto_table[ (int) R_FRV_GPRELHI];
1707
1708     case BFD_RELOC_FRV_GPRELLO:
1709       return &elf32_frv_howto_table[ (int) R_FRV_GPRELLO];
1710
1711     case BFD_RELOC_FRV_GOT12:
1712       return &elf32_frv_howto_table[ (int) R_FRV_GOT12];
1713
1714     case BFD_RELOC_FRV_GOTHI:
1715       return &elf32_frv_howto_table[ (int) R_FRV_GOTHI];
1716
1717     case BFD_RELOC_FRV_GOTLO:
1718       return &elf32_frv_howto_table[ (int) R_FRV_GOTLO];
1719
1720     case BFD_RELOC_FRV_FUNCDESC:
1721       if (elf_elfheader (abfd)->e_type == ET_EXEC
1722           || elf_elfheader (abfd)->e_type == ET_DYN)
1723         return &elf32_frv_rel_funcdesc_howto;
1724       return &elf32_frv_howto_table[ (int) R_FRV_FUNCDESC];
1725
1726     case BFD_RELOC_FRV_FUNCDESC_GOT12:
1727       return &elf32_frv_howto_table[ (int) R_FRV_FUNCDESC_GOT12];
1728
1729     case BFD_RELOC_FRV_FUNCDESC_GOTHI:
1730       return &elf32_frv_howto_table[ (int) R_FRV_FUNCDESC_GOTHI];
1731
1732     case BFD_RELOC_FRV_FUNCDESC_GOTLO:
1733       return &elf32_frv_howto_table[ (int) R_FRV_FUNCDESC_GOTLO];
1734
1735     case BFD_RELOC_FRV_FUNCDESC_VALUE:
1736       if (elf_elfheader (abfd)->e_type == ET_EXEC
1737           || elf_elfheader (abfd)->e_type == ET_DYN)
1738         return &elf32_frv_rel_funcdesc_value_howto;
1739       return &elf32_frv_howto_table[ (int) R_FRV_FUNCDESC_VALUE];
1740
1741     case BFD_RELOC_FRV_FUNCDESC_GOTOFF12:
1742       return &elf32_frv_howto_table[ (int) R_FRV_FUNCDESC_GOTOFF12];
1743
1744     case BFD_RELOC_FRV_FUNCDESC_GOTOFFHI:
1745       return &elf32_frv_howto_table[ (int) R_FRV_FUNCDESC_GOTOFFHI];
1746
1747     case BFD_RELOC_FRV_FUNCDESC_GOTOFFLO:
1748       return &elf32_frv_howto_table[ (int) R_FRV_FUNCDESC_GOTOFFLO];
1749
1750     case BFD_RELOC_FRV_GOTOFF12:
1751       return &elf32_frv_howto_table[ (int) R_FRV_GOTOFF12];
1752
1753     case BFD_RELOC_FRV_GOTOFFHI:
1754       return &elf32_frv_howto_table[ (int) R_FRV_GOTOFFHI];
1755
1756     case BFD_RELOC_FRV_GOTOFFLO:
1757       return &elf32_frv_howto_table[ (int) R_FRV_GOTOFFLO];
1758
1759     case BFD_RELOC_VTABLE_INHERIT:
1760       return &elf32_frv_vtinherit_howto;
1761
1762     case BFD_RELOC_VTABLE_ENTRY:
1763       return &elf32_frv_vtentry_howto;
1764     }
1765
1766   return NULL;
1767 }
1768
1769 /* Set the howto pointer for an FRV ELF reloc.  */
1770
1771 static void
1772 frv_info_to_howto_rela (abfd, cache_ptr, dst)
1773      bfd *abfd ATTRIBUTE_UNUSED;
1774      arelent *cache_ptr;
1775      Elf_Internal_Rela *dst;
1776 {
1777   unsigned int r_type;
1778
1779   r_type = ELF32_R_TYPE (dst->r_info);
1780   switch (r_type)
1781     {
1782     case R_FRV_GNU_VTINHERIT:
1783       cache_ptr->howto = &elf32_frv_vtinherit_howto;
1784       break;
1785
1786     case R_FRV_GNU_VTENTRY:
1787       cache_ptr->howto = &elf32_frv_vtentry_howto;
1788       break;
1789
1790     default:
1791       cache_ptr->howto = & elf32_frv_howto_table [r_type];
1792       break;
1793     }
1794 }
1795
1796 /* Set the howto pointer for an FRV ELF REL reloc.  */
1797 static void
1798 frvfdpic_info_to_howto_rel (bfd *abfd ATTRIBUTE_UNUSED,
1799                             arelent *cache_ptr, Elf_Internal_Rela *dst)
1800 {
1801   unsigned int r_type;
1802
1803   r_type = ELF32_R_TYPE (dst->r_info);
1804   switch (r_type)
1805     {
1806     case R_FRV_32:
1807       cache_ptr->howto = &elf32_frv_rel_32_howto;
1808       break;
1809
1810     case R_FRV_FUNCDESC:
1811       cache_ptr->howto = &elf32_frv_rel_funcdesc_howto;
1812       break;
1813
1814     case R_FRV_FUNCDESC_VALUE:
1815       cache_ptr->howto = &elf32_frv_rel_funcdesc_value_howto;
1816       break;
1817
1818     default:
1819       cache_ptr->howto = NULL;
1820       break;
1821     }
1822 }
1823 \f
1824 /* Perform a single relocation.  By default we use the standard BFD
1825    routines, but a few relocs, we have to do them ourselves.  */
1826
1827 static bfd_reloc_status_type
1828 frv_final_link_relocate (howto, input_bfd, input_section, contents, rel,
1829                          relocation)
1830      reloc_howto_type *howto;
1831      bfd *input_bfd;
1832      asection *input_section;
1833      bfd_byte *contents;
1834      Elf_Internal_Rela *rel;
1835      bfd_vma relocation;
1836 {
1837   return _bfd_final_link_relocate (howto, input_bfd, input_section,
1838                                    contents, rel->r_offset, relocation,
1839                                    rel->r_addend);
1840 }
1841
1842 \f
1843 /* Relocate an FRV ELF section.
1844
1845    The RELOCATE_SECTION function is called by the new ELF backend linker
1846    to handle the relocations for a section.
1847
1848    The relocs are always passed as Rela structures; if the section
1849    actually uses Rel structures, the r_addend field will always be
1850    zero.
1851
1852    This function is responsible for adjusting the section contents as
1853    necessary, and (if using Rela relocs and generating a relocatable
1854    output file) adjusting the reloc addend as necessary.
1855
1856    This function does not have to worry about setting the reloc
1857    address or the reloc symbol index.
1858
1859    LOCAL_SYMS is a pointer to the swapped in local symbols.
1860
1861    LOCAL_SECTIONS is an array giving the section in the input file
1862    corresponding to the st_shndx field of each local symbol.
1863
1864    The global hash table entry for the global symbols can be found
1865    via elf_sym_hashes (input_bfd).
1866
1867    When generating relocatable output, this function must handle
1868    STB_LOCAL/STT_SECTION symbols specially.  The output symbol is
1869    going to be the section symbol corresponding to the output
1870    section, which means that the addend must be adjusted
1871    accordingly.  */
1872
1873 static bfd_boolean
1874 elf32_frv_relocate_section (output_bfd, info, input_bfd, input_section,
1875                             contents, relocs, local_syms, local_sections)
1876      bfd *output_bfd ATTRIBUTE_UNUSED;
1877      struct bfd_link_info *info;
1878      bfd *input_bfd;
1879      asection *input_section;
1880      bfd_byte *contents;
1881      Elf_Internal_Rela *relocs;
1882      Elf_Internal_Sym *local_syms;
1883      asection **local_sections;
1884 {
1885   Elf_Internal_Shdr *symtab_hdr;
1886   struct elf_link_hash_entry **sym_hashes;
1887   Elf_Internal_Rela *rel;
1888   Elf_Internal_Rela *relend;
1889   unsigned isec_segment, got_segment, plt_segment, gprel_segment,
1890     check_segment[2];
1891   int silence_segment_error = !(info->shared || info->pie);
1892
1893   if (info->relocatable)
1894     return TRUE;
1895
1896   symtab_hdr = & elf_tdata (input_bfd)->symtab_hdr;
1897   sym_hashes = elf_sym_hashes (input_bfd);
1898   relend     = relocs + input_section->reloc_count;
1899
1900   isec_segment = _frvfdpic_osec_to_segment (output_bfd,
1901                                             input_section->output_section);
1902   if (IS_FDPIC (output_bfd) && frvfdpic_got_section (info))
1903     got_segment = _frvfdpic_osec_to_segment (output_bfd,
1904                                              frvfdpic_got_section (info)
1905                                              ->output_section);
1906   else
1907     got_segment = -1;
1908   if (IS_FDPIC (output_bfd) && frvfdpic_gotfixup_section (info))
1909     gprel_segment = _frvfdpic_osec_to_segment (output_bfd,
1910                                                frvfdpic_gotfixup_section (info)
1911                                                ->output_section);
1912   else
1913     gprel_segment = -1;
1914   if (IS_FDPIC (output_bfd) && elf_hash_table (info)->dynamic_sections_created)
1915     plt_segment = _frvfdpic_osec_to_segment (output_bfd,
1916                                              frvfdpic_plt_section (info)
1917                                              ->output_section);
1918   else
1919     plt_segment = -1;
1920
1921   for (rel = relocs; rel < relend; rel ++)
1922     {
1923       reloc_howto_type *howto;
1924       unsigned long r_symndx;
1925       Elf_Internal_Sym *sym;
1926       asection *sec;
1927       struct elf_link_hash_entry *h;
1928       bfd_vma relocation;
1929       bfd_reloc_status_type r;
1930       const char * name = NULL;
1931       int r_type;
1932       asection *osec;
1933       struct frvfdpic_relocs_info *picrel;
1934       bfd_vma orig_addend = rel->r_addend;
1935
1936       r_type = ELF32_R_TYPE (rel->r_info);
1937
1938       if (   r_type == R_FRV_GNU_VTINHERIT
1939           || r_type == R_FRV_GNU_VTENTRY)
1940         continue;
1941
1942       /* This is a final link.  */
1943       r_symndx = ELF32_R_SYM (rel->r_info);
1944       howto  = elf32_frv_howto_table + ELF32_R_TYPE (rel->r_info);
1945       h      = NULL;
1946       sym    = NULL;
1947       sec    = NULL;
1948
1949       if (r_symndx < symtab_hdr->sh_info)
1950         {
1951           sym = local_syms + r_symndx;
1952           osec = sec = local_sections [r_symndx];
1953           relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
1954
1955           name = bfd_elf_string_from_elf_section
1956             (input_bfd, symtab_hdr->sh_link, sym->st_name);
1957           name = (name == NULL) ? bfd_section_name (input_bfd, sec) : name;
1958         }
1959       else
1960         {
1961           h = sym_hashes [r_symndx - symtab_hdr->sh_info];
1962
1963           while (h->root.type == bfd_link_hash_indirect
1964                  || h->root.type == bfd_link_hash_warning)
1965             h = (struct elf_link_hash_entry *) h->root.u.i.link;
1966
1967           name = h->root.root.string;
1968
1969           if ((h->root.type == bfd_link_hash_defined
1970                || h->root.type == bfd_link_hash_defweak)
1971               && ! FRVFDPIC_SYM_LOCAL (info, h))
1972             {
1973               sec = NULL;
1974               relocation = 0;
1975             }
1976           else
1977           if (h->root.type == bfd_link_hash_defined
1978               || h->root.type == bfd_link_hash_defweak)
1979             {
1980               sec = h->root.u.def.section;
1981               relocation = (h->root.u.def.value
1982                             + sec->output_section->vma
1983                             + sec->output_offset);
1984             }
1985           else if (h->root.type == bfd_link_hash_undefweak)
1986             {
1987               relocation = 0;
1988             }
1989           else if (info->unresolved_syms_in_objects == RM_IGNORE
1990                    && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
1991             relocation = 0;
1992           else
1993             {
1994               if (! ((*info->callbacks->undefined_symbol)
1995                      (info, h->root.root.string, input_bfd,
1996                       input_section, rel->r_offset,
1997                       (info->unresolved_syms_in_objects == RM_GENERATE_ERROR
1998                        || ELF_ST_VISIBILITY (h->other)))))
1999                 return FALSE;
2000               relocation = 0;
2001             }
2002           osec = sec;
2003         }
2004
2005       switch (r_type)
2006         {
2007         case R_FRV_LABEL24:
2008         case R_FRV_32:
2009           if (! IS_FDPIC (output_bfd))
2010             goto non_fdpic;
2011
2012         case R_FRV_GOT12:
2013         case R_FRV_GOTHI:
2014         case R_FRV_GOTLO:
2015         case R_FRV_FUNCDESC_GOT12:
2016         case R_FRV_FUNCDESC_GOTHI:
2017         case R_FRV_FUNCDESC_GOTLO:
2018         case R_FRV_GOTOFF12:
2019         case R_FRV_GOTOFFHI:
2020         case R_FRV_GOTOFFLO:
2021         case R_FRV_FUNCDESC_GOTOFF12:
2022         case R_FRV_FUNCDESC_GOTOFFHI:
2023         case R_FRV_FUNCDESC_GOTOFFLO:
2024         case R_FRV_FUNCDESC:
2025         case R_FRV_FUNCDESC_VALUE:
2026           if (h != NULL)
2027             picrel = frvfdpic_relocs_info_for_global (frvfdpic_relocs_info
2028                                                       (info), input_bfd, h,
2029                                                       orig_addend, INSERT);
2030           else
2031             /* In order to find the entry we created before, we must
2032                use the original addend, not the one that may have been
2033                modified by _bfd_elf_rela_local_sym().  */
2034             picrel = frvfdpic_relocs_info_for_local (frvfdpic_relocs_info
2035                                                      (info), input_bfd, r_symndx,
2036                                                      orig_addend, INSERT);
2037           if (! picrel)
2038             return FALSE;
2039
2040           if (!_frvfdpic_emit_got_relocs_plt_entries (picrel, output_bfd, info,
2041                                                       osec, sym,
2042                                                       rel->r_addend))
2043             {
2044               (*_bfd_error_handler)
2045                 (_("%s: relocation at `%s+0x%x' references symbol `%s' with nonzero addend"),
2046                  bfd_archive_filename (input_bfd), input_section->name,
2047                  rel->r_offset, name);
2048               return FALSE;
2049
2050             }
2051
2052           break;
2053
2054         default:
2055         non_fdpic:
2056           picrel = NULL;
2057           if (h && ! FRVFDPIC_SYM_LOCAL (info, h))
2058             {
2059               info->callbacks->warning
2060                 (info, _("relocation references symbol not defined in the module"),
2061                  name, input_bfd, input_section, rel->r_offset);
2062               return FALSE;
2063             }
2064           break;
2065         }
2066
2067       switch (r_type)
2068         {
2069         case R_FRV_LABEL24:
2070           check_segment[0] = isec_segment;
2071           if (! IS_FDPIC (output_bfd))
2072             check_segment[1] = isec_segment;
2073           else if (picrel->plt)
2074             {
2075               relocation = frvfdpic_plt_section (info)->output_section->vma
2076                 + frvfdpic_plt_section (info)->output_offset
2077                 + picrel->plt_entry;
2078               check_segment[1] = plt_segment;
2079             }
2080           /* We don't want to warn on calls to undefined weak symbols,
2081              as calls to them must be protected by non-NULL tests
2082              anyway, and unprotected calls would invoke undefined
2083              behavior.  */
2084           else if (picrel->symndx == -1
2085                    && picrel->d.h->root.type == bfd_link_hash_undefweak)
2086             check_segment[1] = check_segment[0];
2087           else
2088             check_segment[1] = sec
2089               ? _frvfdpic_osec_to_segment (output_bfd, sec->output_section)
2090               : (unsigned)-1;
2091           break;
2092
2093         case R_FRV_GOT12:
2094         case R_FRV_GOTHI:
2095         case R_FRV_GOTLO:
2096           relocation = picrel->got_entry;
2097           check_segment[0] = check_segment[1] = got_segment;
2098           break;
2099           
2100         case R_FRV_FUNCDESC_GOT12:
2101         case R_FRV_FUNCDESC_GOTHI:
2102         case R_FRV_FUNCDESC_GOTLO:
2103           relocation = picrel->fdgot_entry;
2104           check_segment[0] = check_segment[1] = got_segment;
2105           break;
2106           
2107         case R_FRV_GOTOFFHI:
2108         case R_FRV_GOTOFF12:
2109         case R_FRV_GOTOFFLO:
2110           relocation -= frvfdpic_got_section (info)->output_section->vma
2111             + frvfdpic_got_section (info)->output_offset
2112             + frvfdpic_got_initial_offset (info);
2113           check_segment[0] = got_segment;
2114           check_segment[1] = sec
2115             ? _frvfdpic_osec_to_segment (output_bfd, sec->output_section)
2116             : (unsigned)-1;
2117           break;
2118
2119         case R_FRV_FUNCDESC_GOTOFF12:
2120         case R_FRV_FUNCDESC_GOTOFFHI:
2121         case R_FRV_FUNCDESC_GOTOFFLO:
2122           relocation = picrel->fd_entry;
2123           check_segment[0] = check_segment[1] = got_segment;
2124           break;
2125
2126         case R_FRV_FUNCDESC:
2127           {
2128             int dynindx;
2129             bfd_vma addend = rel->r_addend;
2130
2131             if (! (h && h->root.type == bfd_link_hash_undefweak
2132                    && FRVFDPIC_SYM_LOCAL (info, h)))
2133               {
2134                 /* If the symbol is dynamic and there may be dynamic
2135                    symbol resolution because we are or are linked with a
2136                    shared library, emit a FUNCDESC relocation such that
2137                    the dynamic linker will allocate the function
2138                    descriptor.  If the symbol needs a non-local function
2139                    descriptor but binds locally (e.g., its visibility is
2140                    protected, emit a dynamic relocation decayed to
2141                    section+offset.  */
2142                 if (h && ! FRVFDPIC_FUNCDESC_LOCAL (info, h)
2143                     && FRVFDPIC_SYM_LOCAL (info, h)
2144                     && !(info->executable && !info->pie))
2145                   {
2146                     dynindx = elf_section_data (h->root.u.def.section
2147                                                 ->output_section)->dynindx;
2148                     addend += h->root.u.def.section->output_offset
2149                       + h->root.u.def.value;
2150                   }
2151                 else if (h && ! FRVFDPIC_FUNCDESC_LOCAL (info, h))
2152                   {
2153                     if (addend)
2154                       {
2155                         info->callbacks->warning
2156                           (info, _("R_FRV_FUNCDESC references dynamic symbol with nonzero addend"),
2157                            name, input_bfd, input_section, rel->r_offset);
2158                         return FALSE;
2159                       }
2160                     dynindx = h->dynindx;
2161                   }
2162                 else
2163                   {
2164                     /* Otherwise, we know we have a private function
2165                        descriptor, so reference it directly.  */
2166                     BFD_ASSERT (picrel->privfd);
2167                     r_type = R_FRV_32;
2168                     dynindx = elf_section_data (frvfdpic_got_section (info)
2169                                                 ->output_section)->dynindx;
2170                     addend = frvfdpic_got_section (info)->output_offset
2171                       + frvfdpic_got_initial_offset (info)
2172                       + picrel->fd_entry;
2173                   }
2174
2175                 /* If there is room for dynamic symbol resolution, emit
2176                    the dynamic relocation.  However, if we're linking an
2177                    executable at a fixed location, we won't have emitted a
2178                    dynamic symbol entry for the got section, so idx will
2179                    be zero, which means we can and should compute the
2180                    address of the private descriptor ourselves.  */
2181                 if (info->executable && !info->pie
2182                     && (!h || FRVFDPIC_FUNCDESC_LOCAL (info, h)))
2183                   {
2184                     addend += frvfdpic_got_section (info)->output_section->vma;
2185                     if ((bfd_get_section_flags (output_bfd,
2186                                                 input_section->output_section)
2187                          & (SEC_ALLOC | SEC_LOAD)) == (SEC_ALLOC | SEC_LOAD))
2188                       {
2189                         if (_frvfdpic_osec_readonly_p (output_bfd,
2190                                                        input_section
2191                                                        ->output_section))
2192                           {
2193                             info->callbacks->warning
2194                               (info,
2195                                _("cannot emit fixups in read-only section"),
2196                                name, input_bfd, input_section, rel->r_offset);
2197                             return FALSE;
2198                           }
2199                         _frvfdpic_add_rofixup (output_bfd,
2200                                                frvfdpic_gotfixup_section
2201                                                (info),
2202                                                _bfd_elf_section_offset
2203                                                (output_bfd, info,
2204                                                 input_section, rel->r_offset)
2205                                                + input_section
2206                                                ->output_section->vma
2207                                                + input_section->output_offset,
2208                                                picrel);
2209                       }
2210                   }
2211                 else if ((bfd_get_section_flags (output_bfd,
2212                                                  input_section->output_section)
2213                           & (SEC_ALLOC | SEC_LOAD)) == (SEC_ALLOC | SEC_LOAD))
2214                   {
2215                     if (_frvfdpic_osec_readonly_p (output_bfd,
2216                                                    input_section
2217                                                    ->output_section))
2218                       {
2219                         info->callbacks->warning
2220                           (info,
2221                            _("cannot emit dynamic relocations in read-only section"),
2222                            name, input_bfd, input_section, rel->r_offset);
2223                         return FALSE;
2224                       }
2225                     _frvfdpic_add_dyn_reloc (output_bfd,
2226                                              frvfdpic_gotrel_section (info),
2227                                              _bfd_elf_section_offset
2228                                              (output_bfd, info,
2229                                               input_section, rel->r_offset)
2230                                              + input_section
2231                                              ->output_section->vma
2232                                              + input_section->output_offset,
2233                                              r_type, dynindx, addend, picrel);
2234                   }
2235                 else
2236                   addend += frvfdpic_got_section (info)->output_section->vma;
2237               }
2238
2239             /* We want the addend in-place because dynamic
2240                relocations are REL.  Setting relocation to it should
2241                arrange for it to be installed.  */
2242             relocation = addend - rel->r_addend;
2243           }
2244           check_segment[0] = check_segment[1] = got_segment;
2245           break;
2246
2247         case R_FRV_32:
2248           if (! IS_FDPIC (output_bfd))
2249             {
2250               check_segment[0] = check_segment[1] = -1;
2251               break;
2252             }
2253           /* Fall through.  */
2254         case R_FRV_FUNCDESC_VALUE:
2255           {
2256             int dynindx;
2257             bfd_vma addend = rel->r_addend;
2258
2259             /* If the symbol is dynamic but binds locally, use
2260                section+offset.  */
2261             if (h && ! FRVFDPIC_SYM_LOCAL (info, h))
2262               {
2263                 if (addend && r_type == R_FRV_FUNCDESC_VALUE)
2264                   {
2265                     info->callbacks->warning
2266                       (info, _("R_FRV_FUNCDESC_VALUE references dynamic symbol with nonzero addend"),
2267                        name, input_bfd, input_section, rel->r_offset);
2268                     return FALSE;
2269                   }
2270                 dynindx = h->dynindx;
2271               }
2272             else
2273               {
2274                 if (h)
2275                   addend += h->root.u.def.value;
2276                 else
2277                   addend += sym->st_value;
2278                 if (osec)
2279                   addend += osec->output_offset;
2280                 if (osec && osec->output_section
2281                     && ! bfd_is_abs_section (osec->output_section)
2282                     && ! bfd_is_und_section (osec->output_section))
2283                   dynindx = elf_section_data (osec->output_section)->dynindx;
2284                 else
2285                   dynindx = 0;
2286               }
2287
2288             /* If we're linking an executable at a fixed address, we
2289                can omit the dynamic relocation as long as the symbol
2290                is defined in the current link unit (which is implied
2291                by its output section not being NULL).  */
2292             if (info->executable && !info->pie
2293                 && (!h || FRVFDPIC_SYM_LOCAL (info, h)))
2294               {
2295                 if (osec)
2296                   addend += osec->output_section->vma;
2297                 if (IS_FDPIC (input_bfd)
2298                     && (bfd_get_section_flags (output_bfd,
2299                                                input_section->output_section)
2300                         & (SEC_ALLOC | SEC_LOAD)) == (SEC_ALLOC | SEC_LOAD))
2301                   {
2302                     if (_frvfdpic_osec_readonly_p (output_bfd,
2303                                                    input_section
2304                                                    ->output_section))
2305                       {
2306                         info->callbacks->warning
2307                           (info,
2308                            _("cannot emit fixups in read-only section"),
2309                            name, input_bfd, input_section, rel->r_offset);
2310                         return FALSE;
2311                       }
2312                     if (!h || h->root.type != bfd_link_hash_undefweak)
2313                       {
2314                         _frvfdpic_add_rofixup (output_bfd,
2315                                                frvfdpic_gotfixup_section
2316                                                (info),
2317                                                _bfd_elf_section_offset
2318                                                (output_bfd, info,
2319                                                 input_section, rel->r_offset)
2320                                                + input_section
2321                                                ->output_section->vma
2322                                                + input_section->output_offset,
2323                                                picrel);
2324                         if (r_type == R_FRV_FUNCDESC_VALUE)
2325                           _frvfdpic_add_rofixup
2326                             (output_bfd,
2327                              frvfdpic_gotfixup_section (info),
2328                              _bfd_elf_section_offset
2329                              (output_bfd, info,
2330                               input_section, rel->r_offset)
2331                              + input_section->output_section->vma
2332                              + input_section->output_offset + 4, picrel);
2333                       }
2334                   }
2335               }
2336             else
2337               {
2338                 if ((bfd_get_section_flags (output_bfd,
2339                                             input_section->output_section)
2340                      & (SEC_ALLOC | SEC_LOAD)) == (SEC_ALLOC | SEC_LOAD))
2341                   {
2342                     if (_frvfdpic_osec_readonly_p (output_bfd,
2343                                                    input_section
2344                                                    ->output_section))
2345                       {
2346                         info->callbacks->warning
2347                           (info,
2348                            _("cannot emit dynamic relocations in read-only section"),
2349                            name, input_bfd, input_section, rel->r_offset);
2350                         return FALSE;
2351                       }
2352                     _frvfdpic_add_dyn_reloc (output_bfd,
2353                                              frvfdpic_gotrel_section (info),
2354                                              _bfd_elf_section_offset
2355                                              (output_bfd, info,
2356                                               input_section, rel->r_offset)
2357                                              + input_section
2358                                              ->output_section->vma
2359                                              + input_section->output_offset,
2360                                              r_type, dynindx, addend, picrel);
2361                   }
2362                 else if (osec)
2363                   addend += osec->output_section->vma;
2364                 /* We want the addend in-place because dynamic
2365                    relocations are REL.  Setting relocation to it
2366                    should arrange for it to be installed.  */
2367                 relocation = addend - rel->r_addend;
2368               }
2369
2370             if (r_type == R_FRV_FUNCDESC_VALUE)
2371               {
2372                 /* If we've omitted the dynamic relocation, just emit
2373                    the fixed addresses of the symbol and of the local
2374                    GOT base offset.  */
2375                 if (info->executable && !info->pie
2376                     && (!h || FRVFDPIC_SYM_LOCAL (info, h)))
2377                   bfd_put_32 (output_bfd,
2378                               frvfdpic_got_section (info)->output_section->vma
2379                               + frvfdpic_got_section (info)->output_offset
2380                               + frvfdpic_got_initial_offset (info),
2381                               contents + rel->r_offset + 4);
2382                 else
2383                   /* A function descriptor used for lazy or local
2384                      resolving is initialized such that its high word
2385                      contains the output section index in which the
2386                      PLT entries are located, and the low word
2387                      contains the offset of the lazy PLT entry entry
2388                      point into that section.  */
2389                   bfd_put_32 (output_bfd,
2390                               h && ! FRVFDPIC_SYM_LOCAL (info, h)
2391                               ? 0
2392                               : _frvfdpic_osec_to_segment (output_bfd,
2393                                                            sec
2394                                                            ->output_section),
2395                               contents + rel->r_offset + 4);
2396               }
2397           }
2398           check_segment[0] = check_segment[1] = got_segment;
2399           break;
2400
2401         case R_FRV_GPREL12:
2402         case R_FRV_GPRELU12:
2403         case R_FRV_GPREL32:
2404         case R_FRV_GPRELHI:
2405         case R_FRV_GPRELLO:
2406           check_segment[0] = gprel_segment;
2407           check_segment[1] = sec
2408             ? _frvfdpic_osec_to_segment (output_bfd, sec->output_section)
2409             : (unsigned)-1;
2410           break;
2411
2412         default:
2413           check_segment[0] = isec_segment;
2414           check_segment[1] = sec
2415             ? _frvfdpic_osec_to_segment (output_bfd, sec->output_section)
2416             : (unsigned)-1;
2417           break;
2418         }
2419
2420       if (check_segment[0] != check_segment[1] && IS_FDPIC (output_bfd))
2421         {
2422 #if 1 /* If you take this out, remove the #error from fdpic-static-6.d
2423          in the ld testsuite.  */
2424           /* This helps catch problems in GCC while we can't do more
2425              than static linking.  The idea is to test whether the
2426              input file basename is crt0.o only once.  */
2427           if (silence_segment_error == 1)
2428             silence_segment_error =
2429               (strlen (input_bfd->filename) == 6
2430                && strcmp (input_bfd->filename, "crt0.o") == 0)
2431               || (strlen (input_bfd->filename) > 6
2432                   && strcmp (input_bfd->filename
2433                              + strlen (input_bfd->filename) - 7,
2434                              "/crt0.o") == 0)
2435               ? -1 : 0;
2436 #endif
2437           if (!silence_segment_error
2438               /* We don't want duplicate errors for undefined
2439                  symbols.  */
2440               && !(picrel && picrel->symndx == -1
2441                    && picrel->d.h->root.type == bfd_link_hash_undefined))
2442             info->callbacks->warning
2443               (info,
2444                (info->shared || info->pie)
2445                ? _("relocations between different segments are not supported")
2446                : _("warning: relocation references a different segment"),
2447                name, input_bfd, input_section, rel->r_offset);
2448           if (!silence_segment_error && (info->shared || info->pie))
2449             return FALSE;
2450           elf_elfheader (output_bfd)->e_flags |= EF_FRV_PIC;
2451         }
2452
2453       switch (r_type)
2454         {
2455         case R_FRV_GOTOFFHI:
2456           /* We need the addend to be applied before we shift the
2457              value right.  */
2458           relocation += rel->r_addend;
2459           /* Fall through.  */
2460         case R_FRV_GOTHI:
2461         case R_FRV_FUNCDESC_GOTHI:
2462         case R_FRV_FUNCDESC_GOTOFFHI:
2463           relocation >>= 16;
2464           /* Fall through.  */
2465
2466         case R_FRV_GOTLO:
2467         case R_FRV_FUNCDESC_GOTLO:
2468         case R_FRV_GOTOFFLO:
2469         case R_FRV_FUNCDESC_GOTOFFLO:
2470           relocation &= 0xffff;
2471           break;
2472
2473         default:
2474           break;
2475         }
2476
2477       switch (r_type)
2478         {
2479         case R_FRV_LABEL24:
2480           if (! IS_FDPIC (output_bfd) || ! picrel->plt)
2481             break;
2482           /* Fall through.  */
2483           
2484           /* When referencing a GOT entry, a function descriptor or a
2485              PLT, we don't want the addend to apply to the reference,
2486              but rather to the referenced symbol.  The actual entry
2487              will have already been created taking the addend into
2488              account, so cancel it out here.  */
2489         case R_FRV_GOT12:
2490         case R_FRV_GOTHI:
2491         case R_FRV_GOTLO:
2492         case R_FRV_FUNCDESC_GOT12:
2493         case R_FRV_FUNCDESC_GOTHI:
2494         case R_FRV_FUNCDESC_GOTLO:
2495         case R_FRV_FUNCDESC_GOTOFF12:
2496         case R_FRV_FUNCDESC_GOTOFFHI:
2497         case R_FRV_FUNCDESC_GOTOFFLO:
2498           /* Note that we only want GOTOFFHI, not GOTOFFLO or GOTOFF12
2499              here, since we do want to apply the addend to the others.
2500              Note that we've applied the addend to GOTOFFHI before we
2501              shifted it right.  */ 
2502         case R_FRV_GOTOFFHI:
2503           relocation -= rel->r_addend;
2504           break;
2505
2506         default:
2507           break;
2508         }
2509
2510      if (r_type == R_FRV_HI16)
2511        r = elf32_frv_relocate_hi16 (input_bfd, rel, contents, relocation);
2512
2513      else if (r_type == R_FRV_LO16)
2514        r = elf32_frv_relocate_lo16 (input_bfd, rel, contents, relocation);
2515
2516      else if (r_type == R_FRV_LABEL24)
2517        r = elf32_frv_relocate_label24 (input_bfd, input_section, rel,
2518                                        contents, relocation);
2519
2520      else if (r_type == R_FRV_GPREL12)
2521        r = elf32_frv_relocate_gprel12 (info, input_bfd, input_section, rel,
2522                                        contents, relocation);
2523
2524      else if (r_type == R_FRV_GPRELU12)
2525        r = elf32_frv_relocate_gprelu12 (info, input_bfd, input_section, rel,
2526                                         contents, relocation);
2527
2528      else if (r_type == R_FRV_GPRELLO)
2529        r = elf32_frv_relocate_gprello (info, input_bfd, input_section, rel,
2530                                        contents, relocation);
2531
2532      else if (r_type == R_FRV_GPRELHI)
2533        r = elf32_frv_relocate_gprelhi (info, input_bfd, input_section, rel,
2534                                        contents, relocation);
2535
2536      else
2537        r = frv_final_link_relocate (howto, input_bfd, input_section, contents,
2538                                     rel, relocation);
2539
2540       if (r != bfd_reloc_ok)
2541         {
2542           const char * msg = (const char *) NULL;
2543
2544           switch (r)
2545             {
2546             case bfd_reloc_overflow:
2547               r = info->callbacks->reloc_overflow
2548                 (info, name, howto->name, (bfd_vma) 0,
2549                  input_bfd, input_section, rel->r_offset);
2550               break;
2551
2552             case bfd_reloc_undefined:
2553               r = info->callbacks->undefined_symbol
2554                 (info, name, input_bfd, input_section, rel->r_offset, TRUE);
2555               break;
2556
2557             case bfd_reloc_outofrange:
2558               msg = _("internal error: out of range error");
2559               break;
2560
2561             case bfd_reloc_notsupported:
2562               msg = _("internal error: unsupported relocation error");
2563               break;
2564
2565             case bfd_reloc_dangerous:
2566               msg = _("internal error: dangerous relocation");
2567               break;
2568
2569             default:
2570               msg = _("internal error: unknown error");
2571               break;
2572             }
2573
2574           if (msg)
2575             r = info->callbacks->warning
2576               (info, msg, name, input_bfd, input_section, rel->r_offset);
2577
2578           if (! r)
2579             return FALSE;
2580         }
2581     }
2582
2583   return TRUE;
2584 }
2585 \f
2586 /* Return the section that should be marked against GC for a given
2587    relocation.  */
2588
2589 static asection *
2590 elf32_frv_gc_mark_hook (sec, info, rel, h, sym)
2591      asection *sec;
2592      struct bfd_link_info *info ATTRIBUTE_UNUSED;
2593      Elf_Internal_Rela *rel;
2594      struct elf_link_hash_entry *h;
2595      Elf_Internal_Sym *sym;
2596 {
2597   if (h != NULL)
2598     {
2599       switch (ELF32_R_TYPE (rel->r_info))
2600         {
2601         case R_FRV_GNU_VTINHERIT:
2602         case R_FRV_GNU_VTENTRY:
2603           break;
2604
2605         default:
2606           switch (h->root.type)
2607             {
2608             default:
2609               break;
2610
2611             case bfd_link_hash_defined:
2612             case bfd_link_hash_defweak:
2613               return h->root.u.def.section;
2614
2615             case bfd_link_hash_common:
2616               return h->root.u.c.p->section;
2617             }
2618         }
2619     }
2620   else
2621     return bfd_section_from_elf_index (sec->owner, sym->st_shndx);
2622
2623   return NULL;
2624 }
2625
2626 /* Update the got entry reference counts for the section being removed.  */
2627
2628 static bfd_boolean
2629 elf32_frv_gc_sweep_hook (abfd, info, sec, relocs)
2630      bfd *abfd ATTRIBUTE_UNUSED;
2631      struct bfd_link_info *info ATTRIBUTE_UNUSED;
2632      asection *sec ATTRIBUTE_UNUSED;
2633      const Elf_Internal_Rela *relocs ATTRIBUTE_UNUSED;
2634 {
2635   return TRUE;
2636 }
2637
2638 \f
2639 /* Hook called by the linker routine which adds symbols from an object
2640    file.  We use it to put .comm items in .scomm, and not .comm.  */
2641
2642 static bfd_boolean
2643 elf32_frv_add_symbol_hook (abfd, info, sym, namep, flagsp, secp, valp)
2644      bfd *abfd;
2645      struct bfd_link_info *info;
2646      Elf_Internal_Sym *sym;
2647      const char **namep ATTRIBUTE_UNUSED;
2648      flagword *flagsp ATTRIBUTE_UNUSED;
2649      asection **secp;
2650      bfd_vma *valp;
2651 {
2652   if (sym->st_shndx == SHN_COMMON
2653       && !info->relocatable
2654       && (int)sym->st_size <= (int)bfd_get_gp_size (abfd))
2655     {
2656       /* Common symbols less than or equal to -G nn bytes are
2657          automatically put into .sbss.  */
2658
2659       asection *scomm = bfd_get_section_by_name (abfd, ".scommon");
2660
2661       if (scomm == NULL)
2662         {
2663           scomm = bfd_make_section (abfd, ".scommon");
2664           if (scomm == NULL
2665               || !bfd_set_section_flags (abfd, scomm, (SEC_ALLOC
2666                                                        | SEC_IS_COMMON
2667                                                        | SEC_LINKER_CREATED)))
2668             return FALSE;
2669         }
2670
2671       *secp = scomm;
2672       *valp = sym->st_size;
2673     }
2674
2675   return TRUE;
2676 }
2677
2678 /* We need dynamic symbols for every section, since segments can
2679    relocate independently.  */
2680 static bfd_boolean
2681 _frvfdpic_link_omit_section_dynsym (bfd *output_bfd ATTRIBUTE_UNUSED,
2682                                     struct bfd_link_info *info
2683                                     ATTRIBUTE_UNUSED,
2684                                     asection *p ATTRIBUTE_UNUSED)
2685 {
2686   switch (elf_section_data (p)->this_hdr.sh_type)
2687     {
2688     case SHT_PROGBITS:
2689     case SHT_NOBITS:
2690       /* If sh_type is yet undecided, assume it could be
2691          SHT_PROGBITS/SHT_NOBITS.  */
2692     case SHT_NULL:
2693       return FALSE;
2694
2695       /* There shouldn't be section relative relocations
2696          against any other section.  */
2697     default:
2698       return TRUE;
2699     }
2700 }
2701
2702 /* Create  a .got section, as well as its additional info field.  This
2703    is almost entirely copied from
2704    elflink.c:_bfd_elf_create_got_section().  */
2705
2706 static bfd_boolean
2707 _frv_create_got_section (bfd *abfd, struct bfd_link_info *info)
2708 {
2709   flagword flags;
2710   asection *s;
2711   struct elf_link_hash_entry *h;
2712   struct bfd_link_hash_entry *bh;
2713   const struct elf_backend_data *bed = get_elf_backend_data (abfd);
2714   int ptralign;
2715   int offset;
2716
2717   /* This function may be called more than once.  */
2718   s = bfd_get_section_by_name (abfd, ".got");
2719   if (s != NULL && (s->flags & SEC_LINKER_CREATED) != 0)
2720     return TRUE;
2721
2722   /* Machine specific: although pointers are 32-bits wide, we want the
2723      GOT to be aligned to a 64-bit boundary, such that function
2724      descriptors in it can be accessed with 64-bit loads and
2725      stores.  */
2726   ptralign = 3;
2727
2728   flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
2729            | SEC_LINKER_CREATED);
2730
2731   s = bfd_make_section (abfd, ".got");
2732   if (s == NULL
2733       || !bfd_set_section_flags (abfd, s, flags)
2734       || !bfd_set_section_alignment (abfd, s, ptralign))
2735     return FALSE;
2736
2737   if (bed->want_got_plt)
2738     {
2739       s = bfd_make_section (abfd, ".got.plt");
2740       if (s == NULL
2741           || !bfd_set_section_flags (abfd, s, flags)
2742           || !bfd_set_section_alignment (abfd, s, ptralign))
2743         return FALSE;
2744     }
2745
2746   if (bed->want_got_sym)
2747     {
2748       /* Define the symbol _GLOBAL_OFFSET_TABLE_ at the start of the .got
2749          (or .got.plt) section.  We don't do this in the linker script
2750          because we don't want to define the symbol if we are not creating
2751          a global offset table.  */
2752       bh = NULL;
2753       if (!(_bfd_generic_link_add_one_symbol
2754             (info, abfd, "_GLOBAL_OFFSET_TABLE_", BSF_GLOBAL, s,
2755              bed->got_symbol_offset, (const char *) NULL, FALSE,
2756              bed->collect, &bh)))
2757         return FALSE;
2758       h = (struct elf_link_hash_entry *) bh;
2759       h->elf_link_hash_flags |= ELF_LINK_HASH_DEF_REGULAR;
2760       h->type = STT_OBJECT;
2761
2762       /* Machine-specific: we want the symbol for executables as
2763          well.  */
2764       if (! bfd_elf_link_record_dynamic_symbol (info, h))
2765         return FALSE;
2766
2767       elf_hash_table (info)->hgot = h;
2768     }
2769
2770   /* The first bit of the global offset table is the header.  */
2771   s->size += bed->got_header_size + bed->got_symbol_offset;
2772
2773   /* This is the machine-specific part.  Create and initialize section
2774      data for the got.  */
2775   if (IS_FDPIC (abfd))
2776     {
2777       frvfdpic_got_section (info) = s;
2778       frvfdpic_relocs_info (info) = htab_try_create (1, frvfdpic_relocs_info_hash,
2779                                                      frvfdpic_relocs_info_eq,
2780                                                      (htab_del) NULL);
2781       if (! frvfdpic_relocs_info (info))
2782         return FALSE;
2783
2784       s = bfd_make_section (abfd, ".rel.got");
2785       if (s == NULL
2786           || ! bfd_set_section_flags (abfd, s, (flags | SEC_READONLY))
2787           || ! bfd_set_section_alignment (abfd, s, 2))
2788         return FALSE;
2789
2790       frvfdpic_gotrel_section (info) = s;
2791
2792       /* Machine-specific.  */
2793       s = bfd_make_section (abfd, ".rofixup");
2794       if (s == NULL
2795           || ! bfd_set_section_flags (abfd, s, (flags | SEC_READONLY))
2796           || ! bfd_set_section_alignment (abfd, s, 2))
2797         return FALSE;
2798
2799       frvfdpic_gotfixup_section (info) = s;
2800       offset = -2048;
2801       flags = BSF_GLOBAL;
2802     }
2803   else
2804     {
2805       offset = 2048;
2806       flags = BSF_GLOBAL | BSF_WEAK;
2807     }
2808
2809   /* Define _gp in .rofixup, for FDPIC, or .got otherwise.  If it
2810      turns out that we're linking with a different linker script, the
2811      linker script will override it.  */
2812   bh = NULL;
2813   if (!(_bfd_generic_link_add_one_symbol
2814         (info, abfd, "_gp", flags, s, offset, (const char *) NULL, FALSE,
2815          bed->collect, &bh)))
2816     return FALSE;
2817   h = (struct elf_link_hash_entry *) bh;
2818   h->elf_link_hash_flags |= ELF_LINK_HASH_DEF_REGULAR;
2819   h->type = STT_OBJECT;
2820
2821   /* Machine-specific: we want the symbol for executables as well.  */
2822   if (IS_FDPIC (abfd) && ! bfd_elf_link_record_dynamic_symbol (info, h))
2823     return FALSE;
2824
2825   return TRUE;
2826 }
2827
2828 /* Make sure the got and plt sections exist, and that our pointers in
2829    the link hash table point to them.  */
2830
2831 static bfd_boolean
2832 elf32_frvfdpic_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
2833 {
2834   /* This is mostly copied from
2835      elflink.c:_bfd_elf_create_dynamic_sections().  */
2836   flagword flags, pltflags;
2837   asection *s;
2838   const struct elf_backend_data *bed = get_elf_backend_data (abfd);
2839
2840   /* We need to create .plt, .rel[a].plt, .got, .got.plt, .dynbss, and
2841      .rel[a].bss sections.  */
2842
2843   flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
2844            | SEC_LINKER_CREATED);
2845
2846   pltflags = flags;
2847   pltflags |= SEC_CODE;
2848   if (bed->plt_not_loaded)
2849     pltflags &= ~ (SEC_CODE | SEC_LOAD | SEC_HAS_CONTENTS);
2850   if (bed->plt_readonly)
2851     pltflags |= SEC_READONLY;
2852
2853   s = bfd_make_section (abfd, ".plt");
2854   if (s == NULL
2855       || ! bfd_set_section_flags (abfd, s, pltflags)
2856       || ! bfd_set_section_alignment (abfd, s, bed->plt_alignment))
2857     return FALSE;
2858   /* FRV-specific: remember it.  */
2859   frvfdpic_plt_section (info) = s;
2860
2861   if (bed->want_plt_sym)
2862     {
2863       /* Define the symbol _PROCEDURE_LINKAGE_TABLE_ at the start of the
2864          .plt section.  */
2865       struct elf_link_hash_entry *h;
2866       struct bfd_link_hash_entry *bh = NULL;
2867
2868       if (! (_bfd_generic_link_add_one_symbol
2869              (info, abfd, "_PROCEDURE_LINKAGE_TABLE_", BSF_GLOBAL, s, 0, NULL,
2870               FALSE, get_elf_backend_data (abfd)->collect, &bh)))
2871         return FALSE;
2872       h = (struct elf_link_hash_entry *) bh;
2873       h->elf_link_hash_flags |= ELF_LINK_HASH_DEF_REGULAR;
2874       h->type = STT_OBJECT;
2875
2876       if (! info->executable
2877           && ! bfd_elf_link_record_dynamic_symbol (info, h))
2878         return FALSE;
2879     }
2880
2881   /* FRV-specific: we want rel relocations for the plt.  */
2882   s = bfd_make_section (abfd, ".rel.plt");
2883   if (s == NULL
2884       || ! bfd_set_section_flags (abfd, s, flags | SEC_READONLY)
2885       || ! bfd_set_section_alignment (abfd, s, bed->s->log_file_align))
2886     return FALSE;
2887   /* FRV-specific: remember it.  */
2888   frvfdpic_pltrel_section (info) = s;
2889
2890   /* FRV-specific: we want to create the GOT in the FRV way.  */
2891   if (! _frv_create_got_section (abfd, info))
2892     return FALSE;
2893
2894   /* FRV-specific: make sure we created everything we wanted.  */
2895   BFD_ASSERT (frvfdpic_got_section (info) && frvfdpic_gotrel_section (info)
2896               && frvfdpic_gotfixup_section (info)
2897               && frvfdpic_plt_section (info)
2898               && frvfdpic_pltrel_section (info));
2899
2900   if (bed->want_dynbss)
2901     {
2902       /* The .dynbss section is a place to put symbols which are defined
2903          by dynamic objects, are referenced by regular objects, and are
2904          not functions.  We must allocate space for them in the process
2905          image and use a R_*_COPY reloc to tell the dynamic linker to
2906          initialize them at run time.  The linker script puts the .dynbss
2907          section into the .bss section of the final image.  */
2908       s = bfd_make_section (abfd, ".dynbss");
2909       if (s == NULL
2910           || ! bfd_set_section_flags (abfd, s, SEC_ALLOC | SEC_LINKER_CREATED))
2911         return FALSE;
2912
2913       /* The .rel[a].bss section holds copy relocs.  This section is not
2914      normally needed.  We need to create it here, though, so that the
2915      linker will map it to an output section.  We can't just create it
2916      only if we need it, because we will not know whether we need it
2917      until we have seen all the input files, and the first time the
2918      main linker code calls BFD after examining all the input files
2919      (size_dynamic_sections) the input sections have already been
2920      mapped to the output sections.  If the section turns out not to
2921      be needed, we can discard it later.  We will never need this
2922      section when generating a shared object, since they do not use
2923      copy relocs.  */
2924       if (! info->shared)
2925         {
2926           s = bfd_make_section (abfd,
2927                                 (bed->default_use_rela_p
2928                                  ? ".rela.bss" : ".rel.bss"));
2929           if (s == NULL
2930               || ! bfd_set_section_flags (abfd, s, flags | SEC_READONLY)
2931               || ! bfd_set_section_alignment (abfd, s, bed->s->log_file_align))
2932             return FALSE;
2933         }
2934     }
2935
2936   return TRUE;
2937 }
2938
2939 /* The name of the dynamic interpreter.  This is put in the .interp
2940    section.  */
2941
2942 #define ELF_DYNAMIC_INTERPRETER "/lib/ld.so.1"
2943
2944 #define DEFAULT_STACK_SIZE 0x20000
2945
2946 /* This structure is used to collect the number of entries present in
2947    each addressable range of the got.  */
2948 struct _frvfdpic_dynamic_got_info
2949 {
2950   /* Several bits of information about the current link.  */
2951   struct bfd_link_info *info;
2952   /* Total size needed for GOT entries within the 12-, 16- or 32-bit
2953      ranges.  */
2954   bfd_vma got12, gotlos, gothilo;
2955   /* Total size needed for function descriptor entries within the 12-,
2956      16- or 32-bit ranges.  */
2957   bfd_vma fd12, fdlos, fdhilo;
2958   /* Total size needed function descriptor entries referenced in PLT
2959      entries, that would be profitable to place in offsets close to
2960      the PIC register.  */
2961   bfd_vma fdplt;
2962   /* Total size needed by lazy PLT entries.  */
2963   bfd_vma lzplt;
2964   /* Number of relocations carried over from input object files.  */
2965   unsigned long relocs;
2966   /* Number of fixups introduced by relocations in input object files.  */
2967   unsigned long fixups;
2968 };
2969
2970 /* Compute the total GOT size required by each symbol in each range.
2971    Symbols may require up to 4 words in the GOT: an entry pointing to
2972    the symbol, an entry pointing to its function descriptor, and a
2973    private function descriptors taking two words.  */
2974
2975 static int
2976 _frvfdpic_count_got_plt_entries (void **entryp, void *dinfo_)
2977 {
2978   struct frvfdpic_relocs_info *entry = *entryp;
2979   struct _frvfdpic_dynamic_got_info *dinfo = dinfo_;
2980   unsigned relocs = 0, fixups = 0;
2981
2982   /* Allocate space for a GOT entry pointing to the symbol.  */
2983   if (entry->got12)
2984     dinfo->got12 += 4;
2985   else if (entry->gotlos)
2986     dinfo->gotlos += 4;
2987   else if (entry->gothilo)
2988     dinfo->gothilo += 4;
2989   else
2990     entry->relocs32--;
2991   entry->relocs32++;
2992
2993   /* Allocate space for a GOT entry pointing to the function
2994      descriptor.  */
2995   if (entry->fdgot12)
2996     dinfo->got12 += 4;
2997   else if (entry->fdgotlos)
2998     dinfo->gotlos += 4;
2999   else if (entry->fdgothilo)
3000     dinfo->gothilo += 4;
3001   else
3002     entry->relocsfd--;
3003   entry->relocsfd++;
3004
3005   /* Decide whether we need a PLT entry, a function descriptor in the
3006      GOT, and a lazy PLT entry for this symbol.  */
3007   entry->plt = entry->call
3008     && entry->symndx == -1 && ! FRVFDPIC_SYM_LOCAL (dinfo->info, entry->d.h)
3009     && elf_hash_table (dinfo->info)->dynamic_sections_created;
3010   entry->privfd = entry->plt
3011     || entry->fdgoff12 || entry->fdgofflos || entry->fdgoffhilo
3012     || ((entry->fd || entry->fdgot12 || entry->fdgotlos || entry->fdgothilo)
3013         && (entry->symndx != -1
3014             || FRVFDPIC_FUNCDESC_LOCAL (dinfo->info, entry->d.h)));
3015   entry->lazyplt = entry->privfd
3016     && entry->symndx == -1 && ! FRVFDPIC_SYM_LOCAL (dinfo->info, entry->d.h)
3017     && ! (dinfo->info->flags & DF_BIND_NOW)
3018     && elf_hash_table (dinfo->info)->dynamic_sections_created;
3019
3020   /* Allocate space for a function descriptor.  */
3021   if (entry->fdgoff12)
3022     dinfo->fd12 += 8;
3023   else if (entry->fdgofflos)
3024     dinfo->fdlos += 8;
3025   else if (entry->privfd && entry->plt)
3026     dinfo->fdplt += 8;
3027   else if (entry->privfd)
3028     dinfo->fdhilo += 8;
3029   else
3030     entry->relocsfdv--;
3031   entry->relocsfdv++;
3032
3033   if (entry->lazyplt)
3034     dinfo->lzplt += 8;
3035
3036   if (!dinfo->info->executable || dinfo->info->pie)
3037     relocs = entry->relocs32 + entry->relocsfd + entry->relocsfdv;
3038   else
3039     {
3040       if (entry->symndx != -1 || FRVFDPIC_SYM_LOCAL (dinfo->info, entry->d.h))
3041         {
3042           if (entry->symndx != -1
3043               || entry->d.h->root.type != bfd_link_hash_undefweak)
3044             fixups += entry->relocs32 + 2 * entry->relocsfdv;
3045         }
3046       else
3047         relocs += entry->relocs32 + entry->relocsfdv;
3048
3049       if (entry->symndx != -1
3050           || FRVFDPIC_FUNCDESC_LOCAL (dinfo->info, entry->d.h))
3051         {
3052           if (entry->symndx != -1
3053               || entry->d.h->root.type != bfd_link_hash_undefweak)
3054             fixups += entry->relocsfd;
3055         }
3056       else
3057         relocs += entry->relocsfd;
3058     }
3059
3060   entry->dynrelocs += relocs;
3061   entry->fixups += fixups;
3062   dinfo->relocs += relocs;
3063   dinfo->fixups += fixups;
3064
3065   return 1;
3066 }
3067
3068 /* This structure is used to assign offsets to got entries, function
3069    descriptors, plt entries and lazy plt entries.  */
3070
3071 struct _frvfdpic_dynamic_got_plt_info
3072 {
3073   /* Summary information collected with _frvfdpic_count_got_plt_entries.  */
3074   struct _frvfdpic_dynamic_got_info g;
3075
3076   /* For each addressable range, we record a MAX (positive) and MIN
3077      (negative) value.  CUR is used to assign got entries, and it's
3078      incremented from an initial positive value to MAX, then from MIN
3079      to FDCUR (unless FDCUR wraps around first).  FDCUR is used to
3080      assign function descriptors, and it's decreased from an initial
3081      non-positive value to MIN, then from MAX down to CUR (unless CUR
3082      wraps around first).  All of MIN, MAX, CUR and FDCUR always point
3083      to even words.  ODD, if non-zero, indicates an odd word to be
3084      used for the next got entry, otherwise CUR is used and
3085      incremented by a pair of words, wrapping around when it reaches
3086      MAX.  FDCUR is decremented (and wrapped) before the next function
3087      descriptor is chosen.  FDPLT indicates the number of remaining
3088      slots that can be used for function descriptors used only by PLT
3089      entries.  */
3090   struct _frvfdpic_dynamic_got_alloc_data
3091   {
3092     bfd_signed_vma max, cur, odd, fdcur, min;
3093     bfd_vma fdplt;
3094   } got12, gotlos, gothilo;
3095 };
3096
3097 /* Determine the positive and negative ranges to be used by each
3098    offset range in the GOT.  FDCUR and CUR, that must be aligned to a
3099    double-word boundary, are the minimum (negative) and maximum
3100    (positive) GOT offsets already used by previous ranges, except for
3101    an ODD entry that may have been left behind.  GOT and FD indicate
3102    the size of GOT entries and function descriptors that must be
3103    placed within the range from -WRAP to WRAP.  If there's room left,
3104    up to FDPLT bytes should be reserved for additional function
3105    descriptors.  */
3106
3107 inline static bfd_signed_vma
3108 _frvfdpic_compute_got_alloc_data (struct _frvfdpic_dynamic_got_alloc_data *gad,
3109                                   bfd_signed_vma fdcur,
3110                                   bfd_signed_vma odd,
3111                                   bfd_signed_vma cur,
3112                                   bfd_vma got,
3113                                   bfd_vma fd,
3114                                   bfd_vma fdplt,
3115                                   bfd_vma wrap)
3116 {
3117   bfd_signed_vma wrapmin = -wrap;
3118
3119   /* Start at the given initial points.  */
3120   gad->fdcur = fdcur;
3121   gad->cur = cur;
3122
3123   /* If we had an incoming odd word and we have any got entries that
3124      are going to use it, consume it, otherwise leave gad->odd at
3125      zero.  We might force gad->odd to zero and return the incoming
3126      odd such that it is used by the next range, but then GOT entries
3127      might appear to be out of order and we wouldn't be able to
3128      shorten the GOT by one word if it turns out to end with an
3129      unpaired GOT entry.  */
3130   if (odd && got)
3131     {
3132       gad->odd = odd;
3133       got -= 4;
3134       odd = 0;
3135     }
3136   else
3137     gad->odd = 0;
3138
3139   /* If we're left with an unpaired GOT entry, compute its location
3140      such that we can return it.  Otherwise, if got doesn't require an
3141      odd number of words here, either odd was already zero in the
3142      block above, or it was set to zero because got was non-zero, or
3143      got was already zero.  In the latter case, we want the value of
3144      odd to carry over to the return statement, so we don't want to
3145      reset odd unless the condition below is true.  */
3146   if (got & 4)
3147     {
3148       odd = cur + got;
3149       got += 4;
3150     }
3151   
3152   /* Compute the tentative boundaries of this range.  */
3153   gad->max = cur + got;
3154   gad->min = fdcur - fd;
3155   gad->fdplt = 0;
3156
3157   /* If function descriptors took too much space, wrap some of them
3158      around.  */
3159   if (gad->min < wrapmin)
3160     {
3161       gad->max += wrapmin - gad->min;
3162       gad->min = wrapmin;
3163     }
3164   /* If there is space left and we have function descriptors
3165      referenced in PLT entries that could take advantage of shorter
3166      offsets, place them here.  */
3167   else if (fdplt && gad->min > wrapmin)
3168     {
3169       bfd_vma fds;
3170       if ((bfd_vma) (gad->min - wrapmin) < fdplt)
3171         fds = gad->min - wrapmin;
3172       else
3173         fds = fdplt;
3174
3175       fdplt -= fds;
3176       gad->min -= fds;
3177       gad->fdplt += fds;
3178     }
3179
3180   /* If GOT entries took too much space, wrap some of them around.
3181      This may well cause gad->min to become lower than wrapmin.  This
3182      will cause a relocation overflow later on, so we don't have to
3183      report it here . */
3184   if ((bfd_vma) gad->max > wrap)
3185     {
3186       gad->min -= gad->max - wrap;
3187       gad->max = wrap;
3188     }
3189   /* If there is more space left, try to place some more function
3190      descriptors for PLT entries.  */
3191   else if (fdplt && (bfd_vma) gad->max < wrap)
3192     {
3193       bfd_vma fds;
3194       if ((bfd_vma) (wrap - gad->max) < fdplt)
3195         fds = wrap - gad->max;
3196       else
3197         fds = fdplt;
3198
3199       fdplt -= fds;
3200       gad->max += fds;
3201       gad->fdplt += fds;
3202     }
3203
3204   /* If odd was initially computed as an offset past the wrap point,
3205      wrap it around.  */
3206   if (odd > gad->max)
3207     odd = gad->min + odd - gad->max;
3208
3209   /* _frvfdpic_get_got_entry() below will always wrap gad->cur if needed
3210      before returning, so do it here too.  This guarantees that,
3211      should cur and fdcur meet at the wrap point, they'll both be
3212      equal to min.  */
3213   if (gad->cur == gad->max)
3214     gad->cur = gad->min;
3215
3216   return odd;
3217 }
3218
3219 /* Compute the location of the next GOT entry, given the allocation
3220    data for a range.  */
3221
3222 inline static bfd_signed_vma
3223 _frvfdpic_get_got_entry (struct _frvfdpic_dynamic_got_alloc_data *gad)
3224 {
3225   bfd_signed_vma ret;
3226   
3227   if (gad->odd)
3228     {
3229       /* If there was an odd word left behind, use it.  */
3230       ret = gad->odd;
3231       gad->odd = 0;
3232     }
3233   else
3234     {
3235       /* Otherwise, use the word pointed to by cur, reserve the next
3236          as an odd word, and skip to the next pair of words, possibly
3237          wrapping around.  */
3238       ret = gad->cur;
3239       gad->odd = gad->cur + 4;
3240       gad->cur += 8;
3241       if (gad->cur == gad->max)
3242         gad->cur = gad->min;
3243     }
3244
3245   return ret;
3246 }
3247
3248 /* Compute the location of the next function descriptor entry in the
3249    GOT, given the allocation data for a range.  */
3250
3251 inline static bfd_signed_vma
3252 _frvfdpic_get_fd_entry (struct _frvfdpic_dynamic_got_alloc_data *gad)
3253 {
3254   /* If we're at the bottom, wrap around, and only then allocate the
3255      next pair of words.  */
3256   if (gad->fdcur == gad->min)
3257     gad->fdcur = gad->max;
3258   return gad->fdcur -= 8;
3259 }
3260
3261 /* Assign GOT offsets for every GOT entry and function descriptor.
3262    Doing everything in a single pass is tricky.  */
3263
3264 static int
3265 _frvfdpic_assign_got_entries (void **entryp, void *info_)
3266 {
3267   struct frvfdpic_relocs_info *entry = *entryp;
3268   struct _frvfdpic_dynamic_got_plt_info *dinfo = info_;
3269
3270   if (entry->got12)
3271     entry->got_entry = _frvfdpic_get_got_entry (&dinfo->got12);
3272   else if (entry->gotlos)
3273     entry->got_entry = _frvfdpic_get_got_entry (&dinfo->gotlos);
3274   else if (entry->gothilo)
3275     entry->got_entry = _frvfdpic_get_got_entry (&dinfo->gothilo);
3276
3277   if (entry->fdgot12)
3278     entry->fdgot_entry = _frvfdpic_get_got_entry (&dinfo->got12);
3279   else if (entry->fdgotlos)
3280     entry->fdgot_entry = _frvfdpic_get_got_entry (&dinfo->gotlos);
3281   else if (entry->fdgothilo)
3282     entry->fdgot_entry = _frvfdpic_get_got_entry (&dinfo->gothilo);
3283
3284   if (entry->fdgoff12)
3285     entry->fd_entry = _frvfdpic_get_fd_entry (&dinfo->got12);
3286   else if (entry->plt && dinfo->got12.fdplt)
3287     {
3288       dinfo->got12.fdplt -= 8;
3289       entry->fd_entry = _frvfdpic_get_fd_entry (&dinfo->got12);
3290     }
3291   else if (entry->fdgofflos)
3292     entry->fd_entry = _frvfdpic_get_fd_entry (&dinfo->gotlos);
3293   else if (entry->plt && dinfo->gotlos.fdplt)
3294     {
3295       dinfo->gotlos.fdplt -= 8;
3296       entry->fd_entry = _frvfdpic_get_fd_entry (&dinfo->gotlos);
3297     }
3298   else if (entry->plt)
3299     {
3300       dinfo->gothilo.fdplt -= 8;
3301       entry->fd_entry = _frvfdpic_get_fd_entry (&dinfo->gothilo);
3302     }
3303   else if (entry->privfd)
3304     entry->fd_entry = _frvfdpic_get_fd_entry (&dinfo->gothilo);
3305   
3306   return 1;
3307 }
3308
3309 /* Assign GOT offsets to private function descriptors used by PLT
3310    entries (or referenced by 32-bit offsets), as well as PLT entries
3311    and lazy PLT entries.  */
3312
3313 static int
3314 _frvfdpic_assign_plt_entries (void **entryp, void *info_)
3315 {
3316   struct frvfdpic_relocs_info *entry = *entryp;
3317   struct _frvfdpic_dynamic_got_plt_info *dinfo = info_;
3318
3319   /* If this symbol requires a local function descriptor, allocate
3320      one.  */
3321   if (entry->privfd && entry->fd_entry == 0)
3322     {
3323       if (dinfo->got12.fdplt)
3324         {
3325           entry->fd_entry = _frvfdpic_get_fd_entry (&dinfo->got12);
3326           dinfo->got12.fdplt -= 8;
3327         }
3328       else if (dinfo->gotlos.fdplt)
3329         {
3330           entry->fd_entry = _frvfdpic_get_fd_entry (&dinfo->gotlos);
3331           dinfo->gotlos.fdplt -= 8;
3332         }
3333       else
3334         {
3335           BFD_ASSERT (dinfo->gothilo.fdplt)
3336           entry->fd_entry = _frvfdpic_get_fd_entry (&dinfo->gothilo);
3337           dinfo->gothilo.fdplt -= 8;
3338         }
3339     }
3340
3341   if (entry->plt)
3342     {
3343       int size;
3344
3345       /* We use the section's raw size to mark the location of the
3346          next PLT entry.  */
3347       entry->plt_entry = frvfdpic_plt_section (dinfo->g.info)->size;
3348
3349       /* Figure out the length of this PLT entry based on the
3350          addressing mode we need to reach the function descriptor.  */
3351       BFD_ASSERT (entry->fd_entry);
3352       if (entry->fd_entry >= -(1 << (12 - 1))
3353           && entry->fd_entry < (1 << (12 - 1)))
3354         size = 8;
3355       else if (entry->fd_entry >= -(1 << (16 - 1))
3356                && entry->fd_entry < (1 << (16 - 1)))
3357         size = 12;
3358       else
3359         size = 16;
3360
3361       frvfdpic_plt_section (dinfo->g.info)->size += size;
3362     }
3363
3364   if (entry->lazyplt)
3365     {
3366       entry->lzplt_entry = dinfo->g.lzplt;
3367       dinfo->g.lzplt += 8;
3368       /* If this entry is the one that gets the resolver stub, account
3369          for the additional instruction.  */
3370       if (entry->lzplt_entry % FRVFDPIC_LZPLT_BLOCK_SIZE
3371           == FRVFDPIC_LZPLT_RESOLV_LOC)
3372         dinfo->g.lzplt += 4;
3373     }
3374       
3375   return 1;
3376 }  
3377
3378 /* Follow indirect and warning hash entries so that each got entry
3379    points to the final symbol definition.  P must point to a pointer
3380    to the hash table we're traversing.  Since this traversal may
3381    modify the hash table, we set this pointer to NULL to indicate
3382    we've made a potentially-destructive change to the hash table, so
3383    the traversal must be restarted.  */
3384 static int
3385 _frvfdpic_resolve_final_relocs_info (void **entryp, void *p)
3386 {
3387   struct frvfdpic_relocs_info *entry = *entryp;
3388   htab_t *htab = p;
3389
3390   if (entry->symndx == -1)
3391     {
3392       struct elf_link_hash_entry *h = entry->d.h;
3393       struct frvfdpic_relocs_info *oentry;
3394
3395       while (h->root.type == bfd_link_hash_indirect
3396              || h->root.type == bfd_link_hash_warning)
3397         h = (struct elf_link_hash_entry *)h->root.u.i.link;
3398
3399       if (entry->d.h == h)
3400         return 1;
3401
3402       oentry = frvfdpic_relocs_info_for_global (*htab, 0, h, entry->addend,
3403                                                 NO_INSERT);
3404
3405       if (oentry)
3406         {
3407           /* Merge the two entries.  */
3408           frvfdpic_pic_merge_early_relocs_info (oentry, entry);
3409           htab_clear_slot (*htab, entryp);
3410           return 1;
3411         }
3412
3413       entry->d.h = h;
3414
3415       /* If we can't find this entry with the new bfd hash, re-insert
3416          it, and get the traversal restarted.  */
3417       if (! htab_find (*htab, entry))
3418         {
3419           htab_clear_slot (*htab, entryp);
3420           entryp = htab_find_slot (*htab, entry, INSERT);
3421           if (! *entryp)
3422             *entryp = entry;
3423           /* Abort the traversal, since the whole table may have
3424              moved, and leave it up to the parent to restart the
3425              process.  */
3426           *(htab_t *)p = NULL;
3427           return 0;
3428         }
3429     }
3430
3431   return 1;
3432 }
3433
3434 /* Set the sizes of the dynamic sections.  */
3435
3436 static bfd_boolean
3437 elf32_frvfdpic_size_dynamic_sections (bfd *output_bfd,
3438                                       struct bfd_link_info *info)
3439 {
3440   bfd *dynobj;
3441   asection *s;
3442   struct _frvfdpic_dynamic_got_plt_info gpinfo;
3443   bfd_signed_vma odd;
3444   bfd_vma limit;
3445
3446   dynobj = elf_hash_table (info)->dynobj;
3447   BFD_ASSERT (dynobj != NULL);
3448
3449   if (elf_hash_table (info)->dynamic_sections_created)
3450     {
3451       /* Set the contents of the .interp section to the interpreter.  */
3452       if (info->executable)
3453         {
3454           s = bfd_get_section_by_name (dynobj, ".interp");
3455           BFD_ASSERT (s != NULL);
3456           s->size = sizeof ELF_DYNAMIC_INTERPRETER;
3457           s->contents = (bfd_byte *) ELF_DYNAMIC_INTERPRETER;
3458         }
3459     }
3460
3461   memset (&gpinfo, 0, sizeof (gpinfo));
3462   gpinfo.g.info = info;
3463
3464   for (;;)
3465     {
3466       htab_t relocs = frvfdpic_relocs_info (info);
3467
3468       htab_traverse (relocs, _frvfdpic_resolve_final_relocs_info, &relocs);
3469
3470       if (relocs == frvfdpic_relocs_info (info))
3471         break;
3472     }
3473
3474   htab_traverse (frvfdpic_relocs_info (info), _frvfdpic_count_got_plt_entries,
3475                  &gpinfo.g);
3476
3477   odd = 12;
3478   /* Compute the total size taken by entries in the 12-bit and 16-bit
3479      ranges, to tell how many PLT function descriptors we can bring
3480      into the 12-bit range without causing the 16-bit range to
3481      overflow.  */
3482   limit = odd + gpinfo.g.got12 + gpinfo.g.gotlos
3483     + gpinfo.g.fd12 + gpinfo.g.fdlos;
3484   if (limit < (bfd_vma)1 << 16)
3485     limit = ((bfd_vma)1 << 16) - limit;
3486   else
3487     limit = 0;
3488   if (gpinfo.g.fdplt < limit)
3489     limit = gpinfo.g.fdplt;
3490
3491   /* Determine the ranges of GOT offsets that we can use for each
3492      range of addressing modes.  */
3493   odd = _frvfdpic_compute_got_alloc_data (&gpinfo.got12,
3494                                           0,
3495                                           odd,
3496                                           16,
3497                                           gpinfo.g.got12,
3498                                           gpinfo.g.fd12,
3499                                           limit,
3500                                           (bfd_vma)1 << (12-1));
3501   odd = _frvfdpic_compute_got_alloc_data (&gpinfo.gotlos,
3502                                           gpinfo.got12.min,
3503                                           odd,
3504                                           gpinfo.got12.max,
3505                                           gpinfo.g.gotlos,
3506                                           gpinfo.g.fdlos,
3507                                           gpinfo.g.fdplt - gpinfo.got12.fdplt,
3508                                           (bfd_vma)1 << (16-1));
3509   odd = _frvfdpic_compute_got_alloc_data (&gpinfo.gothilo,
3510                                           gpinfo.gotlos.min,
3511                                           odd,
3512                                           gpinfo.gotlos.max,
3513                                           gpinfo.g.gothilo,
3514                                           gpinfo.g.fdhilo,
3515                                           gpinfo.g.fdplt - gpinfo.got12.fdplt
3516                                           - gpinfo.gotlos.fdplt,
3517                                           (bfd_vma)1 << (32-1));
3518
3519   /* Now assign (most) GOT offsets.  */
3520   htab_traverse (frvfdpic_relocs_info (info), _frvfdpic_assign_got_entries,
3521                  &gpinfo);
3522
3523   frvfdpic_got_section (info)->size = gpinfo.gothilo.max
3524     - gpinfo.gothilo.min
3525     /* If an odd word is the last word of the GOT, we don't need this
3526        word to be part of the GOT.  */
3527     - (odd + 4 == gpinfo.gothilo.max ? 4 : 0);
3528   if (frvfdpic_got_section (info)->size == 0)
3529     frvfdpic_got_section (info)->flags |= SEC_EXCLUDE;
3530   else if (frvfdpic_got_section (info)->size == 12
3531            && ! elf_hash_table (info)->dynamic_sections_created)
3532     {
3533       frvfdpic_got_section (info)->flags |= SEC_EXCLUDE;
3534       frvfdpic_got_section (info)->size = 0;
3535     }
3536   else
3537     {
3538       frvfdpic_got_section (info)->contents =
3539         (bfd_byte *) bfd_zalloc (dynobj,
3540                                  frvfdpic_got_section (info)->size);
3541       if (frvfdpic_got_section (info)->contents == NULL)
3542         return FALSE;
3543     }
3544   
3545   if (elf_hash_table (info)->dynamic_sections_created)
3546     /* Subtract the number of lzplt entries, since those will generate
3547        relocations in the pltrel section.  */
3548     frvfdpic_gotrel_section (info)->size =
3549       (gpinfo.g.relocs - gpinfo.g.lzplt / 8)
3550       * get_elf_backend_data (output_bfd)->s->sizeof_rel;
3551   else
3552     BFD_ASSERT (gpinfo.g.relocs == 0);
3553   if (frvfdpic_gotrel_section (info)->size == 0)
3554     frvfdpic_gotrel_section (info)->flags |= SEC_EXCLUDE;
3555   else
3556     {
3557       frvfdpic_gotrel_section (info)->contents =
3558         (bfd_byte *) bfd_zalloc (dynobj,
3559                                  frvfdpic_gotrel_section (info)->size);
3560       if (frvfdpic_gotrel_section (info)->contents == NULL)
3561         return FALSE;
3562     }
3563
3564   frvfdpic_gotfixup_section (info)->size = (gpinfo.g.fixups + 1) * 4;
3565   if (frvfdpic_gotfixup_section (info)->size == 0)
3566     frvfdpic_gotfixup_section (info)->flags |= SEC_EXCLUDE;
3567   else
3568     {
3569       frvfdpic_gotfixup_section (info)->contents =
3570         (bfd_byte *) bfd_zalloc (dynobj,
3571                                  frvfdpic_gotfixup_section (info)->size);
3572       if (frvfdpic_gotfixup_section (info)->contents == NULL)
3573         return FALSE;
3574     }
3575   
3576   if (elf_hash_table (info)->dynamic_sections_created)
3577     {
3578       frvfdpic_pltrel_section (info)->size =
3579         gpinfo.g.lzplt / 8 * get_elf_backend_data (output_bfd)->s->sizeof_rel;
3580       if (frvfdpic_pltrel_section (info)->size == 0)
3581         frvfdpic_pltrel_section (info)->flags |= SEC_EXCLUDE;
3582       else
3583         {
3584           frvfdpic_pltrel_section (info)->contents =
3585             (bfd_byte *) bfd_zalloc (dynobj,
3586                                      frvfdpic_pltrel_section (info)->size);
3587           if (frvfdpic_pltrel_section (info)->contents == NULL)
3588             return FALSE;
3589         }
3590     }
3591   
3592   /* Add 4 bytes for every block of at most 65535 lazy PLT entries,
3593      such that there's room for the additional instruction needed to
3594      call the resolver.  Since _frvfdpic_assign_got_entries didn't
3595      account for them, our block size is 4 bytes smaller than the real
3596      block size.  */
3597   if (elf_hash_table (info)->dynamic_sections_created)
3598     {
3599       frvfdpic_plt_section (info)->size = gpinfo.g.lzplt
3600         + ((gpinfo.g.lzplt + (FRVFDPIC_LZPLT_BLOCK_SIZE - 4) - 8)
3601            / (FRVFDPIC_LZPLT_BLOCK_SIZE - 4) * 4);
3602     }
3603
3604   /* Reset it, such that _frvfdpic_assign_plt_entries() can use it to
3605      actually assign lazy PLT entries addresses.  */
3606   gpinfo.g.lzplt = 0;
3607
3608   /* Save information that we're going to need to generate GOT and PLT
3609      entries.  */
3610   frvfdpic_got_initial_offset (info) = -gpinfo.gothilo.min;
3611
3612   if (get_elf_backend_data (output_bfd)->want_got_sym)
3613     elf_hash_table (info)->hgot->root.u.def.value
3614       += frvfdpic_got_initial_offset (info);
3615
3616   if (elf_hash_table (info)->dynamic_sections_created)
3617     frvfdpic_plt_initial_offset (info) =
3618       frvfdpic_plt_section (info)->size;
3619
3620   htab_traverse (frvfdpic_relocs_info (info), _frvfdpic_assign_plt_entries,
3621                  &gpinfo);
3622
3623   /* Allocate the PLT section contents only after
3624      _frvfdpic_assign_plt_entries has a chance to add the size of the
3625      non-lazy PLT entries.  */
3626   if (elf_hash_table (info)->dynamic_sections_created)
3627     {
3628       if (frvfdpic_plt_section (info)->size == 0)
3629         frvfdpic_plt_section (info)->flags |= SEC_EXCLUDE;
3630       else
3631         {
3632           frvfdpic_plt_section (info)->contents =
3633             (bfd_byte *) bfd_zalloc (dynobj,
3634                                      frvfdpic_plt_section (info)->size);
3635           if (frvfdpic_plt_section (info)->contents == NULL)
3636             return FALSE;
3637         }
3638     }
3639
3640   if (elf_hash_table (info)->dynamic_sections_created)
3641     {
3642       if (frvfdpic_got_section (info)->size)
3643         if (!_bfd_elf_add_dynamic_entry (info, DT_PLTGOT, 0))
3644           return FALSE;
3645
3646       if (frvfdpic_pltrel_section (info)->size)
3647         if (!_bfd_elf_add_dynamic_entry (info, DT_PLTRELSZ, 0)
3648             || !_bfd_elf_add_dynamic_entry (info, DT_PLTREL, DT_REL)
3649             || !_bfd_elf_add_dynamic_entry (info, DT_JMPREL, 0))
3650           return FALSE;
3651
3652       if (frvfdpic_gotrel_section (info)->size)
3653         if (!_bfd_elf_add_dynamic_entry (info, DT_REL, 0)
3654             || !_bfd_elf_add_dynamic_entry (info, DT_RELSZ, 0)
3655             || !_bfd_elf_add_dynamic_entry (info, DT_RELENT,
3656                                             sizeof (Elf32_External_Rel)))
3657           return FALSE;
3658     }
3659
3660   return TRUE;
3661 }
3662
3663 static bfd_boolean
3664 elf32_frvfdpic_always_size_sections (bfd *output_bfd,
3665                                      struct bfd_link_info *info)
3666 {
3667   if (!info->relocatable)
3668     {
3669       struct elf_link_hash_entry *h;
3670       asection *sec;
3671
3672       /* Force a PT_GNU_STACK segment to be created.  */
3673       if (! elf_tdata (output_bfd)->stack_flags)
3674         elf_tdata (output_bfd)->stack_flags = PF_R | PF_W | PF_X;
3675
3676       /* Define __stacksize if it's not defined yet.  */
3677       h = elf_link_hash_lookup (elf_hash_table (info), "__stacksize",
3678                                 FALSE, FALSE, FALSE);
3679       if (! h || h->root.type != bfd_link_hash_defined
3680           || h->type != STT_OBJECT
3681           || !(h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR))
3682         {
3683           struct bfd_link_hash_entry *bh = NULL;
3684
3685           if (!(_bfd_generic_link_add_one_symbol
3686                 (info, output_bfd, "__stacksize",
3687                  BSF_GLOBAL, bfd_abs_section_ptr, DEFAULT_STACK_SIZE,
3688                  (const char *) NULL, FALSE,
3689                  get_elf_backend_data (output_bfd)->collect, &bh)))
3690             return FALSE;
3691
3692           h = (struct elf_link_hash_entry *) bh;
3693           h->elf_link_hash_flags |= ELF_LINK_HASH_DEF_REGULAR;
3694           h->type = STT_OBJECT;
3695         }
3696
3697       /* Create a stack section, and set its alignment.  */
3698       sec = bfd_make_section (output_bfd, ".stack");
3699
3700       if (sec == NULL
3701           || ! bfd_set_section_alignment (output_bfd, sec, 3))
3702         return FALSE;
3703     }
3704
3705   return TRUE;
3706 }
3707
3708 static bfd_boolean
3709 elf32_frvfdpic_modify_segment_map (bfd *output_bfd,
3710                                    struct bfd_link_info *info)
3711 {
3712   struct elf_segment_map *m;
3713
3714   /* objcopy and strip preserve what's already there using
3715      elf32_frvfdpic_copy_private_bfd_data ().  */
3716   if (! info)
3717     return TRUE;
3718
3719   for (m = elf_tdata (output_bfd)->segment_map; m != NULL; m = m->next)
3720     if (m->p_type == PT_GNU_STACK)
3721       break;
3722
3723   if (m)
3724     {
3725       asection *sec = bfd_get_section_by_name (output_bfd, ".stack");
3726       struct elf_link_hash_entry *h;
3727
3728       if (sec)
3729         {
3730           /* Obtain the pointer to the __stacksize symbol.  */
3731           h = elf_link_hash_lookup (elf_hash_table (info), "__stacksize",
3732                                     FALSE, FALSE, FALSE);
3733           while (h->root.type == bfd_link_hash_indirect
3734                  || h->root.type == bfd_link_hash_warning)
3735             h = (struct elf_link_hash_entry *)h->root.u.i.link;
3736           BFD_ASSERT (h->root.type == bfd_link_hash_defined);
3737
3738           /* Set the section size from the symbol value.  We
3739              intentionally ignore the symbol section.  */
3740           if (h->root.type == bfd_link_hash_defined)
3741             sec->size = h->root.u.def.value;
3742           else
3743             sec->size = DEFAULT_STACK_SIZE;
3744
3745           /* Add the stack section to the PT_GNU_STACK segment,
3746              such that its size and alignment requirements make it
3747              to the segment.  */
3748           m->sections[m->count] = sec;
3749           m->count++;
3750         }
3751     }
3752
3753   return TRUE;
3754 }
3755
3756 /* Fill in code and data in dynamic sections.  */
3757
3758 static bfd_boolean
3759 elf32_frv_finish_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
3760                                    struct bfd_link_info *info ATTRIBUTE_UNUSED)
3761 {
3762   /* Nothing to be done for non-FDPIC.  */
3763   return TRUE;
3764 }
3765
3766 static bfd_boolean
3767 elf32_frvfdpic_finish_dynamic_sections (bfd *output_bfd,
3768                                         struct bfd_link_info *info)
3769 {
3770   bfd *dynobj;
3771   asection *sdyn;
3772
3773   dynobj = elf_hash_table (info)->dynobj;
3774
3775   if (frvfdpic_got_section (info))
3776     {
3777       BFD_ASSERT (frvfdpic_gotrel_section (info)->size
3778                   == (frvfdpic_gotrel_section (info)->reloc_count
3779                       * sizeof (Elf32_External_Rel)));
3780
3781       if (frvfdpic_gotfixup_section (info))
3782         {
3783           struct elf_link_hash_entry *hgot = elf_hash_table (info)->hgot;
3784           bfd_vma got_value = hgot->root.u.def.value
3785             + hgot->root.u.def.section->output_section->vma
3786             + hgot->root.u.def.section->output_offset;
3787
3788           _frvfdpic_add_rofixup (output_bfd, frvfdpic_gotfixup_section (info),
3789                                  got_value, 0);
3790
3791           if (frvfdpic_gotfixup_section (info)->size
3792               != (frvfdpic_gotfixup_section (info)->reloc_count * 4))
3793             {
3794               (*_bfd_error_handler)
3795                 ("LINKER BUG: .rofixup section size mismatch");
3796               return FALSE;
3797             }
3798         }
3799     }
3800   if (elf_hash_table (info)->dynamic_sections_created)
3801     {
3802       BFD_ASSERT (frvfdpic_pltrel_section (info)->size
3803                   == (frvfdpic_pltrel_section (info)->reloc_count
3804                       * sizeof (Elf32_External_Rel)));
3805     }
3806
3807   sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
3808
3809   if (elf_hash_table (info)->dynamic_sections_created)
3810     {
3811       Elf32_External_Dyn * dyncon;
3812       Elf32_External_Dyn * dynconend;
3813
3814       BFD_ASSERT (sdyn != NULL);
3815
3816       dyncon = (Elf32_External_Dyn *) sdyn->contents;
3817       dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
3818
3819       for (; dyncon < dynconend; dyncon++)
3820         {
3821           Elf_Internal_Dyn dyn;
3822
3823           bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
3824
3825           switch (dyn.d_tag)
3826             {
3827             default:
3828               break;
3829
3830             case DT_PLTGOT:
3831               dyn.d_un.d_ptr = frvfdpic_got_section (info)->output_section->vma
3832                 + frvfdpic_got_section (info)->output_offset
3833                 + frvfdpic_got_initial_offset (info);
3834               bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
3835               break;
3836
3837             case DT_JMPREL:
3838               dyn.d_un.d_ptr = frvfdpic_pltrel_section (info)
3839                 ->output_section->vma
3840                 + frvfdpic_pltrel_section (info)->output_offset;
3841               bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
3842               break;
3843
3844             case DT_PLTRELSZ:
3845               dyn.d_un.d_val = frvfdpic_pltrel_section (info)->size;
3846               bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
3847               break;
3848             }
3849         }
3850     }
3851
3852   return TRUE;
3853 }
3854
3855 /* Adjust a symbol defined by a dynamic object and referenced by a
3856    regular object.  */
3857
3858 static bfd_boolean
3859 elf32_frvfdpic_adjust_dynamic_symbol
3860 (struct bfd_link_info *info ATTRIBUTE_UNUSED,
3861  struct elf_link_hash_entry *h ATTRIBUTE_UNUSED)
3862 {
3863   bfd * dynobj;
3864
3865   dynobj = elf_hash_table (info)->dynobj;
3866
3867   /* Make sure we know what is going on here.  */
3868   BFD_ASSERT (dynobj != NULL
3869               && (h->weakdef != NULL
3870                   || ((h->elf_link_hash_flags
3871                        & ELF_LINK_HASH_DEF_DYNAMIC) != 0
3872                       && (h->elf_link_hash_flags
3873                           & ELF_LINK_HASH_REF_REGULAR) != 0
3874                       && (h->elf_link_hash_flags
3875                           & ELF_LINK_HASH_DEF_REGULAR) == 0)));
3876
3877   /* If this is a weak symbol, and there is a real definition, the
3878      processor independent code will have arranged for us to see the
3879      real definition first, and we can just use the same value.  */
3880   if (h->weakdef != NULL)
3881     {
3882       BFD_ASSERT (h->weakdef->root.type == bfd_link_hash_defined
3883                   || h->weakdef->root.type == bfd_link_hash_defweak);
3884       h->root.u.def.section = h->weakdef->root.u.def.section;
3885       h->root.u.def.value = h->weakdef->root.u.def.value;
3886     }
3887
3888   return TRUE;
3889 }
3890
3891 /* Perform any actions needed for dynamic symbols.  */
3892
3893 static bfd_boolean
3894 elf32_frvfdpic_finish_dynamic_symbol
3895 (bfd *output_bfd ATTRIBUTE_UNUSED,
3896  struct bfd_link_info *info ATTRIBUTE_UNUSED,
3897  struct elf_link_hash_entry *h ATTRIBUTE_UNUSED,
3898  Elf_Internal_Sym *sym ATTRIBUTE_UNUSED)
3899 {
3900   return TRUE;
3901 }
3902
3903 /* Decide whether to attempt to turn absptr or lsda encodings in
3904    shared libraries into pcrel within the given input section.  */
3905
3906 static bfd_boolean
3907 frvfdpic_elf_use_relative_eh_frame
3908 (bfd *input_bfd ATTRIBUTE_UNUSED,
3909  struct bfd_link_info *info ATTRIBUTE_UNUSED,
3910  asection *eh_frame_section ATTRIBUTE_UNUSED)
3911 {
3912   /* We can't use PC-relative encodings in FDPIC binaries, in general.  */
3913   return FALSE;
3914 }
3915
3916 /* Adjust the contents of an eh_frame_hdr section before they're output.  */
3917
3918 static bfd_byte
3919 frvfdpic_elf_encode_eh_address (bfd *abfd,
3920                                 struct bfd_link_info *info,
3921                                 asection *osec, bfd_vma offset,
3922                                 asection *loc_sec, bfd_vma loc_offset,
3923                                 bfd_vma *encoded)
3924 {
3925   struct elf_link_hash_entry *h;
3926
3927   h = elf_hash_table (info)->hgot;
3928   BFD_ASSERT (h && h->root.type == bfd_link_hash_defined);
3929
3930   if (! h || (_frvfdpic_osec_to_segment (abfd, osec)
3931               == _frvfdpic_osec_to_segment (abfd, loc_sec->output_section)))
3932     return _bfd_elf_encode_eh_address (abfd, info, osec, offset,
3933                                        loc_sec, loc_offset, encoded);
3934
3935   BFD_ASSERT (_frvfdpic_osec_to_segment (abfd, osec)
3936               == (_frvfdpic_osec_to_segment
3937                   (abfd, h->root.u.def.section->output_section)));
3938
3939   *encoded = osec->vma + offset
3940     - (h->root.u.def.value
3941        + h->root.u.def.section->output_section->vma
3942        + h->root.u.def.section->output_offset);
3943
3944   return DW_EH_PE_datarel | DW_EH_PE_sdata4;
3945 }
3946
3947 /* Look through the relocs for a section during the first phase.
3948
3949    Besides handling virtual table relocs for gc, we have to deal with
3950    all sorts of PIC-related relocations.  We describe below the
3951    general plan on how to handle such relocations, even though we only
3952    collect information at this point, storing them in hash tables for
3953    perusal of later passes.
3954
3955    32 relocations are propagated to the linker output when creating
3956    position-independent output.  LO16 and HI16 relocations are not
3957    supposed to be encountered in this case.
3958
3959    LABEL16 should always be resolvable by the linker, since it's only
3960    used by branches.
3961
3962    LABEL24, on the other hand, is used by calls.  If it turns out that
3963    the target of a call is a dynamic symbol, a PLT entry must be
3964    created for it, which triggers the creation of a private function
3965    descriptor and, unless lazy binding is disabled, a lazy PLT entry.
3966
3967    GPREL relocations require the referenced symbol to be in the same
3968    segment as _gp, but this can only be checked later.
3969
3970    All GOT, GOTOFF and FUNCDESC relocations require a .got section to
3971    exist.  LABEL24 might as well, since it may require a PLT entry,
3972    that will require a got.
3973
3974    Non-FUNCDESC GOT relocations require a GOT entry to be created
3975    regardless of whether the symbol is dynamic.  However, since a
3976    global symbol that turns out to not be exported may have the same
3977    address of a non-dynamic symbol, we don't assign GOT entries at
3978    this point, such that we can share them in this case.  A relocation
3979    for the GOT entry always has to be created, be it to offset a
3980    private symbol by the section load address, be it to get the symbol
3981    resolved dynamically.
3982
3983    FUNCDESC GOT relocations require a GOT entry to be created, and
3984    handled as if a FUNCDESC relocation was applied to the GOT entry in
3985    an object file.
3986
3987    FUNCDESC relocations referencing a symbol that turns out to NOT be
3988    dynamic cause a private function descriptor to be created.  The
3989    FUNCDESC relocation then decays to a 32 relocation that points at
3990    the private descriptor.  If the symbol is dynamic, the FUNCDESC
3991    relocation is propagated to the linker output, such that the
3992    dynamic linker creates the canonical descriptor, pointing to the
3993    dynamically-resolved definition of the function.
3994
3995    Non-FUNCDESC GOTOFF relocations must always refer to non-dynamic
3996    symbols that are assigned to the same segment as the GOT, but we
3997    can only check this later, after we know the complete set of
3998    symbols defined and/or exported.
3999
4000    FUNCDESC GOTOFF relocations require a function descriptor to be
4001    created and, unless lazy binding is disabled or the symbol is not
4002    dynamic, a lazy PLT entry.  Since we can't tell at this point
4003    whether a symbol is going to be dynamic, we have to decide later
4004    whether to create a lazy PLT entry or bind the descriptor directly
4005    to the private function.
4006
4007    FUNCDESC_VALUE relocations are not supposed to be present in object
4008    files, but they may very well be simply propagated to the linker
4009    output, since they have no side effect.
4010
4011
4012    A function descriptor always requires a FUNCDESC_VALUE relocation.
4013    Whether it's in .plt.rel or not depends on whether lazy binding is
4014    enabled and on whether the referenced symbol is dynamic.
4015
4016    The existence of a lazy PLT requires the resolverStub lazy PLT
4017    entry to be present.
4018
4019
4020    As for assignment of GOT, PLT and lazy PLT entries, and private
4021    descriptors, we might do them all sequentially, but we can do
4022    better than that.  For example, we can place GOT entries and
4023    private function descriptors referenced using 12-bit operands
4024    closer to the PIC register value, such that these relocations don't
4025    overflow.  Those that are only referenced with LO16 relocations
4026    could come next, but we may as well place PLT-required function
4027    descriptors in the 12-bit range to make them shorter.  Symbols
4028    referenced with LO16/HI16 may come next, but we may place
4029    additional function descriptors in the 16-bit range if we can
4030    reliably tell that we've already placed entries that are ever
4031    referenced with only LO16.  PLT entries are therefore generated as
4032    small as possible, while not introducing relocation overflows in
4033    GOT or FUNCDESC_GOTOFF relocations.  Lazy PLT entries could be
4034    generated before or after PLT entries, but not intermingled with
4035    them, such that we can have more lazy PLT entries in range for a
4036    branch to the resolverStub.  The resolverStub should be emitted at
4037    the most distant location from the first lazy PLT entry such that
4038    it's still in range for a branch, or closer, if there isn't a need
4039    for so many lazy PLT entries.  Additional lazy PLT entries may be
4040    emitted after the resolverStub, as long as branches are still in
4041    range.  If the branch goes out of range, longer lazy PLT entries
4042    are emitted.
4043
4044    We could further optimize PLT and lazy PLT entries by giving them
4045    priority in assignment to closer-to-gr17 locations depending on the
4046    number of occurrences of references to them (assuming a function
4047    that's called more often is more important for performance, so its
4048    PLT entry should be faster), or taking hints from the compiler.
4049    Given infinite time and money... :-)  */
4050
4051 static bfd_boolean
4052 elf32_frv_check_relocs (abfd, info, sec, relocs)
4053      bfd *abfd;
4054      struct bfd_link_info *info;
4055      asection *sec;
4056      const Elf_Internal_Rela *relocs;
4057 {
4058   Elf_Internal_Shdr *symtab_hdr;
4059   struct elf_link_hash_entry **sym_hashes, **sym_hashes_end;
4060   const Elf_Internal_Rela *rel;
4061   const Elf_Internal_Rela *rel_end;
4062   bfd *dynobj;
4063   struct frvfdpic_relocs_info *picrel;
4064
4065   if (info->relocatable)
4066     return TRUE;
4067
4068   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
4069   sym_hashes = elf_sym_hashes (abfd);
4070   sym_hashes_end = sym_hashes + symtab_hdr->sh_size/sizeof(Elf32_External_Sym);
4071   if (!elf_bad_symtab (abfd))
4072     sym_hashes_end -= symtab_hdr->sh_info;
4073
4074   dynobj = elf_hash_table (info)->dynobj;
4075   rel_end = relocs + sec->reloc_count;
4076   for (rel = relocs; rel < rel_end; rel++)
4077     {
4078       struct elf_link_hash_entry *h;
4079       unsigned long r_symndx;
4080
4081       r_symndx = ELF32_R_SYM (rel->r_info);
4082       if (r_symndx < symtab_hdr->sh_info)
4083         h = NULL;
4084       else
4085         h = sym_hashes[r_symndx - symtab_hdr->sh_info];
4086
4087       switch (ELF32_R_TYPE (rel->r_info))
4088         {
4089         case R_FRV_GOT12:
4090         case R_FRV_GOTHI:
4091         case R_FRV_GOTLO:
4092         case R_FRV_FUNCDESC_GOT12:
4093         case R_FRV_FUNCDESC_GOTHI:
4094         case R_FRV_FUNCDESC_GOTLO:
4095         case R_FRV_GOTOFF12:
4096         case R_FRV_GOTOFFHI:
4097         case R_FRV_GOTOFFLO:
4098         case R_FRV_FUNCDESC_GOTOFF12:
4099         case R_FRV_FUNCDESC_GOTOFFHI:
4100         case R_FRV_FUNCDESC_GOTOFFLO:
4101         case R_FRV_FUNCDESC:
4102         case R_FRV_FUNCDESC_VALUE:
4103           if (! IS_FDPIC (abfd))
4104             goto bad_reloc;
4105           /* Fall through.  */
4106         case R_FRV_GPREL12:
4107         case R_FRV_GPRELU12:
4108         case R_FRV_GPRELHI:
4109         case R_FRV_GPRELLO:
4110         case R_FRV_LABEL24:
4111         case R_FRV_32:
4112           if (! dynobj)
4113             {
4114               elf_hash_table (info)->dynobj = dynobj = abfd;
4115               if (! _frv_create_got_section (abfd, info))
4116                 return FALSE;
4117             }
4118           if (! IS_FDPIC (abfd))
4119             {
4120               picrel = NULL;
4121               break;
4122             }
4123           if (h != NULL)
4124             {
4125               if (h->dynindx == -1)
4126                 switch (ELF_ST_VISIBILITY (h->other))
4127                   {
4128                   case STV_INTERNAL:
4129                   case STV_HIDDEN:
4130                     break;
4131                   default:
4132                     bfd_elf_link_record_dynamic_symbol (info, h);
4133                     break;
4134                   }
4135               picrel
4136                 = frvfdpic_relocs_info_for_global (frvfdpic_relocs_info (info),
4137                                                    abfd, h,
4138                                                    rel->r_addend, INSERT);
4139             }
4140           else
4141             picrel = frvfdpic_relocs_info_for_local (frvfdpic_relocs_info
4142                                                      (info), abfd, r_symndx,
4143                                                      rel->r_addend, INSERT);
4144           if (! picrel)
4145             return FALSE;
4146           break;
4147
4148         default:
4149           picrel = NULL;
4150           break;
4151         }
4152       
4153       switch (ELF32_R_TYPE (rel->r_info))
4154         {
4155         case R_FRV_LABEL24:
4156           if (IS_FDPIC (abfd))
4157             picrel->call = 1;
4158           break;
4159                 
4160         case R_FRV_FUNCDESC_VALUE:
4161           picrel->relocsfdv++;
4162           if (bfd_get_section_flags (abfd, sec) & SEC_ALLOC)
4163             picrel->relocs32--;
4164           /* Fall through.  */
4165
4166         case R_FRV_32:
4167           if (! IS_FDPIC (abfd))
4168             break;
4169
4170           picrel->sym = 1;
4171           if (bfd_get_section_flags (abfd, sec) & SEC_ALLOC)
4172             picrel->relocs32++;
4173           break;
4174             
4175         case R_FRV_GOT12:
4176           picrel->got12 = 1;
4177           break;
4178             
4179         case R_FRV_GOTHI:
4180         case R_FRV_GOTLO:
4181           picrel->gothilo = 1;
4182           break;
4183
4184         case R_FRV_FUNCDESC_GOT12:
4185           picrel->fdgot12 = 1;
4186           break;
4187             
4188         case R_FRV_FUNCDESC_GOTHI:
4189         case R_FRV_FUNCDESC_GOTLO:
4190           picrel->fdgothilo = 1;
4191           break;
4192             
4193         case R_FRV_GOTOFF12:
4194         case R_FRV_GOTOFFHI:
4195         case R_FRV_GOTOFFLO:
4196           picrel->gotoff = 1;
4197           break;
4198             
4199         case R_FRV_FUNCDESC_GOTOFF12:
4200           picrel->fdgoff12 = 1;
4201           break;
4202             
4203         case R_FRV_FUNCDESC_GOTOFFHI:
4204         case R_FRV_FUNCDESC_GOTOFFLO:
4205           picrel->fdgoffhilo = 1;
4206           break;
4207             
4208         case R_FRV_FUNCDESC:
4209           picrel->fd = 1;
4210           picrel->relocsfd++;
4211           break;
4212           
4213         /* This relocation describes the C++ object vtable hierarchy.
4214            Reconstruct it for later use during GC.  */
4215         case R_FRV_GNU_VTINHERIT:
4216           if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
4217             return FALSE;
4218           break;
4219
4220         /* This relocation describes which C++ vtable entries are actually
4221            used.  Record for later use during GC.  */
4222         case R_FRV_GNU_VTENTRY:
4223           if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
4224             return FALSE;
4225           break;
4226
4227         case R_FRV_LABEL16:
4228         case R_FRV_LO16:
4229         case R_FRV_HI16:
4230         case R_FRV_GPREL12:
4231         case R_FRV_GPRELU12:
4232         case R_FRV_GPREL32:
4233         case R_FRV_GPRELHI:
4234         case R_FRV_GPRELLO:
4235           break;
4236
4237         default:
4238         bad_reloc:
4239           (*_bfd_error_handler)
4240             (_("%s: unsupported relocation type %i"),
4241              bfd_archive_filename (abfd), ELF32_R_TYPE (rel->r_info));
4242           return FALSE;
4243         }
4244     }
4245
4246   return TRUE;
4247 }
4248
4249 \f
4250 /* Return the machine subcode from the ELF e_flags header.  */
4251
4252 static int
4253 elf32_frv_machine (abfd)
4254      bfd *abfd;
4255 {
4256   switch (elf_elfheader (abfd)->e_flags & EF_FRV_CPU_MASK)
4257     {
4258     default:                break;
4259     case EF_FRV_CPU_FR550:  return bfd_mach_fr550;
4260     case EF_FRV_CPU_FR500:  return bfd_mach_fr500;
4261     case EF_FRV_CPU_FR450:  return bfd_mach_fr450;
4262     case EF_FRV_CPU_FR405:  return bfd_mach_fr400;
4263     case EF_FRV_CPU_FR400:  return bfd_mach_fr400;
4264     case EF_FRV_CPU_FR300:  return bfd_mach_fr300;
4265     case EF_FRV_CPU_SIMPLE: return bfd_mach_frvsimple;
4266     case EF_FRV_CPU_TOMCAT: return bfd_mach_frvtomcat;
4267     }
4268
4269   return bfd_mach_frv;
4270 }
4271
4272 /* Set the right machine number for a FRV ELF file.  */
4273
4274 static bfd_boolean
4275 elf32_frv_object_p (abfd)
4276      bfd *abfd;
4277 {
4278   bfd_default_set_arch_mach (abfd, bfd_arch_frv, elf32_frv_machine (abfd));
4279   return (((elf_elfheader (abfd)->e_flags & EF_FRV_FDPIC) != 0)
4280           == (IS_FDPIC (abfd)));
4281 }
4282 \f
4283 /* Function to set the ELF flag bits.  */
4284
4285 static bfd_boolean
4286 frv_elf_set_private_flags (abfd, flags)
4287      bfd *abfd;
4288      flagword flags;
4289 {
4290   elf_elfheader (abfd)->e_flags = flags;
4291   elf_flags_init (abfd) = TRUE;
4292   return TRUE;
4293 }
4294
4295 /* Copy backend specific data from one object module to another.  */
4296
4297 static bfd_boolean
4298 frv_elf_copy_private_bfd_data (ibfd, obfd)
4299      bfd *ibfd;
4300      bfd *obfd;
4301 {
4302   if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
4303       || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
4304     return TRUE;
4305
4306   BFD_ASSERT (!elf_flags_init (obfd)
4307               || elf_elfheader (obfd)->e_flags == elf_elfheader (ibfd)->e_flags);
4308
4309   elf_elfheader (obfd)->e_flags = elf_elfheader (ibfd)->e_flags;
4310   elf_flags_init (obfd) = TRUE;
4311   return TRUE;
4312 }
4313
4314 /* Return true if the architecture described by elf header flag
4315    EXTENSION is an extension of the architecture described by BASE.  */
4316
4317 static bfd_boolean
4318 frv_elf_arch_extension_p (flagword base, flagword extension)
4319 {
4320   if (base == extension)
4321     return TRUE;
4322
4323   /* CPU_GENERIC code can be merged with code for a specific
4324      architecture, in which case the result is marked as being
4325      for the specific architecture.  Everything is therefore
4326      an extension of CPU_GENERIC.  */
4327   if (base == EF_FRV_CPU_GENERIC)
4328     return TRUE;
4329
4330   if (extension == EF_FRV_CPU_FR450)
4331     if (base == EF_FRV_CPU_FR400 || base == EF_FRV_CPU_FR405)
4332       return TRUE;
4333
4334   if (extension == EF_FRV_CPU_FR405)
4335     if (base == EF_FRV_CPU_FR400)
4336       return TRUE;
4337
4338   return FALSE;
4339 }
4340
4341 static bfd_boolean
4342 elf32_frvfdpic_copy_private_bfd_data (bfd *ibfd, bfd *obfd)
4343 {
4344   unsigned i;
4345
4346   if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
4347       || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
4348     return TRUE;
4349
4350   if (! frv_elf_copy_private_bfd_data (ibfd, obfd))
4351     return FALSE;
4352
4353   if (! elf_tdata (ibfd) || ! elf_tdata (ibfd)->phdr
4354       || ! elf_tdata (obfd) || ! elf_tdata (obfd)->phdr)
4355     return TRUE;
4356
4357   /* Copy the stack size.  */
4358   for (i = 0; i < elf_elfheader (ibfd)->e_phnum; i++)
4359     if (elf_tdata (ibfd)->phdr[i].p_type == PT_GNU_STACK)
4360       {
4361         Elf_Internal_Phdr *iphdr = &elf_tdata (ibfd)->phdr[i];
4362
4363         for (i = 0; i < elf_elfheader (obfd)->e_phnum; i++)
4364           if (elf_tdata (obfd)->phdr[i].p_type == PT_GNU_STACK)
4365             {
4366               memcpy (&elf_tdata (obfd)->phdr[i], iphdr, sizeof (*iphdr));
4367
4368               /* Rewrite the phdrs, since we're only called after they
4369                  were first written.  */
4370               if (bfd_seek (obfd, (bfd_signed_vma) get_elf_backend_data (obfd)
4371                             ->s->sizeof_ehdr, SEEK_SET) != 0
4372                   || get_elf_backend_data (obfd)->s
4373                   ->write_out_phdrs (obfd, elf_tdata (obfd)->phdr,
4374                                      elf_elfheader (obfd)->e_phnum) != 0)
4375                 return FALSE;
4376               break;
4377             }
4378
4379         break;
4380       }
4381
4382   return TRUE;
4383 }
4384
4385 /* Merge backend specific data from an object file to the output
4386    object file when linking.  */
4387
4388 static bfd_boolean
4389 frv_elf_merge_private_bfd_data (ibfd, obfd)
4390      bfd *ibfd;
4391      bfd *obfd;
4392 {
4393   flagword old_flags, old_partial;
4394   flagword new_flags, new_partial;
4395   bfd_boolean error = FALSE;
4396   char new_opt[80];
4397   char old_opt[80];
4398
4399   new_opt[0] = old_opt[0] = '\0';
4400   new_flags = elf_elfheader (ibfd)->e_flags;
4401   old_flags = elf_elfheader (obfd)->e_flags;
4402
4403   if (new_flags & EF_FRV_FDPIC)
4404     new_flags &= ~EF_FRV_PIC;
4405
4406 #ifdef DEBUG
4407   (*_bfd_error_handler) ("old_flags = 0x%.8lx, new_flags = 0x%.8lx, init = %s, filename = %s",
4408                          old_flags, new_flags, elf_flags_init (obfd) ? "yes" : "no",
4409                          bfd_get_filename (ibfd));
4410 #endif
4411
4412   if (!elf_flags_init (obfd))                   /* First call, no flags set.  */
4413     {
4414       elf_flags_init (obfd) = TRUE;
4415       old_flags = new_flags;
4416     }
4417
4418   else if (new_flags == old_flags)              /* Compatible flags are ok.  */
4419     ;
4420
4421   else                                          /* Possibly incompatible flags.  */
4422     {
4423       /* Warn if different # of gprs are used.  Note, 0 means nothing is
4424          said about the size of gprs.  */
4425       new_partial = (new_flags & EF_FRV_GPR_MASK);
4426       old_partial = (old_flags & EF_FRV_GPR_MASK);
4427       if (new_partial == old_partial)
4428         ;
4429
4430       else if (new_partial == 0)
4431         ;
4432
4433       else if (old_partial == 0)
4434         old_flags |= new_partial;
4435
4436       else
4437         {
4438           switch (new_partial)
4439             {
4440             default:            strcat (new_opt, " -mgpr-??"); break;
4441             case EF_FRV_GPR_32: strcat (new_opt, " -mgpr-32"); break;
4442             case EF_FRV_GPR_64: strcat (new_opt, " -mgpr-64"); break;
4443             }
4444
4445           switch (old_partial)
4446             {
4447             default:            strcat (old_opt, " -mgpr-??"); break;
4448             case EF_FRV_GPR_32: strcat (old_opt, " -mgpr-32"); break;
4449             case EF_FRV_GPR_64: strcat (old_opt, " -mgpr-64"); break;
4450             }
4451         }
4452
4453       /* Warn if different # of fprs are used.  Note, 0 means nothing is
4454          said about the size of fprs.  */
4455       new_partial = (new_flags & EF_FRV_FPR_MASK);
4456       old_partial = (old_flags & EF_FRV_FPR_MASK);
4457       if (new_partial == old_partial)
4458         ;
4459
4460       else if (new_partial == 0)
4461         ;
4462
4463       else if (old_partial == 0)
4464         old_flags |= new_partial;
4465
4466       else
4467         {
4468           switch (new_partial)
4469             {
4470             default:              strcat (new_opt, " -mfpr-?");      break;
4471             case EF_FRV_FPR_32:   strcat (new_opt, " -mfpr-32");     break;
4472             case EF_FRV_FPR_64:   strcat (new_opt, " -mfpr-64");     break;
4473             case EF_FRV_FPR_NONE: strcat (new_opt, " -msoft-float"); break;
4474             }
4475
4476           switch (old_partial)
4477             {
4478             default:              strcat (old_opt, " -mfpr-?");      break;
4479             case EF_FRV_FPR_32:   strcat (old_opt, " -mfpr-32");     break;
4480             case EF_FRV_FPR_64:   strcat (old_opt, " -mfpr-64");     break;
4481             case EF_FRV_FPR_NONE: strcat (old_opt, " -msoft-float"); break;
4482             }
4483         }
4484
4485       /* Warn if different dword support was used.  Note, 0 means nothing is
4486          said about the dword support.  */
4487       new_partial = (new_flags & EF_FRV_DWORD_MASK);
4488       old_partial = (old_flags & EF_FRV_DWORD_MASK);
4489       if (new_partial == old_partial)
4490         ;
4491
4492       else if (new_partial == 0)
4493         ;
4494
4495       else if (old_partial == 0)
4496         old_flags |= new_partial;
4497
4498       else
4499         {
4500           switch (new_partial)
4501             {
4502             default:               strcat (new_opt, " -mdword-?");  break;
4503             case EF_FRV_DWORD_YES: strcat (new_opt, " -mdword");    break;
4504             case EF_FRV_DWORD_NO:  strcat (new_opt, " -mno-dword"); break;
4505             }
4506
4507           switch (old_partial)
4508             {
4509             default:               strcat (old_opt, " -mdword-?");  break;
4510             case EF_FRV_DWORD_YES: strcat (old_opt, " -mdword");    break;
4511             case EF_FRV_DWORD_NO:  strcat (old_opt, " -mno-dword"); break;
4512             }
4513         }
4514
4515       /* Or in flags that accumulate (ie, if one module uses it, mark that the
4516          feature is used.  */
4517       old_flags |= new_flags & (EF_FRV_DOUBLE
4518                                 | EF_FRV_MEDIA
4519                                 | EF_FRV_MULADD
4520                                 | EF_FRV_NON_PIC_RELOCS);
4521
4522       /* If any module was compiled without -G0, clear the G0 bit.  */
4523       old_flags = ((old_flags & ~ EF_FRV_G0)
4524                    | (old_flags & new_flags & EF_FRV_G0));
4525
4526       /* If any module was compiled without -mnopack, clear the mnopack bit.  */
4527       old_flags = ((old_flags & ~ EF_FRV_NOPACK)
4528                    | (old_flags & new_flags & EF_FRV_NOPACK));
4529
4530       /* We don't have to do anything if the pic flags are the same, or the new
4531          module(s) were compiled with -mlibrary-pic.  */
4532       new_partial = (new_flags & EF_FRV_PIC_FLAGS);
4533       old_partial = (old_flags & EF_FRV_PIC_FLAGS);
4534       if ((new_partial == old_partial) || ((new_partial & EF_FRV_LIBPIC) != 0))
4535         ;
4536
4537       /* If the old module(s) were compiled with -mlibrary-pic, copy in the pic
4538          flags if any from the new module.  */
4539       else if ((old_partial & EF_FRV_LIBPIC) != 0)
4540         old_flags = (old_flags & ~ EF_FRV_PIC_FLAGS) | new_partial;
4541
4542       /* If we have mixtures of -fpic and -fPIC, or in both bits.  */
4543       else if (new_partial != 0 && old_partial != 0)
4544         old_flags |= new_partial;
4545
4546       /* One module was compiled for pic and the other was not, see if we have
4547          had any relocations that are not pic-safe.  */
4548       else
4549         {
4550           if ((old_flags & EF_FRV_NON_PIC_RELOCS) == 0)
4551             old_flags |= new_partial;
4552           else
4553             {
4554               old_flags &= ~ EF_FRV_PIC_FLAGS;
4555 #ifndef FRV_NO_PIC_ERROR
4556               error = TRUE;
4557               (*_bfd_error_handler)
4558                 (_("%s: compiled with %s and linked with modules that use non-pic relocations"),
4559                  bfd_get_filename (ibfd),
4560                  (new_flags & EF_FRV_BIGPIC) ? "-fPIC" : "-fpic");
4561 #endif
4562             }
4563         }
4564
4565       /* Warn if different cpu is used (allow a specific cpu to override
4566          the generic cpu).  */
4567       new_partial = (new_flags & EF_FRV_CPU_MASK);
4568       old_partial = (old_flags & EF_FRV_CPU_MASK);
4569       if (frv_elf_arch_extension_p (new_partial, old_partial))
4570         ;
4571
4572       else if (frv_elf_arch_extension_p (old_partial, new_partial))
4573         old_flags = (old_flags & ~EF_FRV_CPU_MASK) | new_partial;
4574
4575       else
4576         {
4577           switch (new_partial)
4578             {
4579             default:                 strcat (new_opt, " -mcpu=?");      break;
4580             case EF_FRV_CPU_GENERIC: strcat (new_opt, " -mcpu=frv");    break;
4581             case EF_FRV_CPU_SIMPLE:  strcat (new_opt, " -mcpu=simple"); break;
4582             case EF_FRV_CPU_FR550:   strcat (new_opt, " -mcpu=fr550");  break;
4583             case EF_FRV_CPU_FR500:   strcat (new_opt, " -mcpu=fr500");  break;
4584             case EF_FRV_CPU_FR450:   strcat (new_opt, " -mcpu=fr450");  break;
4585             case EF_FRV_CPU_FR405:   strcat (new_opt, " -mcpu=fr405");  break;
4586             case EF_FRV_CPU_FR400:   strcat (new_opt, " -mcpu=fr400");  break;
4587             case EF_FRV_CPU_FR300:   strcat (new_opt, " -mcpu=fr300");  break;
4588             case EF_FRV_CPU_TOMCAT:  strcat (new_opt, " -mcpu=tomcat"); break;
4589             }
4590
4591           switch (old_partial)
4592             {
4593             default:                 strcat (old_opt, " -mcpu=?");      break;
4594             case EF_FRV_CPU_GENERIC: strcat (old_opt, " -mcpu=frv");    break;
4595             case EF_FRV_CPU_SIMPLE:  strcat (old_opt, " -mcpu=simple"); break;
4596             case EF_FRV_CPU_FR550:   strcat (old_opt, " -mcpu=fr550");  break;
4597             case EF_FRV_CPU_FR500:   strcat (old_opt, " -mcpu=fr500");  break;
4598             case EF_FRV_CPU_FR450:   strcat (old_opt, " -mcpu=fr450");  break;
4599             case EF_FRV_CPU_FR405:   strcat (old_opt, " -mcpu=fr405");  break;
4600             case EF_FRV_CPU_FR400:   strcat (old_opt, " -mcpu=fr400");  break;
4601             case EF_FRV_CPU_FR300:   strcat (old_opt, " -mcpu=fr300");  break;
4602             case EF_FRV_CPU_TOMCAT:  strcat (old_opt, " -mcpu=tomcat"); break;
4603             }
4604         }
4605
4606       /* Print out any mismatches from above.  */
4607       if (new_opt[0])
4608         {
4609           error = TRUE;
4610           (*_bfd_error_handler)
4611             (_("%s: compiled with %s and linked with modules compiled with %s"),
4612              bfd_get_filename (ibfd), new_opt, old_opt);
4613         }
4614
4615       /* Warn about any other mismatches */
4616       new_partial = (new_flags & ~ EF_FRV_ALL_FLAGS);
4617       old_partial = (old_flags & ~ EF_FRV_ALL_FLAGS);
4618       if (new_partial != old_partial)
4619         {
4620           old_flags |= new_partial;
4621           error = TRUE;
4622           (*_bfd_error_handler)
4623             (_("%s: uses different unknown e_flags (0x%lx) fields than previous modules (0x%lx)"),
4624              bfd_get_filename (ibfd), (long)new_partial, (long)old_partial);
4625         }
4626     }
4627
4628   /* If the cpu is -mcpu=simple, then set the -mnopack bit.  */
4629   if ((old_flags & EF_FRV_CPU_MASK) == EF_FRV_CPU_SIMPLE)
4630     old_flags |= EF_FRV_NOPACK;
4631
4632   /* Update the old flags now with changes made above.  */
4633   old_partial = elf_elfheader (obfd)->e_flags & EF_FRV_CPU_MASK;
4634   elf_elfheader (obfd)->e_flags = old_flags;
4635   if (old_partial != (old_flags & EF_FRV_CPU_MASK))
4636     bfd_default_set_arch_mach (obfd, bfd_arch_frv, elf32_frv_machine (obfd));
4637
4638   if (((new_flags & EF_FRV_FDPIC) == 0)
4639       != (! IS_FDPIC (ibfd)))
4640     {
4641       error = TRUE;
4642       if (IS_FDPIC (obfd))
4643         (*_bfd_error_handler)
4644           (_("%s: cannot link non-fdpic object file into fdpic executable"),
4645            bfd_get_filename (ibfd));
4646       else
4647         (*_bfd_error_handler)
4648           (_("%s: cannot link fdpic object file into non-fdpic executable"),
4649            bfd_get_filename (ibfd));
4650     }
4651
4652   if (error)
4653     bfd_set_error (bfd_error_bad_value);
4654
4655   return !error;
4656 }
4657
4658 \f
4659 bfd_boolean
4660 frv_elf_print_private_bfd_data (abfd, ptr)
4661      bfd *abfd;
4662      PTR ptr;
4663 {
4664   FILE *file = (FILE *) ptr;
4665   flagword flags;
4666
4667   BFD_ASSERT (abfd != NULL && ptr != NULL);
4668
4669   /* Print normal ELF private data.  */
4670   _bfd_elf_print_private_bfd_data (abfd, ptr);
4671
4672   flags = elf_elfheader (abfd)->e_flags;
4673   fprintf (file, _("private flags = 0x%lx:"), (long)flags);
4674
4675   switch (flags & EF_FRV_CPU_MASK)
4676     {
4677     default:                                                    break;
4678     case EF_FRV_CPU_SIMPLE: fprintf (file, " -mcpu=simple");    break;
4679     case EF_FRV_CPU_FR550:  fprintf (file, " -mcpu=fr550");     break;
4680     case EF_FRV_CPU_FR500:  fprintf (file, " -mcpu=fr500");     break;
4681     case EF_FRV_CPU_FR450:  fprintf (file, " -mcpu=fr450");     break;
4682     case EF_FRV_CPU_FR405:  fprintf (file, " -mcpu=fr405");     break;
4683     case EF_FRV_CPU_FR400:  fprintf (file, " -mcpu=fr400");     break;
4684     case EF_FRV_CPU_FR300:  fprintf (file, " -mcpu=fr300");     break;
4685     case EF_FRV_CPU_TOMCAT: fprintf (file, " -mcpu=tomcat");    break;
4686     }
4687
4688   switch (flags & EF_FRV_GPR_MASK)
4689     {
4690     default:                                                    break;
4691     case EF_FRV_GPR_32: fprintf (file, " -mgpr-32");            break;
4692     case EF_FRV_GPR_64: fprintf (file, " -mgpr-64");            break;
4693     }
4694
4695   switch (flags & EF_FRV_FPR_MASK)
4696     {
4697     default:                                                    break;
4698     case EF_FRV_FPR_32:   fprintf (file, " -mfpr-32");          break;
4699     case EF_FRV_FPR_64:   fprintf (file, " -mfpr-64");          break;
4700     case EF_FRV_FPR_NONE: fprintf (file, " -msoft-float");      break;
4701     }
4702
4703   switch (flags & EF_FRV_DWORD_MASK)
4704     {
4705     default:                                                    break;
4706     case EF_FRV_DWORD_YES: fprintf (file, " -mdword");          break;
4707     case EF_FRV_DWORD_NO:  fprintf (file, " -mno-dword");       break;
4708     }
4709
4710   if (flags & EF_FRV_DOUBLE)
4711     fprintf (file, " -mdouble");
4712
4713   if (flags & EF_FRV_MEDIA)
4714     fprintf (file, " -mmedia");
4715
4716   if (flags & EF_FRV_MULADD)
4717     fprintf (file, " -mmuladd");
4718
4719   if (flags & EF_FRV_PIC)
4720     fprintf (file, " -fpic");
4721
4722   if (flags & EF_FRV_BIGPIC)
4723     fprintf (file, " -fPIC");
4724
4725   if (flags & EF_FRV_LIBPIC)
4726     fprintf (file, " -mlibrary-pic");
4727
4728   if (flags & EF_FRV_FDPIC)
4729     fprintf (file, " -mfdpic");
4730   
4731   if (flags & EF_FRV_NON_PIC_RELOCS)
4732     fprintf (file, " non-pic relocations");
4733
4734   if (flags & EF_FRV_G0)
4735     fprintf (file, " -G0");
4736
4737   fputc ('\n', file);
4738   return TRUE;
4739 }
4740
4741 \f
4742 #define ELF_ARCH                bfd_arch_frv
4743 #define ELF_MACHINE_CODE        EM_CYGNUS_FRV
4744 #define ELF_MAXPAGESIZE         0x1000
4745
4746 #define TARGET_BIG_SYM          bfd_elf32_frv_vec
4747 #define TARGET_BIG_NAME         "elf32-frv"
4748
4749 #define elf_info_to_howto                       frv_info_to_howto_rela
4750 #define elf_backend_relocate_section            elf32_frv_relocate_section
4751 #define elf_backend_gc_mark_hook                elf32_frv_gc_mark_hook
4752 #define elf_backend_gc_sweep_hook               elf32_frv_gc_sweep_hook
4753 #define elf_backend_check_relocs                elf32_frv_check_relocs
4754 #define elf_backend_object_p                    elf32_frv_object_p
4755 #define elf_backend_add_symbol_hook             elf32_frv_add_symbol_hook
4756
4757 #define elf_backend_can_gc_sections             1
4758 #define elf_backend_rela_normal                 1
4759
4760 #define bfd_elf32_bfd_reloc_type_lookup         frv_reloc_type_lookup
4761 #define bfd_elf32_bfd_set_private_flags         frv_elf_set_private_flags
4762 #define bfd_elf32_bfd_copy_private_bfd_data     frv_elf_copy_private_bfd_data
4763 #define bfd_elf32_bfd_merge_private_bfd_data    frv_elf_merge_private_bfd_data
4764 #define bfd_elf32_bfd_print_private_bfd_data    frv_elf_print_private_bfd_data
4765
4766 #define elf_backend_want_got_sym        1
4767 #define elf_backend_got_header_size     0
4768 #define elf_backend_want_got_plt        0
4769 #define elf_backend_plt_readonly        1
4770 #define elf_backend_want_plt_sym        0
4771 #define elf_backend_plt_header_size     0
4772
4773 #define elf_backend_finish_dynamic_sections \
4774                 elf32_frv_finish_dynamic_sections
4775
4776 #include "elf32-target.h"
4777
4778 #undef ELF_MAXPAGESIZE
4779 #define ELF_MAXPAGESIZE         0x4000
4780
4781 #undef TARGET_BIG_SYM
4782 #define TARGET_BIG_SYM          bfd_elf32_frvfdpic_vec
4783 #undef TARGET_BIG_NAME
4784 #define TARGET_BIG_NAME         "elf32-frvfdpic"
4785 #undef  elf32_bed
4786 #define elf32_bed               elf32_frvfdpic_bed
4787
4788 #undef elf_info_to_howto_rel
4789 #define elf_info_to_howto_rel   frvfdpic_info_to_howto_rel
4790
4791 #undef bfd_elf32_bfd_link_hash_table_create
4792 #define bfd_elf32_bfd_link_hash_table_create \
4793                 frvfdpic_elf_link_hash_table_create
4794 #undef elf_backend_always_size_sections
4795 #define elf_backend_always_size_sections \
4796                 elf32_frvfdpic_always_size_sections
4797 #undef elf_backend_modify_segment_map
4798 #define elf_backend_modify_segment_map \
4799                 elf32_frvfdpic_modify_segment_map
4800 #undef bfd_elf32_bfd_copy_private_bfd_data
4801 #define bfd_elf32_bfd_copy_private_bfd_data \
4802                 elf32_frvfdpic_copy_private_bfd_data
4803
4804 #undef elf_backend_create_dynamic_sections
4805 #define elf_backend_create_dynamic_sections \
4806                 elf32_frvfdpic_create_dynamic_sections
4807 #undef elf_backend_adjust_dynamic_symbol
4808 #define elf_backend_adjust_dynamic_symbol \
4809                 elf32_frvfdpic_adjust_dynamic_symbol
4810 #undef elf_backend_size_dynamic_sections
4811 #define elf_backend_size_dynamic_sections \
4812                 elf32_frvfdpic_size_dynamic_sections
4813 #undef elf_backend_finish_dynamic_symbol
4814 #define elf_backend_finish_dynamic_symbol \
4815                 elf32_frvfdpic_finish_dynamic_symbol
4816 #undef elf_backend_finish_dynamic_sections
4817 #define elf_backend_finish_dynamic_sections \
4818                 elf32_frvfdpic_finish_dynamic_sections
4819
4820 #undef elf_backend_can_make_relative_eh_frame
4821 #define elf_backend_can_make_relative_eh_frame \
4822                 frvfdpic_elf_use_relative_eh_frame
4823 #undef elf_backend_can_make_lsda_relative_eh_frame
4824 #define elf_backend_can_make_lsda_relative_eh_frame \
4825                 frvfdpic_elf_use_relative_eh_frame
4826 #undef elf_backend_encode_eh_address
4827 #define elf_backend_encode_eh_address \
4828                 frvfdpic_elf_encode_eh_address
4829
4830 #undef elf_backend_may_use_rel_p
4831 #define elf_backend_may_use_rel_p       1
4832 #undef elf_backend_may_use_rela_p
4833 #define elf_backend_may_use_rela_p      1
4834 /* We use REL for dynamic relocations only.  */
4835 #undef elf_backend_default_use_rela_p
4836 #define elf_backend_default_use_rela_p  1
4837
4838 #undef elf_backend_omit_section_dynsym
4839 #define elf_backend_omit_section_dynsym _frvfdpic_link_omit_section_dynsym
4840
4841 #include "elf32-target.h"
This page took 0.298502 seconds and 4 git commands to generate.