1/* FRV-specific support for 32-bit ELF.
2   Copyright 2002, 2003, 2004, 2005, 2006  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., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, 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));
81static bfd_boolean elf32_frv_grok_prstatus (bfd * abfd,
82					    Elf_Internal_Note * note);
83static bfd_boolean elf32_frv_grok_psinfo (bfd * abfd,
84					  Elf_Internal_Note * note);
85
86static reloc_howto_type elf32_frv_howto_table [] =
87{
88  /* This reloc does nothing.  */
89  HOWTO (R_FRV_NONE,		/* type */
90	 0,			/* rightshift */
91	 2,			/* size (0 = byte, 1 = short, 2 = long) */
92	 32,			/* bitsize */
93	 FALSE,			/* pc_relative */
94	 0,			/* bitpos */
95	 complain_overflow_bitfield, /* complain_on_overflow */
96	 bfd_elf_generic_reloc,	/* special_function */
97	 "R_FRV_NONE",		/* name */
98	 FALSE,			/* partial_inplace */
99	 0,			/* src_mask */
100	 0,			/* dst_mask */
101	 FALSE),		/* pcrel_offset */
102
103  /* A 32 bit absolute relocation.  */
104  HOWTO (R_FRV_32,		/* type */
105	 0,			/* rightshift */
106	 2,			/* size (0 = byte, 1 = short, 2 = long) */
107	 32,			/* bitsize */
108	 FALSE,			/* pc_relative */
109	 0,			/* bitpos */
110	 complain_overflow_bitfield, /* complain_on_overflow */
111	 bfd_elf_generic_reloc,	/* special_function */
112	 "R_FRV_32",		/* name */
113	 FALSE,			/* partial_inplace */
114	 0xffffffff,		/* src_mask */
115	 0xffffffff,		/* dst_mask */
116	 FALSE),		/* pcrel_offset */
117
118  /* A 16 bit pc-relative relocation.  */
119  HOWTO (R_FRV_LABEL16,		/* type */
120	 2,			/* rightshift */
121	 2,			/* size (0 = byte, 1 = short, 2 = long) */
122	 16,			/* bitsize */
123	 TRUE,			/* pc_relative */
124	 0,			/* bitpos */
125	 complain_overflow_signed, /* complain_on_overflow */
126	 bfd_elf_generic_reloc,	/* special_function */
127	 "R_FRV_LABEL16",	/* name */
128	 FALSE,			/* partial_inplace */
129	 0xffff,		/* src_mask */
130	 0xffff,		/* dst_mask */
131	 TRUE),			/* pcrel_offset */
132
133  /* A 24-bit pc-relative relocation.  */
134  HOWTO (R_FRV_LABEL24,		/* type */
135	 2,			/* rightshift */
136	 2,			/* size (0 = byte, 1 = short, 2 = long) */
137	 26,			/* bitsize */
138	 TRUE,			/* pc_relative */
139	 0,			/* bitpos */
140	 complain_overflow_bitfield, /* complain_on_overflow */
141	 bfd_elf_generic_reloc,	/* special_function */
142	 "R_FRV_LABEL24",	/* name */
143	 FALSE,			/* partial_inplace */
144	 0x7e03ffff,		/* src_mask */
145	 0x7e03ffff,		/* dst_mask */
146	 TRUE),			/* pcrel_offset */
147
148  HOWTO (R_FRV_LO16,		/* type */
149	 0,			/* rightshift */
150	 2,			/* size (0 = byte, 1 = short, 2 = long) */
151	 16,			/* bitsize */
152	 FALSE,			/* pc_relative */
153	 0,			/* bitpos */
154	 complain_overflow_dont, /* complain_on_overflow */
155	 bfd_elf_generic_reloc,	/* special_function */
156	 "R_FRV_LO16",		/* name */
157	 FALSE,			/* partial_inplace */
158	 0xffff,		/* src_mask */
159	 0xffff,		/* dst_mask */
160	 FALSE),		/* pcrel_offset */
161
162  HOWTO (R_FRV_HI16,		/* type */
163	 0,			/* rightshift */
164	 2,			/* size (0 = byte, 1 = short, 2 = long) */
165	 16,			/* bitsize */
166	 FALSE,			/* pc_relative */
167	 0,			/* bitpos */
168	 complain_overflow_dont, /* complain_on_overflow */
169	 bfd_elf_generic_reloc,	/* special_function */
170	 "R_FRV_HI16",		/* name */
171	 FALSE,			/* partial_inplace */
172	 0xffff,		/* src_mask */
173	 0xffff,		/* dst_mask */
174	 FALSE),		/* pcrel_offset */
175
176  HOWTO (R_FRV_GPREL12,		/* type */
177	 0,			/* rightshift */
178	 2,			/* size (0 = byte, 1 = short, 2 = long) */
179	 12,			/* bitsize */
180	 FALSE,			/* pc_relative */
181	 0,			/* bitpos */
182	 complain_overflow_dont, /* complain_on_overflow */
183	 bfd_elf_generic_reloc,	/* special_function */
184	 "R_FRV_GPREL12",	/* name */
185	 FALSE,			/* partial_inplace */
186	 0xfff,			/* src_mask */
187	 0xfff,			/* dst_mask */
188	 FALSE),		/* pcrel_offset */
189
190  HOWTO (R_FRV_GPRELU12,	/* type */
191	 0,			/* rightshift */
192	 2,			/* size (0 = byte, 1 = short, 2 = long) */
193	 12,			/* bitsize */
194	 FALSE,			/* pc_relative */
195	 0,			/* bitpos */
196	 complain_overflow_dont, /* complain_on_overflow */
197	 bfd_elf_generic_reloc,	/* special_function */
198	 "R_FRV_GPRELU12",	/* name */
199	 FALSE,			/* partial_inplace */
200	 0xfff,			/* src_mask */
201	 0x3f03f,		/* dst_mask */
202	 FALSE),		/* pcrel_offset */
203
204  HOWTO (R_FRV_GPREL32,		/* type */
205	 0,			/* rightshift */
206	 2,			/* size (0 = byte, 1 = short, 2 = long) */
207	 32,			/* bitsize */
208	 FALSE,			/* pc_relative */
209	 0,			/* bitpos */
210	 complain_overflow_dont, /* complain_on_overflow */
211	 bfd_elf_generic_reloc,	/* special_function */
212	 "R_FRV_GPREL32",	/* name */
213	 FALSE,			/* partial_inplace */
214	 0xffffffff,		/* src_mask */
215	 0xffffffff,		/* dst_mask */
216	 FALSE),		/* pcrel_offset */
217
218  HOWTO (R_FRV_GPRELHI,		/* type */
219	 0,			/* rightshift */
220	 2,			/* size (0 = byte, 1 = short, 2 = long) */
221	 16,			/* bitsize */
222	 FALSE,			/* pc_relative */
223	 0,			/* bitpos */
224	 complain_overflow_dont, /* complain_on_overflow */
225	 bfd_elf_generic_reloc,	/* special_function */
226	 "R_FRV_GPRELHI",	/* name */
227	 FALSE,			/* partial_inplace */
228	 0xffff,		/* src_mask */
229	 0xffff,		/* dst_mask */
230	 FALSE),		/* pcrel_offset */
231
232  HOWTO (R_FRV_GPRELLO,		/* type */
233	 0,			/* rightshift */
234	 2,			/* size (0 = byte, 1 = short, 2 = long) */
235	 16,			/* bitsize */
236	 FALSE,			/* pc_relative */
237	 0,			/* bitpos */
238	 complain_overflow_dont, /* complain_on_overflow */
239	 bfd_elf_generic_reloc,	/* special_function */
240	 "R_FRV_GPRELLO",	/* name */
241	 FALSE,			/* partial_inplace */
242	 0xffff,		/* src_mask */
243	 0xffff,		/* dst_mask */
244	 FALSE),		/* pcrel_offset */
245
246  /* A 12-bit signed operand with the GOT offset for the address of
247     the symbol.  */
248  HOWTO (R_FRV_GOT12,		/* type */
249	 0,			/* rightshift */
250	 2,			/* size (0 = byte, 1 = short, 2 = long) */
251	 12,			/* bitsize */
252	 FALSE,			/* pc_relative */
253	 0,			/* bitpos */
254	 complain_overflow_signed, /* complain_on_overflow */
255	 bfd_elf_generic_reloc,	/* special_function */
256	 "R_FRV_GOT12",		/* name */
257	 FALSE,			/* partial_inplace */
258	 0xfff,			/* src_mask */
259	 0xfff,			/* dst_mask */
260	 FALSE),		/* pcrel_offset */
261
262  /* The upper 16 bits of the GOT offset for the address of the
263     symbol.  */
264  HOWTO (R_FRV_GOTHI,		/* type */
265	 0,			/* rightshift */
266	 2,			/* size (0 = byte, 1 = short, 2 = long) */
267	 16,			/* bitsize */
268	 FALSE,			/* pc_relative */
269	 0,			/* bitpos */
270	 complain_overflow_dont, /* complain_on_overflow */
271	 bfd_elf_generic_reloc,	/* special_function */
272	 "R_FRV_GOTHI",		/* name */
273	 FALSE,			/* partial_inplace */
274	 0xffff,		/* src_mask */
275	 0xffff,		/* dst_mask */
276	 FALSE),		/* pcrel_offset */
277
278  /* The lower 16 bits of the GOT offset for the address of the
279     symbol.  */
280  HOWTO (R_FRV_GOTLO,		/* type */
281	 0,			/* rightshift */
282	 2,			/* size (0 = byte, 1 = short, 2 = long) */
283	 16,			/* bitsize */
284	 FALSE,			/* pc_relative */
285	 0,			/* bitpos */
286	 complain_overflow_dont, /* complain_on_overflow */
287	 bfd_elf_generic_reloc,	/* special_function */
288	 "R_FRV_GOTLO",		/* name */
289	 FALSE,			/* partial_inplace */
290	 0xffff,		/* src_mask */
291	 0xffff,		/* dst_mask */
292	 FALSE),		/* pcrel_offset */
293
294  /* The 32-bit address of the canonical descriptor of a function.  */
295  HOWTO (R_FRV_FUNCDESC,	/* type */
296	 0,			/* rightshift */
297	 2,			/* size (0 = byte, 1 = short, 2 = long) */
298	 32,			/* bitsize */
299	 FALSE,			/* pc_relative */
300	 0,			/* bitpos */
301	 complain_overflow_bitfield, /* complain_on_overflow */
302	 bfd_elf_generic_reloc,	/* special_function */
303	 "R_FRV_FUNCDESC",	/* name */
304	 FALSE,			/* partial_inplace */
305	 0xffffffff,		/* src_mask */
306	 0xffffffff,		/* dst_mask */
307	 FALSE),		/* pcrel_offset */
308
309  /* A 12-bit signed operand with the GOT offset for the address of
310     canonical descriptor of a function.  */
311  HOWTO (R_FRV_FUNCDESC_GOT12,	/* type */
312	 0,			/* rightshift */
313	 2,			/* size (0 = byte, 1 = short, 2 = long) */
314	 12,			/* bitsize */
315	 FALSE,			/* pc_relative */
316	 0,			/* bitpos */
317	 complain_overflow_signed, /* complain_on_overflow */
318	 bfd_elf_generic_reloc,	/* special_function */
319	 "R_FRV_FUNCDESC_GOT12", /* name */
320	 FALSE,			/* partial_inplace */
321	 0xfff,			/* src_mask */
322	 0xfff,			/* dst_mask */
323	 FALSE),		/* pcrel_offset */
324
325  /* The upper 16 bits of the GOT offset for the address of the
326     canonical descriptor of a function.  */
327  HOWTO (R_FRV_FUNCDESC_GOTHI,	/* type */
328	 0,			/* rightshift */
329	 2,			/* size (0 = byte, 1 = short, 2 = long) */
330	 16,			/* bitsize */
331	 FALSE,			/* pc_relative */
332	 0,			/* bitpos */
333	 complain_overflow_dont, /* complain_on_overflow */
334	 bfd_elf_generic_reloc,	/* special_function */
335	 "R_FRV_FUNCDESC_GOTHI", /* name */
336	 FALSE,			/* partial_inplace */
337	 0xffff,		/* src_mask */
338	 0xffff,		/* dst_mask */
339	 FALSE),		/* pcrel_offset */
340
341  /* The lower 16 bits of the GOT offset for the address of the
342     canonical descriptor of a function.  */
343  HOWTO (R_FRV_FUNCDESC_GOTLO,	/* type */
344	 0,			/* rightshift */
345	 2,			/* size (0 = byte, 1 = short, 2 = long) */
346	 16,			/* bitsize */
347	 FALSE,			/* pc_relative */
348	 0,			/* bitpos */
349	 complain_overflow_dont, /* complain_on_overflow */
350	 bfd_elf_generic_reloc,	/* special_function */
351	 "R_FRV_FUNCDESC_GOTLO", /* name */
352	 FALSE,			/* partial_inplace */
353	 0xffff,		/* src_mask */
354	 0xffff,		/* dst_mask */
355	 FALSE),		/* pcrel_offset */
356
357  /* The 64-bit descriptor of a function.  */
358  HOWTO (R_FRV_FUNCDESC_VALUE,	/* type */
359	 0,			/* rightshift */
360	 2,			/* size (0 = byte, 1 = short, 2 = long) */
361	 64,			/* bitsize */
362	 FALSE,			/* pc_relative */
363	 0,			/* bitpos */
364	 complain_overflow_bitfield, /* complain_on_overflow */
365	 bfd_elf_generic_reloc,	/* special_function */
366	 "R_FRV_FUNCDESC_VALUE", /* name */
367	 FALSE,			/* partial_inplace */
368	 0xffffffff,		/* src_mask */
369	 0xffffffff,		/* dst_mask */
370	 FALSE),		/* pcrel_offset */
371
372  /* A 12-bit signed operand with the GOT offset for the address of
373     canonical descriptor of a function.  */
374  HOWTO (R_FRV_FUNCDESC_GOTOFF12, /* type */
375	 0,			/* rightshift */
376	 2,			/* size (0 = byte, 1 = short, 2 = long) */
377	 12,			/* bitsize */
378	 FALSE,			/* pc_relative */
379	 0,			/* bitpos */
380	 complain_overflow_signed, /* complain_on_overflow */
381	 bfd_elf_generic_reloc,	/* special_function */
382	 "R_FRV_FUNCDESC_GOTOFF12", /* name */
383	 FALSE,			/* partial_inplace */
384	 0xfff,			/* src_mask */
385	 0xfff,			/* dst_mask */
386	 FALSE),		/* pcrel_offset */
387
388  /* The upper 16 bits of the GOT offset for the address of the
389     canonical descriptor of a function.  */
390  HOWTO (R_FRV_FUNCDESC_GOTOFFHI, /* type */
391	 0,			/* rightshift */
392	 2,			/* size (0 = byte, 1 = short, 2 = long) */
393	 16,			/* bitsize */
394	 FALSE,			/* pc_relative */
395	 0,			/* bitpos */
396	 complain_overflow_dont, /* complain_on_overflow */
397	 bfd_elf_generic_reloc,	/* special_function */
398	 "R_FRV_FUNCDESC_GOTOFFHI", /* name */
399	 FALSE,			/* partial_inplace */
400	 0xffff,		/* src_mask */
401	 0xffff,		/* dst_mask */
402	 FALSE),		/* pcrel_offset */
403
404  /* The lower 16 bits of the GOT offset for the address of the
405     canonical descriptor of a function.  */
406  HOWTO (R_FRV_FUNCDESC_GOTOFFLO, /* type */
407	 0,			/* rightshift */
408	 2,			/* size (0 = byte, 1 = short, 2 = long) */
409	 16,			/* bitsize */
410	 FALSE,			/* pc_relative */
411	 0,			/* bitpos */
412	 complain_overflow_dont, /* complain_on_overflow */
413	 bfd_elf_generic_reloc,	/* special_function */
414	 "R_FRV_FUNCDESC_GOTOFFLO", /* name */
415	 FALSE,			/* partial_inplace */
416	 0xffff,		/* src_mask */
417	 0xffff,		/* dst_mask */
418	 FALSE),		/* pcrel_offset */
419
420  /* A 12-bit signed operand with the GOT offset for the address of
421     the symbol.  */
422  HOWTO (R_FRV_GOTOFF12,	/* type */
423	 0,			/* rightshift */
424	 2,			/* size (0 = byte, 1 = short, 2 = long) */
425	 12,			/* bitsize */
426	 FALSE,			/* pc_relative */
427	 0,			/* bitpos */
428	 complain_overflow_signed, /* complain_on_overflow */
429	 bfd_elf_generic_reloc,	/* special_function */
430	 "R_FRV_GOTOFF12",	/* name */
431	 FALSE,			/* partial_inplace */
432	 0xfff,			/* src_mask */
433	 0xfff,			/* dst_mask */
434	 FALSE),		/* pcrel_offset */
435
436  /* The upper 16 bits of the GOT offset for the address of the
437     symbol.  */
438  HOWTO (R_FRV_GOTOFFHI,	/* type */
439	 0,			/* rightshift */
440	 2,			/* size (0 = byte, 1 = short, 2 = long) */
441	 16,			/* bitsize */
442	 FALSE,			/* pc_relative */
443	 0,			/* bitpos */
444	 complain_overflow_dont, /* complain_on_overflow */
445	 bfd_elf_generic_reloc,	/* special_function */
446	 "R_FRV_GOTOFFHI",	/* name */
447	 FALSE,			/* partial_inplace */
448	 0xffff,		/* src_mask */
449	 0xffff,		/* dst_mask */
450	 FALSE),		/* pcrel_offset */
451
452  /* The lower 16 bits of the GOT offset for the address of the
453     symbol.  */
454  HOWTO (R_FRV_GOTOFFLO,	/* type */
455	 0,			/* rightshift */
456	 2,			/* size (0 = byte, 1 = short, 2 = long) */
457	 16,			/* bitsize */
458	 FALSE,			/* pc_relative */
459	 0,			/* bitpos */
460	 complain_overflow_dont, /* complain_on_overflow */
461	 bfd_elf_generic_reloc,	/* special_function */
462	 "R_FRV_GOTOFFLO",	/* name */
463	 FALSE,			/* partial_inplace */
464	 0xffff,		/* src_mask */
465	 0xffff,		/* dst_mask */
466	 FALSE),		/* pcrel_offset */
467
468  /* A 24-bit pc-relative relocation referencing the TLS PLT entry for
469     a thread-local symbol.  If the symbol number is 0, it refers to
470     the module.  */
471  HOWTO (R_FRV_GETTLSOFF,	/* type */
472	 2,			/* rightshift */
473	 2,			/* size (0 = byte, 1 = short, 2 = long) */
474	 26,			/* bitsize */
475	 TRUE,			/* pc_relative */
476	 0,			/* bitpos */
477	 complain_overflow_bitfield, /* complain_on_overflow */
478	 bfd_elf_generic_reloc,	/* special_function */
479	 "R_FRV_GETTLSOFF",	/* name */
480	 FALSE,			/* partial_inplace */
481	 0x7e03ffff,		/* src_mask */
482	 0x7e03ffff,		/* dst_mask */
483	 TRUE),			/* pcrel_offset */
484
485  /* A 64-bit TLS descriptor for a symbol.  This relocation is only
486     valid as a REL, dynamic relocation.  */
487  HOWTO (R_FRV_TLSDESC_VALUE,	/* type */
488	 0,			/* rightshift */
489	 2,			/* size (0 = byte, 1 = short, 2 = long) */
490	 64,			/* bitsize */
491	 FALSE,			/* pc_relative */
492	 0,			/* bitpos */
493	 complain_overflow_bitfield, /* complain_on_overflow */
494	 bfd_elf_generic_reloc,	/* special_function */
495	 "R_FRV_TLSDESC_VALUE", /* name */
496	 FALSE,			/* partial_inplace */
497	 0xffffffff,		/* src_mask */
498	 0xffffffff,		/* dst_mask */
499	 FALSE),		/* pcrel_offset */
500
501  /* A 12-bit signed operand with the GOT offset for the TLS
502     descriptor of the symbol.  */
503  HOWTO (R_FRV_GOTTLSDESC12,	/* type */
504	 0,			/* rightshift */
505	 2,			/* size (0 = byte, 1 = short, 2 = long) */
506	 12,			/* bitsize */
507	 FALSE,			/* pc_relative */
508	 0,			/* bitpos */
509	 complain_overflow_signed, /* complain_on_overflow */
510	 bfd_elf_generic_reloc,	/* special_function */
511	 "R_FRV_GOTTLSDESC12",	/* name */
512	 FALSE,			/* partial_inplace */
513	 0xfff,			/* src_mask */
514	 0xfff,			/* dst_mask */
515	 FALSE),		/* pcrel_offset */
516
517  /* The upper 16 bits of the GOT offset for the TLS descriptor of the
518     symbol.  */
519  HOWTO (R_FRV_GOTTLSDESCHI,	/* type */
520	 0,			/* rightshift */
521	 2,			/* size (0 = byte, 1 = short, 2 = long) */
522	 16,			/* bitsize */
523	 FALSE,			/* pc_relative */
524	 0,			/* bitpos */
525	 complain_overflow_dont, /* complain_on_overflow */
526	 bfd_elf_generic_reloc,	/* special_function */
527	 "R_FRV_GOTTLSDESCHI",	/* name */
528	 FALSE,			/* partial_inplace */
529	 0xffff,		/* src_mask */
530	 0xffff,		/* dst_mask */
531	 FALSE),		/* pcrel_offset */
532
533  /* The lower 16 bits of the GOT offset for the TLS descriptor of the
534     symbol.  */
535  HOWTO (R_FRV_GOTTLSDESCLO,	/* type */
536	 0,			/* rightshift */
537	 2,			/* size (0 = byte, 1 = short, 2 = long) */
538	 16,			/* bitsize */
539	 FALSE,			/* pc_relative */
540	 0,			/* bitpos */
541	 complain_overflow_dont, /* complain_on_overflow */
542	 bfd_elf_generic_reloc,	/* special_function */
543	 "R_FRV_GOTTLSDESCLO",	/* name */
544	 FALSE,			/* partial_inplace */
545	 0xffff,		/* src_mask */
546	 0xffff,		/* dst_mask */
547	 FALSE),		/* pcrel_offset */
548
549  /* A 12-bit signed operand with the offset from the module base
550     address to the thread-local symbol address.  */
551  HOWTO (R_FRV_TLSMOFF12,	 /* type */
552	 0,			/* rightshift */
553	 2,			/* size (0 = byte, 1 = short, 2 = long) */
554	 12,			/* bitsize */
555	 FALSE,			/* pc_relative */
556	 0,			/* bitpos */
557	 complain_overflow_signed, /* complain_on_overflow */
558	 bfd_elf_generic_reloc,	/* special_function */
559	 "R_FRV_TLSMOFF12",	/* name */
560	 FALSE,			/* partial_inplace */
561	 0xfff,			/* src_mask */
562	 0xfff,			/* dst_mask */
563	 FALSE),		/* pcrel_offset */
564
565  /* The upper 16 bits of the offset from the module base address to
566     the thread-local symbol address.  */
567  HOWTO (R_FRV_TLSMOFFHI,	/* type */
568	 0,			/* rightshift */
569	 2,			/* size (0 = byte, 1 = short, 2 = long) */
570	 16,			/* bitsize */
571	 FALSE,			/* pc_relative */
572	 0,			/* bitpos */
573	 complain_overflow_dont, /* complain_on_overflow */
574	 bfd_elf_generic_reloc,	/* special_function */
575	 "R_FRV_TLSMOFFHI",	/* name */
576	 FALSE,			/* partial_inplace */
577	 0xffff,		/* src_mask */
578	 0xffff,		/* dst_mask */
579	 FALSE),		/* pcrel_offset */
580
581  /* The lower 16 bits of the offset from the module base address to
582     the thread-local symbol address.  */
583  HOWTO (R_FRV_TLSMOFFLO,	/* type */
584	 0,			/* rightshift */
585	 2,			/* size (0 = byte, 1 = short, 2 = long) */
586	 16,			/* bitsize */
587	 FALSE,			/* pc_relative */
588	 0,			/* bitpos */
589	 complain_overflow_dont, /* complain_on_overflow */
590	 bfd_elf_generic_reloc,	/* special_function */
591	 "R_FRV_TLSMOFFLO",	/* name */
592	 FALSE,			/* partial_inplace */
593	 0xffff,		/* src_mask */
594	 0xffff,		/* dst_mask */
595	 FALSE),		/* pcrel_offset */
596
597  /* A 12-bit signed operand with the GOT offset for the TLSOFF entry
598     for a symbol.  */
599  HOWTO (R_FRV_GOTTLSOFF12,	/* type */
600	 0,			/* rightshift */
601	 2,			/* size (0 = byte, 1 = short, 2 = long) */
602	 12,			/* bitsize */
603	 FALSE,			/* pc_relative */
604	 0,			/* bitpos */
605	 complain_overflow_signed, /* complain_on_overflow */
606	 bfd_elf_generic_reloc,	/* special_function */
607	 "R_FRV_GOTTLSOFF12",	/* name */
608	 FALSE,			/* partial_inplace */
609	 0xfff,			/* src_mask */
610	 0xfff,			/* dst_mask */
611	 FALSE),		/* pcrel_offset */
612
613  /* The upper 16 bits of the GOT offset for the TLSOFF entry for a
614     symbol.  */
615  HOWTO (R_FRV_GOTTLSOFFHI,	/* type */
616	 0,			/* rightshift */
617	 2,			/* size (0 = byte, 1 = short, 2 = long) */
618	 16,			/* bitsize */
619	 FALSE,			/* pc_relative */
620	 0,			/* bitpos */
621	 complain_overflow_dont, /* complain_on_overflow */
622	 bfd_elf_generic_reloc,	/* special_function */
623	 "R_FRV_GOTTLSOFFHI",	/* name */
624	 FALSE,			/* partial_inplace */
625	 0xffff,		/* src_mask */
626	 0xffff,		/* dst_mask */
627	 FALSE),		/* pcrel_offset */
628
629  /* The lower 16 bits of the GOT offset for the TLSOFF entry for a
630     symbol.  */
631  HOWTO (R_FRV_GOTTLSOFFLO,	/* type */
632	 0,			/* rightshift */
633	 2,			/* size (0 = byte, 1 = short, 2 = long) */
634	 16,			/* bitsize */
635	 FALSE,			/* pc_relative */
636	 0,			/* bitpos */
637	 complain_overflow_dont, /* complain_on_overflow */
638	 bfd_elf_generic_reloc,	/* special_function */
639	 "R_FRV_GOTTLSOFFLO",	/* name */
640	 FALSE,			/* partial_inplace */
641	 0xffff,		/* src_mask */
642	 0xffff,		/* dst_mask */
643	 FALSE),		/* pcrel_offset */
644
645  /* The 32-bit offset from the thread pointer (not the module base
646     address) to a thread-local symbol.  */
647  HOWTO (R_FRV_TLSOFF,		/* type */
648	 0,			/* rightshift */
649	 2,			/* size (0 = byte, 1 = short, 2 = long) */
650	 32,			/* bitsize */
651	 FALSE,			/* pc_relative */
652	 0,			/* bitpos */
653	 complain_overflow_dont, /* complain_on_overflow */
654	 bfd_elf_generic_reloc,	/* special_function */
655	 "R_FRV_TLSOFF",	/* name */
656	 FALSE,			/* partial_inplace */
657	 0xffffffff,		/* src_mask */
658	 0xffffffff,		/* dst_mask */
659	 FALSE),		/* pcrel_offset */
660
661  /* An annotation for linker relaxation, that denotes the
662     symbol+addend whose TLS descriptor is referenced by the sum of
663     the two input registers of an ldd instruction.  */
664  HOWTO (R_FRV_TLSDESC_RELAX,	/* type */
665	 0,			/* rightshift */
666	 2,			/* size (0 = byte, 1 = short, 2 = long) */
667	 0,			/* bitsize */
668	 FALSE,			/* pc_relative */
669	 0,			/* bitpos */
670	 complain_overflow_dont, /* complain_on_overflow */
671	 bfd_elf_generic_reloc,	/* special_function */
672	 "R_FRV_TLSDESC_RELAX",	/* name */
673	 FALSE,			/* partial_inplace */
674	 0,			/* src_mask */
675	 0,			/* dst_mask */
676	 FALSE),		/* pcrel_offset */
677
678  /* An annotation for linker relaxation, that denotes the
679     symbol+addend whose TLS resolver entry point is given by the sum
680     of the two register operands of an calll instruction.  */
681  HOWTO (R_FRV_GETTLSOFF_RELAX,	/* type */
682	 0,			/* rightshift */
683	 2,			/* size (0 = byte, 1 = short, 2 = long) */
684	 0,			/* bitsize */
685	 FALSE,			/* pc_relative */
686	 0,			/* bitpos */
687	 complain_overflow_dont, /* complain_on_overflow */
688	 bfd_elf_generic_reloc,	/* special_function */
689	 "R_FRV_GETTLSOFF_RELAX", /* name */
690	 FALSE,			/* partial_inplace */
691	 0,			/* src_mask */
692	 0,			/* dst_mask */
693	 FALSE),		/* pcrel_offset */
694
695  /* An annotation for linker relaxation, that denotes the
696     symbol+addend whose TLS offset GOT entry is given by the sum of
697     the two input registers of an ld instruction.  */
698  HOWTO (R_FRV_TLSOFF_RELAX,	/* type */
699	 0,			/* rightshift */
700	 2,			/* size (0 = byte, 1 = short, 2 = long) */
701	 0,			/* bitsize */
702	 FALSE,			/* pc_relative */
703	 0,			/* bitpos */
704	 complain_overflow_bitfield, /* complain_on_overflow */
705	 bfd_elf_generic_reloc,	/* special_function */
706	 "R_FRV_TLSOFF_RELAX",	/* name */
707	 FALSE,			/* partial_inplace */
708	 0,			/* src_mask */
709	 0,			/* dst_mask */
710	 FALSE),		/* pcrel_offset */
711
712  /* A 32-bit offset from the module base address to
713     the thread-local symbol address.  */
714  HOWTO (R_FRV_TLSMOFF,		/* type */
715	 0,			/* rightshift */
716	 2,			/* size (0 = byte, 1 = short, 2 = long) */
717	 32,			/* bitsize */
718	 FALSE,			/* pc_relative */
719	 0,			/* bitpos */
720	 complain_overflow_dont, /* complain_on_overflow */
721	 bfd_elf_generic_reloc,	/* special_function */
722	 "R_FRV_TLSMOFF",	/* name */
723	 FALSE,			/* partial_inplace */
724	 0xffffffff,		/* src_mask */
725	 0xffffffff,		/* dst_mask */
726	 FALSE),		/* pcrel_offset */
727};
728
729/* GNU extension to record C++ vtable hierarchy.  */
730static reloc_howto_type elf32_frv_vtinherit_howto =
731  HOWTO (R_FRV_GNU_VTINHERIT,	/* type */
732	 0,			/* rightshift */
733	 2,			/* size (0 = byte, 1 = short, 2 = long) */
734	 0,			/* bitsize */
735	 FALSE,			/* pc_relative */
736	 0,			/* bitpos */
737	 complain_overflow_dont, /* complain_on_overflow */
738	 NULL,			/* special_function */
739	 "R_FRV_GNU_VTINHERIT", /* name */
740	 FALSE,			/* partial_inplace */
741	 0,			/* src_mask */
742	 0,			/* dst_mask */
743	 FALSE);		/* pcrel_offset */
744
745  /* GNU extension to record C++ vtable member usage.  */
746static reloc_howto_type elf32_frv_vtentry_howto =
747  HOWTO (R_FRV_GNU_VTENTRY,	/* type */
748	 0,			/* rightshift */
749	 2,			/* size (0 = byte, 1 = short, 2 = long) */
750	 0,			/* bitsize */
751	 FALSE,			/* pc_relative */
752	 0,			/* bitpos */
753	 complain_overflow_dont, /* complain_on_overflow */
754	 _bfd_elf_rel_vtable_reloc_fn, /* special_function */
755	 "R_FRV_GNU_VTENTRY",	/* name */
756	 FALSE,			/* partial_inplace */
757	 0,			/* src_mask */
758	 0,			/* dst_mask */
759	 FALSE);		/* pcrel_offset */
760
761/* The following 3 relocations are REL.  The only difference to the
762   entries in the table above are that partial_inplace is TRUE.  */
763static reloc_howto_type elf32_frv_rel_32_howto =
764  HOWTO (R_FRV_32,		/* type */
765	 0,			/* rightshift */
766	 2,			/* size (0 = byte, 1 = short, 2 = long) */
767	 32,			/* bitsize */
768	 FALSE,			/* pc_relative */
769	 0,			/* bitpos */
770	 complain_overflow_bitfield, /* complain_on_overflow */
771	 bfd_elf_generic_reloc,	/* special_function */
772	 "R_FRV_32",		/* name */
773	 TRUE,			/* partial_inplace */
774	 0xffffffff,		/* src_mask */
775	 0xffffffff,		/* dst_mask */
776	 FALSE);		/* pcrel_offset */
777
778static reloc_howto_type elf32_frv_rel_funcdesc_howto =
779  HOWTO (R_FRV_FUNCDESC,	/* type */
780	 0,			/* rightshift */
781	 2,			/* size (0 = byte, 1 = short, 2 = long) */
782	 32,			/* bitsize */
783	 FALSE,			/* pc_relative */
784	 0,			/* bitpos */
785	 complain_overflow_bitfield, /* complain_on_overflow */
786	 bfd_elf_generic_reloc,	/* special_function */
787	 "R_FRV_FUNCDESC",	/* name */
788	 TRUE,			/* partial_inplace */
789	 0xffffffff,		/* src_mask */
790	 0xffffffff,		/* dst_mask */
791	 FALSE);		/* pcrel_offset */
792
793static reloc_howto_type elf32_frv_rel_funcdesc_value_howto =
794  HOWTO (R_FRV_FUNCDESC_VALUE,	/* type */
795	 0,			/* rightshift */
796	 2,			/* size (0 = byte, 1 = short, 2 = long) */
797	 64,			/* bitsize */
798	 FALSE,			/* pc_relative */
799	 0,			/* bitpos */
800	 complain_overflow_bitfield, /* complain_on_overflow */
801	 bfd_elf_generic_reloc,	/* special_function */
802	 "R_FRV_FUNCDESC_VALUE", /* name */
803	 TRUE,			/* partial_inplace */
804	 0xffffffff,		/* src_mask */
805	 0xffffffff,		/* dst_mask */
806	 FALSE);		/* pcrel_offset */
807
808static reloc_howto_type elf32_frv_rel_tlsdesc_value_howto =
809  /* A 64-bit TLS descriptor for a symbol.  The first word resolves to
810     an entry point, and the second resolves to a special argument.
811     If the symbol turns out to be in static TLS, the entry point is a
812     return instruction, and the special argument is the TLS offset
813     for the symbol.  If it's in dynamic TLS, the entry point is a TLS
814     offset resolver, and the special argument is a pointer to a data
815     structure allocated by the dynamic loader, containing the GOT
816     address for the offset resolver, the module id, the offset within
817     the module, and anything else the TLS offset resolver might need
818     to determine the TLS offset for the symbol in the running
819     thread.  */
820  HOWTO (R_FRV_TLSDESC_VALUE,	/* type */
821	 0,			/* rightshift */
822	 2,			/* size (0 = byte, 1 = short, 2 = long) */
823	 64,			/* bitsize */
824	 FALSE,			/* pc_relative */
825	 0,			/* bitpos */
826	 complain_overflow_bitfield, /* complain_on_overflow */
827	 bfd_elf_generic_reloc,	/* special_function */
828	 "R_FRV_TLSDESC_VALUE", /* name */
829	 TRUE,			/* partial_inplace */
830	 0xffffffff,		/* src_mask */
831	 0xffffffff,		/* dst_mask */
832	 FALSE);		/* pcrel_offset */
833
834static reloc_howto_type elf32_frv_rel_tlsoff_howto =
835  /* The 32-bit offset from the thread pointer (not the module base
836     address) to a thread-local symbol.  */
837  HOWTO (R_FRV_TLSOFF,		/* type */
838	 0,			/* rightshift */
839	 2,			/* size (0 = byte, 1 = short, 2 = long) */
840	 32,			/* bitsize */
841	 FALSE,			/* pc_relative */
842	 0,			/* bitpos */
843	 complain_overflow_bitfield, /* complain_on_overflow */
844	 bfd_elf_generic_reloc,	/* special_function */
845	 "R_FRV_TLSOFF",	/* name */
846	 TRUE,			/* partial_inplace */
847	 0xffffffff,		/* src_mask */
848	 0xffffffff,		/* dst_mask */
849	 FALSE);		/* pcrel_offset */
850
851
852
853extern const bfd_target bfd_elf32_frvfdpic_vec;
854#define IS_FDPIC(bfd) ((bfd)->xvec == &bfd_elf32_frvfdpic_vec)
855
856/* An extension of the elf hash table data structure, containing some
857   additional FRV-specific data.  */
858struct frvfdpic_elf_link_hash_table
859{
860  struct elf_link_hash_table elf;
861
862  /* A pointer to the .got section.  */
863  asection *sgot;
864  /* A pointer to the .rel.got section.  */
865  asection *sgotrel;
866  /* A pointer to the .rofixup section.  */
867  asection *sgotfixup;
868  /* A pointer to the .plt section.  */
869  asection *splt;
870  /* A pointer to the .rel.plt section.  */
871  asection *spltrel;
872  /* GOT base offset.  */
873  bfd_vma got0;
874  /* Location of the first non-lazy PLT entry, i.e., the number of
875     bytes taken by lazy PLT entries.  If locally-bound TLS
876     descriptors require a ret instruction, it will be placed at this
877     offset.  */
878  bfd_vma plt0;
879  /* A hash table holding information about which symbols were
880     referenced with which PIC-related relocations.  */
881  struct htab *relocs_info;
882  /* Summary reloc information collected by
883     _frvfdpic_count_got_plt_entries.  */
884  struct _frvfdpic_dynamic_got_info *g;
885};
886
887/* Get the FRV ELF linker hash table from a link_info structure.  */
888
889#define frvfdpic_hash_table(info) \
890  ((struct frvfdpic_elf_link_hash_table *) ((info)->hash))
891
892#define frvfdpic_got_section(info) \
893  (frvfdpic_hash_table (info)->sgot)
894#define frvfdpic_gotrel_section(info) \
895  (frvfdpic_hash_table (info)->sgotrel)
896#define frvfdpic_gotfixup_section(info) \
897  (frvfdpic_hash_table (info)->sgotfixup)
898#define frvfdpic_plt_section(info) \
899  (frvfdpic_hash_table (info)->splt)
900#define frvfdpic_pltrel_section(info) \
901  (frvfdpic_hash_table (info)->spltrel)
902#define frvfdpic_relocs_info(info) \
903  (frvfdpic_hash_table (info)->relocs_info)
904#define frvfdpic_got_initial_offset(info) \
905  (frvfdpic_hash_table (info)->got0)
906#define frvfdpic_plt_initial_offset(info) \
907  (frvfdpic_hash_table (info)->plt0)
908#define frvfdpic_dynamic_got_plt_info(info) \
909  (frvfdpic_hash_table (info)->g)
910
911/* Currently it's the same, but if some day we have a reason to change
912   it, we'd better be using a different macro.
913
914   FIXME: if there's any TLS PLT entry that uses local-exec or
915   initial-exec models, we could use the ret at the end of any of them
916   instead of adding one more.  */
917#define frvfdpic_plt_tls_ret_offset(info) \
918  (frvfdpic_plt_initial_offset (info))
919
920/* The name of the dynamic interpreter.  This is put in the .interp
921   section.  */
922
923#define ELF_DYNAMIC_INTERPRETER "/lib/ld.so.1"
924
925#define DEFAULT_STACK_SIZE 0x20000
926
927/* This structure is used to collect the number of entries present in
928   each addressable range of the got.  */
929struct _frvfdpic_dynamic_got_info
930{
931  /* Several bits of information about the current link.  */
932  struct bfd_link_info *info;
933  /* Total GOT size needed for GOT entries within the 12-, 16- or 32-bit
934     ranges.  */
935  bfd_vma got12, gotlos, gothilo;
936  /* Total GOT size needed for function descriptor entries within the 12-,
937     16- or 32-bit ranges.  */
938  bfd_vma fd12, fdlos, fdhilo;
939  /* Total GOT size needed by function descriptor entries referenced
940     in PLT entries, that would be profitable to place in offsets
941     close to the PIC register.  */
942  bfd_vma fdplt;
943  /* Total PLT size needed by lazy PLT entries.  */
944  bfd_vma lzplt;
945  /* Total GOT size needed for TLS descriptor entries within the 12-,
946     16- or 32-bit ranges.  */
947  bfd_vma tlsd12, tlsdlos, tlsdhilo;
948  /* Total GOT size needed by TLS descriptors referenced in PLT
949     entries, that would be profitable to place in offers close to the
950     PIC register.  */
951  bfd_vma tlsdplt;
952  /* Total PLT size needed by TLS lazy PLT entries.  */
953  bfd_vma tlslzplt;
954  /* Number of relocations carried over from input object files.  */
955  unsigned long relocs;
956  /* Number of fixups introduced by relocations in input object files.  */
957  unsigned long fixups;
958  /* The number of fixups that reference the ret instruction added to
959     the PLT for locally-resolved TLS descriptors.  */
960  unsigned long tls_ret_refs;
961};
962
963/* This structure is used to assign offsets to got entries, function
964   descriptors, plt entries and lazy plt entries.  */
965
966struct _frvfdpic_dynamic_got_plt_info
967{
968  /* Summary information collected with _frvfdpic_count_got_plt_entries.  */
969  struct _frvfdpic_dynamic_got_info g;
970
971  /* For each addressable range, we record a MAX (positive) and MIN
972     (negative) value.  CUR is used to assign got entries, and it's
973     incremented from an initial positive value to MAX, then from MIN
974     to FDCUR (unless FDCUR wraps around first).  FDCUR is used to
975     assign function descriptors, and it's decreased from an initial
976     non-positive value to MIN, then from MAX down to CUR (unless CUR
977     wraps around first).  All of MIN, MAX, CUR and FDCUR always point
978     to even words.  ODD, if non-zero, indicates an odd word to be
979     used for the next got entry, otherwise CUR is used and
980     incremented by a pair of words, wrapping around when it reaches
981     MAX.  FDCUR is decremented (and wrapped) before the next function
982     descriptor is chosen.  FDPLT indicates the number of remaining
983     slots that can be used for function descriptors used only by PLT
984     entries.
985
986     TMAX, TMIN and TCUR are used to assign TLS descriptors.  TCUR
987     starts as MAX, and grows up to TMAX, then wraps around to TMIN
988     and grows up to MIN.  TLSDPLT indicates the number of remaining
989     slots that can be used for TLS descriptors used only by TLS PLT
990     entries.  */
991  struct _frvfdpic_dynamic_got_alloc_data
992  {
993    bfd_signed_vma max, cur, odd, fdcur, min;
994    bfd_signed_vma tmax, tcur, tmin;
995    bfd_vma fdplt, tlsdplt;
996  } got12, gotlos, gothilo;
997};
998
999/* Create an FRV ELF linker hash table.  */
1000
1001static struct bfd_link_hash_table *
1002frvfdpic_elf_link_hash_table_create (bfd *abfd)
1003{
1004  struct frvfdpic_elf_link_hash_table *ret;
1005  bfd_size_type amt = sizeof (struct frvfdpic_elf_link_hash_table);
1006
1007  ret = bfd_zalloc (abfd, amt);
1008  if (ret == NULL)
1009    return NULL;
1010
1011  if (!_bfd_elf_link_hash_table_init (&ret->elf, abfd,
1012				      _bfd_elf_link_hash_newfunc,
1013				      sizeof (struct elf_link_hash_entry)))
1014    {
1015      free (ret);
1016      return NULL;
1017    }
1018
1019  return &ret->elf.root;
1020}
1021
1022/* Decide whether a reference to a symbol can be resolved locally or
1023   not.  If the symbol is protected, we want the local address, but
1024   its function descriptor must be assigned by the dynamic linker.  */
1025#define FRVFDPIC_SYM_LOCAL(INFO, H) \
1026  (_bfd_elf_symbol_refs_local_p ((H), (INFO), 1) \
1027   || ! elf_hash_table (INFO)->dynamic_sections_created)
1028#define FRVFDPIC_FUNCDESC_LOCAL(INFO, H) \
1029  ((H)->dynindx == -1 || ! elf_hash_table (INFO)->dynamic_sections_created)
1030
1031/* This structure collects information on what kind of GOT, PLT or
1032   function descriptors are required by relocations that reference a
1033   certain symbol.  */
1034struct frvfdpic_relocs_info
1035{
1036  /* The index of the symbol, as stored in the relocation r_info, if
1037     we have a local symbol; -1 otherwise.  */
1038  long symndx;
1039  union
1040  {
1041    /* The input bfd in which the symbol is defined, if it's a local
1042       symbol.  */
1043    bfd *abfd;
1044    /* If symndx == -1, the hash table entry corresponding to a global
1045       symbol (even if it turns out to bind locally, in which case it
1046       should ideally be replaced with section's symndx + addend).  */
1047    struct elf_link_hash_entry *h;
1048  } d;
1049  /* The addend of the relocation that references the symbol.  */
1050  bfd_vma addend;
1051
1052  /* The fields above are used to identify an entry.  The fields below
1053     contain information on how an entry is used and, later on, which
1054     locations it was assigned.  */
1055  /* The following 3 fields record whether the symbol+addend above was
1056     ever referenced with a GOT relocation.  The 12 suffix indicates a
1057     GOT12 relocation; los is used for GOTLO relocations that are not
1058     matched by a GOTHI relocation; hilo is used for GOTLO/GOTHI
1059     pairs.  */
1060  unsigned got12:1;
1061  unsigned gotlos:1;
1062  unsigned gothilo:1;
1063  /* Whether a FUNCDESC relocation references symbol+addend.  */
1064  unsigned fd:1;
1065  /* Whether a FUNCDESC_GOT relocation references symbol+addend.  */
1066  unsigned fdgot12:1;
1067  unsigned fdgotlos:1;
1068  unsigned fdgothilo:1;
1069  /* Whether a FUNCDESC_GOTOFF relocation references symbol+addend.  */
1070  unsigned fdgoff12:1;
1071  unsigned fdgofflos:1;
1072  unsigned fdgoffhilo:1;
1073  /* Whether a GETTLSOFF relocation references symbol+addend.  */
1074  unsigned tlsplt:1;
1075  /* FIXME: we should probably add tlspltdesc, tlspltoff and
1076     tlspltimm, to tell what kind of TLS PLT entry we're generating.
1077     We might instead just pre-compute flags telling whether the
1078     object is suitable for local exec, initial exec or general
1079     dynamic addressing, and use that all over the place.  We could
1080     also try to do a better job of merging TLSOFF and TLSDESC entries
1081     in main executables, but perhaps we can get rid of TLSDESC
1082     entirely in them instead.  */
1083  /* Whether a GOTTLSDESC relocation references symbol+addend.  */
1084  unsigned tlsdesc12:1;
1085  unsigned tlsdesclos:1;
1086  unsigned tlsdeschilo:1;
1087  /* Whether a GOTTLSOFF relocation references symbol+addend.  */
1088  unsigned tlsoff12:1;
1089  unsigned tlsofflos:1;
1090  unsigned tlsoffhilo:1;
1091  /* Whether symbol+addend is referenced with GOTOFF12, GOTOFFLO or
1092     GOTOFFHI relocations.  The addend doesn't really matter, since we
1093     envision that this will only be used to check whether the symbol
1094     is mapped to the same segment as the got.  */
1095  unsigned gotoff:1;
1096  /* Whether symbol+addend is referenced by a LABEL24 relocation.  */
1097  unsigned call:1;
1098  /* Whether symbol+addend is referenced by a 32 or FUNCDESC_VALUE
1099     relocation.  */
1100  unsigned sym:1;
1101  /* Whether we need a PLT entry for a symbol.  Should be implied by
1102     something like:
1103     (call && symndx == -1 && ! FRVFDPIC_SYM_LOCAL (info, d.h))  */
1104  unsigned plt:1;
1105  /* Whether a function descriptor should be created in this link unit
1106     for symbol+addend.  Should be implied by something like:
1107     (plt || fdgotoff12 || fdgotofflos || fdgotofflohi
1108      || ((fd || fdgot12 || fdgotlos || fdgothilo)
1109          && (symndx != -1 || FRVFDPIC_FUNCDESC_LOCAL (info, d.h))))  */
1110  unsigned privfd:1;
1111  /* Whether a lazy PLT entry is needed for this symbol+addend.
1112     Should be implied by something like:
1113     (privfd && symndx == -1 && ! FRVFDPIC_SYM_LOCAL (info, d.h)
1114      && ! (info->flags & DF_BIND_NOW))  */
1115  unsigned lazyplt:1;
1116  /* Whether we've already emitted GOT relocations and PLT entries as
1117     needed for this symbol.  */
1118  unsigned done:1;
1119
1120  /* The number of R_FRV_32, R_FRV_FUNCDESC, R_FRV_FUNCDESC_VALUE and
1121     R_FRV_TLSDESC_VALUE, R_FRV_TLSOFF relocations referencing
1122     symbol+addend.  */
1123  unsigned relocs32, relocsfd, relocsfdv, relocstlsd, relocstlsoff;
1124
1125  /* The number of .rofixups entries and dynamic relocations allocated
1126     for this symbol, minus any that might have already been used.  */
1127  unsigned fixups, dynrelocs;
1128
1129  /* The offsets of the GOT entries assigned to symbol+addend, to the
1130     function descriptor's address, and to a function descriptor,
1131     respectively.  Should be zero if unassigned.  The offsets are
1132     counted from the value that will be assigned to the PIC register,
1133     not from the beginning of the .got section.  */
1134  bfd_signed_vma got_entry, fdgot_entry, fd_entry;
1135  /* The offsets of the PLT entries assigned to symbol+addend,
1136     non-lazy and lazy, respectively.  If unassigned, should be
1137     (bfd_vma)-1.  */
1138  bfd_vma plt_entry, lzplt_entry;
1139  /* The offsets of the GOT entries for TLS offset and TLS descriptor.  */
1140  bfd_signed_vma tlsoff_entry, tlsdesc_entry;
1141  /* The offset of the TLS offset PLT entry.  */
1142  bfd_vma tlsplt_entry;
1143};
1144
1145/* Compute a hash with the key fields of an frvfdpic_relocs_info entry.  */
1146static hashval_t
1147frvfdpic_relocs_info_hash (const void *entry_)
1148{
1149  const struct frvfdpic_relocs_info *entry = entry_;
1150
1151  return (entry->symndx == -1
1152	  ? (long) entry->d.h->root.root.hash
1153	  : entry->symndx + (long) entry->d.abfd->id * 257) + entry->addend;
1154}
1155
1156/* Test whether the key fields of two frvfdpic_relocs_info entries are
1157   identical.  */
1158static int
1159frvfdpic_relocs_info_eq (const void *entry1, const void *entry2)
1160{
1161  const struct frvfdpic_relocs_info *e1 = entry1;
1162  const struct frvfdpic_relocs_info *e2 = entry2;
1163
1164  return e1->symndx == e2->symndx && e1->addend == e2->addend
1165    && (e1->symndx == -1 ? e1->d.h == e2->d.h : e1->d.abfd == e2->d.abfd);
1166}
1167
1168/* Find or create an entry in a hash table HT that matches the key
1169   fields of the given ENTRY.  If it's not found, memory for a new
1170   entry is allocated in ABFD's obstack.  */
1171static struct frvfdpic_relocs_info *
1172frvfdpic_relocs_info_find (struct htab *ht,
1173			   bfd *abfd,
1174			   const struct frvfdpic_relocs_info *entry,
1175			   enum insert_option insert)
1176{
1177  struct frvfdpic_relocs_info **loc =
1178    (struct frvfdpic_relocs_info **) htab_find_slot (ht, entry, insert);
1179
1180  if (! loc)
1181    return NULL;
1182
1183  if (*loc)
1184    return *loc;
1185
1186  *loc = bfd_zalloc (abfd, sizeof (**loc));
1187
1188  if (! *loc)
1189    return *loc;
1190
1191  (*loc)->symndx = entry->symndx;
1192  (*loc)->d = entry->d;
1193  (*loc)->addend = entry->addend;
1194  (*loc)->plt_entry = (bfd_vma)-1;
1195  (*loc)->lzplt_entry = (bfd_vma)-1;
1196  (*loc)->tlsplt_entry = (bfd_vma)-1;
1197
1198  return *loc;
1199}
1200
1201/* Obtain the address of the entry in HT associated with H's symbol +
1202   addend, creating a new entry if none existed.  ABFD is only used
1203   for memory allocation purposes.  */
1204inline static struct frvfdpic_relocs_info *
1205frvfdpic_relocs_info_for_global (struct htab *ht,
1206				 bfd *abfd,
1207				 struct elf_link_hash_entry *h,
1208				 bfd_vma addend,
1209				 enum insert_option insert)
1210{
1211  struct frvfdpic_relocs_info entry;
1212
1213  entry.symndx = -1;
1214  entry.d.h = h;
1215  entry.addend = addend;
1216
1217  return frvfdpic_relocs_info_find (ht, abfd, &entry, insert);
1218}
1219
1220/* Obtain the address of the entry in HT associated with the SYMNDXth
1221   local symbol of the input bfd ABFD, plus the addend, creating a new
1222   entry if none existed.  */
1223inline static struct frvfdpic_relocs_info *
1224frvfdpic_relocs_info_for_local (struct htab *ht,
1225				bfd *abfd,
1226				long symndx,
1227				bfd_vma addend,
1228				enum insert_option insert)
1229{
1230  struct frvfdpic_relocs_info entry;
1231
1232  entry.symndx = symndx;
1233  entry.d.abfd = abfd;
1234  entry.addend = addend;
1235
1236  return frvfdpic_relocs_info_find (ht, abfd, &entry, insert);
1237}
1238
1239/* Merge fields set by check_relocs() of two entries that end up being
1240   mapped to the same (presumably global) symbol.  */
1241
1242inline static void
1243frvfdpic_pic_merge_early_relocs_info (struct frvfdpic_relocs_info *e2,
1244				      struct frvfdpic_relocs_info const *e1)
1245{
1246  e2->got12 |= e1->got12;
1247  e2->gotlos |= e1->gotlos;
1248  e2->gothilo |= e1->gothilo;
1249  e2->fd |= e1->fd;
1250  e2->fdgot12 |= e1->fdgot12;
1251  e2->fdgotlos |= e1->fdgotlos;
1252  e2->fdgothilo |= e1->fdgothilo;
1253  e2->fdgoff12 |= e1->fdgoff12;
1254  e2->fdgofflos |= e1->fdgofflos;
1255  e2->fdgoffhilo |= e1->fdgoffhilo;
1256  e2->tlsplt |= e1->tlsplt;
1257  e2->tlsdesc12 |= e1->tlsdesc12;
1258  e2->tlsdesclos |= e1->tlsdesclos;
1259  e2->tlsdeschilo |= e1->tlsdeschilo;
1260  e2->tlsoff12 |= e1->tlsoff12;
1261  e2->tlsofflos |= e1->tlsofflos;
1262  e2->tlsoffhilo |= e1->tlsoffhilo;
1263  e2->gotoff |= e1->gotoff;
1264  e2->call |= e1->call;
1265  e2->sym |= e1->sym;
1266}
1267
1268/* Every block of 65535 lazy PLT entries shares a single call to the
1269   resolver, inserted in the 32768th lazy PLT entry (i.e., entry #
1270   32767, counting from 0).  All other lazy PLT entries branch to it
1271   in a single instruction.  */
1272
1273#define FRVFDPIC_LZPLT_BLOCK_SIZE ((bfd_vma) 8 * 65535 + 4)
1274#define FRVFDPIC_LZPLT_RESOLV_LOC (8 * 32767)
1275
1276/* Add a dynamic relocation to the SRELOC section.  */
1277
1278inline static bfd_vma
1279_frvfdpic_add_dyn_reloc (bfd *output_bfd, asection *sreloc, bfd_vma offset,
1280			 int reloc_type, long dynindx, bfd_vma addend,
1281			 struct frvfdpic_relocs_info *entry)
1282{
1283  Elf_Internal_Rela outrel;
1284  bfd_vma reloc_offset;
1285
1286  outrel.r_offset = offset;
1287  outrel.r_info = ELF32_R_INFO (dynindx, reloc_type);
1288  outrel.r_addend = addend;
1289
1290  reloc_offset = sreloc->reloc_count * sizeof (Elf32_External_Rel);
1291  BFD_ASSERT (reloc_offset < sreloc->size);
1292  bfd_elf32_swap_reloc_out (output_bfd, &outrel,
1293			    sreloc->contents + reloc_offset);
1294  sreloc->reloc_count++;
1295
1296  /* If the entry's index is zero, this relocation was probably to a
1297     linkonce section that got discarded.  We reserved a dynamic
1298     relocation, but it was for another entry than the one we got at
1299     the time of emitting the relocation.  Unfortunately there's no
1300     simple way for us to catch this situation, since the relocation
1301     is cleared right before calling relocate_section, at which point
1302     we no longer know what the relocation used to point to.  */
1303  if (entry->symndx)
1304    {
1305      BFD_ASSERT (entry->dynrelocs > 0);
1306      entry->dynrelocs--;
1307    }
1308
1309  return reloc_offset;
1310}
1311
1312/* Add a fixup to the ROFIXUP section.  */
1313
1314static bfd_vma
1315_frvfdpic_add_rofixup (bfd *output_bfd, asection *rofixup, bfd_vma offset,
1316		       struct frvfdpic_relocs_info *entry)
1317{
1318  bfd_vma fixup_offset;
1319
1320  if (rofixup->flags & SEC_EXCLUDE)
1321    return -1;
1322
1323  fixup_offset = rofixup->reloc_count * 4;
1324  if (rofixup->contents)
1325    {
1326      BFD_ASSERT (fixup_offset < rofixup->size);
1327      bfd_put_32 (output_bfd, offset, rofixup->contents + fixup_offset);
1328    }
1329  rofixup->reloc_count++;
1330
1331  if (entry && entry->symndx)
1332    {
1333      /* See discussion about symndx == 0 in _frvfdpic_add_dyn_reloc
1334	 above.  */
1335      BFD_ASSERT (entry->fixups > 0);
1336      entry->fixups--;
1337    }
1338
1339  return fixup_offset;
1340}
1341
1342/* Find the segment number in which OSEC, and output section, is
1343   located.  */
1344
1345static unsigned
1346_frvfdpic_osec_to_segment (bfd *output_bfd, asection *osec)
1347{
1348  struct elf_segment_map *m;
1349  Elf_Internal_Phdr *p;
1350
1351  /* Find the segment that contains the output_section.  */
1352  for (m = elf_tdata (output_bfd)->segment_map,
1353	 p = elf_tdata (output_bfd)->phdr;
1354       m != NULL;
1355       m = m->next, p++)
1356    {
1357      int i;
1358
1359      for (i = m->count - 1; i >= 0; i--)
1360	if (m->sections[i] == osec)
1361	  break;
1362
1363      if (i >= 0)
1364	break;
1365    }
1366
1367  return p - elf_tdata (output_bfd)->phdr;
1368}
1369
1370inline static bfd_boolean
1371_frvfdpic_osec_readonly_p (bfd *output_bfd, asection *osec)
1372{
1373  unsigned seg = _frvfdpic_osec_to_segment (output_bfd, osec);
1374
1375  return ! (elf_tdata (output_bfd)->phdr[seg].p_flags & PF_W);
1376}
1377
1378#define FRVFDPIC_TLS_BIAS (2048 - 16)
1379
1380/* Return the base VMA address which should be subtracted from real addresses
1381   when resolving TLSMOFF relocation.
1382   This is PT_TLS segment p_vaddr, plus the 2048-16 bias.  */
1383
1384static bfd_vma
1385tls_biased_base (struct bfd_link_info *info)
1386{
1387  /* If tls_sec is NULL, we should have signalled an error already.  */
1388  if (elf_hash_table (info)->tls_sec == NULL)
1389    return FRVFDPIC_TLS_BIAS;
1390  return elf_hash_table (info)->tls_sec->vma + FRVFDPIC_TLS_BIAS;
1391}
1392
1393/* Generate relocations for GOT entries, function descriptors, and
1394   code for PLT and lazy PLT entries.  */
1395
1396inline static bfd_boolean
1397_frvfdpic_emit_got_relocs_plt_entries (struct frvfdpic_relocs_info *entry,
1398				       bfd *output_bfd,
1399				       struct bfd_link_info *info,
1400				       asection *sec,
1401				       Elf_Internal_Sym *sym,
1402				       bfd_vma addend)
1403
1404{
1405  bfd_vma fd_lazy_rel_offset = (bfd_vma)-1;
1406  int dynindx = -1;
1407
1408  if (entry->done)
1409    return TRUE;
1410  entry->done = 1;
1411
1412  if (entry->got_entry || entry->fdgot_entry || entry->fd_entry
1413      || entry->tlsoff_entry || entry->tlsdesc_entry)
1414    {
1415      /* If the symbol is dynamic, consider it for dynamic
1416	 relocations, otherwise decay to section + offset.  */
1417      if (entry->symndx == -1 && entry->d.h->dynindx != -1)
1418	dynindx = entry->d.h->dynindx;
1419      else
1420	{
1421	  if (sec->output_section
1422	      && ! bfd_is_abs_section (sec->output_section)
1423	      && ! bfd_is_und_section (sec->output_section))
1424	    dynindx = elf_section_data (sec->output_section)->dynindx;
1425	  else
1426	    dynindx = 0;
1427	}
1428    }
1429
1430  /* Generate relocation for GOT entry pointing to the symbol.  */
1431  if (entry->got_entry)
1432    {
1433      int idx = dynindx;
1434      bfd_vma ad = addend;
1435
1436      /* If the symbol is dynamic but binds locally, use
1437	 section+offset.  */
1438      if (sec && (entry->symndx != -1
1439		  || FRVFDPIC_SYM_LOCAL (info, entry->d.h)))
1440	{
1441	  if (entry->symndx == -1)
1442	    ad += entry->d.h->root.u.def.value;
1443	  else
1444	    ad += sym->st_value;
1445	  ad += sec->output_offset;
1446	  if (sec->output_section && elf_section_data (sec->output_section))
1447	    idx = elf_section_data (sec->output_section)->dynindx;
1448	  else
1449	    idx = 0;
1450	}
1451
1452      /* If we're linking an executable at a fixed address, we can
1453	 omit the dynamic relocation as long as the symbol is local to
1454	 this module.  */
1455      if (info->executable && !info->pie
1456	  && (entry->symndx != -1
1457	      || FRVFDPIC_SYM_LOCAL (info, entry->d.h)))
1458	{
1459	  if (sec)
1460	    ad += sec->output_section->vma;
1461	  if (entry->symndx != -1
1462	      || entry->d.h->root.type != bfd_link_hash_undefweak)
1463	    _frvfdpic_add_rofixup (output_bfd,
1464				   frvfdpic_gotfixup_section (info),
1465				   frvfdpic_got_section (info)->output_section
1466				   ->vma
1467				   + frvfdpic_got_section (info)->output_offset
1468				   + frvfdpic_got_initial_offset (info)
1469				   + entry->got_entry, entry);
1470	}
1471      else
1472	_frvfdpic_add_dyn_reloc (output_bfd, frvfdpic_gotrel_section (info),
1473				 _bfd_elf_section_offset
1474				 (output_bfd, info,
1475				  frvfdpic_got_section (info),
1476				  frvfdpic_got_initial_offset (info)
1477				  + entry->got_entry)
1478				 + frvfdpic_got_section (info)
1479				 ->output_section->vma
1480				 + frvfdpic_got_section (info)->output_offset,
1481				 R_FRV_32, idx, ad, entry);
1482
1483      bfd_put_32 (output_bfd, ad,
1484		  frvfdpic_got_section (info)->contents
1485		  + frvfdpic_got_initial_offset (info)
1486		  + entry->got_entry);
1487    }
1488
1489  /* Generate relocation for GOT entry pointing to a canonical
1490     function descriptor.  */
1491  if (entry->fdgot_entry)
1492    {
1493      int reloc, idx;
1494      bfd_vma ad = 0;
1495
1496      if (! (entry->symndx == -1
1497	     && entry->d.h->root.type == bfd_link_hash_undefweak
1498	     && FRVFDPIC_SYM_LOCAL (info, entry->d.h)))
1499	{
1500	  /* If the symbol is dynamic and there may be dynamic symbol
1501	     resolution because we are, or are linked with, a shared
1502	     library, emit a FUNCDESC relocation such that the dynamic
1503	     linker will allocate the function descriptor.  If the
1504	     symbol needs a non-local function descriptor but binds
1505	     locally (e.g., its visibility is protected, emit a
1506	     dynamic relocation decayed to section+offset.  */
1507	  if (entry->symndx == -1
1508	      && ! FRVFDPIC_FUNCDESC_LOCAL (info, entry->d.h)
1509	      && FRVFDPIC_SYM_LOCAL (info, entry->d.h)
1510	      && !(info->executable && !info->pie))
1511	    {
1512	      reloc = R_FRV_FUNCDESC;
1513	      idx = elf_section_data (entry->d.h->root.u.def.section
1514				      ->output_section)->dynindx;
1515	      ad = entry->d.h->root.u.def.section->output_offset
1516		+ entry->d.h->root.u.def.value;
1517	    }
1518	  else if (entry->symndx == -1
1519		   && ! FRVFDPIC_FUNCDESC_LOCAL (info, entry->d.h))
1520	    {
1521	      reloc = R_FRV_FUNCDESC;
1522	      idx = dynindx;
1523	      ad = addend;
1524	      if (ad)
1525		{
1526		  (*info->callbacks->reloc_dangerous)
1527		    (info, _("relocation requires zero addend"),
1528		     elf_hash_table (info)->dynobj,
1529		     frvfdpic_got_section (info),
1530		     entry->fdgot_entry);
1531		  return FALSE;
1532		}
1533	    }
1534	  else
1535	    {
1536	      /* Otherwise, we know we have a private function descriptor,
1537		 so reference it directly.  */
1538	      if (elf_hash_table (info)->dynamic_sections_created)
1539		BFD_ASSERT (entry->privfd);
1540	      reloc = R_FRV_32;
1541	      idx = elf_section_data (frvfdpic_got_section (info)
1542				      ->output_section)->dynindx;
1543	      ad = frvfdpic_got_section (info)->output_offset
1544		+ frvfdpic_got_initial_offset (info) + entry->fd_entry;
1545	    }
1546
1547	  /* If there is room for dynamic symbol resolution, emit the
1548	     dynamic relocation.  However, if we're linking an
1549	     executable at a fixed location, we won't have emitted a
1550	     dynamic symbol entry for the got section, so idx will be
1551	     zero, which means we can and should compute the address
1552	     of the private descriptor ourselves.  */
1553	  if (info->executable && !info->pie
1554	      && (entry->symndx != -1
1555		  || FRVFDPIC_FUNCDESC_LOCAL (info, entry->d.h)))
1556	    {
1557	      ad += frvfdpic_got_section (info)->output_section->vma;
1558	      _frvfdpic_add_rofixup (output_bfd,
1559				     frvfdpic_gotfixup_section (info),
1560				     frvfdpic_got_section (info)
1561				     ->output_section->vma
1562				     + frvfdpic_got_section (info)
1563				     ->output_offset
1564				     + frvfdpic_got_initial_offset (info)
1565				     + entry->fdgot_entry, entry);
1566	    }
1567	  else
1568	    _frvfdpic_add_dyn_reloc (output_bfd,
1569				     frvfdpic_gotrel_section (info),
1570				     _bfd_elf_section_offset
1571				     (output_bfd, info,
1572				      frvfdpic_got_section (info),
1573				      frvfdpic_got_initial_offset (info)
1574				      + entry->fdgot_entry)
1575				     + frvfdpic_got_section (info)
1576				     ->output_section->vma
1577				     + frvfdpic_got_section (info)
1578				     ->output_offset,
1579				     reloc, idx, ad, entry);
1580	}
1581
1582      bfd_put_32 (output_bfd, ad,
1583		  frvfdpic_got_section (info)->contents
1584		  + frvfdpic_got_initial_offset (info)
1585		  + entry->fdgot_entry);
1586    }
1587
1588  /* Generate relocation to fill in a private function descriptor in
1589     the GOT.  */
1590  if (entry->fd_entry)
1591    {
1592      int idx = dynindx;
1593      bfd_vma ad = addend;
1594      bfd_vma ofst;
1595      long lowword, highword;
1596
1597      /* If the symbol is dynamic but binds locally, use
1598	 section+offset.  */
1599      if (sec && (entry->symndx != -1
1600		  || FRVFDPIC_SYM_LOCAL (info, entry->d.h)))
1601	{
1602	  if (entry->symndx == -1)
1603	    ad += entry->d.h->root.u.def.value;
1604	  else
1605	    ad += sym->st_value;
1606	  ad += sec->output_offset;
1607	  if (sec->output_section && elf_section_data (sec->output_section))
1608	    idx = elf_section_data (sec->output_section)->dynindx;
1609	  else
1610	    idx = 0;
1611	}
1612
1613      /* If we're linking an executable at a fixed address, we can
1614	 omit the dynamic relocation as long as the symbol is local to
1615	 this module.  */
1616      if (info->executable && !info->pie
1617	  && (entry->symndx != -1 || FRVFDPIC_SYM_LOCAL (info, entry->d.h)))
1618	{
1619	  if (sec)
1620	    ad += sec->output_section->vma;
1621	  ofst = 0;
1622	  if (entry->symndx != -1
1623	      || entry->d.h->root.type != bfd_link_hash_undefweak)
1624	    {
1625	      _frvfdpic_add_rofixup (output_bfd,
1626				     frvfdpic_gotfixup_section (info),
1627				     frvfdpic_got_section (info)
1628				     ->output_section->vma
1629				     + frvfdpic_got_section (info)
1630				     ->output_offset
1631				     + frvfdpic_got_initial_offset (info)
1632				     + entry->fd_entry, entry);
1633	      _frvfdpic_add_rofixup (output_bfd,
1634				     frvfdpic_gotfixup_section (info),
1635				     frvfdpic_got_section (info)
1636				     ->output_section->vma
1637				     + frvfdpic_got_section (info)
1638				     ->output_offset
1639				     + frvfdpic_got_initial_offset (info)
1640				     + entry->fd_entry + 4, entry);
1641	    }
1642	}
1643      else
1644	{
1645	  ofst =
1646	    _frvfdpic_add_dyn_reloc (output_bfd,
1647				     entry->lazyplt
1648				     ? frvfdpic_pltrel_section (info)
1649				     : frvfdpic_gotrel_section (info),
1650				     _bfd_elf_section_offset
1651				     (output_bfd, info,
1652				      frvfdpic_got_section (info),
1653				      frvfdpic_got_initial_offset (info)
1654				      + entry->fd_entry)
1655				     + frvfdpic_got_section (info)
1656				     ->output_section->vma
1657				     + frvfdpic_got_section (info)
1658				     ->output_offset,
1659				     R_FRV_FUNCDESC_VALUE, idx, ad, entry);
1660	}
1661
1662      /* If we've omitted the dynamic relocation, just emit the fixed
1663	 addresses of the symbol and of the local GOT base offset.  */
1664      if (info->executable && !info->pie && sec && sec->output_section)
1665	{
1666	  lowword = ad;
1667	  highword = frvfdpic_got_section (info)->output_section->vma
1668	    + frvfdpic_got_section (info)->output_offset
1669	    + frvfdpic_got_initial_offset (info);
1670	}
1671      else if (entry->lazyplt)
1672	{
1673	  if (ad)
1674	    {
1675	      (*info->callbacks->reloc_dangerous)
1676		(info, _("relocation requires zero addend"),
1677		 elf_hash_table (info)->dynobj,
1678		 frvfdpic_got_section (info),
1679		 entry->fd_entry);
1680	      return FALSE;
1681	    }
1682
1683	  fd_lazy_rel_offset = ofst;
1684
1685	  /* A function descriptor used for lazy or local resolving is
1686	     initialized such that its high word contains the output
1687	     section index in which the PLT entries are located, and
1688	     the low word contains the address of the lazy PLT entry
1689	     entry point, that must be within the memory region
1690	     assigned to that section.  */
1691	  lowword = entry->lzplt_entry + 4
1692	    + frvfdpic_plt_section (info)->output_offset
1693	    + frvfdpic_plt_section (info)->output_section->vma;
1694	  highword = _frvfdpic_osec_to_segment
1695	    (output_bfd, frvfdpic_plt_section (info)->output_section);
1696	}
1697      else
1698	{
1699	  /* A function descriptor for a local function gets the index
1700	     of the section.  For a non-local function, it's
1701	     disregarded.  */
1702	  lowword = ad;
1703	  if (entry->symndx == -1 && entry->d.h->dynindx != -1
1704	      && entry->d.h->dynindx == idx)
1705	    highword = 0;
1706	  else
1707	    highword = _frvfdpic_osec_to_segment
1708	      (output_bfd, sec->output_section);
1709	}
1710
1711      bfd_put_32 (output_bfd, lowword,
1712		  frvfdpic_got_section (info)->contents
1713		  + frvfdpic_got_initial_offset (info)
1714		  + entry->fd_entry);
1715      bfd_put_32 (output_bfd, highword,
1716		  frvfdpic_got_section (info)->contents
1717		  + frvfdpic_got_initial_offset (info)
1718		  + entry->fd_entry + 4);
1719    }
1720
1721  /* Generate code for the PLT entry.  */
1722  if (entry->plt_entry != (bfd_vma) -1)
1723    {
1724      bfd_byte *plt_code = frvfdpic_plt_section (info)->contents
1725	+ entry->plt_entry;
1726
1727      BFD_ASSERT (entry->fd_entry);
1728
1729      /* Figure out what kind of PLT entry we need, depending on the
1730	 location of the function descriptor within the GOT.  */
1731      if (entry->fd_entry >= -(1 << (12 - 1))
1732	  && entry->fd_entry < (1 << (12 - 1)))
1733	{
1734	  /* lddi @(gr15, fd_entry), gr14 */
1735	  bfd_put_32 (output_bfd,
1736		      0x9cccf000 | (entry->fd_entry & ((1 << 12) - 1)),
1737		      plt_code);
1738	  plt_code += 4;
1739	}
1740      else
1741	{
1742	  if (entry->fd_entry >= -(1 << (16 - 1))
1743	      && entry->fd_entry < (1 << (16 - 1)))
1744	    {
1745	      /* setlos lo(fd_entry), gr14 */
1746	      bfd_put_32 (output_bfd,
1747			  0x9cfc0000
1748			  | (entry->fd_entry & (((bfd_vma)1 << 16) - 1)),
1749			  plt_code);
1750	      plt_code += 4;
1751	    }
1752	  else
1753	    {
1754	      /* sethi.p hi(fd_entry), gr14
1755		 setlo lo(fd_entry), gr14 */
1756	      bfd_put_32 (output_bfd,
1757			  0x1cf80000
1758			  | ((entry->fd_entry >> 16)
1759			     & (((bfd_vma)1 << 16) - 1)),
1760			  plt_code);
1761	      plt_code += 4;
1762	      bfd_put_32 (output_bfd,
1763			  0x9cf40000
1764			  | (entry->fd_entry & (((bfd_vma)1 << 16) - 1)),
1765			  plt_code);
1766	      plt_code += 4;
1767	    }
1768	  /* ldd @(gr14,gr15),gr14 */
1769	  bfd_put_32 (output_bfd, 0x9c08e14f, plt_code);
1770	  plt_code += 4;
1771	}
1772      /* jmpl @(gr14,gr0) */
1773      bfd_put_32 (output_bfd, 0x8030e000, plt_code);
1774    }
1775
1776  /* Generate code for the lazy PLT entry.  */
1777  if (entry->lzplt_entry != (bfd_vma) -1)
1778    {
1779      bfd_byte *lzplt_code = frvfdpic_plt_section (info)->contents
1780	+ entry->lzplt_entry;
1781      bfd_vma resolverStub_addr;
1782
1783      bfd_put_32 (output_bfd, fd_lazy_rel_offset, lzplt_code);
1784      lzplt_code += 4;
1785
1786      resolverStub_addr = entry->lzplt_entry / FRVFDPIC_LZPLT_BLOCK_SIZE
1787	* FRVFDPIC_LZPLT_BLOCK_SIZE + FRVFDPIC_LZPLT_RESOLV_LOC;
1788      if (resolverStub_addr >= frvfdpic_plt_initial_offset (info))
1789	resolverStub_addr = frvfdpic_plt_initial_offset (info) - 12;
1790
1791      if (entry->lzplt_entry == resolverStub_addr)
1792	{
1793	  /* This is a lazy PLT entry that includes a resolver call.  */
1794	  /* ldd @(gr15,gr0), gr4
1795	     jmpl @(gr4,gr0)  */
1796	  bfd_put_32 (output_bfd, 0x8808f140, lzplt_code);
1797	  bfd_put_32 (output_bfd, 0x80304000, lzplt_code + 4);
1798	}
1799      else
1800	{
1801	  /* bra  resolverStub */
1802	  bfd_put_32 (output_bfd,
1803		      0xc01a0000
1804		      | (((resolverStub_addr - entry->lzplt_entry)
1805			  / 4) & (((bfd_vma)1 << 16) - 1)),
1806		      lzplt_code);
1807	}
1808    }
1809
1810  /* Generate relocation for GOT entry holding the TLS offset.  */
1811  if (entry->tlsoff_entry)
1812    {
1813      int idx = dynindx;
1814      bfd_vma ad = addend;
1815
1816      if (entry->symndx != -1
1817	  || FRVFDPIC_SYM_LOCAL (info, entry->d.h))
1818	{
1819	  /* If the symbol is dynamic but binds locally, use
1820	     section+offset.  */
1821	  if (sec)
1822	    {
1823	      if (entry->symndx == -1)
1824		ad += entry->d.h->root.u.def.value;
1825	      else
1826		ad += sym->st_value;
1827	      ad += sec->output_offset;
1828	      if (sec->output_section
1829		  && elf_section_data (sec->output_section))
1830		idx = elf_section_data (sec->output_section)->dynindx;
1831	      else
1832		idx = 0;
1833	    }
1834	}
1835
1836      /* *ABS*+addend is special for TLS relocations, use only the
1837	 addend.  */
1838      if (info->executable
1839	  && idx == 0
1840	  && (bfd_is_abs_section (sec)
1841	      || bfd_is_und_section (sec)))
1842	;
1843      /* If we're linking an executable, we can entirely omit the
1844	 dynamic relocation if the symbol is local to this module.  */
1845      else if (info->executable
1846	       && (entry->symndx != -1
1847		   || FRVFDPIC_SYM_LOCAL (info, entry->d.h)))
1848	{
1849	  if (sec)
1850	    ad += sec->output_section->vma - tls_biased_base (info);
1851	}
1852      else
1853	{
1854	  if (idx == 0
1855	      && (bfd_is_abs_section (sec)
1856		  || bfd_is_und_section (sec)))
1857	    {
1858	      if (! elf_hash_table (info)->tls_sec)
1859		{
1860		  (*info->callbacks->undefined_symbol)
1861		    (info, "TLS section", elf_hash_table (info)->dynobj,
1862		     frvfdpic_got_section (info), entry->tlsoff_entry, TRUE);
1863		  return FALSE;
1864		}
1865	      idx = elf_section_data (elf_hash_table (info)->tls_sec)->dynindx;
1866	      ad += FRVFDPIC_TLS_BIAS;
1867	    }
1868	  _frvfdpic_add_dyn_reloc (output_bfd, frvfdpic_gotrel_section (info),
1869				   _bfd_elf_section_offset
1870				   (output_bfd, info,
1871				    frvfdpic_got_section (info),
1872				    frvfdpic_got_initial_offset (info)
1873				    + entry->tlsoff_entry)
1874				   + frvfdpic_got_section (info)
1875				   ->output_section->vma
1876				   + frvfdpic_got_section (info)
1877				   ->output_offset,
1878				   R_FRV_TLSOFF, idx, ad, entry);
1879	}
1880
1881      bfd_put_32 (output_bfd, ad,
1882		  frvfdpic_got_section (info)->contents
1883		  + frvfdpic_got_initial_offset (info)
1884		  + entry->tlsoff_entry);
1885    }
1886
1887  if (entry->tlsdesc_entry)
1888    {
1889      int idx = dynindx;
1890      bfd_vma ad = addend;
1891
1892      /* If the symbol is dynamic but binds locally, use
1893	 section+offset.  */
1894      if (sec && (entry->symndx != -1
1895		  || FRVFDPIC_SYM_LOCAL (info, entry->d.h)))
1896	{
1897	  if (entry->symndx == -1)
1898	    ad += entry->d.h->root.u.def.value;
1899	  else
1900	    ad += sym->st_value;
1901	  ad += sec->output_offset;
1902	  if (sec->output_section && elf_section_data (sec->output_section))
1903	    idx = elf_section_data (sec->output_section)->dynindx;
1904	  else
1905	    idx = 0;
1906	}
1907
1908      /* If we didn't set up a TLS offset entry, but we're linking an
1909	 executable and the symbol binds locally, we can use the
1910	 module offset in the TLS descriptor in relaxations.  */
1911      if (info->executable && ! entry->tlsoff_entry)
1912	entry->tlsoff_entry = entry->tlsdesc_entry + 4;
1913
1914      if (info->executable && !info->pie
1915	  && ((idx == 0
1916	       && (bfd_is_abs_section (sec)
1917		   || bfd_is_und_section (sec)))
1918	      || entry->symndx != -1
1919	      || FRVFDPIC_SYM_LOCAL (info, entry->d.h)))
1920	{
1921	  /* *ABS*+addend is special for TLS relocations, use only the
1922	     addend for the TLS offset, and take the module id as
1923	     0.  */
1924	  if (idx == 0
1925	      && (bfd_is_abs_section (sec)
1926		  || bfd_is_und_section (sec)))
1927	    ;
1928	  /* For other TLS symbols that bind locally, add the section
1929	     TLS offset to the addend.  */
1930	  else if (sec)
1931	    ad += sec->output_section->vma - tls_biased_base (info);
1932
1933	  bfd_put_32 (output_bfd,
1934		      frvfdpic_plt_section (info)->output_section->vma
1935		      + frvfdpic_plt_section (info)->output_offset
1936		      + frvfdpic_plt_tls_ret_offset (info),
1937		      frvfdpic_got_section (info)->contents
1938		      + frvfdpic_got_initial_offset (info)
1939		      + entry->tlsdesc_entry);
1940
1941	  _frvfdpic_add_rofixup (output_bfd,
1942				 frvfdpic_gotfixup_section (info),
1943				 frvfdpic_got_section (info)
1944				 ->output_section->vma
1945				 + frvfdpic_got_section (info)
1946				 ->output_offset
1947				 + frvfdpic_got_initial_offset (info)
1948				 + entry->tlsdesc_entry, entry);
1949
1950	  BFD_ASSERT (frvfdpic_dynamic_got_plt_info (info)->tls_ret_refs);
1951
1952	  /* We've used one of the reserved fixups, so discount it so
1953	     that we can check at the end that we've used them
1954	     all.  */
1955	  frvfdpic_dynamic_got_plt_info (info)->tls_ret_refs--;
1956
1957	  /* While at that, make sure the ret instruction makes to the
1958	     right location in the PLT.  We could do it only when we
1959	     got to 0, but since the check at the end will only print
1960	     a warning, make sure we have the ret in place in case the
1961	     warning is missed.  */
1962	  bfd_put_32 (output_bfd, 0xc03a4000,
1963		      frvfdpic_plt_section (info)->contents
1964		      + frvfdpic_plt_tls_ret_offset (info));
1965	}
1966      else
1967	{
1968	  if (idx == 0
1969	      && (bfd_is_abs_section (sec)
1970		  || bfd_is_und_section (sec)))
1971	    {
1972	      if (! elf_hash_table (info)->tls_sec)
1973		{
1974		  (*info->callbacks->undefined_symbol)
1975		    (info, "TLS section", elf_hash_table (info)->dynobj,
1976		     frvfdpic_got_section (info), entry->tlsdesc_entry, TRUE);
1977		  return FALSE;
1978		}
1979	      idx = elf_section_data (elf_hash_table (info)->tls_sec)->dynindx;
1980	      ad += FRVFDPIC_TLS_BIAS;
1981	    }
1982
1983	  _frvfdpic_add_dyn_reloc (output_bfd, frvfdpic_gotrel_section (info),
1984				   _bfd_elf_section_offset
1985				   (output_bfd, info,
1986				    frvfdpic_got_section (info),
1987				    frvfdpic_got_initial_offset (info)
1988				    + entry->tlsdesc_entry)
1989				   + frvfdpic_got_section (info)
1990				   ->output_section->vma
1991				   + frvfdpic_got_section (info)
1992				   ->output_offset,
1993				   R_FRV_TLSDESC_VALUE, idx, ad, entry);
1994
1995	  bfd_put_32 (output_bfd, 0,
1996		      frvfdpic_got_section (info)->contents
1997		      + frvfdpic_got_initial_offset (info)
1998		      + entry->tlsdesc_entry);
1999	}
2000
2001      bfd_put_32 (output_bfd, ad,
2002		  frvfdpic_got_section (info)->contents
2003		  + frvfdpic_got_initial_offset (info)
2004		  + entry->tlsdesc_entry + 4);
2005    }
2006
2007  /* Generate code for the get-TLS-offset PLT entry.  */
2008  if (entry->tlsplt_entry != (bfd_vma) -1)
2009    {
2010      bfd_byte *plt_code = frvfdpic_plt_section (info)->contents
2011	+ entry->tlsplt_entry;
2012
2013      if (info->executable
2014	  && (entry->symndx != -1
2015	      || FRVFDPIC_SYM_LOCAL (info, entry->d.h)))
2016	{
2017	  int idx = dynindx;
2018	  bfd_vma ad = addend;
2019
2020	  /* sec may be NULL when referencing an undefweak symbol
2021	     while linking a static executable.  */
2022	  if (!sec)
2023	    {
2024	      BFD_ASSERT (entry->symndx == -1
2025			  && entry->d.h->root.type == bfd_link_hash_undefweak);
2026	    }
2027	  else
2028	    {
2029	      if (entry->symndx == -1)
2030		ad += entry->d.h->root.u.def.value;
2031	      else
2032		ad += sym->st_value;
2033	      ad += sec->output_offset;
2034	      if (sec->output_section
2035		  && elf_section_data (sec->output_section))
2036		idx = elf_section_data (sec->output_section)->dynindx;
2037	      else
2038		idx = 0;
2039	    }
2040
2041	  /* *ABS*+addend is special for TLS relocations, use only the
2042	     addend for the TLS offset, and take the module id as
2043	     0.  */
2044	  if (idx == 0
2045	      && (bfd_is_abs_section (sec)
2046		  || bfd_is_und_section (sec)))
2047	    ;
2048	  /* For other TLS symbols that bind locally, add the section
2049	     TLS offset to the addend.  */
2050	  else if (sec)
2051	    ad += sec->output_section->vma - tls_biased_base (info);
2052
2053	  if ((bfd_signed_vma)ad >= -(1 << (16 - 1))
2054	      && (bfd_signed_vma)ad < (1 << (16 - 1)))
2055	    {
2056	      /* setlos lo(ad), gr9 */
2057	      bfd_put_32 (output_bfd,
2058			  0x92fc0000
2059			  | (ad
2060			     & (((bfd_vma)1 << 16) - 1)),
2061			  plt_code);
2062	      plt_code += 4;
2063	    }
2064	  else
2065	    {
2066	      /* sethi.p hi(ad), gr9
2067		 setlo lo(ad), gr9 */
2068	      bfd_put_32 (output_bfd,
2069			  0x12f80000
2070			  | ((ad >> 16)
2071			     & (((bfd_vma)1 << 16) - 1)),
2072			  plt_code);
2073	      plt_code += 4;
2074	      bfd_put_32 (output_bfd,
2075			  0x92f40000
2076			  | (ad
2077			     & (((bfd_vma)1 << 16) - 1)),
2078			  plt_code);
2079	      plt_code += 4;
2080	    }
2081	  /* ret */
2082	  bfd_put_32 (output_bfd, 0xc03a4000, plt_code);
2083	}
2084      else if (entry->tlsoff_entry)
2085	{
2086	  /* Figure out what kind of PLT entry we need, depending on the
2087	     location of the TLS descriptor within the GOT.  */
2088	  if (entry->tlsoff_entry >= -(1 << (12 - 1))
2089	      && entry->tlsoff_entry < (1 << (12 - 1)))
2090	    {
2091	      /* ldi @(gr15, tlsoff_entry), gr9 */
2092	      bfd_put_32 (output_bfd,
2093			  0x92c8f000 | (entry->tlsoff_entry
2094					& ((1 << 12) - 1)),
2095			  plt_code);
2096	      plt_code += 4;
2097	    }
2098	  else
2099	    {
2100	      if (entry->tlsoff_entry >= -(1 << (16 - 1))
2101		  && entry->tlsoff_entry < (1 << (16 - 1)))
2102		{
2103		  /* setlos lo(tlsoff_entry), gr8 */
2104		  bfd_put_32 (output_bfd,
2105			      0x90fc0000
2106			      | (entry->tlsoff_entry
2107				 & (((bfd_vma)1 << 16) - 1)),
2108			      plt_code);
2109		  plt_code += 4;
2110		}
2111	      else
2112		{
2113		  /* sethi.p hi(tlsoff_entry), gr8
2114		     setlo lo(tlsoff_entry), gr8 */
2115		  bfd_put_32 (output_bfd,
2116			      0x10f80000
2117			      | ((entry->tlsoff_entry >> 16)
2118				 & (((bfd_vma)1 << 16) - 1)),
2119			      plt_code);
2120		  plt_code += 4;
2121		  bfd_put_32 (output_bfd,
2122			      0x90f40000
2123			      | (entry->tlsoff_entry
2124				 & (((bfd_vma)1 << 16) - 1)),
2125			      plt_code);
2126		  plt_code += 4;
2127		}
2128	      /* ld @(gr15,gr8),gr9 */
2129	      bfd_put_32 (output_bfd, 0x9008f108, plt_code);
2130	      plt_code += 4;
2131	    }
2132	  /* ret */
2133	  bfd_put_32 (output_bfd, 0xc03a4000, plt_code);
2134	}
2135      else
2136	{
2137	  BFD_ASSERT (entry->tlsdesc_entry);
2138
2139	  /* Figure out what kind of PLT entry we need, depending on the
2140	     location of the TLS descriptor within the GOT.  */
2141	  if (entry->tlsdesc_entry >= -(1 << (12 - 1))
2142	      && entry->tlsdesc_entry < (1 << (12 - 1)))
2143	    {
2144	      /* lddi @(gr15, tlsdesc_entry), gr8 */
2145	      bfd_put_32 (output_bfd,
2146			  0x90ccf000 | (entry->tlsdesc_entry
2147					& ((1 << 12) - 1)),
2148			  plt_code);
2149	      plt_code += 4;
2150	    }
2151	  else
2152	    {
2153	      if (entry->tlsdesc_entry >= -(1 << (16 - 1))
2154		  && entry->tlsdesc_entry < (1 << (16 - 1)))
2155		{
2156		  /* setlos lo(tlsdesc_entry), gr8 */
2157		  bfd_put_32 (output_bfd,
2158			      0x90fc0000
2159			      | (entry->tlsdesc_entry
2160				 & (((bfd_vma)1 << 16) - 1)),
2161			      plt_code);
2162		  plt_code += 4;
2163		}
2164	      else
2165		{
2166		  /* sethi.p hi(tlsdesc_entry), gr8
2167		     setlo lo(tlsdesc_entry), gr8 */
2168		  bfd_put_32 (output_bfd,
2169			      0x10f80000
2170			      | ((entry->tlsdesc_entry >> 16)
2171				 & (((bfd_vma)1 << 16) - 1)),
2172			      plt_code);
2173		  plt_code += 4;
2174		  bfd_put_32 (output_bfd,
2175			      0x90f40000
2176			      | (entry->tlsdesc_entry
2177				 & (((bfd_vma)1 << 16) - 1)),
2178			      plt_code);
2179		  plt_code += 4;
2180		}
2181	      /* ldd @(gr15,gr8),gr8 */
2182	      bfd_put_32 (output_bfd, 0x9008f148, plt_code);
2183	      plt_code += 4;
2184	    }
2185	  /* jmpl @(gr8,gr0) */
2186	  bfd_put_32 (output_bfd, 0x80308000, plt_code);
2187	}
2188    }
2189
2190  return TRUE;
2191}
2192
2193/* Handle an FRV small data reloc.  */
2194
2195static bfd_reloc_status_type
2196elf32_frv_relocate_gprel12 (info, input_bfd, input_section, relocation,
2197			    contents, value)
2198     struct bfd_link_info *info;
2199     bfd *input_bfd;
2200     asection *input_section;
2201     Elf_Internal_Rela *relocation;
2202     bfd_byte *contents;
2203     bfd_vma value;
2204{
2205  bfd_vma insn;
2206  bfd_vma gp;
2207  struct bfd_link_hash_entry *h;
2208
2209  h = bfd_link_hash_lookup (info->hash, "_gp", FALSE, FALSE, TRUE);
2210
2211  gp = (h->u.def.value
2212	+ h->u.def.section->output_section->vma
2213	+ h->u.def.section->output_offset);
2214
2215  value -= input_section->output_section->vma;
2216  value -= (gp - input_section->output_section->vma);
2217
2218  insn = bfd_get_32 (input_bfd, contents + relocation->r_offset);
2219
2220  value += relocation->r_addend;
2221
2222  if ((long) value > 0x7ff || (long) value < -0x800)
2223    return bfd_reloc_overflow;
2224
2225  bfd_put_32 (input_bfd,
2226	      (insn & 0xfffff000) | (value & 0xfff),
2227	      contents + relocation->r_offset);
2228
2229  return bfd_reloc_ok;
2230}
2231
2232/* Handle an FRV small data reloc. for the u12 field.  */
2233
2234static bfd_reloc_status_type
2235elf32_frv_relocate_gprelu12 (info, input_bfd, input_section, relocation,
2236			     contents, value)
2237     struct bfd_link_info *info;
2238     bfd *input_bfd;
2239     asection *input_section;
2240     Elf_Internal_Rela *relocation;
2241     bfd_byte *contents;
2242     bfd_vma value;
2243{
2244  bfd_vma insn;
2245  bfd_vma gp;
2246  struct bfd_link_hash_entry *h;
2247  bfd_vma mask;
2248
2249  h = bfd_link_hash_lookup (info->hash, "_gp", FALSE, FALSE, TRUE);
2250
2251  gp = (h->u.def.value
2252	+ h->u.def.section->output_section->vma
2253	+ h->u.def.section->output_offset);
2254
2255  value -= input_section->output_section->vma;
2256  value -= (gp - input_section->output_section->vma);
2257
2258  insn = bfd_get_32 (input_bfd, contents + relocation->r_offset);
2259
2260  value += relocation->r_addend;
2261
2262  if ((long) value > 0x7ff || (long) value < -0x800)
2263    return bfd_reloc_overflow;
2264
2265  /* The high 6 bits go into bits 17-12. The low 6 bits go into bits 5-0.  */
2266  mask = 0x3f03f;
2267  insn = (insn & ~mask) | ((value & 0xfc0) << 12) | (value & 0x3f);
2268
2269  bfd_put_32 (input_bfd, insn, contents + relocation->r_offset);
2270
2271  return bfd_reloc_ok;
2272}
2273
2274/* Handle an FRV ELF HI16 reloc.  */
2275
2276static bfd_reloc_status_type
2277elf32_frv_relocate_hi16 (input_bfd, relhi, contents, value)
2278     bfd *input_bfd;
2279     Elf_Internal_Rela *relhi;
2280     bfd_byte *contents;
2281     bfd_vma value;
2282{
2283  bfd_vma insn;
2284
2285  insn = bfd_get_32 (input_bfd, contents + relhi->r_offset);
2286
2287  value += relhi->r_addend;
2288  value = ((value >> 16) & 0xffff);
2289
2290  insn = (insn & 0xffff0000) | value;
2291
2292  if ((long) value > 0xffff || (long) value < -0x10000)
2293    return bfd_reloc_overflow;
2294
2295  bfd_put_32 (input_bfd, insn, contents + relhi->r_offset);
2296  return bfd_reloc_ok;
2297
2298}
2299static bfd_reloc_status_type
2300elf32_frv_relocate_lo16 (input_bfd, rello, contents, value)
2301     bfd *input_bfd;
2302     Elf_Internal_Rela *rello;
2303     bfd_byte *contents;
2304     bfd_vma value;
2305{
2306  bfd_vma insn;
2307
2308  insn = bfd_get_32 (input_bfd, contents + rello->r_offset);
2309
2310  value += rello->r_addend;
2311  value = value & 0xffff;
2312
2313  insn = (insn & 0xffff0000) | value;
2314
2315  if ((long) value > 0xffff || (long) value < -0x10000)
2316    return bfd_reloc_overflow;
2317
2318  bfd_put_32 (input_bfd, insn, contents + rello->r_offset);
2319  return bfd_reloc_ok;
2320}
2321
2322/* Perform the relocation for the CALL label24 instruction.  */
2323
2324static bfd_reloc_status_type
2325elf32_frv_relocate_label24 (input_bfd, input_section, rello, contents, value)
2326     bfd *input_bfd;
2327     asection *input_section;
2328     Elf_Internal_Rela *rello;
2329     bfd_byte *contents;
2330     bfd_vma value;
2331{
2332  bfd_vma insn;
2333  bfd_vma label6;
2334  bfd_vma label18;
2335
2336  /* The format for the call instruction is:
2337
2338    0 000000 0001111 000000000000000000
2339      label6 opcode  label18
2340
2341    The branch calculation is: pc + (4*label24)
2342    where label24 is the concatenation of label6 and label18.  */
2343
2344  /* Grab the instruction.  */
2345  insn = bfd_get_32 (input_bfd, contents + rello->r_offset);
2346
2347  value -= input_section->output_section->vma + input_section->output_offset;
2348  value -= rello->r_offset;
2349  value += rello->r_addend;
2350
2351  value = value >> 2;
2352
2353  label6  = value & 0xfc0000;
2354  label6  = label6 << 7;
2355
2356  label18 = value & 0x3ffff;
2357
2358  insn = insn & 0x803c0000;
2359  insn = insn | label6;
2360  insn = insn | label18;
2361
2362  bfd_put_32 (input_bfd, insn, contents + rello->r_offset);
2363
2364  return bfd_reloc_ok;
2365}
2366
2367static bfd_reloc_status_type
2368elf32_frv_relocate_gprelhi (info, input_bfd, input_section, relocation,
2369			    contents, value)
2370     struct bfd_link_info *info;
2371     bfd *input_bfd;
2372     asection *input_section;
2373     Elf_Internal_Rela *relocation;
2374     bfd_byte *contents;
2375     bfd_vma value;
2376{
2377  bfd_vma insn;
2378  bfd_vma gp;
2379  struct bfd_link_hash_entry *h;
2380
2381  h = bfd_link_hash_lookup (info->hash, "_gp", FALSE, FALSE, TRUE);
2382
2383  gp = (h->u.def.value
2384        + h->u.def.section->output_section->vma
2385        + h->u.def.section->output_offset);
2386
2387  value -= input_section->output_section->vma;
2388  value -= (gp - input_section->output_section->vma);
2389  value += relocation->r_addend;
2390  value = ((value >> 16) & 0xffff);
2391
2392  if ((long) value > 0xffff || (long) value < -0x10000)
2393    return bfd_reloc_overflow;
2394
2395  insn = bfd_get_32 (input_bfd, contents + relocation->r_offset);
2396  insn = (insn & 0xffff0000) | value;
2397
2398  bfd_put_32 (input_bfd, insn, contents + relocation->r_offset);
2399  return bfd_reloc_ok;
2400}
2401
2402static bfd_reloc_status_type
2403elf32_frv_relocate_gprello (info, input_bfd, input_section, relocation,
2404			    contents, value)
2405     struct bfd_link_info *info;
2406     bfd *input_bfd;
2407     asection *input_section;
2408     Elf_Internal_Rela *relocation;
2409     bfd_byte *contents;
2410     bfd_vma value;
2411{
2412  bfd_vma insn;
2413  bfd_vma gp;
2414  struct bfd_link_hash_entry *h;
2415
2416  h = bfd_link_hash_lookup (info->hash, "_gp", FALSE, FALSE, TRUE);
2417
2418  gp = (h->u.def.value
2419        + h->u.def.section->output_section->vma
2420        + h->u.def.section->output_offset);
2421
2422  value -= input_section->output_section->vma;
2423  value -= (gp - input_section->output_section->vma);
2424  value += relocation->r_addend;
2425  value = value & 0xffff;
2426
2427  if ((long) value > 0xffff || (long) value < -0x10000)
2428    return bfd_reloc_overflow;
2429
2430  insn = bfd_get_32 (input_bfd, contents + relocation->r_offset);
2431  insn = (insn & 0xffff0000) | value;
2432
2433  bfd_put_32 (input_bfd, insn, contents + relocation->r_offset);
2434
2435 return bfd_reloc_ok;
2436}
2437
2438static reloc_howto_type *
2439frv_reloc_type_lookup (abfd, code)
2440     bfd *abfd ATTRIBUTE_UNUSED;
2441     bfd_reloc_code_real_type code;
2442{
2443  switch (code)
2444    {
2445    default:
2446      break;
2447
2448    case BFD_RELOC_NONE:
2449      return &elf32_frv_howto_table[ (int) R_FRV_NONE];
2450
2451    case BFD_RELOC_32:
2452      if (elf_elfheader (abfd)->e_type == ET_EXEC
2453	  || elf_elfheader (abfd)->e_type == ET_DYN)
2454	return &elf32_frv_rel_32_howto;
2455      /* Fall through.  */
2456    case BFD_RELOC_CTOR:
2457      return &elf32_frv_howto_table[ (int) R_FRV_32];
2458
2459    case BFD_RELOC_FRV_LABEL16:
2460      return &elf32_frv_howto_table[ (int) R_FRV_LABEL16];
2461
2462    case BFD_RELOC_FRV_LABEL24:
2463      return &elf32_frv_howto_table[ (int) R_FRV_LABEL24];
2464
2465    case BFD_RELOC_FRV_LO16:
2466      return &elf32_frv_howto_table[ (int) R_FRV_LO16];
2467
2468    case BFD_RELOC_FRV_HI16:
2469      return &elf32_frv_howto_table[ (int) R_FRV_HI16];
2470
2471    case BFD_RELOC_FRV_GPREL12:
2472      return &elf32_frv_howto_table[ (int) R_FRV_GPREL12];
2473
2474    case BFD_RELOC_FRV_GPRELU12:
2475      return &elf32_frv_howto_table[ (int) R_FRV_GPRELU12];
2476
2477    case BFD_RELOC_FRV_GPREL32:
2478      return &elf32_frv_howto_table[ (int) R_FRV_GPREL32];
2479
2480    case BFD_RELOC_FRV_GPRELHI:
2481      return &elf32_frv_howto_table[ (int) R_FRV_GPRELHI];
2482
2483    case BFD_RELOC_FRV_GPRELLO:
2484      return &elf32_frv_howto_table[ (int) R_FRV_GPRELLO];
2485
2486    case BFD_RELOC_FRV_GOT12:
2487      return &elf32_frv_howto_table[ (int) R_FRV_GOT12];
2488
2489    case BFD_RELOC_FRV_GOTHI:
2490      return &elf32_frv_howto_table[ (int) R_FRV_GOTHI];
2491
2492    case BFD_RELOC_FRV_GOTLO:
2493      return &elf32_frv_howto_table[ (int) R_FRV_GOTLO];
2494
2495    case BFD_RELOC_FRV_FUNCDESC:
2496      if (elf_elfheader (abfd)->e_type == ET_EXEC
2497	  || elf_elfheader (abfd)->e_type == ET_DYN)
2498	return &elf32_frv_rel_funcdesc_howto;
2499      return &elf32_frv_howto_table[ (int) R_FRV_FUNCDESC];
2500
2501    case BFD_RELOC_FRV_FUNCDESC_GOT12:
2502      return &elf32_frv_howto_table[ (int) R_FRV_FUNCDESC_GOT12];
2503
2504    case BFD_RELOC_FRV_FUNCDESC_GOTHI:
2505      return &elf32_frv_howto_table[ (int) R_FRV_FUNCDESC_GOTHI];
2506
2507    case BFD_RELOC_FRV_FUNCDESC_GOTLO:
2508      return &elf32_frv_howto_table[ (int) R_FRV_FUNCDESC_GOTLO];
2509
2510    case BFD_RELOC_FRV_FUNCDESC_VALUE:
2511      if (elf_elfheader (abfd)->e_type == ET_EXEC
2512	  || elf_elfheader (abfd)->e_type == ET_DYN)
2513	return &elf32_frv_rel_funcdesc_value_howto;
2514      return &elf32_frv_howto_table[ (int) R_FRV_FUNCDESC_VALUE];
2515
2516    case BFD_RELOC_FRV_FUNCDESC_GOTOFF12:
2517      return &elf32_frv_howto_table[ (int) R_FRV_FUNCDESC_GOTOFF12];
2518
2519    case BFD_RELOC_FRV_FUNCDESC_GOTOFFHI:
2520      return &elf32_frv_howto_table[ (int) R_FRV_FUNCDESC_GOTOFFHI];
2521
2522    case BFD_RELOC_FRV_FUNCDESC_GOTOFFLO:
2523      return &elf32_frv_howto_table[ (int) R_FRV_FUNCDESC_GOTOFFLO];
2524
2525    case BFD_RELOC_FRV_GOTOFF12:
2526      return &elf32_frv_howto_table[ (int) R_FRV_GOTOFF12];
2527
2528    case BFD_RELOC_FRV_GOTOFFHI:
2529      return &elf32_frv_howto_table[ (int) R_FRV_GOTOFFHI];
2530
2531    case BFD_RELOC_FRV_GOTOFFLO:
2532      return &elf32_frv_howto_table[ (int) R_FRV_GOTOFFLO];
2533
2534    case BFD_RELOC_FRV_GETTLSOFF:
2535      return &elf32_frv_howto_table[ (int) R_FRV_GETTLSOFF];
2536
2537    case BFD_RELOC_FRV_TLSDESC_VALUE:
2538      if (elf_elfheader (abfd)->e_type == ET_EXEC
2539	  || elf_elfheader (abfd)->e_type == ET_DYN)
2540	return &elf32_frv_rel_tlsdesc_value_howto;
2541      return &elf32_frv_howto_table[ (int) R_FRV_TLSDESC_VALUE];
2542
2543    case BFD_RELOC_FRV_GOTTLSDESC12:
2544      return &elf32_frv_howto_table[ (int) R_FRV_GOTTLSDESC12];
2545
2546    case BFD_RELOC_FRV_GOTTLSDESCHI:
2547      return &elf32_frv_howto_table[ (int) R_FRV_GOTTLSDESCHI];
2548
2549    case BFD_RELOC_FRV_GOTTLSDESCLO:
2550      return &elf32_frv_howto_table[ (int) R_FRV_GOTTLSDESCLO];
2551
2552    case BFD_RELOC_FRV_TLSMOFF12:
2553      return &elf32_frv_howto_table[ (int) R_FRV_TLSMOFF12];
2554
2555    case BFD_RELOC_FRV_TLSMOFFHI:
2556      return &elf32_frv_howto_table[ (int) R_FRV_TLSMOFFHI];
2557
2558    case BFD_RELOC_FRV_TLSMOFFLO:
2559      return &elf32_frv_howto_table[ (int) R_FRV_TLSMOFFLO];
2560
2561    case BFD_RELOC_FRV_GOTTLSOFF12:
2562      return &elf32_frv_howto_table[ (int) R_FRV_GOTTLSOFF12];
2563
2564    case BFD_RELOC_FRV_GOTTLSOFFHI:
2565      return &elf32_frv_howto_table[ (int) R_FRV_GOTTLSOFFHI];
2566
2567    case BFD_RELOC_FRV_GOTTLSOFFLO:
2568      return &elf32_frv_howto_table[ (int) R_FRV_GOTTLSOFFLO];
2569
2570    case BFD_RELOC_FRV_TLSOFF:
2571      if (elf_elfheader (abfd)->e_type == ET_EXEC
2572	  || elf_elfheader (abfd)->e_type == ET_DYN)
2573	return &elf32_frv_rel_tlsoff_howto;
2574      return &elf32_frv_howto_table[ (int) R_FRV_TLSOFF];
2575
2576    case BFD_RELOC_FRV_TLSDESC_RELAX:
2577      return &elf32_frv_howto_table[ (int) R_FRV_TLSDESC_RELAX];
2578
2579    case BFD_RELOC_FRV_GETTLSOFF_RELAX:
2580      return &elf32_frv_howto_table[ (int) R_FRV_GETTLSOFF_RELAX];
2581
2582    case BFD_RELOC_FRV_TLSOFF_RELAX:
2583      return &elf32_frv_howto_table[ (int) R_FRV_TLSOFF_RELAX];
2584
2585    case BFD_RELOC_FRV_TLSMOFF:
2586      return &elf32_frv_howto_table[ (int) R_FRV_TLSMOFF];
2587
2588    case BFD_RELOC_VTABLE_INHERIT:
2589      return &elf32_frv_vtinherit_howto;
2590
2591    case BFD_RELOC_VTABLE_ENTRY:
2592      return &elf32_frv_vtentry_howto;
2593    }
2594
2595  return NULL;
2596}
2597
2598/* Set the howto pointer for an FRV ELF reloc.  */
2599
2600static void
2601frv_info_to_howto_rela (abfd, cache_ptr, dst)
2602     bfd *abfd ATTRIBUTE_UNUSED;
2603     arelent *cache_ptr;
2604     Elf_Internal_Rela *dst;
2605{
2606  unsigned int r_type;
2607
2608  r_type = ELF32_R_TYPE (dst->r_info);
2609  switch (r_type)
2610    {
2611    case R_FRV_GNU_VTINHERIT:
2612      cache_ptr->howto = &elf32_frv_vtinherit_howto;
2613      break;
2614
2615    case R_FRV_GNU_VTENTRY:
2616      cache_ptr->howto = &elf32_frv_vtentry_howto;
2617      break;
2618
2619    default:
2620      cache_ptr->howto = & elf32_frv_howto_table [r_type];
2621      break;
2622    }
2623}
2624
2625/* Set the howto pointer for an FRV ELF REL reloc.  */
2626static void
2627frvfdpic_info_to_howto_rel (bfd *abfd ATTRIBUTE_UNUSED,
2628			    arelent *cache_ptr, Elf_Internal_Rela *dst)
2629{
2630  unsigned int r_type;
2631
2632  r_type = ELF32_R_TYPE (dst->r_info);
2633  switch (r_type)
2634    {
2635    case R_FRV_32:
2636      cache_ptr->howto = &elf32_frv_rel_32_howto;
2637      break;
2638
2639    case R_FRV_FUNCDESC:
2640      cache_ptr->howto = &elf32_frv_rel_funcdesc_howto;
2641      break;
2642
2643    case R_FRV_FUNCDESC_VALUE:
2644      cache_ptr->howto = &elf32_frv_rel_funcdesc_value_howto;
2645      break;
2646
2647    case R_FRV_TLSDESC_VALUE:
2648      cache_ptr->howto = &elf32_frv_rel_tlsdesc_value_howto;
2649      break;
2650
2651    case R_FRV_TLSOFF:
2652      cache_ptr->howto = &elf32_frv_rel_tlsoff_howto;
2653      break;
2654
2655    default:
2656      cache_ptr->howto = NULL;
2657      break;
2658    }
2659}
2660
2661/* Perform a single relocation.  By default we use the standard BFD
2662   routines, but a few relocs, we have to do them ourselves.  */
2663
2664static bfd_reloc_status_type
2665frv_final_link_relocate (howto, input_bfd, input_section, contents, rel,
2666			 relocation)
2667     reloc_howto_type *howto;
2668     bfd *input_bfd;
2669     asection *input_section;
2670     bfd_byte *contents;
2671     Elf_Internal_Rela *rel;
2672     bfd_vma relocation;
2673{
2674  return _bfd_final_link_relocate (howto, input_bfd, input_section,
2675				   contents, rel->r_offset, relocation,
2676				   rel->r_addend);
2677}
2678
2679
2680/* Relocate an FRV ELF section.
2681
2682   The RELOCATE_SECTION function is called by the new ELF backend linker
2683   to handle the relocations for a section.
2684
2685   The relocs are always passed as Rela structures; if the section
2686   actually uses Rel structures, the r_addend field will always be
2687   zero.
2688
2689   This function is responsible for adjusting the section contents as
2690   necessary, and (if using Rela relocs and generating a relocatable
2691   output file) adjusting the reloc addend as necessary.
2692
2693   This function does not have to worry about setting the reloc
2694   address or the reloc symbol index.
2695
2696   LOCAL_SYMS is a pointer to the swapped in local symbols.
2697
2698   LOCAL_SECTIONS is an array giving the section in the input file
2699   corresponding to the st_shndx field of each local symbol.
2700
2701   The global hash table entry for the global symbols can be found
2702   via elf_sym_hashes (input_bfd).
2703
2704   When generating relocatable output, this function must handle
2705   STB_LOCAL/STT_SECTION symbols specially.  The output symbol is
2706   going to be the section symbol corresponding to the output
2707   section, which means that the addend must be adjusted
2708   accordingly.  */
2709
2710static bfd_boolean
2711elf32_frv_relocate_section (output_bfd, info, input_bfd, input_section,
2712			    contents, relocs, local_syms, local_sections)
2713     bfd *output_bfd ATTRIBUTE_UNUSED;
2714     struct bfd_link_info *info;
2715     bfd *input_bfd;
2716     asection *input_section;
2717     bfd_byte *contents;
2718     Elf_Internal_Rela *relocs;
2719     Elf_Internal_Sym *local_syms;
2720     asection **local_sections;
2721{
2722  Elf_Internal_Shdr *symtab_hdr;
2723  struct elf_link_hash_entry **sym_hashes;
2724  Elf_Internal_Rela *rel;
2725  Elf_Internal_Rela *relend;
2726  unsigned isec_segment, got_segment, plt_segment, gprel_segment, tls_segment,
2727    check_segment[2];
2728  int silence_segment_error = !(info->shared || info->pie);
2729  unsigned long insn;
2730
2731  if (info->relocatable)
2732    return TRUE;
2733
2734  symtab_hdr = & elf_tdata (input_bfd)->symtab_hdr;
2735  sym_hashes = elf_sym_hashes (input_bfd);
2736  relend     = relocs + input_section->reloc_count;
2737
2738  isec_segment = _frvfdpic_osec_to_segment (output_bfd,
2739					    input_section->output_section);
2740  if (IS_FDPIC (output_bfd) && frvfdpic_got_section (info))
2741    got_segment = _frvfdpic_osec_to_segment (output_bfd,
2742					     frvfdpic_got_section (info)
2743					     ->output_section);
2744  else
2745    got_segment = -1;
2746  if (IS_FDPIC (output_bfd) && frvfdpic_gotfixup_section (info))
2747    gprel_segment = _frvfdpic_osec_to_segment (output_bfd,
2748					       frvfdpic_gotfixup_section (info)
2749					       ->output_section);
2750  else
2751    gprel_segment = -1;
2752  if (IS_FDPIC (output_bfd) && frvfdpic_plt_section (info))
2753    plt_segment = _frvfdpic_osec_to_segment (output_bfd,
2754					     frvfdpic_plt_section (info)
2755					     ->output_section);
2756  else
2757    plt_segment = -1;
2758  if (elf_hash_table (info)->tls_sec)
2759    tls_segment = _frvfdpic_osec_to_segment (output_bfd,
2760					     elf_hash_table (info)->tls_sec);
2761  else
2762    tls_segment = -1;
2763
2764  for (rel = relocs; rel < relend; rel ++)
2765    {
2766      reloc_howto_type *howto;
2767      unsigned long r_symndx;
2768      Elf_Internal_Sym *sym;
2769      asection *sec;
2770      struct elf_link_hash_entry *h;
2771      bfd_vma relocation;
2772      bfd_reloc_status_type r;
2773      const char * name = NULL;
2774      int r_type;
2775      asection *osec;
2776      struct frvfdpic_relocs_info *picrel;
2777      bfd_vma orig_addend = rel->r_addend;
2778
2779      r_type = ELF32_R_TYPE (rel->r_info);
2780
2781      if (   r_type == R_FRV_GNU_VTINHERIT
2782	  || r_type == R_FRV_GNU_VTENTRY)
2783	continue;
2784
2785      /* This is a final link.  */
2786      r_symndx = ELF32_R_SYM (rel->r_info);
2787      howto  = elf32_frv_howto_table + ELF32_R_TYPE (rel->r_info);
2788      h      = NULL;
2789      sym    = NULL;
2790      sec    = NULL;
2791
2792      if (r_symndx < symtab_hdr->sh_info)
2793	{
2794	  sym = local_syms + r_symndx;
2795	  osec = sec = local_sections [r_symndx];
2796	  relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
2797
2798	  name = bfd_elf_string_from_elf_section
2799	    (input_bfd, symtab_hdr->sh_link, sym->st_name);
2800	  name = (name == NULL) ? bfd_section_name (input_bfd, sec) : name;
2801	}
2802      else
2803	{
2804	  h = sym_hashes [r_symndx - symtab_hdr->sh_info];
2805
2806	  while (h->root.type == bfd_link_hash_indirect
2807		 || h->root.type == bfd_link_hash_warning)
2808	    h = (struct elf_link_hash_entry *) h->root.u.i.link;
2809
2810	  name = h->root.root.string;
2811
2812	  if ((h->root.type == bfd_link_hash_defined
2813	       || h->root.type == bfd_link_hash_defweak))
2814	    {
2815	      if (/* TLSMOFF forces local binding.  */
2816		  r_type != R_FRV_TLSMOFF
2817		  && ! FRVFDPIC_SYM_LOCAL (info, h))
2818		{
2819		  sec = NULL;
2820		  relocation = 0;
2821		}
2822	      else
2823		{
2824		  sec = h->root.u.def.section;
2825		  relocation = (h->root.u.def.value
2826				+ sec->output_section->vma
2827				+ sec->output_offset);
2828		}
2829	    }
2830	  else if (h->root.type == bfd_link_hash_undefweak)
2831	    {
2832	      relocation = 0;
2833	    }
2834	  else if (info->unresolved_syms_in_objects == RM_IGNORE
2835		   && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
2836	    relocation = 0;
2837	  else
2838	    {
2839	      if (! ((*info->callbacks->undefined_symbol)
2840		     (info, h->root.root.string, input_bfd,
2841		      input_section, rel->r_offset,
2842		      (info->unresolved_syms_in_objects == RM_GENERATE_ERROR
2843		       || ELF_ST_VISIBILITY (h->other)))))
2844		return FALSE;
2845	      relocation = 0;
2846	    }
2847	  osec = sec;
2848	}
2849
2850      switch (r_type)
2851	{
2852	case R_FRV_LABEL24:
2853	case R_FRV_32:
2854	  if (! IS_FDPIC (output_bfd))
2855	    goto non_fdpic;
2856
2857	case R_FRV_GOT12:
2858	case R_FRV_GOTHI:
2859	case R_FRV_GOTLO:
2860	case R_FRV_FUNCDESC_GOT12:
2861	case R_FRV_FUNCDESC_GOTHI:
2862	case R_FRV_FUNCDESC_GOTLO:
2863	case R_FRV_GOTOFF12:
2864	case R_FRV_GOTOFFHI:
2865	case R_FRV_GOTOFFLO:
2866	case R_FRV_FUNCDESC_GOTOFF12:
2867	case R_FRV_FUNCDESC_GOTOFFHI:
2868	case R_FRV_FUNCDESC_GOTOFFLO:
2869	case R_FRV_FUNCDESC:
2870	case R_FRV_FUNCDESC_VALUE:
2871	case R_FRV_GETTLSOFF:
2872	case R_FRV_TLSDESC_VALUE:
2873	case R_FRV_GOTTLSDESC12:
2874	case R_FRV_GOTTLSDESCHI:
2875	case R_FRV_GOTTLSDESCLO:
2876	case R_FRV_TLSMOFF12:
2877	case R_FRV_TLSMOFFHI:
2878	case R_FRV_TLSMOFFLO:
2879	case R_FRV_GOTTLSOFF12:
2880	case R_FRV_GOTTLSOFFHI:
2881	case R_FRV_GOTTLSOFFLO:
2882	case R_FRV_TLSOFF:
2883	case R_FRV_TLSDESC_RELAX:
2884	case R_FRV_GETTLSOFF_RELAX:
2885	case R_FRV_TLSOFF_RELAX:
2886	case R_FRV_TLSMOFF:
2887	  if (h != NULL)
2888	    picrel = frvfdpic_relocs_info_for_global (frvfdpic_relocs_info
2889						      (info), input_bfd, h,
2890						      orig_addend, INSERT);
2891	  else
2892	    /* In order to find the entry we created before, we must
2893	       use the original addend, not the one that may have been
2894	       modified by _bfd_elf_rela_local_sym().  */
2895	    picrel = frvfdpic_relocs_info_for_local (frvfdpic_relocs_info
2896						     (info), input_bfd, r_symndx,
2897						     orig_addend, INSERT);
2898	  if (! picrel)
2899	    return FALSE;
2900
2901	  if (!_frvfdpic_emit_got_relocs_plt_entries (picrel, output_bfd, info,
2902						      osec, sym,
2903						      rel->r_addend))
2904	    {
2905	      (*_bfd_error_handler)
2906		(_("%B(%A+0x%x): relocation to `%s+%x' may have caused the error above"),
2907		 input_bfd, input_section, rel->r_offset, name, rel->r_addend);
2908	      return FALSE;
2909	    }
2910
2911	  break;
2912
2913	default:
2914	non_fdpic:
2915	  picrel = NULL;
2916	  if (h && ! FRVFDPIC_SYM_LOCAL (info, h))
2917	    {
2918	      info->callbacks->warning
2919		(info, _("relocation references symbol not defined in the module"),
2920		 name, input_bfd, input_section, rel->r_offset);
2921	      return FALSE;
2922	    }
2923	  break;
2924	}
2925
2926      switch (r_type)
2927	{
2928	case R_FRV_GETTLSOFF:
2929	case R_FRV_TLSDESC_VALUE:
2930	case R_FRV_GOTTLSDESC12:
2931	case R_FRV_GOTTLSDESCHI:
2932	case R_FRV_GOTTLSDESCLO:
2933	case R_FRV_TLSMOFF12:
2934	case R_FRV_TLSMOFFHI:
2935	case R_FRV_TLSMOFFLO:
2936	case R_FRV_GOTTLSOFF12:
2937	case R_FRV_GOTTLSOFFHI:
2938	case R_FRV_GOTTLSOFFLO:
2939	case R_FRV_TLSOFF:
2940	case R_FRV_TLSDESC_RELAX:
2941	case R_FRV_GETTLSOFF_RELAX:
2942	case R_FRV_TLSOFF_RELAX:
2943	case R_FRV_TLSMOFF:
2944	  if (sec && (bfd_is_abs_section (sec) || bfd_is_und_section (sec)))
2945	    relocation += tls_biased_base (info);
2946	  break;
2947
2948	default:
2949	  break;
2950	}
2951
2952      /* Try to apply TLS relaxations.  */
2953      if (1)
2954	switch (r_type)
2955	  {
2956
2957#define LOCAL_EXEC_P(info, picrel) \
2958  ((info)->executable \
2959   && (picrel->symndx != -1 || FRVFDPIC_SYM_LOCAL ((info), (picrel)->d.h)))
2960#define INITIAL_EXEC_P(info, picrel) \
2961  (((info)->executable || (info)->flags & DF_STATIC_TLS) \
2962   && (picrel)->tlsoff_entry)
2963
2964#define IN_RANGE_FOR_OFST12_P(value) \
2965  ((bfd_vma)((value) + 2048) < (bfd_vma)4096)
2966#define IN_RANGE_FOR_SETLOS_P(value) \
2967  ((bfd_vma)((value) + 32768) < (bfd_vma)65536)
2968#define TLSMOFF_IN_RANGE_FOR_SETLOS_P(value, info) \
2969  (IN_RANGE_FOR_SETLOS_P ((value) - tls_biased_base (info)))
2970
2971#define RELAX_GETTLSOFF_LOCAL_EXEC_P(info, picrel, value) \
2972  (LOCAL_EXEC_P ((info), (picrel)) \
2973   && TLSMOFF_IN_RANGE_FOR_SETLOS_P((value), (info)))
2974#define RELAX_GETTLSOFF_INITIAL_EXEC_P(info, picrel) \
2975  (INITIAL_EXEC_P ((info), (picrel)) \
2976   && IN_RANGE_FOR_OFST12_P ((picrel)->tlsoff_entry))
2977
2978#define RELAX_TLSDESC_LOCAL_EXEC_P(info, picrel, value) \
2979  (LOCAL_EXEC_P ((info), (picrel)))
2980#define RELAX_TLSDESC_INITIAL_EXEC_P(info, picrel) \
2981  (INITIAL_EXEC_P ((info), (picrel)))
2982
2983#define RELAX_GOTTLSOFF_LOCAL_EXEC_P(info, picrel, value) \
2984  (LOCAL_EXEC_P ((info), (picrel)) \
2985   && TLSMOFF_IN_RANGE_FOR_SETLOS_P((value), (info)))
2986
2987	  case R_FRV_GETTLSOFF:
2988	    insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
2989
2990	    /* Is this a call instruction?  */
2991	    if ((insn & (unsigned long)0x01fc0000) != 0x003c0000)
2992	      {
2993		r = info->callbacks->warning
2994		  (info,
2995		   _("R_FRV_GETTLSOFF not applied to a call instruction"),
2996		   name, input_bfd, input_section, rel->r_offset);
2997		return FALSE;
2998	      }
2999
3000	    if (RELAX_GETTLSOFF_LOCAL_EXEC_P (info, picrel,
3001					      relocation + rel->r_addend))
3002	      {
3003		/* Replace the call instruction (except the packing bit)
3004		   with setlos #tlsmofflo(symbol+offset), gr9.  */
3005		insn &= (unsigned long)0x80000000;
3006		insn |= (unsigned long)0x12fc0000;
3007		bfd_put_32 (input_bfd, insn, contents + rel->r_offset);
3008
3009		r_type = R_FRV_TLSMOFFLO;
3010		howto  = elf32_frv_howto_table + r_type;
3011		rel->r_info = ELF32_R_INFO (r_symndx, r_type);
3012	      }
3013
3014	    else if (RELAX_GETTLSOFF_INITIAL_EXEC_P (info, picrel))
3015	      {
3016		/* Replace the call instruction (except the packing bit)
3017		   with ldi @(gr15, #gottlsoff12(symbol+addend)), gr9.  */
3018		insn &= (unsigned long)0x80000000;
3019		insn |= (unsigned long)0x12c8f000;
3020		bfd_put_32 (input_bfd, insn, contents + rel->r_offset);
3021
3022		r_type = R_FRV_GOTTLSOFF12;
3023		howto  = elf32_frv_howto_table + r_type;
3024		rel->r_info = ELF32_R_INFO (r_symndx, r_type);
3025	      }
3026
3027	    break;
3028
3029	  case R_FRV_GOTTLSDESC12:
3030	    insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
3031
3032	    /* Is this an lddi instruction?  */
3033	    if ((insn & (unsigned long)0x01fc0000) != 0x00cc0000)
3034	      {
3035		r = info->callbacks->warning
3036		  (info,
3037		   _("R_FRV_GOTTLSDESC12 not applied to an lddi instruction"),
3038		   name, input_bfd, input_section, rel->r_offset);
3039		return FALSE;
3040	      }
3041
3042	    if (RELAX_TLSDESC_LOCAL_EXEC_P (info, picrel,
3043					    relocation + rel->r_addend)
3044		&& TLSMOFF_IN_RANGE_FOR_SETLOS_P (relocation + rel->r_addend,
3045						  info))
3046	      {
3047		/* Replace lddi @(grB, #gottlsdesc12(symbol+offset), grC
3048		   with setlos #tlsmofflo(symbol+offset), gr<C+1>.
3049		   Preserve the packing bit.  */
3050		insn = (insn & (unsigned long)0x80000000)
3051		  | ((insn + (unsigned long)0x02000000)
3052		     & (unsigned long)0x7e000000);
3053		insn |= (unsigned long)0x00fc0000;
3054		bfd_put_32 (input_bfd, insn, contents + rel->r_offset);
3055
3056		r_type = R_FRV_TLSMOFFLO;
3057		howto  = elf32_frv_howto_table + r_type;
3058		rel->r_info = ELF32_R_INFO (r_symndx, r_type);
3059	      }
3060
3061	    else if (RELAX_TLSDESC_LOCAL_EXEC_P (info, picrel,
3062						 relocation + rel->r_addend))
3063	      {
3064		/* Replace lddi @(grB, #gottlsdesc12(symbol+offset), grC
3065		   with sethi #tlsmoffhi(symbol+offset), gr<C+1>.
3066		   Preserve the packing bit.  */
3067		insn = (insn & (unsigned long)0x80000000)
3068		  | ((insn + (unsigned long)0x02000000)
3069		     & (unsigned long)0x7e000000);
3070		insn |= (unsigned long)0x00f80000;
3071		bfd_put_32 (input_bfd, insn, contents + rel->r_offset);
3072
3073		r_type = R_FRV_TLSMOFFHI;
3074		howto  = elf32_frv_howto_table + r_type;
3075		rel->r_info = ELF32_R_INFO (r_symndx, r_type);
3076	      }
3077
3078	    else if (RELAX_TLSDESC_INITIAL_EXEC_P (info, picrel))
3079	      {
3080		/* Replace lddi @(grB, #gottlsdesc12(symbol+offset), grC
3081		   with ldi @(grB, #gottlsoff12(symbol+offset),
3082		   gr<C+1>.  Preserve the packing bit.  If gottlsoff12
3083		   overflows, we'll error out, but that's sort-of ok,
3084		   since we'd started with gottlsdesc12, that's actually
3085		   more demanding.  Compiling with -fPIE instead of
3086		   -fpie would fix it; linking with --relax should fix
3087		   it as well.  */
3088		insn = (insn & (unsigned long)0x80cbf000)
3089		  | ((insn + (unsigned long)0x02000000)
3090		     & (unsigned long)0x7e000000);
3091		bfd_put_32 (input_bfd, insn, contents + rel->r_offset);
3092
3093		r_type = R_FRV_GOTTLSOFF12;
3094		howto  = elf32_frv_howto_table + r_type;
3095		rel->r_info = ELF32_R_INFO (r_symndx, r_type);
3096	      }
3097
3098	    break;
3099
3100	  case R_FRV_GOTTLSDESCHI:
3101	    insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
3102
3103	    /* Is this a sethi instruction?  */
3104	    if ((insn & (unsigned long)0x01ff0000) != 0x00f80000)
3105	      {
3106		r = info->callbacks->warning
3107		  (info,
3108		   _("R_FRV_GOTTLSDESCHI not applied to a sethi instruction"),
3109		   name, input_bfd, input_section, rel->r_offset);
3110		return FALSE;
3111	      }
3112
3113	    if (RELAX_TLSDESC_LOCAL_EXEC_P (info, picrel,
3114					    relocation + rel->r_addend)
3115		|| (RELAX_TLSDESC_INITIAL_EXEC_P (info, picrel)
3116		    && IN_RANGE_FOR_SETLOS_P (picrel->tlsoff_entry)))
3117	      {
3118		/* Replace sethi with a nop.  Preserve the packing bit.  */
3119		insn &= (unsigned long)0x80000000;
3120		insn |= (unsigned long)0x00880000;
3121		bfd_put_32 (input_bfd, insn, contents + rel->r_offset);
3122
3123		/* Nothing to relocate.  */
3124		continue;
3125	      }
3126
3127	    else if (RELAX_TLSDESC_INITIAL_EXEC_P (info, picrel))
3128	      {
3129		/* Simply decay GOTTLSDESC to GOTTLSOFF.  */
3130		r_type = R_FRV_GOTTLSOFFHI;
3131		howto  = elf32_frv_howto_table + r_type;
3132		rel->r_info = ELF32_R_INFO (r_symndx, r_type);
3133	      }
3134
3135	    break;
3136
3137	  case R_FRV_GOTTLSDESCLO:
3138	    insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
3139
3140	    /* Is this a setlo or setlos instruction?  */
3141	    if ((insn & (unsigned long)0x01f70000) != 0x00f40000)
3142	      {
3143		r = info->callbacks->warning
3144		  (info,
3145		   _("R_FRV_GOTTLSDESCLO"
3146		     " not applied to a setlo or setlos instruction"),
3147		   name, input_bfd, input_section, rel->r_offset);
3148		return FALSE;
3149	      }
3150
3151	    if (RELAX_TLSDESC_LOCAL_EXEC_P (info, picrel,
3152					    relocation + rel->r_addend)
3153		|| (RELAX_TLSDESC_INITIAL_EXEC_P (info, picrel)
3154		    && IN_RANGE_FOR_OFST12_P (picrel->tlsoff_entry)))
3155	      {
3156		/* Replace setlo/setlos with a nop.  Preserve the
3157		   packing bit.  */
3158		insn &= (unsigned long)0x80000000;
3159		insn |= (unsigned long)0x00880000;
3160		bfd_put_32 (input_bfd, insn, contents + rel->r_offset);
3161
3162		/* Nothing to relocate.  */
3163		continue;
3164	      }
3165
3166	    else if (RELAX_TLSDESC_INITIAL_EXEC_P (info, picrel))
3167	      {
3168		/* If the corresponding sethi (if it exists) decayed
3169		   to a nop, make sure this becomes (or already is) a
3170		   setlos, not setlo.  */
3171		if (IN_RANGE_FOR_SETLOS_P (picrel->tlsoff_entry))
3172		  {
3173		    insn |= (unsigned long)0x00080000;
3174		    bfd_put_32 (input_bfd, insn, contents + rel->r_offset);
3175		  }
3176
3177		/* Simply decay GOTTLSDESC to GOTTLSOFF.  */
3178		r_type = R_FRV_GOTTLSOFFLO;
3179		howto  = elf32_frv_howto_table + r_type;
3180		rel->r_info = ELF32_R_INFO (r_symndx, r_type);
3181	      }
3182
3183	    break;
3184
3185	  case R_FRV_TLSDESC_RELAX:
3186	    insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
3187
3188	    /* Is this an ldd instruction?  */
3189	    if ((insn & (unsigned long)0x01fc0fc0) != 0x00080140)
3190	      {
3191		r = info->callbacks->warning
3192		  (info,
3193		   _("R_FRV_TLSDESC_RELAX not applied to an ldd instruction"),
3194		   name, input_bfd, input_section, rel->r_offset);
3195		return FALSE;
3196	      }
3197
3198	    if (RELAX_TLSDESC_LOCAL_EXEC_P (info, picrel,
3199					    relocation + rel->r_addend)
3200		&& TLSMOFF_IN_RANGE_FOR_SETLOS_P (relocation + rel->r_addend,
3201						  info))
3202	      {
3203		/* Replace ldd #tlsdesc(symbol+offset)@(grB, grA), grC
3204		   with setlos #tlsmofflo(symbol+offset), gr<C+1>.
3205		   Preserve the packing bit.  */
3206		insn = (insn & (unsigned long)0x80000000)
3207		  | ((insn + (unsigned long)0x02000000)
3208		     & (unsigned long)0x7e000000);
3209		insn |= (unsigned long)0x00fc0000;
3210		bfd_put_32 (input_bfd, insn, contents + rel->r_offset);
3211
3212		r_type = R_FRV_TLSMOFFLO;
3213		howto  = elf32_frv_howto_table + r_type;
3214		rel->r_info = ELF32_R_INFO (r_symndx, r_type);
3215	      }
3216
3217	    else if (RELAX_TLSDESC_LOCAL_EXEC_P (info, picrel,
3218						 relocation + rel->r_addend))
3219	      {
3220		/* Replace ldd #tlsdesc(symbol+offset)@(grB, grA), grC
3221		   with sethi #tlsmoffhi(symbol+offset), gr<C+1>.
3222		   Preserve the packing bit.  */
3223		insn = (insn & (unsigned long)0x80000000)
3224		  | ((insn + (unsigned long)0x02000000)
3225		     & (unsigned long)0x7e000000);
3226		insn |= (unsigned long)0x00f80000;
3227		bfd_put_32 (input_bfd, insn, contents + rel->r_offset);
3228
3229		r_type = R_FRV_TLSMOFFHI;
3230		howto  = elf32_frv_howto_table + r_type;
3231		rel->r_info = ELF32_R_INFO (r_symndx, r_type);
3232	      }
3233
3234	    else if (RELAX_TLSDESC_INITIAL_EXEC_P (info, picrel)
3235		     && IN_RANGE_FOR_OFST12_P (picrel->tlsoff_entry))
3236	      {
3237		/* Replace ldd #tlsdesc(symbol+offset)@(grB, grA), grC
3238		   with ldi @(grB, #gottlsoff12(symbol+offset), gr<C+1>.
3239		   Preserve the packing bit.  */
3240		insn = (insn & (unsigned long)0x8003f000)
3241		  | (unsigned long)0x00c80000
3242		  | ((insn + (unsigned long)0x02000000)
3243		     & (unsigned long)0x7e000000);
3244		bfd_put_32 (input_bfd, insn, contents + rel->r_offset);
3245
3246		r_type = R_FRV_GOTTLSOFF12;
3247		howto  = elf32_frv_howto_table + r_type;
3248		rel->r_info = ELF32_R_INFO (r_symndx, r_type);
3249	      }
3250
3251	    else if (RELAX_TLSDESC_INITIAL_EXEC_P (info, picrel))
3252	      {
3253		/* Replace ldd #tlsdesc(symbol+offset)@(grB, grA), grC
3254		   with ld #tlsoff(symbol+offset)@(grB, grA), gr<C+1>.
3255		   Preserve the packing bit.  */
3256		insn = (insn & (unsigned long)0x81ffffbf)
3257		  | ((insn + (unsigned long)0x02000000)
3258		     & (unsigned long)0x7e000000);
3259		bfd_put_32 (input_bfd, insn, contents + rel->r_offset);
3260
3261		/* #tlsoff(symbol+offset) is just a relaxation
3262                    annotation, so there's nothing left to
3263                    relocate.  */
3264		continue;
3265	      }
3266
3267	    break;
3268
3269	  case R_FRV_GETTLSOFF_RELAX:
3270	    insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
3271
3272	    /* Is this a calll or callil instruction?  */
3273	    if ((insn & (unsigned long)0x7ff80fc0) != 0x02300000)
3274	      {
3275		r = info->callbacks->warning
3276		  (info,
3277		   _("R_FRV_GETTLSOFF_RELAX"
3278		     " not applied to a calll instruction"),
3279		   name, input_bfd, input_section, rel->r_offset);
3280		return FALSE;
3281	      }
3282
3283	    if (RELAX_TLSDESC_LOCAL_EXEC_P (info, picrel,
3284					    relocation + rel->r_addend)
3285		&& TLSMOFF_IN_RANGE_FOR_SETLOS_P (relocation + rel->r_addend,
3286						  info))
3287	      {
3288		/* Replace calll with a nop.  Preserve the packing bit.  */
3289		insn &= (unsigned long)0x80000000;
3290		insn |= (unsigned long)0x00880000;
3291		bfd_put_32 (input_bfd, insn, contents + rel->r_offset);
3292
3293		/* Nothing to relocate.  */
3294		continue;
3295	      }
3296
3297	    else if (RELAX_TLSDESC_LOCAL_EXEC_P (info, picrel,
3298						 relocation + rel->r_addend))
3299	      {
3300		/* Replace calll with setlo #tlsmofflo(symbol+offset), gr9.
3301		   Preserve the packing bit.  */
3302		insn &= (unsigned long)0x80000000;
3303		insn |= (unsigned long)0x12f40000;
3304		bfd_put_32 (input_bfd, insn, contents + rel->r_offset);
3305
3306		r_type = R_FRV_TLSMOFFLO;
3307		howto  = elf32_frv_howto_table + r_type;
3308		rel->r_info = ELF32_R_INFO (r_symndx, r_type);
3309	      }
3310
3311	    else if (RELAX_TLSDESC_INITIAL_EXEC_P (info, picrel))
3312	      {
3313		/* Replace calll with a nop.  Preserve the packing bit.  */
3314		insn &= (unsigned long)0x80000000;
3315		insn |= (unsigned long)0x00880000;
3316		bfd_put_32 (input_bfd, insn, contents + rel->r_offset);
3317
3318		/* Nothing to relocate.  */
3319		continue;
3320	      }
3321
3322	    break;
3323
3324	  case R_FRV_GOTTLSOFF12:
3325	    insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
3326
3327	    /* Is this an ldi instruction?  */
3328	    if ((insn & (unsigned long)0x01fc0000) != 0x00c80000)
3329	      {
3330		r = info->callbacks->warning
3331		  (info,
3332		   _("R_FRV_GOTTLSOFF12 not applied to an ldi instruction"),
3333		   name, input_bfd, input_section, rel->r_offset);
3334		return FALSE;
3335	      }
3336
3337	    if (RELAX_GOTTLSOFF_LOCAL_EXEC_P (info, picrel,
3338					      relocation + rel->r_addend))
3339	      {
3340		/* Replace ldi @(grB, #gottlsoff12(symbol+offset), grC
3341		   with setlos #tlsmofflo(symbol+offset), grC.
3342		   Preserve the packing bit.  */
3343		insn &= (unsigned long)0xfe000000;
3344		insn |= (unsigned long)0x00fc0000;
3345		bfd_put_32 (input_bfd, insn, contents + rel->r_offset);
3346
3347		r_type = R_FRV_TLSMOFFLO;
3348		howto  = elf32_frv_howto_table + r_type;
3349		rel->r_info = ELF32_R_INFO (r_symndx, r_type);
3350	      }
3351
3352	    break;
3353
3354	  case R_FRV_GOTTLSOFFHI:
3355	    insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
3356
3357	    /* Is this a sethi instruction?  */
3358	    if ((insn & (unsigned long)0x01ff0000) != 0x00f80000)
3359	      {
3360		r = info->callbacks->warning
3361		  (info,
3362		   _("R_FRV_GOTTLSOFFHI not applied to a sethi instruction"),
3363		   name, input_bfd, input_section, rel->r_offset);
3364		return FALSE;
3365	      }
3366
3367	    if (RELAX_GOTTLSOFF_LOCAL_EXEC_P (info, picrel,
3368					      relocation + rel->r_addend)
3369		|| (RELAX_TLSDESC_INITIAL_EXEC_P (info, picrel)
3370		    && IN_RANGE_FOR_OFST12_P (picrel->tlsoff_entry)))
3371	      {
3372		/* Replace sethi with a nop.  Preserve the packing bit.  */
3373		insn &= (unsigned long)0x80000000;
3374		insn |= (unsigned long)0x00880000;
3375		bfd_put_32 (input_bfd, insn, contents + rel->r_offset);
3376
3377		/* Nothing to relocate.  */
3378		continue;
3379	      }
3380
3381	    break;
3382
3383	  case R_FRV_GOTTLSOFFLO:
3384	    insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
3385
3386	    /* Is this a setlo or setlos instruction?  */
3387	    if ((insn & (unsigned long)0x01f70000) != 0x00f40000)
3388	      {
3389		r = info->callbacks->warning
3390		  (info,
3391		   _("R_FRV_GOTTLSOFFLO"
3392		     " not applied to a setlo or setlos instruction"),
3393		   name, input_bfd, input_section, rel->r_offset);
3394		return FALSE;
3395	      }
3396
3397	    if (RELAX_GOTTLSOFF_LOCAL_EXEC_P (info, picrel,
3398					      relocation + rel->r_addend)
3399		|| (RELAX_TLSDESC_INITIAL_EXEC_P (info, picrel)
3400		    && IN_RANGE_FOR_OFST12_P (picrel->tlsoff_entry)))
3401	      {
3402		/* Replace setlo/setlos with a nop.  Preserve the
3403		   packing bit.  */
3404		insn &= (unsigned long)0x80000000;
3405		insn |= (unsigned long)0x00880000;
3406		bfd_put_32 (input_bfd, insn, contents + rel->r_offset);
3407
3408		/* Nothing to relocate.  */
3409		continue;
3410	      }
3411
3412	    break;
3413
3414	  case R_FRV_TLSOFF_RELAX:
3415	    insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
3416
3417	    /* Is this an ld instruction?  */
3418	    if ((insn & (unsigned long)0x01fc0fc0) != 0x00080100)
3419	      {
3420		r = info->callbacks->warning
3421		  (info,
3422		   _("R_FRV_TLSOFF_RELAX not applied to an ld instruction"),
3423		   name, input_bfd, input_section, rel->r_offset);
3424		return FALSE;
3425	      }
3426
3427	    if (RELAX_GOTTLSOFF_LOCAL_EXEC_P (info, picrel,
3428					      relocation + rel->r_addend))
3429	      {
3430		/* Replace ld #gottlsoff(symbol+offset)@(grB, grA), grC
3431		   with setlos #tlsmofflo(symbol+offset), grC.
3432		   Preserve the packing bit.  */
3433		insn &= (unsigned long)0xfe000000;
3434		insn |= (unsigned long)0x00fc0000;
3435		bfd_put_32 (input_bfd, insn, contents + rel->r_offset);
3436
3437		r_type = R_FRV_TLSMOFFLO;
3438		howto  = elf32_frv_howto_table + r_type;
3439		rel->r_info = ELF32_R_INFO (r_symndx, r_type);
3440	      }
3441
3442	    else if (RELAX_TLSDESC_INITIAL_EXEC_P (info, picrel)
3443		     && IN_RANGE_FOR_OFST12_P (picrel->tlsoff_entry))
3444	      {
3445		/* Replace ld #tlsoff(symbol+offset)@(grB, grA), grC
3446		   with ldi @(grB, #gottlsoff12(symbol+offset), grC.
3447		   Preserve the packing bit.  */
3448		insn = (insn & (unsigned long)0xfe03f000)
3449		  | (unsigned long)0x00c80000;;
3450		bfd_put_32 (input_bfd, insn, contents + rel->r_offset);
3451
3452		r_type = R_FRV_GOTTLSOFF12;
3453		howto  = elf32_frv_howto_table + r_type;
3454		rel->r_info = ELF32_R_INFO (r_symndx, r_type);
3455	      }
3456
3457	    break;
3458
3459	  case R_FRV_TLSMOFFHI:
3460	    insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
3461
3462	    /* Is this a sethi instruction?  */
3463	    if ((insn & (unsigned long)0x01ff0000) != 0x00f80000)
3464	      {
3465		r = info->callbacks->warning
3466		  (info,
3467		   _("R_FRV_TLSMOFFHI not applied to a sethi instruction"),
3468		   name, input_bfd, input_section, rel->r_offset);
3469		return FALSE;
3470	      }
3471
3472	    if (TLSMOFF_IN_RANGE_FOR_SETLOS_P (relocation + rel->r_addend,
3473					       info))
3474	      {
3475		/* Replace sethi with a nop.  Preserve the packing bit.  */
3476		insn &= (unsigned long)0x80000000;
3477		insn |= (unsigned long)0x00880000;
3478		bfd_put_32 (input_bfd, insn, contents + rel->r_offset);
3479
3480		/* Nothing to relocate.  */
3481		continue;
3482	      }
3483
3484	    break;
3485
3486	  case R_FRV_TLSMOFFLO:
3487	    insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
3488
3489	    /* Is this a setlo or setlos instruction?  */
3490	    if ((insn & (unsigned long)0x01f70000) != 0x00f40000)
3491	      {
3492		r = info->callbacks->warning
3493		  (info,
3494		   _("R_FRV_TLSMOFFLO"
3495		     " not applied to a setlo or setlos instruction"),
3496		   name, input_bfd, input_section, rel->r_offset);
3497		return FALSE;
3498	      }
3499
3500	    if (TLSMOFF_IN_RANGE_FOR_SETLOS_P (relocation + rel->r_addend,
3501					       info))
3502	      /* If the corresponding sethi (if it exists) decayed
3503		 to a nop, make sure this becomes (or already is) a
3504		 setlos, not setlo.  */
3505	      {
3506		insn |= (unsigned long)0x00080000;
3507		bfd_put_32 (input_bfd, insn, contents + rel->r_offset);
3508	      }
3509
3510	    break;
3511
3512	    /*
3513	      There's nothing to relax in these:
3514		R_FRV_TLSDESC_VALUE
3515		R_FRV_TLSOFF
3516		R_FRV_TLSMOFF12
3517		R_FRV_TLSMOFFHI
3518		R_FRV_TLSMOFFLO
3519		R_FRV_TLSMOFF
3520	    */
3521
3522	  default:
3523	    break;
3524	  }
3525
3526      switch (r_type)
3527	{
3528	case R_FRV_LABEL24:
3529	  check_segment[0] = isec_segment;
3530	  if (! IS_FDPIC (output_bfd))
3531	    check_segment[1] = isec_segment;
3532	  else if (picrel->plt)
3533	    {
3534	      relocation = frvfdpic_plt_section (info)->output_section->vma
3535		+ frvfdpic_plt_section (info)->output_offset
3536		+ picrel->plt_entry;
3537	      check_segment[1] = plt_segment;
3538	    }
3539	  /* We don't want to warn on calls to undefined weak symbols,
3540	     as calls to them must be protected by non-NULL tests
3541	     anyway, and unprotected calls would invoke undefined
3542	     behavior.  */
3543	  else if (picrel->symndx == -1
3544		   && picrel->d.h->root.type == bfd_link_hash_undefweak)
3545	    check_segment[1] = check_segment[0];
3546	  else
3547	    check_segment[1] = sec
3548	      ? _frvfdpic_osec_to_segment (output_bfd, sec->output_section)
3549	      : (unsigned)-1;
3550	  break;
3551
3552	case R_FRV_GOT12:
3553	case R_FRV_GOTHI:
3554	case R_FRV_GOTLO:
3555	  relocation = picrel->got_entry;
3556	  check_segment[0] = check_segment[1] = got_segment;
3557	  break;
3558
3559	case R_FRV_FUNCDESC_GOT12:
3560	case R_FRV_FUNCDESC_GOTHI:
3561	case R_FRV_FUNCDESC_GOTLO:
3562	  relocation = picrel->fdgot_entry;
3563	  check_segment[0] = check_segment[1] = got_segment;
3564	  break;
3565
3566	case R_FRV_GOTOFFHI:
3567	case R_FRV_GOTOFF12:
3568	case R_FRV_GOTOFFLO:
3569	  relocation -= frvfdpic_got_section (info)->output_section->vma
3570	    + frvfdpic_got_section (info)->output_offset
3571	    + frvfdpic_got_initial_offset (info);
3572	  check_segment[0] = got_segment;
3573	  check_segment[1] = sec
3574	    ? _frvfdpic_osec_to_segment (output_bfd, sec->output_section)
3575	    : (unsigned)-1;
3576	  break;
3577
3578	case R_FRV_FUNCDESC_GOTOFF12:
3579	case R_FRV_FUNCDESC_GOTOFFHI:
3580	case R_FRV_FUNCDESC_GOTOFFLO:
3581	  relocation = picrel->fd_entry;
3582	  check_segment[0] = check_segment[1] = got_segment;
3583	  break;
3584
3585	case R_FRV_FUNCDESC:
3586	  {
3587	    int dynindx;
3588	    bfd_vma addend = rel->r_addend;
3589
3590	    if (! (h && h->root.type == bfd_link_hash_undefweak
3591		   && FRVFDPIC_SYM_LOCAL (info, h)))
3592	      {
3593		/* If the symbol is dynamic and there may be dynamic
3594		   symbol resolution because we are or are linked with a
3595		   shared library, emit a FUNCDESC relocation such that
3596		   the dynamic linker will allocate the function
3597		   descriptor.  If the symbol needs a non-local function
3598		   descriptor but binds locally (e.g., its visibility is
3599		   protected, emit a dynamic relocation decayed to
3600		   section+offset.  */
3601		if (h && ! FRVFDPIC_FUNCDESC_LOCAL (info, h)
3602		    && FRVFDPIC_SYM_LOCAL (info, h)
3603		    && !(info->executable && !info->pie))
3604		  {
3605		    dynindx = elf_section_data (h->root.u.def.section
3606						->output_section)->dynindx;
3607		    addend += h->root.u.def.section->output_offset
3608		      + h->root.u.def.value;
3609		  }
3610		else if (h && ! FRVFDPIC_FUNCDESC_LOCAL (info, h))
3611		  {
3612		    if (addend)
3613		      {
3614			info->callbacks->warning
3615			  (info, _("R_FRV_FUNCDESC references dynamic symbol with nonzero addend"),
3616			   name, input_bfd, input_section, rel->r_offset);
3617			return FALSE;
3618		      }
3619		    dynindx = h->dynindx;
3620		  }
3621		else
3622		  {
3623		    /* Otherwise, we know we have a private function
3624		       descriptor, so reference it directly.  */
3625		    BFD_ASSERT (picrel->privfd);
3626		    r_type = R_FRV_32;
3627		    dynindx = elf_section_data (frvfdpic_got_section (info)
3628						->output_section)->dynindx;
3629		    addend = frvfdpic_got_section (info)->output_offset
3630		      + frvfdpic_got_initial_offset (info)
3631		      + picrel->fd_entry;
3632		  }
3633
3634		/* If there is room for dynamic symbol resolution, emit
3635		   the dynamic relocation.  However, if we're linking an
3636		   executable at a fixed location, we won't have emitted a
3637		   dynamic symbol entry for the got section, so idx will
3638		   be zero, which means we can and should compute the
3639		   address of the private descriptor ourselves.  */
3640		if (info->executable && !info->pie
3641		    && (!h || FRVFDPIC_FUNCDESC_LOCAL (info, h)))
3642		  {
3643		    addend += frvfdpic_got_section (info)->output_section->vma;
3644		    if ((bfd_get_section_flags (output_bfd,
3645						input_section->output_section)
3646			 & (SEC_ALLOC | SEC_LOAD)) == (SEC_ALLOC | SEC_LOAD))
3647		      {
3648			if (_frvfdpic_osec_readonly_p (output_bfd,
3649						       input_section
3650						       ->output_section))
3651			  {
3652			    info->callbacks->warning
3653			      (info,
3654			       _("cannot emit fixups in read-only section"),
3655			       name, input_bfd, input_section, rel->r_offset);
3656			    return FALSE;
3657			  }
3658			_frvfdpic_add_rofixup (output_bfd,
3659					       frvfdpic_gotfixup_section
3660					       (info),
3661					       _bfd_elf_section_offset
3662					       (output_bfd, info,
3663						input_section, rel->r_offset)
3664					       + input_section
3665					       ->output_section->vma
3666					       + input_section->output_offset,
3667					       picrel);
3668		      }
3669		  }
3670		else if ((bfd_get_section_flags (output_bfd,
3671						 input_section->output_section)
3672			  & (SEC_ALLOC | SEC_LOAD)) == (SEC_ALLOC | SEC_LOAD))
3673		  {
3674		    if (_frvfdpic_osec_readonly_p (output_bfd,
3675						   input_section
3676						   ->output_section))
3677		      {
3678			info->callbacks->warning
3679			  (info,
3680			   _("cannot emit dynamic relocations in read-only section"),
3681			   name, input_bfd, input_section, rel->r_offset);
3682			return FALSE;
3683		      }
3684		    _frvfdpic_add_dyn_reloc (output_bfd,
3685					     frvfdpic_gotrel_section (info),
3686					     _bfd_elf_section_offset
3687					     (output_bfd, info,
3688					      input_section, rel->r_offset)
3689					     + input_section
3690					     ->output_section->vma
3691					     + input_section->output_offset,
3692					     r_type, dynindx, addend, picrel);
3693		  }
3694		else
3695		  addend += frvfdpic_got_section (info)->output_section->vma;
3696	      }
3697
3698	    /* We want the addend in-place because dynamic
3699	       relocations are REL.  Setting relocation to it should
3700	       arrange for it to be installed.  */
3701	    relocation = addend - rel->r_addend;
3702	  }
3703	  check_segment[0] = check_segment[1] = got_segment;
3704	  break;
3705
3706	case R_FRV_32:
3707	  if (! IS_FDPIC (output_bfd))
3708	    {
3709	      check_segment[0] = check_segment[1] = -1;
3710	      break;
3711	    }
3712	  /* Fall through.  */
3713	case R_FRV_FUNCDESC_VALUE:
3714	  {
3715	    int dynindx;
3716	    bfd_vma addend = rel->r_addend;
3717
3718	    /* If the symbol is dynamic but binds locally, use
3719	       section+offset.  */
3720	    if (h && ! FRVFDPIC_SYM_LOCAL (info, h))
3721	      {
3722		if (addend && r_type == R_FRV_FUNCDESC_VALUE)
3723		  {
3724		    info->callbacks->warning
3725		      (info, _("R_FRV_FUNCDESC_VALUE references dynamic symbol with nonzero addend"),
3726		       name, input_bfd, input_section, rel->r_offset);
3727		    return FALSE;
3728		  }
3729		dynindx = h->dynindx;
3730	      }
3731	    else
3732	      {
3733		if (h)
3734		  addend += h->root.u.def.value;
3735		else
3736		  addend += sym->st_value;
3737		if (osec)
3738		  addend += osec->output_offset;
3739		if (osec && osec->output_section
3740		    && ! bfd_is_abs_section (osec->output_section)
3741		    && ! bfd_is_und_section (osec->output_section))
3742		  dynindx = elf_section_data (osec->output_section)->dynindx;
3743		else
3744		  dynindx = 0;
3745	      }
3746
3747	    /* If we're linking an executable at a fixed address, we
3748	       can omit the dynamic relocation as long as the symbol
3749	       is defined in the current link unit (which is implied
3750	       by its output section not being NULL).  */
3751	    if (info->executable && !info->pie
3752		&& (!h || FRVFDPIC_SYM_LOCAL (info, h)))
3753	      {
3754		if (osec)
3755		  addend += osec->output_section->vma;
3756		if (IS_FDPIC (input_bfd)
3757		    && (bfd_get_section_flags (output_bfd,
3758					       input_section->output_section)
3759			& (SEC_ALLOC | SEC_LOAD)) == (SEC_ALLOC | SEC_LOAD))
3760		  {
3761		    if (_frvfdpic_osec_readonly_p (output_bfd,
3762						   input_section
3763						   ->output_section))
3764		      {
3765			info->callbacks->warning
3766			  (info,
3767			   _("cannot emit fixups in read-only section"),
3768			   name, input_bfd, input_section, rel->r_offset);
3769			return FALSE;
3770		      }
3771		    if (!h || h->root.type != bfd_link_hash_undefweak)
3772		      {
3773			_frvfdpic_add_rofixup (output_bfd,
3774					       frvfdpic_gotfixup_section
3775					       (info),
3776					       _bfd_elf_section_offset
3777					       (output_bfd, info,
3778						input_section, rel->r_offset)
3779					       + input_section
3780					       ->output_section->vma
3781					       + input_section->output_offset,
3782					       picrel);
3783			if (r_type == R_FRV_FUNCDESC_VALUE)
3784			  _frvfdpic_add_rofixup
3785			    (output_bfd,
3786			     frvfdpic_gotfixup_section (info),
3787			     _bfd_elf_section_offset
3788			     (output_bfd, info,
3789			      input_section, rel->r_offset)
3790			     + input_section->output_section->vma
3791			     + input_section->output_offset + 4, picrel);
3792		      }
3793		  }
3794	      }
3795	    else
3796	      {
3797		if ((bfd_get_section_flags (output_bfd,
3798					    input_section->output_section)
3799		     & (SEC_ALLOC | SEC_LOAD)) == (SEC_ALLOC | SEC_LOAD))
3800		  {
3801		    if (_frvfdpic_osec_readonly_p (output_bfd,
3802						   input_section
3803						   ->output_section))
3804		      {
3805			info->callbacks->warning
3806			  (info,
3807			   _("cannot emit dynamic relocations in read-only section"),
3808			   name, input_bfd, input_section, rel->r_offset);
3809			return FALSE;
3810		      }
3811		    _frvfdpic_add_dyn_reloc (output_bfd,
3812					     frvfdpic_gotrel_section (info),
3813					     _bfd_elf_section_offset
3814					     (output_bfd, info,
3815					      input_section, rel->r_offset)
3816					     + input_section
3817					     ->output_section->vma
3818					     + input_section->output_offset,
3819					     r_type, dynindx, addend, picrel);
3820		  }
3821		else if (osec)
3822		  addend += osec->output_section->vma;
3823		/* We want the addend in-place because dynamic
3824		   relocations are REL.  Setting relocation to it
3825		   should arrange for it to be installed.  */
3826		relocation = addend - rel->r_addend;
3827	      }
3828
3829	    if (r_type == R_FRV_FUNCDESC_VALUE)
3830	      {
3831		/* If we've omitted the dynamic relocation, just emit
3832		   the fixed addresses of the symbol and of the local
3833		   GOT base offset.  */
3834		if (info->executable && !info->pie
3835		    && (!h || FRVFDPIC_SYM_LOCAL (info, h)))
3836		  bfd_put_32 (output_bfd,
3837			      frvfdpic_got_section (info)->output_section->vma
3838			      + frvfdpic_got_section (info)->output_offset
3839			      + frvfdpic_got_initial_offset (info),
3840			      contents + rel->r_offset + 4);
3841		else
3842		  /* A function descriptor used for lazy or local
3843		     resolving is initialized such that its high word
3844		     contains the output section index in which the
3845		     PLT entries are located, and the low word
3846		     contains the offset of the lazy PLT entry entry
3847		     point into that section.  */
3848		  bfd_put_32 (output_bfd,
3849			      h && ! FRVFDPIC_SYM_LOCAL (info, h)
3850			      ? 0
3851			      : _frvfdpic_osec_to_segment (output_bfd,
3852							   sec
3853							   ->output_section),
3854			      contents + rel->r_offset + 4);
3855	      }
3856	  }
3857	  check_segment[0] = check_segment[1] = got_segment;
3858	  break;
3859
3860	case R_FRV_GPREL12:
3861	case R_FRV_GPRELU12:
3862	case R_FRV_GPREL32:
3863	case R_FRV_GPRELHI:
3864	case R_FRV_GPRELLO:
3865	  check_segment[0] = gprel_segment;
3866	  check_segment[1] = sec
3867	    ? _frvfdpic_osec_to_segment (output_bfd, sec->output_section)
3868	    : (unsigned)-1;
3869	  break;
3870
3871	case R_FRV_GETTLSOFF:
3872	  relocation = frvfdpic_plt_section (info)->output_section->vma
3873	    + frvfdpic_plt_section (info)->output_offset
3874	    + picrel->tlsplt_entry;
3875	  BFD_ASSERT (picrel->tlsplt_entry != (bfd_vma)-1
3876		      && picrel->tlsdesc_entry);
3877	  check_segment[0] = isec_segment;
3878	  check_segment[1] = plt_segment;
3879	  break;
3880
3881	case R_FRV_GOTTLSDESC12:
3882	case R_FRV_GOTTLSDESCHI:
3883	case R_FRV_GOTTLSDESCLO:
3884	  BFD_ASSERT (picrel->tlsdesc_entry);
3885	  relocation = picrel->tlsdesc_entry;
3886	  check_segment[0] = tls_segment;
3887	  check_segment[1] = sec
3888	    && ! bfd_is_abs_section (sec)
3889	    && ! bfd_is_und_section (sec)
3890	    ? _frvfdpic_osec_to_segment (output_bfd, sec->output_section)
3891	    : tls_segment;
3892	  break;
3893
3894	case R_FRV_TLSMOFF12:
3895	case R_FRV_TLSMOFFHI:
3896	case R_FRV_TLSMOFFLO:
3897	case R_FRV_TLSMOFF:
3898	  check_segment[0] = tls_segment;
3899	  if (! sec)
3900	    check_segment[1] = -1;
3901	  else if (bfd_is_abs_section (sec)
3902		   || bfd_is_und_section (sec))
3903	    {
3904	      relocation = 0;
3905	      check_segment[1] = tls_segment;
3906	    }
3907	  else if (sec->output_section)
3908	    {
3909	      relocation -= tls_biased_base (info);
3910	      check_segment[1] =
3911		_frvfdpic_osec_to_segment (output_bfd, sec->output_section);
3912	    }
3913	  else
3914	    check_segment[1] = -1;
3915	  break;
3916
3917	case R_FRV_GOTTLSOFF12:
3918	case R_FRV_GOTTLSOFFHI:
3919	case R_FRV_GOTTLSOFFLO:
3920	  BFD_ASSERT (picrel->tlsoff_entry);
3921	  relocation = picrel->tlsoff_entry;
3922	  check_segment[0] = tls_segment;
3923	  check_segment[1] = sec
3924	    && ! bfd_is_abs_section (sec)
3925	    && ! bfd_is_und_section (sec)
3926	    ? _frvfdpic_osec_to_segment (output_bfd, sec->output_section)
3927	    : tls_segment;
3928	  break;
3929
3930	case R_FRV_TLSDESC_VALUE:
3931	case R_FRV_TLSOFF:
3932	  /* These shouldn't be present in input object files.  */
3933	  check_segment[0] = check_segment[1] = isec_segment;
3934	  break;
3935
3936	case R_FRV_TLSDESC_RELAX:
3937	case R_FRV_GETTLSOFF_RELAX:
3938	case R_FRV_TLSOFF_RELAX:
3939	  /* These are just annotations for relaxation, nothing to do
3940	     here.  */
3941	  continue;
3942
3943	default:
3944	  check_segment[0] = isec_segment;
3945	  check_segment[1] = sec
3946	    ? _frvfdpic_osec_to_segment (output_bfd, sec->output_section)
3947	    : (unsigned)-1;
3948	  break;
3949	}
3950
3951      if (check_segment[0] != check_segment[1] && IS_FDPIC (output_bfd))
3952	{
3953	  /* If you take this out, remove the #error from fdpic-static-6.d
3954	     in the ld testsuite.  */
3955	  /* This helps catch problems in GCC while we can't do more
3956	     than static linking.  The idea is to test whether the
3957	     input file basename is crt0.o only once.  */
3958	  if (silence_segment_error == 1)
3959	    silence_segment_error =
3960	      (strlen (input_bfd->filename) == 6
3961	       && strcmp (input_bfd->filename, "crt0.o") == 0)
3962	      || (strlen (input_bfd->filename) > 6
3963		  && strcmp (input_bfd->filename
3964			     + strlen (input_bfd->filename) - 7,
3965			     "/crt0.o") == 0)
3966	      ? -1 : 0;
3967	  if (!silence_segment_error
3968	      /* We don't want duplicate errors for undefined
3969		 symbols.  */
3970	      && !(picrel && picrel->symndx == -1
3971		   && picrel->d.h->root.type == bfd_link_hash_undefined))
3972	    {
3973	      if (info->shared || info->pie)
3974		(*_bfd_error_handler)
3975		  (_("%B(%A+0x%lx): reloc against `%s': %s"),
3976		   input_bfd, input_section, (long)rel->r_offset, name,
3977		   _("relocation references a different segment"));
3978	      else
3979		info->callbacks->warning
3980		  (info,
3981		   _("relocation references a different segment"),
3982		   name, input_bfd, input_section, rel->r_offset);
3983	    }
3984	  if (!silence_segment_error && (info->shared || info->pie))
3985	    return FALSE;
3986	  elf_elfheader (output_bfd)->e_flags |= EF_FRV_PIC;
3987	}
3988
3989      switch (r_type)
3990	{
3991	case R_FRV_GOTOFFHI:
3992	case R_FRV_TLSMOFFHI:
3993	  /* We need the addend to be applied before we shift the
3994	     value right.  */
3995	  relocation += rel->r_addend;
3996	  /* Fall through.  */
3997	case R_FRV_GOTHI:
3998	case R_FRV_FUNCDESC_GOTHI:
3999	case R_FRV_FUNCDESC_GOTOFFHI:
4000	case R_FRV_GOTTLSOFFHI:
4001	case R_FRV_GOTTLSDESCHI:
4002	  relocation >>= 16;
4003	  /* Fall through.  */
4004
4005	case R_FRV_GOTLO:
4006	case R_FRV_FUNCDESC_GOTLO:
4007	case R_FRV_GOTOFFLO:
4008	case R_FRV_FUNCDESC_GOTOFFLO:
4009	case R_FRV_GOTTLSOFFLO:
4010	case R_FRV_GOTTLSDESCLO:
4011	case R_FRV_TLSMOFFLO:
4012	  relocation &= 0xffff;
4013	  break;
4014
4015	default:
4016	  break;
4017	}
4018
4019      switch (r_type)
4020	{
4021	case R_FRV_LABEL24:
4022	  if (! IS_FDPIC (output_bfd) || ! picrel->plt)
4023	    break;
4024	  /* Fall through.  */
4025
4026	  /* When referencing a GOT entry, a function descriptor or a
4027	     PLT, we don't want the addend to apply to the reference,
4028	     but rather to the referenced symbol.  The actual entry
4029	     will have already been created taking the addend into
4030	     account, so cancel it out here.  */
4031	case R_FRV_GOT12:
4032	case R_FRV_GOTHI:
4033	case R_FRV_GOTLO:
4034	case R_FRV_FUNCDESC_GOT12:
4035	case R_FRV_FUNCDESC_GOTHI:
4036	case R_FRV_FUNCDESC_GOTLO:
4037	case R_FRV_FUNCDESC_GOTOFF12:
4038	case R_FRV_FUNCDESC_GOTOFFHI:
4039	case R_FRV_FUNCDESC_GOTOFFLO:
4040	case R_FRV_GETTLSOFF:
4041	case R_FRV_GOTTLSDESC12:
4042	case R_FRV_GOTTLSDESCHI:
4043	case R_FRV_GOTTLSDESCLO:
4044	case R_FRV_GOTTLSOFF12:
4045	case R_FRV_GOTTLSOFFHI:
4046	case R_FRV_GOTTLSOFFLO:
4047	  /* Note that we only want GOTOFFHI, not GOTOFFLO or GOTOFF12
4048	     here, since we do want to apply the addend to the others.
4049	     Note that we've applied the addend to GOTOFFHI before we
4050	     shifted it right.  */
4051	case R_FRV_GOTOFFHI:
4052	case R_FRV_TLSMOFFHI:
4053	  relocation -= rel->r_addend;
4054	  break;
4055
4056	default:
4057	  break;
4058	}
4059
4060     if (r_type == R_FRV_HI16)
4061       r = elf32_frv_relocate_hi16 (input_bfd, rel, contents, relocation);
4062
4063     else if (r_type == R_FRV_LO16)
4064       r = elf32_frv_relocate_lo16 (input_bfd, rel, contents, relocation);
4065
4066     else if (r_type == R_FRV_LABEL24 || r_type == R_FRV_GETTLSOFF)
4067       r = elf32_frv_relocate_label24 (input_bfd, input_section, rel,
4068				       contents, relocation);
4069
4070     else if (r_type == R_FRV_GPREL12)
4071       r = elf32_frv_relocate_gprel12 (info, input_bfd, input_section, rel,
4072				       contents, relocation);
4073
4074     else if (r_type == R_FRV_GPRELU12)
4075       r = elf32_frv_relocate_gprelu12 (info, input_bfd, input_section, rel,
4076					contents, relocation);
4077
4078     else if (r_type == R_FRV_GPRELLO)
4079       r = elf32_frv_relocate_gprello (info, input_bfd, input_section, rel,
4080				       contents, relocation);
4081
4082     else if (r_type == R_FRV_GPRELHI)
4083       r = elf32_frv_relocate_gprelhi (info, input_bfd, input_section, rel,
4084				       contents, relocation);
4085
4086     else if (r_type == R_FRV_TLSOFF
4087	      || r_type == R_FRV_TLSDESC_VALUE)
4088       r = bfd_reloc_notsupported;
4089
4090     else
4091       r = frv_final_link_relocate (howto, input_bfd, input_section, contents,
4092				    rel, relocation);
4093
4094      if (r != bfd_reloc_ok)
4095	{
4096	  const char * msg = (const char *) NULL;
4097
4098	  switch (r)
4099	    {
4100	    case bfd_reloc_overflow:
4101	      r = info->callbacks->reloc_overflow
4102		(info, (h ? &h->root : NULL), name, howto->name,
4103		 (bfd_vma) 0, input_bfd, input_section, rel->r_offset);
4104	      break;
4105
4106	    case bfd_reloc_undefined:
4107	      r = info->callbacks->undefined_symbol
4108		(info, name, input_bfd, input_section, rel->r_offset, TRUE);
4109	      break;
4110
4111	    case bfd_reloc_outofrange:
4112	      msg = _("internal error: out of range error");
4113	      break;
4114
4115	    case bfd_reloc_notsupported:
4116	      msg = _("internal error: unsupported relocation error");
4117	      break;
4118
4119	    case bfd_reloc_dangerous:
4120	      msg = _("internal error: dangerous relocation");
4121	      break;
4122
4123	    default:
4124	      msg = _("internal error: unknown error");
4125	      break;
4126	    }
4127
4128	  if (msg)
4129	    {
4130	      (*_bfd_error_handler)
4131		(_("%B(%A+0x%lx): reloc against `%s': %s"),
4132		 input_bfd, input_section, (long)rel->r_offset, name, msg);
4133	      return FALSE;
4134	    }
4135
4136	  if (! r)
4137	    return FALSE;
4138	}
4139    }
4140
4141  return TRUE;
4142}
4143
4144/* Return the section that should be marked against GC for a given
4145   relocation.  */
4146
4147static asection *
4148elf32_frv_gc_mark_hook (sec, info, rel, h, sym)
4149     asection *sec;
4150     struct bfd_link_info *info ATTRIBUTE_UNUSED;
4151     Elf_Internal_Rela *rel;
4152     struct elf_link_hash_entry *h;
4153     Elf_Internal_Sym *sym;
4154{
4155  if (h != NULL)
4156    {
4157      switch (ELF32_R_TYPE (rel->r_info))
4158	{
4159	case R_FRV_GNU_VTINHERIT:
4160	case R_FRV_GNU_VTENTRY:
4161	  break;
4162
4163	default:
4164	  switch (h->root.type)
4165	    {
4166	    default:
4167	      break;
4168
4169	    case bfd_link_hash_defined:
4170	    case bfd_link_hash_defweak:
4171	      return h->root.u.def.section;
4172
4173	    case bfd_link_hash_common:
4174	      return h->root.u.c.p->section;
4175	    }
4176	}
4177    }
4178  else
4179    return bfd_section_from_elf_index (sec->owner, sym->st_shndx);
4180
4181  return NULL;
4182}
4183
4184/* Update the got entry reference counts for the section being removed.  */
4185
4186static bfd_boolean
4187elf32_frv_gc_sweep_hook (abfd, info, sec, relocs)
4188     bfd *abfd ATTRIBUTE_UNUSED;
4189     struct bfd_link_info *info ATTRIBUTE_UNUSED;
4190     asection *sec ATTRIBUTE_UNUSED;
4191     const Elf_Internal_Rela *relocs ATTRIBUTE_UNUSED;
4192{
4193  return TRUE;
4194}
4195
4196
4197/* Hook called by the linker routine which adds symbols from an object
4198   file.  We use it to put .comm items in .scomm, and not .comm.  */
4199
4200static bfd_boolean
4201elf32_frv_add_symbol_hook (abfd, info, sym, namep, flagsp, secp, valp)
4202     bfd *abfd;
4203     struct bfd_link_info *info;
4204     Elf_Internal_Sym *sym;
4205     const char **namep ATTRIBUTE_UNUSED;
4206     flagword *flagsp ATTRIBUTE_UNUSED;
4207     asection **secp;
4208     bfd_vma *valp;
4209{
4210  if (sym->st_shndx == SHN_COMMON
4211      && !info->relocatable
4212      && (int)sym->st_size <= (int)bfd_get_gp_size (abfd))
4213    {
4214      /* Common symbols less than or equal to -G nn bytes are
4215	 automatically put into .sbss.  */
4216
4217      asection *scomm = bfd_get_section_by_name (abfd, ".scommon");
4218
4219      if (scomm == NULL)
4220	{
4221	  scomm = bfd_make_section_with_flags (abfd, ".scommon",
4222					       (SEC_ALLOC
4223						| SEC_IS_COMMON
4224						| SEC_LINKER_CREATED));
4225	  if (scomm == NULL)
4226	    return FALSE;
4227	}
4228
4229      *secp = scomm;
4230      *valp = sym->st_size;
4231    }
4232
4233  return TRUE;
4234}
4235
4236/* We need dynamic symbols for every section, since segments can
4237   relocate independently.  */
4238static bfd_boolean
4239_frvfdpic_link_omit_section_dynsym (bfd *output_bfd ATTRIBUTE_UNUSED,
4240				    struct bfd_link_info *info
4241				    ATTRIBUTE_UNUSED,
4242				    asection *p ATTRIBUTE_UNUSED)
4243{
4244  switch (elf_section_data (p)->this_hdr.sh_type)
4245    {
4246    case SHT_PROGBITS:
4247    case SHT_NOBITS:
4248      /* If sh_type is yet undecided, assume it could be
4249	 SHT_PROGBITS/SHT_NOBITS.  */
4250    case SHT_NULL:
4251      return FALSE;
4252
4253      /* There shouldn't be section relative relocations
4254	 against any other section.  */
4255    default:
4256      return TRUE;
4257    }
4258}
4259
4260/* Create  a .got section, as well as its additional info field.  This
4261   is almost entirely copied from
4262   elflink.c:_bfd_elf_create_got_section().  */
4263
4264static bfd_boolean
4265_frv_create_got_section (bfd *abfd, struct bfd_link_info *info)
4266{
4267  flagword flags, pltflags;
4268  asection *s;
4269  struct elf_link_hash_entry *h;
4270  struct bfd_link_hash_entry *bh;
4271  const struct elf_backend_data *bed = get_elf_backend_data (abfd);
4272  int ptralign;
4273  int offset;
4274
4275  /* This function may be called more than once.  */
4276  s = bfd_get_section_by_name (abfd, ".got");
4277  if (s != NULL && (s->flags & SEC_LINKER_CREATED) != 0)
4278    return TRUE;
4279
4280  /* Machine specific: although pointers are 32-bits wide, we want the
4281     GOT to be aligned to a 64-bit boundary, such that function
4282     descriptors in it can be accessed with 64-bit loads and
4283     stores.  */
4284  ptralign = 3;
4285
4286  flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
4287	   | SEC_LINKER_CREATED);
4288  pltflags = flags;
4289
4290  s = bfd_make_section_with_flags (abfd, ".got", flags);
4291  if (s == NULL
4292      || !bfd_set_section_alignment (abfd, s, ptralign))
4293    return FALSE;
4294
4295  if (bed->want_got_plt)
4296    {
4297      s = bfd_make_section_with_flags (abfd, ".got.plt", flags);
4298      if (s == NULL
4299	  || !bfd_set_section_alignment (abfd, s, ptralign))
4300	return FALSE;
4301    }
4302
4303  if (bed->want_got_sym)
4304    {
4305      /* Define the symbol _GLOBAL_OFFSET_TABLE_ at the start of the .got
4306	 (or .got.plt) section.  We don't do this in the linker script
4307	 because we don't want to define the symbol if we are not creating
4308	 a global offset table.  */
4309      h = _bfd_elf_define_linkage_sym (abfd, info, s, "_GLOBAL_OFFSET_TABLE_");
4310      elf_hash_table (info)->hgot = h;
4311      if (h == NULL)
4312	return FALSE;
4313
4314      /* Machine-specific: we want the symbol for executables as
4315	 well.  */
4316      if (! bfd_elf_link_record_dynamic_symbol (info, h))
4317	return FALSE;
4318    }
4319
4320  /* The first bit of the global offset table is the header.  */
4321  s->size += bed->got_header_size;
4322
4323  /* This is the machine-specific part.  Create and initialize section
4324     data for the got.  */
4325  if (IS_FDPIC (abfd))
4326    {
4327      frvfdpic_got_section (info) = s;
4328      frvfdpic_relocs_info (info) = htab_try_create (1,
4329						     frvfdpic_relocs_info_hash,
4330						     frvfdpic_relocs_info_eq,
4331						     (htab_del) NULL);
4332      if (! frvfdpic_relocs_info (info))
4333	return FALSE;
4334
4335      s = bfd_make_section_with_flags (abfd, ".rel.got",
4336				       (flags | SEC_READONLY));
4337      if (s == NULL
4338	  || ! bfd_set_section_alignment (abfd, s, 2))
4339	return FALSE;
4340
4341      frvfdpic_gotrel_section (info) = s;
4342
4343      /* Machine-specific.  */
4344      s = bfd_make_section_with_flags (abfd, ".rofixup",
4345				       (flags | SEC_READONLY));
4346      if (s == NULL
4347	  || ! bfd_set_section_alignment (abfd, s, 2))
4348	return FALSE;
4349
4350      frvfdpic_gotfixup_section (info) = s;
4351      offset = -2048;
4352      flags = BSF_GLOBAL;
4353    }
4354  else
4355    {
4356      offset = 2048;
4357      flags = BSF_GLOBAL | BSF_WEAK;
4358    }
4359
4360  /* Define _gp in .rofixup, for FDPIC, or .got otherwise.  If it
4361     turns out that we're linking with a different linker script, the
4362     linker script will override it.  */
4363  bh = NULL;
4364  if (!(_bfd_generic_link_add_one_symbol
4365	(info, abfd, "_gp", flags, s, offset, (const char *) NULL, FALSE,
4366	 bed->collect, &bh)))
4367    return FALSE;
4368  h = (struct elf_link_hash_entry *) bh;
4369  h->def_regular = 1;
4370  h->type = STT_OBJECT;
4371  /* h->other = STV_HIDDEN; */ /* Should we?  */
4372
4373  /* Machine-specific: we want the symbol for executables as well.  */
4374  if (IS_FDPIC (abfd) && ! bfd_elf_link_record_dynamic_symbol (info, h))
4375    return FALSE;
4376
4377  if (!IS_FDPIC (abfd))
4378    return TRUE;
4379
4380  /* FDPIC supports Thread Local Storage, and this may require a
4381     procedure linkage table for TLS PLT entries.  */
4382
4383  /* This is mostly copied from
4384     elflink.c:_bfd_elf_create_dynamic_sections().  */
4385
4386  flags = pltflags;
4387  pltflags |= SEC_CODE;
4388  if (bed->plt_not_loaded)
4389    pltflags &= ~ (SEC_CODE | SEC_LOAD | SEC_HAS_CONTENTS);
4390  if (bed->plt_readonly)
4391    pltflags |= SEC_READONLY;
4392
4393  s = bfd_make_section_with_flags (abfd, ".plt", pltflags);
4394  if (s == NULL
4395      || ! bfd_set_section_alignment (abfd, s, bed->plt_alignment))
4396    return FALSE;
4397  /* FRV-specific: remember it.  */
4398  frvfdpic_plt_section (info) = s;
4399
4400  /* Define the symbol _PROCEDURE_LINKAGE_TABLE_ at the start of the
4401     .plt section.  */
4402  if (bed->want_plt_sym)
4403    {
4404      h = _bfd_elf_define_linkage_sym (abfd, info, s,
4405				       "_PROCEDURE_LINKAGE_TABLE_");
4406      elf_hash_table (info)->hplt = h;
4407      if (h == NULL)
4408	return FALSE;
4409    }
4410
4411  /* FRV-specific: we want rel relocations for the plt.  */
4412  s = bfd_make_section_with_flags (abfd, ".rel.plt",
4413				   flags | SEC_READONLY);
4414  if (s == NULL
4415      || ! bfd_set_section_alignment (abfd, s, bed->s->log_file_align))
4416    return FALSE;
4417  /* FRV-specific: remember it.  */
4418  frvfdpic_pltrel_section (info) = s;
4419
4420  return TRUE;
4421}
4422
4423/* Make sure the got and plt sections exist, and that our pointers in
4424   the link hash table point to them.  */
4425
4426static bfd_boolean
4427elf32_frvfdpic_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
4428{
4429  /* This is mostly copied from
4430     elflink.c:_bfd_elf_create_dynamic_sections().  */
4431  flagword flags;
4432  asection *s;
4433  const struct elf_backend_data *bed = get_elf_backend_data (abfd);
4434
4435  flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
4436	   | SEC_LINKER_CREATED);
4437
4438  /* We need to create .plt, .rel[a].plt, .got, .got.plt, .dynbss, and
4439     .rel[a].bss sections.  */
4440
4441  /* FRV-specific: we want to create the GOT and the PLT in the FRV
4442     way.  */
4443  if (! _frv_create_got_section (abfd, info))
4444    return FALSE;
4445
4446  /* FRV-specific: make sure we created everything we wanted.  */
4447  BFD_ASSERT (frvfdpic_got_section (info) && frvfdpic_gotrel_section (info)
4448	      && frvfdpic_gotfixup_section (info)
4449	      && frvfdpic_plt_section (info)
4450	      && frvfdpic_pltrel_section (info));
4451
4452  if (bed->want_dynbss)
4453    {
4454      /* The .dynbss section is a place to put symbols which are defined
4455	 by dynamic objects, are referenced by regular objects, and are
4456	 not functions.  We must allocate space for them in the process
4457	 image and use a R_*_COPY reloc to tell the dynamic linker to
4458	 initialize them at run time.  The linker script puts the .dynbss
4459	 section into the .bss section of the final image.  */
4460      s = bfd_make_section_with_flags (abfd, ".dynbss",
4461				       SEC_ALLOC | SEC_LINKER_CREATED);
4462      if (s == NULL)
4463	return FALSE;
4464
4465      /* The .rel[a].bss section holds copy relocs.  This section is not
4466     normally needed.  We need to create it here, though, so that the
4467     linker will map it to an output section.  We can't just create it
4468     only if we need it, because we will not know whether we need it
4469     until we have seen all the input files, and the first time the
4470     main linker code calls BFD after examining all the input files
4471     (size_dynamic_sections) the input sections have already been
4472     mapped to the output sections.  If the section turns out not to
4473     be needed, we can discard it later.  We will never need this
4474     section when generating a shared object, since they do not use
4475     copy relocs.  */
4476      if (! info->shared)
4477	{
4478	  s = bfd_make_section_with_flags (abfd,
4479					   (bed->default_use_rela_p
4480					    ? ".rela.bss" : ".rel.bss"),
4481					   flags | SEC_READONLY);
4482	  if (s == NULL
4483	      || ! bfd_set_section_alignment (abfd, s, bed->s->log_file_align))
4484	    return FALSE;
4485	}
4486    }
4487
4488  return TRUE;
4489}
4490
4491/* Compute the total GOT and PLT size required by each symbol in each
4492   range.  Symbols may require up to 4 words in the GOT: an entry
4493   pointing to the symbol, an entry pointing to its function
4494   descriptor, and a private function descriptors taking two
4495   words.  */
4496
4497static void
4498_frvfdpic_count_nontls_entries (struct frvfdpic_relocs_info *entry,
4499				struct _frvfdpic_dynamic_got_info *dinfo)
4500{
4501  /* Allocate space for a GOT entry pointing to the symbol.  */
4502  if (entry->got12)
4503    dinfo->got12 += 4;
4504  else if (entry->gotlos)
4505    dinfo->gotlos += 4;
4506  else if (entry->gothilo)
4507    dinfo->gothilo += 4;
4508  else
4509    entry->relocs32--;
4510  entry->relocs32++;
4511
4512  /* Allocate space for a GOT entry pointing to the function
4513     descriptor.  */
4514  if (entry->fdgot12)
4515    dinfo->got12 += 4;
4516  else if (entry->fdgotlos)
4517    dinfo->gotlos += 4;
4518  else if (entry->fdgothilo)
4519    dinfo->gothilo += 4;
4520  else
4521    entry->relocsfd--;
4522  entry->relocsfd++;
4523
4524  /* Decide whether we need a PLT entry, a function descriptor in the
4525     GOT, and a lazy PLT entry for this symbol.  */
4526  entry->plt = entry->call
4527    && entry->symndx == -1 && ! FRVFDPIC_SYM_LOCAL (dinfo->info, entry->d.h)
4528    && elf_hash_table (dinfo->info)->dynamic_sections_created;
4529  entry->privfd = entry->plt
4530    || entry->fdgoff12 || entry->fdgofflos || entry->fdgoffhilo
4531    || ((entry->fd || entry->fdgot12 || entry->fdgotlos || entry->fdgothilo)
4532	&& (entry->symndx != -1
4533	    || FRVFDPIC_FUNCDESC_LOCAL (dinfo->info, entry->d.h)));
4534  entry->lazyplt = entry->privfd
4535    && entry->symndx == -1 && ! FRVFDPIC_SYM_LOCAL (dinfo->info, entry->d.h)
4536    && ! (dinfo->info->flags & DF_BIND_NOW)
4537    && elf_hash_table (dinfo->info)->dynamic_sections_created;
4538
4539  /* Allocate space for a function descriptor.  */
4540  if (entry->fdgoff12)
4541    dinfo->fd12 += 8;
4542  else if (entry->fdgofflos)
4543    dinfo->fdlos += 8;
4544  else if (entry->privfd && entry->plt)
4545    dinfo->fdplt += 8;
4546  else if (entry->privfd)
4547    dinfo->fdhilo += 8;
4548  else
4549    entry->relocsfdv--;
4550  entry->relocsfdv++;
4551
4552  if (entry->lazyplt)
4553    dinfo->lzplt += 8;
4554}
4555
4556/* Compute the total GOT size required by each TLS symbol in each
4557   range.  Symbols may require up to 5 words in the GOT: an entry
4558   holding the TLS offset for the symbol, and an entry with a full TLS
4559   descriptor taking 4 words.  */
4560
4561static void
4562_frvfdpic_count_tls_entries (struct frvfdpic_relocs_info *entry,
4563			     struct _frvfdpic_dynamic_got_info *dinfo,
4564			     bfd_boolean subtract)
4565{
4566  const int l = subtract ? -1 : 1;
4567
4568  /* Allocate space for a GOT entry with the TLS offset of the
4569     symbol.  */
4570  if (entry->tlsoff12)
4571    dinfo->got12 += 4 * l;
4572  else if (entry->tlsofflos)
4573    dinfo->gotlos += 4 * l;
4574  else if (entry->tlsoffhilo)
4575    dinfo->gothilo += 4 * l;
4576  else
4577    entry->relocstlsoff -= l;
4578  entry->relocstlsoff += l;
4579
4580  /* If there's any TLSOFF relocation, mark the output file as not
4581     suitable for dlopening.  This mark will remain even if we relax
4582     all such relocations, but this is not a problem, since we'll only
4583     do so for executables, and we definitely don't want anyone
4584     dlopening executables.  */
4585  if (entry->relocstlsoff)
4586    dinfo->info->flags |= DF_STATIC_TLS;
4587
4588  /* Allocate space for a TLS descriptor.  */
4589  if (entry->tlsdesc12)
4590    dinfo->tlsd12 += 8 * l;
4591  else if (entry->tlsdesclos)
4592    dinfo->tlsdlos += 8 * l;
4593  else if (entry->tlsplt)
4594    dinfo->tlsdplt += 8 * l;
4595  else if (entry->tlsdeschilo)
4596    dinfo->tlsdhilo += 8 * l;
4597  else
4598    entry->relocstlsd -= l;
4599  entry->relocstlsd += l;
4600}
4601
4602/* Compute the number of dynamic relocations and fixups that a symbol
4603   requires, and add (or subtract) from the grand and per-symbol
4604   totals.  */
4605
4606static void
4607_frvfdpic_count_relocs_fixups (struct frvfdpic_relocs_info *entry,
4608			       struct _frvfdpic_dynamic_got_info *dinfo,
4609			       bfd_boolean subtract)
4610{
4611  bfd_vma relocs = 0, fixups = 0, tlsrets = 0;
4612
4613  if (!dinfo->info->executable || dinfo->info->pie)
4614    {
4615      relocs = entry->relocs32 + entry->relocsfd + entry->relocsfdv
4616	+ entry->relocstlsd;
4617
4618      /* In the executable, TLS relocations to symbols that bind
4619	 locally (including those that resolve to global TLS offsets)
4620	 are resolved immediately, without any need for fixups or
4621	 dynamic relocations.  In shared libraries, however, we must
4622	 emit dynamic relocations even for local symbols, because we
4623	 don't know the module id the library is going to get at
4624	 run-time, nor its TLS base offset.  */
4625      if (!dinfo->info->executable
4626	  || (entry->symndx == -1
4627	      && ! FRVFDPIC_SYM_LOCAL (dinfo->info, entry->d.h)))
4628	relocs += entry->relocstlsoff;
4629    }
4630  else
4631    {
4632      if (entry->symndx != -1 || FRVFDPIC_SYM_LOCAL (dinfo->info, entry->d.h))
4633	{
4634	  if (entry->symndx != -1
4635	      || entry->d.h->root.type != bfd_link_hash_undefweak)
4636	    fixups += entry->relocs32 + 2 * entry->relocsfdv;
4637	  fixups += entry->relocstlsd;
4638	  tlsrets += entry->relocstlsd;
4639	}
4640      else
4641	{
4642	  relocs += entry->relocs32 + entry->relocsfdv
4643	    + entry->relocstlsoff + entry->relocstlsd;
4644	}
4645
4646      if (entry->symndx != -1
4647	  || FRVFDPIC_FUNCDESC_LOCAL (dinfo->info, entry->d.h))
4648	{
4649	  if (entry->symndx != -1
4650	      || entry->d.h->root.type != bfd_link_hash_undefweak)
4651	    fixups += entry->relocsfd;
4652	}
4653      else
4654	relocs += entry->relocsfd;
4655    }
4656
4657  if (subtract)
4658    {
4659      relocs = - relocs;
4660      fixups = - fixups;
4661      tlsrets = - tlsrets;
4662    }
4663
4664  entry->dynrelocs += relocs;
4665  entry->fixups += fixups;
4666  dinfo->relocs += relocs;
4667  dinfo->fixups += fixups;
4668  dinfo->tls_ret_refs += tlsrets;
4669}
4670
4671/* Look for opportunities to relax TLS relocations.  We can assume
4672   we're linking the main executable or a static-tls library, since
4673   otherwise we wouldn't have got here.  When relaxing, we have to
4674   first undo any previous accounting of TLS uses of fixups, dynamic
4675   relocations, GOT and PLT entries.  */
4676
4677static void
4678_frvfdpic_relax_tls_entries (struct frvfdpic_relocs_info *entry,
4679			     struct _frvfdpic_dynamic_got_info *dinfo,
4680			     bfd_boolean relaxing)
4681{
4682  bfd_boolean changed = ! relaxing;
4683
4684  BFD_ASSERT (dinfo->info->executable
4685	      || (dinfo->info->flags & DF_STATIC_TLS));
4686
4687  if (entry->tlsdesc12 || entry->tlsdesclos || entry->tlsdeschilo)
4688    {
4689      if (! changed)
4690	{
4691	  _frvfdpic_count_relocs_fixups (entry, dinfo, TRUE);
4692	  _frvfdpic_count_tls_entries (entry, dinfo, TRUE);
4693	  changed = TRUE;
4694	}
4695
4696      /* When linking an executable, we can always decay GOTTLSDESC to
4697	 TLSMOFF, if the symbol is local, or GOTTLSOFF, otherwise.
4698	 When linking a static-tls shared library, using TLSMOFF is
4699	 not an option, but we can still use GOTTLSOFF.  When decaying
4700	 to GOTTLSOFF, we must keep the GOT entry in range.  We know
4701	 it has to fit because we'll be trading the 4 words of hte TLS
4702	 descriptor for a single word in the same range.  */
4703      if (! dinfo->info->executable
4704	  || (entry->symndx == -1
4705	      && ! FRVFDPIC_SYM_LOCAL (dinfo->info, entry->d.h)))
4706	{
4707	  entry->tlsoff12 |= entry->tlsdesc12;
4708	  entry->tlsofflos |= entry->tlsdesclos;
4709	  entry->tlsoffhilo |= entry->tlsdeschilo;
4710	}
4711
4712      entry->tlsdesc12 = entry->tlsdesclos = entry->tlsdeschilo = 0;
4713    }
4714
4715  /* We can only decay TLSOFFs or call #gettlsoff to TLSMOFF in the
4716     main executable.  We have to check whether the symbol's TLSOFF is
4717     in range for a setlos.  For symbols with a hash entry, we can
4718     determine exactly what to do; for others locals, we don't have
4719     addresses handy, so we use the size of the TLS section as an
4720     approximation.  If we get it wrong, we'll retain a GOT entry
4721     holding the TLS offset (without dynamic relocations or fixups),
4722     but we'll still optimize away the loads from it.  Since TLS sizes
4723     are generally very small, it's probably not worth attempting to
4724     do better than this.  */
4725  if ((entry->tlsplt
4726       || entry->tlsoff12 || entry->tlsofflos || entry->tlsoffhilo)
4727      && dinfo->info->executable && relaxing
4728      && ((entry->symndx == -1
4729	   && FRVFDPIC_SYM_LOCAL (dinfo->info, entry->d.h)
4730	   /* The above may hold for an undefweak TLS symbol, so make
4731	      sure we don't have this case before accessing def.value
4732	      and def.section.  */
4733	   && (entry->d.h->root.type == bfd_link_hash_undefweak
4734	       || (bfd_vma)(entry->d.h->root.u.def.value
4735			    + (entry->d.h->root.u.def.section
4736			       ->output_section->vma)
4737			    + entry->d.h->root.u.def.section->output_offset
4738			    + entry->addend
4739			    - tls_biased_base (dinfo->info)
4740			    + 32768) < (bfd_vma)65536))
4741	  || (entry->symndx != -1
4742	      && (elf_hash_table (dinfo->info)->tls_sec->size
4743		  + abs (entry->addend) < 32768 + FRVFDPIC_TLS_BIAS))))
4744    {
4745      if (! changed)
4746	{
4747	  _frvfdpic_count_relocs_fixups (entry, dinfo, TRUE);
4748	  _frvfdpic_count_tls_entries (entry, dinfo, TRUE);
4749	  changed = TRUE;
4750	}
4751
4752      entry->tlsplt =
4753	entry->tlsoff12 = entry->tlsofflos = entry->tlsoffhilo = 0;
4754    }
4755
4756  /* We can decay `call #gettlsoff' to a ldi #tlsoff if we already
4757     have a #gottlsoff12 relocation for this entry, or if we can fit
4758     one more in the 12-bit (and 16-bit) ranges.  */
4759  if (entry->tlsplt
4760      && (entry->tlsoff12
4761	  || (relaxing
4762	      && dinfo->got12 + dinfo->fd12 + dinfo->tlsd12 <= 4096 - 12 - 4
4763	      && (dinfo->got12 + dinfo->fd12 + dinfo->tlsd12
4764		  + dinfo->gotlos + dinfo->fdlos + dinfo->tlsdlos
4765		  <= 65536 - 12 - 4))))
4766    {
4767      if (! changed)
4768	{
4769	  _frvfdpic_count_relocs_fixups (entry, dinfo, TRUE);
4770	  _frvfdpic_count_tls_entries (entry, dinfo, TRUE);
4771	  changed = TRUE;
4772	}
4773
4774      entry->tlsoff12 = 1;
4775      entry->tlsplt = 0;
4776    }
4777
4778  if (changed)
4779    {
4780      _frvfdpic_count_tls_entries (entry, dinfo, FALSE);
4781      _frvfdpic_count_relocs_fixups (entry, dinfo, FALSE);
4782    }
4783
4784  return;
4785}
4786
4787/* Compute the total GOT and PLT size required by each symbol in each range. *
4788   Symbols may require up to 4 words in the GOT: an entry pointing to
4789   the symbol, an entry pointing to its function descriptor, and a
4790   private function descriptors taking two words.  */
4791
4792static int
4793_frvfdpic_count_got_plt_entries (void **entryp, void *dinfo_)
4794{
4795  struct frvfdpic_relocs_info *entry = *entryp;
4796  struct _frvfdpic_dynamic_got_info *dinfo = dinfo_;
4797
4798  _frvfdpic_count_nontls_entries (entry, dinfo);
4799
4800  if (dinfo->info->executable || (dinfo->info->flags & DF_STATIC_TLS))
4801    _frvfdpic_relax_tls_entries (entry, dinfo, FALSE);
4802  else
4803    {
4804      _frvfdpic_count_tls_entries (entry, dinfo, FALSE);
4805      _frvfdpic_count_relocs_fixups (entry, dinfo, FALSE);
4806    }
4807
4808  return 1;
4809}
4810
4811/* Determine the positive and negative ranges to be used by each
4812   offset range in the GOT.  FDCUR and CUR, that must be aligned to a
4813   double-word boundary, are the minimum (negative) and maximum
4814   (positive) GOT offsets already used by previous ranges, except for
4815   an ODD entry that may have been left behind.  GOT and FD indicate
4816   the size of GOT entries and function descriptors that must be
4817   placed within the range from -WRAP to WRAP.  If there's room left,
4818   up to FDPLT bytes should be reserved for additional function
4819   descriptors.  */
4820
4821inline static bfd_signed_vma
4822_frvfdpic_compute_got_alloc_data (struct _frvfdpic_dynamic_got_alloc_data *gad,
4823				  bfd_signed_vma fdcur,
4824				  bfd_signed_vma odd,
4825				  bfd_signed_vma cur,
4826				  bfd_vma got,
4827				  bfd_vma fd,
4828				  bfd_vma fdplt,
4829				  bfd_vma tlsd,
4830				  bfd_vma tlsdplt,
4831				  bfd_vma wrap)
4832{
4833  bfd_signed_vma wrapmin = -wrap;
4834  const bfd_vma tdescsz = 8;
4835
4836  /* Start at the given initial points.  */
4837  gad->fdcur = fdcur;
4838  gad->cur = cur;
4839
4840  /* If we had an incoming odd word and we have any got entries that
4841     are going to use it, consume it, otherwise leave gad->odd at
4842     zero.  We might force gad->odd to zero and return the incoming
4843     odd such that it is used by the next range, but then GOT entries
4844     might appear to be out of order and we wouldn't be able to
4845     shorten the GOT by one word if it turns out to end with an
4846     unpaired GOT entry.  */
4847  if (odd && got)
4848    {
4849      gad->odd = odd;
4850      got -= 4;
4851      odd = 0;
4852    }
4853  else
4854    gad->odd = 0;
4855
4856  /* If we're left with an unpaired GOT entry, compute its location
4857     such that we can return it.  Otherwise, if got doesn't require an
4858     odd number of words here, either odd was already zero in the
4859     block above, or it was set to zero because got was non-zero, or
4860     got was already zero.  In the latter case, we want the value of
4861     odd to carry over to the return statement, so we don't want to
4862     reset odd unless the condition below is true.  */
4863  if (got & 4)
4864    {
4865      odd = cur + got;
4866      got += 4;
4867    }
4868
4869  /* Compute the tentative boundaries of this range.  */
4870  gad->max = cur + got;
4871  gad->min = fdcur - fd;
4872  gad->fdplt = 0;
4873
4874  /* If function descriptors took too much space, wrap some of them
4875     around.  */
4876  if (gad->min < wrapmin)
4877    {
4878      gad->max += wrapmin - gad->min;
4879      gad->tmin = gad->min = wrapmin;
4880    }
4881
4882  /* If GOT entries took too much space, wrap some of them around.
4883     This may well cause gad->min to become lower than wrapmin.  This
4884     will cause a relocation overflow later on, so we don't have to
4885     report it here . */
4886  if ((bfd_vma) gad->max > wrap)
4887    {
4888      gad->min -= gad->max - wrap;
4889      gad->max = wrap;
4890    }
4891
4892  /* Add TLS descriptors.  */
4893  gad->tmax = gad->max + tlsd;
4894  gad->tmin = gad->min;
4895  gad->tlsdplt = 0;
4896
4897  /* If TLS descriptors took too much space, wrap an integral number
4898     of them around.  */
4899  if ((bfd_vma) gad->tmax > wrap)
4900    {
4901      bfd_vma wrapsize = gad->tmax - wrap;
4902
4903      wrapsize += tdescsz / 2;
4904      wrapsize &= ~ tdescsz / 2;
4905
4906      gad->tmin -= wrapsize;
4907      gad->tmax -= wrapsize;
4908    }
4909
4910  /* If there is space left and we have function descriptors
4911     referenced in PLT entries that could take advantage of shorter
4912     offsets, place them now.  */
4913  if (fdplt && gad->tmin > wrapmin)
4914    {
4915      bfd_vma fds;
4916
4917      if ((bfd_vma) (gad->tmin - wrapmin) < fdplt)
4918	fds = gad->tmin - wrapmin;
4919      else
4920	fds = fdplt;
4921
4922      fdplt -= fds;
4923      gad->min -= fds;
4924      gad->tmin -= fds;
4925      gad->fdplt += fds;
4926    }
4927
4928  /* If there is more space left, try to place some more function
4929     descriptors for PLT entries.  */
4930  if (fdplt && (bfd_vma) gad->tmax < wrap)
4931    {
4932      bfd_vma fds;
4933
4934      if ((bfd_vma) (wrap - gad->tmax) < fdplt)
4935	fds = wrap - gad->tmax;
4936      else
4937	fds = fdplt;
4938
4939      fdplt -= fds;
4940      gad->max += fds;
4941      gad->tmax += fds;
4942      gad->fdplt += fds;
4943    }
4944
4945  /* If there is space left and we have TLS descriptors referenced in
4946     PLT entries that could take advantage of shorter offsets, place
4947     them now.  */
4948  if (tlsdplt && gad->tmin > wrapmin)
4949    {
4950      bfd_vma tlsds;
4951
4952      if ((bfd_vma) (gad->tmin - wrapmin) < tlsdplt)
4953	tlsds = (gad->tmin - wrapmin) & ~ (tdescsz / 2);
4954      else
4955	tlsds = tlsdplt;
4956
4957      tlsdplt -= tlsds;
4958      gad->tmin -= tlsds;
4959      gad->tlsdplt += tlsds;
4960    }
4961
4962  /* If there is more space left, try to place some more TLS
4963     descriptors for PLT entries.  Although we could try to fit an
4964     additional TLS descriptor with half of it just before before the
4965     wrap point and another right past the wrap point, this might
4966     cause us to run out of space for the next region, so don't do
4967     it.  */
4968  if (tlsdplt && (bfd_vma) gad->tmax < wrap - tdescsz / 2)
4969    {
4970      bfd_vma tlsds;
4971
4972      if ((bfd_vma) (wrap - gad->tmax) < tlsdplt)
4973	tlsds = (wrap - gad->tmax) & ~ (tdescsz / 2);
4974      else
4975	tlsds = tlsdplt;
4976
4977      tlsdplt -= tlsds;
4978      gad->tmax += tlsds;
4979      gad->tlsdplt += tlsds;
4980    }
4981
4982  /* If odd was initially computed as an offset past the wrap point,
4983     wrap it around.  */
4984  if (odd > gad->max)
4985    odd = gad->min + odd - gad->max;
4986
4987  /* _frvfdpic_get_got_entry() below will always wrap gad->cur if needed
4988     before returning, so do it here too.  This guarantees that,
4989     should cur and fdcur meet at the wrap point, they'll both be
4990     equal to min.  */
4991  if (gad->cur == gad->max)
4992    gad->cur = gad->min;
4993
4994  /* Ditto for _frvfdpic_get_tlsdesc_entry().  */
4995  gad->tcur = gad->max;
4996  if (gad->tcur == gad->tmax)
4997    gad->tcur = gad->tmin;
4998
4999  return odd;
5000}
5001
5002/* Compute the location of the next GOT entry, given the allocation
5003   data for a range.  */
5004
5005inline static bfd_signed_vma
5006_frvfdpic_get_got_entry (struct _frvfdpic_dynamic_got_alloc_data *gad)
5007{
5008  bfd_signed_vma ret;
5009
5010  if (gad->odd)
5011    {
5012      /* If there was an odd word left behind, use it.  */
5013      ret = gad->odd;
5014      gad->odd = 0;
5015    }
5016  else
5017    {
5018      /* Otherwise, use the word pointed to by cur, reserve the next
5019	 as an odd word, and skip to the next pair of words, possibly
5020	 wrapping around.  */
5021      ret = gad->cur;
5022      gad->odd = gad->cur + 4;
5023      gad->cur += 8;
5024      if (gad->cur == gad->max)
5025	gad->cur = gad->min;
5026    }
5027
5028  return ret;
5029}
5030
5031/* Compute the location of the next function descriptor entry in the
5032   GOT, given the allocation data for a range.  */
5033
5034inline static bfd_signed_vma
5035_frvfdpic_get_fd_entry (struct _frvfdpic_dynamic_got_alloc_data *gad)
5036{
5037  /* If we're at the bottom, wrap around, and only then allocate the
5038     next pair of words.  */
5039  if (gad->fdcur == gad->min)
5040    gad->fdcur = gad->max;
5041  return gad->fdcur -= 8;
5042}
5043
5044/* Compute the location of the next TLS descriptor entry in the GOT,
5045   given the allocation data for a range.  */
5046inline static bfd_signed_vma
5047_frvfdpic_get_tlsdesc_entry (struct _frvfdpic_dynamic_got_alloc_data *gad)
5048{
5049  bfd_signed_vma ret;
5050
5051  ret = gad->tcur;
5052
5053  gad->tcur += 8;
5054
5055  /* If we're at the top of the region, wrap around to the bottom.  */
5056  if (gad->tcur == gad->tmax)
5057    gad->tcur = gad->tmin;
5058
5059  return ret;
5060}
5061
5062/* Assign GOT offsets for every GOT entry and function descriptor.
5063   Doing everything in a single pass is tricky.  */
5064
5065static int
5066_frvfdpic_assign_got_entries (void **entryp, void *info_)
5067{
5068  struct frvfdpic_relocs_info *entry = *entryp;
5069  struct _frvfdpic_dynamic_got_plt_info *dinfo = info_;
5070
5071  if (entry->got12)
5072    entry->got_entry = _frvfdpic_get_got_entry (&dinfo->got12);
5073  else if (entry->gotlos)
5074    entry->got_entry = _frvfdpic_get_got_entry (&dinfo->gotlos);
5075  else if (entry->gothilo)
5076    entry->got_entry = _frvfdpic_get_got_entry (&dinfo->gothilo);
5077
5078  if (entry->fdgot12)
5079    entry->fdgot_entry = _frvfdpic_get_got_entry (&dinfo->got12);
5080  else if (entry->fdgotlos)
5081    entry->fdgot_entry = _frvfdpic_get_got_entry (&dinfo->gotlos);
5082  else if (entry->fdgothilo)
5083    entry->fdgot_entry = _frvfdpic_get_got_entry (&dinfo->gothilo);
5084
5085  if (entry->fdgoff12)
5086    entry->fd_entry = _frvfdpic_get_fd_entry (&dinfo->got12);
5087  else if (entry->plt && dinfo->got12.fdplt)
5088    {
5089      dinfo->got12.fdplt -= 8;
5090      entry->fd_entry = _frvfdpic_get_fd_entry (&dinfo->got12);
5091    }
5092  else if (entry->fdgofflos)
5093    entry->fd_entry = _frvfdpic_get_fd_entry (&dinfo->gotlos);
5094  else if (entry->plt && dinfo->gotlos.fdplt)
5095    {
5096      dinfo->gotlos.fdplt -= 8;
5097      entry->fd_entry = _frvfdpic_get_fd_entry (&dinfo->gotlos);
5098    }
5099  else if (entry->plt)
5100    {
5101      dinfo->gothilo.fdplt -= 8;
5102      entry->fd_entry = _frvfdpic_get_fd_entry (&dinfo->gothilo);
5103    }
5104  else if (entry->privfd)
5105    entry->fd_entry = _frvfdpic_get_fd_entry (&dinfo->gothilo);
5106
5107  if (entry->tlsoff12)
5108    entry->tlsoff_entry = _frvfdpic_get_got_entry (&dinfo->got12);
5109  else if (entry->tlsofflos)
5110    entry->tlsoff_entry = _frvfdpic_get_got_entry (&dinfo->gotlos);
5111  else if (entry->tlsoffhilo)
5112    entry->tlsoff_entry = _frvfdpic_get_got_entry (&dinfo->gothilo);
5113
5114  if (entry->tlsdesc12)
5115    entry->tlsdesc_entry = _frvfdpic_get_tlsdesc_entry (&dinfo->got12);
5116  else if (entry->tlsplt && dinfo->got12.tlsdplt)
5117    {
5118      dinfo->got12.tlsdplt -= 8;
5119      entry->tlsdesc_entry = _frvfdpic_get_tlsdesc_entry (&dinfo->got12);
5120    }
5121  else if (entry->tlsdesclos)
5122    entry->tlsdesc_entry = _frvfdpic_get_tlsdesc_entry (&dinfo->gotlos);
5123  else if (entry->tlsplt && dinfo->gotlos.tlsdplt)
5124    {
5125      dinfo->gotlos.tlsdplt -= 8;
5126      entry->tlsdesc_entry = _frvfdpic_get_tlsdesc_entry (&dinfo->gotlos);
5127    }
5128  else if (entry->tlsplt)
5129    {
5130      dinfo->gothilo.tlsdplt -= 8;
5131      entry->tlsdesc_entry = _frvfdpic_get_tlsdesc_entry (&dinfo->gothilo);
5132    }
5133  else if (entry->tlsdeschilo)
5134    entry->tlsdesc_entry = _frvfdpic_get_tlsdesc_entry (&dinfo->gothilo);
5135
5136  return 1;
5137}
5138
5139/* Assign GOT offsets to private function descriptors used by PLT
5140   entries (or referenced by 32-bit offsets), as well as PLT entries
5141   and lazy PLT entries.  */
5142
5143static int
5144_frvfdpic_assign_plt_entries (void **entryp, void *info_)
5145{
5146  struct frvfdpic_relocs_info *entry = *entryp;
5147  struct _frvfdpic_dynamic_got_plt_info *dinfo = info_;
5148
5149  if (entry->privfd)
5150    BFD_ASSERT (entry->fd_entry);
5151
5152  if (entry->plt)
5153    {
5154      int size;
5155
5156      /* We use the section's raw size to mark the location of the
5157	 next PLT entry.  */
5158      entry->plt_entry = frvfdpic_plt_section (dinfo->g.info)->size;
5159
5160      /* Figure out the length of this PLT entry based on the
5161	 addressing mode we need to reach the function descriptor.  */
5162      BFD_ASSERT (entry->fd_entry);
5163      if (entry->fd_entry >= -(1 << (12 - 1))
5164	  && entry->fd_entry < (1 << (12 - 1)))
5165	size = 8;
5166      else if (entry->fd_entry >= -(1 << (16 - 1))
5167	       && entry->fd_entry < (1 << (16 - 1)))
5168	size = 12;
5169      else
5170	size = 16;
5171
5172      frvfdpic_plt_section (dinfo->g.info)->size += size;
5173    }
5174
5175  if (entry->lazyplt)
5176    {
5177      entry->lzplt_entry = dinfo->g.lzplt;
5178      dinfo->g.lzplt += 8;
5179      /* If this entry is the one that gets the resolver stub, account
5180	 for the additional instruction.  */
5181      if (entry->lzplt_entry % FRVFDPIC_LZPLT_BLOCK_SIZE
5182	  == FRVFDPIC_LZPLT_RESOLV_LOC)
5183	dinfo->g.lzplt += 4;
5184    }
5185
5186  if (entry->tlsplt)
5187    {
5188      int size;
5189
5190      entry->tlsplt_entry
5191	= frvfdpic_plt_section (dinfo->g.info)->size;
5192
5193      if (dinfo->g.info->executable
5194	  && (entry->symndx != -1
5195	      || FRVFDPIC_SYM_LOCAL (dinfo->g.info, entry->d.h)))
5196	{
5197	  if ((bfd_signed_vma)entry->addend >= -(1 << (16 - 1))
5198	      /* FIXME: here we use the size of the TLS section
5199		 as an upper bound for the value of the TLS
5200		 symbol, because we may not know the exact value
5201		 yet.  If we get it wrong, we'll just waste a
5202		 word in the PLT, and we should never get even
5203		 close to 32 KiB of TLS anyway.  */
5204	      && elf_hash_table (dinfo->g.info)->tls_sec
5205	      && (elf_hash_table (dinfo->g.info)->tls_sec->size
5206		  + (bfd_signed_vma)(entry->addend) <= (1 << (16 - 1))))
5207	    size = 8;
5208	  else
5209	    size = 12;
5210	}
5211      else if (entry->tlsoff_entry)
5212	{
5213	  if (entry->tlsoff_entry >= -(1 << (12 - 1))
5214	      && entry->tlsoff_entry < (1 << (12 - 1)))
5215	    size = 8;
5216	  else if (entry->tlsoff_entry >= -(1 << (16 - 1))
5217		   && entry->tlsoff_entry < (1 << (16 - 1)))
5218	    size = 12;
5219	  else
5220	    size = 16;
5221	}
5222      else
5223	{
5224	  BFD_ASSERT (entry->tlsdesc_entry);
5225
5226	  if (entry->tlsdesc_entry >= -(1 << (12 - 1))
5227	      && entry->tlsdesc_entry < (1 << (12 - 1)))
5228	    size = 8;
5229	  else if (entry->tlsdesc_entry >= -(1 << (16 - 1))
5230		   && entry->tlsdesc_entry < (1 << (16 - 1)))
5231	    size = 12;
5232	  else
5233	    size = 16;
5234	}
5235
5236      frvfdpic_plt_section (dinfo->g.info)->size += size;
5237    }
5238
5239  return 1;
5240}
5241
5242/* Cancel out any effects of calling _frvfdpic_assign_got_entries and
5243   _frvfdpic_assign_plt_entries.  */
5244
5245static int
5246_frvfdpic_reset_got_plt_entries (void **entryp, void *ignore ATTRIBUTE_UNUSED)
5247{
5248  struct frvfdpic_relocs_info *entry = *entryp;
5249
5250  entry->got_entry = 0;
5251  entry->fdgot_entry = 0;
5252  entry->fd_entry = 0;
5253  entry->plt_entry = (bfd_vma)-1;
5254  entry->lzplt_entry = (bfd_vma)-1;
5255  entry->tlsoff_entry = 0;
5256  entry->tlsdesc_entry = 0;
5257  entry->tlsplt_entry = (bfd_vma)-1;
5258
5259  return 1;
5260}
5261
5262/* Follow indirect and warning hash entries so that each got entry
5263   points to the final symbol definition.  P must point to a pointer
5264   to the hash table we're traversing.  Since this traversal may
5265   modify the hash table, we set this pointer to NULL to indicate
5266   we've made a potentially-destructive change to the hash table, so
5267   the traversal must be restarted.  */
5268static int
5269_frvfdpic_resolve_final_relocs_info (void **entryp, void *p)
5270{
5271  struct frvfdpic_relocs_info *entry = *entryp;
5272  htab_t *htab = p;
5273
5274  if (entry->symndx == -1)
5275    {
5276      struct elf_link_hash_entry *h = entry->d.h;
5277      struct frvfdpic_relocs_info *oentry;
5278
5279      while (h->root.type == bfd_link_hash_indirect
5280	     || h->root.type == bfd_link_hash_warning)
5281	h = (struct elf_link_hash_entry *)h->root.u.i.link;
5282
5283      if (entry->d.h == h)
5284	return 1;
5285
5286      oentry = frvfdpic_relocs_info_for_global (*htab, 0, h, entry->addend,
5287						NO_INSERT);
5288
5289      if (oentry)
5290	{
5291	  /* Merge the two entries.  */
5292	  frvfdpic_pic_merge_early_relocs_info (oentry, entry);
5293	  htab_clear_slot (*htab, entryp);
5294	  return 1;
5295	}
5296
5297      entry->d.h = h;
5298
5299      /* If we can't find this entry with the new bfd hash, re-insert
5300	 it, and get the traversal restarted.  */
5301      if (! htab_find (*htab, entry))
5302	{
5303	  htab_clear_slot (*htab, entryp);
5304	  entryp = htab_find_slot (*htab, entry, INSERT);
5305	  if (! *entryp)
5306	    *entryp = entry;
5307	  /* Abort the traversal, since the whole table may have
5308	     moved, and leave it up to the parent to restart the
5309	     process.  */
5310	  *(htab_t *)p = NULL;
5311	  return 0;
5312	}
5313    }
5314
5315  return 1;
5316}
5317
5318/* Compute the total size of the GOT, the PLT, the dynamic relocations
5319   section and the rofixup section.  Assign locations for GOT and PLT
5320   entries.  */
5321
5322static bfd_boolean
5323_frvfdpic_size_got_plt (bfd *output_bfd,
5324			struct _frvfdpic_dynamic_got_plt_info *gpinfop)
5325{
5326  bfd_signed_vma odd;
5327  bfd_vma limit, tlslimit;
5328  struct bfd_link_info *info = gpinfop->g.info;
5329  bfd *dynobj = elf_hash_table (info)->dynobj;
5330
5331  memcpy (frvfdpic_dynamic_got_plt_info (info), &gpinfop->g,
5332	  sizeof (gpinfop->g));
5333
5334  odd = 12;
5335  /* Compute the total size taken by entries in the 12-bit and 16-bit
5336     ranges, to tell how many PLT function descriptors we can bring
5337     into the 12-bit range without causing the 16-bit range to
5338     overflow.  */
5339  limit = odd + gpinfop->g.got12 + gpinfop->g.gotlos
5340    + gpinfop->g.fd12 + gpinfop->g.fdlos
5341    + gpinfop->g.tlsd12 + gpinfop->g.tlsdlos;
5342  if (limit < (bfd_vma)1 << 16)
5343    limit = ((bfd_vma)1 << 16) - limit;
5344  else
5345    limit = 0;
5346  if (gpinfop->g.fdplt < limit)
5347    {
5348      tlslimit = (limit - gpinfop->g.fdplt) & ~ (bfd_vma) 8;
5349      limit = gpinfop->g.fdplt;
5350    }
5351  else
5352    tlslimit = 0;
5353  if (gpinfop->g.tlsdplt < tlslimit)
5354    tlslimit = gpinfop->g.tlsdplt;
5355
5356  /* Determine the ranges of GOT offsets that we can use for each
5357     range of addressing modes.  */
5358  odd = _frvfdpic_compute_got_alloc_data (&gpinfop->got12,
5359					  0,
5360					  odd,
5361					  16,
5362					  gpinfop->g.got12,
5363					  gpinfop->g.fd12,
5364					  limit,
5365					  gpinfop->g.tlsd12,
5366					  tlslimit,
5367					  (bfd_vma)1 << (12-1));
5368  odd = _frvfdpic_compute_got_alloc_data (&gpinfop->gotlos,
5369					  gpinfop->got12.tmin,
5370					  odd,
5371					  gpinfop->got12.tmax,
5372					  gpinfop->g.gotlos,
5373					  gpinfop->g.fdlos,
5374					  gpinfop->g.fdplt
5375					  - gpinfop->got12.fdplt,
5376					  gpinfop->g.tlsdlos,
5377					  gpinfop->g.tlsdplt
5378					  - gpinfop->got12.tlsdplt,
5379					  (bfd_vma)1 << (16-1));
5380  odd = _frvfdpic_compute_got_alloc_data (&gpinfop->gothilo,
5381					  gpinfop->gotlos.tmin,
5382					  odd,
5383					  gpinfop->gotlos.tmax,
5384					  gpinfop->g.gothilo,
5385					  gpinfop->g.fdhilo,
5386					  gpinfop->g.fdplt
5387					  - gpinfop->got12.fdplt
5388					  - gpinfop->gotlos.fdplt,
5389					  gpinfop->g.tlsdhilo,
5390					  gpinfop->g.tlsdplt
5391					  - gpinfop->got12.tlsdplt
5392					  - gpinfop->gotlos.tlsdplt,
5393					  (bfd_vma)1 << (32-1));
5394
5395  /* Now assign (most) GOT offsets.  */
5396  htab_traverse (frvfdpic_relocs_info (info), _frvfdpic_assign_got_entries,
5397		 gpinfop);
5398
5399  frvfdpic_got_section (info)->size = gpinfop->gothilo.tmax
5400    - gpinfop->gothilo.tmin
5401    /* If an odd word is the last word of the GOT, we don't need this
5402       word to be part of the GOT.  */
5403    - (odd + 4 == gpinfop->gothilo.tmax ? 4 : 0);
5404  if (frvfdpic_got_section (info)->size == 0)
5405    frvfdpic_got_section (info)->flags |= SEC_EXCLUDE;
5406  else if (frvfdpic_got_section (info)->size == 12
5407	   && ! elf_hash_table (info)->dynamic_sections_created)
5408    {
5409      frvfdpic_got_section (info)->flags |= SEC_EXCLUDE;
5410      frvfdpic_got_section (info)->size = 0;
5411    }
5412  /* This will be non-NULL during relaxation.  The assumption is that
5413     the size of one of these sections will never grow, only shrink,
5414     so we can use the larger buffer we allocated before.  */
5415  else if (frvfdpic_got_section (info)->contents == NULL)
5416    {
5417      frvfdpic_got_section (info)->contents =
5418	(bfd_byte *) bfd_zalloc (dynobj,
5419				 frvfdpic_got_section (info)->size);
5420      if (frvfdpic_got_section (info)->contents == NULL)
5421	return FALSE;
5422    }
5423
5424  if (frvfdpic_gotrel_section (info))
5425    /* Subtract the number of lzplt entries, since those will generate
5426       relocations in the pltrel section.  */
5427    frvfdpic_gotrel_section (info)->size =
5428      (gpinfop->g.relocs - gpinfop->g.lzplt / 8)
5429      * get_elf_backend_data (output_bfd)->s->sizeof_rel;
5430  else
5431    BFD_ASSERT (gpinfop->g.relocs == 0);
5432  if (frvfdpic_gotrel_section (info)->size == 0)
5433    frvfdpic_gotrel_section (info)->flags |= SEC_EXCLUDE;
5434  else if (frvfdpic_gotrel_section (info)->contents == NULL)
5435    {
5436      frvfdpic_gotrel_section (info)->contents =
5437	(bfd_byte *) bfd_zalloc (dynobj,
5438				 frvfdpic_gotrel_section (info)->size);
5439      if (frvfdpic_gotrel_section (info)->contents == NULL)
5440	return FALSE;
5441    }
5442
5443  frvfdpic_gotfixup_section (info)->size = (gpinfop->g.fixups + 1) * 4;
5444  if (frvfdpic_gotfixup_section (info)->size == 0)
5445    frvfdpic_gotfixup_section (info)->flags |= SEC_EXCLUDE;
5446  else if (frvfdpic_gotfixup_section (info)->contents == NULL)
5447    {
5448      frvfdpic_gotfixup_section (info)->contents =
5449	(bfd_byte *) bfd_zalloc (dynobj,
5450				 frvfdpic_gotfixup_section (info)->size);
5451      if (frvfdpic_gotfixup_section (info)->contents == NULL)
5452	return FALSE;
5453    }
5454
5455  if (frvfdpic_pltrel_section (info))
5456    {
5457      frvfdpic_pltrel_section (info)->size =
5458	gpinfop->g.lzplt / 8
5459	* get_elf_backend_data (output_bfd)->s->sizeof_rel;
5460      if (frvfdpic_pltrel_section (info)->size == 0)
5461	frvfdpic_pltrel_section (info)->flags |= SEC_EXCLUDE;
5462      else if (frvfdpic_pltrel_section (info)->contents == NULL)
5463	{
5464	  frvfdpic_pltrel_section (info)->contents =
5465	    (bfd_byte *) bfd_zalloc (dynobj,
5466				     frvfdpic_pltrel_section (info)->size);
5467	  if (frvfdpic_pltrel_section (info)->contents == NULL)
5468	    return FALSE;
5469	}
5470    }
5471
5472  /* Add 4 bytes for every block of at most 65535 lazy PLT entries,
5473     such that there's room for the additional instruction needed to
5474     call the resolver.  Since _frvfdpic_assign_got_entries didn't
5475     account for them, our block size is 4 bytes smaller than the real
5476     block size.  */
5477  if (frvfdpic_plt_section (info))
5478    {
5479      frvfdpic_plt_section (info)->size = gpinfop->g.lzplt
5480	+ ((gpinfop->g.lzplt + (FRVFDPIC_LZPLT_BLOCK_SIZE - 4) - 8)
5481	   / (FRVFDPIC_LZPLT_BLOCK_SIZE - 4) * 4);
5482    }
5483
5484  /* Reset it, such that _frvfdpic_assign_plt_entries() can use it to
5485     actually assign lazy PLT entries addresses.  */
5486  gpinfop->g.lzplt = 0;
5487
5488  /* Save information that we're going to need to generate GOT and PLT
5489     entries.  */
5490  frvfdpic_got_initial_offset (info) = -gpinfop->gothilo.tmin;
5491
5492  if (get_elf_backend_data (output_bfd)->want_got_sym)
5493    elf_hash_table (info)->hgot->root.u.def.value
5494      = frvfdpic_got_initial_offset (info);
5495
5496  if (frvfdpic_plt_section (info))
5497    frvfdpic_plt_initial_offset (info) =
5498      frvfdpic_plt_section (info)->size;
5499
5500  /* Allocate a ret statement at plt_initial_offset, to be used by
5501     locally-resolved TLS descriptors.  */
5502  if (gpinfop->g.tls_ret_refs)
5503    frvfdpic_plt_section (info)->size += 4;
5504
5505  htab_traverse (frvfdpic_relocs_info (info), _frvfdpic_assign_plt_entries,
5506		 gpinfop);
5507
5508  /* Allocate the PLT section contents only after
5509     _frvfdpic_assign_plt_entries has a chance to add the size of the
5510     non-lazy PLT entries.  */
5511  if (frvfdpic_plt_section (info))
5512    {
5513      if (frvfdpic_plt_section (info)->size == 0)
5514	frvfdpic_plt_section (info)->flags |= SEC_EXCLUDE;
5515      else if (frvfdpic_plt_section (info)->contents == NULL)
5516	{
5517	  frvfdpic_plt_section (info)->contents =
5518	    (bfd_byte *) bfd_zalloc (dynobj,
5519				     frvfdpic_plt_section (info)->size);
5520	  if (frvfdpic_plt_section (info)->contents == NULL)
5521	    return FALSE;
5522	}
5523    }
5524
5525  return TRUE;
5526}
5527
5528/* Set the sizes of the dynamic sections.  */
5529
5530static bfd_boolean
5531elf32_frvfdpic_size_dynamic_sections (bfd *output_bfd,
5532				      struct bfd_link_info *info)
5533{
5534  bfd *dynobj;
5535  asection *s;
5536  struct _frvfdpic_dynamic_got_plt_info gpinfo;
5537
5538  dynobj = elf_hash_table (info)->dynobj;
5539  BFD_ASSERT (dynobj != NULL);
5540
5541  if (elf_hash_table (info)->dynamic_sections_created)
5542    {
5543      /* Set the contents of the .interp section to the interpreter.  */
5544      if (info->executable)
5545	{
5546	  s = bfd_get_section_by_name (dynobj, ".interp");
5547	  BFD_ASSERT (s != NULL);
5548	  s->size = sizeof ELF_DYNAMIC_INTERPRETER;
5549	  s->contents = (bfd_byte *) ELF_DYNAMIC_INTERPRETER;
5550	}
5551    }
5552
5553  memset (&gpinfo, 0, sizeof (gpinfo));
5554  gpinfo.g.info = info;
5555
5556  for (;;)
5557    {
5558      htab_t relocs = frvfdpic_relocs_info (info);
5559
5560      htab_traverse (relocs, _frvfdpic_resolve_final_relocs_info, &relocs);
5561
5562      if (relocs == frvfdpic_relocs_info (info))
5563	break;
5564    }
5565
5566  htab_traverse (frvfdpic_relocs_info (info), _frvfdpic_count_got_plt_entries,
5567		 &gpinfo.g);
5568
5569  /* Allocate space to save the summary information, we're going to
5570     use it if we're doing relaxations.  */
5571  frvfdpic_dynamic_got_plt_info (info) = bfd_alloc (dynobj, sizeof (gpinfo.g));
5572
5573  if (!_frvfdpic_size_got_plt (output_bfd, &gpinfo))
5574    return FALSE;
5575
5576  if (elf_hash_table (info)->dynamic_sections_created)
5577    {
5578      if (frvfdpic_got_section (info)->size)
5579	if (!_bfd_elf_add_dynamic_entry (info, DT_PLTGOT, 0))
5580	  return FALSE;
5581
5582      if (frvfdpic_pltrel_section (info)->size)
5583	if (!_bfd_elf_add_dynamic_entry (info, DT_PLTRELSZ, 0)
5584	    || !_bfd_elf_add_dynamic_entry (info, DT_PLTREL, DT_REL)
5585	    || !_bfd_elf_add_dynamic_entry (info, DT_JMPREL, 0))
5586	  return FALSE;
5587
5588      if (frvfdpic_gotrel_section (info)->size)
5589	if (!_bfd_elf_add_dynamic_entry (info, DT_REL, 0)
5590	    || !_bfd_elf_add_dynamic_entry (info, DT_RELSZ, 0)
5591	    || !_bfd_elf_add_dynamic_entry (info, DT_RELENT,
5592					    sizeof (Elf32_External_Rel)))
5593	  return FALSE;
5594    }
5595
5596  return TRUE;
5597}
5598
5599static bfd_boolean
5600elf32_frvfdpic_always_size_sections (bfd *output_bfd,
5601				     struct bfd_link_info *info)
5602{
5603  if (!info->relocatable)
5604    {
5605      struct elf_link_hash_entry *h;
5606      asection *sec;
5607
5608      /* Force a PT_GNU_STACK segment to be created.  */
5609      if (! elf_tdata (output_bfd)->stack_flags)
5610	elf_tdata (output_bfd)->stack_flags = PF_R | PF_W | PF_X;
5611
5612      /* Define __stacksize if it's not defined yet.  */
5613      h = elf_link_hash_lookup (elf_hash_table (info), "__stacksize",
5614				FALSE, FALSE, FALSE);
5615      if (! h || h->root.type != bfd_link_hash_defined
5616	  || h->type != STT_OBJECT
5617	  || !h->def_regular)
5618	{
5619	  struct bfd_link_hash_entry *bh = NULL;
5620
5621	  if (!(_bfd_generic_link_add_one_symbol
5622		(info, output_bfd, "__stacksize",
5623		 BSF_GLOBAL, bfd_abs_section_ptr, DEFAULT_STACK_SIZE,
5624		 (const char *) NULL, FALSE,
5625		 get_elf_backend_data (output_bfd)->collect, &bh)))
5626	    return FALSE;
5627
5628	  h = (struct elf_link_hash_entry *) bh;
5629	  h->def_regular = 1;
5630	  h->type = STT_OBJECT;
5631	  /* This one must NOT be hidden.  */
5632	}
5633
5634      /* Create a stack section, and set its alignment.  */
5635      sec = bfd_make_section (output_bfd, ".stack");
5636
5637      if (sec == NULL
5638	  || ! bfd_set_section_alignment (output_bfd, sec, 3))
5639	return FALSE;
5640    }
5641
5642  return TRUE;
5643}
5644
5645/* Look for opportunities to relax TLS relocations.  We can assume
5646   we're linking the main executable or a static-tls library, since
5647   otherwise we wouldn't have got here.  */
5648
5649static int
5650_frvfdpic_relax_got_plt_entries (void **entryp, void *dinfo_)
5651{
5652  struct frvfdpic_relocs_info *entry = *entryp;
5653  struct _frvfdpic_dynamic_got_info *dinfo = dinfo_;
5654
5655  _frvfdpic_relax_tls_entries (entry, dinfo, TRUE);
5656
5657  return 1;
5658}
5659
5660static bfd_boolean
5661elf32_frvfdpic_relax_section (bfd *abfd ATTRIBUTE_UNUSED, asection *sec,
5662			      struct bfd_link_info *info, bfd_boolean *again)
5663{
5664  struct _frvfdpic_dynamic_got_plt_info gpinfo;
5665
5666  /* If we return early, we didn't change anything.  */
5667  *again = FALSE;
5668
5669  /* We'll do our thing when requested to relax the GOT section.  */
5670  if (sec != frvfdpic_got_section (info))
5671    return TRUE;
5672
5673  /* We can only relax when linking the main executable or a library
5674     that can't be dlopened.  */
5675  if (! info->executable && ! (info->flags & DF_STATIC_TLS))
5676    return TRUE;
5677
5678  /* If there isn't a TLS section for this binary, we can't do
5679     anything about its TLS relocations (it probably doesn't have
5680     any.  */
5681  if (elf_hash_table (info)->tls_sec == NULL)
5682    return TRUE;
5683
5684  memset (&gpinfo, 0, sizeof (gpinfo));
5685  memcpy (&gpinfo.g, frvfdpic_dynamic_got_plt_info (info), sizeof (gpinfo.g));
5686
5687  /* Now look for opportunities to relax, adjusting the GOT usage
5688     as needed.  */
5689  htab_traverse (frvfdpic_relocs_info (info),
5690		 _frvfdpic_relax_got_plt_entries,
5691		 &gpinfo.g);
5692
5693  /* If we changed anything, reset and re-assign GOT and PLT entries.  */
5694  if (memcmp (frvfdpic_dynamic_got_plt_info (info),
5695	      &gpinfo.g, sizeof (gpinfo.g)) != 0)
5696    {
5697      /* Clear GOT and PLT assignments.  */
5698      htab_traverse (frvfdpic_relocs_info (info),
5699		     _frvfdpic_reset_got_plt_entries,
5700		     NULL);
5701
5702      /* The owner of the TLS section is the output bfd.  There should
5703	 be a better way to get to it.  */
5704      if (!_frvfdpic_size_got_plt (elf_hash_table (info)->tls_sec->owner,
5705				   &gpinfo))
5706	return FALSE;
5707
5708      /* Repeat until we don't make any further changes.  We could fail to
5709	 introduce changes in a round if, for example, the 12-bit range is
5710	 full, but we later release some space by getting rid of TLS
5711	 descriptors in it.  We have to repeat the whole process because
5712	 we might have changed the size of a section processed before this
5713	 one.  */
5714      *again = TRUE;
5715    }
5716
5717  return TRUE;
5718}
5719
5720static bfd_boolean
5721elf32_frvfdpic_modify_segment_map (bfd *output_bfd,
5722				   struct bfd_link_info *info)
5723{
5724  struct elf_segment_map *m;
5725
5726  /* objcopy and strip preserve what's already there using
5727     elf32_frvfdpic_copy_private_bfd_data ().  */
5728  if (! info)
5729    return TRUE;
5730
5731  for (m = elf_tdata (output_bfd)->segment_map; m != NULL; m = m->next)
5732    if (m->p_type == PT_GNU_STACK)
5733      break;
5734
5735  if (m)
5736    {
5737      asection *sec = bfd_get_section_by_name (output_bfd, ".stack");
5738      struct elf_link_hash_entry *h;
5739
5740      if (sec)
5741	{
5742	  /* Obtain the pointer to the __stacksize symbol.  */
5743	  h = elf_link_hash_lookup (elf_hash_table (info), "__stacksize",
5744				    FALSE, FALSE, FALSE);
5745	  while (h->root.type == bfd_link_hash_indirect
5746		 || h->root.type == bfd_link_hash_warning)
5747	    h = (struct elf_link_hash_entry *)h->root.u.i.link;
5748	  BFD_ASSERT (h->root.type == bfd_link_hash_defined);
5749
5750	  /* Set the section size from the symbol value.  We
5751	     intentionally ignore the symbol section.  */
5752	  if (h->root.type == bfd_link_hash_defined)
5753	    sec->size = h->root.u.def.value;
5754	  else
5755	    sec->size = DEFAULT_STACK_SIZE;
5756
5757	  /* Add the stack section to the PT_GNU_STACK segment,
5758	     such that its size and alignment requirements make it
5759	     to the segment.  */
5760	  m->sections[m->count] = sec;
5761	  m->count++;
5762	}
5763    }
5764
5765  return TRUE;
5766}
5767
5768/* Fill in code and data in dynamic sections.  */
5769
5770static bfd_boolean
5771elf32_frv_finish_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
5772				   struct bfd_link_info *info ATTRIBUTE_UNUSED)
5773{
5774  /* Nothing to be done for non-FDPIC.  */
5775  return TRUE;
5776}
5777
5778static bfd_boolean
5779elf32_frvfdpic_finish_dynamic_sections (bfd *output_bfd,
5780					struct bfd_link_info *info)
5781{
5782  bfd *dynobj;
5783  asection *sdyn;
5784
5785  dynobj = elf_hash_table (info)->dynobj;
5786
5787  if (frvfdpic_dynamic_got_plt_info (info))
5788    {
5789      BFD_ASSERT (frvfdpic_dynamic_got_plt_info (info)->tls_ret_refs == 0);
5790    }
5791  if (frvfdpic_got_section (info))
5792    {
5793      BFD_ASSERT (frvfdpic_gotrel_section (info)->size
5794		  == (frvfdpic_gotrel_section (info)->reloc_count
5795		      * sizeof (Elf32_External_Rel)));
5796
5797      if (frvfdpic_gotfixup_section (info))
5798	{
5799	  struct elf_link_hash_entry *hgot = elf_hash_table (info)->hgot;
5800	  bfd_vma got_value = hgot->root.u.def.value
5801	    + hgot->root.u.def.section->output_section->vma
5802	    + hgot->root.u.def.section->output_offset;
5803	  struct bfd_link_hash_entry *hend;
5804
5805	  _frvfdpic_add_rofixup (output_bfd, frvfdpic_gotfixup_section (info),
5806				 got_value, 0);
5807
5808	  if (frvfdpic_gotfixup_section (info)->size
5809	      != (frvfdpic_gotfixup_section (info)->reloc_count * 4))
5810	    {
5811	    error:
5812	      (*_bfd_error_handler)
5813		("LINKER BUG: .rofixup section size mismatch");
5814	      return FALSE;
5815	    }
5816
5817	  hend = bfd_link_hash_lookup (info->hash, "__ROFIXUP_END__",
5818				       FALSE, FALSE, TRUE);
5819	  if (hend
5820	      && (hend->type == bfd_link_hash_defined
5821		  || hend->type == bfd_link_hash_defweak))
5822	    {
5823	      bfd_vma value =
5824		frvfdpic_gotfixup_section (info)->output_section->vma
5825		+ frvfdpic_gotfixup_section (info)->output_offset
5826		+ frvfdpic_gotfixup_section (info)->size
5827		- hend->u.def.section->output_section->vma
5828		- hend->u.def.section->output_offset;
5829	      BFD_ASSERT (hend->u.def.value == value);
5830	      if (hend->u.def.value != value)
5831		goto error;
5832	    }
5833	}
5834    }
5835  if (frvfdpic_pltrel_section (info))
5836    {
5837      BFD_ASSERT (frvfdpic_pltrel_section (info)->size
5838		  == (frvfdpic_pltrel_section (info)->reloc_count
5839		      * sizeof (Elf32_External_Rel)));
5840    }
5841
5842
5843  if (elf_hash_table (info)->dynamic_sections_created)
5844    {
5845      Elf32_External_Dyn * dyncon;
5846      Elf32_External_Dyn * dynconend;
5847
5848      sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
5849
5850      BFD_ASSERT (sdyn != NULL);
5851
5852      dyncon = (Elf32_External_Dyn *) sdyn->contents;
5853      dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
5854
5855      for (; dyncon < dynconend; dyncon++)
5856	{
5857	  Elf_Internal_Dyn dyn;
5858
5859	  bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
5860
5861	  switch (dyn.d_tag)
5862	    {
5863	    default:
5864	      break;
5865
5866	    case DT_PLTGOT:
5867	      dyn.d_un.d_ptr = frvfdpic_got_section (info)->output_section->vma
5868		+ frvfdpic_got_section (info)->output_offset
5869		+ frvfdpic_got_initial_offset (info);
5870	      bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
5871	      break;
5872
5873	    case DT_JMPREL:
5874	      dyn.d_un.d_ptr = frvfdpic_pltrel_section (info)
5875		->output_section->vma
5876		+ frvfdpic_pltrel_section (info)->output_offset;
5877	      bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
5878	      break;
5879
5880	    case DT_PLTRELSZ:
5881	      dyn.d_un.d_val = frvfdpic_pltrel_section (info)->size;
5882	      bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
5883	      break;
5884	    }
5885	}
5886    }
5887
5888  return TRUE;
5889}
5890
5891/* Adjust a symbol defined by a dynamic object and referenced by a
5892   regular object.  */
5893
5894static bfd_boolean
5895elf32_frvfdpic_adjust_dynamic_symbol
5896(struct bfd_link_info *info ATTRIBUTE_UNUSED,
5897 struct elf_link_hash_entry *h ATTRIBUTE_UNUSED)
5898{
5899  bfd * dynobj;
5900
5901  dynobj = elf_hash_table (info)->dynobj;
5902
5903  /* Make sure we know what is going on here.  */
5904  BFD_ASSERT (dynobj != NULL
5905	      && (h->u.weakdef != NULL
5906		  || (h->def_dynamic
5907		      && h->ref_regular
5908		      && !h->def_regular)));
5909
5910  /* If this is a weak symbol, and there is a real definition, the
5911     processor independent code will have arranged for us to see the
5912     real definition first, and we can just use the same value.  */
5913  if (h->u.weakdef != NULL)
5914    {
5915      BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
5916		  || h->u.weakdef->root.type == bfd_link_hash_defweak);
5917      h->root.u.def.section = h->u.weakdef->root.u.def.section;
5918      h->root.u.def.value = h->u.weakdef->root.u.def.value;
5919    }
5920
5921  return TRUE;
5922}
5923
5924/* Perform any actions needed for dynamic symbols.  */
5925
5926static bfd_boolean
5927elf32_frvfdpic_finish_dynamic_symbol
5928(bfd *output_bfd ATTRIBUTE_UNUSED,
5929 struct bfd_link_info *info ATTRIBUTE_UNUSED,
5930 struct elf_link_hash_entry *h ATTRIBUTE_UNUSED,
5931 Elf_Internal_Sym *sym ATTRIBUTE_UNUSED)
5932{
5933  return TRUE;
5934}
5935
5936/* Decide whether to attempt to turn absptr or lsda encodings in
5937   shared libraries into pcrel within the given input section.  */
5938
5939static bfd_boolean
5940frvfdpic_elf_use_relative_eh_frame
5941(bfd *input_bfd ATTRIBUTE_UNUSED,
5942 struct bfd_link_info *info ATTRIBUTE_UNUSED,
5943 asection *eh_frame_section ATTRIBUTE_UNUSED)
5944{
5945  /* We can't use PC-relative encodings in FDPIC binaries, in general.  */
5946  return FALSE;
5947}
5948
5949/* Adjust the contents of an eh_frame_hdr section before they're output.  */
5950
5951static bfd_byte
5952frvfdpic_elf_encode_eh_address (bfd *abfd,
5953				struct bfd_link_info *info,
5954				asection *osec, bfd_vma offset,
5955				asection *loc_sec, bfd_vma loc_offset,
5956				bfd_vma *encoded)
5957{
5958  struct elf_link_hash_entry *h;
5959
5960  h = elf_hash_table (info)->hgot;
5961  BFD_ASSERT (h && h->root.type == bfd_link_hash_defined);
5962
5963  if (! h || (_frvfdpic_osec_to_segment (abfd, osec)
5964	      == _frvfdpic_osec_to_segment (abfd, loc_sec->output_section)))
5965    return _bfd_elf_encode_eh_address (abfd, info, osec, offset,
5966				       loc_sec, loc_offset, encoded);
5967
5968  BFD_ASSERT (_frvfdpic_osec_to_segment (abfd, osec)
5969	      == (_frvfdpic_osec_to_segment
5970		  (abfd, h->root.u.def.section->output_section)));
5971
5972  *encoded = osec->vma + offset
5973    - (h->root.u.def.value
5974       + h->root.u.def.section->output_section->vma
5975       + h->root.u.def.section->output_offset);
5976
5977  return DW_EH_PE_datarel | DW_EH_PE_sdata4;
5978}
5979
5980/* Look through the relocs for a section during the first phase.
5981
5982   Besides handling virtual table relocs for gc, we have to deal with
5983   all sorts of PIC-related relocations.  We describe below the
5984   general plan on how to handle such relocations, even though we only
5985   collect information at this point, storing them in hash tables for
5986   perusal of later passes.
5987
5988   32 relocations are propagated to the linker output when creating
5989   position-independent output.  LO16 and HI16 relocations are not
5990   supposed to be encountered in this case.
5991
5992   LABEL16 should always be resolvable by the linker, since it's only
5993   used by branches.
5994
5995   LABEL24, on the other hand, is used by calls.  If it turns out that
5996   the target of a call is a dynamic symbol, a PLT entry must be
5997   created for it, which triggers the creation of a private function
5998   descriptor and, unless lazy binding is disabled, a lazy PLT entry.
5999
6000   GPREL relocations require the referenced symbol to be in the same
6001   segment as _gp, but this can only be checked later.
6002
6003   All GOT, GOTOFF and FUNCDESC relocations require a .got section to
6004   exist.  LABEL24 might as well, since it may require a PLT entry,
6005   that will require a got.
6006
6007   Non-FUNCDESC GOT relocations require a GOT entry to be created
6008   regardless of whether the symbol is dynamic.  However, since a
6009   global symbol that turns out to not be exported may have the same
6010   address of a non-dynamic symbol, we don't assign GOT entries at
6011   this point, such that we can share them in this case.  A relocation
6012   for the GOT entry always has to be created, be it to offset a
6013   private symbol by the section load address, be it to get the symbol
6014   resolved dynamically.
6015
6016   FUNCDESC GOT relocations require a GOT entry to be created, and
6017   handled as if a FUNCDESC relocation was applied to the GOT entry in
6018   an object file.
6019
6020   FUNCDESC relocations referencing a symbol that turns out to NOT be
6021   dynamic cause a private function descriptor to be created.  The
6022   FUNCDESC relocation then decays to a 32 relocation that points at
6023   the private descriptor.  If the symbol is dynamic, the FUNCDESC
6024   relocation is propagated to the linker output, such that the
6025   dynamic linker creates the canonical descriptor, pointing to the
6026   dynamically-resolved definition of the function.
6027
6028   Non-FUNCDESC GOTOFF relocations must always refer to non-dynamic
6029   symbols that are assigned to the same segment as the GOT, but we
6030   can only check this later, after we know the complete set of
6031   symbols defined and/or exported.
6032
6033   FUNCDESC GOTOFF relocations require a function descriptor to be
6034   created and, unless lazy binding is disabled or the symbol is not
6035   dynamic, a lazy PLT entry.  Since we can't tell at this point
6036   whether a symbol is going to be dynamic, we have to decide later
6037   whether to create a lazy PLT entry or bind the descriptor directly
6038   to the private function.
6039
6040   FUNCDESC_VALUE relocations are not supposed to be present in object
6041   files, but they may very well be simply propagated to the linker
6042   output, since they have no side effect.
6043
6044
6045   A function descriptor always requires a FUNCDESC_VALUE relocation.
6046   Whether it's in .plt.rel or not depends on whether lazy binding is
6047   enabled and on whether the referenced symbol is dynamic.
6048
6049   The existence of a lazy PLT requires the resolverStub lazy PLT
6050   entry to be present.
6051
6052
6053   As for assignment of GOT, PLT and lazy PLT entries, and private
6054   descriptors, we might do them all sequentially, but we can do
6055   better than that.  For example, we can place GOT entries and
6056   private function descriptors referenced using 12-bit operands
6057   closer to the PIC register value, such that these relocations don't
6058   overflow.  Those that are only referenced with LO16 relocations
6059   could come next, but we may as well place PLT-required function
6060   descriptors in the 12-bit range to make them shorter.  Symbols
6061   referenced with LO16/HI16 may come next, but we may place
6062   additional function descriptors in the 16-bit range if we can
6063   reliably tell that we've already placed entries that are ever
6064   referenced with only LO16.  PLT entries are therefore generated as
6065   small as possible, while not introducing relocation overflows in
6066   GOT or FUNCDESC_GOTOFF relocations.  Lazy PLT entries could be
6067   generated before or after PLT entries, but not intermingled with
6068   them, such that we can have more lazy PLT entries in range for a
6069   branch to the resolverStub.  The resolverStub should be emitted at
6070   the most distant location from the first lazy PLT entry such that
6071   it's still in range for a branch, or closer, if there isn't a need
6072   for so many lazy PLT entries.  Additional lazy PLT entries may be
6073   emitted after the resolverStub, as long as branches are still in
6074   range.  If the branch goes out of range, longer lazy PLT entries
6075   are emitted.
6076
6077   We could further optimize PLT and lazy PLT entries by giving them
6078   priority in assignment to closer-to-gr17 locations depending on the
6079   number of occurrences of references to them (assuming a function
6080   that's called more often is more important for performance, so its
6081   PLT entry should be faster), or taking hints from the compiler.
6082   Given infinite time and money... :-)  */
6083
6084static bfd_boolean
6085elf32_frv_check_relocs (abfd, info, sec, relocs)
6086     bfd *abfd;
6087     struct bfd_link_info *info;
6088     asection *sec;
6089     const Elf_Internal_Rela *relocs;
6090{
6091  Elf_Internal_Shdr *symtab_hdr;
6092  struct elf_link_hash_entry **sym_hashes, **sym_hashes_end;
6093  const Elf_Internal_Rela *rel;
6094  const Elf_Internal_Rela *rel_end;
6095  bfd *dynobj;
6096  struct frvfdpic_relocs_info *picrel;
6097
6098  if (info->relocatable)
6099    return TRUE;
6100
6101  symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
6102  sym_hashes = elf_sym_hashes (abfd);
6103  sym_hashes_end = sym_hashes + symtab_hdr->sh_size/sizeof(Elf32_External_Sym);
6104  if (!elf_bad_symtab (abfd))
6105    sym_hashes_end -= symtab_hdr->sh_info;
6106
6107  dynobj = elf_hash_table (info)->dynobj;
6108  rel_end = relocs + sec->reloc_count;
6109  for (rel = relocs; rel < rel_end; rel++)
6110    {
6111      struct elf_link_hash_entry *h;
6112      unsigned long r_symndx;
6113
6114      r_symndx = ELF32_R_SYM (rel->r_info);
6115      if (r_symndx < symtab_hdr->sh_info)
6116        h = NULL;
6117      else
6118	{
6119	  h = sym_hashes[r_symndx - symtab_hdr->sh_info];
6120	  while (h->root.type == bfd_link_hash_indirect
6121		 || h->root.type == bfd_link_hash_warning)
6122	    h = (struct elf_link_hash_entry *) h->root.u.i.link;
6123	}
6124
6125      switch (ELF32_R_TYPE (rel->r_info))
6126	{
6127	case R_FRV_GETTLSOFF:
6128	case R_FRV_TLSDESC_VALUE:
6129	case R_FRV_GOTTLSDESC12:
6130	case R_FRV_GOTTLSDESCHI:
6131	case R_FRV_GOTTLSDESCLO:
6132	case R_FRV_GOTTLSOFF12:
6133	case R_FRV_GOTTLSOFFHI:
6134	case R_FRV_GOTTLSOFFLO:
6135	case R_FRV_TLSOFF:
6136	case R_FRV_GOT12:
6137	case R_FRV_GOTHI:
6138	case R_FRV_GOTLO:
6139	case R_FRV_FUNCDESC_GOT12:
6140	case R_FRV_FUNCDESC_GOTHI:
6141	case R_FRV_FUNCDESC_GOTLO:
6142	case R_FRV_GOTOFF12:
6143	case R_FRV_GOTOFFHI:
6144	case R_FRV_GOTOFFLO:
6145	case R_FRV_FUNCDESC_GOTOFF12:
6146	case R_FRV_FUNCDESC_GOTOFFHI:
6147	case R_FRV_FUNCDESC_GOTOFFLO:
6148	case R_FRV_FUNCDESC:
6149	case R_FRV_FUNCDESC_VALUE:
6150	case R_FRV_TLSMOFF12:
6151	case R_FRV_TLSMOFFHI:
6152	case R_FRV_TLSMOFFLO:
6153	case R_FRV_TLSMOFF:
6154	  if (! IS_FDPIC (abfd))
6155	    goto bad_reloc;
6156	  /* Fall through.  */
6157	case R_FRV_GPREL12:
6158	case R_FRV_GPRELU12:
6159	case R_FRV_GPRELHI:
6160	case R_FRV_GPRELLO:
6161	case R_FRV_LABEL24:
6162	case R_FRV_32:
6163	  if (! dynobj)
6164	    {
6165	      elf_hash_table (info)->dynobj = dynobj = abfd;
6166	      if (! _frv_create_got_section (abfd, info))
6167		return FALSE;
6168	    }
6169	  if (! IS_FDPIC (abfd))
6170	    {
6171	      picrel = NULL;
6172	      break;
6173	    }
6174	  if (h != NULL)
6175	    {
6176	      if (h->dynindx == -1)
6177		switch (ELF_ST_VISIBILITY (h->other))
6178		  {
6179		  case STV_INTERNAL:
6180		  case STV_HIDDEN:
6181		    break;
6182		  default:
6183		    bfd_elf_link_record_dynamic_symbol (info, h);
6184		    break;
6185		  }
6186	      picrel
6187		= frvfdpic_relocs_info_for_global (frvfdpic_relocs_info (info),
6188						   abfd, h,
6189						   rel->r_addend, INSERT);
6190	    }
6191	  else
6192	    picrel = frvfdpic_relocs_info_for_local (frvfdpic_relocs_info
6193						     (info), abfd, r_symndx,
6194						     rel->r_addend, INSERT);
6195	  if (! picrel)
6196	    return FALSE;
6197	  break;
6198
6199	default:
6200	  picrel = NULL;
6201	  break;
6202	}
6203
6204      switch (ELF32_R_TYPE (rel->r_info))
6205        {
6206	case R_FRV_LABEL24:
6207	  if (IS_FDPIC (abfd))
6208	    picrel->call = 1;
6209	  break;
6210
6211	case R_FRV_FUNCDESC_VALUE:
6212	  picrel->relocsfdv++;
6213	  if (bfd_get_section_flags (abfd, sec) & SEC_ALLOC)
6214	    picrel->relocs32--;
6215	  /* Fall through.  */
6216
6217	case R_FRV_32:
6218	  if (! IS_FDPIC (abfd))
6219	    break;
6220
6221	  picrel->sym = 1;
6222	  if (bfd_get_section_flags (abfd, sec) & SEC_ALLOC)
6223	    picrel->relocs32++;
6224	  break;
6225
6226	case R_FRV_GOT12:
6227	  picrel->got12 = 1;
6228	  break;
6229
6230	case R_FRV_GOTHI:
6231	case R_FRV_GOTLO:
6232	  picrel->gothilo = 1;
6233	  break;
6234
6235	case R_FRV_FUNCDESC_GOT12:
6236	  picrel->fdgot12 = 1;
6237	  break;
6238
6239	case R_FRV_FUNCDESC_GOTHI:
6240	case R_FRV_FUNCDESC_GOTLO:
6241	  picrel->fdgothilo = 1;
6242	  break;
6243
6244	case R_FRV_GOTOFF12:
6245	case R_FRV_GOTOFFHI:
6246	case R_FRV_GOTOFFLO:
6247	  picrel->gotoff = 1;
6248	  break;
6249
6250	case R_FRV_FUNCDESC_GOTOFF12:
6251	  picrel->fdgoff12 = 1;
6252	  break;
6253
6254	case R_FRV_FUNCDESC_GOTOFFHI:
6255	case R_FRV_FUNCDESC_GOTOFFLO:
6256	  picrel->fdgoffhilo = 1;
6257	  break;
6258
6259	case R_FRV_FUNCDESC:
6260	  picrel->fd = 1;
6261	  picrel->relocsfd++;
6262	  break;
6263
6264	case R_FRV_GETTLSOFF:
6265	  picrel->tlsplt = 1;
6266	  break;
6267
6268	case R_FRV_TLSDESC_VALUE:
6269	  picrel->relocstlsd++;
6270	  goto bad_reloc;
6271
6272	case R_FRV_GOTTLSDESC12:
6273	  picrel->tlsdesc12 = 1;
6274	  break;
6275
6276	case R_FRV_GOTTLSDESCHI:
6277	case R_FRV_GOTTLSDESCLO:
6278	  picrel->tlsdeschilo = 1;
6279	  break;
6280
6281	case R_FRV_TLSMOFF12:
6282	case R_FRV_TLSMOFFHI:
6283	case R_FRV_TLSMOFFLO:
6284	case R_FRV_TLSMOFF:
6285	  break;
6286
6287	case R_FRV_GOTTLSOFF12:
6288	  picrel->tlsoff12 = 1;
6289	  info->flags |= DF_STATIC_TLS;
6290	  break;
6291
6292	case R_FRV_GOTTLSOFFHI:
6293	case R_FRV_GOTTLSOFFLO:
6294	  picrel->tlsoffhilo = 1;
6295	  info->flags |= DF_STATIC_TLS;
6296	  break;
6297
6298	case R_FRV_TLSOFF:
6299	  picrel->relocstlsoff++;
6300	  info->flags |= DF_STATIC_TLS;
6301	  goto bad_reloc;
6302
6303        /* This relocation describes the C++ object vtable hierarchy.
6304           Reconstruct it for later use during GC.  */
6305        case R_FRV_GNU_VTINHERIT:
6306          if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
6307            return FALSE;
6308          break;
6309
6310        /* This relocation describes which C++ vtable entries are actually
6311           used.  Record for later use during GC.  */
6312        case R_FRV_GNU_VTENTRY:
6313          if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
6314            return FALSE;
6315          break;
6316
6317	case R_FRV_LABEL16:
6318	case R_FRV_LO16:
6319	case R_FRV_HI16:
6320	case R_FRV_GPREL12:
6321	case R_FRV_GPRELU12:
6322	case R_FRV_GPREL32:
6323	case R_FRV_GPRELHI:
6324	case R_FRV_GPRELLO:
6325	case R_FRV_TLSDESC_RELAX:
6326	case R_FRV_GETTLSOFF_RELAX:
6327	case R_FRV_TLSOFF_RELAX:
6328	  break;
6329
6330	default:
6331	bad_reloc:
6332	  (*_bfd_error_handler)
6333	    (_("%B: unsupported relocation type %i"),
6334	     abfd, ELF32_R_TYPE (rel->r_info));
6335	  return FALSE;
6336        }
6337    }
6338
6339  return TRUE;
6340}
6341
6342
6343/* Return the machine subcode from the ELF e_flags header.  */
6344
6345static int
6346elf32_frv_machine (abfd)
6347     bfd *abfd;
6348{
6349  switch (elf_elfheader (abfd)->e_flags & EF_FRV_CPU_MASK)
6350    {
6351    default:		    break;
6352    case EF_FRV_CPU_FR550:  return bfd_mach_fr550;
6353    case EF_FRV_CPU_FR500:  return bfd_mach_fr500;
6354    case EF_FRV_CPU_FR450:  return bfd_mach_fr450;
6355    case EF_FRV_CPU_FR405:  return bfd_mach_fr400;
6356    case EF_FRV_CPU_FR400:  return bfd_mach_fr400;
6357    case EF_FRV_CPU_FR300:  return bfd_mach_fr300;
6358    case EF_FRV_CPU_SIMPLE: return bfd_mach_frvsimple;
6359    case EF_FRV_CPU_TOMCAT: return bfd_mach_frvtomcat;
6360    }
6361
6362  return bfd_mach_frv;
6363}
6364
6365/* Set the right machine number for a FRV ELF file.  */
6366
6367static bfd_boolean
6368elf32_frv_object_p (abfd)
6369     bfd *abfd;
6370{
6371  bfd_default_set_arch_mach (abfd, bfd_arch_frv, elf32_frv_machine (abfd));
6372  return (((elf_elfheader (abfd)->e_flags & EF_FRV_FDPIC) != 0)
6373	  == (IS_FDPIC (abfd)));
6374}
6375
6376/* Function to set the ELF flag bits.  */
6377
6378static bfd_boolean
6379frv_elf_set_private_flags (abfd, flags)
6380     bfd *abfd;
6381     flagword flags;
6382{
6383  elf_elfheader (abfd)->e_flags = flags;
6384  elf_flags_init (abfd) = TRUE;
6385  return TRUE;
6386}
6387
6388/* Copy backend specific data from one object module to another.  */
6389
6390static bfd_boolean
6391frv_elf_copy_private_bfd_data (ibfd, obfd)
6392     bfd *ibfd;
6393     bfd *obfd;
6394{
6395  if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
6396      || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
6397    return TRUE;
6398
6399  BFD_ASSERT (!elf_flags_init (obfd)
6400	      || elf_elfheader (obfd)->e_flags == elf_elfheader (ibfd)->e_flags);
6401
6402  elf_elfheader (obfd)->e_flags = elf_elfheader (ibfd)->e_flags;
6403  elf_flags_init (obfd) = TRUE;
6404  return TRUE;
6405}
6406
6407/* Return true if the architecture described by elf header flag
6408   EXTENSION is an extension of the architecture described by BASE.  */
6409
6410static bfd_boolean
6411frv_elf_arch_extension_p (flagword base, flagword extension)
6412{
6413  if (base == extension)
6414    return TRUE;
6415
6416  /* CPU_GENERIC code can be merged with code for a specific
6417     architecture, in which case the result is marked as being
6418     for the specific architecture.  Everything is therefore
6419     an extension of CPU_GENERIC.  */
6420  if (base == EF_FRV_CPU_GENERIC)
6421    return TRUE;
6422
6423  if (extension == EF_FRV_CPU_FR450)
6424    if (base == EF_FRV_CPU_FR400 || base == EF_FRV_CPU_FR405)
6425      return TRUE;
6426
6427  if (extension == EF_FRV_CPU_FR405)
6428    if (base == EF_FRV_CPU_FR400)
6429      return TRUE;
6430
6431  return FALSE;
6432}
6433
6434static bfd_boolean
6435elf32_frvfdpic_copy_private_bfd_data (bfd *ibfd, bfd *obfd)
6436{
6437  unsigned i;
6438
6439  if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
6440      || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
6441    return TRUE;
6442
6443  if (! frv_elf_copy_private_bfd_data (ibfd, obfd))
6444    return FALSE;
6445
6446  if (! elf_tdata (ibfd) || ! elf_tdata (ibfd)->phdr
6447      || ! elf_tdata (obfd) || ! elf_tdata (obfd)->phdr)
6448    return TRUE;
6449
6450  /* Copy the stack size.  */
6451  for (i = 0; i < elf_elfheader (ibfd)->e_phnum; i++)
6452    if (elf_tdata (ibfd)->phdr[i].p_type == PT_GNU_STACK)
6453      {
6454	Elf_Internal_Phdr *iphdr = &elf_tdata (ibfd)->phdr[i];
6455
6456	for (i = 0; i < elf_elfheader (obfd)->e_phnum; i++)
6457	  if (elf_tdata (obfd)->phdr[i].p_type == PT_GNU_STACK)
6458	    {
6459	      memcpy (&elf_tdata (obfd)->phdr[i], iphdr, sizeof (*iphdr));
6460
6461	      /* Rewrite the phdrs, since we're only called after they
6462		 were first written.  */
6463	      if (bfd_seek (obfd, (bfd_signed_vma) get_elf_backend_data (obfd)
6464			    ->s->sizeof_ehdr, SEEK_SET) != 0
6465		  || get_elf_backend_data (obfd)->s
6466		  ->write_out_phdrs (obfd, elf_tdata (obfd)->phdr,
6467				     elf_elfheader (obfd)->e_phnum) != 0)
6468		return FALSE;
6469	      break;
6470	    }
6471
6472	break;
6473      }
6474
6475  return TRUE;
6476}
6477
6478/* Merge backend specific data from an object file to the output
6479   object file when linking.  */
6480
6481static bfd_boolean
6482frv_elf_merge_private_bfd_data (ibfd, obfd)
6483     bfd *ibfd;
6484     bfd *obfd;
6485{
6486  flagword old_flags, old_partial;
6487  flagword new_flags, new_partial;
6488  bfd_boolean error = FALSE;
6489  char new_opt[80];
6490  char old_opt[80];
6491
6492  new_opt[0] = old_opt[0] = '\0';
6493  new_flags = elf_elfheader (ibfd)->e_flags;
6494  old_flags = elf_elfheader (obfd)->e_flags;
6495
6496  if (new_flags & EF_FRV_FDPIC)
6497    new_flags &= ~EF_FRV_PIC;
6498
6499#ifdef DEBUG
6500  (*_bfd_error_handler) ("old_flags = 0x%.8lx, new_flags = 0x%.8lx, init = %s, filename = %s",
6501			 old_flags, new_flags, elf_flags_init (obfd) ? "yes" : "no",
6502			 bfd_get_filename (ibfd));
6503#endif
6504
6505  if (!elf_flags_init (obfd))			/* First call, no flags set.  */
6506    {
6507      elf_flags_init (obfd) = TRUE;
6508      old_flags = new_flags;
6509    }
6510
6511  else if (new_flags == old_flags)		/* Compatible flags are ok.  */
6512    ;
6513
6514  else						/* Possibly incompatible flags.  */
6515    {
6516      /* Warn if different # of gprs are used.  Note, 0 means nothing is
6517         said about the size of gprs.  */
6518      new_partial = (new_flags & EF_FRV_GPR_MASK);
6519      old_partial = (old_flags & EF_FRV_GPR_MASK);
6520      if (new_partial == old_partial)
6521	;
6522
6523      else if (new_partial == 0)
6524	;
6525
6526      else if (old_partial == 0)
6527	old_flags |= new_partial;
6528
6529      else
6530	{
6531	  switch (new_partial)
6532	    {
6533	    default:		strcat (new_opt, " -mgpr-??"); break;
6534	    case EF_FRV_GPR_32: strcat (new_opt, " -mgpr-32"); break;
6535	    case EF_FRV_GPR_64: strcat (new_opt, " -mgpr-64"); break;
6536	    }
6537
6538	  switch (old_partial)
6539	    {
6540	    default:		strcat (old_opt, " -mgpr-??"); break;
6541	    case EF_FRV_GPR_32: strcat (old_opt, " -mgpr-32"); break;
6542	    case EF_FRV_GPR_64: strcat (old_opt, " -mgpr-64"); break;
6543	    }
6544	}
6545
6546      /* Warn if different # of fprs are used.  Note, 0 means nothing is
6547         said about the size of fprs.  */
6548      new_partial = (new_flags & EF_FRV_FPR_MASK);
6549      old_partial = (old_flags & EF_FRV_FPR_MASK);
6550      if (new_partial == old_partial)
6551	;
6552
6553      else if (new_partial == 0)
6554	;
6555
6556      else if (old_partial == 0)
6557	old_flags |= new_partial;
6558
6559      else
6560	{
6561	  switch (new_partial)
6562	    {
6563	    default:		  strcat (new_opt, " -mfpr-?");      break;
6564	    case EF_FRV_FPR_32:   strcat (new_opt, " -mfpr-32");     break;
6565	    case EF_FRV_FPR_64:   strcat (new_opt, " -mfpr-64");     break;
6566	    case EF_FRV_FPR_NONE: strcat (new_opt, " -msoft-float"); break;
6567	    }
6568
6569	  switch (old_partial)
6570	    {
6571	    default:		  strcat (old_opt, " -mfpr-?");      break;
6572	    case EF_FRV_FPR_32:   strcat (old_opt, " -mfpr-32");     break;
6573	    case EF_FRV_FPR_64:   strcat (old_opt, " -mfpr-64");     break;
6574	    case EF_FRV_FPR_NONE: strcat (old_opt, " -msoft-float"); break;
6575	    }
6576	}
6577
6578      /* Warn if different dword support was used.  Note, 0 means nothing is
6579         said about the dword support.  */
6580      new_partial = (new_flags & EF_FRV_DWORD_MASK);
6581      old_partial = (old_flags & EF_FRV_DWORD_MASK);
6582      if (new_partial == old_partial)
6583	;
6584
6585      else if (new_partial == 0)
6586	;
6587
6588      else if (old_partial == 0)
6589	old_flags |= new_partial;
6590
6591      else
6592	{
6593	  switch (new_partial)
6594	    {
6595	    default:		   strcat (new_opt, " -mdword-?");  break;
6596	    case EF_FRV_DWORD_YES: strcat (new_opt, " -mdword");    break;
6597	    case EF_FRV_DWORD_NO:  strcat (new_opt, " -mno-dword"); break;
6598	    }
6599
6600	  switch (old_partial)
6601	    {
6602	    default:		   strcat (old_opt, " -mdword-?");  break;
6603	    case EF_FRV_DWORD_YES: strcat (old_opt, " -mdword");    break;
6604	    case EF_FRV_DWORD_NO:  strcat (old_opt, " -mno-dword"); break;
6605	    }
6606	}
6607
6608      /* Or in flags that accumulate (ie, if one module uses it, mark that the
6609	 feature is used.  */
6610      old_flags |= new_flags & (EF_FRV_DOUBLE
6611				| EF_FRV_MEDIA
6612				| EF_FRV_MULADD
6613				| EF_FRV_NON_PIC_RELOCS);
6614
6615      /* If any module was compiled without -G0, clear the G0 bit.  */
6616      old_flags = ((old_flags & ~ EF_FRV_G0)
6617		   | (old_flags & new_flags & EF_FRV_G0));
6618
6619      /* If any module was compiled without -mnopack, clear the mnopack bit.  */
6620      old_flags = ((old_flags & ~ EF_FRV_NOPACK)
6621		   | (old_flags & new_flags & EF_FRV_NOPACK));
6622
6623      /* We don't have to do anything if the pic flags are the same, or the new
6624         module(s) were compiled with -mlibrary-pic.  */
6625      new_partial = (new_flags & EF_FRV_PIC_FLAGS);
6626      old_partial = (old_flags & EF_FRV_PIC_FLAGS);
6627      if ((new_partial == old_partial) || ((new_partial & EF_FRV_LIBPIC) != 0))
6628	;
6629
6630      /* If the old module(s) were compiled with -mlibrary-pic, copy in the pic
6631         flags if any from the new module.  */
6632      else if ((old_partial & EF_FRV_LIBPIC) != 0)
6633	old_flags = (old_flags & ~ EF_FRV_PIC_FLAGS) | new_partial;
6634
6635      /* If we have mixtures of -fpic and -fPIC, or in both bits.  */
6636      else if (new_partial != 0 && old_partial != 0)
6637	old_flags |= new_partial;
6638
6639      /* One module was compiled for pic and the other was not, see if we have
6640         had any relocations that are not pic-safe.  */
6641      else
6642	{
6643	  if ((old_flags & EF_FRV_NON_PIC_RELOCS) == 0)
6644	    old_flags |= new_partial;
6645	  else
6646	    {
6647	      old_flags &= ~ EF_FRV_PIC_FLAGS;
6648#ifndef FRV_NO_PIC_ERROR
6649	      error = TRUE;
6650	      (*_bfd_error_handler)
6651		(_("%s: compiled with %s and linked with modules that use non-pic relocations"),
6652		 bfd_get_filename (ibfd),
6653		 (new_flags & EF_FRV_BIGPIC) ? "-fPIC" : "-fpic");
6654#endif
6655	    }
6656	}
6657
6658      /* Warn if different cpu is used (allow a specific cpu to override
6659	 the generic cpu).  */
6660      new_partial = (new_flags & EF_FRV_CPU_MASK);
6661      old_partial = (old_flags & EF_FRV_CPU_MASK);
6662      if (frv_elf_arch_extension_p (new_partial, old_partial))
6663	;
6664
6665      else if (frv_elf_arch_extension_p (old_partial, new_partial))
6666	old_flags = (old_flags & ~EF_FRV_CPU_MASK) | new_partial;
6667
6668      else
6669	{
6670	  switch (new_partial)
6671	    {
6672	    default:		     strcat (new_opt, " -mcpu=?");      break;
6673	    case EF_FRV_CPU_GENERIC: strcat (new_opt, " -mcpu=frv");    break;
6674	    case EF_FRV_CPU_SIMPLE:  strcat (new_opt, " -mcpu=simple"); break;
6675	    case EF_FRV_CPU_FR550:   strcat (new_opt, " -mcpu=fr550");  break;
6676	    case EF_FRV_CPU_FR500:   strcat (new_opt, " -mcpu=fr500");  break;
6677	    case EF_FRV_CPU_FR450:   strcat (new_opt, " -mcpu=fr450");  break;
6678	    case EF_FRV_CPU_FR405:   strcat (new_opt, " -mcpu=fr405");  break;
6679	    case EF_FRV_CPU_FR400:   strcat (new_opt, " -mcpu=fr400");  break;
6680	    case EF_FRV_CPU_FR300:   strcat (new_opt, " -mcpu=fr300");  break;
6681	    case EF_FRV_CPU_TOMCAT:  strcat (new_opt, " -mcpu=tomcat"); break;
6682	    }
6683
6684	  switch (old_partial)
6685	    {
6686	    default:		     strcat (old_opt, " -mcpu=?");      break;
6687	    case EF_FRV_CPU_GENERIC: strcat (old_opt, " -mcpu=frv");    break;
6688	    case EF_FRV_CPU_SIMPLE:  strcat (old_opt, " -mcpu=simple"); break;
6689	    case EF_FRV_CPU_FR550:   strcat (old_opt, " -mcpu=fr550");  break;
6690	    case EF_FRV_CPU_FR500:   strcat (old_opt, " -mcpu=fr500");  break;
6691	    case EF_FRV_CPU_FR450:   strcat (old_opt, " -mcpu=fr450");  break;
6692	    case EF_FRV_CPU_FR405:   strcat (old_opt, " -mcpu=fr405");  break;
6693	    case EF_FRV_CPU_FR400:   strcat (old_opt, " -mcpu=fr400");  break;
6694	    case EF_FRV_CPU_FR300:   strcat (old_opt, " -mcpu=fr300");  break;
6695	    case EF_FRV_CPU_TOMCAT:  strcat (old_opt, " -mcpu=tomcat"); break;
6696	    }
6697	}
6698
6699      /* Print out any mismatches from above.  */
6700      if (new_opt[0])
6701	{
6702	  error = TRUE;
6703	  (*_bfd_error_handler)
6704	    (_("%s: compiled with %s and linked with modules compiled with %s"),
6705	     bfd_get_filename (ibfd), new_opt, old_opt);
6706	}
6707
6708      /* Warn about any other mismatches */
6709      new_partial = (new_flags & ~ EF_FRV_ALL_FLAGS);
6710      old_partial = (old_flags & ~ EF_FRV_ALL_FLAGS);
6711      if (new_partial != old_partial)
6712	{
6713	  old_flags |= new_partial;
6714	  error = TRUE;
6715	  (*_bfd_error_handler)
6716	    (_("%s: uses different unknown e_flags (0x%lx) fields than previous modules (0x%lx)"),
6717	     bfd_get_filename (ibfd), (long)new_partial, (long)old_partial);
6718	}
6719    }
6720
6721  /* If the cpu is -mcpu=simple, then set the -mnopack bit.  */
6722  if ((old_flags & EF_FRV_CPU_MASK) == EF_FRV_CPU_SIMPLE)
6723    old_flags |= EF_FRV_NOPACK;
6724
6725  /* Update the old flags now with changes made above.  */
6726  old_partial = elf_elfheader (obfd)->e_flags & EF_FRV_CPU_MASK;
6727  elf_elfheader (obfd)->e_flags = old_flags;
6728  if (old_partial != (old_flags & EF_FRV_CPU_MASK))
6729    bfd_default_set_arch_mach (obfd, bfd_arch_frv, elf32_frv_machine (obfd));
6730
6731  if (((new_flags & EF_FRV_FDPIC) == 0)
6732      != (! IS_FDPIC (ibfd)))
6733    {
6734      error = TRUE;
6735      if (IS_FDPIC (obfd))
6736	(*_bfd_error_handler)
6737	  (_("%s: cannot link non-fdpic object file into fdpic executable"),
6738	   bfd_get_filename (ibfd));
6739      else
6740	(*_bfd_error_handler)
6741	  (_("%s: cannot link fdpic object file into non-fdpic executable"),
6742	   bfd_get_filename (ibfd));
6743    }
6744
6745  if (error)
6746    bfd_set_error (bfd_error_bad_value);
6747
6748  return !error;
6749}
6750
6751
6752bfd_boolean
6753frv_elf_print_private_bfd_data (abfd, ptr)
6754     bfd *abfd;
6755     PTR ptr;
6756{
6757  FILE *file = (FILE *) ptr;
6758  flagword flags;
6759
6760  BFD_ASSERT (abfd != NULL && ptr != NULL);
6761
6762  /* Print normal ELF private data.  */
6763  _bfd_elf_print_private_bfd_data (abfd, ptr);
6764
6765  flags = elf_elfheader (abfd)->e_flags;
6766  fprintf (file, _("private flags = 0x%lx:"), (long)flags);
6767
6768  switch (flags & EF_FRV_CPU_MASK)
6769    {
6770    default:							break;
6771    case EF_FRV_CPU_SIMPLE: fprintf (file, " -mcpu=simple");	break;
6772    case EF_FRV_CPU_FR550:  fprintf (file, " -mcpu=fr550");	break;
6773    case EF_FRV_CPU_FR500:  fprintf (file, " -mcpu=fr500");	break;
6774    case EF_FRV_CPU_FR450:  fprintf (file, " -mcpu=fr450");	break;
6775    case EF_FRV_CPU_FR405:  fprintf (file, " -mcpu=fr405");	break;
6776    case EF_FRV_CPU_FR400:  fprintf (file, " -mcpu=fr400");	break;
6777    case EF_FRV_CPU_FR300:  fprintf (file, " -mcpu=fr300");	break;
6778    case EF_FRV_CPU_TOMCAT: fprintf (file, " -mcpu=tomcat");	break;
6779    }
6780
6781  switch (flags & EF_FRV_GPR_MASK)
6782    {
6783    default:							break;
6784    case EF_FRV_GPR_32: fprintf (file, " -mgpr-32");		break;
6785    case EF_FRV_GPR_64: fprintf (file, " -mgpr-64");		break;
6786    }
6787
6788  switch (flags & EF_FRV_FPR_MASK)
6789    {
6790    default:							break;
6791    case EF_FRV_FPR_32:   fprintf (file, " -mfpr-32");		break;
6792    case EF_FRV_FPR_64:   fprintf (file, " -mfpr-64");		break;
6793    case EF_FRV_FPR_NONE: fprintf (file, " -msoft-float");	break;
6794    }
6795
6796  switch (flags & EF_FRV_DWORD_MASK)
6797    {
6798    default:							break;
6799    case EF_FRV_DWORD_YES: fprintf (file, " -mdword");		break;
6800    case EF_FRV_DWORD_NO:  fprintf (file, " -mno-dword");	break;
6801    }
6802
6803  if (flags & EF_FRV_DOUBLE)
6804    fprintf (file, " -mdouble");
6805
6806  if (flags & EF_FRV_MEDIA)
6807    fprintf (file, " -mmedia");
6808
6809  if (flags & EF_FRV_MULADD)
6810    fprintf (file, " -mmuladd");
6811
6812  if (flags & EF_FRV_PIC)
6813    fprintf (file, " -fpic");
6814
6815  if (flags & EF_FRV_BIGPIC)
6816    fprintf (file, " -fPIC");
6817
6818  if (flags & EF_FRV_LIBPIC)
6819    fprintf (file, " -mlibrary-pic");
6820
6821  if (flags & EF_FRV_FDPIC)
6822    fprintf (file, " -mfdpic");
6823
6824  if (flags & EF_FRV_NON_PIC_RELOCS)
6825    fprintf (file, " non-pic relocations");
6826
6827  if (flags & EF_FRV_G0)
6828    fprintf (file, " -G0");
6829
6830  fputc ('\n', file);
6831  return TRUE;
6832}
6833
6834
6835/* Support for core dump NOTE sections.  */
6836
6837static bfd_boolean
6838elf32_frv_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
6839{
6840  int offset;
6841  unsigned int raw_size;
6842
6843  switch (note->descsz)
6844    {
6845      default:
6846	return FALSE;
6847
6848      /* The Linux/FRV elf_prstatus struct is 268 bytes long.  The other
6849         hardcoded offsets and sizes listed below (and contained within
6850	 this lexical block) refer to fields in the target's elf_prstatus
6851	 struct.  */
6852      case 268:
6853	/* `pr_cursig' is at offset 12.  */
6854	elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, note->descdata + 12);
6855
6856	/* `pr_pid' is at offset 24.  */
6857	elf_tdata (abfd)->core_pid = bfd_get_32 (abfd, note->descdata + 24);
6858
6859	/* `pr_reg' is at offset 72.  */
6860	offset = 72;
6861
6862	/* Most grok_prstatus implementations set `raw_size' to the size
6863	   of the pr_reg field.  For Linux/FRV, we set `raw_size' to be
6864	   the size of `pr_reg' plus the size of `pr_exec_fdpic_loadmap'
6865	   and `pr_interp_fdpic_loadmap', both of which (by design)
6866	   immediately follow `pr_reg'.  This will allow these fields to
6867	   be viewed by GDB as registers.
6868
6869	   `pr_reg' is 184 bytes long.  `pr_exec_fdpic_loadmap' and
6870	   `pr_interp_fdpic_loadmap' are 4 bytes each.  */
6871	raw_size = 184 + 4 + 4;
6872
6873	break;
6874    }
6875
6876  /* Make a ".reg/999" section.  */
6877  return _bfd_elfcore_make_pseudosection (abfd, ".reg", raw_size,
6878					  note->descpos + offset);
6879}
6880
6881static bfd_boolean
6882elf32_frv_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
6883{
6884  switch (note->descsz)
6885    {
6886      default:
6887	return FALSE;
6888
6889      /* The Linux/FRV elf_prpsinfo struct is 124 bytes long.  */
6890      case 124:
6891
6892	/* `pr_fname' is found at offset 28 and is 16 bytes long.  */
6893	elf_tdata (abfd)->core_program
6894	  = _bfd_elfcore_strndup (abfd, note->descdata + 28, 16);
6895
6896	/* `pr_psargs' is found at offset 44 and is 80 bytes long.  */
6897	elf_tdata (abfd)->core_command
6898	  = _bfd_elfcore_strndup (abfd, note->descdata + 44, 80);
6899    }
6900
6901  /* Note that for some reason, a spurious space is tacked
6902     onto the end of the args in some (at least one anyway)
6903     implementations, so strip it off if it exists.  */
6904
6905  {
6906    char *command = elf_tdata (abfd)->core_command;
6907    int n = strlen (command);
6908
6909    if (0 < n && command[n - 1] == ' ')
6910      command[n - 1] = '\0';
6911  }
6912
6913  return TRUE;
6914}
6915#define ELF_ARCH		bfd_arch_frv
6916#define ELF_MACHINE_CODE	EM_CYGNUS_FRV
6917#define ELF_MAXPAGESIZE		0x1000
6918
6919#define TARGET_BIG_SYM          bfd_elf32_frv_vec
6920#define TARGET_BIG_NAME		"elf32-frv"
6921
6922#define elf_info_to_howto			frv_info_to_howto_rela
6923#define elf_backend_relocate_section		elf32_frv_relocate_section
6924#define elf_backend_gc_mark_hook		elf32_frv_gc_mark_hook
6925#define elf_backend_gc_sweep_hook		elf32_frv_gc_sweep_hook
6926#define elf_backend_check_relocs                elf32_frv_check_relocs
6927#define elf_backend_object_p			elf32_frv_object_p
6928#define elf_backend_add_symbol_hook             elf32_frv_add_symbol_hook
6929
6930#define elf_backend_can_gc_sections		1
6931#define elf_backend_rela_normal			1
6932
6933#define bfd_elf32_bfd_reloc_type_lookup		frv_reloc_type_lookup
6934#define bfd_elf32_bfd_set_private_flags		frv_elf_set_private_flags
6935#define bfd_elf32_bfd_copy_private_bfd_data	frv_elf_copy_private_bfd_data
6936#define bfd_elf32_bfd_merge_private_bfd_data	frv_elf_merge_private_bfd_data
6937#define bfd_elf32_bfd_print_private_bfd_data	frv_elf_print_private_bfd_data
6938
6939#define elf_backend_want_got_sym	1
6940#define elf_backend_got_header_size	0
6941#define elf_backend_want_got_plt	0
6942#define elf_backend_plt_readonly	1
6943#define elf_backend_want_plt_sym	0
6944#define elf_backend_plt_header_size	0
6945
6946#define elf_backend_finish_dynamic_sections \
6947		elf32_frv_finish_dynamic_sections
6948
6949#define elf_backend_grok_prstatus	elf32_frv_grok_prstatus
6950#define elf_backend_grok_psinfo		elf32_frv_grok_psinfo
6951
6952#include "elf32-target.h"
6953
6954#undef ELF_MAXPAGESIZE
6955#define ELF_MAXPAGESIZE		0x4000
6956
6957#undef TARGET_BIG_SYM
6958#define TARGET_BIG_SYM          bfd_elf32_frvfdpic_vec
6959#undef TARGET_BIG_NAME
6960#define TARGET_BIG_NAME		"elf32-frvfdpic"
6961#undef	elf32_bed
6962#define	elf32_bed		elf32_frvfdpic_bed
6963
6964#undef elf_info_to_howto_rel
6965#define elf_info_to_howto_rel	frvfdpic_info_to_howto_rel
6966
6967#undef bfd_elf32_bfd_link_hash_table_create
6968#define bfd_elf32_bfd_link_hash_table_create \
6969		frvfdpic_elf_link_hash_table_create
6970#undef elf_backend_always_size_sections
6971#define elf_backend_always_size_sections \
6972		elf32_frvfdpic_always_size_sections
6973#undef elf_backend_modify_segment_map
6974#define elf_backend_modify_segment_map \
6975		elf32_frvfdpic_modify_segment_map
6976#undef bfd_elf32_bfd_copy_private_bfd_data
6977#define bfd_elf32_bfd_copy_private_bfd_data \
6978		elf32_frvfdpic_copy_private_bfd_data
6979
6980#undef elf_backend_create_dynamic_sections
6981#define elf_backend_create_dynamic_sections \
6982		elf32_frvfdpic_create_dynamic_sections
6983#undef elf_backend_adjust_dynamic_symbol
6984#define elf_backend_adjust_dynamic_symbol \
6985		elf32_frvfdpic_adjust_dynamic_symbol
6986#undef elf_backend_size_dynamic_sections
6987#define elf_backend_size_dynamic_sections \
6988		elf32_frvfdpic_size_dynamic_sections
6989#undef bfd_elf32_bfd_relax_section
6990#define bfd_elf32_bfd_relax_section \
6991  elf32_frvfdpic_relax_section
6992#undef elf_backend_finish_dynamic_symbol
6993#define elf_backend_finish_dynamic_symbol \
6994		elf32_frvfdpic_finish_dynamic_symbol
6995#undef elf_backend_finish_dynamic_sections
6996#define elf_backend_finish_dynamic_sections \
6997		elf32_frvfdpic_finish_dynamic_sections
6998
6999#undef elf_backend_can_make_relative_eh_frame
7000#define elf_backend_can_make_relative_eh_frame \
7001		frvfdpic_elf_use_relative_eh_frame
7002#undef elf_backend_can_make_lsda_relative_eh_frame
7003#define elf_backend_can_make_lsda_relative_eh_frame \
7004		frvfdpic_elf_use_relative_eh_frame
7005#undef elf_backend_encode_eh_address
7006#define elf_backend_encode_eh_address \
7007		frvfdpic_elf_encode_eh_address
7008
7009#undef elf_backend_may_use_rel_p
7010#define elf_backend_may_use_rel_p       1
7011#undef elf_backend_may_use_rela_p
7012#define elf_backend_may_use_rela_p      1
7013/* We use REL for dynamic relocations only.  */
7014#undef elf_backend_default_use_rela_p
7015#define elf_backend_default_use_rela_p  1
7016
7017#undef elf_backend_omit_section_dynsym
7018#define elf_backend_omit_section_dynsym _frvfdpic_link_omit_section_dynsym
7019
7020#include "elf32-target.h"
7021