1/* FRV-specific support for 32-bit ELF.
2   Copyright 2002, 2003, 2004 Free Software Foundation, Inc.
3
4This file is part of BFD, the Binary File Descriptor library.
5
6This program is free software; you can redistribute it and/or modify
7it under the terms of the GNU General Public License as published by
8the Free Software Foundation; either version 2 of the License, or
9(at your option) any later version.
10
11This program is distributed in the hope that it will be useful,
12but WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14GNU General Public License for more details.
15
16You should have received a copy of the GNU General Public License
17along with this program; if not, write to the Free Software
18Foundation, 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.  */
29static bfd_reloc_status_type elf32_frv_relocate_lo16
30  PARAMS ((bfd *,  Elf_Internal_Rela *, bfd_byte *, bfd_vma));
31static bfd_reloc_status_type elf32_frv_relocate_hi16
32  PARAMS ((bfd *,  Elf_Internal_Rela *, bfd_byte *, bfd_vma));
33static bfd_reloc_status_type elf32_frv_relocate_label24
34  PARAMS ((bfd *, asection *, Elf_Internal_Rela *, bfd_byte *, bfd_vma));
35static bfd_reloc_status_type elf32_frv_relocate_gprel12
36  PARAMS ((struct bfd_link_info *, bfd *, asection *, Elf_Internal_Rela *,
37	   bfd_byte *, bfd_vma));
38static bfd_reloc_status_type elf32_frv_relocate_gprelu12
39  PARAMS ((struct bfd_link_info *, bfd *, asection *, Elf_Internal_Rela *,
40	   bfd_byte *, bfd_vma));
41static bfd_reloc_status_type elf32_frv_relocate_gprello
42  PARAMS ((struct bfd_link_info *, bfd *, asection *, Elf_Internal_Rela *,
43	   bfd_byte *, bfd_vma));
44static bfd_reloc_status_type elf32_frv_relocate_gprelhi
45  PARAMS ((struct bfd_link_info *, bfd *, asection *, Elf_Internal_Rela *,
46	   bfd_byte *, bfd_vma));
47static reloc_howto_type *frv_reloc_type_lookup
48  PARAMS ((bfd *, bfd_reloc_code_real_type));
49static void frv_info_to_howto_rela
50  PARAMS ((bfd *, arelent *, Elf_Internal_Rela *));
51static 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 **));
54static bfd_boolean elf32_frv_add_symbol_hook
55  PARAMS (( bfd *, struct bfd_link_info *, Elf_Internal_Sym *,
56	    const char **, flagword *, asection **, bfd_vma *));
57static bfd_reloc_status_type frv_final_link_relocate
58  PARAMS ((reloc_howto_type *, bfd *, asection *, bfd_byte *,
59	   Elf_Internal_Rela *, bfd_vma));
60static bfd_boolean elf32_frv_gc_sweep_hook
61  PARAMS ((bfd *, struct bfd_link_info *, asection *, const
62	   Elf_Internal_Rela *));
63static 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 *));
66static bfd_boolean elf32_frv_check_relocs
67  PARAMS ((bfd *, struct bfd_link_info *, asection *,
68	   const Elf_Internal_Rela *));
69static int elf32_frv_machine
70  PARAMS ((bfd *));
71static bfd_boolean elf32_frv_object_p
72  PARAMS ((bfd *));
73static bfd_boolean frv_elf_set_private_flags
74  PARAMS ((bfd *, flagword));
75static bfd_boolean frv_elf_copy_private_bfd_data
76  PARAMS ((bfd *, bfd *));
77static bfd_boolean frv_elf_merge_private_bfd_data
78  PARAMS ((bfd *, bfd *));
79static bfd_boolean frv_elf_print_private_bfd_data
80  PARAMS ((bfd *, PTR));
81
82static 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.  */
467static 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.  */
483static 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.  */
500static 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
515static 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
530static 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
546/* Map BFD reloc types to FRV ELF reloc types.  */
547#if 0
548struct frv_reloc_map
549{
550  unsigned int bfd_reloc_val;
551  unsigned int frv_reloc_val;
552};
553
554static 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
586extern 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.  */
591struct 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
639static struct bfd_link_hash_table *
640frvfdpic_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.  */
671struct 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.  */
760static hashval_t
761frvfdpic_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.  */
772static int
773frvfdpic_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.  */
785static struct frvfdpic_relocs_info *
786frvfdpic_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.  */
817inline static struct frvfdpic_relocs_info *
818frvfdpic_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.  */
836inline static struct frvfdpic_relocs_info *
837frvfdpic_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
855inline static void
856frvfdpic_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
914inline 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
950static 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
981static 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
1006inline 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
1017inline 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
1420static bfd_reloc_status_type
1421elf32_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
1459static bfd_reloc_status_type
1460elf32_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
1501static bfd_reloc_status_type
1502elf32_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}
1524static bfd_reloc_status_type
1525elf32_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
1549static bfd_reloc_status_type
1550elf32_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
1592static bfd_reloc_status_type
1593elf32_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
1627static bfd_reloc_status_type
1628elf32_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
1663static reloc_howto_type *
1664frv_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
1771static void
1772frv_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.  */
1797static void
1798frvfdpic_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
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
1827static bfd_reloc_status_type
1828frv_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
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
1873static bfd_boolean
1874elf32_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		(_("%B: relocation at `%A+0x%x' references symbol `%s' with nonzero addend"),
2046		 input_bfd, input_section, rel->r_offset, name);
2047	      return FALSE;
2048
2049	    }
2050
2051	  break;
2052
2053	default:
2054	non_fdpic:
2055	  picrel = NULL;
2056	  if (h && ! FRVFDPIC_SYM_LOCAL (info, h))
2057	    {
2058	      info->callbacks->warning
2059		(info, _("relocation references symbol not defined in the module"),
2060		 name, input_bfd, input_section, rel->r_offset);
2061	      return FALSE;
2062	    }
2063	  break;
2064	}
2065
2066      switch (r_type)
2067	{
2068	case R_FRV_LABEL24:
2069	  check_segment[0] = isec_segment;
2070	  if (! IS_FDPIC (output_bfd))
2071	    check_segment[1] = isec_segment;
2072	  else if (picrel->plt)
2073	    {
2074	      relocation = frvfdpic_plt_section (info)->output_section->vma
2075		+ frvfdpic_plt_section (info)->output_offset
2076		+ picrel->plt_entry;
2077	      check_segment[1] = plt_segment;
2078	    }
2079	  /* We don't want to warn on calls to undefined weak symbols,
2080	     as calls to them must be protected by non-NULL tests
2081	     anyway, and unprotected calls would invoke undefined
2082	     behavior.  */
2083	  else if (picrel->symndx == -1
2084		   && picrel->d.h->root.type == bfd_link_hash_undefweak)
2085	    check_segment[1] = check_segment[0];
2086	  else
2087	    check_segment[1] = sec
2088	      ? _frvfdpic_osec_to_segment (output_bfd, sec->output_section)
2089	      : (unsigned)-1;
2090	  break;
2091
2092	case R_FRV_GOT12:
2093	case R_FRV_GOTHI:
2094	case R_FRV_GOTLO:
2095	  relocation = picrel->got_entry;
2096	  check_segment[0] = check_segment[1] = got_segment;
2097	  break;
2098
2099	case R_FRV_FUNCDESC_GOT12:
2100	case R_FRV_FUNCDESC_GOTHI:
2101	case R_FRV_FUNCDESC_GOTLO:
2102	  relocation = picrel->fdgot_entry;
2103	  check_segment[0] = check_segment[1] = got_segment;
2104	  break;
2105
2106	case R_FRV_GOTOFFHI:
2107	case R_FRV_GOTOFF12:
2108	case R_FRV_GOTOFFLO:
2109	  relocation -= frvfdpic_got_section (info)->output_section->vma
2110	    + frvfdpic_got_section (info)->output_offset
2111	    + frvfdpic_got_initial_offset (info);
2112	  check_segment[0] = got_segment;
2113	  check_segment[1] = sec
2114	    ? _frvfdpic_osec_to_segment (output_bfd, sec->output_section)
2115	    : (unsigned)-1;
2116	  break;
2117
2118	case R_FRV_FUNCDESC_GOTOFF12:
2119	case R_FRV_FUNCDESC_GOTOFFHI:
2120	case R_FRV_FUNCDESC_GOTOFFLO:
2121	  relocation = picrel->fd_entry;
2122	  check_segment[0] = check_segment[1] = got_segment;
2123	  break;
2124
2125	case R_FRV_FUNCDESC:
2126	  {
2127	    int dynindx;
2128	    bfd_vma addend = rel->r_addend;
2129
2130	    if (! (h && h->root.type == bfd_link_hash_undefweak
2131		   && FRVFDPIC_SYM_LOCAL (info, h)))
2132	      {
2133		/* If the symbol is dynamic and there may be dynamic
2134		   symbol resolution because we are or are linked with a
2135		   shared library, emit a FUNCDESC relocation such that
2136		   the dynamic linker will allocate the function
2137		   descriptor.  If the symbol needs a non-local function
2138		   descriptor but binds locally (e.g., its visibility is
2139		   protected, emit a dynamic relocation decayed to
2140		   section+offset.  */
2141		if (h && ! FRVFDPIC_FUNCDESC_LOCAL (info, h)
2142		    && FRVFDPIC_SYM_LOCAL (info, h)
2143		    && !(info->executable && !info->pie))
2144		  {
2145		    dynindx = elf_section_data (h->root.u.def.section
2146						->output_section)->dynindx;
2147		    addend += h->root.u.def.section->output_offset
2148		      + h->root.u.def.value;
2149		  }
2150		else if (h && ! FRVFDPIC_FUNCDESC_LOCAL (info, h))
2151		  {
2152		    if (addend)
2153		      {
2154			info->callbacks->warning
2155			  (info, _("R_FRV_FUNCDESC references dynamic symbol with nonzero addend"),
2156			   name, input_bfd, input_section, rel->r_offset);
2157			return FALSE;
2158		      }
2159		    dynindx = h->dynindx;
2160		  }
2161		else
2162		  {
2163		    /* Otherwise, we know we have a private function
2164		       descriptor, so reference it directly.  */
2165		    BFD_ASSERT (picrel->privfd);
2166		    r_type = R_FRV_32;
2167		    dynindx = elf_section_data (frvfdpic_got_section (info)
2168						->output_section)->dynindx;
2169		    addend = frvfdpic_got_section (info)->output_offset
2170		      + frvfdpic_got_initial_offset (info)
2171		      + picrel->fd_entry;
2172		  }
2173
2174		/* If there is room for dynamic symbol resolution, emit
2175		   the dynamic relocation.  However, if we're linking an
2176		   executable at a fixed location, we won't have emitted a
2177		   dynamic symbol entry for the got section, so idx will
2178		   be zero, which means we can and should compute the
2179		   address of the private descriptor ourselves.  */
2180		if (info->executable && !info->pie
2181		    && (!h || FRVFDPIC_FUNCDESC_LOCAL (info, h)))
2182		  {
2183		    addend += frvfdpic_got_section (info)->output_section->vma;
2184		    if ((bfd_get_section_flags (output_bfd,
2185						input_section->output_section)
2186			 & (SEC_ALLOC | SEC_LOAD)) == (SEC_ALLOC | SEC_LOAD))
2187		      {
2188			if (_frvfdpic_osec_readonly_p (output_bfd,
2189						       input_section
2190						       ->output_section))
2191			  {
2192			    info->callbacks->warning
2193			      (info,
2194			       _("cannot emit fixups in read-only section"),
2195			       name, input_bfd, input_section, rel->r_offset);
2196			    return FALSE;
2197			  }
2198			_frvfdpic_add_rofixup (output_bfd,
2199					       frvfdpic_gotfixup_section
2200					       (info),
2201					       _bfd_elf_section_offset
2202					       (output_bfd, info,
2203						input_section, rel->r_offset)
2204					       + input_section
2205					       ->output_section->vma
2206					       + input_section->output_offset,
2207					       picrel);
2208		      }
2209		  }
2210		else if ((bfd_get_section_flags (output_bfd,
2211						 input_section->output_section)
2212			  & (SEC_ALLOC | SEC_LOAD)) == (SEC_ALLOC | SEC_LOAD))
2213		  {
2214		    if (_frvfdpic_osec_readonly_p (output_bfd,
2215						   input_section
2216						   ->output_section))
2217		      {
2218			info->callbacks->warning
2219			  (info,
2220			   _("cannot emit dynamic relocations in read-only section"),
2221			   name, input_bfd, input_section, rel->r_offset);
2222			return FALSE;
2223		      }
2224		    _frvfdpic_add_dyn_reloc (output_bfd,
2225					     frvfdpic_gotrel_section (info),
2226					     _bfd_elf_section_offset
2227					     (output_bfd, info,
2228					      input_section, rel->r_offset)
2229					     + input_section
2230					     ->output_section->vma
2231					     + input_section->output_offset,
2232					     r_type, dynindx, addend, picrel);
2233		  }
2234		else
2235		  addend += frvfdpic_got_section (info)->output_section->vma;
2236	      }
2237
2238	    /* We want the addend in-place because dynamic
2239	       relocations are REL.  Setting relocation to it should
2240	       arrange for it to be installed.  */
2241	    relocation = addend - rel->r_addend;
2242	  }
2243	  check_segment[0] = check_segment[1] = got_segment;
2244	  break;
2245
2246	case R_FRV_32:
2247	  if (! IS_FDPIC (output_bfd))
2248	    {
2249	      check_segment[0] = check_segment[1] = -1;
2250	      break;
2251	    }
2252	  /* Fall through.  */
2253	case R_FRV_FUNCDESC_VALUE:
2254	  {
2255	    int dynindx;
2256	    bfd_vma addend = rel->r_addend;
2257
2258	    /* If the symbol is dynamic but binds locally, use
2259	       section+offset.  */
2260	    if (h && ! FRVFDPIC_SYM_LOCAL (info, h))
2261	      {
2262		if (addend && r_type == R_FRV_FUNCDESC_VALUE)
2263		  {
2264		    info->callbacks->warning
2265		      (info, _("R_FRV_FUNCDESC_VALUE references dynamic symbol with nonzero addend"),
2266		       name, input_bfd, input_section, rel->r_offset);
2267		    return FALSE;
2268		  }
2269		dynindx = h->dynindx;
2270	      }
2271	    else
2272	      {
2273		if (h)
2274		  addend += h->root.u.def.value;
2275		else
2276		  addend += sym->st_value;
2277		if (osec)
2278		  addend += osec->output_offset;
2279		if (osec && osec->output_section
2280		    && ! bfd_is_abs_section (osec->output_section)
2281		    && ! bfd_is_und_section (osec->output_section))
2282		  dynindx = elf_section_data (osec->output_section)->dynindx;
2283		else
2284		  dynindx = 0;
2285	      }
2286
2287	    /* If we're linking an executable at a fixed address, we
2288	       can omit the dynamic relocation as long as the symbol
2289	       is defined in the current link unit (which is implied
2290	       by its output section not being NULL).  */
2291	    if (info->executable && !info->pie
2292		&& (!h || FRVFDPIC_SYM_LOCAL (info, h)))
2293	      {
2294		if (osec)
2295		  addend += osec->output_section->vma;
2296		if (IS_FDPIC (input_bfd)
2297		    && (bfd_get_section_flags (output_bfd,
2298					       input_section->output_section)
2299			& (SEC_ALLOC | SEC_LOAD)) == (SEC_ALLOC | SEC_LOAD))
2300		  {
2301		    if (_frvfdpic_osec_readonly_p (output_bfd,
2302						   input_section
2303						   ->output_section))
2304		      {
2305			info->callbacks->warning
2306			  (info,
2307			   _("cannot emit fixups in read-only section"),
2308			   name, input_bfd, input_section, rel->r_offset);
2309			return FALSE;
2310		      }
2311		    if (!h || h->root.type != bfd_link_hash_undefweak)
2312		      {
2313			_frvfdpic_add_rofixup (output_bfd,
2314					       frvfdpic_gotfixup_section
2315					       (info),
2316					       _bfd_elf_section_offset
2317					       (output_bfd, info,
2318						input_section, rel->r_offset)
2319					       + input_section
2320					       ->output_section->vma
2321					       + input_section->output_offset,
2322					       picrel);
2323			if (r_type == R_FRV_FUNCDESC_VALUE)
2324			  _frvfdpic_add_rofixup
2325			    (output_bfd,
2326			     frvfdpic_gotfixup_section (info),
2327			     _bfd_elf_section_offset
2328			     (output_bfd, info,
2329			      input_section, rel->r_offset)
2330			     + input_section->output_section->vma
2331			     + input_section->output_offset + 4, picrel);
2332		      }
2333		  }
2334	      }
2335	    else
2336	      {
2337		if ((bfd_get_section_flags (output_bfd,
2338					    input_section->output_section)
2339		     & (SEC_ALLOC | SEC_LOAD)) == (SEC_ALLOC | SEC_LOAD))
2340		  {
2341		    if (_frvfdpic_osec_readonly_p (output_bfd,
2342						   input_section
2343						   ->output_section))
2344		      {
2345			info->callbacks->warning
2346			  (info,
2347			   _("cannot emit dynamic relocations in read-only section"),
2348			   name, input_bfd, input_section, rel->r_offset);
2349			return FALSE;
2350		      }
2351		    _frvfdpic_add_dyn_reloc (output_bfd,
2352					     frvfdpic_gotrel_section (info),
2353					     _bfd_elf_section_offset
2354					     (output_bfd, info,
2355					      input_section, rel->r_offset)
2356					     + input_section
2357					     ->output_section->vma
2358					     + input_section->output_offset,
2359					     r_type, dynindx, addend, picrel);
2360		  }
2361		else if (osec)
2362		  addend += osec->output_section->vma;
2363		/* We want the addend in-place because dynamic
2364		   relocations are REL.  Setting relocation to it
2365		   should arrange for it to be installed.  */
2366		relocation = addend - rel->r_addend;
2367	      }
2368
2369	    if (r_type == R_FRV_FUNCDESC_VALUE)
2370	      {
2371		/* If we've omitted the dynamic relocation, just emit
2372		   the fixed addresses of the symbol and of the local
2373		   GOT base offset.  */
2374		if (info->executable && !info->pie
2375		    && (!h || FRVFDPIC_SYM_LOCAL (info, h)))
2376		  bfd_put_32 (output_bfd,
2377			      frvfdpic_got_section (info)->output_section->vma
2378			      + frvfdpic_got_section (info)->output_offset
2379			      + frvfdpic_got_initial_offset (info),
2380			      contents + rel->r_offset + 4);
2381		else
2382		  /* A function descriptor used for lazy or local
2383		     resolving is initialized such that its high word
2384		     contains the output section index in which the
2385		     PLT entries are located, and the low word
2386		     contains the offset of the lazy PLT entry entry
2387		     point into that section.  */
2388		  bfd_put_32 (output_bfd,
2389			      h && ! FRVFDPIC_SYM_LOCAL (info, h)
2390			      ? 0
2391			      : _frvfdpic_osec_to_segment (output_bfd,
2392							   sec
2393							   ->output_section),
2394			      contents + rel->r_offset + 4);
2395	      }
2396	  }
2397	  check_segment[0] = check_segment[1] = got_segment;
2398	  break;
2399
2400	case R_FRV_GPREL12:
2401	case R_FRV_GPRELU12:
2402	case R_FRV_GPREL32:
2403	case R_FRV_GPRELHI:
2404	case R_FRV_GPRELLO:
2405	  check_segment[0] = gprel_segment;
2406	  check_segment[1] = sec
2407	    ? _frvfdpic_osec_to_segment (output_bfd, sec->output_section)
2408	    : (unsigned)-1;
2409	  break;
2410
2411	default:
2412	  check_segment[0] = isec_segment;
2413	  check_segment[1] = sec
2414	    ? _frvfdpic_osec_to_segment (output_bfd, sec->output_section)
2415	    : (unsigned)-1;
2416	  break;
2417	}
2418
2419      if (check_segment[0] != check_segment[1] && IS_FDPIC (output_bfd))
2420	{
2421#if 1 /* If you take this out, remove the #error from fdpic-static-6.d
2422	 in the ld testsuite.  */
2423	  /* This helps catch problems in GCC while we can't do more
2424	     than static linking.  The idea is to test whether the
2425	     input file basename is crt0.o only once.  */
2426	  if (silence_segment_error == 1)
2427	    silence_segment_error =
2428	      (strlen (input_bfd->filename) == 6
2429	       && strcmp (input_bfd->filename, "crt0.o") == 0)
2430	      || (strlen (input_bfd->filename) > 6
2431		  && strcmp (input_bfd->filename
2432			     + strlen (input_bfd->filename) - 7,
2433			     "/crt0.o") == 0)
2434	      ? -1 : 0;
2435#endif
2436	  if (!silence_segment_error
2437	      /* We don't want duplicate errors for undefined
2438		 symbols.  */
2439	      && !(picrel && picrel->symndx == -1
2440		   && picrel->d.h->root.type == bfd_link_hash_undefined))
2441	    info->callbacks->warning
2442	      (info,
2443	       (info->shared || info->pie)
2444	       ? _("relocations between different segments are not supported")
2445	       : _("warning: relocation references a different segment"),
2446	       name, input_bfd, input_section, rel->r_offset);
2447	  if (!silence_segment_error && (info->shared || info->pie))
2448	    return FALSE;
2449	  elf_elfheader (output_bfd)->e_flags |= EF_FRV_PIC;
2450	}
2451
2452      switch (r_type)
2453	{
2454	case R_FRV_GOTOFFHI:
2455	  /* We need the addend to be applied before we shift the
2456	     value right.  */
2457	  relocation += rel->r_addend;
2458	  /* Fall through.  */
2459	case R_FRV_GOTHI:
2460	case R_FRV_FUNCDESC_GOTHI:
2461	case R_FRV_FUNCDESC_GOTOFFHI:
2462	  relocation >>= 16;
2463	  /* Fall through.  */
2464
2465	case R_FRV_GOTLO:
2466	case R_FRV_FUNCDESC_GOTLO:
2467	case R_FRV_GOTOFFLO:
2468	case R_FRV_FUNCDESC_GOTOFFLO:
2469	  relocation &= 0xffff;
2470	  break;
2471
2472	default:
2473	  break;
2474	}
2475
2476      switch (r_type)
2477	{
2478	case R_FRV_LABEL24:
2479	  if (! IS_FDPIC (output_bfd) || ! picrel->plt)
2480	    break;
2481	  /* Fall through.  */
2482
2483	  /* When referencing a GOT entry, a function descriptor or a
2484	     PLT, we don't want the addend to apply to the reference,
2485	     but rather to the referenced symbol.  The actual entry
2486	     will have already been created taking the addend into
2487	     account, so cancel it out here.  */
2488	case R_FRV_GOT12:
2489	case R_FRV_GOTHI:
2490	case R_FRV_GOTLO:
2491	case R_FRV_FUNCDESC_GOT12:
2492	case R_FRV_FUNCDESC_GOTHI:
2493	case R_FRV_FUNCDESC_GOTLO:
2494	case R_FRV_FUNCDESC_GOTOFF12:
2495	case R_FRV_FUNCDESC_GOTOFFHI:
2496	case R_FRV_FUNCDESC_GOTOFFLO:
2497	  /* Note that we only want GOTOFFHI, not GOTOFFLO or GOTOFF12
2498	     here, since we do want to apply the addend to the others.
2499	     Note that we've applied the addend to GOTOFFHI before we
2500	     shifted it right.  */
2501	case R_FRV_GOTOFFHI:
2502	  relocation -= rel->r_addend;
2503	  break;
2504
2505	default:
2506	  break;
2507	}
2508
2509     if (r_type == R_FRV_HI16)
2510       r = elf32_frv_relocate_hi16 (input_bfd, rel, contents, relocation);
2511
2512     else if (r_type == R_FRV_LO16)
2513       r = elf32_frv_relocate_lo16 (input_bfd, rel, contents, relocation);
2514
2515     else if (r_type == R_FRV_LABEL24)
2516       r = elf32_frv_relocate_label24 (input_bfd, input_section, rel,
2517				       contents, relocation);
2518
2519     else if (r_type == R_FRV_GPREL12)
2520       r = elf32_frv_relocate_gprel12 (info, input_bfd, input_section, rel,
2521				       contents, relocation);
2522
2523     else if (r_type == R_FRV_GPRELU12)
2524       r = elf32_frv_relocate_gprelu12 (info, input_bfd, input_section, rel,
2525					contents, relocation);
2526
2527     else if (r_type == R_FRV_GPRELLO)
2528       r = elf32_frv_relocate_gprello (info, input_bfd, input_section, rel,
2529				       contents, relocation);
2530
2531     else if (r_type == R_FRV_GPRELHI)
2532       r = elf32_frv_relocate_gprelhi (info, input_bfd, input_section, rel,
2533				       contents, relocation);
2534
2535     else
2536       r = frv_final_link_relocate (howto, input_bfd, input_section, contents,
2537				    rel, relocation);
2538
2539      if (r != bfd_reloc_ok)
2540	{
2541	  const char * msg = (const char *) NULL;
2542
2543	  switch (r)
2544	    {
2545	    case bfd_reloc_overflow:
2546	      r = info->callbacks->reloc_overflow
2547		(info, name, howto->name, (bfd_vma) 0,
2548		 input_bfd, input_section, rel->r_offset);
2549	      break;
2550
2551	    case bfd_reloc_undefined:
2552	      r = info->callbacks->undefined_symbol
2553		(info, name, input_bfd, input_section, rel->r_offset, TRUE);
2554	      break;
2555
2556	    case bfd_reloc_outofrange:
2557	      msg = _("internal error: out of range error");
2558	      break;
2559
2560	    case bfd_reloc_notsupported:
2561	      msg = _("internal error: unsupported relocation error");
2562	      break;
2563
2564	    case bfd_reloc_dangerous:
2565	      msg = _("internal error: dangerous relocation");
2566	      break;
2567
2568	    default:
2569	      msg = _("internal error: unknown error");
2570	      break;
2571	    }
2572
2573	  if (msg)
2574	    r = info->callbacks->warning
2575	      (info, msg, name, input_bfd, input_section, rel->r_offset);
2576
2577	  if (! r)
2578	    return FALSE;
2579	}
2580    }
2581
2582  return TRUE;
2583}
2584
2585/* Return the section that should be marked against GC for a given
2586   relocation.  */
2587
2588static asection *
2589elf32_frv_gc_mark_hook (sec, info, rel, h, sym)
2590     asection *sec;
2591     struct bfd_link_info *info ATTRIBUTE_UNUSED;
2592     Elf_Internal_Rela *rel;
2593     struct elf_link_hash_entry *h;
2594     Elf_Internal_Sym *sym;
2595{
2596  if (h != NULL)
2597    {
2598      switch (ELF32_R_TYPE (rel->r_info))
2599	{
2600	case R_FRV_GNU_VTINHERIT:
2601	case R_FRV_GNU_VTENTRY:
2602	  break;
2603
2604	default:
2605	  switch (h->root.type)
2606	    {
2607	    default:
2608	      break;
2609
2610	    case bfd_link_hash_defined:
2611	    case bfd_link_hash_defweak:
2612	      return h->root.u.def.section;
2613
2614	    case bfd_link_hash_common:
2615	      return h->root.u.c.p->section;
2616	    }
2617	}
2618    }
2619  else
2620    return bfd_section_from_elf_index (sec->owner, sym->st_shndx);
2621
2622  return NULL;
2623}
2624
2625/* Update the got entry reference counts for the section being removed.  */
2626
2627static bfd_boolean
2628elf32_frv_gc_sweep_hook (abfd, info, sec, relocs)
2629     bfd *abfd ATTRIBUTE_UNUSED;
2630     struct bfd_link_info *info ATTRIBUTE_UNUSED;
2631     asection *sec ATTRIBUTE_UNUSED;
2632     const Elf_Internal_Rela *relocs ATTRIBUTE_UNUSED;
2633{
2634  return TRUE;
2635}
2636
2637
2638/* Hook called by the linker routine which adds symbols from an object
2639   file.  We use it to put .comm items in .scomm, and not .comm.  */
2640
2641static bfd_boolean
2642elf32_frv_add_symbol_hook (abfd, info, sym, namep, flagsp, secp, valp)
2643     bfd *abfd;
2644     struct bfd_link_info *info;
2645     Elf_Internal_Sym *sym;
2646     const char **namep ATTRIBUTE_UNUSED;
2647     flagword *flagsp ATTRIBUTE_UNUSED;
2648     asection **secp;
2649     bfd_vma *valp;
2650{
2651  if (sym->st_shndx == SHN_COMMON
2652      && !info->relocatable
2653      && (int)sym->st_size <= (int)bfd_get_gp_size (abfd))
2654    {
2655      /* Common symbols less than or equal to -G nn bytes are
2656	 automatically put into .sbss.  */
2657
2658      asection *scomm = bfd_get_section_by_name (abfd, ".scommon");
2659
2660      if (scomm == NULL)
2661	{
2662	  scomm = bfd_make_section (abfd, ".scommon");
2663	  if (scomm == NULL
2664	      || !bfd_set_section_flags (abfd, scomm, (SEC_ALLOC
2665						       | SEC_IS_COMMON
2666						       | SEC_LINKER_CREATED)))
2667	    return FALSE;
2668	}
2669
2670      *secp = scomm;
2671      *valp = sym->st_size;
2672    }
2673
2674  return TRUE;
2675}
2676
2677/* We need dynamic symbols for every section, since segments can
2678   relocate independently.  */
2679static bfd_boolean
2680_frvfdpic_link_omit_section_dynsym (bfd *output_bfd ATTRIBUTE_UNUSED,
2681				    struct bfd_link_info *info
2682				    ATTRIBUTE_UNUSED,
2683				    asection *p ATTRIBUTE_UNUSED)
2684{
2685  switch (elf_section_data (p)->this_hdr.sh_type)
2686    {
2687    case SHT_PROGBITS:
2688    case SHT_NOBITS:
2689      /* If sh_type is yet undecided, assume it could be
2690	 SHT_PROGBITS/SHT_NOBITS.  */
2691    case SHT_NULL:
2692      return FALSE;
2693
2694      /* There shouldn't be section relative relocations
2695	 against any other section.  */
2696    default:
2697      return TRUE;
2698    }
2699}
2700
2701/* Create  a .got section, as well as its additional info field.  This
2702   is almost entirely copied from
2703   elflink.c:_bfd_elf_create_got_section().  */
2704
2705static bfd_boolean
2706_frv_create_got_section (bfd *abfd, struct bfd_link_info *info)
2707{
2708  flagword flags;
2709  asection *s;
2710  struct elf_link_hash_entry *h;
2711  struct bfd_link_hash_entry *bh;
2712  const struct elf_backend_data *bed = get_elf_backend_data (abfd);
2713  int ptralign;
2714  int offset;
2715
2716  /* This function may be called more than once.  */
2717  s = bfd_get_section_by_name (abfd, ".got");
2718  if (s != NULL && (s->flags & SEC_LINKER_CREATED) != 0)
2719    return TRUE;
2720
2721  /* Machine specific: although pointers are 32-bits wide, we want the
2722     GOT to be aligned to a 64-bit boundary, such that function
2723     descriptors in it can be accessed with 64-bit loads and
2724     stores.  */
2725  ptralign = 3;
2726
2727  flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
2728	   | SEC_LINKER_CREATED);
2729
2730  s = bfd_make_section (abfd, ".got");
2731  if (s == NULL
2732      || !bfd_set_section_flags (abfd, s, flags)
2733      || !bfd_set_section_alignment (abfd, s, ptralign))
2734    return FALSE;
2735
2736  if (bed->want_got_plt)
2737    {
2738      s = bfd_make_section (abfd, ".got.plt");
2739      if (s == NULL
2740	  || !bfd_set_section_flags (abfd, s, flags)
2741	  || !bfd_set_section_alignment (abfd, s, ptralign))
2742	return FALSE;
2743    }
2744
2745  if (bed->want_got_sym)
2746    {
2747      /* Define the symbol _GLOBAL_OFFSET_TABLE_ at the start of the .got
2748	 (or .got.plt) section.  We don't do this in the linker script
2749	 because we don't want to define the symbol if we are not creating
2750	 a global offset table.  */
2751      bh = NULL;
2752      if (!(_bfd_generic_link_add_one_symbol
2753	    (info, abfd, "_GLOBAL_OFFSET_TABLE_", BSF_GLOBAL, s,
2754	     bed->got_symbol_offset, (const char *) NULL, FALSE,
2755	     bed->collect, &bh)))
2756	return FALSE;
2757      h = (struct elf_link_hash_entry *) bh;
2758      h->def_regular = 1;
2759      h->type = STT_OBJECT;
2760
2761      /* Machine-specific: we want the symbol for executables as
2762	 well.  */
2763      if (! bfd_elf_link_record_dynamic_symbol (info, h))
2764	return FALSE;
2765
2766      elf_hash_table (info)->hgot = h;
2767    }
2768
2769  /* The first bit of the global offset table is the header.  */
2770  s->size += bed->got_header_size + bed->got_symbol_offset;
2771
2772  /* This is the machine-specific part.  Create and initialize section
2773     data for the got.  */
2774  if (IS_FDPIC (abfd))
2775    {
2776      frvfdpic_got_section (info) = s;
2777      frvfdpic_relocs_info (info) = htab_try_create (1, frvfdpic_relocs_info_hash,
2778						     frvfdpic_relocs_info_eq,
2779						     (htab_del) NULL);
2780      if (! frvfdpic_relocs_info (info))
2781	return FALSE;
2782
2783      s = bfd_make_section (abfd, ".rel.got");
2784      if (s == NULL
2785	  || ! bfd_set_section_flags (abfd, s, (flags | SEC_READONLY))
2786	  || ! bfd_set_section_alignment (abfd, s, 2))
2787	return FALSE;
2788
2789      frvfdpic_gotrel_section (info) = s;
2790
2791      /* Machine-specific.  */
2792      s = bfd_make_section (abfd, ".rofixup");
2793      if (s == NULL
2794	  || ! bfd_set_section_flags (abfd, s, (flags | SEC_READONLY))
2795	  || ! bfd_set_section_alignment (abfd, s, 2))
2796	return FALSE;
2797
2798      frvfdpic_gotfixup_section (info) = s;
2799      offset = -2048;
2800      flags = BSF_GLOBAL;
2801    }
2802  else
2803    {
2804      offset = 2048;
2805      flags = BSF_GLOBAL | BSF_WEAK;
2806    }
2807
2808  /* Define _gp in .rofixup, for FDPIC, or .got otherwise.  If it
2809     turns out that we're linking with a different linker script, the
2810     linker script will override it.  */
2811  bh = NULL;
2812  if (!(_bfd_generic_link_add_one_symbol
2813	(info, abfd, "_gp", flags, s, offset, (const char *) NULL, FALSE,
2814	 bed->collect, &bh)))
2815    return FALSE;
2816  h = (struct elf_link_hash_entry *) bh;
2817  h->def_regular = 1;
2818  h->type = STT_OBJECT;
2819
2820  /* Machine-specific: we want the symbol for executables as well.  */
2821  if (IS_FDPIC (abfd) && ! bfd_elf_link_record_dynamic_symbol (info, h))
2822    return FALSE;
2823
2824  return TRUE;
2825}
2826
2827/* Make sure the got and plt sections exist, and that our pointers in
2828   the link hash table point to them.  */
2829
2830static bfd_boolean
2831elf32_frvfdpic_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
2832{
2833  /* This is mostly copied from
2834     elflink.c:_bfd_elf_create_dynamic_sections().  */
2835  flagword flags, pltflags;
2836  asection *s;
2837  const struct elf_backend_data *bed = get_elf_backend_data (abfd);
2838
2839  /* We need to create .plt, .rel[a].plt, .got, .got.plt, .dynbss, and
2840     .rel[a].bss sections.  */
2841
2842  flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
2843	   | SEC_LINKER_CREATED);
2844
2845  pltflags = flags;
2846  pltflags |= SEC_CODE;
2847  if (bed->plt_not_loaded)
2848    pltflags &= ~ (SEC_CODE | SEC_LOAD | SEC_HAS_CONTENTS);
2849  if (bed->plt_readonly)
2850    pltflags |= SEC_READONLY;
2851
2852  s = bfd_make_section (abfd, ".plt");
2853  if (s == NULL
2854      || ! bfd_set_section_flags (abfd, s, pltflags)
2855      || ! bfd_set_section_alignment (abfd, s, bed->plt_alignment))
2856    return FALSE;
2857  /* FRV-specific: remember it.  */
2858  frvfdpic_plt_section (info) = s;
2859
2860  if (bed->want_plt_sym)
2861    {
2862      /* Define the symbol _PROCEDURE_LINKAGE_TABLE_ at the start of the
2863	 .plt section.  */
2864      struct elf_link_hash_entry *h;
2865      struct bfd_link_hash_entry *bh = NULL;
2866
2867      if (! (_bfd_generic_link_add_one_symbol
2868	     (info, abfd, "_PROCEDURE_LINKAGE_TABLE_", BSF_GLOBAL, s, 0, NULL,
2869	      FALSE, get_elf_backend_data (abfd)->collect, &bh)))
2870	return FALSE;
2871      h = (struct elf_link_hash_entry *) bh;
2872      h->def_regular = 1;
2873      h->type = STT_OBJECT;
2874
2875      if (! info->executable
2876	  && ! bfd_elf_link_record_dynamic_symbol (info, h))
2877	return FALSE;
2878    }
2879
2880  /* FRV-specific: we want rel relocations for the plt.  */
2881  s = bfd_make_section (abfd, ".rel.plt");
2882  if (s == NULL
2883      || ! bfd_set_section_flags (abfd, s, flags | SEC_READONLY)
2884      || ! bfd_set_section_alignment (abfd, s, bed->s->log_file_align))
2885    return FALSE;
2886  /* FRV-specific: remember it.  */
2887  frvfdpic_pltrel_section (info) = s;
2888
2889  /* FRV-specific: we want to create the GOT in the FRV way.  */
2890  if (! _frv_create_got_section (abfd, info))
2891    return FALSE;
2892
2893  /* FRV-specific: make sure we created everything we wanted.  */
2894  BFD_ASSERT (frvfdpic_got_section (info) && frvfdpic_gotrel_section (info)
2895	      && frvfdpic_gotfixup_section (info)
2896	      && frvfdpic_plt_section (info)
2897	      && frvfdpic_pltrel_section (info));
2898
2899  if (bed->want_dynbss)
2900    {
2901      /* The .dynbss section is a place to put symbols which are defined
2902	 by dynamic objects, are referenced by regular objects, and are
2903	 not functions.  We must allocate space for them in the process
2904	 image and use a R_*_COPY reloc to tell the dynamic linker to
2905	 initialize them at run time.  The linker script puts the .dynbss
2906	 section into the .bss section of the final image.  */
2907      s = bfd_make_section (abfd, ".dynbss");
2908      if (s == NULL
2909	  || ! bfd_set_section_flags (abfd, s, SEC_ALLOC | SEC_LINKER_CREATED))
2910	return FALSE;
2911
2912      /* The .rel[a].bss section holds copy relocs.  This section is not
2913     normally needed.  We need to create it here, though, so that the
2914     linker will map it to an output section.  We can't just create it
2915     only if we need it, because we will not know whether we need it
2916     until we have seen all the input files, and the first time the
2917     main linker code calls BFD after examining all the input files
2918     (size_dynamic_sections) the input sections have already been
2919     mapped to the output sections.  If the section turns out not to
2920     be needed, we can discard it later.  We will never need this
2921     section when generating a shared object, since they do not use
2922     copy relocs.  */
2923      if (! info->shared)
2924	{
2925	  s = bfd_make_section (abfd,
2926				(bed->default_use_rela_p
2927				 ? ".rela.bss" : ".rel.bss"));
2928	  if (s == NULL
2929	      || ! bfd_set_section_flags (abfd, s, flags | SEC_READONLY)
2930	      || ! bfd_set_section_alignment (abfd, s, bed->s->log_file_align))
2931	    return FALSE;
2932	}
2933    }
2934
2935  return TRUE;
2936}
2937
2938/* The name of the dynamic interpreter.  This is put in the .interp
2939   section.  */
2940
2941#define ELF_DYNAMIC_INTERPRETER "/lib/ld.so.1"
2942
2943#define DEFAULT_STACK_SIZE 0x20000
2944
2945/* This structure is used to collect the number of entries present in
2946   each addressable range of the got.  */
2947struct _frvfdpic_dynamic_got_info
2948{
2949  /* Several bits of information about the current link.  */
2950  struct bfd_link_info *info;
2951  /* Total size needed for GOT entries within the 12-, 16- or 32-bit
2952     ranges.  */
2953  bfd_vma got12, gotlos, gothilo;
2954  /* Total size needed for function descriptor entries within the 12-,
2955     16- or 32-bit ranges.  */
2956  bfd_vma fd12, fdlos, fdhilo;
2957  /* Total size needed function descriptor entries referenced in PLT
2958     entries, that would be profitable to place in offsets close to
2959     the PIC register.  */
2960  bfd_vma fdplt;
2961  /* Total size needed by lazy PLT entries.  */
2962  bfd_vma lzplt;
2963  /* Number of relocations carried over from input object files.  */
2964  unsigned long relocs;
2965  /* Number of fixups introduced by relocations in input object files.  */
2966  unsigned long fixups;
2967};
2968
2969/* Compute the total GOT size required by each symbol in each range.
2970   Symbols may require up to 4 words in the GOT: an entry pointing to
2971   the symbol, an entry pointing to its function descriptor, and a
2972   private function descriptors taking two words.  */
2973
2974static int
2975_frvfdpic_count_got_plt_entries (void **entryp, void *dinfo_)
2976{
2977  struct frvfdpic_relocs_info *entry = *entryp;
2978  struct _frvfdpic_dynamic_got_info *dinfo = dinfo_;
2979  unsigned relocs = 0, fixups = 0;
2980
2981  /* Allocate space for a GOT entry pointing to the symbol.  */
2982  if (entry->got12)
2983    dinfo->got12 += 4;
2984  else if (entry->gotlos)
2985    dinfo->gotlos += 4;
2986  else if (entry->gothilo)
2987    dinfo->gothilo += 4;
2988  else
2989    entry->relocs32--;
2990  entry->relocs32++;
2991
2992  /* Allocate space for a GOT entry pointing to the function
2993     descriptor.  */
2994  if (entry->fdgot12)
2995    dinfo->got12 += 4;
2996  else if (entry->fdgotlos)
2997    dinfo->gotlos += 4;
2998  else if (entry->fdgothilo)
2999    dinfo->gothilo += 4;
3000  else
3001    entry->relocsfd--;
3002  entry->relocsfd++;
3003
3004  /* Decide whether we need a PLT entry, a function descriptor in the
3005     GOT, and a lazy PLT entry for this symbol.  */
3006  entry->plt = entry->call
3007    && entry->symndx == -1 && ! FRVFDPIC_SYM_LOCAL (dinfo->info, entry->d.h)
3008    && elf_hash_table (dinfo->info)->dynamic_sections_created;
3009  entry->privfd = entry->plt
3010    || entry->fdgoff12 || entry->fdgofflos || entry->fdgoffhilo
3011    || ((entry->fd || entry->fdgot12 || entry->fdgotlos || entry->fdgothilo)
3012	&& (entry->symndx != -1
3013	    || FRVFDPIC_FUNCDESC_LOCAL (dinfo->info, entry->d.h)));
3014  entry->lazyplt = entry->privfd
3015    && entry->symndx == -1 && ! FRVFDPIC_SYM_LOCAL (dinfo->info, entry->d.h)
3016    && ! (dinfo->info->flags & DF_BIND_NOW)
3017    && elf_hash_table (dinfo->info)->dynamic_sections_created;
3018
3019  /* Allocate space for a function descriptor.  */
3020  if (entry->fdgoff12)
3021    dinfo->fd12 += 8;
3022  else if (entry->fdgofflos)
3023    dinfo->fdlos += 8;
3024  else if (entry->privfd && entry->plt)
3025    dinfo->fdplt += 8;
3026  else if (entry->privfd)
3027    dinfo->fdhilo += 8;
3028  else
3029    entry->relocsfdv--;
3030  entry->relocsfdv++;
3031
3032  if (entry->lazyplt)
3033    dinfo->lzplt += 8;
3034
3035  if (!dinfo->info->executable || dinfo->info->pie)
3036    relocs = entry->relocs32 + entry->relocsfd + entry->relocsfdv;
3037  else
3038    {
3039      if (entry->symndx != -1 || FRVFDPIC_SYM_LOCAL (dinfo->info, entry->d.h))
3040	{
3041	  if (entry->symndx != -1
3042	      || entry->d.h->root.type != bfd_link_hash_undefweak)
3043	    fixups += entry->relocs32 + 2 * entry->relocsfdv;
3044	}
3045      else
3046	relocs += entry->relocs32 + entry->relocsfdv;
3047
3048      if (entry->symndx != -1
3049	  || FRVFDPIC_FUNCDESC_LOCAL (dinfo->info, entry->d.h))
3050	{
3051	  if (entry->symndx != -1
3052	      || entry->d.h->root.type != bfd_link_hash_undefweak)
3053	    fixups += entry->relocsfd;
3054	}
3055      else
3056	relocs += entry->relocsfd;
3057    }
3058
3059  entry->dynrelocs += relocs;
3060  entry->fixups += fixups;
3061  dinfo->relocs += relocs;
3062  dinfo->fixups += fixups;
3063
3064  return 1;
3065}
3066
3067/* This structure is used to assign offsets to got entries, function
3068   descriptors, plt entries and lazy plt entries.  */
3069
3070struct _frvfdpic_dynamic_got_plt_info
3071{
3072  /* Summary information collected with _frvfdpic_count_got_plt_entries.  */
3073  struct _frvfdpic_dynamic_got_info g;
3074
3075  /* For each addressable range, we record a MAX (positive) and MIN
3076     (negative) value.  CUR is used to assign got entries, and it's
3077     incremented from an initial positive value to MAX, then from MIN
3078     to FDCUR (unless FDCUR wraps around first).  FDCUR is used to
3079     assign function descriptors, and it's decreased from an initial
3080     non-positive value to MIN, then from MAX down to CUR (unless CUR
3081     wraps around first).  All of MIN, MAX, CUR and FDCUR always point
3082     to even words.  ODD, if non-zero, indicates an odd word to be
3083     used for the next got entry, otherwise CUR is used and
3084     incremented by a pair of words, wrapping around when it reaches
3085     MAX.  FDCUR is decremented (and wrapped) before the next function
3086     descriptor is chosen.  FDPLT indicates the number of remaining
3087     slots that can be used for function descriptors used only by PLT
3088     entries.  */
3089  struct _frvfdpic_dynamic_got_alloc_data
3090  {
3091    bfd_signed_vma max, cur, odd, fdcur, min;
3092    bfd_vma fdplt;
3093  } got12, gotlos, gothilo;
3094};
3095
3096/* Determine the positive and negative ranges to be used by each
3097   offset range in the GOT.  FDCUR and CUR, that must be aligned to a
3098   double-word boundary, are the minimum (negative) and maximum
3099   (positive) GOT offsets already used by previous ranges, except for
3100   an ODD entry that may have been left behind.  GOT and FD indicate
3101   the size of GOT entries and function descriptors that must be
3102   placed within the range from -WRAP to WRAP.  If there's room left,
3103   up to FDPLT bytes should be reserved for additional function
3104   descriptors.  */
3105
3106inline static bfd_signed_vma
3107_frvfdpic_compute_got_alloc_data (struct _frvfdpic_dynamic_got_alloc_data *gad,
3108				  bfd_signed_vma fdcur,
3109				  bfd_signed_vma odd,
3110				  bfd_signed_vma cur,
3111				  bfd_vma got,
3112				  bfd_vma fd,
3113				  bfd_vma fdplt,
3114				  bfd_vma wrap)
3115{
3116  bfd_signed_vma wrapmin = -wrap;
3117
3118  /* Start at the given initial points.  */
3119  gad->fdcur = fdcur;
3120  gad->cur = cur;
3121
3122  /* If we had an incoming odd word and we have any got entries that
3123     are going to use it, consume it, otherwise leave gad->odd at
3124     zero.  We might force gad->odd to zero and return the incoming
3125     odd such that it is used by the next range, but then GOT entries
3126     might appear to be out of order and we wouldn't be able to
3127     shorten the GOT by one word if it turns out to end with an
3128     unpaired GOT entry.  */
3129  if (odd && got)
3130    {
3131      gad->odd = odd;
3132      got -= 4;
3133      odd = 0;
3134    }
3135  else
3136    gad->odd = 0;
3137
3138  /* If we're left with an unpaired GOT entry, compute its location
3139     such that we can return it.  Otherwise, if got doesn't require an
3140     odd number of words here, either odd was already zero in the
3141     block above, or it was set to zero because got was non-zero, or
3142     got was already zero.  In the latter case, we want the value of
3143     odd to carry over to the return statement, so we don't want to
3144     reset odd unless the condition below is true.  */
3145  if (got & 4)
3146    {
3147      odd = cur + got;
3148      got += 4;
3149    }
3150
3151  /* Compute the tentative boundaries of this range.  */
3152  gad->max = cur + got;
3153  gad->min = fdcur - fd;
3154  gad->fdplt = 0;
3155
3156  /* If function descriptors took too much space, wrap some of them
3157     around.  */
3158  if (gad->min < wrapmin)
3159    {
3160      gad->max += wrapmin - gad->min;
3161      gad->min = wrapmin;
3162    }
3163  /* If there is space left and we have function descriptors
3164     referenced in PLT entries that could take advantage of shorter
3165     offsets, place them here.  */
3166  else if (fdplt && gad->min > wrapmin)
3167    {
3168      bfd_vma fds;
3169      if ((bfd_vma) (gad->min - wrapmin) < fdplt)
3170	fds = gad->min - wrapmin;
3171      else
3172	fds = fdplt;
3173
3174      fdplt -= fds;
3175      gad->min -= fds;
3176      gad->fdplt += fds;
3177    }
3178
3179  /* If GOT entries took too much space, wrap some of them around.
3180     This may well cause gad->min to become lower than wrapmin.  This
3181     will cause a relocation overflow later on, so we don't have to
3182     report it here . */
3183  if ((bfd_vma) gad->max > wrap)
3184    {
3185      gad->min -= gad->max - wrap;
3186      gad->max = wrap;
3187    }
3188  /* If there is more space left, try to place some more function
3189     descriptors for PLT entries.  */
3190  else if (fdplt && (bfd_vma) gad->max < wrap)
3191    {
3192      bfd_vma fds;
3193      if ((bfd_vma) (wrap - gad->max) < fdplt)
3194	fds = wrap - gad->max;
3195      else
3196	fds = fdplt;
3197
3198      fdplt -= fds;
3199      gad->max += fds;
3200      gad->fdplt += fds;
3201    }
3202
3203  /* If odd was initially computed as an offset past the wrap point,
3204     wrap it around.  */
3205  if (odd > gad->max)
3206    odd = gad->min + odd - gad->max;
3207
3208  /* _frvfdpic_get_got_entry() below will always wrap gad->cur if needed
3209     before returning, so do it here too.  This guarantees that,
3210     should cur and fdcur meet at the wrap point, they'll both be
3211     equal to min.  */
3212  if (gad->cur == gad->max)
3213    gad->cur = gad->min;
3214
3215  return odd;
3216}
3217
3218/* Compute the location of the next GOT entry, given the allocation
3219   data for a range.  */
3220
3221inline static bfd_signed_vma
3222_frvfdpic_get_got_entry (struct _frvfdpic_dynamic_got_alloc_data *gad)
3223{
3224  bfd_signed_vma ret;
3225
3226  if (gad->odd)
3227    {
3228      /* If there was an odd word left behind, use it.  */
3229      ret = gad->odd;
3230      gad->odd = 0;
3231    }
3232  else
3233    {
3234      /* Otherwise, use the word pointed to by cur, reserve the next
3235	 as an odd word, and skip to the next pair of words, possibly
3236	 wrapping around.  */
3237      ret = gad->cur;
3238      gad->odd = gad->cur + 4;
3239      gad->cur += 8;
3240      if (gad->cur == gad->max)
3241	gad->cur = gad->min;
3242    }
3243
3244  return ret;
3245}
3246
3247/* Compute the location of the next function descriptor entry in the
3248   GOT, given the allocation data for a range.  */
3249
3250inline static bfd_signed_vma
3251_frvfdpic_get_fd_entry (struct _frvfdpic_dynamic_got_alloc_data *gad)
3252{
3253  /* If we're at the bottom, wrap around, and only then allocate the
3254     next pair of words.  */
3255  if (gad->fdcur == gad->min)
3256    gad->fdcur = gad->max;
3257  return gad->fdcur -= 8;
3258}
3259
3260/* Assign GOT offsets for every GOT entry and function descriptor.
3261   Doing everything in a single pass is tricky.  */
3262
3263static int
3264_frvfdpic_assign_got_entries (void **entryp, void *info_)
3265{
3266  struct frvfdpic_relocs_info *entry = *entryp;
3267  struct _frvfdpic_dynamic_got_plt_info *dinfo = info_;
3268
3269  if (entry->got12)
3270    entry->got_entry = _frvfdpic_get_got_entry (&dinfo->got12);
3271  else if (entry->gotlos)
3272    entry->got_entry = _frvfdpic_get_got_entry (&dinfo->gotlos);
3273  else if (entry->gothilo)
3274    entry->got_entry = _frvfdpic_get_got_entry (&dinfo->gothilo);
3275
3276  if (entry->fdgot12)
3277    entry->fdgot_entry = _frvfdpic_get_got_entry (&dinfo->got12);
3278  else if (entry->fdgotlos)
3279    entry->fdgot_entry = _frvfdpic_get_got_entry (&dinfo->gotlos);
3280  else if (entry->fdgothilo)
3281    entry->fdgot_entry = _frvfdpic_get_got_entry (&dinfo->gothilo);
3282
3283  if (entry->fdgoff12)
3284    entry->fd_entry = _frvfdpic_get_fd_entry (&dinfo->got12);
3285  else if (entry->plt && dinfo->got12.fdplt)
3286    {
3287      dinfo->got12.fdplt -= 8;
3288      entry->fd_entry = _frvfdpic_get_fd_entry (&dinfo->got12);
3289    }
3290  else if (entry->fdgofflos)
3291    entry->fd_entry = _frvfdpic_get_fd_entry (&dinfo->gotlos);
3292  else if (entry->plt && dinfo->gotlos.fdplt)
3293    {
3294      dinfo->gotlos.fdplt -= 8;
3295      entry->fd_entry = _frvfdpic_get_fd_entry (&dinfo->gotlos);
3296    }
3297  else if (entry->plt)
3298    {
3299      dinfo->gothilo.fdplt -= 8;
3300      entry->fd_entry = _frvfdpic_get_fd_entry (&dinfo->gothilo);
3301    }
3302  else if (entry->privfd)
3303    entry->fd_entry = _frvfdpic_get_fd_entry (&dinfo->gothilo);
3304
3305  return 1;
3306}
3307
3308/* Assign GOT offsets to private function descriptors used by PLT
3309   entries (or referenced by 32-bit offsets), as well as PLT entries
3310   and lazy PLT entries.  */
3311
3312static int
3313_frvfdpic_assign_plt_entries (void **entryp, void *info_)
3314{
3315  struct frvfdpic_relocs_info *entry = *entryp;
3316  struct _frvfdpic_dynamic_got_plt_info *dinfo = info_;
3317
3318  /* If this symbol requires a local function descriptor, allocate
3319     one.  */
3320  if (entry->privfd && entry->fd_entry == 0)
3321    {
3322      if (dinfo->got12.fdplt)
3323	{
3324	  entry->fd_entry = _frvfdpic_get_fd_entry (&dinfo->got12);
3325	  dinfo->got12.fdplt -= 8;
3326	}
3327      else if (dinfo->gotlos.fdplt)
3328	{
3329	  entry->fd_entry = _frvfdpic_get_fd_entry (&dinfo->gotlos);
3330	  dinfo->gotlos.fdplt -= 8;
3331	}
3332      else
3333	{
3334	  BFD_ASSERT (dinfo->gothilo.fdplt);
3335	  entry->fd_entry = _frvfdpic_get_fd_entry (&dinfo->gothilo);
3336	  dinfo->gothilo.fdplt -= 8;
3337	}
3338    }
3339
3340  if (entry->plt)
3341    {
3342      int size;
3343
3344      /* We use the section's raw size to mark the location of the
3345	 next PLT entry.  */
3346      entry->plt_entry = frvfdpic_plt_section (dinfo->g.info)->size;
3347
3348      /* Figure out the length of this PLT entry based on the
3349	 addressing mode we need to reach the function descriptor.  */
3350      BFD_ASSERT (entry->fd_entry);
3351      if (entry->fd_entry >= -(1 << (12 - 1))
3352	  && entry->fd_entry < (1 << (12 - 1)))
3353	size = 8;
3354      else if (entry->fd_entry >= -(1 << (16 - 1))
3355	       && entry->fd_entry < (1 << (16 - 1)))
3356	size = 12;
3357      else
3358	size = 16;
3359
3360      frvfdpic_plt_section (dinfo->g.info)->size += size;
3361    }
3362
3363  if (entry->lazyplt)
3364    {
3365      entry->lzplt_entry = dinfo->g.lzplt;
3366      dinfo->g.lzplt += 8;
3367      /* If this entry is the one that gets the resolver stub, account
3368	 for the additional instruction.  */
3369      if (entry->lzplt_entry % FRVFDPIC_LZPLT_BLOCK_SIZE
3370	  == FRVFDPIC_LZPLT_RESOLV_LOC)
3371	dinfo->g.lzplt += 4;
3372    }
3373
3374  return 1;
3375}
3376
3377/* Follow indirect and warning hash entries so that each got entry
3378   points to the final symbol definition.  P must point to a pointer
3379   to the hash table we're traversing.  Since this traversal may
3380   modify the hash table, we set this pointer to NULL to indicate
3381   we've made a potentially-destructive change to the hash table, so
3382   the traversal must be restarted.  */
3383static int
3384_frvfdpic_resolve_final_relocs_info (void **entryp, void *p)
3385{
3386  struct frvfdpic_relocs_info *entry = *entryp;
3387  htab_t *htab = p;
3388
3389  if (entry->symndx == -1)
3390    {
3391      struct elf_link_hash_entry *h = entry->d.h;
3392      struct frvfdpic_relocs_info *oentry;
3393
3394      while (h->root.type == bfd_link_hash_indirect
3395	     || h->root.type == bfd_link_hash_warning)
3396	h = (struct elf_link_hash_entry *)h->root.u.i.link;
3397
3398      if (entry->d.h == h)
3399	return 1;
3400
3401      oentry = frvfdpic_relocs_info_for_global (*htab, 0, h, entry->addend,
3402						NO_INSERT);
3403
3404      if (oentry)
3405	{
3406	  /* Merge the two entries.  */
3407	  frvfdpic_pic_merge_early_relocs_info (oentry, entry);
3408	  htab_clear_slot (*htab, entryp);
3409	  return 1;
3410	}
3411
3412      entry->d.h = h;
3413
3414      /* If we can't find this entry with the new bfd hash, re-insert
3415	 it, and get the traversal restarted.  */
3416      if (! htab_find (*htab, entry))
3417	{
3418	  htab_clear_slot (*htab, entryp);
3419	  entryp = htab_find_slot (*htab, entry, INSERT);
3420	  if (! *entryp)
3421	    *entryp = entry;
3422	  /* Abort the traversal, since the whole table may have
3423	     moved, and leave it up to the parent to restart the
3424	     process.  */
3425	  *(htab_t *)p = NULL;
3426	  return 0;
3427	}
3428    }
3429
3430  return 1;
3431}
3432
3433/* Set the sizes of the dynamic sections.  */
3434
3435static bfd_boolean
3436elf32_frvfdpic_size_dynamic_sections (bfd *output_bfd,
3437				      struct bfd_link_info *info)
3438{
3439  bfd *dynobj;
3440  asection *s;
3441  struct _frvfdpic_dynamic_got_plt_info gpinfo;
3442  bfd_signed_vma odd;
3443  bfd_vma limit;
3444
3445  dynobj = elf_hash_table (info)->dynobj;
3446  BFD_ASSERT (dynobj != NULL);
3447
3448  if (elf_hash_table (info)->dynamic_sections_created)
3449    {
3450      /* Set the contents of the .interp section to the interpreter.  */
3451      if (info->executable)
3452	{
3453	  s = bfd_get_section_by_name (dynobj, ".interp");
3454	  BFD_ASSERT (s != NULL);
3455	  s->size = sizeof ELF_DYNAMIC_INTERPRETER;
3456	  s->contents = (bfd_byte *) ELF_DYNAMIC_INTERPRETER;
3457	}
3458    }
3459
3460  memset (&gpinfo, 0, sizeof (gpinfo));
3461  gpinfo.g.info = info;
3462
3463  for (;;)
3464    {
3465      htab_t relocs = frvfdpic_relocs_info (info);
3466
3467      htab_traverse (relocs, _frvfdpic_resolve_final_relocs_info, &relocs);
3468
3469      if (relocs == frvfdpic_relocs_info (info))
3470	break;
3471    }
3472
3473  htab_traverse (frvfdpic_relocs_info (info), _frvfdpic_count_got_plt_entries,
3474		 &gpinfo.g);
3475
3476  odd = 12;
3477  /* Compute the total size taken by entries in the 12-bit and 16-bit
3478     ranges, to tell how many PLT function descriptors we can bring
3479     into the 12-bit range without causing the 16-bit range to
3480     overflow.  */
3481  limit = odd + gpinfo.g.got12 + gpinfo.g.gotlos
3482    + gpinfo.g.fd12 + gpinfo.g.fdlos;
3483  if (limit < (bfd_vma)1 << 16)
3484    limit = ((bfd_vma)1 << 16) - limit;
3485  else
3486    limit = 0;
3487  if (gpinfo.g.fdplt < limit)
3488    limit = gpinfo.g.fdplt;
3489
3490  /* Determine the ranges of GOT offsets that we can use for each
3491     range of addressing modes.  */
3492  odd = _frvfdpic_compute_got_alloc_data (&gpinfo.got12,
3493					  0,
3494					  odd,
3495					  16,
3496					  gpinfo.g.got12,
3497					  gpinfo.g.fd12,
3498					  limit,
3499					  (bfd_vma)1 << (12-1));
3500  odd = _frvfdpic_compute_got_alloc_data (&gpinfo.gotlos,
3501					  gpinfo.got12.min,
3502					  odd,
3503					  gpinfo.got12.max,
3504					  gpinfo.g.gotlos,
3505					  gpinfo.g.fdlos,
3506					  gpinfo.g.fdplt - gpinfo.got12.fdplt,
3507					  (bfd_vma)1 << (16-1));
3508  odd = _frvfdpic_compute_got_alloc_data (&gpinfo.gothilo,
3509					  gpinfo.gotlos.min,
3510					  odd,
3511					  gpinfo.gotlos.max,
3512					  gpinfo.g.gothilo,
3513					  gpinfo.g.fdhilo,
3514					  gpinfo.g.fdplt - gpinfo.got12.fdplt
3515					  - gpinfo.gotlos.fdplt,
3516					  (bfd_vma)1 << (32-1));
3517
3518  /* Now assign (most) GOT offsets.  */
3519  htab_traverse (frvfdpic_relocs_info (info), _frvfdpic_assign_got_entries,
3520		 &gpinfo);
3521
3522  frvfdpic_got_section (info)->size = gpinfo.gothilo.max
3523    - gpinfo.gothilo.min
3524    /* If an odd word is the last word of the GOT, we don't need this
3525       word to be part of the GOT.  */
3526    - (odd + 4 == gpinfo.gothilo.max ? 4 : 0);
3527  if (frvfdpic_got_section (info)->size == 0)
3528    frvfdpic_got_section (info)->flags |= SEC_EXCLUDE;
3529  else if (frvfdpic_got_section (info)->size == 12
3530	   && ! elf_hash_table (info)->dynamic_sections_created)
3531    {
3532      frvfdpic_got_section (info)->flags |= SEC_EXCLUDE;
3533      frvfdpic_got_section (info)->size = 0;
3534    }
3535  else
3536    {
3537      frvfdpic_got_section (info)->contents =
3538	(bfd_byte *) bfd_zalloc (dynobj,
3539				 frvfdpic_got_section (info)->size);
3540      if (frvfdpic_got_section (info)->contents == NULL)
3541	return FALSE;
3542    }
3543
3544  if (elf_hash_table (info)->dynamic_sections_created)
3545    /* Subtract the number of lzplt entries, since those will generate
3546       relocations in the pltrel section.  */
3547    frvfdpic_gotrel_section (info)->size =
3548      (gpinfo.g.relocs - gpinfo.g.lzplt / 8)
3549      * get_elf_backend_data (output_bfd)->s->sizeof_rel;
3550  else
3551    BFD_ASSERT (gpinfo.g.relocs == 0);
3552  if (frvfdpic_gotrel_section (info)->size == 0)
3553    frvfdpic_gotrel_section (info)->flags |= SEC_EXCLUDE;
3554  else
3555    {
3556      frvfdpic_gotrel_section (info)->contents =
3557	(bfd_byte *) bfd_zalloc (dynobj,
3558				 frvfdpic_gotrel_section (info)->size);
3559      if (frvfdpic_gotrel_section (info)->contents == NULL)
3560	return FALSE;
3561    }
3562
3563  frvfdpic_gotfixup_section (info)->size = (gpinfo.g.fixups + 1) * 4;
3564  if (frvfdpic_gotfixup_section (info)->size == 0)
3565    frvfdpic_gotfixup_section (info)->flags |= SEC_EXCLUDE;
3566  else
3567    {
3568      frvfdpic_gotfixup_section (info)->contents =
3569	(bfd_byte *) bfd_zalloc (dynobj,
3570				 frvfdpic_gotfixup_section (info)->size);
3571      if (frvfdpic_gotfixup_section (info)->contents == NULL)
3572	return FALSE;
3573    }
3574
3575  if (elf_hash_table (info)->dynamic_sections_created)
3576    {
3577      frvfdpic_pltrel_section (info)->size =
3578	gpinfo.g.lzplt / 8 * get_elf_backend_data (output_bfd)->s->sizeof_rel;
3579      if (frvfdpic_pltrel_section (info)->size == 0)
3580	frvfdpic_pltrel_section (info)->flags |= SEC_EXCLUDE;
3581      else
3582	{
3583	  frvfdpic_pltrel_section (info)->contents =
3584	    (bfd_byte *) bfd_zalloc (dynobj,
3585				     frvfdpic_pltrel_section (info)->size);
3586	  if (frvfdpic_pltrel_section (info)->contents == NULL)
3587	    return FALSE;
3588	}
3589    }
3590
3591  /* Add 4 bytes for every block of at most 65535 lazy PLT entries,
3592     such that there's room for the additional instruction needed to
3593     call the resolver.  Since _frvfdpic_assign_got_entries didn't
3594     account for them, our block size is 4 bytes smaller than the real
3595     block size.  */
3596  if (elf_hash_table (info)->dynamic_sections_created)
3597    {
3598      frvfdpic_plt_section (info)->size = gpinfo.g.lzplt
3599	+ ((gpinfo.g.lzplt + (FRVFDPIC_LZPLT_BLOCK_SIZE - 4) - 8)
3600	   / (FRVFDPIC_LZPLT_BLOCK_SIZE - 4) * 4);
3601    }
3602
3603  /* Reset it, such that _frvfdpic_assign_plt_entries() can use it to
3604     actually assign lazy PLT entries addresses.  */
3605  gpinfo.g.lzplt = 0;
3606
3607  /* Save information that we're going to need to generate GOT and PLT
3608     entries.  */
3609  frvfdpic_got_initial_offset (info) = -gpinfo.gothilo.min;
3610
3611  if (get_elf_backend_data (output_bfd)->want_got_sym)
3612    elf_hash_table (info)->hgot->root.u.def.value
3613      += frvfdpic_got_initial_offset (info);
3614
3615  if (elf_hash_table (info)->dynamic_sections_created)
3616    frvfdpic_plt_initial_offset (info) =
3617      frvfdpic_plt_section (info)->size;
3618
3619  htab_traverse (frvfdpic_relocs_info (info), _frvfdpic_assign_plt_entries,
3620		 &gpinfo);
3621
3622  /* Allocate the PLT section contents only after
3623     _frvfdpic_assign_plt_entries has a chance to add the size of the
3624     non-lazy PLT entries.  */
3625  if (elf_hash_table (info)->dynamic_sections_created)
3626    {
3627      if (frvfdpic_plt_section (info)->size == 0)
3628	frvfdpic_plt_section (info)->flags |= SEC_EXCLUDE;
3629      else
3630	{
3631	  frvfdpic_plt_section (info)->contents =
3632	    (bfd_byte *) bfd_zalloc (dynobj,
3633				     frvfdpic_plt_section (info)->size);
3634	  if (frvfdpic_plt_section (info)->contents == NULL)
3635	    return FALSE;
3636	}
3637    }
3638
3639  if (elf_hash_table (info)->dynamic_sections_created)
3640    {
3641      if (frvfdpic_got_section (info)->size)
3642	if (!_bfd_elf_add_dynamic_entry (info, DT_PLTGOT, 0))
3643	  return FALSE;
3644
3645      if (frvfdpic_pltrel_section (info)->size)
3646	if (!_bfd_elf_add_dynamic_entry (info, DT_PLTRELSZ, 0)
3647	    || !_bfd_elf_add_dynamic_entry (info, DT_PLTREL, DT_REL)
3648	    || !_bfd_elf_add_dynamic_entry (info, DT_JMPREL, 0))
3649	  return FALSE;
3650
3651      if (frvfdpic_gotrel_section (info)->size)
3652	if (!_bfd_elf_add_dynamic_entry (info, DT_REL, 0)
3653	    || !_bfd_elf_add_dynamic_entry (info, DT_RELSZ, 0)
3654	    || !_bfd_elf_add_dynamic_entry (info, DT_RELENT,
3655					    sizeof (Elf32_External_Rel)))
3656	  return FALSE;
3657    }
3658
3659  return TRUE;
3660}
3661
3662static bfd_boolean
3663elf32_frvfdpic_always_size_sections (bfd *output_bfd,
3664				     struct bfd_link_info *info)
3665{
3666  if (!info->relocatable)
3667    {
3668      struct elf_link_hash_entry *h;
3669      asection *sec;
3670
3671      /* Force a PT_GNU_STACK segment to be created.  */
3672      if (! elf_tdata (output_bfd)->stack_flags)
3673	elf_tdata (output_bfd)->stack_flags = PF_R | PF_W | PF_X;
3674
3675      /* Define __stacksize if it's not defined yet.  */
3676      h = elf_link_hash_lookup (elf_hash_table (info), "__stacksize",
3677				FALSE, FALSE, FALSE);
3678      if (! h || h->root.type != bfd_link_hash_defined
3679	  || h->type != STT_OBJECT
3680	  || !h->def_regular)
3681	{
3682	  struct bfd_link_hash_entry *bh = NULL;
3683
3684	  if (!(_bfd_generic_link_add_one_symbol
3685		(info, output_bfd, "__stacksize",
3686		 BSF_GLOBAL, bfd_abs_section_ptr, DEFAULT_STACK_SIZE,
3687		 (const char *) NULL, FALSE,
3688		 get_elf_backend_data (output_bfd)->collect, &bh)))
3689	    return FALSE;
3690
3691	  h = (struct elf_link_hash_entry *) bh;
3692	  h->def_regular = 1;
3693	  h->type = STT_OBJECT;
3694	}
3695
3696      /* Create a stack section, and set its alignment.  */
3697      sec = bfd_make_section (output_bfd, ".stack");
3698
3699      if (sec == NULL
3700	  || ! bfd_set_section_alignment (output_bfd, sec, 3))
3701	return FALSE;
3702    }
3703
3704  return TRUE;
3705}
3706
3707static bfd_boolean
3708elf32_frvfdpic_modify_segment_map (bfd *output_bfd,
3709				   struct bfd_link_info *info)
3710{
3711  struct elf_segment_map *m;
3712
3713  /* objcopy and strip preserve what's already there using
3714     elf32_frvfdpic_copy_private_bfd_data ().  */
3715  if (! info)
3716    return TRUE;
3717
3718  for (m = elf_tdata (output_bfd)->segment_map; m != NULL; m = m->next)
3719    if (m->p_type == PT_GNU_STACK)
3720      break;
3721
3722  if (m)
3723    {
3724      asection *sec = bfd_get_section_by_name (output_bfd, ".stack");
3725      struct elf_link_hash_entry *h;
3726
3727      if (sec)
3728	{
3729	  /* Obtain the pointer to the __stacksize symbol.  */
3730	  h = elf_link_hash_lookup (elf_hash_table (info), "__stacksize",
3731				    FALSE, FALSE, FALSE);
3732	  while (h->root.type == bfd_link_hash_indirect
3733		 || h->root.type == bfd_link_hash_warning)
3734	    h = (struct elf_link_hash_entry *)h->root.u.i.link;
3735	  BFD_ASSERT (h->root.type == bfd_link_hash_defined);
3736
3737	  /* Set the section size from the symbol value.  We
3738	     intentionally ignore the symbol section.  */
3739	  if (h->root.type == bfd_link_hash_defined)
3740	    sec->size = h->root.u.def.value;
3741	  else
3742	    sec->size = DEFAULT_STACK_SIZE;
3743
3744	  /* Add the stack section to the PT_GNU_STACK segment,
3745	     such that its size and alignment requirements make it
3746	     to the segment.  */
3747	  m->sections[m->count] = sec;
3748	  m->count++;
3749	}
3750    }
3751
3752  return TRUE;
3753}
3754
3755/* Fill in code and data in dynamic sections.  */
3756
3757static bfd_boolean
3758elf32_frv_finish_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
3759				   struct bfd_link_info *info ATTRIBUTE_UNUSED)
3760{
3761  /* Nothing to be done for non-FDPIC.  */
3762  return TRUE;
3763}
3764
3765static bfd_boolean
3766elf32_frvfdpic_finish_dynamic_sections (bfd *output_bfd,
3767					struct bfd_link_info *info)
3768{
3769  bfd *dynobj;
3770  asection *sdyn;
3771
3772  dynobj = elf_hash_table (info)->dynobj;
3773
3774  if (frvfdpic_got_section (info))
3775    {
3776      BFD_ASSERT (frvfdpic_gotrel_section (info)->size
3777		  == (frvfdpic_gotrel_section (info)->reloc_count
3778		      * sizeof (Elf32_External_Rel)));
3779
3780      if (frvfdpic_gotfixup_section (info))
3781	{
3782	  struct elf_link_hash_entry *hgot = elf_hash_table (info)->hgot;
3783	  bfd_vma got_value = hgot->root.u.def.value
3784	    + hgot->root.u.def.section->output_section->vma
3785	    + hgot->root.u.def.section->output_offset;
3786
3787	  _frvfdpic_add_rofixup (output_bfd, frvfdpic_gotfixup_section (info),
3788				 got_value, 0);
3789
3790	  if (frvfdpic_gotfixup_section (info)->size
3791	      != (frvfdpic_gotfixup_section (info)->reloc_count * 4))
3792	    {
3793	      (*_bfd_error_handler)
3794		("LINKER BUG: .rofixup section size mismatch");
3795	      return FALSE;
3796	    }
3797	}
3798    }
3799  if (elf_hash_table (info)->dynamic_sections_created)
3800    {
3801      BFD_ASSERT (frvfdpic_pltrel_section (info)->size
3802		  == (frvfdpic_pltrel_section (info)->reloc_count
3803		      * sizeof (Elf32_External_Rel)));
3804    }
3805
3806  sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
3807
3808  if (elf_hash_table (info)->dynamic_sections_created)
3809    {
3810      Elf32_External_Dyn * dyncon;
3811      Elf32_External_Dyn * dynconend;
3812
3813      BFD_ASSERT (sdyn != NULL);
3814
3815      dyncon = (Elf32_External_Dyn *) sdyn->contents;
3816      dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
3817
3818      for (; dyncon < dynconend; dyncon++)
3819	{
3820	  Elf_Internal_Dyn dyn;
3821
3822	  bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
3823
3824	  switch (dyn.d_tag)
3825	    {
3826	    default:
3827	      break;
3828
3829	    case DT_PLTGOT:
3830	      dyn.d_un.d_ptr = frvfdpic_got_section (info)->output_section->vma
3831		+ frvfdpic_got_section (info)->output_offset
3832		+ frvfdpic_got_initial_offset (info);
3833	      bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
3834	      break;
3835
3836	    case DT_JMPREL:
3837	      dyn.d_un.d_ptr = frvfdpic_pltrel_section (info)
3838		->output_section->vma
3839		+ frvfdpic_pltrel_section (info)->output_offset;
3840	      bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
3841	      break;
3842
3843	    case DT_PLTRELSZ:
3844	      dyn.d_un.d_val = frvfdpic_pltrel_section (info)->size;
3845	      bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
3846	      break;
3847	    }
3848	}
3849    }
3850
3851  return TRUE;
3852}
3853
3854/* Adjust a symbol defined by a dynamic object and referenced by a
3855   regular object.  */
3856
3857static bfd_boolean
3858elf32_frvfdpic_adjust_dynamic_symbol
3859(struct bfd_link_info *info ATTRIBUTE_UNUSED,
3860 struct elf_link_hash_entry *h ATTRIBUTE_UNUSED)
3861{
3862  bfd * dynobj;
3863
3864  dynobj = elf_hash_table (info)->dynobj;
3865
3866  /* Make sure we know what is going on here.  */
3867  BFD_ASSERT (dynobj != NULL
3868	      && (h->u.weakdef != NULL
3869		  || (h->def_dynamic
3870		      && h->ref_regular
3871		      && !h->def_regular)));
3872
3873  /* If this is a weak symbol, and there is a real definition, the
3874     processor independent code will have arranged for us to see the
3875     real definition first, and we can just use the same value.  */
3876  if (h->u.weakdef != NULL)
3877    {
3878      BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
3879		  || h->u.weakdef->root.type == bfd_link_hash_defweak);
3880      h->root.u.def.section = h->u.weakdef->root.u.def.section;
3881      h->root.u.def.value = h->u.weakdef->root.u.def.value;
3882    }
3883
3884  return TRUE;
3885}
3886
3887/* Perform any actions needed for dynamic symbols.  */
3888
3889static bfd_boolean
3890elf32_frvfdpic_finish_dynamic_symbol
3891(bfd *output_bfd ATTRIBUTE_UNUSED,
3892 struct bfd_link_info *info ATTRIBUTE_UNUSED,
3893 struct elf_link_hash_entry *h ATTRIBUTE_UNUSED,
3894 Elf_Internal_Sym *sym ATTRIBUTE_UNUSED)
3895{
3896  return TRUE;
3897}
3898
3899/* Decide whether to attempt to turn absptr or lsda encodings in
3900   shared libraries into pcrel within the given input section.  */
3901
3902static bfd_boolean
3903frvfdpic_elf_use_relative_eh_frame
3904(bfd *input_bfd ATTRIBUTE_UNUSED,
3905 struct bfd_link_info *info ATTRIBUTE_UNUSED,
3906 asection *eh_frame_section ATTRIBUTE_UNUSED)
3907{
3908  /* We can't use PC-relative encodings in FDPIC binaries, in general.  */
3909  return FALSE;
3910}
3911
3912/* Adjust the contents of an eh_frame_hdr section before they're output.  */
3913
3914static bfd_byte
3915frvfdpic_elf_encode_eh_address (bfd *abfd,
3916				struct bfd_link_info *info,
3917				asection *osec, bfd_vma offset,
3918				asection *loc_sec, bfd_vma loc_offset,
3919				bfd_vma *encoded)
3920{
3921  struct elf_link_hash_entry *h;
3922
3923  h = elf_hash_table (info)->hgot;
3924  BFD_ASSERT (h && h->root.type == bfd_link_hash_defined);
3925
3926  if (! h || (_frvfdpic_osec_to_segment (abfd, osec)
3927	      == _frvfdpic_osec_to_segment (abfd, loc_sec->output_section)))
3928    return _bfd_elf_encode_eh_address (abfd, info, osec, offset,
3929				       loc_sec, loc_offset, encoded);
3930
3931  BFD_ASSERT (_frvfdpic_osec_to_segment (abfd, osec)
3932	      == (_frvfdpic_osec_to_segment
3933		  (abfd, h->root.u.def.section->output_section)));
3934
3935  *encoded = osec->vma + offset
3936    - (h->root.u.def.value
3937       + h->root.u.def.section->output_section->vma
3938       + h->root.u.def.section->output_offset);
3939
3940  return DW_EH_PE_datarel | DW_EH_PE_sdata4;
3941}
3942
3943/* Look through the relocs for a section during the first phase.
3944
3945   Besides handling virtual table relocs for gc, we have to deal with
3946   all sorts of PIC-related relocations.  We describe below the
3947   general plan on how to handle such relocations, even though we only
3948   collect information at this point, storing them in hash tables for
3949   perusal of later passes.
3950
3951   32 relocations are propagated to the linker output when creating
3952   position-independent output.  LO16 and HI16 relocations are not
3953   supposed to be encountered in this case.
3954
3955   LABEL16 should always be resolvable by the linker, since it's only
3956   used by branches.
3957
3958   LABEL24, on the other hand, is used by calls.  If it turns out that
3959   the target of a call is a dynamic symbol, a PLT entry must be
3960   created for it, which triggers the creation of a private function
3961   descriptor and, unless lazy binding is disabled, a lazy PLT entry.
3962
3963   GPREL relocations require the referenced symbol to be in the same
3964   segment as _gp, but this can only be checked later.
3965
3966   All GOT, GOTOFF and FUNCDESC relocations require a .got section to
3967   exist.  LABEL24 might as well, since it may require a PLT entry,
3968   that will require a got.
3969
3970   Non-FUNCDESC GOT relocations require a GOT entry to be created
3971   regardless of whether the symbol is dynamic.  However, since a
3972   global symbol that turns out to not be exported may have the same
3973   address of a non-dynamic symbol, we don't assign GOT entries at
3974   this point, such that we can share them in this case.  A relocation
3975   for the GOT entry always has to be created, be it to offset a
3976   private symbol by the section load address, be it to get the symbol
3977   resolved dynamically.
3978
3979   FUNCDESC GOT relocations require a GOT entry to be created, and
3980   handled as if a FUNCDESC relocation was applied to the GOT entry in
3981   an object file.
3982
3983   FUNCDESC relocations referencing a symbol that turns out to NOT be
3984   dynamic cause a private function descriptor to be created.  The
3985   FUNCDESC relocation then decays to a 32 relocation that points at
3986   the private descriptor.  If the symbol is dynamic, the FUNCDESC
3987   relocation is propagated to the linker output, such that the
3988   dynamic linker creates the canonical descriptor, pointing to the
3989   dynamically-resolved definition of the function.
3990
3991   Non-FUNCDESC GOTOFF relocations must always refer to non-dynamic
3992   symbols that are assigned to the same segment as the GOT, but we
3993   can only check this later, after we know the complete set of
3994   symbols defined and/or exported.
3995
3996   FUNCDESC GOTOFF relocations require a function descriptor to be
3997   created and, unless lazy binding is disabled or the symbol is not
3998   dynamic, a lazy PLT entry.  Since we can't tell at this point
3999   whether a symbol is going to be dynamic, we have to decide later
4000   whether to create a lazy PLT entry or bind the descriptor directly
4001   to the private function.
4002
4003   FUNCDESC_VALUE relocations are not supposed to be present in object
4004   files, but they may very well be simply propagated to the linker
4005   output, since they have no side effect.
4006
4007
4008   A function descriptor always requires a FUNCDESC_VALUE relocation.
4009   Whether it's in .plt.rel or not depends on whether lazy binding is
4010   enabled and on whether the referenced symbol is dynamic.
4011
4012   The existence of a lazy PLT requires the resolverStub lazy PLT
4013   entry to be present.
4014
4015
4016   As for assignment of GOT, PLT and lazy PLT entries, and private
4017   descriptors, we might do them all sequentially, but we can do
4018   better than that.  For example, we can place GOT entries and
4019   private function descriptors referenced using 12-bit operands
4020   closer to the PIC register value, such that these relocations don't
4021   overflow.  Those that are only referenced with LO16 relocations
4022   could come next, but we may as well place PLT-required function
4023   descriptors in the 12-bit range to make them shorter.  Symbols
4024   referenced with LO16/HI16 may come next, but we may place
4025   additional function descriptors in the 16-bit range if we can
4026   reliably tell that we've already placed entries that are ever
4027   referenced with only LO16.  PLT entries are therefore generated as
4028   small as possible, while not introducing relocation overflows in
4029   GOT or FUNCDESC_GOTOFF relocations.  Lazy PLT entries could be
4030   generated before or after PLT entries, but not intermingled with
4031   them, such that we can have more lazy PLT entries in range for a
4032   branch to the resolverStub.  The resolverStub should be emitted at
4033   the most distant location from the first lazy PLT entry such that
4034   it's still in range for a branch, or closer, if there isn't a need
4035   for so many lazy PLT entries.  Additional lazy PLT entries may be
4036   emitted after the resolverStub, as long as branches are still in
4037   range.  If the branch goes out of range, longer lazy PLT entries
4038   are emitted.
4039
4040   We could further optimize PLT and lazy PLT entries by giving them
4041   priority in assignment to closer-to-gr17 locations depending on the
4042   number of occurrences of references to them (assuming a function
4043   that's called more often is more important for performance, so its
4044   PLT entry should be faster), or taking hints from the compiler.
4045   Given infinite time and money... :-)  */
4046
4047static bfd_boolean
4048elf32_frv_check_relocs (abfd, info, sec, relocs)
4049     bfd *abfd;
4050     struct bfd_link_info *info;
4051     asection *sec;
4052     const Elf_Internal_Rela *relocs;
4053{
4054  Elf_Internal_Shdr *symtab_hdr;
4055  struct elf_link_hash_entry **sym_hashes, **sym_hashes_end;
4056  const Elf_Internal_Rela *rel;
4057  const Elf_Internal_Rela *rel_end;
4058  bfd *dynobj;
4059  struct frvfdpic_relocs_info *picrel;
4060
4061  if (info->relocatable)
4062    return TRUE;
4063
4064  symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
4065  sym_hashes = elf_sym_hashes (abfd);
4066  sym_hashes_end = sym_hashes + symtab_hdr->sh_size/sizeof(Elf32_External_Sym);
4067  if (!elf_bad_symtab (abfd))
4068    sym_hashes_end -= symtab_hdr->sh_info;
4069
4070  dynobj = elf_hash_table (info)->dynobj;
4071  rel_end = relocs + sec->reloc_count;
4072  for (rel = relocs; rel < rel_end; rel++)
4073    {
4074      struct elf_link_hash_entry *h;
4075      unsigned long r_symndx;
4076
4077      r_symndx = ELF32_R_SYM (rel->r_info);
4078      if (r_symndx < symtab_hdr->sh_info)
4079        h = NULL;
4080      else
4081        h = sym_hashes[r_symndx - symtab_hdr->sh_info];
4082
4083      switch (ELF32_R_TYPE (rel->r_info))
4084	{
4085	case R_FRV_GOT12:
4086	case R_FRV_GOTHI:
4087	case R_FRV_GOTLO:
4088	case R_FRV_FUNCDESC_GOT12:
4089	case R_FRV_FUNCDESC_GOTHI:
4090	case R_FRV_FUNCDESC_GOTLO:
4091	case R_FRV_GOTOFF12:
4092	case R_FRV_GOTOFFHI:
4093	case R_FRV_GOTOFFLO:
4094	case R_FRV_FUNCDESC_GOTOFF12:
4095	case R_FRV_FUNCDESC_GOTOFFHI:
4096	case R_FRV_FUNCDESC_GOTOFFLO:
4097	case R_FRV_FUNCDESC:
4098	case R_FRV_FUNCDESC_VALUE:
4099	  if (! IS_FDPIC (abfd))
4100	    goto bad_reloc;
4101	  /* Fall through.  */
4102	case R_FRV_GPREL12:
4103	case R_FRV_GPRELU12:
4104	case R_FRV_GPRELHI:
4105	case R_FRV_GPRELLO:
4106	case R_FRV_LABEL24:
4107	case R_FRV_32:
4108	  if (! dynobj)
4109	    {
4110	      elf_hash_table (info)->dynobj = dynobj = abfd;
4111	      if (! _frv_create_got_section (abfd, info))
4112		return FALSE;
4113	    }
4114	  if (! IS_FDPIC (abfd))
4115	    {
4116	      picrel = NULL;
4117	      break;
4118	    }
4119	  if (h != NULL)
4120	    {
4121	      if (h->dynindx == -1)
4122		switch (ELF_ST_VISIBILITY (h->other))
4123		  {
4124		  case STV_INTERNAL:
4125		  case STV_HIDDEN:
4126		    break;
4127		  default:
4128		    bfd_elf_link_record_dynamic_symbol (info, h);
4129		    break;
4130		  }
4131	      picrel
4132		= frvfdpic_relocs_info_for_global (frvfdpic_relocs_info (info),
4133						   abfd, h,
4134						   rel->r_addend, INSERT);
4135	    }
4136	  else
4137	    picrel = frvfdpic_relocs_info_for_local (frvfdpic_relocs_info
4138						     (info), abfd, r_symndx,
4139						     rel->r_addend, INSERT);
4140	  if (! picrel)
4141	    return FALSE;
4142	  break;
4143
4144	default:
4145	  picrel = NULL;
4146	  break;
4147	}
4148
4149      switch (ELF32_R_TYPE (rel->r_info))
4150        {
4151	case R_FRV_LABEL24:
4152	  if (IS_FDPIC (abfd))
4153	    picrel->call = 1;
4154	  break;
4155
4156	case R_FRV_FUNCDESC_VALUE:
4157	  picrel->relocsfdv++;
4158	  if (bfd_get_section_flags (abfd, sec) & SEC_ALLOC)
4159	    picrel->relocs32--;
4160	  /* Fall through.  */
4161
4162	case R_FRV_32:
4163	  if (! IS_FDPIC (abfd))
4164	    break;
4165
4166	  picrel->sym = 1;
4167	  if (bfd_get_section_flags (abfd, sec) & SEC_ALLOC)
4168	    picrel->relocs32++;
4169	  break;
4170
4171	case R_FRV_GOT12:
4172	  picrel->got12 = 1;
4173	  break;
4174
4175	case R_FRV_GOTHI:
4176	case R_FRV_GOTLO:
4177	  picrel->gothilo = 1;
4178	  break;
4179
4180	case R_FRV_FUNCDESC_GOT12:
4181	  picrel->fdgot12 = 1;
4182	  break;
4183
4184	case R_FRV_FUNCDESC_GOTHI:
4185	case R_FRV_FUNCDESC_GOTLO:
4186	  picrel->fdgothilo = 1;
4187	  break;
4188
4189	case R_FRV_GOTOFF12:
4190	case R_FRV_GOTOFFHI:
4191	case R_FRV_GOTOFFLO:
4192	  picrel->gotoff = 1;
4193	  break;
4194
4195	case R_FRV_FUNCDESC_GOTOFF12:
4196	  picrel->fdgoff12 = 1;
4197	  break;
4198
4199	case R_FRV_FUNCDESC_GOTOFFHI:
4200	case R_FRV_FUNCDESC_GOTOFFLO:
4201	  picrel->fdgoffhilo = 1;
4202	  break;
4203
4204	case R_FRV_FUNCDESC:
4205	  picrel->fd = 1;
4206	  picrel->relocsfd++;
4207	  break;
4208
4209        /* This relocation describes the C++ object vtable hierarchy.
4210           Reconstruct it for later use during GC.  */
4211        case R_FRV_GNU_VTINHERIT:
4212          if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
4213            return FALSE;
4214          break;
4215
4216        /* This relocation describes which C++ vtable entries are actually
4217           used.  Record for later use during GC.  */
4218        case R_FRV_GNU_VTENTRY:
4219          if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
4220            return FALSE;
4221          break;
4222
4223	case R_FRV_LABEL16:
4224	case R_FRV_LO16:
4225	case R_FRV_HI16:
4226	case R_FRV_GPREL12:
4227	case R_FRV_GPRELU12:
4228	case R_FRV_GPREL32:
4229	case R_FRV_GPRELHI:
4230	case R_FRV_GPRELLO:
4231	  break;
4232
4233	default:
4234	bad_reloc:
4235	  (*_bfd_error_handler)
4236	    (_("%B: unsupported relocation type %i"),
4237	     abfd, ELF32_R_TYPE (rel->r_info));
4238	  return FALSE;
4239        }
4240    }
4241
4242  return TRUE;
4243}
4244
4245
4246/* Return the machine subcode from the ELF e_flags header.  */
4247
4248static int
4249elf32_frv_machine (abfd)
4250     bfd *abfd;
4251{
4252  switch (elf_elfheader (abfd)->e_flags & EF_FRV_CPU_MASK)
4253    {
4254    default:		    break;
4255    case EF_FRV_CPU_FR550:  return bfd_mach_fr550;
4256    case EF_FRV_CPU_FR500:  return bfd_mach_fr500;
4257    case EF_FRV_CPU_FR450:  return bfd_mach_fr450;
4258    case EF_FRV_CPU_FR405:  return bfd_mach_fr400;
4259    case EF_FRV_CPU_FR400:  return bfd_mach_fr400;
4260    case EF_FRV_CPU_FR300:  return bfd_mach_fr300;
4261    case EF_FRV_CPU_SIMPLE: return bfd_mach_frvsimple;
4262    case EF_FRV_CPU_TOMCAT: return bfd_mach_frvtomcat;
4263    }
4264
4265  return bfd_mach_frv;
4266}
4267
4268/* Set the right machine number for a FRV ELF file.  */
4269
4270static bfd_boolean
4271elf32_frv_object_p (abfd)
4272     bfd *abfd;
4273{
4274  bfd_default_set_arch_mach (abfd, bfd_arch_frv, elf32_frv_machine (abfd));
4275  return (((elf_elfheader (abfd)->e_flags & EF_FRV_FDPIC) != 0)
4276	  == (IS_FDPIC (abfd)));
4277}
4278
4279/* Function to set the ELF flag bits.  */
4280
4281static bfd_boolean
4282frv_elf_set_private_flags (abfd, flags)
4283     bfd *abfd;
4284     flagword flags;
4285{
4286  elf_elfheader (abfd)->e_flags = flags;
4287  elf_flags_init (abfd) = TRUE;
4288  return TRUE;
4289}
4290
4291/* Copy backend specific data from one object module to another.  */
4292
4293static bfd_boolean
4294frv_elf_copy_private_bfd_data (ibfd, obfd)
4295     bfd *ibfd;
4296     bfd *obfd;
4297{
4298  if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
4299      || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
4300    return TRUE;
4301
4302  BFD_ASSERT (!elf_flags_init (obfd)
4303	      || elf_elfheader (obfd)->e_flags == elf_elfheader (ibfd)->e_flags);
4304
4305  elf_elfheader (obfd)->e_flags = elf_elfheader (ibfd)->e_flags;
4306  elf_flags_init (obfd) = TRUE;
4307  return TRUE;
4308}
4309
4310/* Return true if the architecture described by elf header flag
4311   EXTENSION is an extension of the architecture described by BASE.  */
4312
4313static bfd_boolean
4314frv_elf_arch_extension_p (flagword base, flagword extension)
4315{
4316  if (base == extension)
4317    return TRUE;
4318
4319  /* CPU_GENERIC code can be merged with code for a specific
4320     architecture, in which case the result is marked as being
4321     for the specific architecture.  Everything is therefore
4322     an extension of CPU_GENERIC.  */
4323  if (base == EF_FRV_CPU_GENERIC)
4324    return TRUE;
4325
4326  if (extension == EF_FRV_CPU_FR450)
4327    if (base == EF_FRV_CPU_FR400 || base == EF_FRV_CPU_FR405)
4328      return TRUE;
4329
4330  if (extension == EF_FRV_CPU_FR405)
4331    if (base == EF_FRV_CPU_FR400)
4332      return TRUE;
4333
4334  return FALSE;
4335}
4336
4337static bfd_boolean
4338elf32_frvfdpic_copy_private_bfd_data (bfd *ibfd, bfd *obfd)
4339{
4340  unsigned i;
4341
4342  if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
4343      || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
4344    return TRUE;
4345
4346  if (! frv_elf_copy_private_bfd_data (ibfd, obfd))
4347    return FALSE;
4348
4349  if (! elf_tdata (ibfd) || ! elf_tdata (ibfd)->phdr
4350      || ! elf_tdata (obfd) || ! elf_tdata (obfd)->phdr)
4351    return TRUE;
4352
4353  /* Copy the stack size.  */
4354  for (i = 0; i < elf_elfheader (ibfd)->e_phnum; i++)
4355    if (elf_tdata (ibfd)->phdr[i].p_type == PT_GNU_STACK)
4356      {
4357	Elf_Internal_Phdr *iphdr = &elf_tdata (ibfd)->phdr[i];
4358
4359	for (i = 0; i < elf_elfheader (obfd)->e_phnum; i++)
4360	  if (elf_tdata (obfd)->phdr[i].p_type == PT_GNU_STACK)
4361	    {
4362	      memcpy (&elf_tdata (obfd)->phdr[i], iphdr, sizeof (*iphdr));
4363
4364	      /* Rewrite the phdrs, since we're only called after they
4365		 were first written.  */
4366	      if (bfd_seek (obfd, (bfd_signed_vma) get_elf_backend_data (obfd)
4367			    ->s->sizeof_ehdr, SEEK_SET) != 0
4368		  || get_elf_backend_data (obfd)->s
4369		  ->write_out_phdrs (obfd, elf_tdata (obfd)->phdr,
4370				     elf_elfheader (obfd)->e_phnum) != 0)
4371		return FALSE;
4372	      break;
4373	    }
4374
4375	break;
4376      }
4377
4378  return TRUE;
4379}
4380
4381/* Merge backend specific data from an object file to the output
4382   object file when linking.  */
4383
4384static bfd_boolean
4385frv_elf_merge_private_bfd_data (ibfd, obfd)
4386     bfd *ibfd;
4387     bfd *obfd;
4388{
4389  flagword old_flags, old_partial;
4390  flagword new_flags, new_partial;
4391  bfd_boolean error = FALSE;
4392  char new_opt[80];
4393  char old_opt[80];
4394
4395  new_opt[0] = old_opt[0] = '\0';
4396  new_flags = elf_elfheader (ibfd)->e_flags;
4397  old_flags = elf_elfheader (obfd)->e_flags;
4398
4399  if (new_flags & EF_FRV_FDPIC)
4400    new_flags &= ~EF_FRV_PIC;
4401
4402#ifdef DEBUG
4403  (*_bfd_error_handler) ("old_flags = 0x%.8lx, new_flags = 0x%.8lx, init = %s, filename = %s",
4404			 old_flags, new_flags, elf_flags_init (obfd) ? "yes" : "no",
4405			 bfd_get_filename (ibfd));
4406#endif
4407
4408  if (!elf_flags_init (obfd))			/* First call, no flags set.  */
4409    {
4410      elf_flags_init (obfd) = TRUE;
4411      old_flags = new_flags;
4412    }
4413
4414  else if (new_flags == old_flags)		/* Compatible flags are ok.  */
4415    ;
4416
4417  else						/* Possibly incompatible flags.  */
4418    {
4419      /* Warn if different # of gprs are used.  Note, 0 means nothing is
4420         said about the size of gprs.  */
4421      new_partial = (new_flags & EF_FRV_GPR_MASK);
4422      old_partial = (old_flags & EF_FRV_GPR_MASK);
4423      if (new_partial == old_partial)
4424	;
4425
4426      else if (new_partial == 0)
4427	;
4428
4429      else if (old_partial == 0)
4430	old_flags |= new_partial;
4431
4432      else
4433	{
4434	  switch (new_partial)
4435	    {
4436	    default:		strcat (new_opt, " -mgpr-??"); break;
4437	    case EF_FRV_GPR_32: strcat (new_opt, " -mgpr-32"); break;
4438	    case EF_FRV_GPR_64: strcat (new_opt, " -mgpr-64"); break;
4439	    }
4440
4441	  switch (old_partial)
4442	    {
4443	    default:		strcat (old_opt, " -mgpr-??"); break;
4444	    case EF_FRV_GPR_32: strcat (old_opt, " -mgpr-32"); break;
4445	    case EF_FRV_GPR_64: strcat (old_opt, " -mgpr-64"); break;
4446	    }
4447	}
4448
4449      /* Warn if different # of fprs are used.  Note, 0 means nothing is
4450         said about the size of fprs.  */
4451      new_partial = (new_flags & EF_FRV_FPR_MASK);
4452      old_partial = (old_flags & EF_FRV_FPR_MASK);
4453      if (new_partial == old_partial)
4454	;
4455
4456      else if (new_partial == 0)
4457	;
4458
4459      else if (old_partial == 0)
4460	old_flags |= new_partial;
4461
4462      else
4463	{
4464	  switch (new_partial)
4465	    {
4466	    default:		  strcat (new_opt, " -mfpr-?");      break;
4467	    case EF_FRV_FPR_32:   strcat (new_opt, " -mfpr-32");     break;
4468	    case EF_FRV_FPR_64:   strcat (new_opt, " -mfpr-64");     break;
4469	    case EF_FRV_FPR_NONE: strcat (new_opt, " -msoft-float"); break;
4470	    }
4471
4472	  switch (old_partial)
4473	    {
4474	    default:		  strcat (old_opt, " -mfpr-?");      break;
4475	    case EF_FRV_FPR_32:   strcat (old_opt, " -mfpr-32");     break;
4476	    case EF_FRV_FPR_64:   strcat (old_opt, " -mfpr-64");     break;
4477	    case EF_FRV_FPR_NONE: strcat (old_opt, " -msoft-float"); break;
4478	    }
4479	}
4480
4481      /* Warn if different dword support was used.  Note, 0 means nothing is
4482         said about the dword support.  */
4483      new_partial = (new_flags & EF_FRV_DWORD_MASK);
4484      old_partial = (old_flags & EF_FRV_DWORD_MASK);
4485      if (new_partial == old_partial)
4486	;
4487
4488      else if (new_partial == 0)
4489	;
4490
4491      else if (old_partial == 0)
4492	old_flags |= new_partial;
4493
4494      else
4495	{
4496	  switch (new_partial)
4497	    {
4498	    default:		   strcat (new_opt, " -mdword-?");  break;
4499	    case EF_FRV_DWORD_YES: strcat (new_opt, " -mdword");    break;
4500	    case EF_FRV_DWORD_NO:  strcat (new_opt, " -mno-dword"); break;
4501	    }
4502
4503	  switch (old_partial)
4504	    {
4505	    default:		   strcat (old_opt, " -mdword-?");  break;
4506	    case EF_FRV_DWORD_YES: strcat (old_opt, " -mdword");    break;
4507	    case EF_FRV_DWORD_NO:  strcat (old_opt, " -mno-dword"); break;
4508	    }
4509	}
4510
4511      /* Or in flags that accumulate (ie, if one module uses it, mark that the
4512	 feature is used.  */
4513      old_flags |= new_flags & (EF_FRV_DOUBLE
4514				| EF_FRV_MEDIA
4515				| EF_FRV_MULADD
4516				| EF_FRV_NON_PIC_RELOCS);
4517
4518      /* If any module was compiled without -G0, clear the G0 bit.  */
4519      old_flags = ((old_flags & ~ EF_FRV_G0)
4520		   | (old_flags & new_flags & EF_FRV_G0));
4521
4522      /* If any module was compiled without -mnopack, clear the mnopack bit.  */
4523      old_flags = ((old_flags & ~ EF_FRV_NOPACK)
4524		   | (old_flags & new_flags & EF_FRV_NOPACK));
4525
4526      /* We don't have to do anything if the pic flags are the same, or the new
4527         module(s) were compiled with -mlibrary-pic.  */
4528      new_partial = (new_flags & EF_FRV_PIC_FLAGS);
4529      old_partial = (old_flags & EF_FRV_PIC_FLAGS);
4530      if ((new_partial == old_partial) || ((new_partial & EF_FRV_LIBPIC) != 0))
4531	;
4532
4533      /* If the old module(s) were compiled with -mlibrary-pic, copy in the pic
4534         flags if any from the new module.  */
4535      else if ((old_partial & EF_FRV_LIBPIC) != 0)
4536	old_flags = (old_flags & ~ EF_FRV_PIC_FLAGS) | new_partial;
4537
4538      /* If we have mixtures of -fpic and -fPIC, or in both bits.  */
4539      else if (new_partial != 0 && old_partial != 0)
4540	old_flags |= new_partial;
4541
4542      /* One module was compiled for pic and the other was not, see if we have
4543         had any relocations that are not pic-safe.  */
4544      else
4545	{
4546	  if ((old_flags & EF_FRV_NON_PIC_RELOCS) == 0)
4547	    old_flags |= new_partial;
4548	  else
4549	    {
4550	      old_flags &= ~ EF_FRV_PIC_FLAGS;
4551#ifndef FRV_NO_PIC_ERROR
4552	      error = TRUE;
4553	      (*_bfd_error_handler)
4554		(_("%s: compiled with %s and linked with modules that use non-pic relocations"),
4555		 bfd_get_filename (ibfd),
4556		 (new_flags & EF_FRV_BIGPIC) ? "-fPIC" : "-fpic");
4557#endif
4558	    }
4559	}
4560
4561      /* Warn if different cpu is used (allow a specific cpu to override
4562	 the generic cpu).  */
4563      new_partial = (new_flags & EF_FRV_CPU_MASK);
4564      old_partial = (old_flags & EF_FRV_CPU_MASK);
4565      if (frv_elf_arch_extension_p (new_partial, old_partial))
4566	;
4567
4568      else if (frv_elf_arch_extension_p (old_partial, new_partial))
4569	old_flags = (old_flags & ~EF_FRV_CPU_MASK) | new_partial;
4570
4571      else
4572	{
4573	  switch (new_partial)
4574	    {
4575	    default:		     strcat (new_opt, " -mcpu=?");      break;
4576	    case EF_FRV_CPU_GENERIC: strcat (new_opt, " -mcpu=frv");    break;
4577	    case EF_FRV_CPU_SIMPLE:  strcat (new_opt, " -mcpu=simple"); break;
4578	    case EF_FRV_CPU_FR550:   strcat (new_opt, " -mcpu=fr550");  break;
4579	    case EF_FRV_CPU_FR500:   strcat (new_opt, " -mcpu=fr500");  break;
4580	    case EF_FRV_CPU_FR450:   strcat (new_opt, " -mcpu=fr450");  break;
4581	    case EF_FRV_CPU_FR405:   strcat (new_opt, " -mcpu=fr405");  break;
4582	    case EF_FRV_CPU_FR400:   strcat (new_opt, " -mcpu=fr400");  break;
4583	    case EF_FRV_CPU_FR300:   strcat (new_opt, " -mcpu=fr300");  break;
4584	    case EF_FRV_CPU_TOMCAT:  strcat (new_opt, " -mcpu=tomcat"); break;
4585	    }
4586
4587	  switch (old_partial)
4588	    {
4589	    default:		     strcat (old_opt, " -mcpu=?");      break;
4590	    case EF_FRV_CPU_GENERIC: strcat (old_opt, " -mcpu=frv");    break;
4591	    case EF_FRV_CPU_SIMPLE:  strcat (old_opt, " -mcpu=simple"); break;
4592	    case EF_FRV_CPU_FR550:   strcat (old_opt, " -mcpu=fr550");  break;
4593	    case EF_FRV_CPU_FR500:   strcat (old_opt, " -mcpu=fr500");  break;
4594	    case EF_FRV_CPU_FR450:   strcat (old_opt, " -mcpu=fr450");  break;
4595	    case EF_FRV_CPU_FR405:   strcat (old_opt, " -mcpu=fr405");  break;
4596	    case EF_FRV_CPU_FR400:   strcat (old_opt, " -mcpu=fr400");  break;
4597	    case EF_FRV_CPU_FR300:   strcat (old_opt, " -mcpu=fr300");  break;
4598	    case EF_FRV_CPU_TOMCAT:  strcat (old_opt, " -mcpu=tomcat"); break;
4599	    }
4600	}
4601
4602      /* Print out any mismatches from above.  */
4603      if (new_opt[0])
4604	{
4605	  error = TRUE;
4606	  (*_bfd_error_handler)
4607	    (_("%s: compiled with %s and linked with modules compiled with %s"),
4608	     bfd_get_filename (ibfd), new_opt, old_opt);
4609	}
4610
4611      /* Warn about any other mismatches */
4612      new_partial = (new_flags & ~ EF_FRV_ALL_FLAGS);
4613      old_partial = (old_flags & ~ EF_FRV_ALL_FLAGS);
4614      if (new_partial != old_partial)
4615	{
4616	  old_flags |= new_partial;
4617	  error = TRUE;
4618	  (*_bfd_error_handler)
4619	    (_("%s: uses different unknown e_flags (0x%lx) fields than previous modules (0x%lx)"),
4620	     bfd_get_filename (ibfd), (long)new_partial, (long)old_partial);
4621	}
4622    }
4623
4624  /* If the cpu is -mcpu=simple, then set the -mnopack bit.  */
4625  if ((old_flags & EF_FRV_CPU_MASK) == EF_FRV_CPU_SIMPLE)
4626    old_flags |= EF_FRV_NOPACK;
4627
4628  /* Update the old flags now with changes made above.  */
4629  old_partial = elf_elfheader (obfd)->e_flags & EF_FRV_CPU_MASK;
4630  elf_elfheader (obfd)->e_flags = old_flags;
4631  if (old_partial != (old_flags & EF_FRV_CPU_MASK))
4632    bfd_default_set_arch_mach (obfd, bfd_arch_frv, elf32_frv_machine (obfd));
4633
4634  if (((new_flags & EF_FRV_FDPIC) == 0)
4635      != (! IS_FDPIC (ibfd)))
4636    {
4637      error = TRUE;
4638      if (IS_FDPIC (obfd))
4639	(*_bfd_error_handler)
4640	  (_("%s: cannot link non-fdpic object file into fdpic executable"),
4641	   bfd_get_filename (ibfd));
4642      else
4643	(*_bfd_error_handler)
4644	  (_("%s: cannot link fdpic object file into non-fdpic executable"),
4645	   bfd_get_filename (ibfd));
4646    }
4647
4648  if (error)
4649    bfd_set_error (bfd_error_bad_value);
4650
4651  return !error;
4652}
4653
4654
4655bfd_boolean
4656frv_elf_print_private_bfd_data (abfd, ptr)
4657     bfd *abfd;
4658     PTR ptr;
4659{
4660  FILE *file = (FILE *) ptr;
4661  flagword flags;
4662
4663  BFD_ASSERT (abfd != NULL && ptr != NULL);
4664
4665  /* Print normal ELF private data.  */
4666  _bfd_elf_print_private_bfd_data (abfd, ptr);
4667
4668  flags = elf_elfheader (abfd)->e_flags;
4669  fprintf (file, _("private flags = 0x%lx:"), (long)flags);
4670
4671  switch (flags & EF_FRV_CPU_MASK)
4672    {
4673    default:							break;
4674    case EF_FRV_CPU_SIMPLE: fprintf (file, " -mcpu=simple");	break;
4675    case EF_FRV_CPU_FR550:  fprintf (file, " -mcpu=fr550");	break;
4676    case EF_FRV_CPU_FR500:  fprintf (file, " -mcpu=fr500");	break;
4677    case EF_FRV_CPU_FR450:  fprintf (file, " -mcpu=fr450");	break;
4678    case EF_FRV_CPU_FR405:  fprintf (file, " -mcpu=fr405");	break;
4679    case EF_FRV_CPU_FR400:  fprintf (file, " -mcpu=fr400");	break;
4680    case EF_FRV_CPU_FR300:  fprintf (file, " -mcpu=fr300");	break;
4681    case EF_FRV_CPU_TOMCAT: fprintf (file, " -mcpu=tomcat");	break;
4682    }
4683
4684  switch (flags & EF_FRV_GPR_MASK)
4685    {
4686    default:							break;
4687    case EF_FRV_GPR_32: fprintf (file, " -mgpr-32");		break;
4688    case EF_FRV_GPR_64: fprintf (file, " -mgpr-64");		break;
4689    }
4690
4691  switch (flags & EF_FRV_FPR_MASK)
4692    {
4693    default:							break;
4694    case EF_FRV_FPR_32:   fprintf (file, " -mfpr-32");		break;
4695    case EF_FRV_FPR_64:   fprintf (file, " -mfpr-64");		break;
4696    case EF_FRV_FPR_NONE: fprintf (file, " -msoft-float");	break;
4697    }
4698
4699  switch (flags & EF_FRV_DWORD_MASK)
4700    {
4701    default:							break;
4702    case EF_FRV_DWORD_YES: fprintf (file, " -mdword");		break;
4703    case EF_FRV_DWORD_NO:  fprintf (file, " -mno-dword");	break;
4704    }
4705
4706  if (flags & EF_FRV_DOUBLE)
4707    fprintf (file, " -mdouble");
4708
4709  if (flags & EF_FRV_MEDIA)
4710    fprintf (file, " -mmedia");
4711
4712  if (flags & EF_FRV_MULADD)
4713    fprintf (file, " -mmuladd");
4714
4715  if (flags & EF_FRV_PIC)
4716    fprintf (file, " -fpic");
4717
4718  if (flags & EF_FRV_BIGPIC)
4719    fprintf (file, " -fPIC");
4720
4721  if (flags & EF_FRV_LIBPIC)
4722    fprintf (file, " -mlibrary-pic");
4723
4724  if (flags & EF_FRV_FDPIC)
4725    fprintf (file, " -mfdpic");
4726
4727  if (flags & EF_FRV_NON_PIC_RELOCS)
4728    fprintf (file, " non-pic relocations");
4729
4730  if (flags & EF_FRV_G0)
4731    fprintf (file, " -G0");
4732
4733  fputc ('\n', file);
4734  return TRUE;
4735}
4736
4737
4738#define ELF_ARCH		bfd_arch_frv
4739#define ELF_MACHINE_CODE	EM_CYGNUS_FRV
4740#define ELF_MAXPAGESIZE		0x1000
4741
4742#define TARGET_BIG_SYM          bfd_elf32_frv_vec
4743#define TARGET_BIG_NAME		"elf32-frv"
4744
4745#define elf_info_to_howto			frv_info_to_howto_rela
4746#define elf_backend_relocate_section		elf32_frv_relocate_section
4747#define elf_backend_gc_mark_hook		elf32_frv_gc_mark_hook
4748#define elf_backend_gc_sweep_hook		elf32_frv_gc_sweep_hook
4749#define elf_backend_check_relocs                elf32_frv_check_relocs
4750#define elf_backend_object_p			elf32_frv_object_p
4751#define elf_backend_add_symbol_hook             elf32_frv_add_symbol_hook
4752
4753#define elf_backend_can_gc_sections		1
4754#define elf_backend_rela_normal			1
4755
4756#define bfd_elf32_bfd_reloc_type_lookup		frv_reloc_type_lookup
4757#define bfd_elf32_bfd_set_private_flags		frv_elf_set_private_flags
4758#define bfd_elf32_bfd_copy_private_bfd_data	frv_elf_copy_private_bfd_data
4759#define bfd_elf32_bfd_merge_private_bfd_data	frv_elf_merge_private_bfd_data
4760#define bfd_elf32_bfd_print_private_bfd_data	frv_elf_print_private_bfd_data
4761
4762#define elf_backend_want_got_sym	1
4763#define elf_backend_got_header_size	0
4764#define elf_backend_want_got_plt	0
4765#define elf_backend_plt_readonly	1
4766#define elf_backend_want_plt_sym	0
4767#define elf_backend_plt_header_size	0
4768
4769#define elf_backend_finish_dynamic_sections \
4770		elf32_frv_finish_dynamic_sections
4771
4772#include "elf32-target.h"
4773
4774#undef ELF_MAXPAGESIZE
4775#define ELF_MAXPAGESIZE		0x4000
4776
4777#undef TARGET_BIG_SYM
4778#define TARGET_BIG_SYM          bfd_elf32_frvfdpic_vec
4779#undef TARGET_BIG_NAME
4780#define TARGET_BIG_NAME		"elf32-frvfdpic"
4781#undef	elf32_bed
4782#define	elf32_bed		elf32_frvfdpic_bed
4783
4784#undef elf_info_to_howto_rel
4785#define elf_info_to_howto_rel	frvfdpic_info_to_howto_rel
4786
4787#undef bfd_elf32_bfd_link_hash_table_create
4788#define bfd_elf32_bfd_link_hash_table_create \
4789		frvfdpic_elf_link_hash_table_create
4790#undef elf_backend_always_size_sections
4791#define elf_backend_always_size_sections \
4792		elf32_frvfdpic_always_size_sections
4793#undef elf_backend_modify_segment_map
4794#define elf_backend_modify_segment_map \
4795		elf32_frvfdpic_modify_segment_map
4796#undef bfd_elf32_bfd_copy_private_bfd_data
4797#define bfd_elf32_bfd_copy_private_bfd_data \
4798		elf32_frvfdpic_copy_private_bfd_data
4799
4800#undef elf_backend_create_dynamic_sections
4801#define elf_backend_create_dynamic_sections \
4802		elf32_frvfdpic_create_dynamic_sections
4803#undef elf_backend_adjust_dynamic_symbol
4804#define elf_backend_adjust_dynamic_symbol \
4805		elf32_frvfdpic_adjust_dynamic_symbol
4806#undef elf_backend_size_dynamic_sections
4807#define elf_backend_size_dynamic_sections \
4808		elf32_frvfdpic_size_dynamic_sections
4809#undef elf_backend_finish_dynamic_symbol
4810#define elf_backend_finish_dynamic_symbol \
4811		elf32_frvfdpic_finish_dynamic_symbol
4812#undef elf_backend_finish_dynamic_sections
4813#define elf_backend_finish_dynamic_sections \
4814		elf32_frvfdpic_finish_dynamic_sections
4815
4816#undef elf_backend_can_make_relative_eh_frame
4817#define elf_backend_can_make_relative_eh_frame \
4818		frvfdpic_elf_use_relative_eh_frame
4819#undef elf_backend_can_make_lsda_relative_eh_frame
4820#define elf_backend_can_make_lsda_relative_eh_frame \
4821		frvfdpic_elf_use_relative_eh_frame
4822#undef elf_backend_encode_eh_address
4823#define elf_backend_encode_eh_address \
4824		frvfdpic_elf_encode_eh_address
4825
4826#undef elf_backend_may_use_rel_p
4827#define elf_backend_may_use_rel_p       1
4828#undef elf_backend_may_use_rela_p
4829#define elf_backend_may_use_rela_p      1
4830/* We use REL for dynamic relocations only.  */
4831#undef elf_backend_default_use_rela_p
4832#define elf_backend_default_use_rela_p  1
4833
4834#undef elf_backend_omit_section_dynsym
4835#define elf_backend_omit_section_dynsym _frvfdpic_link_omit_section_dynsym
4836
4837#include "elf32-target.h"
4838