Coverage Report

Created: 2026-04-04 08:16

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/binutils-gdb/bfd/elfxx-x86.c
Line
Count
Source
1
/* x86 specific support for ELF
2
   Copyright (C) 2017-2026 Free Software Foundation, Inc.
3
4
   This file is part of BFD, the Binary File Descriptor library.
5
6
   This program is free software; you can redistribute it and/or modify
7
   it under the terms of the GNU General Public License as published by
8
   the Free Software Foundation; either version 3 of the License, or
9
   (at your option) any later version.
10
11
   This program is distributed in the hope that it will be useful,
12
   but WITHOUT ANY WARRANTY; without even the implied warranty of
13
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
   GNU General Public License for more details.
15
16
   You should have received a copy of the GNU General Public License
17
   along with this program; if not, write to the Free Software
18
   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
19
   MA 02110-1301, USA.  */
20
21
#include "elfxx-x86.h"
22
#include "elf-vxworks.h"
23
#include "objalloc.h"
24
25
/* The name of the dynamic interpreter.  This is put in the .interp
26
   section.  */
27
28
0
#define ELF32_DYNAMIC_INTERPRETER "/usr/lib/libc.so.1"
29
0
#define ELF64_DYNAMIC_INTERPRETER "/lib/ld64.so.1"
30
0
#define ELFX32_DYNAMIC_INTERPRETER "/lib/ldx32.so.1"
31
32
/* ??? This repeats *COM* id of zero.  sec->id is supposed to be unique,
33
   but current usage would allow all of _bfd_std_section to be zero.  */
34
static const asymbol lcomm_sym
35
  = GLOBAL_SYM_INIT ("LARGE_COMMON", &bfd_elf_large_com_section);
36
asection bfd_elf_large_com_section
37
  = BFD_FAKE_SECTION (bfd_elf_large_com_section, &lcomm_sym,
38
          "LARGE_COMMON", 0, SEC_IS_COMMON);
39
40
bool
41
_bfd_x86_elf_mkobject (bfd *abfd)
42
144k
{
43
144k
  return bfd_elf_allocate_object (abfd, sizeof (struct elf_x86_obj_tdata));
44
144k
}
45
46
/* _TLS_MODULE_BASE_ needs to be treated especially when linking
47
   executables.  Rather than setting it to the beginning of the TLS
48
   section, we have to set it to the end.    This function may be called
49
   multiple times, it is idempotent.  */
50
51
void
52
_bfd_x86_elf_set_tls_module_base (struct bfd_link_info *info)
53
0
{
54
0
  struct elf_x86_link_hash_table *htab;
55
0
  struct bfd_link_hash_entry *base;
56
0
  elf_backend_data *bed;
57
58
0
  if (!bfd_link_executable (info))
59
0
    return;
60
61
0
  bed = get_elf_backend_data (info->output_bfd);
62
0
  htab = elf_x86_hash_table (info, bed->target_id);
63
0
  if (htab == NULL)
64
0
    return;
65
66
0
  base = htab->tls_module_base;
67
0
  if (base == NULL)
68
0
    return;
69
70
0
  base->u.def.value = htab->elf.tls_size;
71
0
}
72
73
/* Return the base VMA address which should be subtracted from real addresses
74
   when resolving @dtpoff relocation.
75
   This is PT_TLS segment p_vaddr.  */
76
77
bfd_vma
78
_bfd_x86_elf_dtpoff_base (struct bfd_link_info *info)
79
0
{
80
  /* If tls_sec is NULL, we should have signalled an error already.  */
81
0
  if (elf_hash_table (info)->tls_sec == NULL)
82
0
    return 0;
83
0
  return elf_hash_table (info)->tls_sec->vma;
84
0
}
85
86
/* Allocate space in .plt, .got and associated reloc sections for
87
   dynamic relocs.  */
88
89
static bool
90
elf_x86_allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
91
0
{
92
0
  struct bfd_link_info *info;
93
0
  struct elf_x86_link_hash_table *htab;
94
0
  struct elf_x86_link_hash_entry *eh;
95
0
  struct elf_dyn_relocs *p;
96
0
  unsigned int plt_entry_size;
97
0
  bool resolved_to_zero;
98
0
  elf_backend_data *bed;
99
100
0
  if (h->root.type == bfd_link_hash_indirect)
101
0
    return true;
102
103
0
  eh = (struct elf_x86_link_hash_entry *) h;
104
105
0
  info = (struct bfd_link_info *) inf;
106
0
  bed = get_elf_backend_data (info->output_bfd);
107
0
  htab = elf_x86_hash_table (info, bed->target_id);
108
0
  if (htab == NULL)
109
0
    return false;
110
111
0
  plt_entry_size = htab->plt.plt_entry_size;
112
113
0
  resolved_to_zero = UNDEFINED_WEAK_RESOLVED_TO_ZERO (info, eh);
114
115
  /* We can't use the GOT PLT if pointer equality is needed since
116
     finish_dynamic_symbol won't clear symbol value and the dynamic
117
     linker won't update the GOT slot.  We will get into an infinite
118
     loop at run-time.  */
119
0
  if (htab->plt_got != NULL
120
0
      && h->type != STT_GNU_IFUNC
121
0
      && !h->pointer_equality_needed
122
0
      && h->plt.refcount > 0
123
0
      && h->got.refcount > 0)
124
0
    {
125
      /* Don't use the regular PLT if there are both GOT and GOTPLT
126
   reloctions.  */
127
0
      h->plt.offset = (bfd_vma) -1;
128
129
      /* Use the GOT PLT.  */
130
0
      eh->plt_got.refcount = 1;
131
0
    }
132
133
  /* Since STT_GNU_IFUNC symbol must go through PLT, we handle it
134
     here if it is defined and referenced in a non-shared object.  */
135
0
  if (h->type == STT_GNU_IFUNC
136
0
      && h->def_regular)
137
0
    {
138
      /* GOTOFF relocation needs PLT.  */
139
0
      if (eh->gotoff_ref)
140
0
  h->plt.refcount = 1;
141
142
0
      if (_bfd_elf_allocate_ifunc_dyn_relocs (info, h, &h->dyn_relocs,
143
0
                plt_entry_size,
144
0
                (htab->plt.has_plt0
145
0
                 * plt_entry_size),
146
0
                 htab->got_entry_size,
147
0
                 true))
148
0
  {
149
0
    asection *s = htab->plt_second;
150
0
    if (h->plt.offset != (bfd_vma) -1 && s != NULL)
151
0
      {
152
        /* Use the second PLT section if it is created.  */
153
0
        eh->plt_second.offset = s->size;
154
155
        /* Make room for this entry in the second PLT section.  */
156
0
        s->size += htab->non_lazy_plt->plt_entry_size;
157
0
      }
158
159
0
    return true;
160
0
  }
161
0
      else
162
0
  return false;
163
0
    }
164
  /* Don't create the PLT entry if there are only function pointer
165
     relocations which can be resolved at run-time.  */
166
0
  else if (htab->elf.dynamic_sections_created
167
0
     && (h->plt.refcount > 0
168
0
         || eh->plt_got.refcount > 0))
169
0
    {
170
0
      bool use_plt_got = eh->plt_got.refcount > 0;
171
172
      /* Make sure this symbol is output as a dynamic symbol.
173
   Undefined weak syms won't yet be marked as dynamic.  */
174
0
      if (h->dynindx == -1
175
0
    && !h->forced_local
176
0
    && !resolved_to_zero
177
0
    && h->root.type == bfd_link_hash_undefweak)
178
0
  {
179
0
    if (! bfd_elf_link_record_dynamic_symbol (info, h))
180
0
      return false;
181
0
  }
182
183
0
      if (bfd_link_pic (info)
184
0
    || WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, 0, h))
185
0
  {
186
0
    asection *s = htab->elf.splt;
187
0
    asection *second_s = htab->plt_second;
188
0
    asection *got_s = htab->plt_got;
189
0
    bool use_plt;
190
191
    /* If this is the first .plt entry, make room for the special
192
       first entry.  The .plt section is used by prelink to undo
193
       prelinking for dynamic relocations.  */
194
0
    if (s->size == 0)
195
0
      s->size = htab->plt.has_plt0 * plt_entry_size;
196
197
0
    if (use_plt_got)
198
0
      eh->plt_got.offset = got_s->size;
199
0
    else
200
0
      {
201
0
        h->plt.offset = s->size;
202
0
        if (second_s)
203
0
    eh->plt_second.offset = second_s->size;
204
0
      }
205
206
    /* If this symbol is not defined in a regular file, and we are
207
       generating PDE, then set the symbol to this location in the
208
       .plt.  This is required to make function pointers compare
209
       as equal between PDE and the shared library.
210
211
       NB: If PLT is PC-relative, we can use the .plt in PIE for
212
       function address. */
213
0
    if (h->def_regular)
214
0
      use_plt = false;
215
0
    else if (htab->pcrel_plt)
216
0
      use_plt = ! bfd_link_dll (info);
217
0
    else
218
0
      use_plt = bfd_link_pde (info);
219
0
    if (use_plt)
220
0
      {
221
0
        if (use_plt_got)
222
0
    {
223
      /* We need to make a call to the entry of the GOT PLT
224
         instead of regular PLT entry.  */
225
0
      h->root.u.def.section = got_s;
226
0
      h->root.u.def.value = eh->plt_got.offset;
227
0
    }
228
0
        else
229
0
    {
230
0
      if (second_s)
231
0
        {
232
          /* We need to make a call to the entry of the
233
       second PLT instead of regular PLT entry.  */
234
0
          h->root.u.def.section = second_s;
235
0
          h->root.u.def.value = eh->plt_second.offset;
236
0
        }
237
0
      else
238
0
        {
239
0
          h->root.u.def.section = s;
240
0
          h->root.u.def.value = h->plt.offset;
241
0
        }
242
0
    }
243
0
      }
244
245
    /* Make room for this entry.  */
246
0
    if (use_plt_got)
247
0
      got_s->size += htab->non_lazy_plt->plt_entry_size;
248
0
    else
249
0
      {
250
0
        s->size += plt_entry_size;
251
0
        if (second_s)
252
0
    second_s->size += htab->non_lazy_plt->plt_entry_size;
253
254
        /* We also need to make an entry in the .got.plt section,
255
     which will be placed in the .got section by the linker
256
     script.  */
257
0
        htab->elf.sgotplt->size += htab->got_entry_size;
258
259
        /* There should be no PLT relocation against resolved
260
     undefined weak symbol in executable.  */
261
0
        if (!resolved_to_zero)
262
0
    {
263
      /* We also need to make an entry in the .rel.plt
264
         section.  */
265
0
      htab->elf.srelplt->size += htab->sizeof_reloc;
266
0
      htab->elf.srelplt->reloc_count++;
267
0
    }
268
0
      }
269
270
0
    if (htab->elf.target_os == is_vxworks && !bfd_link_pic (info))
271
0
      {
272
        /* VxWorks has a second set of relocations for each PLT entry
273
     in executables.  They go in a separate relocation section,
274
     which is processed by the kernel loader.  */
275
276
        /* There are two relocations for the initial PLT entry: an
277
     R_386_32 relocation for _GLOBAL_OFFSET_TABLE_ + 4 and an
278
     R_386_32 relocation for _GLOBAL_OFFSET_TABLE_ + 8.  */
279
280
0
        asection *srelplt2 = htab->srelplt2;
281
0
        if (h->plt.offset == plt_entry_size)
282
0
    srelplt2->size += (htab->sizeof_reloc * 2);
283
284
        /* There are two extra relocations for each subsequent PLT entry:
285
     an R_386_32 relocation for the GOT entry, and an R_386_32
286
     relocation for the PLT entry.  */
287
288
0
        srelplt2->size += (htab->sizeof_reloc * 2);
289
0
      }
290
0
  }
291
0
      else
292
0
  {
293
0
    eh->plt_got.offset = (bfd_vma) -1;
294
0
    h->plt.offset = (bfd_vma) -1;
295
0
    h->needs_plt = 0;
296
0
  }
297
0
    }
298
0
  else
299
0
    {
300
0
      eh->plt_got.offset = (bfd_vma) -1;
301
0
      h->plt.offset = (bfd_vma) -1;
302
0
      h->needs_plt = 0;
303
0
    }
304
305
0
  eh->tlsdesc_got = (bfd_vma) -1;
306
307
  /* For i386, if R_386_TLS_{IE_32,IE,GOTIE} symbol is now local to the
308
     binary, make it a R_386_TLS_LE_32 requiring no TLS entry.  For
309
     x86-64, if R_X86_64_GOTTPOFF symbol is now local to the binary,
310
     make it a R_X86_64_TPOFF32 requiring no GOT entry.  */
311
0
  if (h->got.refcount > 0
312
0
      && bfd_link_executable (info)
313
0
      && h->dynindx == -1
314
0
      && (elf_x86_hash_entry (h)->tls_type & GOT_TLS_IE))
315
0
    h->got.offset = (bfd_vma) -1;
316
0
  else if (h->got.refcount > 0)
317
0
    {
318
0
      asection *s;
319
0
      bool dyn;
320
0
      int tls_type = elf_x86_hash_entry (h)->tls_type;
321
322
      /* Make sure this symbol is output as a dynamic symbol.
323
   Undefined weak syms won't yet be marked as dynamic.  */
324
0
      if (h->dynindx == -1
325
0
    && !h->forced_local
326
0
    && !resolved_to_zero
327
0
    && h->root.type == bfd_link_hash_undefweak)
328
0
  {
329
0
    if (! bfd_elf_link_record_dynamic_symbol (info, h))
330
0
      return false;
331
0
  }
332
333
0
      s = htab->elf.sgot;
334
0
      if (GOT_TLS_GDESC_P (tls_type))
335
0
  {
336
0
    eh->tlsdesc_got = htab->elf.sgotplt->size
337
0
      - elf_x86_compute_jump_table_size (htab);
338
0
    htab->elf.sgotplt->size += 2 * htab->got_entry_size;
339
0
    h->got.offset = (bfd_vma) -2;
340
0
  }
341
0
      if (! GOT_TLS_GDESC_P (tls_type)
342
0
    || GOT_TLS_GD_P (tls_type))
343
0
  {
344
0
    h->got.offset = s->size;
345
0
    s->size += htab->got_entry_size;
346
    /* R_386_TLS_GD and R_X86_64_TLSGD need 2 consecutive GOT
347
       slots.  */
348
0
    if (GOT_TLS_GD_P (tls_type) || tls_type == GOT_TLS_IE_BOTH)
349
0
      s->size += htab->got_entry_size;
350
0
  }
351
0
      dyn = htab->elf.dynamic_sections_created;
352
      /* R_386_TLS_IE_32 needs one dynamic relocation,
353
   R_386_TLS_IE resp. R_386_TLS_GOTIE needs one dynamic relocation,
354
   (but if both R_386_TLS_IE_32 and R_386_TLS_IE is present, we
355
   need two), R_386_TLS_GD and R_X86_64_TLSGD need one if local
356
   symbol and two if global.  No dynamic relocation against
357
   resolved undefined weak symbol in executable.  No dynamic
358
   relocation against non-preemptible absolute symbol.  */
359
0
      if (tls_type == GOT_TLS_IE_BOTH)
360
0
  htab->elf.srelgot->size += 2 * htab->sizeof_reloc;
361
0
      else if ((GOT_TLS_GD_P (tls_type) && h->dynindx == -1)
362
0
         || (tls_type & GOT_TLS_IE))
363
0
  htab->elf.srelgot->size += htab->sizeof_reloc;
364
0
      else if (GOT_TLS_GD_P (tls_type))
365
0
  htab->elf.srelgot->size += 2 * htab->sizeof_reloc;
366
0
      else if (! GOT_TLS_GDESC_P (tls_type)
367
0
         && ((ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
368
0
        && !resolved_to_zero)
369
0
       || h->root.type != bfd_link_hash_undefweak)
370
0
         && ((bfd_link_pic (info)
371
0
        && !(h->dynindx == -1
372
0
       && ABS_SYMBOL_P (h)))
373
0
       || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h)))
374
0
  htab->elf.srelgot->size += htab->sizeof_reloc;
375
0
      if (GOT_TLS_GDESC_P (tls_type))
376
0
  {
377
0
    htab->rel_tls_desc->size += htab->sizeof_reloc;
378
0
    if (bed->target_id == X86_64_ELF_DATA)
379
0
      htab->elf.tlsdesc_plt = (bfd_vma) -1;
380
0
  }
381
0
    }
382
0
  else
383
0
    h->got.offset = (bfd_vma) -1;
384
385
0
  if (h->dyn_relocs == NULL)
386
0
    return true;
387
388
  /* In the shared -Bsymbolic case, discard space allocated for
389
     dynamic pc-relative relocs against symbols which turn out to be
390
     defined in regular objects.  For the normal shared case, discard
391
     space for pc-relative relocs that have become local due to symbol
392
     visibility changes.  */
393
394
0
  if (bfd_link_pic (info))
395
0
    {
396
      /* Relocs that use pc_count are those that appear on a call
397
   insn, or certain REL relocs that can generated via assembly.
398
   We want calls to protected symbols to resolve directly to the
399
   function rather than going via the plt.  If people want
400
   function pointer comparisons to work as expected then they
401
   should avoid writing weird assembly.  */
402
0
      if (SYMBOL_CALLS_LOCAL (info, h))
403
0
  {
404
0
    struct elf_dyn_relocs **pp;
405
406
0
    for (pp = &h->dyn_relocs; (p = *pp) != NULL; )
407
0
      {
408
0
        p->count -= p->pc_count;
409
0
        p->pc_count = 0;
410
0
        if (p->count == 0)
411
0
    *pp = p->next;
412
0
        else
413
0
    pp = &p->next;
414
0
      }
415
0
  }
416
417
0
      if (htab->elf.target_os == is_vxworks)
418
0
  {
419
0
    struct elf_dyn_relocs **pp;
420
0
    for (pp = &h->dyn_relocs; (p = *pp) != NULL; )
421
0
      {
422
0
        if (strcmp (p->sec->output_section->name, ".tls_vars") == 0)
423
0
    *pp = p->next;
424
0
        else
425
0
    pp = &p->next;
426
0
      }
427
0
  }
428
429
      /* Also discard relocs on undefined weak syms with non-default
430
   visibility or in PIE.  */
431
0
      if (h->dyn_relocs != NULL)
432
0
  {
433
0
    if (h->root.type == bfd_link_hash_undefweak)
434
0
      {
435
        /* Undefined weak symbol is never bound locally in shared
436
     library.  */
437
0
        if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
438
0
      || resolved_to_zero)
439
0
    {
440
0
      if (bed->target_id == I386_ELF_DATA
441
0
          && h->non_got_ref)
442
0
        {
443
          /* Keep dynamic non-GOT/non-PLT relocation so
444
       that we can branch to 0 without PLT.  */
445
0
          struct elf_dyn_relocs **pp;
446
447
0
          for (pp = &h->dyn_relocs; (p = *pp) != NULL; )
448
0
      if (p->pc_count == 0)
449
0
        *pp = p->next;
450
0
      else
451
0
        {
452
          /* Remove non-R_386_PC32 relocation.  */
453
0
          p->count = p->pc_count;
454
0
          pp = &p->next;
455
0
        }
456
457
          /* Make sure undefined weak symbols are output
458
       as dynamic symbols in PIEs for dynamic non-GOT
459
       non-PLT reloations.  */
460
0
          if (h->dyn_relocs != NULL
461
0
        && !bfd_elf_link_record_dynamic_symbol (info, h))
462
0
      return false;
463
0
        }
464
0
      else
465
0
        h->dyn_relocs = NULL;
466
0
    }
467
0
        else if (h->dynindx == -1
468
0
           && !h->forced_local
469
0
           && !bfd_elf_link_record_dynamic_symbol (info, h))
470
0
    return false;
471
0
      }
472
0
    else if (bfd_link_executable (info)
473
0
       && (h->needs_copy || eh->needs_copy)
474
0
       && h->def_dynamic
475
0
       && !h->def_regular)
476
0
      {
477
        /* NB: needs_copy is set only for x86-64.  For PIE,
478
     discard space for pc-relative relocs against symbols
479
     which turn out to need copy relocs.  */
480
0
        struct elf_dyn_relocs **pp;
481
482
0
        for (pp = &h->dyn_relocs; (p = *pp) != NULL; )
483
0
    {
484
0
      if (p->pc_count != 0)
485
0
        *pp = p->next;
486
0
      else
487
0
        pp = &p->next;
488
0
    }
489
0
      }
490
0
  }
491
0
    }
492
0
  else if (ELIMINATE_COPY_RELOCS)
493
0
    {
494
      /* For the non-shared case, discard space for relocs against
495
   symbols which turn out to need copy relocs or are not
496
   dynamic.  Keep dynamic relocations for run-time function
497
   pointer initialization.  */
498
499
0
      if ((!h->non_got_ref
500
0
     || (h->root.type == bfd_link_hash_undefweak
501
0
         && !resolved_to_zero))
502
0
    && ((h->def_dynamic
503
0
         && !h->def_regular)
504
0
        || (htab->elf.dynamic_sections_created
505
0
      && (h->root.type == bfd_link_hash_undefweak
506
0
          || h->root.type == bfd_link_hash_undefined))))
507
0
  {
508
    /* Make sure this symbol is output as a dynamic symbol.
509
       Undefined weak syms won't yet be marked as dynamic.  */
510
0
    if (h->dynindx == -1
511
0
        && !h->forced_local
512
0
        && !resolved_to_zero
513
0
        && h->root.type == bfd_link_hash_undefweak
514
0
        && ! bfd_elf_link_record_dynamic_symbol (info, h))
515
0
      return false;
516
517
    /* If that succeeded, we know we'll be keeping all the
518
       relocs.  */
519
0
    if (h->dynindx != -1)
520
0
      goto keep;
521
0
  }
522
523
0
      h->dyn_relocs = NULL;
524
525
0
    keep: ;
526
0
    }
527
528
  /* Finally, allocate space.  */
529
0
  for (p = h->dyn_relocs; p != NULL; p = p->next)
530
0
    {
531
0
      asection *sreloc;
532
533
0
      if (eh->def_protected && bfd_link_executable (info))
534
0
  {
535
    /* Disallow copy relocation against non-copyable protected
536
       symbol.  */
537
0
    asection *s = p->sec->output_section;
538
0
    if (s != NULL && (s->flags & SEC_READONLY) != 0)
539
0
      {
540
0
        info->callbacks->fatal
541
    /* xgettext:c-format */
542
0
    (_("%P: %pB: copy relocation against non-copyable "
543
0
       "protected symbol `%s' in %pB\n"),
544
0
     p->sec->owner, h->root.root.string,
545
0
     h->root.u.def.section->owner);
546
0
        return false;
547
0
      }
548
0
  }
549
550
0
      sreloc = elf_section_data (p->sec)->sreloc;
551
552
0
      BFD_ASSERT (sreloc != NULL);
553
0
      sreloc->size += p->count * htab->sizeof_reloc;
554
0
    }
555
556
0
  return true;
557
0
}
558
559
/* Allocate space in .plt, .got and associated reloc sections for
560
   local dynamic relocs.  */
561
562
static int
563
elf_x86_allocate_local_dynreloc (void **slot, void *inf)
564
0
{
565
0
  struct elf_link_hash_entry *h
566
0
    = (struct elf_link_hash_entry *) *slot;
567
568
0
  if (h->type != STT_GNU_IFUNC
569
0
      || !h->def_regular
570
0
      || !h->ref_regular
571
0
      || !h->forced_local
572
0
      || h->root.type != bfd_link_hash_defined)
573
0
    abort ();
574
575
0
  return elf_x86_allocate_dynrelocs (h, inf);
576
0
}
577
578
/* Find and/or create a hash entry for local symbol.  */
579
580
struct elf_link_hash_entry *
581
_bfd_elf_x86_get_local_sym_hash (struct elf_x86_link_hash_table *htab,
582
         bfd *abfd, const Elf_Internal_Rela *rel,
583
         bool create)
584
0
{
585
0
  struct elf_x86_link_hash_entry e, *ret;
586
0
  asection *sec = abfd->sections;
587
0
  hashval_t h = ELF_LOCAL_SYMBOL_HASH (sec->id,
588
0
               htab->r_sym (rel->r_info));
589
0
  void **slot;
590
591
0
  e.elf.indx = sec->id;
592
0
  e.elf.dynstr_index = htab->r_sym (rel->r_info);
593
0
  slot = htab_find_slot_with_hash (htab->loc_hash_table, &e, h,
594
0
           create ? INSERT : NO_INSERT);
595
596
0
  if (!slot)
597
0
    return NULL;
598
599
0
  if (*slot)
600
0
    {
601
0
      ret = (struct elf_x86_link_hash_entry *) *slot;
602
0
      return &ret->elf;
603
0
    }
604
605
0
  ret = (struct elf_x86_link_hash_entry *)
606
0
  objalloc_alloc ((struct objalloc *) htab->loc_hash_memory,
607
0
      sizeof (struct elf_x86_link_hash_entry));
608
0
  if (ret)
609
0
    {
610
0
      memset (ret, 0, sizeof (*ret));
611
0
      ret->elf.indx = sec->id;
612
0
      ret->elf.dynstr_index = htab->r_sym (rel->r_info);
613
0
      ret->elf.dynindx = -1;
614
0
      ret->plt_got.offset = (bfd_vma) -1;
615
0
      *slot = ret;
616
0
      htab->has_loc_hash_table = 1;
617
0
    }
618
0
  return &ret->elf;
619
0
}
620
621
/* Create an entry in an x86 ELF linker hash table.  */
622
623
struct bfd_hash_entry *
624
_bfd_x86_elf_link_hash_newfunc (struct bfd_hash_entry *entry,
625
        struct bfd_hash_table *table,
626
        const char *string)
627
0
{
628
  /* Allocate the structure if it has not already been allocated by a
629
     subclass.  */
630
0
  if (entry == NULL)
631
0
    {
632
0
      entry = (struct bfd_hash_entry *)
633
0
  bfd_hash_allocate (table,
634
0
         sizeof (struct elf_x86_link_hash_entry));
635
0
      if (entry == NULL)
636
0
  return entry;
637
0
    }
638
639
  /* Call the allocation method of the superclass.  */
640
0
  entry = _bfd_elf_link_hash_newfunc (entry, table, string);
641
0
  if (entry != NULL)
642
0
    {
643
0
      struct elf_x86_link_hash_entry *eh
644
0
       = (struct elf_x86_link_hash_entry *) entry;
645
646
0
      memset (&eh->elf + 1, 0, sizeof (*eh) - sizeof (eh->elf));
647
      /* Set local fields.  */
648
0
      eh->plt_second.offset = (bfd_vma) -1;
649
0
      eh->plt_got.offset = (bfd_vma) -1;
650
0
      eh->tlsdesc_got = (bfd_vma) -1;
651
0
      eh->zero_undefweak = 1;
652
0
    }
653
654
0
  return entry;
655
0
}
656
657
/* Compute a hash of a local hash entry.  We use elf_link_hash_entry
658
  for local symbol so that we can handle local STT_GNU_IFUNC symbols
659
  as global symbol.  We reuse indx and dynstr_index for local symbol
660
  hash since they aren't used by global symbols in this backend.  */
