OpenCores
URL https://opencores.org/ocsvn/openrisc_2011-10-31/openrisc_2011-10-31/trunk

Subversion Repositories openrisc_2011-10-31

[/] [openrisc/] [trunk/] [gnu-src/] [gdb-6.8/] [bfd/] [elf32-frv.c] - Blame information for rev 173

Go to most recent revision | Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.