1 /* FRV-specific support for 32-bit ELF.
2    Copyright 2002, 2003, 2004, 2005, 2006  Free Software Foundation, Inc.
3 
4 This file is part of BFD, the Binary File Descriptor library.
5 
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
10 
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 GNU General Public License for more details.
15 
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 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.  */
29 static bfd_reloc_status_type elf32_frv_relocate_lo16
30   PARAMS ((bfd *,  Elf_Internal_Rela *, bfd_byte *, bfd_vma));
31 static bfd_reloc_status_type elf32_frv_relocate_hi16
32   PARAMS ((bfd *,  Elf_Internal_Rela *, bfd_byte *, bfd_vma));
33 static bfd_reloc_status_type elf32_frv_relocate_label24
34   PARAMS ((bfd *, asection *, Elf_Internal_Rela *, bfd_byte *, bfd_vma));
35 static bfd_reloc_status_type elf32_frv_relocate_gprel12
36   PARAMS ((struct bfd_link_info *, bfd *, asection *, Elf_Internal_Rela *,
37 	   bfd_byte *, bfd_vma));
38 static bfd_reloc_status_type elf32_frv_relocate_gprelu12
39   PARAMS ((struct bfd_link_info *, bfd *, asection *, Elf_Internal_Rela *,
40 	   bfd_byte *, bfd_vma));
41 static bfd_reloc_status_type elf32_frv_relocate_gprello
42   PARAMS ((struct bfd_link_info *, bfd *, asection *, Elf_Internal_Rela *,
43 	   bfd_byte *, bfd_vma));
44 static bfd_reloc_status_type elf32_frv_relocate_gprelhi
45   PARAMS ((struct bfd_link_info *, bfd *, asection *, Elf_Internal_Rela *,
46 	   bfd_byte *, bfd_vma));
47 static reloc_howto_type *frv_reloc_type_lookup
48   PARAMS ((bfd *, bfd_reloc_code_real_type));
49 static void frv_info_to_howto_rela
50   PARAMS ((bfd *, arelent *, Elf_Internal_Rela *));
51 static bfd_boolean elf32_frv_relocate_section
52   PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *,
53 	   Elf_Internal_Rela *, Elf_Internal_Sym *, asection **));
54 static bfd_boolean elf32_frv_add_symbol_hook
55   PARAMS (( bfd *, struct bfd_link_info *, Elf_Internal_Sym *,
56 	    const char **, flagword *, asection **, bfd_vma *));
57 static bfd_reloc_status_type frv_final_link_relocate
58   PARAMS ((reloc_howto_type *, bfd *, asection *, bfd_byte *,
59 	   Elf_Internal_Rela *, bfd_vma));
60 static bfd_boolean elf32_frv_gc_sweep_hook
61   PARAMS ((bfd *, struct bfd_link_info *, asection *, const
62 	   Elf_Internal_Rela *));
63 static asection * elf32_frv_gc_mark_hook
64   PARAMS ((asection *, struct bfd_link_info *, Elf_Internal_Rela *,
65 	   struct elf_link_hash_entry *, Elf_Internal_Sym *));
66 static bfd_boolean elf32_frv_check_relocs
67   PARAMS ((bfd *, struct bfd_link_info *, asection *,
68 	   const Elf_Internal_Rela *));
69 static int elf32_frv_machine
70   PARAMS ((bfd *));
71 static bfd_boolean elf32_frv_object_p
72   PARAMS ((bfd *));
73 static bfd_boolean frv_elf_set_private_flags
74   PARAMS ((bfd *, flagword));
75 static bfd_boolean frv_elf_copy_private_bfd_data
76   PARAMS ((bfd *, bfd *));
77 static bfd_boolean frv_elf_merge_private_bfd_data
78   PARAMS ((bfd *, bfd *));
79 static bfd_boolean frv_elf_print_private_bfd_data
80   PARAMS ((bfd *, PTR));
81 static bfd_boolean elf32_frv_grok_prstatus (bfd * abfd,
82 					    Elf_Internal_Note * note);
83 static bfd_boolean elf32_frv_grok_psinfo (bfd * abfd,
84 					  Elf_Internal_Note * note);
85 
86 static 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.  */
730 static 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.  */
746 static 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.  */
763 static 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 
778 static 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 
793 static 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 
808 static 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 
834 static 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 
853 extern 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.  */
858 struct 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.  */
929 struct _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 
966 struct _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 
1001 static struct bfd_link_hash_table *
frvfdpic_elf_link_hash_table_create(bfd * abfd)1002 frvfdpic_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.  */
1034 struct 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.  */
1146 static hashval_t
frvfdpic_relocs_info_hash(const void * entry_)1147 frvfdpic_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.  */
1158 static int
frvfdpic_relocs_info_eq(const void * entry1,const void * entry2)1159 frvfdpic_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.  */
1171 static struct frvfdpic_relocs_info *
frvfdpic_relocs_info_find(struct htab * ht,bfd * abfd,const struct frvfdpic_relocs_info * entry,enum insert_option insert)1172 frvfdpic_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.  */
1204 inline static struct frvfdpic_relocs_info *
frvfdpic_relocs_info_for_global(struct htab * ht,bfd * abfd,struct elf_link_hash_entry * h,bfd_vma addend,enum insert_option insert)1205 frvfdpic_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.  */
1223 inline static struct frvfdpic_relocs_info *
frvfdpic_relocs_info_for_local(struct htab * ht,bfd * abfd,long symndx,bfd_vma addend,enum insert_option insert)1224 frvfdpic_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 
1242 inline static void
frvfdpic_pic_merge_early_relocs_info(struct frvfdpic_relocs_info * e2,struct frvfdpic_relocs_info const * e1)1243 frvfdpic_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 
1278 inline static bfd_vma
_frvfdpic_add_dyn_reloc(bfd * output_bfd,asection * sreloc,bfd_vma offset,int reloc_type,long dynindx,bfd_vma addend,struct frvfdpic_relocs_info * entry)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 
1314 static bfd_vma
_frvfdpic_add_rofixup(bfd * output_bfd,asection * rofixup,bfd_vma offset,struct frvfdpic_relocs_info * entry)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 
1345 static unsigned
_frvfdpic_osec_to_segment(bfd * output_bfd,asection * osec)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 
1370 inline static bfd_boolean
_frvfdpic_osec_readonly_p(bfd * output_bfd,asection * osec)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 
1384 static bfd_vma
tls_biased_base(struct bfd_link_info * info)1385 tls_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 
1396 inline static bfd_boolean
_frvfdpic_emit_got_relocs_plt_entries(struct frvfdpic_relocs_info * entry,bfd * output_bfd,struct bfd_link_info * info,asection * sec,Elf_Internal_Sym * sym,bfd_vma addend)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 
2195 static bfd_reloc_status_type
elf32_frv_relocate_gprel12(info,input_bfd,input_section,relocation,contents,value)2196 elf32_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 
2234 static bfd_reloc_status_type
elf32_frv_relocate_gprelu12(info,input_bfd,input_section,relocation,contents,value)2235 elf32_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 
2276 static bfd_reloc_status_type
elf32_frv_relocate_hi16(input_bfd,relhi,contents,value)2277 elf32_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 }
2299 static bfd_reloc_status_type
elf32_frv_relocate_lo16(input_bfd,rello,contents,value)2300 elf32_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 
2324 static bfd_reloc_status_type
elf32_frv_relocate_label24(input_bfd,input_section,rello,contents,value)2325 elf32_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 
2367 static bfd_reloc_status_type
elf32_frv_relocate_gprelhi(info,input_bfd,input_section,relocation,contents,value)2368 elf32_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 
2402 static bfd_reloc_status_type
elf32_frv_relocate_gprello(info,input_bfd,input_section,relocation,contents,value)2403 elf32_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 
2438 static reloc_howto_type *
frv_reloc_type_lookup(abfd,code)2439 frv_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 
2600 static void
frv_info_to_howto_rela(abfd,cache_ptr,dst)2601 frv_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.  */
2626 static void
frvfdpic_info_to_howto_rel(bfd * abfd ATTRIBUTE_UNUSED,arelent * cache_ptr,Elf_Internal_Rela * dst)2627 frvfdpic_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 
2664 static bfd_reloc_status_type
frv_final_link_relocate(howto,input_bfd,input_section,contents,rel,relocation)2665 frv_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 
2710 static bfd_boolean
elf32_frv_relocate_section(output_bfd,info,input_bfd,input_section,contents,relocs,local_syms,local_sections)2711 elf32_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 
4147 static asection *
elf32_frv_gc_mark_hook(sec,info,rel,h,sym)4148 elf32_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 
4186 static bfd_boolean
elf32_frv_gc_sweep_hook(abfd,info,sec,relocs)4187 elf32_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 
4200 static bfd_boolean
elf32_frv_add_symbol_hook(abfd,info,sym,namep,flagsp,secp,valp)4201 elf32_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.  */
4238 static bfd_boolean
_frvfdpic_link_omit_section_dynsym(bfd * output_bfd ATTRIBUTE_UNUSED,struct bfd_link_info * info ATTRIBUTE_UNUSED,asection * p ATTRIBUTE_UNUSED)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 
4264 static bfd_boolean
_frv_create_got_section(bfd * abfd,struct bfd_link_info * info)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 
4426 static bfd_boolean
elf32_frvfdpic_create_dynamic_sections(bfd * abfd,struct bfd_link_info * info)4427 elf32_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 
4497 static void
_frvfdpic_count_nontls_entries(struct frvfdpic_relocs_info * entry,struct _frvfdpic_dynamic_got_info * dinfo)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 
4561 static void
_frvfdpic_count_tls_entries(struct frvfdpic_relocs_info * entry,struct _frvfdpic_dynamic_got_info * dinfo,bfd_boolean subtract)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 
4606 static void
_frvfdpic_count_relocs_fixups(struct frvfdpic_relocs_info * entry,struct _frvfdpic_dynamic_got_info * dinfo,bfd_boolean subtract)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 
4677 static void
_frvfdpic_relax_tls_entries(struct frvfdpic_relocs_info * entry,struct _frvfdpic_dynamic_got_info * dinfo,bfd_boolean relaxing)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 
4792 static int
_frvfdpic_count_got_plt_entries(void ** entryp,void * dinfo_)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 
4821 inline static bfd_signed_vma
_frvfdpic_compute_got_alloc_data(struct _frvfdpic_dynamic_got_alloc_data * gad,bfd_signed_vma fdcur,bfd_signed_vma odd,bfd_signed_vma cur,bfd_vma got,bfd_vma fd,bfd_vma fdplt,bfd_vma tlsd,bfd_vma tlsdplt,bfd_vma wrap)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 
5005 inline static bfd_signed_vma
_frvfdpic_get_got_entry(struct _frvfdpic_dynamic_got_alloc_data * gad)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 
5034 inline static bfd_signed_vma
_frvfdpic_get_fd_entry(struct _frvfdpic_dynamic_got_alloc_data * gad)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.  */
5046 inline static bfd_signed_vma
_frvfdpic_get_tlsdesc_entry(struct _frvfdpic_dynamic_got_alloc_data * gad)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 
5065 static int
_frvfdpic_assign_got_entries(void ** entryp,void * info_)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 
5143 static int
_frvfdpic_assign_plt_entries(void ** entryp,void * info_)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 
5245 static int
_frvfdpic_reset_got_plt_entries(void ** entryp,void * ignore ATTRIBUTE_UNUSED)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.  */
5268 static int
_frvfdpic_resolve_final_relocs_info(void ** entryp,void * p)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 
5322 static bfd_boolean
_frvfdpic_size_got_plt(bfd * output_bfd,struct _frvfdpic_dynamic_got_plt_info * gpinfop)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 
5530 static bfd_boolean
elf32_frvfdpic_size_dynamic_sections(bfd * output_bfd,struct bfd_link_info * info)5531 elf32_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 
5599 static bfd_boolean
elf32_frvfdpic_always_size_sections(bfd * output_bfd,struct bfd_link_info * info)5600 elf32_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 
5649 static int
_frvfdpic_relax_got_plt_entries(void ** entryp,void * dinfo_)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 
5660 static bfd_boolean
elf32_frvfdpic_relax_section(bfd * abfd ATTRIBUTE_UNUSED,asection * sec,struct bfd_link_info * info,bfd_boolean * again)5661 elf32_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 
5720 static bfd_boolean
elf32_frvfdpic_modify_segment_map(bfd * output_bfd,struct bfd_link_info * info)5721 elf32_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 
5770 static bfd_boolean
elf32_frv_finish_dynamic_sections(bfd * output_bfd ATTRIBUTE_UNUSED,struct bfd_link_info * info ATTRIBUTE_UNUSED)5771 elf32_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 
5778 static bfd_boolean
elf32_frvfdpic_finish_dynamic_sections(bfd * output_bfd,struct bfd_link_info * info)5779 elf32_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 
5894 static bfd_boolean
elf32_frvfdpic_adjust_dynamic_symbol(struct bfd_link_info * info ATTRIBUTE_UNUSED,struct elf_link_hash_entry * h ATTRIBUTE_UNUSED)5895 elf32_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 
5926 static bfd_boolean
elf32_frvfdpic_finish_dynamic_symbol(bfd * output_bfd ATTRIBUTE_UNUSED,struct bfd_link_info * info ATTRIBUTE_UNUSED,struct elf_link_hash_entry * h ATTRIBUTE_UNUSED,Elf_Internal_Sym * sym ATTRIBUTE_UNUSED)5927 elf32_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 
5939 static bfd_boolean
frvfdpic_elf_use_relative_eh_frame(bfd * input_bfd ATTRIBUTE_UNUSED,struct bfd_link_info * info ATTRIBUTE_UNUSED,asection * eh_frame_section ATTRIBUTE_UNUSED)5940 frvfdpic_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 
5951 static bfd_byte
frvfdpic_elf_encode_eh_address(bfd * abfd,struct bfd_link_info * info,asection * osec,bfd_vma offset,asection * loc_sec,bfd_vma loc_offset,bfd_vma * encoded)5952 frvfdpic_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 
6084 static bfd_boolean
elf32_frv_check_relocs(abfd,info,sec,relocs)6085 elf32_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 
6345 static int
elf32_frv_machine(abfd)6346 elf32_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 
6367 static bfd_boolean
elf32_frv_object_p(abfd)6368 elf32_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 
6378 static bfd_boolean
frv_elf_set_private_flags(abfd,flags)6379 frv_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 
6390 static bfd_boolean
frv_elf_copy_private_bfd_data(ibfd,obfd)6391 frv_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 
6410 static bfd_boolean
frv_elf_arch_extension_p(flagword base,flagword extension)6411 frv_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 
6434 static bfd_boolean
elf32_frvfdpic_copy_private_bfd_data(bfd * ibfd,bfd * obfd)6435 elf32_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 
6481 static bfd_boolean
frv_elf_merge_private_bfd_data(ibfd,obfd)6482 frv_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 
6752 bfd_boolean
frv_elf_print_private_bfd_data(abfd,ptr)6753 frv_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 
6837 static bfd_boolean
elf32_frv_grok_prstatus(bfd * abfd,Elf_Internal_Note * note)6838 elf32_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 
6881 static bfd_boolean
elf32_frv_grok_psinfo(bfd * abfd,Elf_Internal_Note * note)6882 elf32_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