661
662
hashval_t
663
_bfd_x86_elf_local_htab_hash (const void *ptr)
664
0
{
665
0
  struct elf_link_hash_entry *h
666
0
    = (struct elf_link_hash_entry *) ptr;
667
0
  return ELF_LOCAL_SYMBOL_HASH (h->indx, h->dynstr_index);
668
0
}
669
670
/* Compare local hash entries.  */
671
672
int
673
_bfd_x86_elf_local_htab_eq (const void *ptr1, const void *ptr2)
674
0
{
675
0
  struct elf_link_hash_entry *h1
676
0
     = (struct elf_link_hash_entry *) ptr1;
677
0
  struct elf_link_hash_entry *h2
678
0
    = (struct elf_link_hash_entry *) ptr2;
679
680
0
  return h1->indx == h2->indx && h1->dynstr_index == h2->dynstr_index;
681
0
}
682
683
/* Destroy an x86 ELF linker hash table.  */
684
685
static void
686
elf_x86_link_hash_table_free (bfd *obfd)
687
0
{
688
0
  struct elf_x86_link_hash_table *htab
689
0
    = (struct elf_x86_link_hash_table *) obfd->link.hash;
690
691
0
  free (htab->dt_relr_bitmap.u.elf64);
692
0
  free (htab->unaligned_relative_reloc.data);
693
0
  free (htab->relative_reloc.data);
694
0
  if (htab->loc_hash_table)
695
0
    htab_delete (htab->loc_hash_table);
696
0
  if (htab->loc_hash_memory)
697
0
    objalloc_free ((struct objalloc *) htab->loc_hash_memory);
698
0
  sframe_encoder_free (&htab->plt_cfe_ctx);
699
0
  sframe_encoder_free (&htab->plt_second_cfe_ctx);
700
0
  sframe_encoder_free (&htab->plt_got_cfe_ctx);
701
0
  _bfd_elf_link_hash_table_free (obfd);
702
0
}
703
704
static bool
705
elf_i386_is_reloc_section (const char *secname)
706
0
{
707
0
  return startswith (secname, ".rel");
708
0
}
709
710
static bool
711
elf_x86_64_is_reloc_section (const char *secname)
712
0
{
713
0
  return startswith (secname, ".rela");
714
0
}
715
716
/* Create an x86 ELF linker hash table.  */
717
718
struct bfd_link_hash_table *
719
_bfd_x86_elf_link_hash_table_create (bfd *abfd)
720
0
{
721
0
  struct elf_x86_link_hash_table *ret;
722
0
  size_t amt = sizeof (struct elf_x86_link_hash_table);
723
724
0
  ret = (struct elf_x86_link_hash_table *) bfd_zmalloc (amt);
725
0
  if (ret == NULL)
726
0
    return NULL;
727
728
0
  if (!_bfd_elf_link_hash_table_init (&ret->elf, abfd,
729
0
              _bfd_x86_elf_link_hash_newfunc,
730
0
              sizeof (struct elf_x86_link_hash_entry)))
731
0
    {
732
0
      free (ret);
733
0
      return NULL;
734
0
    }
735
736
0
  elf_backend_data *bed = get_elf_backend_data (abfd);
737
0
  if (bed->target_id == X86_64_ELF_DATA)
738
0
    {
739
0
      ret->is_reloc_section = elf_x86_64_is_reloc_section;
740
0
      ret->got_entry_size = 8;
741
0
      ret->pcrel_plt = true;
742
0
      ret->tls_get_addr = "__tls_get_addr";
743
0
      ret->relative_r_type = R_X86_64_RELATIVE;
744
0
      ret->relative_r_name = "R_X86_64_RELATIVE";
745
0
      ret->ax_register = "RAX";
746
0
      ret->elf_append_reloc = _bfd_elf_append_rela;
747
0
      ret->elf_write_addend_in_got = _bfd_elf64_write_addend;
748
0
    }
749
0
  if (ABI_64_P (abfd))
750
0
    {
751
0
      ret->sizeof_reloc = sizeof (Elf64_External_Rela);
752
0
      ret->pointer_r_type = R_X86_64_64;
753
0
      ret->dynamic_interpreter = ELF64_DYNAMIC_INTERPRETER;
754
0
      ret->dynamic_interpreter_size = sizeof ELF64_DYNAMIC_INTERPRETER;
755
0
      ret->elf_write_addend = _bfd_elf64_write_addend;
756
0
    }
757
0
  else
758
0
    {
759
0
      if (bed->target_id == X86_64_ELF_DATA)
760
0
  {
761
0
    ret->sizeof_reloc = sizeof (Elf32_External_Rela);
762
0
    ret->pointer_r_type = R_X86_64_32;
763
0
    ret->dynamic_interpreter = ELFX32_DYNAMIC_INTERPRETER;
764
0
    ret->dynamic_interpreter_size
765
0
      = sizeof ELFX32_DYNAMIC_INTERPRETER;
766
0
    ret->elf_write_addend = _bfd_elf32_write_addend;
767
0
  }
768
0
      else
769
0
  {
770
0
    ret->is_reloc_section = elf_i386_is_reloc_section;
771
0
    ret->sizeof_reloc = sizeof (Elf32_External_Rel);
772
0
    ret->got_entry_size = 4;
773
0
    ret->pcrel_plt = false;
774
0
    ret->pointer_r_type = R_386_32;
775
0
    ret->relative_r_type = R_386_RELATIVE;
776
0
    ret->relative_r_name = "R_386_RELATIVE";
777
0
    ret->ax_register = "EAX";
778
0
    ret->elf_append_reloc = _bfd_elf_append_rel;
779
0
    ret->elf_write_addend = _bfd_elf32_write_addend;
780
0
    ret->elf_write_addend_in_got = _bfd_elf32_write_addend;
781
0
    ret->dynamic_interpreter = ELF32_DYNAMIC_INTERPRETER;
782
0
    ret->dynamic_interpreter_size
783
0
      = sizeof ELF32_DYNAMIC_INTERPRETER;
784
0
    ret->tls_get_addr = "___tls_get_addr";
785
0
  }
786
0
    }
787
788
0
  ret->loc_hash_table = htab_try_create (1024,
789
0
           _bfd_x86_elf_local_htab_hash,
790
0
           _bfd_x86_elf_local_htab_eq,
791
0
           NULL);
792
0
  ret->loc_hash_memory = objalloc_create ();
793
0
  if (!ret->loc_hash_table || !ret->loc_hash_memory)
794
0
    {
795
0
      elf_x86_link_hash_table_free (abfd);
796
0
      return NULL;
797
0
    }
798
0
  ret->elf.root.hash_table_free = elf_x86_link_hash_table_free;
799
800
0
  return &ret->elf.root;
801
0
}
802
803
/* Sort relocs into address order.  */
804
805
int
806
_bfd_x86_elf_compare_relocs (const void *ap, const void *bp)
807
2.64k
{
808
2.64k
  const arelent *a = * (const arelent **) ap;
809
2.64k
  const arelent *b = * (const arelent **) bp;
810
811
2.64k
  if (a->address > b->address)
812
919
    return 1;
813
1.73k
  else if (a->address < b->address)
814
1.72k
    return -1;
815
3
  else
816
3
    return 0;
817
2.64k
}
818
819
/* Mark symbol, NAME, as locally defined by linker if it is referenced
820
   and not defined in a relocatable object file.  */
821
822
static void
823
elf_x86_linker_defined (struct bfd_link_info *info, const char *name)
824
0
{
825
0
  struct elf_link_hash_entry *h;
826
827
  /* NULL indicates __ehdr_start.  */
828
0
  if (name == NULL)
829
0
    h = elf_hash_table (info)->hehdr_start;
830
0
  else
831
0
    h = elf_link_hash_lookup (elf_hash_table (info), name,
832
0
            false, false, false);
833
0
  if (h == NULL)
834
0
    return;
835
836
0
  while (h->root.type == bfd_link_hash_indirect)
837
0
    h = (struct elf_link_hash_entry *) h->root.u.i.link;
838
839
0
  if (h->root.type == bfd_link_hash_new
840
0
      || h->root.type == bfd_link_hash_undefined
841
0
      || h->root.type == bfd_link_hash_undefweak
842
0
      || h->root.type == bfd_link_hash_common
843
0
      || (!h->def_regular && h->def_dynamic))
844
0
    {
845
0
      elf_x86_hash_entry (h)->local_ref = 2;
846
0
      elf_x86_hash_entry (h)->linker_def = 1;
847
0
    }
848
0
}
849
850
/* Hide a linker-defined symbol, NAME, with hidden visibility.  */
851
852
static void
853
elf_x86_hide_linker_defined (struct bfd_link_info *info,
854
           const char *name)
855
0
{
856
0
  struct elf_link_hash_entry *h;
857
858
0
  h = elf_link_hash_lookup (elf_hash_table (info), name,
859
0
          false, false, false);
860
0
  if (h == NULL)
861
0
    return;
862
863
0
  while (h->root.type == bfd_link_hash_indirect)
864
0
    h = (struct elf_link_hash_entry *) h->root.u.i.link;
865
866
0
  if (ELF_ST_VISIBILITY (h->other) == STV_INTERNAL
867
0
      || ELF_ST_VISIBILITY (h->other) == STV_HIDDEN)
868
0
    _bfd_elf_link_hash_hide_symbol (info, h, true);
869
0
}
870
871
bool
872
_bfd_x86_elf_link_check_relocs (bfd *abfd, struct bfd_link_info *info)
873
0
{
874
0
  if (!bfd_link_relocatable (info))
875
0
    {
876
      /* Check for __tls_get_addr reference.  */
877
0
      struct elf_x86_link_hash_table *htab;
878
0
      elf_backend_data *bed = get_elf_backend_data (abfd);
879
0
      htab = elf_x86_hash_table (info, bed->target_id);
880
0
      if (htab)
881
0
  {
882
0
    struct elf_link_hash_entry *h;
883
884
0
    h = elf_link_hash_lookup (elf_hash_table (info),
885
0
            htab->tls_get_addr,
886
0
            false, false, false);
887
0
    if (h != NULL)
888
0
      {
889
0
        elf_x86_hash_entry (h)->tls_get_addr = 1;
890
891
        /* Check the versioned __tls_get_addr symbol.  */
892
0
        while (h->root.type == bfd_link_hash_indirect)
893
0
    {
894
0
      h = (struct elf_link_hash_entry *) h->root.u.i.link;
895
0
      elf_x86_hash_entry (h)->tls_get_addr = 1;
896
0
    }
897
898
0
        if (h->ref_regular)
899
0
    htab->has_tls_get_addr_call = 1;
900
0
      }
901
902
    /* Pass NULL for __ehdr_start which will be defined by
903
       linker as a hidden symbol later if it is referenced and
904
       not defined.  */
905
0
    elf_x86_linker_defined (info, NULL);
906
907
0
    if (bfd_link_executable (info))
908
0
      {
909
        /* References to __bss_start, _end and _edata should be
910
     locally resolved within executables.  */
911
0
        elf_x86_linker_defined (info, "__bss_start");
912
0
        elf_x86_linker_defined (info, "_end");
913
0
        elf_x86_linker_defined (info, "_edata");
914
0
      }
915
0
    else
916
0
      {
917
        /* Hide hidden __bss_start, _end and _edata in shared
918
     libraries.  */
919
0
        elf_x86_hide_linker_defined (info, "__bss_start");
920
0
        elf_x86_hide_linker_defined (info, "_end");
921
0
        elf_x86_hide_linker_defined (info, "_edata");
922
0
      }
923
0
  }
924
0
    }
925
926
  /* Invoke the regular ELF backend linker to do all the work.  */
927
0
  return _bfd_elf_link_check_relocs (abfd, info);
928
0
}
929
930
/* Look through the relocs for a section before allocation to make the
931
   dynamic reloc section.  */
932
933
bool
934
_bfd_x86_elf_check_relocs (bfd *abfd,
935
         struct bfd_link_info *info,
936
         asection *sec,
937
         const Elf_Internal_Rela *relocs)
938
0
{
939
0
  struct elf_x86_link_hash_table *htab;
940
0
  Elf_Internal_Shdr *symtab_hdr;
941
0
  struct elf_link_hash_entry **sym_hashes;
942
0
  const Elf_Internal_Rela *rel;
943
0
  const Elf_Internal_Rela *rel_end;
944
0
  asection *sreloc;
945
0
  elf_backend_data *bed;
946
0
  bool is_x86_64;
947
948
0
  if (bfd_link_relocatable (info))
949
0
    return true;
950
951
0
  bed = get_elf_backend_data (abfd);
952
0
  htab = elf_x86_hash_table (info, bed->target_id);
953
0
  if (htab == NULL)
954
0
    {
955
0
      sec->check_relocs_failed = 1;
956
0
      return false;
957
0
    }
958
959
0
  is_x86_64 = bed->target_id == X86_64_ELF_DATA;
960
961
0
  symtab_hdr = &elf_symtab_hdr (abfd);
962
0
  sym_hashes = elf_sym_hashes (abfd);
963
964
0
  rel_end = relocs + sec->reloc_count;
965
0
  for (rel = relocs; rel < rel_end; rel++)
966
0
    {
967
0
      unsigned int r_type;
968
0
      unsigned int r_symndx;
969
0
      struct elf_link_hash_entry *h;
970
971
0
      r_symndx = htab->r_sym (rel->r_info);
972
0
      r_type = ELF32_R_TYPE (rel->r_info);
973
974
0
      if (r_symndx >= NUM_SHDR_ENTRIES (symtab_hdr))
975
0
  {
976
    /* xgettext:c-format */
977
0
    _bfd_error_handler (_("%pB: bad symbol index: %d"),
978
0
            abfd, r_symndx);
979
0
    goto error_return;
980
0
  }
981
982
0
      h = _bfd_elf_get_link_hash_entry (sym_hashes, r_symndx,
983
0
          symtab_hdr->sh_info,
984
0
          NUM_SHDR_ENTRIES (symtab_hdr));
985
986
0
      if (X86_NEED_DYNAMIC_RELOC_TYPE_P (is_x86_64, r_type)
987
0
    && NEED_DYNAMIC_RELOCATION_P (is_x86_64, info, true, h, sec,
988
0
          r_type, htab->pointer_r_type))
989
0
  {
990
    /* We may copy these reloc types into the output file.
991
       Create a reloc section in dynobj and make room for
992
       this reloc.  */
993
0
    sreloc = _bfd_elf_make_dynamic_reloc_section
994
0
      (sec, htab->elf.dynobj, ABI_64_P (abfd) ? 3 : 2,
995
0
       abfd, sec->use_rela_p);
996
997
0
    if (sreloc != NULL)
998
0
      return true;
999
1000
0
  error_return:
1001
0
    sec->check_relocs_failed = 1;
1002
0
    return false;
1003
0
  }
1004
0
    }
1005
1006
0
  return true;
1007
0
}
1008
1009
/* Add an entry to the relative reloc record.  */
1010
1011
static bool
1012
elf_x86_relative_reloc_record_add
1013
  (struct bfd_link_info *info,
1014
   struct elf_x86_relative_reloc_data *relative_reloc,
1015
   Elf_Internal_Rela *rel, asection *sec,
1016
   asection *sym_sec, struct elf_link_hash_entry *h,
1017
   Elf_Internal_Sym *sym, bfd_vma offset)
1018
0
{
1019
0
  bfd_size_type newidx;
1020
1021
0
  if (relative_reloc->data == NULL)
1022
0
    {
1023
0
      relative_reloc->data = bfd_malloc
1024
0
  (sizeof (struct elf_x86_relative_reloc_record));
1025
0
      relative_reloc->count = 0;
1026
0
      relative_reloc->size = 1;
1027
0
    }
1028
1029
0
  newidx = relative_reloc->count++;
1030
1031
0
  if (relative_reloc->count > relative_reloc->size)
1032
0
    {
1033
0
      relative_reloc->size <<= 1;
1034
0
      relative_reloc->data = bfd_realloc
1035
0
  (relative_reloc->data,
1036
0
   (relative_reloc->size
1037
0
    * sizeof (struct elf_x86_relative_reloc_record)));
1038
0
    }
1039
1040
0
  if (relative_reloc->data == NULL)
1041
0
    {
1042
0
      info->callbacks->fatal
1043
  /* xgettext:c-format */
1044
0
  (_("%P: %pB: failed to allocate relative reloc record\n"),
1045
0
   info->output_bfd);
1046
0
      return false;
1047
0
    }
1048
1049
0
  relative_reloc->data[newidx].rel = *rel;
1050
0
  relative_reloc->data[newidx].sec = sec;
1051
0
  if (h != NULL)
1052
0
    {
1053
      /* Set SYM to NULL to indicate a global symbol.  */
1054
0
      relative_reloc->data[newidx].sym = NULL;
1055
0
      relative_reloc->data[newidx].u.h = h;
1056
0
    }
1057
0
  else
1058
0
    {
1059
0
      relative_reloc->data[newidx].sym = sym;
1060
0
      relative_reloc->data[newidx].u.sym_sec = sym_sec;
1061
0
    }
1062
0
  relative_reloc->data[newidx].offset = offset;
1063
0
  relative_reloc->data[newidx].address = 0;
1064
0
  return true;
1065
0
}
1066
1067
/* After input sections have been mapped to output sections and
1068
   addresses of output sections are set initiallly, scan input
1069
   relocations with the same logic in relocate_section to determine
1070
   if a relative relocation should be generated.  Save the relative
1071
   relocation candidate information for sizing the DT_RELR section
1072
   later after all symbols addresses can be determined.  */
1073
1074
bool
1075
_bfd_x86_elf_link_relax_section (bfd *abfd ATTRIBUTE_UNUSED,
1076
         asection *input_section,
1077
         struct bfd_link_info *info,
1078
         bool *again)
1079
0
{
1080
0
  Elf_Internal_Shdr *symtab_hdr;
1081
0
  Elf_Internal_Rela *internal_relocs;
1082
0
  Elf_Internal_Rela *irel, *irelend;
1083
0
  Elf_Internal_Sym *isymbuf;
1084
0
  struct elf_link_hash_entry **sym_hashes;
1085
0
  elf_backend_data *bed;
1086
0
  struct elf_x86_link_hash_table *htab;
1087
0
  bfd_vma *local_got_offsets;
1088
0
  bool is_x86_64;
1089
0
  bool unaligned_section;
1090
0
  bool return_status = false;
1091
1092
  /* Assume we're not going to change any sizes, and we'll only need
1093
     one pass.  */
1094
0
  *again = false;
1095
1096
0
  if (bfd_link_relocatable (info))
1097
0
    return true;
1098
1099
0
  if (!info->enable_dt_relr)
1100
0
    return true;
1101
1102
0
  bed = get_elf_backend_data (abfd);
1103
0
  htab = elf_x86_hash_table (info, bed->target_id);
1104
0
  if (htab == NULL)
1105
0
    return true;
1106
1107
  /* Nothing to do if there are no relocations or relative relocations
1108
     have been packed.  */
1109
0
  if (input_section == htab->elf.srelrdyn
1110
0
      || input_section->relative_reloc_packed
1111
0
      || ((input_section->flags & (SEC_RELOC | SEC_ALLOC))
1112
0
    != (SEC_RELOC | SEC_ALLOC))
1113
0
      || (input_section->flags & SEC_DEBUGGING) != 0
1114
0
      || input_section->reloc_count == 0)
1115
0
    return true;
1116
1117
  /* Skip if the section isn't aligned.  */
1118
0
  unaligned_section = input_section->alignment_power == 0;
1119
1120
0
  is_x86_64 = bed->target_id == X86_64_ELF_DATA;
1121
1122
0
  symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1123
0
  sym_hashes = elf_sym_hashes (abfd);
1124
0
  local_got_offsets = elf_local_got_offsets (abfd);
1125
1126
  /* Load the relocations for this section.  */
1127
0
  internal_relocs =
1128
0
    _bfd_elf_link_info_read_relocs (abfd, info, input_section, NULL,
1129
0
            (Elf_Internal_Rela *) NULL,
1130
0
            info->keep_memory);
1131
0
  if (internal_relocs == NULL)
1132
0
    return false;
1133
1134
0
  isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
1135
0
  if (isymbuf == NULL && symtab_hdr->sh_info > 1)
1136
0
    {
1137
      /* symtab_hdr->sh_info == the number of local symbols + 1.  Load
1138
   the symbol table if there are local symbols.  */
1139
0
      isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
1140
0
              symtab_hdr->sh_info,
1141
0
              0, NULL, NULL, NULL);
1142
0
      if (isymbuf == NULL)
1143
0
  return false;
1144
1145
      /* Cache the symbol table to avoid loading the same symbol table
1146
   repeatedly which can take a long time if the input has many
1147
   code sections.  */
1148
0
      symtab_hdr->contents = (unsigned char *) isymbuf;
1149
0
    }
1150
1151
0
  irelend = internal_relocs + input_section->reloc_count;
1152
0
  for (irel = internal_relocs; irel < irelend; irel++)
1153
0
    {
1154
0
      unsigned int r_type;
1155
0
      unsigned int r_symndx;
1156
0
      Elf_Internal_Sym *isym;
1157
0
      struct elf_link_hash_entry *h;
1158
0
      struct elf_x86_link_hash_entry *eh;
1159
0
      bfd_vma offset;
1160
0
      bool resolved_to_zero;
1161
0
      bool need_copy_reloc_in_pie;
1162
0
      bool pc32_reloc;
1163
0
      asection *sec;
1164
      /* Offset must be a multiple of 2.  */
1165
0
      bool unaligned_offset = (irel->r_offset & 1) != 0;
1166
      /* True if there is a relative relocation against a dynamic
1167
   symbol.  */
1168
0
      bool dynamic_relative_reloc_p;
1169
1170
      /* Get the value of the symbol referred to by the reloc.  */
1171
0
      r_symndx = htab->r_sym (irel->r_info);
1172
1173
0
      r_type = ELF32_R_TYPE (irel->r_info);
1174
      /* Clear the R_X86_64_converted_reloc_bit bit.  */
1175
0
      r_type &= ~R_X86_64_converted_reloc_bit;
1176
1177
0
      sec = NULL;
1178
0
      h = NULL;
1179
0
      dynamic_relative_reloc_p = false;
1180
1181
0
      if (r_symndx < symtab_hdr->sh_info)
1182
0
  {
1183
0
    isym = isymbuf + r_symndx;
1184
0
    switch (isym->st_shndx)
1185
0
      {
1186
0
      case SHN_ABS:
1187
0
        sec = bfd_abs_section_ptr;
1188
0
        break;
1189
0
      case SHN_COMMON:
1190
0
        sec = bfd_com_section_ptr;
1191
0
        break;
1192
0
      case SHN_X86_64_LCOMMON:
1193
0
        if (!is_x86_64)
1194
0
    abort ();
1195
0
        sec = &bfd_elf_large_com_section;
1196
0
        break;
1197
0
      default:
1198
0
        sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
1199
0
        break;
1200
0
      }
1201
1202
    /* Skip relocation against local STT_GNU_IFUNC symbol.  */
1203
0
    if (ELF32_ST_TYPE (isym->st_info) == STT_GNU_IFUNC)
1204
0
      continue;
1205
1206
0
    eh = (struct elf_x86_link_hash_entry *) h;
1207
0
    resolved_to_zero = false;
1208
0
  }
1209
0
      else
1210
0
  {
1211
    /* Get H and SEC for GENERATE_DYNAMIC_RELOCATION_P below.  */
1212
0
    h = _bfd_elf_get_link_hash_entry (sym_hashes, r_symndx,
1213
0
              symtab_hdr->sh_info,
1214
0
              NUM_SHDR_ENTRIES (symtab_hdr));
1215
0
    if (h == NULL)
1216
0
      {
1217
        /* FIXMEL: Issue an error message ?  */
1218
0
        continue;
1219
0
      }
1220
1221
0
    if (h->root.type == bfd_link_hash_defined
1222
0
        || h->root.type == bfd_link_hash_defweak)
1223
0
      sec = h->root.u.def.section;
1224
1225
    /* Skip relocation against STT_GNU_IFUNC symbol.  */
1226
0
    if (h->type == STT_GNU_IFUNC)
1227
0
      continue;
1228
1229
0
    eh = (struct elf_x86_link_hash_entry *) h;
1230
0
    resolved_to_zero = UNDEFINED_WEAK_RESOLVED_TO_ZERO (info, eh);
1231
1232
    /* NB: See how elf_backend_finish_dynamic_symbol is called
1233
       from elf_link_output_extsym.  */
1234
0
    if ((h->dynindx != -1 || h->forced_local)
1235
0
        && ((ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
1236
0
       || h->root.type != bfd_link_hash_undefweak)
1237
0
      || !h->forced_local)
1238
0
        && h->got.offset != (bfd_vma) -1
1239
0
        && ! GOT_TLS_GD_ANY_P (elf_x86_hash_entry (h)->tls_type)
1240
0
        && elf_x86_hash_entry (h)->tls_type != GOT_TLS_IE
1241
0
        && !resolved_to_zero
1242
0
        && SYMBOL_REFERENCES_LOCAL_P (info, h)
1243
0
        && SYMBOL_DEFINED_NON_SHARED_P (h))
1244
0
      dynamic_relative_reloc_p = true;
1245
1246
0
    isym = NULL;
1247
0
  }
1248
1249
0
      if (X86_GOT_TYPE_P (is_x86_64, r_type))
1250
0
  {
1251
    /* Pack GOT relative relocations.  There should be only a
1252
       single R_*_RELATIVE relocation in GOT.  */
1253
0
    if (eh != NULL)
1254
0
      {
1255
0
        if (eh->got_relative_reloc_done)
1256
0
    continue;
1257
1258
0
        if (!(dynamic_relative_reloc_p
1259
0
        || (RESOLVED_LOCALLY_P (info, h, htab)
1260
0
      && GENERATE_RELATIVE_RELOC_P (info, h))))
1261
0
    continue;
1262
1263
0
        if (!dynamic_relative_reloc_p)
1264
0
    eh->no_finish_dynamic_symbol = 1;
1265
0
        eh->got_relative_reloc_done = 1;
1266
0
        offset = h->got.offset;
1267
0
      }
1268
0
    else
1269
0
      {
1270
0
        if (elf_x86_relative_reloc_done (abfd)[r_symndx])
1271
0
    continue;
1272
1273
0
        if (!X86_LOCAL_GOT_RELATIVE_RELOC_P (is_x86_64, info,
1274
0
               isym))
1275
0
    continue;
1276
1277
0
        elf_x86_relative_reloc_done (abfd)[r_symndx] = 1;
1278
0
        offset = local_got_offsets[r_symndx];
1279
0
      }
1280
1281
0
    if (!elf_x86_relative_reloc_record_add (info,
1282
0
              &htab->relative_reloc,
1283
0
              irel, htab->elf.sgot,
1284
0
              sec, h, isym, offset))
1285
0
      goto error_return;
1286
1287
0
    continue;
1288
0
  }
1289
1290
0
      if (is_x86_64
1291
0
    && irel->r_addend == 0
1292
0
    && !ABI_64_P (info->output_bfd))
1293
0
  {
1294
    /* For x32, if addend is zero, treat R_X86_64_64 like
1295
       R_X86_64_32 and R_X86_64_SIZE64 like R_X86_64_SIZE32.  */
1296
0
    if (r_type == R_X86_64_64)
1297
0
      r_type = R_X86_64_32;
1298
0
    else if (r_type == R_X86_64_SIZE64)
1299
0
      r_type = R_X86_64_SIZE32;
1300
0
  }
1301
1302
0
      if (!X86_RELATIVE_RELOC_TYPE_P (is_x86_64, r_type))
1303
0
  continue;
1304
1305
      /* Pack non-GOT relative relocations.  */
1306
0
      if (is_x86_64)
1307
0
  {
1308
0
    need_copy_reloc_in_pie =
1309
0
      (bfd_link_pie (info)
1310
0
       && h != NULL
1311
0
       && (h->needs_copy
1312
0
     || eh->needs_copy
1313
0
     || (h->root.type == bfd_link_hash_undefined))
1314
0
       && (X86_PCREL_TYPE_P (true, r_type)
1315
0
     || X86_SIZE_TYPE_P (true, r_type)));
1316
0
    pc32_reloc = false;
1317
0
  }
1318
0
      else
1319
0
  {
1320
0
    need_copy_reloc_in_pie = false;
1321
0
    pc32_reloc = r_type == R_386_PC32;
1322
0
  }
1323
1324
0
      if (GENERATE_DYNAMIC_RELOCATION_P (is_x86_64, info, eh, r_type,
1325
0
           sec, need_copy_reloc_in_pie,
1326
0
           resolved_to_zero, pc32_reloc))
1327
0
  {
1328
    /* When generating a shared object, these relocations
1329
       are copied into the output file to be resolved at run
1330
       time.  */
1331
0
    offset = _bfd_elf_section_offset (info->output_bfd, info,
1332
0
              input_section,
1333
0
              irel->r_offset);
1334
0
    if (offset == (bfd_vma) -1
1335
0
        || offset == (bfd_vma) -2
1336
0
        || COPY_INPUT_RELOC_P (is_x86_64, info, h, r_type))
1337
0
      continue;
1338
1339
    /* This symbol is local, or marked to become local.  When
1340
       relocation overflow check is disabled, we convert
1341
       R_X86_64_32 to dynamic R_X86_64_RELATIVE.  */
1342
0
    if (is_x86_64
1343
0
        && !(r_type == htab->pointer_r_type
1344
0
       || (r_type == R_X86_64_32
1345
0
           && htab->params->no_reloc_overflow_check)))
1346
0
      continue;
1347
1348
0
    if (!elf_x86_relative_reloc_record_add
1349
0
          (info,
1350
0
     ((unaligned_section || unaligned_offset)
1351
0
      ? &htab->unaligned_relative_reloc
1352
0
      : &htab->relative_reloc),
1353
0
     irel, input_section, sec, h, isym, offset))
1354
0
      goto error_return;
1355
0
  }
1356
0
    }
1357
1358
0
  input_section->relative_reloc_packed = 1;
1359
1360
0
  return_status = true;
1361
1362
0
error_return:
1363
0
  if (elf_section_data (input_section)->relocs != internal_relocs)
1364
0
    free (internal_relocs);
1365
0
  return return_status;
1366
0
}
1367
1368
/* Add an entry to the 64-bit DT_RELR bitmap.  */
1369
1370
static void
1371
elf64_dt_relr_bitmap_add
1372
  (struct bfd_link_info *info, struct elf_dt_relr_bitmap *bitmap,
1373
   uint64_t entry)
1374
0
{
1375
0
  bfd_size_type newidx;
1376
1377
0
  if (bitmap->u.elf64 == NULL)
1378
0
    {
1379
0
      bitmap->u.elf64 = bfd_malloc (sizeof (uint64_t));
1380
0
      bitmap->count = 0;
1381
0
      bitmap->size = 1;
1382
0
    }
1383
1384
0
  newidx = bitmap->count++;
1385
1386
0
  if (bitmap->count > bitmap->size)
1387
0
    {
1388
0
      bitmap->size <<= 1;
1389
0
      bitmap->u.elf64 = bfd_realloc (bitmap->u.elf64,
1390
0
             (bitmap->size * sizeof (uint64_t)));
1391
0
    }
1392
1393
0
  if (bitmap->u.elf64 == NULL)
1394
0
    {
1395
0
      info->callbacks->fatal
1396
  /* xgettext:c-format */
1397
0
  (_("%P: %pB: failed to allocate 64-bit DT_RELR bitmap\n"),
1398
0
   info->output_bfd);
1399
0
    }
1400
1401
0
  bitmap->u.elf64[newidx] = entry;
1402
0
}
1403
1404
/* Add an entry to the 32-bit DT_RELR bitmap.  */
1405
1406
static void
1407
elf32_dt_relr_bitmap_add
1408
  (struct bfd_link_info *info, struct elf_dt_relr_bitmap *bitmap,
1409
   uint32_t entry)
1410
0
{
1411
0
  bfd_size_type newidx;
1412
1413
0
  if (bitmap->u.elf32 == NULL)
1414
0
    {
1415
0
      bitmap->u.elf32 = bfd_malloc (sizeof (uint32_t));
1416
0
      bitmap->count = 0;
1417
0
      bitmap->size = 1;
1418
0
    }
1419
1420
0
  newidx = bitmap->count++;
1421
1422
0
  if (bitmap->count > bitmap->size)
1423
0
    {
1424
0
      bitmap->size <<= 1;
1425
0
      bitmap->u.elf32 = bfd_realloc (bitmap->u.elf32,
1426
0
             (bitmap->size * sizeof (uint32_t)));
1427
0
    }
1428
1429
0
  if (bitmap->u.elf32 == NULL)
1430
0
    {
1431
0
      info->callbacks->fatal
1432
  /* xgettext:c-format */
1433
0
  (_("%P: %pB: failed to allocate 32-bit DT_RELR bitmap\n"),
1434
0
   info->output_bfd);
1435
0
    }
1436
1437
0
  bitmap->u.elf32[newidx] = entry;
1438
0
}
1439
1440
void
1441
_bfd_elf32_write_addend (bfd *abfd, uint64_t value, void *addr)
1442
0
{
1443
0
  bfd_put_32 (abfd, value, addr);
1444
0
}
1445
1446
void
1447
_bfd_elf64_write_addend (bfd *abfd, uint64_t value, void *addr)
1448
0
{
1449
0
  bfd_put_64 (abfd, value, addr);
1450
0
}
1451
1452
/* Size or finish relative relocations to determine the run-time
1453
   addresses for DT_RELR bitmap computation later.  OUTREL is set
1454
   to NULL in the sizing phase and non-NULL in the finising phase
1455
   where the regular relative relocations will be written out.  */
1456
1457
static void
1458
elf_x86_size_or_finish_relative_reloc
1459
  (bool is_x86_64, struct bfd_link_info *info,
1460
   struct elf_x86_link_hash_table *htab, bool unaligned,
1461
   Elf_Internal_Rela *outrel)
1462
0
{
1463
0
  unsigned int align_mask;
1464
0
  bfd_size_type i, count;
1465
0
  asection *sec, *srel;
1466
0
  struct elf_link_hash_entry *h;
1467
0
  bfd_vma offset;
1468
0
  Elf_Internal_Sym *sym;
1469
0
  asection *sym_sec;
1470
0
  asection *sgot = htab->elf.sgot;
1471
0
  asection *srelgot = htab->elf.srelgot;
1472
0
  struct elf_x86_relative_reloc_data *relative_reloc;
1473
1474
0
  if (unaligned)
1475
0
    {
1476
0
      align_mask = 0;
1477
0
      relative_reloc = &htab->unaligned_relative_reloc;
1478
0
    }
1479
0
  else
1480
0
    {
1481
0
      align_mask = 1;
1482
0
      relative_reloc = &htab->relative_reloc;
1483
0
    }
1484
1485
0
  count = relative_reloc->count;
1486
0
  for (i = 0; i < count; i++)
1487
0
    {
1488
0
      sec = relative_reloc->data[i].sec;
1489
0
      sym = relative_reloc->data[i].sym;
1490
1491
      /* If SYM is NULL, it must be a global symbol.  */
1492
0
      if (sym == NULL)
1493
0
  h = relative_reloc->data[i].u.h;
1494
0
      else
1495
0
  h = NULL;
1496
1497
0
      if (is_x86_64)
1498
0
  {
1499
0
    bfd_vma relocation;
1500
    /* This function may be called more than once and REL may be
1501
       updated by _bfd_elf_rela_local_sym below.  */
1502
0
    Elf_Internal_Rela rel = relative_reloc->data[i].rel;
1503
1504
0
    if (h != NULL)
1505
0
      {
1506
0
        if (h->root.type == bfd_link_hash_defined
1507
0
      || h->root.type == bfd_link_hash_defweak)
1508
0
    {
1509
0
      sym_sec = h->root.u.def.section;
1510
0
      relocation = (h->root.u.def.value
1511
0
        + sym_sec->output_section->vma
1512
0
        + sym_sec->output_offset);
1513
0
    }
1514
0
        else
1515
0
    {
1516
      /* Allow undefined symbol only at the sizing phase.
1517
         Otherwise skip undefined symbol here.  Undefined
1518
         symbol will be reported by relocate_section.  */
1519
0
      if (outrel == NULL)
1520
0
        relocation = 0;
1521
0
      else
1522
0
        continue;
1523
0
    }
1524
0
      }
1525
0
    else
1526
0
      {
1527
0
        sym_sec = relative_reloc->data[i].u.sym_sec;
1528
0
        relocation = _bfd_elf_rela_local_sym
1529
0
    (info->output_bfd, sym, &sym_sec, &rel);
1530
0
      }
1531
1532
0
    if (outrel != NULL)
1533
0
      {
1534
0
        outrel->r_addend = relocation;
1535
0
        if (sec == sgot)
1536
0
    {
1537
0
      if (h != NULL && h->needs_plt)
1538
0
        abort ();
1539
0
    }
1540
0
        else
1541
0
    outrel->r_addend += rel.r_addend;
1542
1543
        /* Write the implicit addend if ALIGN_MASK isn't 0.  */
1544
0
        if (align_mask)
1545
0
    {
1546
0
      if (sec == sgot)
1547
0
        {
1548
0
          if (relative_reloc->data[i].offset >= sec->size)
1549
0
      abort ();
1550
0
          htab->elf_write_addend_in_got
1551
0
      (info->output_bfd, outrel->r_addend,
1552
0
       sec->contents + relative_reloc->data[i].offset);
1553
0
        }
1554
0
      else
1555
0
        {
1556
0
          bfd_byte *contents;
1557
1558
0
          if (rel.r_offset >= sec->size)
1559
0
      abort ();
1560
1561
0
          if (elf_section_data (sec)->this_hdr.contents
1562
0
        != NULL)
1563
0
      contents
1564
0
        = elf_section_data (sec)->this_hdr.contents;
1565
0
          else
1566
0
      {
1567
0
        if (!_bfd_elf_mmap_section_contents (sec->owner,
1568
0
                     sec,
1569
0
                     &contents))
1570
0
          info->callbacks->fatal
1571
            /* xgettext:c-format */
1572
0
            (_("%P: %pB: failed to allocate memory for section `%pA'\n"),
1573
0
             info->output_bfd, sec);
1574
1575
        /* Cache the section contents for
1576
           elf_link_input_bfd.  */
1577
0
        elf_section_data (sec)->this_hdr.contents
1578
0
          = contents;
1579
0
      }
1580
0
          htab->elf_write_addend
1581
0
      (info->output_bfd, outrel->r_addend,
1582
0
       contents + rel.r_offset);
1583
0
        }
1584
0
    }
1585
0
      }
1586
0
  }
1587
1588
0
      if (sec == sgot)
1589
0
  srel = srelgot;
1590
0
      else
1591
0
  srel = elf_section_data (sec)->sreloc;
1592
0
      offset = (sec->output_section->vma + sec->output_offset
1593
0
    + relative_reloc->data[i].offset);
1594
0
      relative_reloc->data[i].address = offset;
1595
0
      if (outrel != NULL)
1596
0
  {
1597
0
    outrel->r_offset = offset;
1598
1599
0
    if ((outrel->r_offset & align_mask) != 0)
1600
0
      abort ();
1601
1602
0
    if (htab->params->report_relative_reloc)
1603
0
      _bfd_x86_elf_link_report_relative_reloc
1604
0
        (info, sec, h, sym, htab->relative_r_name, outrel);
1605
1606
    /* Generate regular relative relocation if ALIGN_MASK is 0.  */
1607
0
    if (align_mask == 0)
1608
0
      htab->elf_append_reloc (info->output_bfd, srel, outrel);
1609
0
  }
1610
0
    }
1611
0
}
1612
1613
/* Compute the DT_RELR section size.  Set NEED_PLAYOUT to true if
1614
   the DT_RELR section size has been increased.  */
1615
1616
static void
1617
elf_x86_compute_dl_relr_bitmap
1618
  (struct bfd_link_info *info, struct elf_x86_link_hash_table *htab,
1619
   bool *need_layout)
1620
0
{
1621
0
  bfd_vma base;
1622
0
  bfd_size_type i, count, new_count;
1623
0
  struct elf_x86_relative_reloc_data *relative_reloc =
1624
0
    &htab->relative_reloc;
1625
  /* Save the old DT_RELR bitmap count.  Don't shrink the DT_RELR bitmap
1626
     if the new DT_RELR bitmap count is smaller than the old one.  Pad
1627
     with trailing 1s which won't be decoded to more relocations.  */
1628
0
  bfd_size_type dt_relr_bitmap_count = htab->dt_relr_bitmap.count;
1629
1630
  /* Clear the DT_RELR bitmap count.  */
1631
0
  htab->dt_relr_bitmap.count = 0;
1632
1633
0
  count = relative_reloc->count;
1634
1635
0
  if (ABI_64_P (info->output_bfd))
1636
0
    {
1637
      /* Compute the 64-bit DT_RELR bitmap.  */
1638
0
      i = 0;
1639
0
      while (i < count)
1640
0
  {
1641
0
    if ((relative_reloc->data[i].address % 1) != 0)
1642
0
      abort ();
1643
1644
0
    elf64_dt_relr_bitmap_add (info, &htab->dt_relr_bitmap,
1645
0
            relative_reloc->data[i].address);
1646
1647
0
    base = relative_reloc->data[i].address + 8;
1648
0
    i++;
1649
1650
0
    while (i < count)
1651
0
      {
1652
0
        uint64_t bitmap = 0;
1653
0
        for (; i < count; i++)
1654
0
    {
1655
0
      bfd_vma delta = (relative_reloc->data[i].address
1656
0
           - base);
1657
      /* Stop if it is too far from base.  */
1658
0
      if (delta >= 63 * 8)
1659
0
        break;
1660
      /* Stop if it isn't a multiple of 8.  */
1661
0
      if ((delta % 8) != 0)
1662
0
        break;
1663
0
      bitmap |= 1ULL << (delta / 8);
1664
0
    }
1665
1666
0
        if (bitmap == 0)
1667
0
    break;
1668
1669
0
        elf64_dt_relr_bitmap_add (info, &htab->dt_relr_bitmap,
1670
0
          (bitmap << 1) | 1);
1671
1672
0
        base += 63 * 8;
1673
0
      }
1674
0
  }
1675
1676
0
      new_count = htab->dt_relr_bitmap.count;
1677
0
      if (dt_relr_bitmap_count > new_count)
1678
0
  {
1679
    /* Don't shrink the DT_RELR section size to avoid section
1680
       layout oscillation.  Instead, pad the DT_RELR bitmap with
1681
       1s which do not decode to more relocations.  */
1682
1683
0
    htab->dt_relr_bitmap.count = dt_relr_bitmap_count;
1684
0
    count = dt_relr_bitmap_count - new_count;
1685
0
    for (i = 0; i < count; i++)
1686
0
      htab->dt_relr_bitmap.u.elf64[new_count + i] = 1;
1687
0
  }
1688
0
    }
1689
0
  else
1690
0
    {
1691
      /* Compute the 32-bit DT_RELR bitmap.  */
1692
0
      i = 0;
1693
0
      while (i < count)
1694
0
  {
1695
0
    if ((relative_reloc->data[i].address % 1) != 0)
1696
0
      abort ();
1697
1698
0
    elf32_dt_relr_bitmap_add (info, &htab->dt_relr_bitmap,
1699
0
            relative_reloc->data[i].address);
1700
1701
0
    base = relative_reloc->data[i].address + 4;
1702
0
    i++;
1703
1704
0
    while (i < count)
1705
0
      {
1706
0
        uint32_t bitmap = 0;
1707
0
        for (; i < count; i++)
1708
0
    {
1709
0
      bfd_vma delta = (relative_reloc->data[i].address
1710
0
           - base);
1711
      /* Stop if it is too far from base.  */
1712
0
      if (delta >= 31 * 4)
1713
0
        break;
1714
      /* Stop if it isn't a multiple of 4.  */
1715
0
      if ((delta % 4) != 0)
1716
0
        break;
1717
0
      bitmap |= 1ULL << (delta / 4);
1718
0
    }
1719
1720
0
        if (bitmap == 0)
1721
0
    break;
1722
1723
0
        elf32_dt_relr_bitmap_add (info, &htab->dt_relr_bitmap,
1724
0
          (bitmap << 1) | 1);
1725
1726
0
        base += 31 * 4;
1727
0
      }
1728
0
  }
1729
1730
0
      new_count = htab->dt_relr_bitmap.count;
1731
0
      if (dt_relr_bitmap_count > new_count)
1732
0
  {
1733
    /* Don't shrink the DT_RELR section size to avoid section
1734
       layout oscillation.  Instead, pad the DT_RELR bitmap with
1735
       1s which do not decode to more relocations.  */
1736
1737
0
    htab->dt_relr_bitmap.count = dt_relr_bitmap_count;
1738
0
    count = dt_relr_bitmap_count - new_count;
1739
0
    for (i = 0; i < count; i++)
1740
0
      htab->dt_relr_bitmap.u.elf32[new_count + i] = 1;
1741
0
  }
1742
0
    }
1743
1744
0
  if (htab->dt_relr_bitmap.count != dt_relr_bitmap_count)
1745
0
    {
1746
0
      if (need_layout)
1747
0
  {
1748
    /* The .relr.dyn section size is changed.  Update the section
1749
       size and tell linker to layout sections again.  */
1750
0
    htab->elf.srelrdyn->size =
1751
0
      (htab->dt_relr_bitmap.count
1752
0
       * (ABI_64_P (info->output_bfd) ? 8 : 4));
1753
1754
0
    *need_layout = true;
1755
0
  }
1756
0
      else
1757
0
  info->callbacks->fatal
1758
    /* xgettext:c-format */
1759
0
    (_("%P: %pB: size of compact relative reloc section is "
1760
0
       "changed: new (%lu) != old (%lu)\n"),
1761
0
     info->output_bfd, htab->dt_relr_bitmap.count,
1762
0
     dt_relr_bitmap_count);
1763
0
    }
1764
0
}
1765
1766
/* Write out the DT_RELR section.  */
1767
1768
static void
1769
elf_x86_write_dl_relr_bitmap (struct bfd_link_info *info,
1770
            struct elf_x86_link_hash_table *htab)
1771
0
{
1772
0
  asection *sec = htab->elf.srelrdyn;
1773
0
  bfd_size_type size = sec->size;
1774
0
  bfd_size_type i;
1775
0
  unsigned char *contents;
1776
1777
0
  contents = (unsigned char *) bfd_alloc (sec->owner, size);
1778
0
  if (contents == NULL)
1779
0
    info->callbacks->fatal
1780
      /* xgettext:c-format */
1781
0
      (_("%P: %pB: failed to allocate compact relative reloc section\n"),
1782
0
       info->output_bfd);
1783
1784
  /* Cache the section contents for elf_link_input_bfd.  */
1785
0
  sec->contents = contents;
1786
0
  sec->alloced = 1;
1787
1788
0
  if (ABI_64_P (info->output_bfd))
1789
0
    for (i = 0; i < htab->dt_relr_bitmap.count; i++, contents += 8)
1790
0
      bfd_put_64 (info->output_bfd, htab->dt_relr_bitmap.u.elf64[i],
1791
0
      contents);
1792
0
  else
1793
0
    for (i = 0; i < htab->dt_relr_bitmap.count; i++, contents += 4)
1794
0
      bfd_put_32 (info->output_bfd, htab->dt_relr_bitmap.u.elf32[i],
1795
0
      contents);
1796
0
}
1797
1798
/* Sort relative relocations by address.  */
1799
1800
static int
1801
elf_x86_relative_reloc_compare (const void *pa, const void *pb)
1802
0
{
1803
0
  struct elf_x86_relative_reloc_record *a =
1804
0
    (struct elf_x86_relative_reloc_record *) pa;
1805
0
  struct elf_x86_relative_reloc_record *b =
1806
0
    (struct elf_x86_relative_reloc_record *) pb;
1807
0
  if (a->address < b->address)
1808
0
    return -1;
1809
0
  if (a->address > b->address)
1810
0
    return 1;
1811
0
  return 0;
1812
0
}
1813
1814
enum dynobj_sframe_plt_type
1815
{
1816
  SFRAME_PLT = 1,
1817
  SFRAME_PLT_SEC = 2,
1818
  SFRAME_PLT_GOT = 3,
1819
};
1820
1821
/* Create SFrame stack trace info for the plt entries in the .plt section
1822
   of type PLT_SEC_TYPE.  */
1823
1824
static bool
1825
_bfd_x86_elf_create_sframe_plt (bfd *output_bfd,
1826
        struct bfd_link_info *info,
1827
        unsigned int plt_sec_type)
1828
0
{
1829
0
  struct elf_x86_link_hash_table *htab;
1830
0
  elf_backend_data *bed;
1831
1832
0
  unsigned int plt0_entry_size;
1833
0
  unsigned char func_info;
1834
0
  uint32_t fre_type;
1835
  /* The dynamic plt section for which .sframe stack trace information is being
1836
     created.  */
1837
0
  asection *dpltsec;
1838
1839
0
  int err = 0;
1840
1841
0
  sframe_encoder_ctx **ectx = NULL;
1842
0
  unsigned plt_entry_size = 0;
1843
0
  unsigned int num_pltn_fres = 0;
1844
0
  unsigned int num_pltn_entries = 0;
1845
0
  const sframe_frame_row_entry * const *pltn_fres;
1846
1847
0
  bed = get_elf_backend_data (output_bfd);
1848
0
  htab = elf_x86_hash_table (info, bed->target_id);
1849
  /* Whether SFrame stack trace info for plt0 is to be generated.  */
1850
0
  switch (plt_sec_type)
1851
0
    {
1852
0
    case SFRAME_PLT:
1853
0
  {
1854
0
    ectx = &htab->plt_cfe_ctx;
1855
0
    dpltsec = htab->elf.splt;
1856
1857
0
    plt0_entry_size
1858
0
      = htab->plt.has_plt0 ? htab->sframe_plt->plt0_entry_size : 0;
1859
0
    plt_entry_size = htab->sframe_plt->pltn_entry_size;
1860
0
    pltn_fres = htab->sframe_plt->pltn_fres;
1861
0
    num_pltn_fres = htab->sframe_plt->pltn_num_fres;
1862
0
    num_pltn_entries
1863
0
      = (dpltsec->size - plt0_entry_size) / plt_entry_size;
1864
1865
0
    break;
1866
0
  }
1867
0
    case SFRAME_PLT_SEC:
1868
0
  {
1869
0
    ectx = &htab->plt_second_cfe_ctx;
1870
0
    dpltsec = htab->plt_second;
1871
1872
0
    plt0_entry_size = 0;
1873
1874
0
    plt_entry_size = htab->sframe_plt->sec_pltn_entry_size;
1875
0
    pltn_fres = htab->sframe_plt->sec_pltn_fres;
1876
0
    num_pltn_fres = htab->sframe_plt->sec_pltn_num_fres;
1877
0
    num_pltn_entries = dpltsec->size / plt_entry_size;
1878
1879
0
    break;
1880
0
  }
1881
0
      case SFRAME_PLT_GOT:
1882
0
  {
1883
0
    ectx = &htab->plt_got_cfe_ctx;
1884
0
    dpltsec = htab->plt_got;
1885
1886
0
    plt0_entry_size = 0;
1887
1888
0
    plt_entry_size = htab->sframe_plt->plt_got_entry_size;
1889
0
    pltn_fres = htab->sframe_plt->plt_got_fres;
1890
0
    num_pltn_fres = htab->sframe_plt->plt_got_num_fres;
1891
0
    num_pltn_entries = dpltsec->size / plt_entry_size;
1892
1893
0
    break;
1894
0
  }
1895
1896
0
    default:
1897
      /* No other value is possible.  */
1898
0
      return false;
1899
0
      break;
1900
0
    }
1901
1902
0
  *ectx = sframe_encode (SFRAME_VERSION_3,
1903
0
       SFRAME_F_FDE_FUNC_START_PCREL,
1904
0
       SFRAME_ABI_AMD64_ENDIAN_LITTLE,
1905
0
       SFRAME_CFA_FIXED_FP_INVALID,
1906
0
       -8, /*  Fixed RA offset.  */
1907
0
       &err);
1908
1909
  /* FRE type is dependent on the size of the function.  */
1910
0
  fre_type = sframe_calc_fre_type (dpltsec->size);
1911
0
  func_info = sframe_fde_create_func_info (fre_type, SFRAME_V3_FDE_PCTYPE_INC);
1912
1913
  /* Add SFrame FDE and the associated FREs for plt0 if plt0 has been
1914
     generated.  */
1915
0
  if (plt0_entry_size)
1916
0
    {
1917
      /* Add SFrame FDE for plt0, the function start address is updated later
1918
   at _bfd_elf_merge_section_sframe time.  */
1919
0
      sframe_encoder_add_funcdesc_v3 (*ectx,
1920
0
              0, /* func start addr.  */
1921
0
              plt0_entry_size,
1922
0
              func_info,
1923
0
              0, /* func_info2.  */
1924
0
              0,
1925
0
              0 /* Num FREs.  */);
1926
0
      sframe_frame_row_entry plt0_fre;
1927
0
      unsigned int num_plt0_fres = htab->sframe_plt->plt0_num_fres;
1928
0
      for (unsigned int j = 0; j < num_plt0_fres; j++)
1929
0
  {
1930
0
    plt0_fre = *(htab->sframe_plt->plt0_fres[j]);
1931
0
    sframe_encoder_add_fre (*ectx, 0, &plt0_fre);
1932
0
  }
1933
0
    }
1934
1935
1936
0
  if (num_pltn_entries)
1937
0
    {
1938
      /* pltn entries use an SFrame FDE of type
1939
   SFRAME_V3_FDE_PCTYPE_MASK to exploit the repetitive
1940
   pattern of the instructions in these entries.  Using this SFrame FDE
1941
   type helps in keeping the SFrame stack trace info for pltn entries
1942
   compact.  */
1943
0
      func_info = sframe_fde_create_func_info (fre_type,
1944
0
                 SFRAME_V3_FDE_PCTYPE_MASK);
1945
      /* Add the SFrame FDE for all PCs starting at the first pltn entry (hence,
1946
   function start address = plt0_entry_size.  As usual, this will be
1947
   updated later at _bfd_elf_merge_section_sframe, by when the
1948
   sections are relocated.  */
1949
0
      sframe_encoder_add_funcdesc_v3 (*ectx,
1950
0
              plt0_entry_size, /* func start addr.  */
1951
0
              dpltsec->size - plt0_entry_size,
1952
0
              func_info,
1953
0
              0, /* func_info2.  */
1954
0
              plt_entry_size,
1955
0
              0 /* Num FREs.  */);
1956
1957
0
      sframe_frame_row_entry pltn_fre;
1958
      /* Now add the FREs for pltn.  Simply adding the FREs suffices due
1959
   to the usage of SFRAME_V3_FDE_PCTYPE_MASK above.  */
1960
0
      for (unsigned int j = 0; j < num_pltn_fres; j++)
1961
0
  {
1962
0
    unsigned int func_idx = plt0_entry_size ? 1 : 0;
1963
0
    pltn_fre = *(pltn_fres[j]);
1964
0
    sframe_encoder_add_fre (*ectx, func_idx, &pltn_fre);
1965
0
  }
1966
0
    }
1967
1968
0
  return true;
1969
0
}
1970
1971
/* Put contents of the .sframe section corresponding to the specified
1972
   PLT_SEC_TYPE.  */
1973
1974
static bool
1975
_bfd_x86_elf_write_sframe_plt (bfd *output_bfd,
1976
             struct bfd_link_info *info,
1977
             unsigned int plt_sec_type)
1978
0
{
1979
0
  struct elf_x86_link_hash_table *htab;
1980
0
  elf_backend_data *bed;
1981
0
  sframe_encoder_ctx **ectx;
1982
0
  size_t sec_size;
1983
0
  asection *sec;
1984
0
  bfd *dynobj;
1985
1986
0
  int err = 0;
1987
1988
0
  bed = get_elf_backend_data (output_bfd);
1989
0
  htab = elf_x86_hash_table (info, bed->target_id);
1990
0
  dynobj = htab->elf.dynobj;
1991
1992
0
  switch (plt_sec_type)
1993
0
    {
1994
0
    case SFRAME_PLT:
1995
0
      ectx = &htab->plt_cfe_ctx;
1996
0
      sec = htab->plt_sframe;
1997
0
      break;
1998
0
    case SFRAME_PLT_SEC:
1999
0
      ectx = &htab->plt_second_cfe_ctx;
2000
0
      sec = htab->plt_second_sframe;
2001
0
      break;
2002
0
    case SFRAME_PLT_GOT:
2003
0
      ectx = &htab->plt_got_cfe_ctx;
2004
0
      sec = htab->plt_got_sframe;
2005
0
      break;
2006
0
    default:
2007
      /* No other value is possible.  */
2008
0
      return false;
2009
0
      break;
2010
0
    }
2011
2012
0
  BFD_ASSERT (*ectx);
2013
2014
0
  void *contents = sframe_encoder_write (*ectx, &sec_size, false, &err);
2015
2016
0
  sec->size = (bfd_size_type) sec_size;
2017
0
  sec->contents = (unsigned char *) bfd_zalloc (dynobj, sec->size);
2018
0
  sec->alloced = 1;
2019
0
  memcpy (sec->contents, contents, sec_size);
2020
2021
0
  sframe_encoder_free (ectx);
2022
2023
0
  return true;
2024
0
}
2025
2026
bool
2027
_bfd_elf_x86_size_relative_relocs (struct bfd_link_info *info,
2028
           bool *need_layout)
2029
0
{
2030
0
  struct elf_x86_link_hash_table *htab;
2031
0
  elf_backend_data *bed;
2032
0
  bool is_x86_64;
2033
0
  bfd_size_type i, count, unaligned_count;
2034
0
  asection *sec, *srel;
2035
2036
  /* Do nothing for ld -r.  */
2037
0
  if (bfd_link_relocatable (info))
2038
0
    return true;
2039
2040
0
  bed = get_elf_backend_data (info->output_bfd);
2041
0
  htab = elf_x86_hash_table (info, bed->target_id);
2042
0
  if (htab == NULL)
2043
0
    return false;
2044
2045
0
  count = htab->relative_reloc.count;
2046
0
  unaligned_count = htab->unaligned_relative_reloc.count;
2047
0
  if (count == 0)
2048
0
    {
2049
0
      if (htab->generate_relative_reloc_pass == 0
2050
0
    && htab->elf.srelrdyn != NULL)
2051
0
  {
2052
    /* Remove the empty .relr.dyn sections now.  */
2053
0
    if (!bfd_is_abs_section (htab->elf.srelrdyn->output_section))
2054
0
      {
2055
0
        bfd_section_list_remove
2056
0
    (info->output_bfd, htab->elf.srelrdyn->output_section);
2057
0
        info->output_bfd->section_count--;
2058
0
      }
2059
0
    bfd_section_list_remove (htab->elf.srelrdyn->owner,
2060
0
           htab->elf.srelrdyn);
2061
0
    htab->elf.srelrdyn->owner->section_count--;
2062
0
  }
2063
0
      if (unaligned_count == 0)
2064
0
  {
2065
0
    htab->generate_relative_reloc_pass++;
2066
0
    return true;
2067
0
  }
2068
0
    }
2069
2070
0
  is_x86_64 = bed->target_id == X86_64_ELF_DATA;
2071
2072
  /* Size relative relocations.  */
2073
0
  if (htab->generate_relative_reloc_pass)
2074
0
    {
2075
      /* Reset the regular relative relocation count.  */
2076
0
      for (i = 0; i < unaligned_count; i++)
2077
0
  {
2078
0
    sec = htab->unaligned_relative_reloc.data[i].sec;
2079
0
    srel = elf_section_data (sec)->sreloc;
2080
0
    srel->reloc_count = 0;
2081
0
  }
2082
0
    }
2083
0
  else
2084
0
    {
2085
      /* Remove the reserved space for compact relative relocations.  */
2086
0
      if (count)
2087
0
  {
2088
0
    asection *sgot = htab->elf.sgot;
2089
0
    asection *srelgot = htab->elf.srelgot;
2090
2091
0
    for (i = 0; i < count; i++)
2092
0
      {
2093
0
        sec = htab->relative_reloc.data[i].sec;
2094
0
        if (sec == sgot)
2095
0
    srel = srelgot;
2096
0
        else
2097
0
    srel = elf_section_data (sec)->sreloc;
2098
0
        srel->size -= htab->sizeof_reloc;
2099
0
      }
2100
0
  }
2101
0
    }
2102
2103
  /* Size unaligned relative relocations.  */
2104
0
  if (unaligned_count)
2105
0
    elf_x86_size_or_finish_relative_reloc (is_x86_64, info, htab,
2106
0
             true, NULL);
2107
2108
0
  if (count)
2109
0
    {
2110
0
      elf_x86_size_or_finish_relative_reloc (is_x86_64, info, htab,
2111
0
               false, NULL);
2112
2113
      /* Sort relative relocations by addresses.  We only need to
2114
   sort them in the first pass since the relative positions
2115
   won't change.  */
2116
0
      if (htab->generate_relative_reloc_pass == 0)
2117
0
  qsort (htab->relative_reloc.data, count,
2118
0
         sizeof (struct elf_x86_relative_reloc_record),
2119
0
         elf_x86_relative_reloc_compare);
2120
2121
0
      elf_x86_compute_dl_relr_bitmap (info, htab, need_layout);
2122
0
    }
2123
2124
0
  htab->generate_relative_reloc_pass++;
2125
2126
0
  return true;
2127
0
}
2128
2129
bool
2130
_bfd_elf_x86_finish_relative_relocs (struct bfd_link_info *info)
2131
0
{
2132
0
  struct elf_x86_link_hash_table *htab;
2133
0
  elf_backend_data *bed;
2134
0
  Elf_Internal_Rela outrel;
2135
0
  bool is_x86_64;
2136
0
  bfd_size_type count;
2137
2138
  /* Do nothing for ld -r.  */
2139
0
  if (bfd_link_relocatable (info))
2140
0
    return true;
2141
2142
0
  bed = get_elf_backend_data (info->output_bfd);
2143
0
  htab = elf_x86_hash_table (info, bed->target_id);
2144
0
  if (htab == NULL)
2145
0
    return false;
2146
2147
0
  is_x86_64 = bed->target_id == X86_64_ELF_DATA;
2148
2149
0
  outrel.r_info = htab->r_info (0, htab->relative_r_type);
2150
2151
0
  if (htab->unaligned_relative_reloc.count)
2152
0
    elf_x86_size_or_finish_relative_reloc (is_x86_64, info, htab,
2153
0
             true, &outrel);
2154
2155
0
  count = htab->relative_reloc.count;
2156
0
  if (count)
2157
0
    {
2158
0
      elf_x86_size_or_finish_relative_reloc (is_x86_64, info, htab,
2159
0
               false, &outrel);
2160
2161
0
      elf_x86_compute_dl_relr_bitmap (info, htab, NULL);
2162
2163
0
      elf_x86_write_dl_relr_bitmap (info, htab);
2164
0
    }
2165
2166
0
  return true;
2167
0
}
2168
2169
asection *
2170
_bfd_elf_x86_get_reloc_section (bfd *abfd, const char *name)
2171
39
{
2172
  /* Treat .rel.tls/.rela.tls section the same as .rel.plt/.rela.plt
2173
     section.  */
2174
39
  if (strcmp (name, ".tls") == 0)
2175
0
    name = ".plt";
2176
39
  return _bfd_elf_plt_get_reloc_section (abfd, name);
2177
39
}
2178
2179
bool
2180
_bfd_elf_x86_valid_reloc_p (asection *input_section,
2181
          struct bfd_link_info *info,
2182
          struct elf_x86_link_hash_table *htab,
2183
          const Elf_Internal_Rela *rel,
2184
          struct elf_link_hash_entry *h,
2185
          Elf_Internal_Sym *sym,
2186
          Elf_Internal_Shdr *symtab_hdr,
2187
          bool *no_dynreloc_p)
2188
0
{
2189
0
  bool valid_p = true;
2190
2191
0
  *no_dynreloc_p = false;
2192
2193
  /* Check If relocation against non-preemptible absolute symbol is
2194
     valid in PIC.  FIXME: Can't use SYMBOL_REFERENCES_LOCAL_P since
2195
     it may call _bfd_elf_link_hide_sym_by_version and result in
2196
     ld-elfvers/ vers21 test failure.  */
2197
0
  if (bfd_link_pic (info)
2198
0
      && (h == NULL || SYMBOL_REFERENCES_LOCAL (info, h)))
2199
0
    {
2200
0
      elf_backend_data *bed;
2201
0
      unsigned int r_type;
2202
0
      Elf_Internal_Rela irel;
2203
2204
      /* Skip non-absolute symbol.  */
2205
0
      if (h)
2206
0
  {
2207
0
    if (!ABS_SYMBOL_P (h))
2208
0
      return valid_p;
2209
0
  }
2210
0
      else if (sym->st_shndx != SHN_ABS)
2211
0
  return valid_p;
2212
2213
0
      bed = get_elf_backend_data (input_section->owner);
2214
0
      r_type = ELF32_R_TYPE (rel->r_info);
2215
0
      irel = *rel;
2216
2217
      /* Only allow relocations against absolute symbol, which can be
2218
   resolved as absolute value + addend.  GOTPCREL and GOT32
2219
   relocations are allowed since absolute value + addend is
2220
   stored in the GOT slot.  */
2221
0
      if (bed->target_id == X86_64_ELF_DATA)
2222
0
  {
2223
0
    r_type &= ~R_X86_64_converted_reloc_bit;
2224
0
    valid_p = (r_type == R_X86_64_64
2225
0
         || r_type == R_X86_64_32
2226
0
         || r_type == R_X86_64_32S
2227
0
         || r_type == R_X86_64_16
2228
0
         || r_type == R_X86_64_8
2229
0
         || r_type == R_X86_64_GOTPCREL
2230
0
         || r_type == R_X86_64_GOTPCRELX
2231
0
         || r_type == R_X86_64_REX_GOTPCRELX);
2232
0
    if (!valid_p)
2233
0
      {
2234
0
        unsigned int r_symndx = htab->r_sym (rel->r_info);
2235
0
        irel.r_info = htab->r_info (r_symndx, r_type);
2236
0
      }
2237
0
  }
2238
0
      else
2239
0
  valid_p = (r_type == R_386_32
2240
0
       || r_type == R_386_16
2241
0
       || r_type == R_386_8
2242
0
       || r_type == R_386_GOT32
2243
0
       || r_type == R_386_GOT32X);
2244
2245
0
      if (valid_p)
2246
0
  *no_dynreloc_p = true;
2247
0
      else
2248
0
  {
2249
0
    const char *name;
2250
0
    arelent internal_reloc;
2251
2252
0
    if (!bed->elf_info_to_howto (input_section->owner,
2253
0
               &internal_reloc, &irel)
2254
0
        || internal_reloc.howto == NULL)
2255
0
      abort ();
2256
2257
0
    if (h)
2258
0
      name = h->root.root.string;
2259
0
    else
2260
0
      name = bfd_elf_sym_name (input_section->owner, symtab_hdr,
2261
0
             sym, NULL);
2262
0
    info->callbacks->fatal
2263
      /* xgettext:c-format */
2264
0
      (_("%P: %pB: relocation %s against absolute symbol "
2265
0
         "`%s' in section `%pA' is disallowed\n"),
2266
0
       input_section->owner, internal_reloc.howto->name, name,
2267
0
       input_section);
2268
0
    bfd_set_error (bfd_error_bad_value);
2269
0
  }
2270
0
    }
2271
2272
0
  return valid_p;
2273
0
}
2274
2275
/* Set the sizes of the dynamic sections.  */
2276
2277
bool
2278
_bfd_x86_elf_late_size_sections (bfd *output_bfd,
2279
            struct bfd_link_info *info)
2280
0
{
2281
0
  struct elf_x86_link_hash_table *htab;
2282
0
  bfd *dynobj;
2283
0
  asection *s;
2284
0
  bool relocs;
2285
0
  bfd *ibfd;
2286
0
  elf_backend_data *bed = get_elf_backend_data (output_bfd);
2287
2288
0
  htab = elf_x86_hash_table (info, bed->target_id);
2289
0
  if (htab == NULL)
2290
0
    return false;
2291
0
  dynobj = htab->elf.dynobj;
2292
0
  if (dynobj == NULL)
2293
0
    return true;
2294
2295
  /* Set up .got offsets for local syms, and space for local dynamic
2296
     relocs.  */
2297
0
  for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
2298
0
    {
2299
0
      bfd_signed_vma *local_got;
2300
0
      bfd_signed_vma *end_local_got;
2301
0
      char *local_tls_type;
2302
0
      bfd_vma *local_tlsdesc_gotent;
2303
0
      bfd_size_type locsymcount;
2304
0
      Elf_Internal_Shdr *symtab_hdr;
2305
0
      asection *srel;
2306
2307
0
      if (! is_x86_elf (ibfd, htab))
2308
0
  continue;
2309
2310
0
      for (s = ibfd->sections; s != NULL; s = s->next)
2311
0
  {
2312
0
    struct elf_dyn_relocs *p;
2313
2314
0
    for (p = ((struct elf_dyn_relocs *)
2315
0
         elf_section_data (s)->local_dynrel);
2316
0
         p != NULL;
2317
0
         p = p->next)
2318
0
      {
2319
0
        if (!bfd_is_abs_section (p->sec)
2320
0
      && bfd_is_abs_section (p->sec->output_section))
2321
0
    {
2322
      /* Input section has been discarded, either because
2323
         it is a copy of a linkonce section or due to
2324
         linker script /DISCARD/, so we'll be discarding
2325
         the relocs too.  */
2326
0
    }
2327
0
        else if (htab->elf.target_os == is_vxworks
2328
0
           && strcmp (p->sec->output_section->name,
2329
0
          ".tls_vars") == 0)
2330
0
    {
2331
      /* Relocations in vxworks .tls_vars sections are
2332
         handled specially by the loader.  */
2333
0
    }
2334
0
        else if (p->count != 0)
2335
0
    {
2336
0
      srel = elf_section_data (p->sec)->sreloc;
2337
0
      srel->size += p->count * htab->sizeof_reloc;
2338
0
      if ((p->sec->output_section->flags & SEC_READONLY) != 0
2339
0
          && (info->flags & DF_TEXTREL) == 0)
2340
0
        {
2341
0
          info->flags |= DF_TEXTREL;
2342
0
          if (bfd_link_textrel_check (info))
2343
      /* xgettext:c-format */
2344
0
      info->callbacks->einfo
2345
0
        (_("%P: %pB: warning: relocation "
2346
0
           "in read-only section `%pA'\n"),
2347
0
         p->sec->owner, p->sec);
2348
0
        }
2349
0
    }
2350
0
      }
2351
0
  }
2352
2353
0
      local_got = elf_local_got_refcounts (ibfd);
2354
0
      if (!local_got)
2355
0
  continue;
2356
2357
0
      symtab_hdr = &elf_symtab_hdr (ibfd);
2358
0
      locsymcount = symtab_hdr->sh_info;
2359
0
      end_local_got = local_got + locsymcount;
2360
0
      local_tls_type = elf_x86_local_got_tls_type (ibfd);
2361
0
      local_tlsdesc_gotent = elf_x86_local_tlsdesc_gotent (ibfd);
2362
0
      s = htab->elf.sgot;
2363
0
      srel = htab->elf.srelgot;
2364
0
      for (; local_got < end_local_got;
2365
0
     ++local_got, ++local_tls_type, ++local_tlsdesc_gotent)
2366
0
  {
2367
0
    *local_tlsdesc_gotent = (bfd_vma) -1;
2368
0
    if (*local_got > 0)
2369
0
      {
2370
0
        if (GOT_TLS_GDESC_P (*local_tls_type))
2371
0
    {
2372
0
      *local_tlsdesc_gotent = htab->elf.sgotplt->size
2373
0
        - elf_x86_compute_jump_table_size (htab);
2374
0
      htab->elf.sgotplt->size += 2 * htab->got_entry_size;
2375
0
      *local_got = (bfd_vma) -2;
2376
0
    }
2377
0
        if (! GOT_TLS_GDESC_P (*local_tls_type)
2378
0
      || GOT_TLS_GD_P (*local_tls_type))
2379
0
    {
2380
0
      *local_got = s->size;
2381
0
      s->size += htab->got_entry_size;
2382
0
      if (GOT_TLS_GD_P (*local_tls_type)
2383
0
          || *local_tls_type == GOT_TLS_IE_BOTH)
2384
0
        s->size += htab->got_entry_size;
2385
0
    }
2386
0
        if ((bfd_link_pic (info) && *local_tls_type != GOT_ABS)
2387
0
      || GOT_TLS_GD_ANY_P (*local_tls_type)
2388
0
      || (*local_tls_type & GOT_TLS_IE))
2389
0
    {
2390
0
      if (*local_tls_type == GOT_TLS_IE_BOTH)
2391
0
        srel->size += 2 * htab->sizeof_reloc;
2392
0
      else if (GOT_TLS_GD_P (*local_tls_type)
2393
0
         || ! GOT_TLS_GDESC_P (*local_tls_type))
2394
0
        srel->size += htab->sizeof_reloc;
2395
0
      if (GOT_TLS_GDESC_P (*local_tls_type))
2396
0
        {
2397
0
          htab->rel_tls_desc->size += htab->sizeof_reloc;
2398
0
          if (bed->target_id == X86_64_ELF_DATA)
2399
0
      htab->elf.tlsdesc_plt = (bfd_vma) -1;
2400
0
        }
2401
0
    }
2402
0
      }
2403
0
    else
2404
0
      *local_got = (bfd_vma) -1;
2405
0
  }
2406
0
    }
2407
2408
0
  if (htab->tls_ld_or_ldm_got.refcount > 0)
2409
0
    {
2410
      /* Allocate 2 got entries and 1 dynamic reloc for R_386_TLS_LDM
2411
   or R_X86_64_TLSLD relocs.  */
2412
0
      htab->tls_ld_or_ldm_got.offset = htab->elf.sgot->size;
2413
0
      htab->elf.sgot->size += 2 * htab->got_entry_size;
2414
0
      htab->elf.srelgot->size += htab->sizeof_reloc;
2415
0
    }
2416
0
  else
2417
0
    htab->tls_ld_or_ldm_got.offset = -1;
2418
2419
  /* Allocate global sym .plt and .got entries, and space for global
2420
     sym dynamic relocs.  */
2421
0
  elf_link_hash_traverse (&htab->elf, elf_x86_allocate_dynrelocs,
2422
0
        info);
2423
2424
  /* Allocate .plt and .got entries, and space for local symbols if
2425
     needed.  */
2426
0
  if (htab->has_loc_hash_table)
2427
0
    htab_traverse (htab->loc_hash_table, elf_x86_allocate_local_dynreloc,
2428
0
       info);
2429
2430
  /* For every jump slot reserved in the sgotplt, reloc_count is
2431
     incremented.  However, when we reserve space for TLS descriptors,
2432
     it's not incremented, so in order to compute the space reserved
2433
     for them, it suffices to multiply the reloc count by the jump
2434
     slot size.
2435
2436
     PR ld/13302: We start next_irelative_index at the end of .rela.plt
2437
     so that R_{386,X86_64}_IRELATIVE entries come last.  */
2438
0
  if (htab->elf.srelplt)
2439
0
    {
2440
0
      htab->sgotplt_jump_table_size
2441
0
  = elf_x86_compute_jump_table_size (htab);
2442
0
      htab->next_irelative_index = htab->elf.srelplt->reloc_count - 1;
2443
0
    }
2444
0
  else if (htab->elf.irelplt)
2445
0
    htab->next_irelative_index = htab->elf.irelplt->reloc_count - 1;
2446
2447
0
  if (htab->elf.tlsdesc_plt)
2448
0
    {
2449
      /* NB: tlsdesc_plt is set only for x86-64.  If we're not using
2450
   lazy TLS relocations, don't generate the PLT and GOT entries
2451
   they require.  */
2452
0
      if ((info->flags & DF_BIND_NOW))
2453
0
  htab->elf.tlsdesc_plt = 0;
2454
0
      else
2455
0
  {
2456
0
    htab->elf.tlsdesc_got = htab->elf.sgot->size;
2457
0
    htab->elf.sgot->size += htab->got_entry_size;
2458
    /* Reserve room for the initial entry.
2459
       FIXME: we could probably do away with it in this case.  */
2460
0
    if (htab->elf.splt->size == 0)
2461
0
      htab->elf.splt->size = htab->plt.plt_entry_size;
2462
0
    htab->elf.tlsdesc_plt = htab->elf.splt->size;
2463
0
    htab->elf.splt->size += htab->plt.plt_entry_size;
2464
0
  }
2465
0
    }
2466
2467
0
  if (htab->elf.sgotplt)
2468
0
    {
2469
0
      asection *eh_frame;
2470
2471
      /* Don't allocate .got.plt section if there are no GOT nor PLT
2472
   entries and there is no reference to _GLOBAL_OFFSET_TABLE_.  */
2473
0
      if ((htab->elf.hgot == NULL
2474
0
     || !htab->got_referenced)
2475
0
    && (htab->elf.sgotplt->size == bed->got_header_size)
2476
0
    && (htab->elf.splt == NULL
2477
0
        || htab->elf.splt->size == 0)
2478
0
    && (htab->elf.sgot == NULL
2479
0
        || htab->elf.sgot->size == 0)
2480
0
    && (htab->elf.iplt == NULL
2481
0
        || htab->elf.iplt->size == 0)
2482
0
    && (htab->elf.igotplt == NULL
2483
0
        || htab->elf.igotplt->size == 0)
2484
0
    && (!htab->elf.dynamic_sections_created
2485
0
        || (eh_frame = bfd_get_section_by_name (output_bfd,
2486
0
                  ".eh_frame")) == NULL
2487
0
        || eh_frame->rawsize == 0))
2488
0
  {
2489
0
    htab->elf.sgotplt->size = 0;
2490
    /* Solaris requires to keep _GLOBAL_OFFSET_TABLE_ even if it
2491
       isn't used.  */
2492
0
    if (htab->elf.hgot != NULL
2493
0
        && htab->elf.target_os != is_solaris)
2494
0
      {
2495
        /* Remove the unused _GLOBAL_OFFSET_TABLE_ from symbol
2496
     table. */
2497
0
        htab->elf.hgot->root.type = bfd_link_hash_undefined;
2498
0
        htab->elf.hgot->root.u.undef.abfd
2499
0
    = htab->elf.hgot->root.u.def.section->owner;
2500
0
        htab->elf.hgot->root.linker_def = 0;
2501
0
        htab->elf.hgot->ref_regular = 0;
2502
0
        htab->elf.hgot->def_regular = 0;
2503
0
      }
2504
0
  }
2505
0
    }
2506
2507
0
  if (_bfd_elf_eh_frame_present (info))
2508
0
    {
2509
0
      if (htab->plt_eh_frame != NULL
2510
0
    && htab->elf.splt != NULL
2511
0
    && htab->elf.splt->size != 0
2512
0
    && !bfd_is_abs_section (htab->elf.splt->output_section))
2513
0
  htab->plt_eh_frame->size = htab->plt.eh_frame_plt_size;
2514
2515
0
      if (htab->plt_got_eh_frame != NULL
2516
0
    && htab->plt_got != NULL
2517
0
    && htab->plt_got->size != 0
2518
0
    && !bfd_is_abs_section (htab->plt_got->output_section))
2519
0
  htab->plt_got_eh_frame->size
2520
0
    = htab->non_lazy_plt->eh_frame_plt_size;
2521
2522
      /* Unwind info for the second PLT and .plt.got sections are
2523
   identical.  */
2524
0
      if (htab->plt_second_eh_frame != NULL
2525
0
    && htab->plt_second != NULL
2526
0
    && htab->plt_second->size != 0
2527
0
    && !bfd_is_abs_section (htab->plt_second->output_section))
2528
0
  htab->plt_second_eh_frame->size
2529
0
    = htab->non_lazy_plt->eh_frame_plt_size;
2530
0
    }
2531
2532
  /* No need to size the .sframe section explicitly because the write-out
2533
     mechanism is different.  Simply prep up the FDE/FRE for the
2534
     .plt section.  */
2535
0
  if (_bfd_elf_sframe_present (info))
2536
0
    {
2537
0
      if (htab->plt_sframe != NULL
2538
0
    && htab->elf.splt != NULL
2539
0
    && htab->elf.splt->size != 0
2540
0
    && !bfd_is_abs_section (htab->elf.splt->output_section))
2541
0
  {
2542
0
    _bfd_x86_elf_create_sframe_plt (output_bfd, info, SFRAME_PLT);
2543
    /* FIXME - Dirty Hack.  Set the size to something non-zero for now,
2544
       so that the section does not get stripped out below.  The precise
2545
       size of this section is known only when the contents are
2546
       serialized in _bfd_x86_elf_write_sframe_plt.  */
2547
0
    htab->plt_sframe->size = sizeof (sframe_header) + 1;
2548
0
  }
2549
2550
0
      if (htab->plt_got_sframe != NULL
2551
0
    && htab->plt_got != NULL
2552
0
    && htab->plt_got->size != 0
2553
0
    && !bfd_is_abs_section (htab->plt_got->output_section))
2554
0
  {
2555
0
    _bfd_x86_elf_create_sframe_plt (output_bfd, info, SFRAME_PLT_GOT);
2556
    /* FIXME - Dirty Hack.  Set the size to something non-zero for now,
2557
       so that the section does not get stripped out below.  The precise
2558
       size of this section is known only when the contents are
2559
       serialized in _bfd_x86_elf_write_sframe_plt.  */
2560
0
    htab->plt_got_sframe->size = sizeof (sframe_header) + 1;
2561
0
  }
2562
2563
0
      if (htab->plt_second_sframe != NULL
2564
0
    && htab->plt_second != NULL
2565
0
    && htab->plt_second->size != 0
2566
0
    && !bfd_is_abs_section (htab->plt_second->output_section))
2567
0
  {
2568
    /* SFrame stack trace info for the second PLT.  */
2569
0
    _bfd_x86_elf_create_sframe_plt (output_bfd, info, SFRAME_PLT_SEC);
2570
    /* FIXME - Dirty Hack.  Set the size to something non-zero for now,
2571
       so that the section does not get stripped out below.  The precise
2572
       size of this section is known only when the contents are
2573
       serialized in _bfd_x86_elf_write_sframe_plt.  */
2574
0
    htab->plt_second_sframe->size = sizeof (sframe_header) + 1;
2575
0
  }
2576
0
    }
2577
2578
0
  asection *resolved_plt = NULL;
2579
2580
0
  if (htab->params->mark_plt && htab->elf.dynamic_sections_created)
2581
0
    {
2582
0
      if (htab->plt_second != NULL)
2583
0
  resolved_plt = htab->plt_second;
2584
0
      else
2585
0
  resolved_plt = htab->elf.splt;
2586
2587
0
      if (resolved_plt != NULL && resolved_plt->size == 0)
2588
0
  resolved_plt = NULL;
2589
0
    }
2590
2591
  /* We now have determined the sizes of the various dynamic sections.
2592
     Allocate memory for them.  */
2593
0
  relocs = false;
2594
0
  for (s = dynobj->sections; s != NULL; s = s->next)
2595
0
    {
2596
0
      bool strip_section = true;
2597
2598
0
      if ((s->flags & SEC_LINKER_CREATED) == 0)
2599
0
  continue;
2600
2601
      /* The .relr.dyn section for compact relative relocation will
2602
   be filled later.  */
2603
0
      if (s == htab->elf.srelrdyn)
2604
0
  continue;
2605
2606
0
      if (s == htab->elf.splt
2607
0
    || s == htab->elf.sgot)
2608
0
  {
2609
    /* Strip this section if we don't need it; see the
2610
       comment below.  */
2611
    /* We'd like to strip these sections if they aren't needed, but if
2612
       we've exported dynamic symbols from them we must leave them.
2613
       It's too late to tell BFD to get rid of the symbols.  */
2614
2615
0
    if (htab->elf.hplt != NULL)
2616
0
      strip_section = false;
2617
0
  }
2618
0
      else if (s == htab->elf.sgotplt
2619
0
         || s == htab->elf.iplt
2620
0
         || s == htab->elf.igotplt
2621
0
         || s == htab->plt_second
2622
0
         || s == htab->plt_got
2623
0
         || s == htab->plt_eh_frame
2624
0
         || s == htab->plt_got_eh_frame
2625
0
         || s == htab->plt_second_eh_frame
2626
0
         || s == htab->plt_sframe
2627
0
         || s == htab->plt_second_sframe
2628
0
         || s == htab->plt_got_sframe
2629
0
         || s == htab->elf.sdynbss
2630
0
         || s == htab->elf.sdynrelro)
2631
0
  {
2632
    /* Strip these too.  */
2633
0
  }
2634
0
      else if (htab->is_reloc_section (bfd_section_name (s)))
2635
0
  {
2636
0
    if (s->size != 0
2637
0
        && s != htab->elf.srelplt
2638
0
        && s != htab->srelplt2)
2639
0
      relocs = true;
2640
2641
    /* We use the reloc_count field as a counter if we need
2642
       to copy relocs into the output file.  */
2643
0
    if (s != htab->elf.srelplt)
2644
0
      s->reloc_count = 0;
2645
0
  }
2646
0
      else
2647
0
  {
2648
    /* It's not one of our sections, so don't allocate space.  */
2649
0
    continue;
2650
0
  }
2651
2652
0
      if (s->size == 0)
2653
0
  {
2654
    /* If we don't need this section, strip it from the
2655
       output file.  This is mostly to handle .rel.bss and
2656
       .rel.plt.  We must create both sections in
2657
       create_dynamic_sections, because they must be created
2658
       before the linker maps input sections to output
2659
       sections.  The linker does that before
2660
       adjust_dynamic_symbol is called, and it is that
2661
       function which decides whether anything needs to go
2662
       into these sections.  */
2663
0
    if (strip_section)
2664
0
      s->flags |= SEC_EXCLUDE;
2665
0
    continue;
2666
0
  }
2667
2668
0
      if ((s->flags & SEC_HAS_CONTENTS) == 0)
2669
0
  continue;
2670
2671
      /* Skip allocating contents for .sframe section as it is written
2672
   out differently.  See below.  */
2673
0
      if ((s == htab->plt_sframe) || (s == htab->plt_second_sframe)
2674
0
    || (s == htab->plt_got_sframe))
2675
0
  continue;
2676
2677
      /* NB: Initially, the iplt section has minimal alignment to
2678
   avoid moving dot of the following section backwards when
2679
   it is empty.  Update its section alignment now since it
2680
   is non-empty.  */
2681
0
      if (s == htab->elf.iplt
2682
0
    && !bfd_link_align_section (s, htab->plt.iplt_alignment))
2683
0
  abort ();
2684
2685
      /* Allocate memory for the section contents.  We use bfd_zalloc
2686
   here in case unused entries are not reclaimed before the
2687
   section's contents are written out.  This should not happen,
2688
   but this way if it does, we get a R_386_NONE or R_X86_64_NONE
2689
   reloc instead of garbage.  */
2690
0
      s->contents = (unsigned char *) bfd_zalloc (dynobj, s->size);
2691
0
      if (s->contents == NULL)
2692
0
  return false;
2693
0
      s->alloced = 1;
2694
0
    }
2695
2696
0
  if (htab->plt_eh_frame != NULL
2697
0
      && htab->plt_eh_frame->contents != NULL)
2698
0
    {
2699
0
      memcpy (htab->plt_eh_frame->contents,
2700
0
        htab->plt.eh_frame_plt,
2701
0
        htab->plt_eh_frame->size);
2702
0
      bfd_put_32 (dynobj, htab->elf.splt->size,
2703
0
      htab->plt_eh_frame->contents + PLT_FDE_LEN_OFFSET);
2704
0
    }
2705
2706
0
  if (htab->plt_got_eh_frame != NULL
2707
0
      && htab->plt_got_eh_frame->contents != NULL)
2708
0
    {
2709
0
      memcpy (htab->plt_got_eh_frame->contents,
2710
0
        htab->non_lazy_plt->eh_frame_plt,
2711
0
        htab->plt_got_eh_frame->size);
2712
0
      bfd_put_32 (dynobj, htab->plt_got->size,
2713
0
      (htab->plt_got_eh_frame->contents
2714
0
       + PLT_FDE_LEN_OFFSET));
2715
0
    }
2716
2717
0
  if (htab->plt_second_eh_frame != NULL
2718
0
      && htab->plt_second_eh_frame->contents != NULL)
2719
0
    {
2720
0
      memcpy (htab->plt_second_eh_frame->contents,
2721
0
        htab->non_lazy_plt->eh_frame_plt,
2722
0
        htab->plt_second_eh_frame->size);
2723
0
      bfd_put_32 (dynobj, htab->plt_second->size,
2724
0
      (htab->plt_second_eh_frame->contents
2725
0
       + PLT_FDE_LEN_OFFSET));
2726
0
    }
2727
2728
0
  if (_bfd_elf_sframe_present (info))
2729
0
    {
2730
0
      if (htab->plt_sframe != NULL
2731
0
    && htab->elf.splt != NULL
2732
0
    && htab->elf.splt->size != 0
2733
0
    && htab->plt_sframe->contents == NULL)
2734
0
  _bfd_x86_elf_write_sframe_plt (output_bfd, info, SFRAME_PLT);
2735
2736
0
      if (htab->plt_second_sframe != NULL
2737
0
    && htab->plt_second != NULL
2738
0
    && htab->plt_second->size != 0
2739
0
    && htab->plt_second_sframe->contents == NULL)
2740
0
  _bfd_x86_elf_write_sframe_plt (output_bfd, info, SFRAME_PLT_SEC);
2741
2742
0
      if (htab->plt_got_sframe != NULL
2743
0
    && htab->plt_got != NULL
2744
0
    && htab->plt_got->size != 0
2745
0
    && htab->plt_got_sframe->contents == NULL)
2746
0
  _bfd_x86_elf_write_sframe_plt (output_bfd, info, SFRAME_PLT_GOT);
2747
0
    }
2748
2749
0
  if (resolved_plt != NULL
2750
0
      && (!_bfd_elf_add_dynamic_entry (info, DT_X86_64_PLT, 0)
2751
0
    || !_bfd_elf_add_dynamic_entry (info, DT_X86_64_PLTSZ, 0)
2752
0
    || !_bfd_elf_add_dynamic_entry (info, DT_X86_64_PLTENT, 0)))
2753
0
    return false;
2754
2755
0
  return _bfd_elf_maybe_vxworks_add_dynamic_tags (output_bfd, info,
2756
0
              relocs);
2757
0
}
2758
2759
/* Finish up the x86 dynamic sections.  */
2760
2761
struct elf_x86_link_hash_table *
2762
_bfd_x86_elf_finish_dynamic_sections (bfd *output_bfd,
2763
              struct bfd_link_info *info,
2764
              bfd_byte *buf)
2765
0
{
2766
0
  struct elf_x86_link_hash_table *htab;
2767
0
  elf_backend_data *bed;
2768
0
  bfd *dynobj;
2769
0
  asection *sdyn;
2770
0
  bfd_byte *dyncon, *dynconend;
2771
0
  bfd_size_type sizeof_dyn;
2772
2773
0
  bed = get_elf_backend_data (output_bfd);
2774
0
  htab = elf_x86_hash_table (info, bed->target_id);
2775
0
  if (htab == NULL)
2776
0
    return htab;
2777
2778
0
  dynobj = htab->elf.dynobj;
2779
0
  sdyn = htab->elf.dynamic;
2780
2781
  /* GOT is always created in setup_gnu_properties.  But it may not be
2782
     needed.  .got.plt section may be needed for static IFUNC.  */
2783
0
  if (htab->elf.sgotplt && htab->elf.sgotplt->size > 0)
2784
0
    {
2785
0
      bfd_vma dynamic_addr;
2786
2787
0
      if (bfd_is_abs_section (htab->elf.sgotplt->output_section))
2788
0
  {
2789
0
    _bfd_error_handler
2790
0
      (_("discarded output section: `%pA'"), htab->elf.sgotplt);
2791
0
    return NULL;
2792
0
  }
2793
2794
0
      elf_section_data (htab->elf.sgotplt->output_section)->this_hdr.sh_entsize
2795
0
  = htab->got_entry_size;
2796
2797
0
      dynamic_addr = (sdyn == NULL
2798
0
          ? (bfd_vma) 0
2799
0
          : sdyn->output_section->vma + sdyn->output_offset);
2800
2801
      /* Set the first entry in the global offset table to the address
2802
   of the dynamic section.  Write GOT[1] and GOT[2], needed for
2803
   the dynamic linker.  */
2804
0
      if (htab->got_entry_size == 8)
2805
0
  {
2806
0
    bfd_put_64 (output_bfd, dynamic_addr,
2807
0
          htab->elf.sgotplt->contents);
2808
0
    bfd_put_64 (output_bfd, (bfd_vma) 0,
2809
0
          htab->elf.sgotplt->contents + 8);
2810
0
    bfd_put_64 (output_bfd, (bfd_vma) 0,
2811
0
          htab->elf.sgotplt->contents + 8*2);
2812
0
  }
2813
0
      else
2814
0
  {
2815
0
    bfd_put_32 (output_bfd, dynamic_addr,
2816
0
          htab->elf.sgotplt->contents);
2817
0
    bfd_put_32 (output_bfd, 0,
2818
0
          htab->elf.sgotplt->contents + 4);
2819
0
    bfd_put_32 (output_bfd, 0,
2820
0
          htab->elf.sgotplt->contents + 4*2);
2821
0
  }
2822
0
    }
2823
2824
0
  if (!htab->elf.dynamic_sections_created)
2825
0
    return htab;
2826
2827
0
  if (sdyn == NULL || htab->elf.sgot == NULL)
2828
0
    abort ();
2829
2830
0
  asection *resolved_plt;
2831
0
  if (htab->plt_second != NULL)
2832
0
    resolved_plt = htab->plt_second;
2833
0
  else
2834
0
    resolved_plt = htab->elf.splt;
2835
2836
0
  sizeof_dyn = bed->s->sizeof_dyn;
2837
0
  dyncon = sdyn->contents;
2838
0
  dynconend = sdyn->contents + sdyn->size;
2839
0
  for (; dyncon < dynconend; dyncon += sizeof_dyn)
2840
0
    {
2841
0
      Elf_Internal_Dyn dyn;
2842
0
      asection *s;
2843
2844
0
      (*bed->s->swap_dyn_in) (dynobj, dyncon, &dyn);
2845
2846
0
      switch (dyn.d_tag)
2847
0
  {
2848
0
  default:
2849
0
#ifdef OBJ_MAYBE_ELF_VXWORKS
2850
0
    if (htab->elf.target_os == is_vxworks
2851
0
        && elf_vxworks_finish_dynamic_entry (output_bfd, &dyn))
2852
0
      break;
2853
0
#endif /* OBJ_MAYBE_ELF_VXWORKS */
2854
0
    continue;
2855
2856
0
  case DT_PLTGOT:
2857
0
    s = htab->elf.sgotplt;
2858
0
    dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
2859
0
    break;
2860
2861
0
  case DT_JMPREL:
2862
0
    s = htab->elf.srelplt;
2863
0
    dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
2864
0
    break;
2865
2866
0
  case DT_PLTRELSZ:
2867
0
    s = htab->elf.srelplt;
2868
0
    dyn.d_un.d_val = s->size;
2869
0
    break;
2870
2871
0
  case DT_TLSDESC_PLT:
2872
0
    s = htab->elf.splt;
2873
0
    dyn.d_un.d_ptr = s->output_section->vma + s->output_offset
2874
0
      + htab->elf.tlsdesc_plt;
2875
0
    break;
2876
2877
0
  case DT_TLSDESC_GOT:
2878
0
    s = htab->elf.sgot;
2879
0
    dyn.d_un.d_ptr = s->output_section->vma + s->output_offset
2880
0
      + htab->elf.tlsdesc_got;
2881
0
    break;
2882
2883
0
  case DT_X86_64_PLT:
2884
0
    s = resolved_plt->output_section;
2885
0
    dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
2886
0
    break;
2887
2888
0
  case DT_X86_64_PLTSZ:
2889
0
    dyn.d_un.d_val = resolved_plt->size;
2890
0
    break;
2891
2892
0
  case DT_X86_64_PLTENT:
2893
0
    dyn.d_un.d_ptr = htab->plt.plt_entry_size;
2894
0
    break;
2895
0
  }
2896
2897
0
      (*bed->s->swap_dyn_out) (output_bfd, &dyn, dyncon);
2898
0
    }
2899
2900
0
  if (htab->plt_got != NULL && htab->plt_got->size > 0)
2901
0
    elf_section_data (htab->plt_got->output_section)
2902
0
      ->this_hdr.sh_entsize = htab->non_lazy_plt->plt_entry_size;
2903
2904
0
  if (htab->plt_second != NULL && htab->plt_second->size > 0)
2905
0
    elf_section_data (htab->plt_second->output_section)
2906
0
      ->this_hdr.sh_entsize = htab->non_lazy_plt->plt_entry_size;
2907
2908
  /* Adjust .eh_frame for .plt section.  */
2909
0
  if (htab->plt_eh_frame != NULL
2910
0
      && htab->plt_eh_frame->contents != NULL)
2911
0
    {
2912
0
      if (htab->elf.splt != NULL
2913
0
    && htab->elf.splt->size != 0
2914
0
    && (htab->elf.splt->flags & SEC_EXCLUDE) == 0
2915
0
    && htab->elf.splt->output_section != NULL
2916
0
    && htab->plt_eh_frame->output_section != NULL)
2917
0
  {
2918
0
    bfd_vma plt_start = htab->elf.splt->output_section->vma;
2919
0
    bfd_vma eh_frame_start = htab->plt_eh_frame->output_section->vma
2920
0
           + htab->plt_eh_frame->output_offset
2921
0
           + PLT_FDE_START_OFFSET;
2922
0
    bfd_put_signed_32 (dynobj, plt_start - eh_frame_start,
2923
0
           htab->plt_eh_frame->contents
2924
0
           + PLT_FDE_START_OFFSET);
2925
0
  }
2926
2927
0
      if (htab->plt_eh_frame->sec_info_type == SEC_INFO_TYPE_EH_FRAME
2928
0
    && !_bfd_elf_write_linker_section_eh_frame (output_bfd, info,
2929
0
                  htab->plt_eh_frame, buf))
2930
0
  return NULL;
2931
0
    }
2932
2933
  /* Adjust .eh_frame for .plt.got section.  */
2934
0
  if (htab->plt_got_eh_frame != NULL
2935
0
      && htab->plt_got_eh_frame->contents != NULL)
2936
0
    {
2937
0
      if (htab->plt_got != NULL
2938
0
    && htab->plt_got->size != 0
2939
0
    && (htab->plt_got->flags & SEC_EXCLUDE) == 0
2940
0
    && htab->plt_got->output_section != NULL
2941
0
    && htab->plt_got_eh_frame->output_section != NULL)
2942
0
  {
2943
0
    bfd_vma plt_start = htab->plt_got->output_section->vma;
2944
0
    bfd_vma eh_frame_start = htab->plt_got_eh_frame->output_section->vma
2945
0
           + htab->plt_got_eh_frame->output_offset
2946
0
           + PLT_FDE_START_OFFSET;
2947
0
    bfd_put_signed_32 (dynobj, plt_start - eh_frame_start,
2948
0
           htab->plt_got_eh_frame->contents
2949
0
           + PLT_FDE_START_OFFSET);
2950
0
  }
2951
0
      if (htab->plt_got_eh_frame->sec_info_type == SEC_INFO_TYPE_EH_FRAME
2952
0
    && !_bfd_elf_write_linker_section_eh_frame (output_bfd, info,
2953
0
                  htab->plt_got_eh_frame,
2954
0
                  buf))
2955
0
  return NULL;
2956
0
    }
2957
2958
  /* Adjust .eh_frame for the second PLT section.  */
2959
0
  if (htab->plt_second_eh_frame != NULL
2960
0
      && htab->plt_second_eh_frame->contents != NULL)
2961
0
    {
2962
0
      if (htab->plt_second != NULL
2963
0
    && htab->plt_second->size != 0
2964
0
    && (htab->plt_second->flags & SEC_EXCLUDE) == 0
2965
0
    && htab->plt_second->output_section != NULL
2966
0
    && htab->plt_second_eh_frame->output_section != NULL)
2967
0
  {
2968
0
    bfd_vma plt_start = htab->plt_second->output_section->vma;
2969
0
    bfd_vma eh_frame_start
2970
0
      = (htab->plt_second_eh_frame->output_section->vma
2971
0
         + htab->plt_second_eh_frame->output_offset
2972
0
         + PLT_FDE_START_OFFSET);
2973
0
    bfd_put_signed_32 (dynobj, plt_start - eh_frame_start,
2974
0
           htab->plt_second_eh_frame->contents
2975
0
           + PLT_FDE_START_OFFSET);
2976
0
  }
2977
0
      if (htab->plt_second_eh_frame->sec_info_type == SEC_INFO_TYPE_EH_FRAME
2978
0
    && !_bfd_elf_write_linker_section_eh_frame (output_bfd, info,
2979
0
                  htab->plt_second_eh_frame,
2980
0
                  buf))
2981
0
  return NULL;
2982
0
    }
2983
2984
  /* Make any adjustment if necessary and merge .sframe section to
2985
     create the final .sframe section for output_bfd.  */
2986
0
  if (htab->plt_sframe != NULL
2987
0
      && htab->plt_sframe->contents != NULL)
2988
0
    {
2989
0
      if (htab->elf.splt != NULL
2990
0
    && htab->elf.splt->size != 0
2991
0
    && (htab->elf.splt->flags & SEC_EXCLUDE) == 0
2992
0
    && htab->elf.splt->output_section != NULL
2993
0
    && htab->plt_sframe->output_section != NULL)
2994
0
  {
2995
0
    bfd_vma plt_start = htab->elf.splt->output_section->vma;
2996
0
    bfd_vma sframe_start = htab->plt_sframe->output_section->vma
2997
0
           + htab->plt_sframe->output_offset
2998
0
           + PLT_SFRAME_FDE_START_OFFSET;
2999
#if 0 /* FIXME Testing only. Remove before review.  */
3000
    bfd_vma test_value = (plt_start - sframe_start)
3001
      + htab->plt_sframe->output_section->vma
3002
      + htab->plt_sframe->output_offset
3003
      + PLT_SFRAME_FDE_START_OFFSET;
3004
    bfd_put_signed_32 (dynobj, test_value,
3005
#endif
3006
0
    bfd_put_signed_64 (dynobj, plt_start - sframe_start,
3007
0
           htab->plt_sframe->contents
3008
0
           + PLT_SFRAME_FDE_START_OFFSET);
3009
0
  }
3010
0
      if (htab->plt_sframe->sec_info_type == SEC_INFO_TYPE_SFRAME)
3011
0
  {
3012
0
    if (! _bfd_elf_merge_section_sframe (output_bfd, info,
3013
0
                 htab->plt_sframe,
3014
0
                 htab->plt_sframe->contents))
3015
0
      return NULL;
3016
0
  }
3017
0
    }
3018
3019
0
  if (htab->plt_second_sframe != NULL
3020
0
      && htab->plt_second_sframe->contents != NULL)
3021
0
    {
3022
0
      if (htab->plt_second != NULL
3023
0
    && htab->plt_second->size != 0
3024
0
    && (htab->plt_second->flags & SEC_EXCLUDE) == 0
3025
0
    && htab->plt_second->output_section != NULL
3026
0
    && htab->plt_second_sframe->output_section != NULL)
3027
0
  {
3028
0
    bfd_vma plt_start = htab->plt_second->output_section->vma;
3029
0
    bfd_vma sframe_start
3030
0
      = (htab->plt_second_sframe->output_section->vma
3031
0
         + htab->plt_second_sframe->output_offset
3032
0
         + PLT_SFRAME_FDE_START_OFFSET);
3033
#if 0 /* FIXME Testing only. Remove before review.  */
3034
    bfd_vma test_value = (plt_start - sframe_start)
3035
      + htab->plt_second_sframe->output_section->vma
3036
      + htab->plt_second_sframe->output_offset
3037
      + PLT_SFRAME_FDE_START_OFFSET;
3038
    bfd_put_signed_32 (dynobj, test_value,
3039
#endif
3040
0
    bfd_put_signed_64 (dynobj, plt_start - sframe_start,
3041
0
           htab->plt_second_sframe->contents
3042
0
           + PLT_SFRAME_FDE_START_OFFSET);
3043
0
  }
3044
0
      if (htab->plt_second_sframe->sec_info_type == SEC_INFO_TYPE_SFRAME)
3045
0
  {
3046
0
    if (! _bfd_elf_merge_section_sframe (output_bfd, info,
3047
0
                 htab->plt_second_sframe,
3048
0
                 htab->plt_second_sframe->contents))
3049
0
      return NULL;
3050
0
  }
3051
0
    }
3052
3053
0
  if (htab->plt_got_sframe != NULL
3054
0
      && htab->plt_got_sframe->contents != NULL)
3055
0
    {
3056
0
      if (htab->plt_got != NULL
3057
0
    && htab->plt_got->size != 0
3058
0
    && (htab->plt_got->flags & SEC_EXCLUDE) == 0
3059
0
    && htab->plt_got->output_section != NULL
3060
0
    && htab->plt_got_sframe->output_section != NULL)
3061
0
  {
3062
0
    bfd_vma plt_start = htab->plt_got->output_section->vma;
3063
0
    bfd_vma sframe_start
3064
0
      = (htab->plt_got_sframe->output_section->vma
3065
0
         + htab->plt_got_sframe->output_offset
3066
0
         + PLT_SFRAME_FDE_START_OFFSET);
3067
0
    bfd_put_signed_64 (dynobj, plt_start - sframe_start,
3068
0
           htab->plt_got_sframe->contents
3069
0
           + PLT_SFRAME_FDE_START_OFFSET);
3070
0
  }
3071
0
      if (htab->plt_got_sframe->sec_info_type == SEC_INFO_TYPE_SFRAME)
3072
0
  {
3073
0
    if (! _bfd_elf_merge_section_sframe (output_bfd, info,
3074
0
                 htab->plt_got_sframe,
3075
0
                 htab->plt_got_sframe->contents))
3076
0
      return NULL;
3077
0
  }
3078
0
    }
3079
3080
0
  if (htab->elf.sgot && htab->elf.sgot->size > 0)
3081
0
    elf_section_data (htab->elf.sgot->output_section)->this_hdr.sh_entsize
3082
0
      = htab->got_entry_size;
3083
3084
0
  return htab;
3085
0
}
3086
3087
3088
bool
3089
_bfd_x86_elf_early_size_sections (bfd *output_bfd,
3090
          struct bfd_link_info *info)
3091
0
{
3092
0
  asection *tls_sec = elf_hash_table (info)->tls_sec;
3093
3094
0
  if (tls_sec && !bfd_link_relocatable (info))
3095
0
    {
3096
0
      struct elf_link_hash_entry *tlsbase;
3097
3098
0
      tlsbase = elf_link_hash_lookup (elf_hash_table (info),
3099
0
              "_TLS_MODULE_BASE_",
3100
0
              false, false, false);
3101
3102
0
      if (tlsbase && tlsbase->type == STT_TLS)
3103
0
  {
3104
0
    struct elf_x86_link_hash_table *htab;
3105
0
    struct bfd_link_hash_entry *bh = NULL;
3106
0
    elf_backend_data *bed = get_elf_backend_data (output_bfd);
3107
3108
0
    htab = elf_x86_hash_table (info, bed->target_id);
3109
0
    if (htab == NULL)
3110
0
      return false;
3111
3112
0
    if (!(_bfd_generic_link_add_one_symbol
3113
0
    (info, output_bfd, "_TLS_MODULE_BASE_", BSF_LOCAL,
3114
0
     tls_sec, 0, NULL, false,
3115
0
     bed->collect, &bh)))
3116
0
      return false;
3117
3118
0
    htab->tls_module_base = bh;
3119
3120
0
    tlsbase = (struct elf_link_hash_entry *)bh;
3121
0
    tlsbase->def_regular = 1;
3122
0
    tlsbase->other = STV_HIDDEN;
3123
0
    tlsbase->root.linker_def = 1;
3124
0
    (*bed->elf_backend_hide_symbol) (info, tlsbase, true);
3125
0
  }
3126
0
    }
3127
3128
0
  return true;
3129
0
}
3130
3131
void
3132
_bfd_x86_elf_merge_symbol_attribute (struct elf_link_hash_entry *h,
3133
             unsigned int st_other,
3134
             bool definition,
3135
             bool dynamic ATTRIBUTE_UNUSED)
3136
0
{
3137
0
  if (definition)
3138
0
    {
3139
0
      struct elf_x86_link_hash_entry *eh
3140
0
  = (struct elf_x86_link_hash_entry *) h;
3141
0
      eh->def_protected = ELF_ST_VISIBILITY (st_other) == STV_PROTECTED;
3142
0
    }
3143
0
}
3144
3145
/* Copy the extra info we tack onto an elf_link_hash_entry.  */
3146
3147
void
3148
_bfd_x86_elf_copy_indirect_symbol (struct bfd_link_info *info,
3149
           struct elf_link_hash_entry *dir,
3150
           struct elf_link_hash_entry *ind)
3151
0
{
3152
0
  struct elf_x86_link_hash_entry *edir, *eind;
3153
3154
0
  edir = (struct elf_x86_link_hash_entry *) dir;
3155
0
  eind = (struct elf_x86_link_hash_entry *) ind;
3156
3157
0
  if (ind->root.type == bfd_link_hash_indirect
3158
0
      && dir->got.refcount <= 0)
3159
0
    {
3160
0
      edir->tls_type = eind->tls_type;
3161
0
      eind->tls_type = GOT_UNKNOWN;
3162
0
    }
3163
3164
  /* Copy gotoff_ref so that _bfd_x86_elf_adjust_dynamic_symbol will
3165
     generate a R_386_COPY reloc.  */
3166
0
  edir->gotoff_ref |= eind->gotoff_ref;
3167
3168
  /* Copy non_got_ref_without_indirect_extern_access so that
3169
     _bfd_x86_elf_adjust_dynamic_symbol will handle
3170
     GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS properly.  */
3171
0
  edir->non_got_ref_without_indirect_extern_access
3172
0
    |= eind->non_got_ref_without_indirect_extern_access;
3173
3174
0
  edir->zero_undefweak |= eind->zero_undefweak;
3175
3176
0
  if (ELIMINATE_COPY_RELOCS
3177
0
      && ind->root.type != bfd_link_hash_indirect
3178
0
      && dir->dynamic_adjusted)
3179
0
    {
3180
      /* If called to transfer flags for a weakdef during processing
3181
   of elf_adjust_dynamic_symbol, don't copy non_got_ref.
3182
   We clear it ourselves for ELIMINATE_COPY_RELOCS.  */
3183
0
      if (dir->versioned != versioned_hidden)
3184
0
  dir->ref_dynamic |= ind->ref_dynamic;
3185
0
      dir->ref_regular |= ind->ref_regular;
3186
0
      dir->ref_regular_nonweak |= ind->ref_regular_nonweak;
3187
0
      dir->needs_plt |= ind->needs_plt;
3188
0
      dir->pointer_equality_needed |= ind->pointer_equality_needed;
3189
0
    }
3190
0
  else
3191
0
    _bfd_elf_link_hash_copy_indirect (info, dir, ind);
3192
0
}
3193
3194
/* Remove undefined weak symbol from the dynamic symbol table if it
3195
   is resolved to 0.   */
3196
3197
bool
3198
_bfd_x86_elf_fixup_symbol (struct bfd_link_info *info,
3199
         struct elf_link_hash_entry *h)
3200
0
{
3201
0
  if (h->dynindx != -1
3202
0
      && UNDEFINED_WEAK_RESOLVED_TO_ZERO (info, elf_x86_hash_entry (h)))
3203
0
    {
3204
0
      h->dynindx = -1;
3205
0
      _bfd_elf_strtab_delref (elf_hash_table (info)->dynstr,
3206
0
            h->dynstr_index);
3207
0
    }
3208
0
  return true;
3209
0
}
3210
3211
/* Change the STT_GNU_IFUNC symbol defined in position-dependent
3212
   executable into the normal function symbol and set its address
3213
   to its PLT entry, which should be resolved by R_*_IRELATIVE at
3214
   run-time.  */
3215
3216
void
3217
_bfd_x86_elf_link_fixup_ifunc_symbol (struct bfd_link_info *info,
3218
              struct elf_x86_link_hash_table *htab,
3219
              struct elf_link_hash_entry *h,
3220
              Elf_Internal_Sym *sym)
3221
0
{
3222
0
  if (bfd_link_pde (info)
3223
0
      && h->def_regular
3224
0
      && h->dynindx != -1
3225
0
      && h->plt.offset != (bfd_vma) -1
3226
0
      && h->type == STT_GNU_IFUNC)
3227
0
    {
3228
0
      asection *plt_s;
3229
0
      bfd_vma plt_offset;
3230
0
      bfd *output_bfd = info->output_bfd;
3231
3232
0
      if (htab->plt_second)
3233
0
  {
3234
0
    struct elf_x86_link_hash_entry *eh
3235
0
      = (struct elf_x86_link_hash_entry *) h;
3236
3237
0
    plt_s = htab->plt_second;
3238
0
    plt_offset = eh->plt_second.offset;
3239
0
  }
3240
0
      else
3241
0
  {
3242
0
    plt_s = htab->elf.splt;
3243
0
    plt_offset = h->plt.offset;
3244
0
  }
3245
3246
0
      sym->st_size = 0;
3247
0
      sym->st_info = ELF_ST_INFO (ELF_ST_BIND (sym->st_info), STT_FUNC);
3248
0
      sym->st_shndx
3249
0
  = _bfd_elf_section_from_bfd_section (output_bfd,
3250
0
               plt_s->output_section);
3251
0
      sym->st_value = (plt_s->output_section->vma
3252
0
           + plt_s->output_offset + plt_offset);
3253
0
    }
3254
0
}
3255
3256
/* Report relative relocation.  */
3257
3258
void
3259
_bfd_x86_elf_link_report_relative_reloc
3260
  (struct bfd_link_info *info, asection *asect,
3261
   struct elf_link_hash_entry *h, Elf_Internal_Sym *sym,
3262
   const char *reloc_name, const void *reloc)
3263
0
{
3264
0
  const char *name;
3265
0
  bfd *abfd;
3266
0
  const Elf_Internal_Rela *rel = (const Elf_Internal_Rela *) reloc;
3267
3268
  /* Use the output BFD for linker created sections.  */
3269
0
  if ((asect->flags & SEC_LINKER_CREATED) != 0)
3270
0
    abfd = info->output_bfd;
3271
0
  else
3272
0
    abfd = asect->owner;
3273
3274
0
  if (h != NULL && h->root.root.string != NULL)
3275
0
    name = h->root.root.string;
3276
0
  else
3277
0
    name = bfd_elf_sym_name (abfd, &elf_symtab_hdr (abfd), sym, NULL);
3278
3279
0
  if (asect->use_rela_p)
3280
0
    info->callbacks->einfo
3281
0
      (_("%pB: %s (offset: 0x%v, info: 0x%v, addend: 0x%v) against "
3282
0
   "'%s' " "for section '%pA' in %pB\n"),
3283
0
       info->output_bfd, reloc_name, rel->r_offset, rel->r_info,
3284
0
       rel->r_addend, name, asect, abfd);
3285
0
  else
3286
0
    info->callbacks->einfo
3287
0
      (_("%pB: %s (offset: 0x%v, info: 0x%v) against '%s' for section "
3288
0
   "'%pA' in %pB\n"),
3289
0
       info->output_bfd, reloc_name, rel->r_offset, rel->r_info, name,
3290
0
       asect, abfd);
3291
0
}
3292
3293
/* Report TLS transition error.  */
3294
3295
void
3296
_bfd_x86_elf_link_report_tls_transition_error
3297
  (struct bfd_link_info *info, bfd *abfd, asection *asect,
3298
   Elf_Internal_Shdr *symtab_hdr, struct elf_link_hash_entry *h,
3299
   Elf_Internal_Sym *sym, const Elf_Internal_Rela *rel,
3300
   const char *from_reloc_name, const char *to_reloc_name,
3301
   enum elf_x86_tls_error_type tls_error)
3302
0
{
3303
0
  const char *name;
3304
0
  elf_backend_data *bed = get_elf_backend_data (abfd);
3305
0
  struct elf_x86_link_hash_table *htab
3306
0
    = elf_x86_hash_table (info, bed->target_id);
3307
3308
0
  if (h)
3309
0
    name = h->root.root.string;
3310
0
  else
3311
0
    {
3312
0
      if (htab == NULL)
3313
0
  name = "*unknown*";
3314
0
      else
3315
0
  name = bfd_elf_sym_name (abfd, symtab_hdr, sym, NULL);
3316
0
    }
3317
3318
0
  switch (tls_error)
3319
0
    {
3320
0
    case elf_x86_tls_error_yes:
3321
0
      info->callbacks->einfo
3322
  /* xgettext:c-format */
3323
0
  (_("%pB: TLS transition from %s to %s against `%s' at 0x%v in "
3324
0
     "section `%pA' failed\n"),
3325
0
   abfd, from_reloc_name, to_reloc_name, name, rel->r_offset,
3326
0
   asect);
3327
0
      break;
3328
3329
0
    case elf_x86_tls_error_add_mov:
3330
0
      info->callbacks->einfo
3331
  /* xgettext:c-format */
3332
0
  (_("%pB(%pA+0x%v): relocation %s against `%s' must be used "
3333
0
     "in ADD or MOV only\n"),
3334
0
   abfd, asect, rel->r_offset, from_reloc_name, name);
3335
0
      break;
3336
3337
0
    case elf_x86_tls_error_add_movrs:
3338
0
      info->callbacks->einfo
3339
  /* xgettext:c-format */
3340
0
  (_("%pB(%pA+0x%v): relocation %s against `%s' must be used "
3341
0
     "in ADD or MOVRS only\n"),
3342
0
   abfd, asect, rel->r_offset, from_reloc_name, name);
3343
0
      break;
3344
3345
0
    case elf_x86_tls_error_add_sub_mov:
3346
0
      info->callbacks->einfo
3347
  /* xgettext:c-format */
3348
0
  (_("%pB(%pA+0x%v): relocation %s against `%s' must be used "
3349
0
     "in ADD, SUB or MOV only\n"),
3350
0
   abfd, asect, rel->r_offset, from_reloc_name, name);
3351
0
      break;
3352
3353
0
    case elf_x86_tls_error_indirect_call:
3354
0
      info->callbacks->einfo
3355
  /* xgettext:c-format */
3356
0
  (_("%pB(%pA+0x%v): relocation %s against `%s' must be used "
3357
0
     "in indirect CALL with %s register only\n"),
3358
0
   abfd, asect, rel->r_offset, from_reloc_name, name,
3359
0
   htab->ax_register);
3360
0
      break;
3361
3362
0
    case elf_x86_tls_error_lea:
3363
0
      info->callbacks->einfo
3364
  /* xgettext:c-format */
3365
0
  (_("%pB(%pA+0x%v): relocation %s against `%s' must be used "
3366
0
     "in LEA only\n"),
3367
0
   abfd, asect, rel->r_offset, from_reloc_name, name);
3368
0
      break;
3369
3370
0
    default:
3371
0
      abort ();
3372
0
      break;
3373
0
    }
3374
3375
0
  bfd_set_error (bfd_error_bad_value);
3376
0
}
3377
3378
/* Report TLS invalid section error.  */
3379
3380
void
3381
_bfd_x86_elf_link_report_tls_invalid_section_error
3382
  (bfd *abfd, asection *sec, Elf_Internal_Shdr *symtab_hdr,
3383
   struct elf_link_hash_entry *h, Elf_Internal_Sym *sym,
3384
   reloc_howto_type *howto)
3385
0
{
3386
0
  const char *name;
3387
0
  if (h)
3388
0
    name = h->root.root.string;
3389
0
  else
3390
0
    name = bfd_elf_sym_name (abfd, symtab_hdr, sym, NULL);
3391
0
  _bfd_error_handler
3392
    /* xgettext:c-format */
3393
0
    (_("%pB: relocation %s against thread local symbol `%s' in "
3394
0
       "invalid section `%pA'"), abfd, howto->name, name, sec);
3395
0
  bfd_set_error (bfd_error_bad_value);
3396
0
}
3397
3398
/* Return TRUE if symbol should be hashed in the `.gnu.hash' section.  */
3399
3400
bool
3401
_bfd_x86_elf_hash_symbol (struct elf_link_hash_entry *h)
3402
0
{
3403
0
  if (h->plt.offset != (bfd_vma) -1
3404
0
      && !h->def_regular
3405
0
      && !h->pointer_equality_needed)
3406
0
    return false;
3407
3408
0
  return _bfd_elf_hash_symbol (h);
3409
0
}
3410
3411
/* Adjust a symbol defined by a dynamic object and referenced by a
3412
   regular object.  The current definition is in some section of the
3413
   dynamic object, but we're not including those sections.  We have to
3414
   change the definition to something the rest of the link can
3415
   understand.  */
3416
3417
bool
3418
_bfd_x86_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
3419
            struct elf_link_hash_entry *h)
3420
0
{
3421
0
  struct elf_x86_link_hash_table *htab;
3422
0
  asection *s, *srel;
3423
0
  struct elf_x86_link_hash_entry *eh;
3424
0
  struct elf_dyn_relocs *p;
3425
0
  elf_backend_data *bed = get_elf_backend_data (info->output_bfd);
3426
3427
0
  eh = (struct elf_x86_link_hash_entry *) h;
3428
3429
  /* Clear GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS if it is turned
3430
     on by an input relocatable file and there is a non-GOT/non-PLT
3431
     reference from another relocatable file without it.
3432
     NB: There can be non-GOT reference in data sections in input with
3433
     GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS.  */
3434
0
  if (eh->non_got_ref_without_indirect_extern_access
3435
0
      && info->indirect_extern_access == 1
3436
0
      && bfd_link_executable (info))
3437
0
    {
3438
0
      unsigned int needed_1;
3439
0
      info->indirect_extern_access = 0;
3440
      /* Turn off nocopyreloc if implied by indirect_extern_access.  */
3441
0
      if (info->nocopyreloc == 2)
3442
0
  info->nocopyreloc = 0;
3443
0
      needed_1 = bfd_h_get_32 (info->output_bfd, info->needed_1_p);
3444
0
      needed_1 &= ~GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS;
3445
0
      bfd_h_put_32 (info->output_bfd, needed_1, info->needed_1_p);
3446
0
    }
3447
3448
  /* STT_GNU_IFUNC symbol must go through PLT. */
3449
0
  if (h->type == STT_GNU_IFUNC)
3450
0
    {
3451
      /* All local STT_GNU_IFUNC references must be treate as local
3452
   calls via local PLT.  */
3453
0
      if (h->ref_regular
3454
0
    && SYMBOL_CALLS_LOCAL (info, h))
3455
0
  {
3456
0
    bfd_size_type pc_count = 0, count = 0;
3457
0
    struct elf_dyn_relocs **pp;
3458
3459
0
    eh = (struct elf_x86_link_hash_entry *) h;
3460
0
    for (pp = &h->dyn_relocs; (p = *pp) != NULL; )
3461
0
      {
3462
0
        pc_count += p->pc_count;
3463
0
        p->count -= p->pc_count;
3464
0
        p->pc_count = 0;
3465
0
        count += p->count;
3466
0
        if (p->count == 0)
3467
0
    *pp = p->next;
3468
0
        else
3469
0
    pp = &p->next;
3470
0
      }
3471
3472
0
    if (pc_count || count)
3473
0
      {
3474
0
        h->non_got_ref = 1;
3475
0
        if (pc_count)
3476
0
    {
3477
      /* Increment PLT reference count only for PC-relative
3478
         references.  */
3479
0
      h->needs_plt = 1;
3480
0
      if (h->plt.refcount <= 0)
3481
0
        h->plt.refcount = 1;
3482
0
      else
3483
0
        h->plt.refcount += 1;
3484
0
    }
3485
0
      }
3486
3487
    /* GOTOFF relocation needs PLT.  */
3488
0
    if (eh->gotoff_ref)
3489
0
      h->plt.refcount = 1;
3490
0
  }
3491
3492
0
      if (h->plt.refcount <= 0)
3493
0
  {
3494
0
    h->plt.offset = (bfd_vma) -1;
3495
0
    h->needs_plt = 0;
3496
0
  }
3497
0
      return true;
3498
0
    }
3499
3500
  /* If this is a function, put it in the procedure linkage table.  We
3501
     will fill in the contents of the procedure linkage table later,
3502
     when we know the address of the .got section.  */
3503
0
  if (h->type == STT_FUNC
3504
0
      || h->needs_plt)
3505
0
    {
3506
0
      if (h->plt.refcount <= 0
3507
0
    || SYMBOL_CALLS_LOCAL (info, h)
3508
0
    || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
3509
0
        && h->root.type == bfd_link_hash_undefweak))
3510
0
  {
3511
    /* This case can occur if we saw a PLT32 reloc in an input
3512
       file, but the symbol was never referred to by a dynamic
3513
       object, or if all references were garbage collected.  In
3514
       such a case, we don't actually need to build a procedure
3515
       linkage table, and we can just do a PC32 reloc instead.  */
3516
0
    h->plt.offset = (bfd_vma) -1;
3517
0
    h->needs_plt = 0;
3518
0
  }
3519
3520
0
      return true;
3521
0
    }
3522
0
  else
3523
    /* It's possible that we incorrectly decided a .plt reloc was needed
3524
     * for an R_386_PC32/R_X86_64_PC32 reloc to a non-function sym in
3525
       check_relocs.  We can't decide accurately between function and
3526
       non-function syms in check-relocs;  Objects loaded later in
3527
       the link may change h->type.  So fix it now.  */
3528
0
    h->plt.offset = (bfd_vma) -1;
3529
3530
  /* If this is a weak symbol, and there is a real definition, the
3531
     processor independent code will have arranged for us to see the
3532
     real definition first, and we can just use the same value.  */
3533
0
  if (h->is_weakalias)
3534
0
    {
3535
0
      struct elf_link_hash_entry *def = weakdef (h);
3536
0
      BFD_ASSERT (def->root.type == bfd_link_hash_defined);
3537
0
      h->root.u.def.section = def->root.u.def.section;
3538
0
      h->root.u.def.value = def->root.u.def.value;
3539
0
      if (ELIMINATE_COPY_RELOCS
3540
0
    || info->nocopyreloc
3541
0
    || SYMBOL_NO_COPYRELOC (info, eh))
3542
0
  {
3543
    /* NB: needs_copy is always 0 for i386.  */
3544
0
    h->non_got_ref = def->non_got_ref;
3545
0
    eh->needs_copy = def->needs_copy;
3546
0
  }
3547
0
      return true;
3548
0
    }
3549
3550
  /* This is a reference to a symbol defined by a dynamic object which
3551
     is not a function.  */
3552
3553
  /* If we are creating a shared library, we must presume that the
3554
     only references to the symbol are via the global offset table.
3555
     For such cases we need not do anything here; the relocations will
3556
     be handled correctly by relocate_section.  */
3557
0
  if (!bfd_link_executable (info))
3558
0
    return true;
3559
3560
  /* If there are no references to this symbol that do not use the
3561
     GOT nor R_386_GOTOFF relocation, we don't need to generate a copy
3562
     reloc.  NB: gotoff_ref is always 0 for x86-64.  */
3563
0
  if (!h->non_got_ref && !eh->gotoff_ref)
3564
0
    return true;
3565
3566
  /* If -z nocopyreloc was given, we won't generate them either.  */
3567
0
  if (info->nocopyreloc || SYMBOL_NO_COPYRELOC (info, eh))
3568
0
    {
3569
0
      h->non_got_ref = 0;
3570
0
      return true;
3571
0
    }
3572
3573
0
  htab = elf_x86_hash_table (info, bed->target_id);
3574
0
  if (htab == NULL)
3575
0
    return false;
3576
3577
  /* If there aren't any dynamic relocs in read-only sections nor
3578
     R_386_GOTOFF relocation, then we can keep the dynamic relocs and
3579
     avoid the copy reloc.  This doesn't work on VxWorks, where we can
3580
     not have dynamic relocations (other than copy and jump slot
3581
     relocations) in an executable.  */
3582
0
  if (ELIMINATE_COPY_RELOCS
3583
0
      && (bed->target_id == X86_64_ELF_DATA
3584
0
    || (!eh->gotoff_ref
3585
0
        && htab->elf.target_os != is_vxworks)))
3586
0
    {
3587
      /* If we don't find any dynamic relocs in read-only sections,
3588
   then we'll be keeping the dynamic relocs and avoiding the copy
3589
   reloc.  */
3590
0
      if (!_bfd_elf_readonly_dynrelocs (h))
3591
0
  {
3592
0
    h->non_got_ref = 0;
3593
0
    return true;
3594
0
  }
3595
0
    }
3596
3597
  /* We must allocate the symbol in our .dynbss section, which will
3598
     become part of the .bss section of the executable.  There will be
3599
     an entry for this symbol in the .dynsym section.  The dynamic
3600
     object will contain position independent code, so all references
3601
     from the dynamic object to this symbol will go through the global
3602
     offset table.  The dynamic linker will use the .dynsym entry to
3603
     determine the address it must put in the global offset table, so
3604
     both the dynamic object and the regular object will refer to the
3605
     same memory location for the variable.  */
3606
3607
  /* We must generate a R_386_COPY/R_X86_64_COPY reloc to tell the
3608
     dynamic linker to copy the initial value out of the dynamic object
3609
     and into the runtime process image.  */
3610
0
  if ((h->root.u.def.section->flags & SEC_READONLY) != 0)
3611
0
    {
3612
0
      s = htab->elf.sdynrelro;
3613
0
      srel = htab->elf.sreldynrelro;
3614
0
    }
3615
0
  else
3616
0
    {
3617
0
      s = htab->elf.sdynbss;
3618
0
      srel = htab->elf.srelbss;
3619
0
    }
3620
0
  if ((h->root.u.def.section->flags & SEC_ALLOC) != 0 && h->size != 0)
3621
0
    {
3622
0
      if (eh->def_protected && bfd_link_executable (info))
3623
0
  for (p = h->dyn_relocs; p != NULL; p = p->next)
3624
0
    {
3625
      /* Disallow copy relocation against non-copyable protected
3626
         symbol.  */
3627
0
      s = p->sec->output_section;
3628
0
      if (s != NULL && (s->flags & SEC_READONLY) != 0)
3629
0
        {
3630
0
    info->callbacks->fatal
3631
      /* xgettext:c-format */
3632
0
      (_("%P: %pB: copy relocation against non-copyable "
3633
0
         "protected symbol `%s' in %pB\n"),
3634
0
       p->sec->owner, h->root.root.string,
3635
0
       h->root.u.def.section->owner);
3636
0
    return false;
3637
0
        }
3638
0
    }
3639
3640
0
      srel->size += htab->sizeof_reloc;
3641
0
      h->needs_copy = 1;
3642
0
    }
3643
3644
0
  return _bfd_elf_adjust_dynamic_copy (info, h, s);
3645
0
}
3646
3647
void
3648
_bfd_x86_elf_hide_symbol (struct bfd_link_info *info,
3649
        struct elf_link_hash_entry *h,
3650
        bool force_local)
3651
0
{
3652
0
  if (h->root.type == bfd_link_hash_undefweak
3653
0
      && info->nointerp
3654
0
      && bfd_link_pie (info))
3655
0
    {
3656
      /* When there is no dynamic interpreter in PIE, make the undefined
3657
   weak symbol dynamic so that PC relative branch to the undefined
3658
   weak symbol will land to address 0.  */
3659
0
      struct elf_x86_link_hash_entry *eh = elf_x86_hash_entry (h);
3660
0
      if (h->plt.refcount > 0
3661
0
    || eh->plt_got.refcount > 0)
3662
0
  return;
3663
0
    }
3664
3665
0
  _bfd_elf_link_hash_hide_symbol (info, h, force_local);
3666
0
}
3667
3668
/* Return TRUE if a symbol is referenced locally.  It is similar to
3669
   SYMBOL_REFERENCES_LOCAL, but it also checks version script.  It
3670
   works in check_relocs.  */
3671
3672
bool
3673
_bfd_x86_elf_link_symbol_references_local (struct bfd_link_info *info,
3674
             struct elf_link_hash_entry *h)
3675
0
{
3676
0
  struct elf_x86_link_hash_entry *eh = elf_x86_hash_entry (h);
3677
0
  struct elf_x86_link_hash_table *htab
3678
0
    = (struct elf_x86_link_hash_table *) info->hash;
3679
3680
0
  if (eh->local_ref > 1)
3681
0
    return true;
3682
3683
0
  if (eh->local_ref == 1)
3684
0
    return false;
3685
3686
  /* Unversioned symbols defined in regular objects can be forced local
3687
     by linker version script.  A weak undefined symbol is forced local
3688
     if
3689
     1. It has non-default visibility.  Or
3690
     2. When building executable, there is no dynamic linker.  Or
3691
     3. or "-z nodynamic-undefined-weak" is used.
3692
   */
3693
0
  if (_bfd_elf_symbol_refs_local_p (h, info, 1)
3694
0
      || (h->root.type == bfd_link_hash_undefweak
3695
0
    && (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
3696
0
        || (bfd_link_executable (info)
3697
0
      && htab->elf.interp == NULL)
3698
0
        || info->dynamic_undefined_weak == 0))
3699
0
      || ((h->def_regular || ELF_COMMON_DEF_P (h))
3700
0
    && info->version_info != NULL
3701
0
    && _bfd_elf_link_hide_sym_by_version (info, h)))
3702
0
    {
3703
0
      eh->local_ref = 2;
3704
0
      return true;
3705
0
    }
3706
3707
0
  eh->local_ref = 1;
3708
0
  return false;
3709
0
}
3710
3711
/* Return the section that should be marked against GC for a given
3712
   relocation.  */
3713
3714
asection *
3715
_bfd_x86_elf_gc_mark_hook (asection *sec,
3716
         struct bfd_link_info *info,
3717
         struct elf_reloc_cookie *cookie,
3718
         struct elf_link_hash_entry *h,
3719
         unsigned int symndx)
3720
0
{
3721
  /* Compiler should optimize this out.  */
3722
0
  if (((unsigned int) R_X86_64_GNU_VTINHERIT
3723
0
       != (unsigned int) R_386_GNU_VTINHERIT)
3724
0
      || ((unsigned int) R_X86_64_GNU_VTENTRY
3725
0
    != (unsigned int) R_386_GNU_VTENTRY))
3726
0
    abort ();
3727
3728
0
  if (h != NULL)
3729
0
    switch (ELF32_R_TYPE (cookie->rel->r_info))
3730
0
      {
3731
0
      case R_X86_64_GNU_VTINHERIT:
3732
0
      case R_X86_64_GNU_VTENTRY:
3733
0
  return NULL;
3734
0
      }
3735
3736
0
  return _bfd_elf_gc_mark_hook (sec, info, cookie, h, symndx);
3737
0
}
3738
3739
static bfd_vma
3740
elf_i386_get_plt_got_vma (struct elf_x86_plt *plt_p ATTRIBUTE_UNUSED,
3741
        bfd_vma off,
3742
        bfd_vma offset ATTRIBUTE_UNUSED,
3743
        bfd_vma got_addr)
3744
8
{
3745
8
  return got_addr + off;
3746
8
}
3747
3748
static bfd_vma
3749
elf_x86_64_get_plt_got_vma (struct elf_x86_plt *plt_p,
3750
          bfd_vma off,
3751
          bfd_vma offset,
3752
          bfd_vma got_addr ATTRIBUTE_UNUSED)
3753
3.91k
{
3754
3.91k
  return plt_p->sec->vma + offset + off + plt_p->plt_got_insn_size;
3755
3.91k
}
3756
3757
static bool
3758
elf_i386_valid_plt_reloc_p (unsigned int type)
3759
8
{
3760
8
  return (type == R_386_JUMP_SLOT
3761
2
    || type == R_386_GLOB_DAT
3762
0
    || type == R_386_IRELATIVE);
3763
8
}
3764
3765
static bool
3766
elf_x86_64_valid_plt_reloc_p (unsigned int type)
3767
604
{
3768
604
  return (type == R_X86_64_JUMP_SLOT
3769
100
    || type == R_X86_64_GLOB_DAT
3770
11
    || type == R_X86_64_IRELATIVE);
3771
604
}
3772
3773
long
3774
_bfd_x86_elf_get_synthetic_symtab (bfd *abfd,
3775
           long count,
3776
           long relsize,
3777
           bfd_vma got_addr,
3778
           struct elf_x86_plt plts[],
3779
           asymbol **dynsyms,
3780
           asymbol **ret)
3781
119
{
3782
119
  long size, i, n, len;
3783
119
  int j;
3784
119
  unsigned int plt_got_offset, plt_entry_size;
3785
119
  asymbol *s;
3786
119
  bfd_byte *plt_contents;
3787
119
  long dynrelcount;
3788
119
  arelent **dynrelbuf, *p;
3789
119
  char *names;
3790
119
  elf_backend_data *bed;
3791
119
  bfd_vma (*get_plt_got_vma) (struct elf_x86_plt *, bfd_vma, bfd_vma,
3792
119
            bfd_vma);
3793
119
  bool (*valid_plt_reloc_p) (unsigned int);
3794
119
  unsigned int jump_slot_reloc;
3795
3796
119
  dynrelbuf = NULL;
3797
119
  if (count == 0)
3798
30
    goto bad_return;
3799
3800
89
  dynrelbuf = (arelent **) bfd_malloc (relsize);
3801
89
  if (dynrelbuf == NULL)
3802
0
    goto bad_return;
3803
3804
89
  dynrelcount = bfd_canonicalize_dynamic_reloc (abfd, dynrelbuf,
3805
89
            dynsyms);
3806
89
  if (dynrelcount <= 0)
3807
3
    goto bad_return;
3808
3809
  /* Sort the relocs by address.  */
3810
86
  qsort (dynrelbuf, dynrelcount, sizeof (arelent *),
3811
86
   _bfd_x86_elf_compare_relocs);
3812
3813
86
  size = count * sizeof (asymbol);
3814
3815
  /* Allocate space for @plt suffixes.  */
3816
86
  n = 0;
3817
1.19k
  for (i = 0; i < dynrelcount; i++)
3818
1.10k
    {
3819
1.10k
      p = dynrelbuf[i];
3820
1.10k
      size += strlen ((*p->sym_ptr_ptr)->name) + sizeof ("@plt");
3821
1.10k
      if (p->addend != 0)
3822
183
  size += sizeof ("+0x") - 1 + 8 + 8 * ABI_64_P (abfd);
3823
1.10k
    }
3824
3825
86
  s = *ret = (asymbol *) bfd_zmalloc (size);
3826
86
  if (s == NULL)
3827
0
    goto bad_return;
3828
3829
86
  bed = get_elf_backend_data (abfd);
3830
3831
86
  if (bed->target_id == X86_64_ELF_DATA)
3832
82
    {
3833
82
      get_plt_got_vma = elf_x86_64_get_plt_got_vma;
3834
82
      valid_plt_reloc_p = elf_x86_64_valid_plt_reloc_p;
3835
82
      jump_slot_reloc = R_X86_64_JUMP_SLOT;
3836
82
    }
3837
4
  else
3838
4
    {
3839
4
      get_plt_got_vma = elf_i386_get_plt_got_vma;
3840
4
      valid_plt_reloc_p = elf_i386_valid_plt_reloc_p;
3841
4
      jump_slot_reloc = R_386_JUMP_SLOT;
3842
4
      if (got_addr)
3843
2
  {
3844
    /* Check .got.plt and then .got to get the _GLOBAL_OFFSET_TABLE_
3845
       address.  */
3846
2
    asection *sec = bfd_get_section_by_name (abfd, ".got.plt");
3847
2
    if (sec != NULL)
3848
1
      got_addr = sec->vma;
3849
1
    else
3850
1
      {
3851
1
        sec = bfd_get_section_by_name (abfd, ".got");
3852
1
        if (sec != NULL)
3853
1
    got_addr = sec->vma;
3854
1
      }
3855
3856
2
    if (got_addr == (bfd_vma) -1)
3857
0
      goto bad_return;
3858
2
  }
3859
4
    }
3860
3861
  /* Check for each PLT section.  */
3862
86
  names = (char *) (s + count);
3863
86
  size = 0;
3864
86
  n = 0;
3865
426
  for (j = 0; plts[j].name != NULL; j++)
3866
340
    if ((plt_contents = plts[j].contents) != NULL)
3867
98
      {
3868
98
  long k;
3869
98
  bfd_vma offset;
3870
98
  asection *plt;
3871
98
  struct elf_x86_plt *plt_p = &plts[j];
3872
3873
98
  plt_got_offset = plt_p->plt_got_offset;
3874
98
  plt_entry_size = plt_p->plt_entry_size;
3875
3876
98
  plt = plt_p->sec;
3877
3878
98
  if ((plt_p->type & plt_lazy))
3879
45
    {
3880
      /* Skip PLT0 in lazy PLT.  */
3881
45
      k = 1;
3882
45
      offset = plt_entry_size;
3883
45
    }
3884
53
  else
3885
53
    {
3886
53
      k = 0;
3887
53
      offset = 0;
3888
53
    }
3889
3890
  /* Check each PLT entry against dynamic relocations.  */
3891
4.01k
  for (; k < plt_p->count; k++)
3892
3.92k
    {
3893
3.92k
      int off;
3894
3.92k
      bfd_vma got_vma;
3895
3.92k
      long min, max, mid;
3896
3897
      /* Get the GOT offset for i386 or the PC-relative offset
3898
         for x86-64, a signed 32-bit integer.  */
3899
3.92k
      off = H_GET_32 (abfd, (plt_contents + offset
3900
3.92k
           + plt_got_offset));
3901
3.92k
      got_vma = get_plt_got_vma (plt_p, off, offset, got_addr);
3902
3903
      /* Binary search.  */
3904
3.92k
      p = dynrelbuf[0];
3905
3.92k
      min = 0;
3906
3.92k
      max = dynrelcount;
3907
15.3k
      while ((min + 1) < max)
3908
12.0k
        {
3909
12.0k
    arelent *r;
3910
3911
12.0k
    mid = (min + max) / 2;
3912
12.0k
    r = dynrelbuf[mid];
3913
12.0k
    if (got_vma > r->address)
3914
3.36k
      min = mid;
3915
8.69k
    else if (got_vma < r->address)
3916
8.11k
      max = mid;
3917
581
    else
3918
581
      {
3919
581
        p = r;
3920
581
        break;
3921
581
      }
3922
12.0k
        }
3923
3924
      /* Skip unknown relocation.  PR 17512: file: bc9d6cf5.  */
3925
3.92k
      if (got_vma == p->address
3926
614
    && p->howto != NULL
3927
612
    && valid_plt_reloc_p (p->howto->type))
3928
601
        {
3929
601
    *s = **p->sym_ptr_ptr;
3930
    /* Undefined syms won't have BSF_LOCAL or BSF_GLOBAL
3931
       set.  Since we are defining a symbol, ensure one
3932
       of them is set.  */
3933
601
    if ((s->flags & BSF_LOCAL) == 0)
3934
570
      s->flags |= BSF_GLOBAL;
3935
601
    s->flags |= BSF_SYNTHETIC;
3936
    /* This is no longer a section symbol.  */
3937
601
    s->flags &= ~BSF_SECTION_SYM;
3938
601
    s->section = plt;
3939
601
    s->the_bfd = plt->owner;
3940
601
    s->value = offset;
3941
601
    s->udata.p = NULL;
3942
601
    s->name = names;
3943
601
    len = strlen ((*p->sym_ptr_ptr)->name);
3944
601
    memcpy (names, (*p->sym_ptr_ptr)->name, len);
3945
601
    names += len;
3946
    /* There may be JUMP_SLOT and IRELATIVE relocations.
3947
       JUMP_SLOT r_addend should be ignored.  */
3948
601
    if (p->addend != 0 && p->howto->type != jump_slot_reloc)
3949
5
      {
3950
5
        char buf[30], *a;
3951
3952
5
        memcpy (names, "+0x", sizeof ("+0x") - 1);
3953
5
        names += sizeof ("+0x") - 1;
3954
5
        bfd_sprintf_vma (abfd, buf, p->addend);
3955
30
        for (a = buf; *a == '0'; ++a)
3956
25
          ;
3957
5
        size = strlen (a);
3958
5
        memcpy (names, a, size);
3959
5
        names += size;
3960
5
      }
3961
601
    memcpy (names, "@plt", sizeof ("@plt"));
3962
601
    names += sizeof ("@plt");
3963
601
    n++;
3964
601
    s++;
3965
    /* There should be only one entry in PLT for a given
3966
       symbol.  Set howto to NULL after processing a PLT
3967
       entry to guard against corrupted PLT.  */
3968
601
    p->howto = NULL;
3969
601
        }
3970
3.92k
      offset += plt_entry_size;
3971
3.92k
    }
3972
98
      }
3973
3974
  /* PLT entries with R_386_TLS_DESC relocations are skipped.  */
3975
86
  if (n == 0)
3976
7
    {
3977
40
    bad_return:
3978
40
      count = -1;
3979
40
    }
3980
79
  else
3981
79
    count = n;
3982
3983
590
  for (j = 0; plts[j].name != NULL; j++)
3984
471
    _bfd_elf_munmap_section_contents (plts[j].sec, plts[j].contents);
3985
3986
119
  free (dynrelbuf);
3987
3988
119
  return count;
3989
86
}
3990
3991
/* Parse x86 GNU properties.  */
3992
3993
enum elf_property_kind
3994
_bfd_x86_elf_parse_gnu_properties (bfd *abfd, unsigned int type,
3995
           bfd_byte *ptr, unsigned int datasz)
3996
139
{
3997
139
  elf_property *prop;
3998
3999
139
  if (type == GNU_PROPERTY_X86_COMPAT_ISA_1_USED
4000
121
      || type == GNU_PROPERTY_X86_COMPAT_ISA_1_NEEDED
4001
111
      || (type >= GNU_PROPERTY_X86_UINT32_AND_LO
4002
111
    && type <= GNU_PROPERTY_X86_UINT32_AND_HI)
4003
103
      || (type >= GNU_PROPERTY_X86_UINT32_OR_LO
4004
103
    && type <= GNU_PROPERTY_X86_UINT32_OR_HI)
4005
91
      || (type >= GNU_PROPERTY_X86_UINT32_OR_AND_LO
4006
91
    && type <= GNU_PROPERTY_X86_UINT32_OR_AND_HI))
4007
62
    {
4008
62
      if (datasz != 4)
4009
33
  {
4010
33
    _bfd_error_handler
4011
33
      (_("error: %pB: <corrupt x86 property (0x%x) size: 0x%x>"),
4012
33
       abfd, type, datasz);
4013
33
    return property_corrupt;
4014
33
  }
4015
29
      prop = _bfd_elf_get_property (abfd, type, datasz);
4016
29
      prop->u.number |= bfd_h_get_32 (abfd, ptr);
4017
29
      prop->pr_kind = property_number;
4018
29
      return property_number;
4019
62
    }
4020
4021
77
  return property_ignored;
4022
139
}
4023
4024
/* Merge x86 GNU property BPROP with APROP.  If APROP isn't NULL,
4025
   return TRUE if APROP is updated.  Otherwise, return TRUE if BPROP
4026
   should be merged with ABFD.  */
4027
4028
bool
4029
_bfd_x86_elf_merge_gnu_properties (struct bfd_link_info *info,
4030
           bfd *abfd ATTRIBUTE_UNUSED,
4031
           bfd *bbfd ATTRIBUTE_UNUSED,
4032
           elf_property *aprop,
4033
           elf_property *bprop)
4034
0
{
4035
0
  unsigned int number, features;
4036
0
  bool updated = false;
4037
0
  elf_backend_data *bed;
4038
0
  struct elf_x86_link_hash_table *htab;
4039
0
  unsigned int pr_type = aprop != NULL ? aprop->pr_type : bprop->pr_type;
4040
4041
0
  if (pr_type == GNU_PROPERTY_X86_COMPAT_ISA_1_USED
4042
0
      || (pr_type >= GNU_PROPERTY_X86_UINT32_OR_AND_LO
4043
0
    && pr_type <= GNU_PROPERTY_X86_UINT32_OR_AND_HI))
4044
0
    {
4045
0
      if (aprop == NULL || bprop == NULL)
4046
0
  {
4047
    /* Only one of APROP and BPROP can be NULL.  */
4048
0
    if (aprop != NULL)
4049
0
      {
4050
        /* Remove this property since the other input file doesn't
4051
     have it.  */
4052
0
        aprop->pr_kind = property_remove;
4053
0
        updated = true;
4054
0
      }
4055
0
  }
4056
0
      else
4057
0
  {
4058
0
    number = aprop->u.number;
4059
0
    aprop->u.number = number | bprop->u.number;
4060
0
    updated = number != (unsigned int) aprop->u.number;
4061
0
  }
4062
0
      return updated;
4063
0
    }
4064
0
  else if (pr_type == GNU_PROPERTY_X86_COMPAT_ISA_1_NEEDED
4065
0
     || (pr_type >= GNU_PROPERTY_X86_UINT32_OR_LO
4066
0
         && pr_type <= GNU_PROPERTY_X86_UINT32_OR_HI))
4067
0
    {
4068
0
      features = 0;
4069
0
      if (pr_type == GNU_PROPERTY_X86_ISA_1_NEEDED)
4070
0
  {
4071
0
    bed = get_elf_backend_data (info->output_bfd);
4072
0
    htab = elf_x86_hash_table (info, bed->target_id);
4073
0
    switch (htab->params->isa_level)
4074
0
      {
4075
0
      case 0:
4076
0
        break;
4077
0
      case 2:
4078
0
        features = GNU_PROPERTY_X86_ISA_1_V2;
4079
0
        break;
4080
0
      case 3:
4081
0
        features = GNU_PROPERTY_X86_ISA_1_V3;
4082
0
        break;
4083
0
      case 4:
4084
0
        features = GNU_PROPERTY_X86_ISA_1_V4;
4085
0
        break;
4086
0
      default:
4087
0
        abort ();
4088
0
      }
4089
0
  }
4090
0
      if (aprop != NULL && bprop != NULL)
4091
0
  {
4092
0
    number = aprop->u.number;
4093
0
    aprop->u.number = number | bprop->u.number | features;
4094
    /* Remove the property if all bits are empty.  */
4095
0
    if (aprop->u.number == 0)
4096
0
      {
4097
0
        aprop->pr_kind = property_remove;
4098
0
        updated = true;
4099
0
      }
4100
0
    else
4101
0
      updated = number != (unsigned int) aprop->u.number;
4102
0
  }
4103
0
      else
4104
0
  {
4105
    /* Only one of APROP and BPROP can be NULL.  */
4106
0
    if (aprop != NULL)
4107
0
      {
4108
0
        aprop->u.number |= features;
4109
0
        if (aprop->u.number == 0)
4110
0
    {
4111
      /* Remove APROP if all bits are empty.  */
4112
0
      aprop->pr_kind = property_remove;
4113
0
      updated = true;
4114
0
    }
4115
0
      }
4116
0
    else
4117
0
      {
4118
        /* Return TRUE if APROP is NULL and all bits of BPROP
4119
     aren't empty to indicate that BPROP should be added
4120
     to ABFD.  */
4121
0
        bprop->u.number |= features;
4122
0
        updated = bprop->u.number != 0;
4123
0
      }
4124
0
  }
4125
0
      return updated;
4126
0
    }
4127
0
  else if (pr_type >= GNU_PROPERTY_X86_UINT32_AND_LO
4128
0
     && pr_type <= GNU_PROPERTY_X86_UINT32_AND_HI)
4129
0
    {
4130
      /* Only one of APROP and BPROP can be NULL:
4131
   1. APROP & BPROP when both APROP and BPROP aren't NULL.
4132
   2. If APROP is NULL, remove x86 feature.
4133
   3. Otherwise, do nothing.
4134
       */
4135
0
      bed = get_elf_backend_data (info->output_bfd);
4136
0
      htab = elf_x86_hash_table (info, bed->target_id);
4137
0
      if (!htab)
4138
0
  abort ();
4139
0
      if (aprop != NULL && bprop != NULL)
4140
0
  {
4141
0
    number = aprop->u.number;
4142
0
    aprop->u.number = number & bprop->u.number;
4143
0
    if (pr_type == GNU_PROPERTY_X86_FEATURE_1_AND)
4144
0
      {
4145
0
        features = 0;
4146
0
        if (htab->params->ibt)
4147
0
    features = GNU_PROPERTY_X86_FEATURE_1_IBT;
4148
0
        if (htab->params->shstk)
4149
0
    features |= GNU_PROPERTY_X86_FEATURE_1_SHSTK;
4150
0
        if (htab->params->lam_u48)
4151
0
    features |= (GNU_PROPERTY_X86_FEATURE_1_LAM_U48
4152
0
           | GNU_PROPERTY_X86_FEATURE_1_LAM_U57);
4153
0
        else if (htab->params->lam_u57)
4154
0
    features |= GNU_PROPERTY_X86_FEATURE_1_LAM_U57;
4155
        /* Add GNU_PROPERTY_X86_FEATURE_1_IBT,
4156
     GNU_PROPERTY_X86_FEATURE_1_SHSTK,
4157
     GNU_PROPERTY_X86_FEATURE_1_LAM_U48 and
4158
     GNU_PROPERTY_X86_FEATURE_1_LAM_U57.  */
4159
0
        aprop->u.number |= features;
4160
0
      }
4161
0
    updated = number != (unsigned int) aprop->u.number;
4162
    /* Remove the property if all feature bits are cleared.  */
4163
0
    if (aprop->u.number == 0)
4164
0
      aprop->pr_kind = property_remove;
4165
0
  }
4166
0
      else
4167
0
  {
4168
    /* There should be no AND properties since some input doesn't
4169
       have them.  Set IBT and SHSTK properties for -z ibt and -z
4170
       shstk if needed.  */
4171
0
    features = 0;
4172
0
    if (pr_type == GNU_PROPERTY_X86_FEATURE_1_AND)
4173
0
      {
4174
0
        if (htab->params->ibt)
4175
0
    features = GNU_PROPERTY_X86_FEATURE_1_IBT;
4176
0
        if (htab->params->shstk)
4177
0
    features |= GNU_PROPERTY_X86_FEATURE_1_SHSTK;
4178
0
        if (htab->params->lam_u48)
4179
0
    features |= (GNU_PROPERTY_X86_FEATURE_1_LAM_U48
4180
0
           | GNU_PROPERTY_X86_FEATURE_1_LAM_U57);
4181
0
        else if (htab->params->lam_u57)
4182
0
    features |= GNU_PROPERTY_X86_FEATURE_1_LAM_U57;
4183
0
      }
4184
0
    if (features)
4185
0
      {
4186
0
        if (aprop != NULL)
4187
0
    {
4188
0
      updated = features != (unsigned int) aprop->u.number;
4189
0
      aprop->u.number = features;
4190
0
    }
4191
0
        else
4192
0
    {
4193
0
      updated = true;
4194
0
      bprop->u.number = features;
4195
0
    }
4196
0
      }
4197
0
    else if (aprop != NULL)
4198
0
      {
4199
0
        aprop->pr_kind = property_remove;
4200
0
        updated = true;
4201
0
      }
4202
0
  }
4203
0
      return updated;
4204
0
    }
4205
0
  else
4206
0
    {
4207
      /* Never should happen.  */
4208
0
      abort ();
4209
0
    }
4210
4211
0
  return updated;
4212
0
}
4213
4214
/* Report x86-64 ISA level.  */
4215
4216
static void
4217
report_isa_level (struct bfd_link_info *info, bfd *abfd,
4218
      unsigned int bitmask, bool needed)
4219
0
{
4220
0
  if (!bitmask)
4221
0
    return;
4222
4223
0
  if (needed)
4224
0
    info->callbacks->einfo (_("%pB: x86 ISA needed: "), abfd);
4225
0
  else
4226
0
    info->callbacks->einfo (_("%pB: x86 ISA used: "), abfd);
4227
4228
0
  while (bitmask)
4229
0
    {
4230
0
      unsigned int bit = bitmask & (- bitmask);
4231
4232
0
      bitmask &= ~ bit;
4233
0
      switch (bit)
4234
0
  {
4235
0
  case GNU_PROPERTY_X86_ISA_1_BASELINE:
4236
0
    info->callbacks->einfo ("x86-64-baseline");
4237
0
    break;
4238
0
  case GNU_PROPERTY_X86_ISA_1_V2:
4239
0
    info->callbacks->einfo ("x86-64-v2");
4240
0
    break;
4241
0
  case GNU_PROPERTY_X86_ISA_1_V3:
4242
0
    info->callbacks->einfo ("x86-64-v3");
4243
0
    break;
4244
0
  case GNU_PROPERTY_X86_ISA_1_V4:
4245
0
    info->callbacks->einfo ("x86-64-v4");
4246
0
    break;
4247
0
  default:
4248
0
    info->callbacks->einfo (_("<unknown: %#x>"), bit);
4249
0
    break;
4250
0
  }
4251
0
      if (bitmask)
4252
0
  info->callbacks->einfo (", ");
4253
0
    }
4254
4255
0
  info->callbacks->einfo ("\n");
4256
0
}
4257
4258
/* Set up x86 GNU properties.  Return the first relocatable ELF input
4259
   with GNU properties if found.  Otherwise, return NULL.  */
4260
4261
bfd *
4262
_bfd_x86_elf_link_setup_gnu_properties
4263
  (struct bfd_link_info *info, struct elf_x86_init_table *init_table)
4264
0
{
4265
0
  bool normal_target;
4266
0
  bool lazy_plt;
4267
0
  asection *sec, *pltsec;
4268
0
  bfd *dynobj;
4269
0
  bool use_ibt_plt;
4270
0
  unsigned int plt_alignment, features, isa_level;
4271
0
  struct elf_x86_link_hash_table *htab;
4272
0
  bfd *pbfd;
4273
0
  bfd *ebfd = NULL;
4274
0
  elf_property *prop;
4275
0
  elf_backend_data *bed;
4276
0
  unsigned int class_align = ABI_64_P (info->output_bfd) ? 3 : 2;
4277
0
  unsigned int got_align;
4278
4279
  /* Find a normal input file with GNU property note.  */
4280
0
  for (pbfd = info->input_bfds;
4281
0
       pbfd != NULL;
4282
0
       pbfd = pbfd->link.next)
4283
0
    if (bfd_get_flavour (pbfd) == bfd_target_elf_flavour
4284
0
  && bfd_count_sections (pbfd) != 0)
4285
0
      {
4286
0
  ebfd = pbfd;
4287
4288
0
  if (elf_properties (pbfd) != NULL)
4289
0
    break;
4290
0
      }
4291
4292
0
  bed = get_elf_backend_data (info->output_bfd);
4293
4294
0
  htab = elf_x86_hash_table (info, bed->target_id);
4295
0
  if (htab == NULL)
4296
0
    return pbfd;
4297
4298
0
  features = 0;
4299
0
  if (htab->params->ibt)
4300
0
    {
4301
0
      features = GNU_PROPERTY_X86_FEATURE_1_IBT;
4302
0
      htab->params->cet_report &= ~prop_report_ibt;
4303
0
    }
4304
0
  if (htab->params->shstk)
4305
0
    {
4306
0
      features |= GNU_PROPERTY_X86_FEATURE_1_SHSTK;
4307
0
      htab->params->cet_report &= ~prop_report_shstk;
4308
0
    }
4309
0
  if (!(htab->params->cet_report & (prop_report_ibt | prop_report_shstk)))
4310
0
    htab->params->cet_report = prop_report_none;
4311
0
  if (htab->params->lam_u48)
4312
0
    {
4313
0
      features |= (GNU_PROPERTY_X86_FEATURE_1_LAM_U48
4314
0
       | GNU_PROPERTY_X86_FEATURE_1_LAM_U57);
4315
0
      htab->params->lam_u48_report = prop_report_none;
4316
0
      htab->params->lam_u57_report = prop_report_none;
4317
0
    }
4318
0
  else if (htab->params->lam_u57)
4319
0
    {
4320
0
      features |= GNU_PROPERTY_X86_FEATURE_1_LAM_U57;
4321
0
      htab->params->lam_u57_report = prop_report_none;
4322
0
    }
4323
4324
0
  switch (htab->params->isa_level)
4325
0
    {
4326
0
    case 0:
4327
0
      isa_level = 0;
4328
0
      break;
4329
0
    case 1:
4330
0
      isa_level = GNU_PROPERTY_X86_ISA_1_BASELINE;
4331
0
      break;
4332
0
    case 2:
4333
0
      isa_level = GNU_PROPERTY_X86_ISA_1_V2;
4334
0
      break;
4335
0
    case 3:
4336
0
      isa_level = GNU_PROPERTY_X86_ISA_1_V3;
4337
0
      break;
4338
0
    case 4:
4339
0
      isa_level = GNU_PROPERTY_X86_ISA_1_V4;
4340
0
      break;
4341
0
    default:
4342
0
      abort ();
4343
0
    }
4344
4345
0
  if (ebfd != NULL)
4346
0
    {
4347
0
      prop = NULL;
4348
0
      if (features)
4349
0
  {
4350
    /* If features is set, add GNU_PROPERTY_X86_FEATURE_1_IBT,
4351
       GNU_PROPERTY_X86_FEATURE_1_SHSTK,
4352
       GNU_PROPERTY_X86_FEATURE_1_LAM_U48 and
4353
       GNU_PROPERTY_X86_FEATURE_1_LAM_U57.  */
4354
0
    prop = _bfd_elf_get_property (ebfd,
4355
0
          GNU_PROPERTY_X86_FEATURE_1_AND,
4356
0
          4);
4357
0
    prop->u.number |= features;
4358
0
    prop->pr_kind = property_number;
4359
0
  }
4360
4361
0
      if (isa_level)
4362
0
  {
4363
    /* If ISA level is set, add GNU_PROPERTY_X86_ISA_1_NEEDED.  */
4364
0
    prop = _bfd_elf_get_property (ebfd,
4365
0
          GNU_PROPERTY_X86_ISA_1_NEEDED,
4366
0
          4);
4367
0
    prop->u.number |= isa_level;
4368
0
    prop->pr_kind = property_number;
4369
0
  }
4370
4371
      /* Create the GNU property note section if needed.  */
4372
0
      if (prop != NULL && pbfd == NULL)
4373
0
  {
4374
0
    sec = bfd_make_section_with_flags (ebfd,
4375
0
               NOTE_GNU_PROPERTY_SECTION_NAME,
4376
0
               (SEC_ALLOC
4377
0
                | SEC_LOAD
4378
0
                | SEC_IN_MEMORY
4379
0
                | SEC_READONLY
4380
0
                | SEC_HAS_CONTENTS
4381
0
                | SEC_DATA));
4382
0
    if (sec == NULL
4383
0
        || !bfd_set_section_alignment (sec, class_align))
4384
0
      info->callbacks->fatal (_("%P: failed to create %sn"),
4385
0
            NOTE_GNU_PROPERTY_SECTION_NAME);
4386
4387
0
    elf_section_type (sec) = SHT_NOTE;
4388
0
  }
4389
0
    }
4390
4391
0
  bool check_feature_1 = (htab->params->cet_report
4392
0
        || htab->params->lam_u48_report
4393
0
        || htab->params->lam_u57_report);
4394
0
  if (check_feature_1 || htab->params->isa_level_report)
4395
0
    {
4396
      /* Report missing IBT, SHSTK, ISA level and LAM properties.  */
4397
0
      bfd *abfd;
4398
0
      const char *warning_msg = _("%P: %pB: warning: missing %s\n");
4399
0
      const char *error_msg = _("%X%P: %pB: error: missing %s\n");
4400
0
      const char *cet_msg = NULL;
4401
0
      const char *lam_u48_msg = NULL;
4402
0
      const char *lam_u57_msg = NULL;
4403
0
      const char *missing;
4404
0
      elf_property_list *p;
4405
0
      bool missing_ibt, missing_shstk;
4406
0
      bool missing_lam_u48, missing_lam_u57;
4407
0
      bool check_ibt
4408
0
  = (htab->params->cet_report
4409
0
     && (htab->params->cet_report & prop_report_ibt));
4410
0
      bool check_shstk
4411
0
  = (htab->params->cet_report
4412
0
     && (htab->params->cet_report & prop_report_shstk));
4413
0
      bool report_needed_level
4414
0
  = (htab->params->isa_level_report & isa_level_report_needed) != 0;
4415
0
      bool report_used_level
4416
0
  = (htab->params->isa_level_report & isa_level_report_used) != 0;
4417
4418
0
      if (htab->params->cet_report)
4419
0
  {
4420
0
    if ((htab->params->cet_report & prop_report_warning))
4421
0
      cet_msg = warning_msg;
4422
0
    else
4423
0
      cet_msg = error_msg;
4424
0
  }
4425
0
      if (htab->params->lam_u48_report)
4426
0
  {
4427
0
    if ((htab->params->lam_u48_report & prop_report_warning))
4428
0
      lam_u48_msg = warning_msg;
4429
0
    else
4430
0
      lam_u48_msg = error_msg;
4431
0
  }
4432
0
      if (htab->params->lam_u57_report)
4433
0
  {
4434
0
    if ((htab->params->lam_u57_report & prop_report_warning))
4435
0
      lam_u57_msg = warning_msg;
4436
0
    else
4437
0
      lam_u57_msg = error_msg;
4438
0
  }
4439
4440
0
      for (abfd = info->input_bfds; abfd != NULL; abfd = abfd->link.next)
4441
0
  if (!(abfd->flags & (DYNAMIC | BFD_PLUGIN | BFD_LINKER_CREATED))
4442
0
      && bfd_get_flavour (abfd) == bfd_target_elf_flavour)
4443
0
    {
4444
0
      elf_property_list *p_feature_1 = NULL;
4445
0
      elf_property_list *p_isa_1_needed = NULL;
4446
0
      elf_property_list *p_isa_1_used = NULL;
4447
0
      bool find_feature_1 = check_feature_1;
4448
0
      bool find_needed_level = report_needed_level;
4449
0
      bool find_used_level = report_used_level;
4450
4451
0
      for (p = elf_properties (abfd); p; p = p->next)
4452
0
        {
4453
0
    switch (p->property.pr_type)
4454
0
      {
4455
0
      case GNU_PROPERTY_X86_FEATURE_1_AND:
4456
0
        if (find_feature_1)
4457
0
          {
4458
0
      p_feature_1 = p;
4459
0
      find_feature_1 = false;
4460
0
          }
4461
0
        break;
4462
0
      case GNU_PROPERTY_X86_ISA_1_NEEDED:
4463
0
        if (find_needed_level)
4464
0
          {
4465
0
      p_isa_1_needed = p;
4466
0
      find_needed_level = false;
4467
0
          }
4468
0
        break;
4469
0
      case GNU_PROPERTY_X86_ISA_1_USED:
4470
0
        if (find_used_level)
4471
0
          {
4472
0
      p_isa_1_used = p;
4473
0
      find_used_level = false;
4474
0
          }
4475
0
        break;
4476
0
      default:
4477
0
        break;
4478
0
      }
4479
4480
0
    if (!find_feature_1
4481
0
        && !find_needed_level
4482
0
        && !find_used_level)
4483
0
      break;
4484
0
        }
4485
4486
4487
0
      missing_ibt = check_ibt;
4488
0
      missing_shstk = check_shstk;
4489
0
      missing_lam_u48 = !!lam_u48_msg;
4490
0
      missing_lam_u57 = !!lam_u57_msg;
4491
0
      if (p_feature_1)
4492
0
        {
4493
0
    missing_ibt &= !(p_feature_1->property.u.number
4494
0
         & GNU_PROPERTY_X86_FEATURE_1_IBT);
4495
0
    missing_shstk &= !(p_feature_1->property.u.number
4496
0
           & GNU_PROPERTY_X86_FEATURE_1_SHSTK);
4497
0
    missing_lam_u48 &= !(p_feature_1->property.u.number
4498
0
             & GNU_PROPERTY_X86_FEATURE_1_LAM_U48);
4499
0
    missing_lam_u57 &= !(p_feature_1->property.u.number
4500
0
             & GNU_PROPERTY_X86_FEATURE_1_LAM_U57);
4501
0
        }
4502
0
      if (missing_ibt || missing_shstk)
4503
0
        {
4504
0
    if (missing_ibt && missing_shstk)
4505
0
      missing = _("IBT and SHSTK properties");
4506
0
    else if (missing_ibt)
4507
0
      missing = _("IBT property");
4508
0
    else
4509
0
      missing = _("SHSTK property");
4510
0
    info->callbacks->einfo (cet_msg, abfd, missing);
4511
0
        }
4512
0
      if (missing_lam_u48)
4513
0
        {
4514
0
    missing = _("LAM_U48 property");
4515
0
    info->callbacks->einfo (lam_u48_msg, abfd, missing);
4516
0
        }
4517
0
      if (missing_lam_u57)
4518
0
        {
4519
0
    missing = _("LAM_U57 property");
4520
0
    info->callbacks->einfo (lam_u57_msg, abfd, missing);
4521
0
        }
4522
4523
0
      if (p_isa_1_needed)
4524
0
        report_isa_level (info, abfd,
4525
0
        p_isa_1_needed->property.u.number,
4526
0
        true);
4527
0
      if (p_isa_1_used)
4528
0
        report_isa_level (info, abfd,
4529
0
        p_isa_1_used->property.u.number,
4530
0
        false);
4531
0
    }
4532
0
    }
4533
4534
0
  pbfd = _bfd_elf_link_setup_gnu_properties (info);
4535
4536
0
  htab->r_info = init_table->r_info;
4537
0
  htab->r_sym = init_table->r_sym;
4538
4539
0
  if (bfd_link_relocatable (info))
4540
0
    return pbfd;
4541
4542
0
  htab->plt0_pad_byte = init_table->plt0_pad_byte;
4543
4544
0
  use_ibt_plt = htab->params->ibtplt || htab->params->ibt;
4545
0
  if (!use_ibt_plt && pbfd != NULL)
4546
0
    {
4547
      /* Check if GNU_PROPERTY_X86_FEATURE_1_IBT is on.  */
4548
0
      elf_property_list *p;
4549
4550
      /* The property list is sorted in order of type.  */
4551
0
      for (p = elf_properties (pbfd); p; p = p->next)
4552
0
  {
4553
0
    if (GNU_PROPERTY_X86_FEATURE_1_AND == p->property.pr_type)
4554
0
      {
4555
0
        use_ibt_plt = !!(p->property.u.number
4556
0
             & GNU_PROPERTY_X86_FEATURE_1_IBT);
4557
0
        break;
4558
0
      }
4559
0
    else if (GNU_PROPERTY_X86_FEATURE_1_AND < p->property.pr_type)
4560
0
      break;
4561
0
  }
4562
0
    }
4563
4564
0
  dynobj = htab->elf.dynobj;
4565
4566
  /* Set htab->elf.dynobj here so that there is no need to check and
4567
     set it in check_relocs.  */
4568
0
  if (dynobj == NULL)
4569
0
    {
4570
0
      if (pbfd != NULL)
4571
0
  {
4572
0
    htab->elf.dynobj = pbfd;
4573
0
    dynobj = pbfd;
4574
0
  }
4575
0
      else
4576
0
  {
4577
0
    bfd *abfd;
4578
4579
    /* Find a normal input file to hold linker created
4580
       sections.  */
4581
0
    for (abfd = info->input_bfds;
4582
0
         abfd != NULL;
4583
0
         abfd = abfd->link.next)
4584
0
      if (bfd_get_flavour (abfd) == bfd_target_elf_flavour
4585
0
    && (abfd->flags
4586
0
        & (DYNAMIC | BFD_LINKER_CREATED | BFD_PLUGIN)) == 0
4587
0
    && bed->relocs_compatible (abfd->xvec,
4588
0
             info->output_bfd->xvec))
4589
0
        {
4590
0
    htab->elf.dynobj = abfd;
4591
0
    dynobj = abfd;
4592
0
    break;
4593
0
        }
4594
0
  }
4595
0
    }
4596
4597
  /* Return if there are no normal input files.  */
4598
0
  if (dynobj == NULL)
4599
0
    return pbfd;
4600
4601
  /* Even when lazy binding is disabled by "-z now", the PLT0 entry may
4602
     still be used with LD_AUDIT or LD_PROFILE if PLT entry is used for
4603
     canonical function address.  */
4604
0
  htab->plt.has_plt0 = 1;
4605
0
  htab->plt.plt_indirect_branch_offset = 0;
4606
0
  normal_target = htab->elf.target_os == is_normal;
4607
4608
0
  if (normal_target)
4609
0
    {
4610
0
      if (use_ibt_plt)
4611
0
  {
4612
0
    htab->lazy_plt = init_table->lazy_ibt_plt;
4613
0
    htab->non_lazy_plt = init_table->non_lazy_ibt_plt;
4614
0
    htab->plt.plt_indirect_branch_offset = 4;
4615
0
  }
4616
0
      else
4617
0
  {
4618
0
    htab->lazy_plt = init_table->lazy_plt;
4619
0
    htab->non_lazy_plt = init_table->non_lazy_plt;
4620
0
  }
4621
0
    }
4622
0
  else
4623
0
    {
4624
0
      htab->lazy_plt = init_table->lazy_plt;
4625
0
      htab->non_lazy_plt = NULL;
4626
0
    }
4627
4628
0
  pltsec = htab->elf.splt;
4629
4630
0
  if (htab->non_lazy_plt != NULL
4631
0
      && (!htab->plt.has_plt0 || pltsec == NULL))
4632
0
    lazy_plt = false;
4633
0
  else
4634
0
    lazy_plt = true;
4635
4636
0
  if (normal_target)
4637
0
    {
4638
0
      if (use_ibt_plt)
4639
0
  {
4640
0
    if (lazy_plt)
4641
0
      htab->sframe_plt = init_table->sframe_lazy_ibt_plt;
4642
0
    else
4643
0
      htab->sframe_plt = init_table->sframe_non_lazy_ibt_plt;
4644
0
  }
4645
0
      else
4646
0
  {
4647
0
    if (lazy_plt)
4648
0
      htab->sframe_plt = init_table->sframe_lazy_plt;
4649
0
    else
4650
0
      htab->sframe_plt = init_table->sframe_non_lazy_plt;
4651
0
  }
4652
0
    }
4653
0
  else if (lazy_plt)
4654
0
    htab->sframe_plt = init_table->sframe_lazy_plt;
4655
0
  else
4656
0
    htab->sframe_plt = NULL;
4657
4658
  /* If the non-lazy PLT is available, use it for all PLT entries if
4659
     there are no PLT0 or no .plt section.  */
4660
0
  if (!lazy_plt)
4661
0
    {
4662
0
      if (bfd_link_pic (info))
4663
0
  htab->plt.plt_entry = htab->non_lazy_plt->pic_plt_entry;
4664
0
      else
4665
0
  htab->plt.plt_entry = htab->non_lazy_plt->plt_entry;
4666
0
      htab->plt.plt_entry_size = htab->non_lazy_plt->plt_entry_size;
4667
0
      htab->plt.plt_got_offset = htab->non_lazy_plt->plt_got_offset;
4668
0
      htab->plt.plt_got_insn_size
4669
0
  = htab->non_lazy_plt->plt_got_insn_size;
4670
0
      htab->plt.eh_frame_plt_size
4671
0
  = htab->non_lazy_plt->eh_frame_plt_size;
4672
0
      htab->plt.eh_frame_plt = htab->non_lazy_plt->eh_frame_plt;
4673
0
    }
4674
0
  else
4675
0
    {
4676
0
      if (bfd_link_pic (info))
4677
0
  {
4678
0
    htab->plt.plt0_entry = htab->lazy_plt->pic_plt0_entry;
4679
0
    htab->plt.plt_entry = htab->lazy_plt->pic_plt_entry;
4680
0
  }
4681
0
      else
4682
0
  {
4683
0
    htab->plt.plt0_entry = htab->lazy_plt->plt0_entry;
4684
0
    htab->plt.plt_entry = htab->lazy_plt->plt_entry;
4685
0
  }
4686
0
      htab->plt.plt_entry_size = htab->lazy_plt->plt_entry_size;
4687
0
      htab->plt.plt_got_offset = htab->lazy_plt->plt_got_offset;
4688
0
      htab->plt.plt_got_insn_size
4689
0
  = htab->lazy_plt->plt_got_insn_size;
4690
0
      htab->plt.eh_frame_plt_size
4691
0
  = htab->lazy_plt->eh_frame_plt_size;
4692
0
      htab->plt.eh_frame_plt = htab->lazy_plt->eh_frame_plt;
4693
0
    }
4694
4695
0
#ifdef OBJ_MAYBE_ELF_VXWORKS
4696
0
  if (htab->elf.target_os == is_vxworks
4697
0
      && !elf_vxworks_create_dynamic_sections (dynobj, info,
4698
0
                 &htab->srelplt2))
4699
0
    {
4700
0
      info->callbacks->fatal (_("%P: failed to create VxWorks dynamic sections\n"));
4701
0
      return pbfd;
4702
0
    }
4703
0
#endif /* OBJ_MAYBE_ELF_VXWORKS */
4704
4705
  /* Since create_dynamic_sections isn't always called, but GOT
4706
     relocations need GOT relocations, create them here so that we
4707
     don't need to do it in check_relocs.  */
4708
0
  if (htab->elf.sgot == NULL
4709
0
      && !_bfd_elf_create_got_section (dynobj, info))
4710
0
    info->callbacks->fatal (_("%P: failed to create GOT sections\n"));
4711
4712
0
  got_align = (bed->target_id == X86_64_ELF_DATA) ? 3 : 2;
4713
4714
  /* Align .got and .got.plt sections to their entry size.  Do it here
4715
     instead of in create_dynamic_sections so that they are always
4716
     properly aligned even if create_dynamic_sections isn't called.  */
4717
0
  sec = htab->elf.sgot;
4718
0
  if (!bfd_set_section_alignment (sec, got_align))
4719
0
    abort ();
4720
4721
0
  sec = htab->elf.sgotplt;
4722
0
  if (!bfd_set_section_alignment (sec, got_align))
4723
0
    abort ();
4724
4725
  /* Create the ifunc sections here so that check_relocs can be
4726
     simplified.  */
4727
0
  if (!_bfd_elf_create_ifunc_sections (dynobj, info))
4728
0
    info->callbacks->fatal (_("%P: failed to create ifunc sections\n"));
4729
4730
0
  plt_alignment = bfd_log2 (htab->plt.plt_entry_size);
4731
4732
0
  if (pltsec != NULL)
4733
0
    {
4734
      /* Whe creating executable, set the contents of the .interp
4735
   section to the interpreter.  */
4736
0
      asection *s = htab->elf.interp;
4737
0
      if (s != NULL)
4738
0
  {
4739
0
    s->size = htab->dynamic_interpreter_size;
4740
0
    s->contents = (unsigned char *) htab->dynamic_interpreter;
4741
0
    s->alloced = 1;
4742
0
  }
4743
4744
0
      if (normal_target)
4745
0
  {
4746
0
    flagword pltflags = (bed->dynamic_sec_flags
4747
0
             | SEC_ALLOC
4748
0
             | SEC_CODE
4749
0
             | SEC_LOAD
4750
0
             | SEC_READONLY);
4751
0
    unsigned int non_lazy_plt_alignment
4752
0
      = bfd_log2 (htab->non_lazy_plt->plt_entry_size);
4753
4754
0
    sec = pltsec;
4755
0
    if (!bfd_set_section_alignment (sec, plt_alignment))
4756
0
      abort ();
4757
4758
    /* Create the GOT procedure linkage table.  */
4759
0
    sec = bfd_make_section_anyway_with_flags (dynobj,
4760
0
                ".plt.got",
4761
0
                pltflags);
4762
0
    if (sec == NULL
4763
0
        || !bfd_set_section_alignment (sec, non_lazy_plt_alignment))
4764
0
      info->callbacks->fatal (_("%P: failed to create GOT PLT section\n"));
4765
4766
0
    htab->plt_got = sec;
4767
4768
0
    if (lazy_plt)
4769
0
      {
4770
0
        sec = NULL;
4771
4772
0
        if (use_ibt_plt)
4773
0
    {
4774
      /* Create the second PLT for Intel IBT support.  IBT
4775
         PLT is needed only for lazy binding.  */
4776
0
      sec = bfd_make_section_anyway_with_flags (dynobj,
4777
0
                  ".plt.sec",
4778
0
                  pltflags);
4779
0
      if (sec == NULL
4780
0
          || !bfd_set_section_alignment (sec, plt_alignment))
4781
0
        info->callbacks->fatal (_("%P: failed to create IBT-enabled PLT section\n"));
4782
0
    }
4783
4784
0
        htab->plt_second = sec;
4785
0
      }
4786
0
  }
4787
4788
0
      sec = bfd_make_section_anyway_with_flags
4789
0
  (dynobj, bed->rela_plts_and_copies_p ? ".rela.tls" : ".rel.tls",
4790
0
   bed->dynamic_sec_flags | SEC_READONLY);
4791
0
      if (sec == NULL
4792
0
    || !bfd_set_section_alignment (sec, bed->s->log_file_align))
4793
0
  return false;
4794
0
      htab->rel_tls_desc = sec;
4795
4796
0
      if (!info->no_ld_generated_unwind_info)
4797
0
  {
4798
0
    flagword flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY
4799
0
          | SEC_HAS_CONTENTS | SEC_IN_MEMORY
4800
0
          | SEC_LINKER_CREATED);
4801
4802
0
    sec = bfd_make_section_anyway_with_flags (dynobj,
4803
0
                ".eh_frame",
4804
0
                flags);
4805
0
    if (sec == NULL
4806
0
        || !bfd_set_section_alignment (sec, class_align))
4807
0
      info->callbacks->fatal (_("%P: failed to create PLT .eh_frame section\n"));
4808
4809
0
    htab->plt_eh_frame = sec;
4810
4811
0
    if (htab->plt_got != NULL)
4812
0
      {
4813
0
        sec = bfd_make_section_anyway_with_flags (dynobj,
4814
0
              ".eh_frame",
4815
0
              flags);
4816
0
        if (sec == NULL
4817
0
      || !bfd_set_section_alignment (sec, class_align))
4818
0
    info->callbacks->fatal (_("%P: failed to create GOT PLT .eh_frame section\n"));
4819
4820
0
        htab->plt_got_eh_frame = sec;
4821
0
      }
4822
4823
0
    if (htab->plt_second != NULL)
4824
0
      {
4825
0
        sec = bfd_make_section_anyway_with_flags (dynobj,
4826
0
              ".eh_frame",
4827
0
              flags);
4828
0
        if (sec == NULL
4829
0
      || !bfd_set_section_alignment (sec, class_align))
4830
0
    info->callbacks->fatal (_("%P: failed to create the second PLT .eh_frame section\n"));
4831
4832
0
        htab->plt_second_eh_frame = sec;
4833
0
      }
4834
0
  }
4835
4836
      /* Create .sframe section for .plt section.  SFrame sections are
4837
   supported for AMD64 ABI only.  Further, do not make SFrame sections
4838
   for dynobj unconditionally.  If there are no SFrame sections for any
4839
   input files, skip creating the linker created SFrame sections too.
4840
   Since SFrame sections are marked KEEP, prohibiting these
4841
   linker-created SFrame sections, when unnecessary, helps avoid creation
4842
   of empty SFrame sections in the output.  */
4843
0
      bool gen_plt_sframe_p = (_bfd_elf_sframe_present_input_bfds (info)
4844
0
             && !info->discard_sframe
4845
0
             && ABI_64_P (info->output_bfd));
4846
0
      if (gen_plt_sframe_p)
4847
0
  {
4848
0
    flagword flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY
4849
0
          | SEC_HAS_CONTENTS | SEC_IN_MEMORY
4850
0
          | SEC_LINKER_CREATED);
4851
4852
0
    sec = bfd_make_section_anyway_with_flags (dynobj, ".sframe", flags);
4853
0
    if (sec == NULL)
4854
0
      info->callbacks->fatal (_("%P: failed to create PLT .sframe section\n"));
4855
0
    elf_section_type (sec) = SHT_GNU_SFRAME;
4856
4857
    // FIXME check this
4858
    // if (!bfd_set_section_alignment (sec, class_align))
4859
    //  goto error_alignment;
4860
4861
0
    htab->plt_sframe = sec;
4862
4863
    /* Second PLT is generated for Intel IBT + lazy plt.  */
4864
0
    if (htab->plt_second != NULL)
4865
0
      {
4866
0
        sec = bfd_make_section_anyway_with_flags (dynobj,
4867
0
              ".sframe",
4868
0
              flags);
4869
0
        if (sec == NULL)
4870
0
    info->callbacks->fatal (_("%P: failed to create second PLT .sframe section\n"));
4871
0
        elf_section_type (sec) = SHT_GNU_SFRAME;
4872
4873
0
        htab->plt_second_sframe = sec;
4874
0
      }
4875
4876
    /* .plt.got.  */
4877
0
    if (htab->plt_got != NULL)
4878
0
      {
4879
0
        sec = bfd_make_section_anyway_with_flags (dynobj,
4880
0
              ".sframe",
4881
0
              flags);
4882
0
        if (sec == NULL)
4883
0
    info->callbacks->fatal (_("%P: failed to create PLT GOT .sframe section\n"));
4884
0
        elf_section_type (sec) = SHT_GNU_SFRAME;
4885
4886
0
        htab->plt_got_sframe = sec;
4887
0
      }
4888
0
  }
4889
0
    }
4890
4891
  /* The .iplt section is used for IFUNC symbols in static
4892
     executables.  */
4893
0
  sec = htab->elf.iplt;
4894
0
  if (sec != NULL)
4895
0
    {
4896
      /* NB: Delay setting its alignment until we know it is non-empty.
4897
   Otherwise an empty iplt section may change vma and lma of the
4898
   following sections, which triggers moving dot of the following
4899
   section backwards, resulting in a warning and section lma not
4900
   being set properly.  It later leads to a "File truncated"
4901
   error.  */
4902
0
      if (!bfd_set_section_alignment (sec, 0))
4903
0
  abort ();
4904
4905
0
      htab->plt.iplt_alignment = (normal_target
4906
0
          ? plt_alignment
4907
0
          : bed->plt_alignment);
4908
0
    }
4909
4910
0
  if (bfd_link_executable (info)
4911
0
      && !info->nointerp
4912
0
      && !htab->params->has_dynamic_linker
4913
0
      && htab->params->static_before_all_inputs)
4914
0
    {
4915
      /* Report error for dynamic input objects if -static is passed at
4916
   command-line before all input files without --dynamic-linker
4917
   unless --no-dynamic-linker is used.  */
4918
0
      bfd *abfd;
4919
4920
0
      for (abfd = info->input_bfds; abfd != NULL; abfd = abfd->link.next)
4921
0
  if ((abfd->flags & DYNAMIC))
4922
0
    info->callbacks->einfo
4923
0
      (_("%X%P: attempted static link of dynamic object `%pB'\n"),
4924
0
       abfd);
4925
0
    }
4926
4927
0
  return pbfd;
4928
0
}
4929
4930
/* Fix up x86 GNU properties.  */
4931
4932
void
4933
_bfd_x86_elf_link_fixup_gnu_properties
4934
  (struct bfd_link_info *info, elf_property_list **listp)
4935
0
{
4936
0
  elf_property_list *p;
4937
4938
0
  for (p = *listp; p; p = p->next)
4939
0
    {
4940
0
      unsigned int type = p->property.pr_type;
4941
0
      if (type == GNU_PROPERTY_MEMORY_SEAL
4942
0
    || type == GNU_PROPERTY_X86_COMPAT_ISA_1_USED
4943
0
    || type == GNU_PROPERTY_X86_COMPAT_ISA_1_NEEDED
4944
0
    || (type >= GNU_PROPERTY_X86_UINT32_AND_LO
4945
0
        && type <= GNU_PROPERTY_X86_UINT32_AND_HI)
4946
0
    || (type >= GNU_PROPERTY_X86_UINT32_OR_LO
4947
0
        && type <= GNU_PROPERTY_X86_UINT32_OR_HI)
4948
0
    || (type >= GNU_PROPERTY_X86_UINT32_OR_AND_LO
4949
0
        && type <= GNU_PROPERTY_X86_UINT32_OR_AND_HI))
4950
0
  {
4951
0
    if (p->property.u.number == 0
4952
0
        && (type == GNU_PROPERTY_X86_COMPAT_ISA_1_NEEDED
4953
0
      || (type >= GNU_PROPERTY_X86_UINT32_AND_LO
4954
0
          && type <= GNU_PROPERTY_X86_UINT32_AND_HI)
4955
0
      || (type >= GNU_PROPERTY_X86_UINT32_OR_LO
4956
0
          && type <= GNU_PROPERTY_X86_UINT32_OR_HI)))
4957
0
      {
4958
        /* Remove empty property.  */
4959
0
        *listp = p->next;
4960
0
        continue;
4961
0
      }
4962
4963
    /* Keep LAM features only for 64-bit output.  */
4964
0
    if (type == GNU_PROPERTY_X86_FEATURE_1_AND
4965
0
        && !ABI_64_P (info->output_bfd))
4966
0
      p->property.u.number &= ~(GNU_PROPERTY_X86_FEATURE_1_LAM_U48
4967
0
              | GNU_PROPERTY_X86_FEATURE_1_LAM_U57);
4968
4969
0
    listp = &p->next;
4970
0
  }
4971
0
      else if (type > GNU_PROPERTY_HIPROC)
4972
0
  {
4973
    /* The property list is sorted in order of type.  */
4974
0
    break;
4975
0
  }
4976
0
    }
4977
0
}
4978
4979
bool
4980
_bfd_elf_x86_copy_special_section_fields
4981
  (const bfd *ibfd, bfd *obfd ATTRIBUTE_UNUSED,
4982
   const Elf_Internal_Shdr *isection ATTRIBUTE_UNUSED,
4983
   Elf_Internal_Shdr *osection ATTRIBUTE_UNUSED)
4984
71
{
4985
  /* Return false for Solaris binary to properly set the sh_info and
4986
     sh_link fields of Solaris specific sections.  */
4987
71
  return elf_elfheader (ibfd)->e_ident[EI_OSABI] != ELFOSABI_SOLARIS;
4988
71
}
4989
4990
void
4991
bfd_elf_linker_x86_set_options (struct bfd_link_info *info,
4992
        struct elf_linker_x86_params *params)
4993
0
{
4994
0
  elf_backend_data *bed = get_elf_backend_data (info->output_bfd);
4995
0
  struct elf_x86_link_hash_table *htab
4996
0
    = elf_x86_hash_table (info, bed->target_id);
4997
0
  if (htab != NULL)
4998
0
    htab->params = params;
4999
0
}