Coverage Report

Created: 2026-03-10 08:46

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/binutils-gdb/bfd/elf-eh-frame.c
Line
Count
Source
1
/* .eh_frame section optimization.
2
   Copyright (C) 2001-2026 Free Software Foundation, Inc.
3
   Written by Jakub Jelinek <jakub@redhat.com>.
4
5
   This file is part of BFD, the Binary File Descriptor library.
6
7
   This program is free software; you can redistribute it and/or modify
8
   it under the terms of the GNU General Public License as published by
9
   the Free Software Foundation; either version 3 of the License, or
10
   (at your option) any later version.
11
12
   This program is distributed in the hope that it will be useful,
13
   but WITHOUT ANY WARRANTY; without even the implied warranty of
14
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15
   GNU General Public License for more details.
16
17
   You should have received a copy of the GNU General Public License
18
   along with this program; if not, write to the Free Software
19
   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
20
   MA 02110-1301, USA.  */
21
22
#include "sysdep.h"
23
#include "bfd.h"
24
#include "libbfd.h"
25
#include "elf-bfd.h"
26
#include "dwarf2.h"
27
28
0
#define EH_FRAME_HDR_SIZE 8
29
30
struct cie
31
{
32
  unsigned int length;
33
  unsigned int hash;
34
  unsigned char version;
35
  unsigned char local_personality;
36
  char augmentation[20];
37
  bfd_vma code_align;
38
  bfd_signed_vma data_align;
39
  bfd_vma ra_column;
40
  bfd_vma augmentation_size;
41
  union {
42
    struct elf_link_hash_entry *h;
43
    struct {
44
      unsigned int bfd_id;
45
      unsigned int index;
46
    } sym;
47
    unsigned int reloc_index;
48
  } personality;
49
  struct eh_cie_fde *cie_inf;
50
  unsigned char per_encoding;
51
  unsigned char lsda_encoding;
52
  unsigned char fde_encoding;
53
  unsigned char initial_insn_length;
54
  unsigned char can_make_lsda_relative;
55
  unsigned char initial_instructions[50];
56
};
57
58
59
60
/* If *ITER hasn't reached END yet, read the next byte into *RESULT and
61
   move onto the next byte.  Return true on success.  */
62
63
static inline bool
64
read_byte (bfd_byte **iter, bfd_byte *end, unsigned char *result)
65
0
{
66
0
  if (*iter >= end)
67
0
    return false;
68
0
  *result = *((*iter)++);
69
0
  return true;
70
0
}
71
72
/* Move *ITER over LENGTH bytes, or up to END, whichever is closer.
73
   Return true it was possible to move LENGTH bytes.  */
74
75
static inline bool
76
skip_bytes (bfd_byte **iter, bfd_byte *end, bfd_size_type length)
77
0
{
78
0
  if ((bfd_size_type) (end - *iter) < length)
79
0
    {
80
0
      *iter = end;
81
0
      return false;
82
0
    }
83
0
  *iter += length;
84
0
  return true;
85
0
}
86
87
/* Move *ITER over an leb128, stopping at END.  Return true if the end
88
   of the leb128 was found.  */
89
90
static bool
91
skip_leb128 (bfd_byte **iter, bfd_byte *end)
92
0
{
93
0
  unsigned char byte;
94
0
  do
95
0
    if (!read_byte (iter, end, &byte))
96
0
      return false;
97
0
  while (byte & 0x80);
98
0
  return true;
99
0
}
100
101
/* Like skip_leb128, but treat the leb128 as an unsigned value and
102
   store it in *VALUE.  */
103
104
static bool
105
read_uleb128 (bfd_byte **iter, bfd_byte *end, bfd_vma *value)
106
0
{
107
0
  bfd_byte *start, *p;
108
109
0
  start = *iter;
110
0
  if (!skip_leb128 (iter, end))
111
0
    return false;
112
113
0
  p = *iter;
114
0
  *value = *--p;
115
0
  while (p > start)
116
0
    *value = (*value << 7) | (*--p & 0x7f);
117
118
0
  return true;
119
0
}
120
121
/* Like read_uleb128, but for signed values.  */
122
123
static bool
124
read_sleb128 (bfd_byte **iter, bfd_byte *end, bfd_signed_vma *value)
125
0
{
126
0
  bfd_byte *start, *p;
127
128
0
  start = *iter;
129
0
  if (!skip_leb128 (iter, end))
130
0
    return false;
131
132
0
  p = *iter;
133
0
  *value = ((*--p & 0x7f) ^ 0x40) - 0x40;
134
0
  while (p > start)
135
0
    *value = (*value << 7) | (*--p & 0x7f);
136
137
0
  return true;
138
0
}
139
140
/* Return 0 if either encoding is variable width, or not yet known to bfd.  */
141
142
static
143
int get_DW_EH_PE_width (int encoding, int ptr_size)
144
0
{
145
  /* DW_EH_PE_ values of 0x60 and 0x70 weren't defined at the time .eh_frame
146
     was added to bfd.  */
147
0
  if ((encoding & 0x60) == 0x60)
148
0
    return 0;
149
150
0
  switch (encoding & 7)
151
0
    {
152
0
    case DW_EH_PE_udata2: return 2;
153
0
    case DW_EH_PE_udata4: return 4;
154
0
    case DW_EH_PE_udata8: return 8;
155
0
    case DW_EH_PE_absptr: return ptr_size;
156
0
    default:
157
0
      break;
158
0
    }
159
160
0
  return 0;
161
0
}
162
163
0
#define get_DW_EH_PE_signed(encoding) (((encoding) & DW_EH_PE_signed) != 0)
164
165
/* Read a width sized value from memory.  */
166
167
static bfd_vma
168
read_value (bfd *abfd, bfd_byte *buf, int width, int is_signed)
169
0
{
170
0
  bfd_vma value;
171
172
0
  switch (width)
173
0
    {
174
0
    case 2:
175
0
      if (is_signed)
176
0
  value = bfd_get_signed_16 (abfd, buf);
177
0
      else
178
0
  value = bfd_get_16 (abfd, buf);
179
0
      break;
180
0
    case 4:
181
0
      if (is_signed)
182
0
  value = bfd_get_signed_32 (abfd, buf);
183
0
      else
184
0
  value = bfd_get_32 (abfd, buf);
185
0
      break;
186
0
    case 8:
187
0
      if (is_signed)
188
0
  value = bfd_get_signed_64 (abfd, buf);
189
0
      else
190
0
  value = bfd_get_64 (abfd, buf);
191
0
      break;
192
0
    default:
193
0
      BFD_FAIL ();
194
0
      return 0;
195
0
    }
196
197
0
  return value;
198
0
}
199
200
/* Store a width sized value to memory.  */
201
202
static void
203
write_value (bfd *abfd, bfd_byte *buf, bfd_vma value, int width)
204
0
{
205
0
  switch (width)
206
0
    {
207
0
    case 2: bfd_put_16 (abfd, value, buf); break;
208
0
    case 4: bfd_put_32 (abfd, value, buf); break;
209
0
    case 8: bfd_put_64 (abfd, value, buf); break;
210
0
    default: BFD_FAIL ();
211
0
    }
212
0
}
213
214
/* Return one if C1 and C2 CIEs can be merged.  */
215
216
static int
217
cie_eq (const void *e1, const void *e2)
218
0
{
219
0
  const struct cie *c1 = (const struct cie *) e1;
220
0
  const struct cie *c2 = (const struct cie *) e2;
221
222
0
  if (c1->hash == c2->hash
223
0
      && c1->length == c2->length
224
0
      && c1->version == c2->version
225
0
      && c1->local_personality == c2->local_personality
226
0
      && strcmp (c1->augmentation, c2->augmentation) == 0
227
0
      && strcmp (c1->augmentation, "eh") != 0
228
0
      && c1->code_align == c2->code_align
229
0
      && c1->data_align == c2->data_align
230
0
      && c1->ra_column == c2->ra_column
231
0
      && c1->augmentation_size == c2->augmentation_size
232
0
      && memcmp (&c1->personality, &c2->personality,
233
0
     sizeof (c1->personality)) == 0
234
0
      && (c1->cie_inf->u.cie.u.sec->output_section
235
0
    == c2->cie_inf->u.cie.u.sec->output_section)
236
0
      && c1->per_encoding == c2->per_encoding
237
0
      && c1->lsda_encoding == c2->lsda_encoding
238
0
      && c1->fde_encoding == c2->fde_encoding
239
0
      && c1->initial_insn_length == c2->initial_insn_length
240
0
      && c1->initial_insn_length <= sizeof (c1->initial_instructions)
241
0
      && memcmp (c1->initial_instructions,
242
0
     c2->initial_instructions,
243
0
     c1->initial_insn_length) == 0)
244
0
    return 1;
245
246
0
  return 0;
247
0
}
248
249
static hashval_t
250
cie_hash (const void *e)
251
0
{
252
0
  const struct cie *c = (const struct cie *) e;
253
0
  return c->hash;
254
0
}
255
256
static hashval_t
257
cie_compute_hash (struct cie *c)
258
0
{
259
0
  hashval_t h = 0;
260
0
  size_t len;
261
0
  h = iterative_hash_object (c->length, h);
262
0
  h = iterative_hash_object (c->version, h);
263
0
  h = iterative_hash (c->augmentation, strlen (c->augmentation) + 1, h);
264
0
  h = iterative_hash_object (c->code_align, h);
265
0
  h = iterative_hash_object (c->data_align, h);
266
0
  h = iterative_hash_object (c->ra_column, h);
267
0
  h = iterative_hash_object (c->augmentation_size, h);
268
0
  h = iterative_hash_object (c->personality, h);
269
0
  h = iterative_hash_object (c->cie_inf->u.cie.u.sec->output_section, h);
270
0
  h = iterative_hash_object (c->per_encoding, h);
271
0
  h = iterative_hash_object (c->lsda_encoding, h);
272
0
  h = iterative_hash_object (c->fde_encoding, h);
273
0
  h = iterative_hash_object (c->initial_insn_length, h);
274
0
  len = c->initial_insn_length;
275
0
  if (len > sizeof (c->initial_instructions))
276
0
    len = sizeof (c->initial_instructions);
277
0
  h = iterative_hash (c->initial_instructions, len, h);
278
0
  c->hash = h;
279
0
  return h;
280
0
}
281
282
/* Return the number of extra bytes that we'll be inserting into
283
   ENTRY's augmentation string.  */
284
285
static inline unsigned int
286
extra_augmentation_string_bytes (struct eh_cie_fde *entry)
287
0
{
288
0
  unsigned int size = 0;
289
0
  if (entry->cie)
290
0
    {
291
0
      if (entry->add_augmentation_size)
292
0
  size++;
293
0
      if (entry->u.cie.add_fde_encoding)
294
0
  size++;
295
0
    }
296
0
  return size;
297
0
}
298
299
/* Likewise ENTRY's augmentation data.  */
300
301
static inline unsigned int
302
extra_augmentation_data_bytes (struct eh_cie_fde *entry)
303
0
{
304
0
  unsigned int size = 0;
305
0
  if (entry->add_augmentation_size)
306
0
    size++;
307
0
  if (entry->cie && entry->u.cie.add_fde_encoding)
308
0
    size++;
309
0
  return size;
310
0
}
311
312
/* Return the size that ENTRY will have in the output.  */
313
314
static unsigned int
315
size_of_output_cie_fde (struct eh_cie_fde *entry)
316
0
{
317
0
  if (entry->removed)
318
0
    return 0;
319
0
  if (entry->size == 4)
320
0
    return 4;
321
0
  return (entry->size
322
0
    + extra_augmentation_string_bytes (entry)
323
0
    + extra_augmentation_data_bytes (entry));
324
0
}
325
326
/* Return the offset of the FDE or CIE after ENT.  */
327
328
static unsigned int
329
next_cie_fde_offset (const struct eh_cie_fde *ent,
330
         const struct eh_cie_fde *last,
331
         const asection *sec)
332
0
{
333
0
  while (++ent < last)
334
0
    {
335
0
      if (!ent->removed)
336
0
  return ent->new_offset;
337
0
    }
338
0
  return sec->size;
339
0
}
340
341
/* Assume that the bytes between *ITER and END are CFA instructions.
342
   Try to move *ITER past the first instruction and return true on
343
   success.  ENCODED_PTR_WIDTH gives the width of pointer entries.  */
344
345
static bool
346
skip_cfa_op (bfd_byte **iter, bfd_byte *end, unsigned int encoded_ptr_width)
347
0
{
348
0
  bfd_byte op = 0;
349
0
  bfd_vma length;
350
351
0
  if (!read_byte (iter, end, &op))
352
0
    return false;
353
354
0
  switch (op & 0xc0 ? op & 0xc0 : op)
355
0
    {
356
0
    case DW_CFA_nop:
357
0
    case DW_CFA_advance_loc:
358
0
    case DW_CFA_restore:
359
0
    case DW_CFA_remember_state:
360
0
    case DW_CFA_restore_state:
361
0
    case DW_CFA_GNU_window_save:
362
0
    case DW_CFA_AARCH64_negate_ra_state_with_pc:
363
      /* No arguments.  */
364
0
      return true;
365
366
0
    case DW_CFA_offset:
367
0
    case DW_CFA_restore_extended:
368
0
    case DW_CFA_undefined:
369
0
    case DW_CFA_same_value:
370
0
    case DW_CFA_def_cfa_register:
371
0
    case DW_CFA_def_cfa_offset:
372
0
    case DW_CFA_def_cfa_offset_sf:
373
0
    case DW_CFA_GNU_args_size:
374
      /* One leb128 argument.  */
375
0
      return skip_leb128 (iter, end);
376
377
0
    case DW_CFA_val_offset:
378
0
    case DW_CFA_val_offset_sf:
379
0
    case DW_CFA_offset_extended:
380
0
    case DW_CFA_register:
381
0
    case DW_CFA_def_cfa:
382
0
    case DW_CFA_offset_extended_sf:
383
0
    case DW_CFA_GNU_negative_offset_extended:
384
0
    case DW_CFA_def_cfa_sf:
385
      /* Two leb128 arguments.  */
386
0
      return (skip_leb128 (iter, end)
387
0
        && skip_leb128 (iter, end));
388
389
0
    case DW_CFA_def_cfa_expression:
390
      /* A variable-length argument.  */
391
0
      return (read_uleb128 (iter, end, &length)
392
0
        && skip_bytes (iter, end, length));
393
394
0
    case DW_CFA_expression:
395
0
    case DW_CFA_val_expression:
396
      /* A leb128 followed by a variable-length argument.  */
397
0
      return (skip_leb128 (iter, end)
398
0
        && read_uleb128 (iter, end, &length)
399
0
        && skip_bytes (iter, end, length));
400
401
0
    case DW_CFA_set_loc:
402
0
      return skip_bytes (iter, end, encoded_ptr_width);
403
404
0
    case DW_CFA_advance_loc1:
405
0
      return skip_bytes (iter, end, 1);
406
407
0
    case DW_CFA_advance_loc2:
408
0
      return skip_bytes (iter, end, 2);
409
410
0
    case DW_CFA_advance_loc4:
411
0
      return skip_bytes (iter, end, 4);
412
413
0
    case DW_CFA_MIPS_advance_loc8:
414
0
      return skip_bytes (iter, end, 8);
415
416
0
    default:
417
0
      return false;
418
0
    }
419
0
}
420
421
/* Try to interpret the bytes between BUF and END as CFA instructions.
422
   If every byte makes sense, return a pointer to the first DW_CFA_nop
423
   padding byte, or END if there is no padding.  Return null otherwise.
424
   ENCODED_PTR_WIDTH is as for skip_cfa_op.  */
425
426
static bfd_byte *
427
skip_non_nops (bfd_byte *buf, bfd_byte *end, unsigned int encoded_ptr_width,
428
         unsigned int *set_loc_count)
429
0
{
430
0
  bfd_byte *last;
431
432
0
  last = buf;
433
0
  while (buf < end)
434
0
    if (*buf == DW_CFA_nop)
435
0
      buf++;
436
0
    else
437
0
      {
438
0
  if (*buf == DW_CFA_set_loc)
439
0
    ++*set_loc_count;
440
0
  if (!skip_cfa_op (&buf, end, encoded_ptr_width))
441
0
    return 0;
442
0
  last = buf;
443
0
      }
444
0
  return last;
445
0
}
446
447
/* Convert absolute encoding ENCODING into PC-relative form.
448
   SIZE is the size of a pointer.  */
449
450
static unsigned char
451
make_pc_relative (unsigned char encoding, unsigned int ptr_size)
452
0
{
453
0
  if ((encoding & 0x7f) == DW_EH_PE_absptr)
454
0
    switch (ptr_size)
455
0
      {
456
0
      case 2:
457
0
  encoding |= DW_EH_PE_sdata2;
458
0
  break;
459
0
      case 4:
460
0
  encoding |= DW_EH_PE_sdata4;
461
0
  break;
462
0
      case 8:
463
0
  encoding |= DW_EH_PE_sdata8;
464
0
  break;
465
0
      }
466
0
  return encoding | DW_EH_PE_pcrel;
467
0
}
468
469
/*  Examine each .eh_frame_entry section and discard those
470
    those that are marked SEC_EXCLUDE.  */
471
472
static void
473
bfd_elf_discard_eh_frame_entry (struct eh_frame_hdr_info *hdr_info)
474
0
{
475
0
  unsigned int i;
476
0
  for (i = 0; i < hdr_info->array_count; i++)
477
0
    {
478
0
      if (hdr_info->u.compact.entries[i]->flags & SEC_EXCLUDE)
479
0
  {
480
0
    unsigned int j;
481
0
    for (j = i + 1; j < hdr_info->array_count; j++)
482
0
      hdr_info->u.compact.entries[j-1] = hdr_info->u.compact.entries[j];
483
484
0
    hdr_info->array_count--;
485
0
    hdr_info->u.compact.entries[hdr_info->array_count] = NULL;
486
0
    i--;
487
0
  }
488
0
    }
489
0
}
490
491
/* Add a .eh_frame_entry section.  */
492
493
static void
494
bfd_elf_record_eh_frame_entry (struct eh_frame_hdr_info *hdr_info,
495
         asection *sec)
496
0
{
497
0
  if (hdr_info->array_count == hdr_info->u.compact.allocated_entries)
498
0
    {
499
0
      if (hdr_info->u.compact.allocated_entries == 0)
500
0
  {
501
0
    hdr_info->frame_hdr_is_compact = true;
502
0
    hdr_info->u.compact.allocated_entries = 2;
503
0
    hdr_info->u.compact.entries =
504
0
      bfd_malloc (hdr_info->u.compact.allocated_entries
505
0
      * sizeof (hdr_info->u.compact.entries[0]));
506
0
  }
507
0
      else
508
0
  {
509
0
    hdr_info->u.compact.allocated_entries *= 2;
510
0
    hdr_info->u.compact.entries =
511
0
      bfd_realloc (hdr_info->u.compact.entries,
512
0
       hdr_info->u.compact.allocated_entries
513
0
         * sizeof (hdr_info->u.compact.entries[0]));
514
0
  }
515
516
0
      BFD_ASSERT (hdr_info->u.compact.entries);
517
0
    }
518
519
0
  hdr_info->u.compact.entries[hdr_info->array_count++] = sec;
520
0
}
521
522
/* Parse a .eh_frame_entry section.  Figure out which text section it
523
   references.  */
524
525
bool
526
_bfd_elf_parse_eh_frame_entry (struct bfd_link_info *info,
527
             asection *sec, struct elf_reloc_cookie *cookie)
528
0
{
529
0
  struct elf_link_hash_table *htab;
530
0
  struct eh_frame_hdr_info *hdr_info;
531
0
  unsigned long r_symndx;
532
0
  asection *text_sec;
533
534
0
  htab = elf_hash_table (info);
535
0
  hdr_info = &htab->eh_info;
536
537
0
  if (sec->size == 0
538
0
      || sec->sec_info_type != SEC_INFO_TYPE_NONE)
539
0
    {
540
0
      return true;
541
0
    }
542
543
0
  if (sec->output_section && bfd_is_abs_section (sec->output_section))
544
0
    {
545
      /* At least one of the sections is being discarded from the
546
   link, so we should just ignore them.  */
547
0
      return true;
548
0
    }
549
550
0
  if (cookie->rel == cookie->relend)
551
0
    return false;
552
553
  /* The first relocation is the function start.  */
554
0
  r_symndx = cookie->rel->r_info >> cookie->r_sym_shift;
555
0
  if (r_symndx == STN_UNDEF)
556
0
    return false;
557
558
0
  text_sec = _bfd_elf_section_for_symbol (cookie, r_symndx);
559
560
0
  if (text_sec == NULL)
561
0
    return false;
562
563
0
  elf_section_eh_frame_entry (text_sec) = sec;
564
0
  if (text_sec->output_section
565
0
      && bfd_is_abs_section (text_sec->output_section))
566
0
    sec->flags |= SEC_EXCLUDE;
567
568
0
  sec->sec_info_type = SEC_INFO_TYPE_EH_FRAME_ENTRY;
569
0
  sec->sec_info = text_sec;
570
0
  bfd_elf_record_eh_frame_entry (hdr_info, sec);
571
0
  return true;
572
0
}
573
574
/* Try to parse .eh_frame section SEC, which belongs to ABFD.  Store the
575
   information in the section's sec_info field on success.  COOKIE
576
   describes the relocations in SEC.  */
577
578
void
579
_bfd_elf_parse_eh_frame (bfd *abfd, struct bfd_link_info *info,
580
       asection *sec, struct elf_reloc_cookie *cookie)
581
0
{
582
0
#define REQUIRE(COND)         \
583
0
  do              \
584
0
    if (!(COND))          \
585
0
      goto free_no_table;       \
586
0
  while (0)
587
588
0
  bfd_byte *ehbuf = NULL, *buf, *end;
589
0
  bfd_byte *last_fde;
590
0
  struct eh_cie_fde *this_inf;
591
0
  unsigned int hdr_length, hdr_id;
592
0
  unsigned int cie_count;
593
0
  struct cie *cie, *local_cies = NULL;
594
0
  struct elf_link_hash_table *htab;
595
0
  struct eh_frame_hdr_info *hdr_info;
596
0
  struct eh_frame_sec_info *sec_info = NULL;
597
0
  unsigned int ptr_size;
598
0
  unsigned int num_cies;
599
0
  unsigned int num_entries;
600
0
  elf_gc_mark_hook_fn gc_mark_hook;
601
602
0
  htab = elf_hash_table (info);
603
0
  hdr_info = &htab->eh_info;
604
605
0
  if (sec->size == 0
606
0
      || (sec->flags & SEC_HAS_CONTENTS) == 0
607
0
      || sec->sec_info_type != SEC_INFO_TYPE_NONE)
608
0
    {
609
      /* This file does not contain .eh_frame information or
610
   .eh_frame has already been parsed, as can happen with
611
   --gc-sections.  */
612
0
      return;
613
0
    }
614
615
0
  if (bfd_is_abs_section (sec->output_section))
616
0
    {
617
      /* At least one of the sections is being discarded from the
618
   link, so we should just ignore them.  */
619
0
      return;
620
0
    }
621
622
  /* Read the frame unwind information from abfd.  */
623
624
0
  REQUIRE (_bfd_elf_mmap_section_contents (abfd, sec, &ehbuf));
625
626
  /* If .eh_frame section size doesn't fit into int, we cannot handle
627
     it (it would need to use 64-bit .eh_frame format anyway).  */
628
0
  REQUIRE (sec->size == (unsigned int) sec->size);
629
630
0
  ptr_size = (get_elf_backend_data (abfd)
631
0
        ->elf_backend_eh_frame_address_size (abfd, sec));
632
0
  REQUIRE (ptr_size != 0);
633
634
  /* Go through the section contents and work out how many FDEs and
635
     CIEs there are.  */
636
0
  buf = ehbuf;
637
0
  end = ehbuf + sec->size;
638
0
  num_cies = 0;
639
0
  num_entries = 0;
640
0
  while (buf != end)
641
0
    {
642
0
      num_entries++;
643
644
      /* Read the length of the entry.  */
645
0
      REQUIRE (skip_bytes (&buf, end, 4));
646
0
      hdr_length = bfd_get_32 (abfd, buf - 4);
647
648
      /* 64-bit .eh_frame is not supported.  */
649
0
      REQUIRE (hdr_length != 0xffffffff);
650
0
      if (hdr_length == 0)
651
0
  break;
652
653
0
      REQUIRE (skip_bytes (&buf, end, 4));
654
0
      hdr_id = bfd_get_32 (abfd, buf - 4);
655
0
      if (hdr_id == 0)
656
0
  num_cies++;
657
658
0
      REQUIRE (skip_bytes (&buf, end, hdr_length - 4));
659
0
    }
660
661
0
  sec_info = bfd_zalloc (abfd,
662
0
       (sizeof (struct eh_frame_sec_info)
663
0
        + (num_entries - 1) * sizeof (struct eh_cie_fde)));
664
0
  REQUIRE (sec_info);
665
666
  /* We need to have a "struct cie" for each CIE in this section.  */
667
0
  if (num_cies)
668
0
    {
669
0
      local_cies = (struct cie *) bfd_zmalloc (num_cies * sizeof (*local_cies));
670
0
      REQUIRE (local_cies);
671
0
    }
672
673
  /* FIXME: octets_per_byte.  */
674
0
#define ENSURE_NO_RELOCS(buf)       \
675
0
  while (cookie->rel < cookie->relend      \
676
0
   && (cookie->rel->r_offset      \
677
0
       < (bfd_size_type) ((buf) - ehbuf))) \
678
0
    {             \
679
0
      REQUIRE (cookie->rel->r_info == 0);    \
680
0
      cookie->rel++;          \
681
0
    }
682
683
  /* FIXME: octets_per_byte.  */
684
0
#define SKIP_RELOCS(buf)        \
685
0
  while (cookie->rel < cookie->relend      \
686
0
   && (cookie->rel->r_offset      \
687
0
       < (bfd_size_type) ((buf) - ehbuf))) \
688
0
    cookie->rel++
689
690
  /* FIXME: octets_per_byte.  */
691
0
#define GET_RELOC(buf)          \
692
0
  ((cookie->rel < cookie->relend      \
693
0
    && (cookie->rel->r_offset        \
694
0
  == (bfd_size_type) ((buf) - ehbuf)))   \
695
0
   ? cookie->rel : NULL)
696
697
0
  buf = ehbuf;
698
0
  cie_count = 0;
699
0
  gc_mark_hook = get_elf_backend_data (abfd)->gc_mark_hook;
700
0
  while ((bfd_size_type) (buf - ehbuf) != sec->size)
701
0
    {
702
0
      char *aug;
703
0
      bfd_byte *start, *insns, *insns_end;
704
0
      bfd_size_type length;
705
0
      unsigned int set_loc_count;
706
707
0
      this_inf = sec_info->entry + sec_info->count;
708
0
      last_fde = buf;
709
710
      /* Read the length of the entry.  */
711
0
      REQUIRE (skip_bytes (&buf, ehbuf + sec->size, 4));
712
0
      hdr_length = bfd_get_32 (abfd, buf - 4);
713
714
      /* The CIE/FDE must be fully contained in this input section.  */
715
0
      REQUIRE ((bfd_size_type) (buf - ehbuf) + hdr_length <= sec->size);
716
0
      end = buf + hdr_length;
717
718
0
      this_inf->offset = last_fde - ehbuf;
719
0
      this_inf->size = 4 + hdr_length;
720
0
      this_inf->reloc_index = cookie->rel - cookie->rels;
721
722
0
      if (hdr_length == 0)
723
0
  {
724
    /* A zero-length CIE should only be found at the end of
725
       the section, but allow multiple terminators.  */
726
0
    while (skip_bytes (&buf, ehbuf + sec->size, 4))
727
0
      REQUIRE (bfd_get_32 (abfd, buf - 4) == 0);
728
0
    REQUIRE ((bfd_size_type) (buf - ehbuf) == sec->size);
729
0
    ENSURE_NO_RELOCS (buf);
730
0
    sec_info->count++;
731
0
    break;
732
0
  }
733
734
0
      REQUIRE (skip_bytes (&buf, end, 4));
735
0
      hdr_id = bfd_get_32 (abfd, buf - 4);
736
737
0
      if (hdr_id == 0)
738
0
  {
739
0
    unsigned int initial_insn_length;
740
0
    char *null_byte;
741
742
    /* CIE  */
743
0
    this_inf->cie = 1;
744
745
    /* Point CIE to one of the section-local cie structures.  */
746
0
    cie = local_cies + cie_count++;
747
748
0
    cie->cie_inf = this_inf;
749
0
    cie->length = hdr_length;
750
0
    start = buf;
751
0
    REQUIRE (read_byte (&buf, end, &cie->version));
752
753
    /* Cannot handle unknown versions.  */
754
0
    REQUIRE (cie->version == 1
755
0
       || cie->version == 3
756
0
       || cie->version == 4);
757
0
    null_byte = memchr ((char *) buf, 0, end - buf);
758
0
    REQUIRE (null_byte != NULL);
759
0
    REQUIRE ((size_t) (null_byte - (char *) buf)
760
0
       < sizeof (cie->augmentation));
761
762
0
    strcpy (cie->augmentation, (char *) buf);
763
0
    buf = (bfd_byte *) null_byte + 1;
764
0
    REQUIRE (buf + 1 < end);
765
0
    this_inf->u.cie.aug_str_len = buf - start - 1;
766
0
    ENSURE_NO_RELOCS (buf);
767
0
    if (buf[0] == 'e' && buf[1] == 'h')
768
0
      {
769
        /* GCC < 3.0 .eh_frame CIE */
770
        /* We cannot merge "eh" CIEs because __EXCEPTION_TABLE__
771
     is private to each CIE, so we don't need it for anything.
772
     Just skip it.  */
773
0
        REQUIRE (skip_bytes (&buf, end, ptr_size));
774
0
        SKIP_RELOCS (buf);
775
0
      }
776
0
    if (cie->version >= 4)
777
0
      {
778
0
        REQUIRE (buf + 1 < end);
779
0
        REQUIRE (buf[0] == ptr_size);
780
0
        REQUIRE (buf[1] == 0);
781
0
        buf += 2;
782
0
      }
783
0
    REQUIRE (read_uleb128 (&buf, end, &cie->code_align));
784
0
    REQUIRE (read_sleb128 (&buf, end, &cie->data_align));
785
0
    if (cie->version == 1)
786
0
      {
787
0
        REQUIRE (buf < end);
788
0
        cie->ra_column = *buf++;
789
0
      }
790
0
    else
791
0
      REQUIRE (read_uleb128 (&buf, end, &cie->ra_column));
792
0
    ENSURE_NO_RELOCS (buf);
793
0
    cie->lsda_encoding = DW_EH_PE_omit;
794
0
    cie->fde_encoding = DW_EH_PE_omit;
795
0
    cie->per_encoding = DW_EH_PE_omit;
796
0
    aug = cie->augmentation;
797
0
    if (aug[0] != 'e' || aug[1] != 'h')
798
0
      {
799
0
        if (*aug == 'z')
800
0
    {
801
0
      aug++;
802
0
      REQUIRE (read_uleb128 (&buf, end, &cie->augmentation_size));
803
0
      ENSURE_NO_RELOCS (buf);
804
0
    }
805
806
0
        while (*aug != '\0')
807
0
    switch (*aug++)
808
0
      {
809
0
      case 'B':
810
0
      case 'G':
811
0
        if (abfd->arch_info->arch != bfd_arch_aarch64)
812
0
          goto unrecognized;
813
0
        break;
814
0
      case 'L':
815
0
        REQUIRE (read_byte (&buf, end, &cie->lsda_encoding));
816
0
        ENSURE_NO_RELOCS (buf);
817
0
        REQUIRE (get_DW_EH_PE_width (cie->lsda_encoding, ptr_size));
818
0
        break;
819
0
      case 'R':
820
0
        REQUIRE (read_byte (&buf, end, &cie->fde_encoding));
821
0
        ENSURE_NO_RELOCS (buf);
822
0
        REQUIRE (get_DW_EH_PE_width (cie->fde_encoding, ptr_size));
823
0
        break;
824
0
      case 'S':
825
0
        break;
826
0
      case 'P':
827
0
        {
828
0
          int per_width;
829
830
0
          REQUIRE (read_byte (&buf, end, &cie->per_encoding));
831
0
          per_width = get_DW_EH_PE_width (cie->per_encoding,
832
0
                  ptr_size);
833
0
          REQUIRE (per_width);
834
0
          if ((cie->per_encoding & 0x70) == DW_EH_PE_aligned)
835
0
      {
836
0
        length = -(buf - ehbuf) & (per_width - 1);
837
0
        REQUIRE (skip_bytes (&buf, end, length));
838
0
        if (per_width == 8)
839
0
          this_inf->u.cie.per_encoding_aligned8 = 1;
840
0
      }
841
0
          this_inf->u.cie.personality_offset = buf - start;
842
0
          ENSURE_NO_RELOCS (buf);
843
          /* Ensure we have a reloc here.  */
844
0
          REQUIRE (GET_RELOC (buf));
845
0
          cie->personality.reloc_index
846
0
      = cookie->rel - cookie->rels;
847
          /* Cope with MIPS-style composite relocations.  */
848
0
          do
849
0
      cookie->rel++;
850
0
          while (GET_RELOC (buf) != NULL);
851
0
          REQUIRE (skip_bytes (&buf, end, per_width));
852
0
        }
853
0
        break;
854
0
      unrecognized:
855
0
      default:
856
        /* Unrecognized augmentation. Better bail out.  */
857
0
        goto free_no_table;
858
0
      }
859
0
      }
860
0
    this_inf->u.cie.aug_data_len
861
0
      = buf - start - 1 - this_inf->u.cie.aug_str_len;
862
863
    /* For shared libraries, try to get rid of as many RELATIVE relocs
864
       as possible.  */
865
0
    if (bfd_link_pic (info)
866
0
        && (get_elf_backend_data (abfd)
867
0
      ->elf_backend_can_make_relative_eh_frame
868
0
      (abfd, info, sec)))
869
0
      {
870
0
        if ((cie->fde_encoding & 0x70) == DW_EH_PE_absptr)
871
0
    this_inf->make_relative = 1;
872
        /* If the CIE doesn't already have an 'R' entry, it's fairly
873
     easy to add one, provided that there's no aligned data
874
     after the augmentation string.  */
875
0
        else if (cie->fde_encoding == DW_EH_PE_omit
876
0
           && (cie->per_encoding & 0x70) != DW_EH_PE_aligned)
877
0
    {
878
0
      if (*cie->augmentation == 0)
879
0
        this_inf->add_augmentation_size = 1;
880
0
      this_inf->u.cie.add_fde_encoding = 1;
881
0
      this_inf->make_relative = 1;
882
0
    }
883
884
0
        if ((cie->lsda_encoding & 0x70) == DW_EH_PE_absptr)
885
0
    cie->can_make_lsda_relative = 1;
886
0
      }
887
888
    /* If FDE encoding was not specified, it defaults to
889
       DW_EH_absptr.  */
890
0
    if (cie->fde_encoding == DW_EH_PE_omit)
891
0
      cie->fde_encoding = DW_EH_PE_absptr;
892
893
0
    initial_insn_length = end - buf;
894
0
    cie->initial_insn_length = initial_insn_length;
895
0
    memcpy (cie->initial_instructions, buf,
896
0
      initial_insn_length <= sizeof (cie->initial_instructions)
897
0
      ? initial_insn_length : sizeof (cie->initial_instructions));
898
0
    insns = buf;
899
0
    buf += initial_insn_length;
900
0
    ENSURE_NO_RELOCS (buf);
901
902
0
    if (!bfd_link_relocatable (info))
903
0
      {
904
        /* Keep info for merging cies.  */
905
0
        this_inf->u.cie.u.full_cie = cie;
906
0
        this_inf->u.cie.per_encoding_relative
907
0
    = (cie->per_encoding & 0x70) == DW_EH_PE_pcrel;
908
0
      }
909
0
  }
910
0
      else
911
0
  {
912
    /* Find the corresponding CIE.  */
913
0
    unsigned int cie_offset = this_inf->offset + 4 - hdr_id;
914
0
    for (cie = local_cies; cie < local_cies + cie_count; cie++)
915
0
      if (cie_offset == cie->cie_inf->offset)
916
0
        break;
917
918
    /* Ensure this FDE references one of the CIEs in this input
919
       section.  */
920
0
    REQUIRE (cie != local_cies + cie_count);
921
0
    this_inf->u.fde.cie_inf = cie->cie_inf;
922
0
    this_inf->make_relative = cie->cie_inf->make_relative;
923
0
    this_inf->add_augmentation_size
924
0
      = cie->cie_inf->add_augmentation_size;
925
926
0
    ENSURE_NO_RELOCS (buf);
927
0
    if ((sec->flags & SEC_LINKER_CREATED) == 0 || cookie->rels != NULL)
928
0
      {
929
0
        asection *rsec;
930
931
0
        REQUIRE (GET_RELOC (buf));
932
933
        /* Chain together the FDEs for each section.  */
934
0
        rsec = _bfd_elf_gc_mark_rsec (info, sec, gc_mark_hook,
935
0
              cookie, NULL);
936
        /* RSEC will be NULL if FDE was cleared out as it was belonging to
937
     a discarded SHT_GROUP.  */
938
0
        if (rsec)
939
0
    {
940
0
      REQUIRE (rsec->owner == abfd);
941
0
      this_inf->u.fde.next_for_section = elf_fde_list (rsec);
942
0
      elf_fde_list (rsec) = this_inf;
943
0
    }
944
0
      }
945
946
    /* Skip the initial location and address range.  */
947
0
    start = buf;
948
0
    length = get_DW_EH_PE_width (cie->fde_encoding, ptr_size);
949
0
    REQUIRE (skip_bytes (&buf, end, 2 * length));
950
951
0
    SKIP_RELOCS (buf - length);
952
0
    if (!GET_RELOC (buf - length)
953
0
        && read_value (abfd, buf - length, length, false) == 0)
954
0
      {
955
0
        (*info->callbacks->minfo)
956
    /* xgettext:c-format */
957
0
    (_("discarding zero address range FDE in %pB(%pA).\n"),
958
0
     abfd, sec);
959
0
        this_inf->u.fde.cie_inf = NULL;
960
0
      }
961
962
    /* Skip the augmentation size, if present.  */
963
0
    if (cie->augmentation[0] == 'z')
964
0
      REQUIRE (read_uleb128 (&buf, end, &length));
965
0
    else
966
0
      length = 0;
967
968
    /* Of the supported augmentation characters above, only 'L'
969
       adds augmentation data to the FDE.  This code would need to
970
       be adjusted if any future augmentations do the same thing.  */
971
0
    if (cie->lsda_encoding != DW_EH_PE_omit)
972
0
      {
973
0
        SKIP_RELOCS (buf);
974
0
        if (cie->can_make_lsda_relative && GET_RELOC (buf))
975
0
    cie->cie_inf->u.cie.make_lsda_relative = 1;
976
0
        this_inf->lsda_offset = buf - start;
977
        /* If there's no 'z' augmentation, we don't know where the
978
     CFA insns begin.  Assume no padding.  */
979
0
        if (cie->augmentation[0] != 'z')
980
0
    length = end - buf;
981
0
      }
982
983
    /* Skip over the augmentation data.  */
984
0
    REQUIRE (skip_bytes (&buf, end, length));
985
0
    insns = buf;
986
987
0
    buf = last_fde + 4 + hdr_length;
988
989
    /* For NULL RSEC (cleared FDE belonging to a discarded section)
990
       the relocations are commonly cleared.  We do not sanity check if
991
       all these relocations are cleared as (1) relocations to
992
       .gcc_except_table will remain uncleared (they will get dropped
993
       with the drop of this unused FDE) and (2) BFD already safely drops
994
       relocations of any type to .eh_frame by
995
       elf_section_ignore_discarded_relocs.
996
       TODO: The .gcc_except_table entries should be also filtered as
997
       .eh_frame entries; or GCC could rather use COMDAT for them.  */
998
0
    SKIP_RELOCS (buf);
999
0
  }
1000
1001
      /* Try to interpret the CFA instructions and find the first
1002
   padding nop.  Shrink this_inf's size so that it doesn't
1003
   include the padding.  */
1004
0
      length = get_DW_EH_PE_width (cie->fde_encoding, ptr_size);
1005
0
      set_loc_count = 0;
1006
0
      insns_end = skip_non_nops (insns, end, length, &set_loc_count);
1007
      /* If we don't understand the CFA instructions, we can't know
1008
   what needs to be adjusted there.  */
1009
0
      if (insns_end == NULL
1010
    /* For the time being we don't support DW_CFA_set_loc in
1011
       CIE instructions.  */
1012
0
    || (set_loc_count && this_inf->cie))
1013
0
  goto free_no_table;
1014
0
      this_inf->size -= end - insns_end;
1015
0
      if (insns_end != end && this_inf->cie)
1016
0
  {
1017
0
    cie->initial_insn_length -= end - insns_end;
1018
0
    cie->length -= end - insns_end;
1019
0
  }
1020
0
      if (set_loc_count
1021
0
    && ((cie->fde_encoding & 0x70) == DW_EH_PE_pcrel
1022
0
        || this_inf->make_relative))
1023
0
  {
1024
0
    unsigned int cnt;
1025
0
    bfd_byte *p;
1026
1027
0
    this_inf->set_loc
1028
0
      = bfd_alloc (abfd, (set_loc_count + 1) * sizeof (unsigned int));
1029
0
    REQUIRE (this_inf->set_loc);
1030
0
    this_inf->set_loc[0] = set_loc_count;
1031
0
    p = insns;
1032
0
    cnt = 0;
1033
0
    while (p < end)
1034
0
      {
1035
0
        if (*p == DW_CFA_set_loc)
1036
0
    this_inf->set_loc[++cnt] = p + 1 - start;
1037
0
        REQUIRE (skip_cfa_op (&p, end, length));
1038
0
      }
1039
0
  }
1040
1041
0
      this_inf->removed = 1;
1042
0
      this_inf->fde_encoding = cie->fde_encoding;
1043
0
      this_inf->lsda_encoding = cie->lsda_encoding;
1044
0
      sec_info->count++;
1045
0
    }
1046
0
  BFD_ASSERT (sec_info->count == num_entries);
1047
0
  BFD_ASSERT (cie_count == num_cies);
1048
1049
0
  sec->sec_info = sec_info;
1050
0
  sec->sec_info_type = SEC_INFO_TYPE_EH_FRAME;
1051
0
  if (!bfd_link_relocatable (info))
1052
0
    {
1053
      /* Keep info for merging cies.  */
1054
0
      sec_info->cies = local_cies;
1055
0
      local_cies = NULL;
1056
0
    }
1057
0
  goto success;
1058
1059
0
 free_no_table:
1060
0
  _bfd_error_handler
1061
    /* xgettext:c-format */
1062
0
    (_("error in %pB(%pA); no .eh_frame_hdr table will be created"),
1063
0
     abfd, sec);
1064
0
  hdr_info->u.dwarf.table = false;
1065
0
 success:
1066
0
  _bfd_elf_munmap_section_contents (sec, ehbuf);
1067
0
  free (local_cies);
1068
0
#undef REQUIRE
1069
0
}
1070
1071
/* Order eh_frame_hdr entries by the VMA of their text section.  */
1072
1073
static int
1074
cmp_eh_frame_hdr (const void *a, const void *b)
1075
0
{
1076
0
  bfd_vma text_a;
1077
0
  bfd_vma text_b;
1078
0
  asection *sec;
1079
1080
0
  sec = *(asection *const *)a;
1081
0
  sec = sec->sec_info;
1082
0
  text_a = sec->output_section->vma + sec->output_offset;
1083
0
  sec = *(asection *const *)b;
1084
0
  sec = sec->sec_info;
1085
0
  text_b = sec->output_section->vma + sec->output_offset;
1086
1087
0
  if (text_a < text_b)
1088
0
    return -1;
1089
0
  return text_a > text_b;
1090
1091
0
}
1092
1093
/* Add space for a CANTUNWIND terminator to SEC if the text sections
1094
   referenced by it and NEXT are not contiguous, or NEXT is NULL.  */
1095
1096
static void
1097
add_eh_frame_hdr_terminator (asection *sec,
1098
           asection *next)
1099
0
{
1100
0
  bfd_vma end;
1101
0
  bfd_vma next_start;
1102
0
  asection *text_sec;
1103
1104
0
  if (next)
1105
0
    {
1106
      /* See if there is a gap (presumably a text section without unwind info)
1107
   between these two entries.  */
1108
0
      text_sec = sec->sec_info;
1109
0
      end = text_sec->output_section->vma + text_sec->output_offset
1110
0
      + text_sec->size;
1111
0
      text_sec = next->sec_info;
1112
0
      next_start = text_sec->output_section->vma + text_sec->output_offset;
1113
0
      if (end == next_start)
1114
0
  return;
1115
0
    }
1116
1117
  /* Add space for a CANTUNWIND terminator.  */
1118
0
  if (!sec->rawsize)
1119
0
    sec->rawsize = sec->size;
1120
1121
0
  bfd_set_section_size (sec, sec->size + 8);
1122
0
}
1123
1124
/* Finish a pass over all .eh_frame_entry sections.  */
1125
1126
bool
1127
_bfd_elf_end_eh_frame_parsing (struct bfd_link_info *info)
1128
0
{
1129
0
  struct eh_frame_hdr_info *hdr_info;
1130
0
  unsigned int i;
1131
1132
0
  hdr_info = &elf_hash_table (info)->eh_info;
1133
1134
0
  if (info->eh_frame_hdr_type != COMPACT_EH_HDR
1135
0
      || hdr_info->array_count == 0)
1136
0
    return false;
1137
1138
0
  bfd_elf_discard_eh_frame_entry (hdr_info);
1139
1140
0
  qsort (hdr_info->u.compact.entries, hdr_info->array_count,
1141
0
   sizeof (asection *), cmp_eh_frame_hdr);
1142
1143
0
  for (i = 0; i < hdr_info->array_count - 1; i++)
1144
0
    {
1145
0
      add_eh_frame_hdr_terminator (hdr_info->u.compact.entries[i],
1146
0
           hdr_info->u.compact.entries[i + 1]);
1147
0
    }
1148
1149
  /* Add a CANTUNWIND terminator after the last entry.  */
1150
0
  add_eh_frame_hdr_terminator (hdr_info->u.compact.entries[i], NULL);
1151
0
  return true;
1152
0
}
1153
1154
/* Mark all relocations against CIE or FDE ENT, which occurs in
1155
   .eh_frame section SEC.  COOKIE describes the relocations in SEC;
1156
   its "rel" field can be changed freely.  */
1157
1158
static bool
1159
mark_entry (struct bfd_link_info *info, asection *sec,
1160
      struct eh_cie_fde *ent, elf_gc_mark_hook_fn gc_mark_hook,
1161
      struct elf_reloc_cookie *cookie)
1162
0
{
1163
  /* FIXME: octets_per_byte.  */
1164
0
  for (cookie->rel = cookie->rels + ent->reloc_index;
1165
0
       cookie->rel < cookie->relend
1166
0
   && cookie->rel->r_offset < ent->offset + ent->size;
1167
0
       cookie->rel++)
1168
0
    if (!_bfd_elf_gc_mark_reloc (info, sec, gc_mark_hook, cookie))
1169
0
      return false;
1170
1171
0
  return true;
1172
0
}
1173
1174
/* Mark all the relocations against FDEs that relate to code in input
1175
   section SEC.  The FDEs belong to .eh_frame section EH_FRAME, whose
1176
   relocations are described by COOKIE.  */
1177
1178
bool
1179
_bfd_elf_gc_mark_fdes (struct bfd_link_info *info, asection *sec,
1180
           asection *eh_frame, elf_gc_mark_hook_fn gc_mark_hook,
1181
           struct elf_reloc_cookie *cookie)
1182
0
{
1183
0
  struct eh_cie_fde *fde, *cie;
1184
1185
0
  for (fde = elf_fde_list (sec); fde; fde = fde->u.fde.next_for_section)
1186
0
    {
1187
0
      if (!mark_entry (info, eh_frame, fde, gc_mark_hook, cookie))
1188
0
  return false;
1189
1190
      /* At this stage, all cie_inf fields point to local CIEs, so we
1191
   can use the same cookie to refer to them.  */
1192
0
      cie = fde->u.fde.cie_inf;
1193
0
      if (cie != NULL && !cie->u.cie.gc_mark)
1194
0
  {
1195
0
    cie->u.cie.gc_mark = 1;
1196
0
    if (!mark_entry (info, eh_frame, cie, gc_mark_hook, cookie))
1197
0
      return false;
1198
0
  }
1199
0
    }
1200
0
  return true;
1201
0
}
1202
1203
/* Input section SEC of ABFD is an .eh_frame section that contains the
1204
   CIE described by CIE_INF.  Return a version of CIE_INF that is going
1205
   to be kept in the output, adding CIE_INF to the output if necessary.
1206
1207
   HDR_INFO is the .eh_frame_hdr information and COOKIE describes the
1208
   relocations in REL.  */
1209
1210
static struct eh_cie_fde *
1211
find_merged_cie (bfd *abfd, struct bfd_link_info *info, asection *sec,
1212
     struct eh_frame_hdr_info *hdr_info,
1213
     struct elf_reloc_cookie *cookie,
1214
     struct eh_cie_fde *cie_inf)
1215
0
{
1216
0
  unsigned long r_symndx;
1217
0
  struct cie *cie, *new_cie;
1218
0
  Elf_Internal_Rela *rel;
1219
0
  void **loc;
1220
1221
  /* Use CIE_INF if we have already decided to keep it.  */
1222
0
  if (!cie_inf->removed)
1223
0
    return cie_inf;
1224
1225
  /* If we have merged CIE_INF with another CIE, use that CIE instead.  */
1226
0
  if (cie_inf->u.cie.merged)
1227
0
    return cie_inf->u.cie.u.merged_with;
1228
1229
0
  cie = cie_inf->u.cie.u.full_cie;
1230
1231
  /* Assume we will need to keep CIE_INF.  */
1232
0
  cie_inf->removed = 0;
1233
0
  cie_inf->u.cie.u.sec = sec;
1234
1235
  /* If we are not merging CIEs, use CIE_INF.  */
1236
0
  if (cie == NULL)
1237
0
    return cie_inf;
1238
1239
0
  if (cie->per_encoding != DW_EH_PE_omit)
1240
0
    {
1241
0
      struct elf_link_hash_entry *h;
1242
0
      bool per_binds_local;
1243
1244
      /* Work out the address of personality routine, or at least
1245
   enough info that we could calculate the address had we made a
1246
   final section layout.  The symbol on the reloc is enough,
1247
   either the hash for a global, or (bfd id, index) pair for a
1248
   local.  The assumption here is that no one uses addends on
1249
   the reloc.  */
1250
0
      rel = cookie->rels + cie->personality.reloc_index;
1251
0
      memset (&cie->personality, 0, sizeof (cie->personality));
1252
0
#ifdef BFD64
1253
0
      if (elf_elfheader (abfd)->e_ident[EI_CLASS] == ELFCLASS64)
1254
0
  r_symndx = ELF64_R_SYM (rel->r_info);
1255
0
      else
1256
0
#endif
1257
0
  r_symndx = ELF32_R_SYM (rel->r_info);
1258
1259
0
      if (r_symndx > cookie->num_sym)
1260
0
  return cie_inf;
1261
0
      h = NULL;
1262
0
      if (r_symndx >= cookie->extsymoff)
1263
0
  h = elf_sym_hashes (cookie->abfd)[r_symndx - cookie->extsymoff];
1264
1265
0
      if (h != NULL)
1266
0
  {
1267
0
    while (h->root.type == bfd_link_hash_indirect
1268
0
     || h->root.type == bfd_link_hash_warning)
1269
0
      h = (struct elf_link_hash_entry *) h->root.u.i.link;
1270
1271
0
    cie->personality.h = h;
1272
0
    per_binds_local = SYMBOL_REFERENCES_LOCAL (info, h);
1273
0
  }
1274
0
      else
1275
0
  {
1276
0
    asection *sym_sec = _bfd_get_local_sym_section (cookie, r_symndx);
1277
0
    if (sym_sec == NULL)
1278
0
      return cie_inf;
1279
1280
0
    if (sym_sec->kept_section != NULL)
1281
0
      sym_sec = sym_sec->kept_section;
1282
0
    if (sym_sec->output_section == NULL)
1283
0
      return cie_inf;
1284
1285
0
    cie->local_personality = 1;
1286
0
    cie->personality.sym.bfd_id = abfd->id;
1287
0
    cie->personality.sym.index = r_symndx;
1288
0
    per_binds_local = true;
1289
0
  }
1290
1291
0
      if (per_binds_local
1292
0
    && bfd_link_pic (info)
1293
0
    && (cie->per_encoding & 0x70) == DW_EH_PE_absptr
1294
0
    && (get_elf_backend_data (abfd)
1295
0
        ->elf_backend_can_make_relative_eh_frame (abfd, info, sec)))
1296
0
  {
1297
0
    cie_inf->u.cie.make_per_encoding_relative = 1;
1298
0
    cie_inf->u.cie.per_encoding_relative = 1;
1299
0
  }
1300
0
    }
1301
1302
  /* See if we can merge this CIE with an earlier one.  */
1303
0
  cie_compute_hash (cie);
1304
0
  if (hdr_info->u.dwarf.cies == NULL)
1305
0
    {
1306
0
      hdr_info->u.dwarf.cies = htab_try_create (1, cie_hash, cie_eq, free);
1307
0
      if (hdr_info->u.dwarf.cies == NULL)
1308
0
  return cie_inf;
1309
0
    }
1310
0
  loc = htab_find_slot_with_hash (hdr_info->u.dwarf.cies, cie,
1311
0
          cie->hash, INSERT);
1312
0
  if (loc == NULL)
1313
0
    return cie_inf;
1314
1315
0
  new_cie = (struct cie *) *loc;
1316
0
  if (new_cie == NULL)
1317
0
    {
1318
      /* Keep CIE_INF and record it in the hash table.  */
1319
0
      new_cie = bfd_malloc (sizeof (*new_cie));
1320
0
      if (new_cie == NULL)
1321
0
  return cie_inf;
1322
1323
0
      memcpy (new_cie, cie, sizeof (struct cie));
1324
0
      *loc = new_cie;
1325
0
    }
1326
0
  else
1327
0
    {
1328
      /* Merge CIE_INF with NEW_CIE->CIE_INF.  */
1329
0
      cie_inf->removed = 1;
1330
0
      cie_inf->u.cie.merged = 1;
1331
0
      cie_inf->u.cie.u.merged_with = new_cie->cie_inf;
1332
0
      if (cie_inf->u.cie.make_lsda_relative)
1333
0
  new_cie->cie_inf->u.cie.make_lsda_relative = 1;
1334
0
    }
1335
0
  return new_cie->cie_inf;
1336
0
}
1337
1338
/* For a given OFFSET in SEC, return the delta to the new location
1339
   after .eh_frame editing.  */
1340
1341
static bfd_signed_vma
1342
offset_adjust (bfd_vma offset, const asection *sec)
1343
0
{
1344
0
  struct eh_frame_sec_info *sec_info = sec->sec_info;
1345
0
  unsigned int lo, hi, mid;
1346
0
  struct eh_cie_fde *ent = NULL;
1347
0
  bfd_signed_vma delta;
1348
1349
0
  lo = 0;
1350
0
  hi = sec_info->count;
1351
0
  if (hi == 0)
1352
0
    return 0;
1353
1354
0
  while (lo < hi)
1355
0
    {
1356
0
      mid = (lo + hi) / 2;
1357
0
      ent = &sec_info->entry[mid];
1358
0
      if (offset < ent->offset)
1359
0
  hi = mid;
1360
0
      else if (mid + 1 >= hi)
1361
0
  break;
1362
0
      else if (offset >= ent[1].offset)
1363
0
  lo = mid + 1;
1364
0
      else
1365
0
  break;
1366
0
    }
1367
1368
0
  if (!ent->removed)
1369
0
    delta = (bfd_vma) ent->new_offset - (bfd_vma) ent->offset;
1370
0
  else if (ent->cie && ent->u.cie.merged)
1371
0
    {
1372
0
      struct eh_cie_fde *cie = ent->u.cie.u.merged_with;
1373
0
      delta = ((bfd_vma) cie->new_offset + cie->u.cie.u.sec->output_offset
1374
0
         - (bfd_vma) ent->offset - sec->output_offset);
1375
0
    }
1376
0
  else
1377
0
    {
1378
      /* Is putting the symbol on the next entry best for a deleted
1379
   CIE/FDE?  */
1380
0
      struct eh_cie_fde *last = sec_info->entry + sec_info->count;
1381
0
      delta = ((bfd_vma) next_cie_fde_offset (ent, last, sec)
1382
0
         - (bfd_vma) ent->offset);
1383
0
      return delta;
1384
0
    }
1385
1386
  /* Account for editing within this CIE/FDE.  */
1387
0
  offset -= ent->offset;
1388
0
  if (ent->cie)
1389
0
    {
1390
0
      unsigned int extra
1391
0
  = ent->add_augmentation_size + ent->u.cie.add_fde_encoding;
1392
0
      if (extra == 0
1393
0
    || offset <= 9u + ent->u.cie.aug_str_len)
1394
0
  return delta;
1395
0
      delta += extra;
1396
0
      if (offset <= 9u + ent->u.cie.aug_str_len + ent->u.cie.aug_data_len)
1397
0
  return delta;
1398
0
      delta += extra;
1399
0
    }
1400
0
  else
1401
0
    {
1402
0
      unsigned int ptr_size, width, extra = ent->add_augmentation_size;
1403
0
      if (offset <= 12 || extra == 0)
1404
0
  return delta;
1405
0
      ptr_size = (get_elf_backend_data (sec->owner)
1406
0
      ->elf_backend_eh_frame_address_size (sec->owner, sec));
1407
0
      width = get_DW_EH_PE_width (ent->fde_encoding, ptr_size);
1408
0
      if (offset <= 8 + 2 * width)
1409
0
  return delta;
1410
0
      delta += extra;
1411
0
    }
1412
1413
0
  return delta;
1414
0
}
1415
1416
/* Adjust a global symbol defined in .eh_frame, so that it stays
1417
   relative to its original CIE/FDE.  It is assumed that a symbol
1418
   defined at the beginning of a CIE/FDE belongs to that CIE/FDE
1419
   rather than marking the end of the previous CIE/FDE.  This matters
1420
   when a CIE is merged with a previous CIE, since the symbol is
1421
   moved to the merged CIE.  */
1422
1423
bool
1424
_bfd_elf_adjust_eh_frame_global_symbol (struct elf_link_hash_entry *h,
1425
          void *arg ATTRIBUTE_UNUSED)
1426
0
{
1427
0
  asection *sym_sec;
1428
0
  bfd_signed_vma delta;
1429
1430
0
  if (h->root.type != bfd_link_hash_defined
1431
0
      && h->root.type != bfd_link_hash_defweak)
1432
0
    return true;
1433
1434
0
  sym_sec = h->root.u.def.section;
1435
0
  if (sym_sec->sec_info_type != SEC_INFO_TYPE_EH_FRAME
1436
0
      || sym_sec->sec_info == NULL)
1437
0
    return true;
1438
1439
0
  delta = offset_adjust (h->root.u.def.value, sym_sec);
1440
0
  h->root.u.def.value += delta;
1441
1442
0
  return true;
1443
0
}
1444
1445
/* The same for all local symbols defined in .eh_frame.  Returns the
1446
   local symbols if any symbol was changed.  */
1447
1448
static Elf_Internal_Sym *
1449
adjust_eh_frame_local_symbols (const asection *sec,
1450
             struct elf_reloc_cookie *cookie)
1451
0
{
1452
0
  bfd *abfd = cookie->abfd;
1453
0
  unsigned int *loc_shndx = elf_loc_shndx (abfd);
1454
0
  unsigned int shndx = elf_section_data (sec)->this_idx;
1455
1456
0
  if (loc_shndx != NULL)
1457
0
    {
1458
0
      unsigned int i;
1459
1460
0
      for (i = 1; i < cookie->locsymcount; i++)
1461
0
  if (loc_shndx[i] == shndx)
1462
0
    break;
1463
0
      if (i >= cookie->locsymcount)
1464
0
  return NULL;
1465
0
    }
1466
1467
0
  Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (abfd);
1468
0
  Elf_Internal_Sym *locsyms = bfd_elf_get_elf_syms (abfd, symtab_hdr,
1469
0
                cookie->locsymcount, 0,
1470
0
                NULL, NULL, NULL);
1471
0
  if (locsyms == NULL)
1472
0
    return NULL;
1473
1474
0
  bool adjusted = false;
1475
0
  Elf_Internal_Sym *sym;
1476
0
  Elf_Internal_Sym *end_sym = locsyms + cookie->locsymcount;
1477
0
  for (sym = locsyms + 1; sym < end_sym; ++sym)
1478
0
    if (sym->st_info <= ELF_ST_INFO (STB_LOCAL, STT_OBJECT)
1479
0
  && sym->st_shndx == shndx)
1480
0
      {
1481
0
  bfd_signed_vma delta = offset_adjust (sym->st_value, sec);
1482
1483
0
  if (delta != 0)
1484
0
    {
1485
0
      adjusted = true;
1486
0
      sym->st_value += delta;
1487
0
    }
1488
0
      }
1489
0
  if (adjusted)
1490
0
    return locsyms;
1491
0
  free (locsyms);
1492
0
  return NULL;
1493
0
}
1494
1495
/* This function is called for each input file before the .eh_frame
1496
   section is relocated.  It discards duplicate CIEs and FDEs for
1497
   discarded functions.  The function returns 0 when no changes are
1498
   made, 1 when .eh_frame data has been edited and 2 when the editing
1499
   results in a section size change.  */
1500
1501
int
1502
_bfd_elf_discard_section_eh_frame
1503
   (bfd *abfd, struct bfd_link_info *info, asection *sec,
1504
    bool (*reloc_symbol_deleted_p) (bfd_vma, void *),
1505
    struct elf_reloc_cookie *cookie)
1506
0
{
1507
0
  struct eh_cie_fde *ent;
1508
0
  struct eh_frame_sec_info *sec_info;
1509
0
  struct eh_frame_hdr_info *hdr_info;
1510
0
  unsigned int ptr_size, offset, eh_alignment;
1511
0
  int changed;
1512
1513
0
  if (sec->sec_info_type != SEC_INFO_TYPE_EH_FRAME)
1514
0
    return false;
1515
1516
0
  sec_info = sec->sec_info;
1517
0
  if (sec_info == NULL)
1518
0
    return false;
1519
1520
0
  ptr_size = (get_elf_backend_data (sec->owner)
1521
0
        ->elf_backend_eh_frame_address_size (sec->owner, sec));
1522
1523
0
  hdr_info = &elf_hash_table (info)->eh_info;
1524
0
  for (ent = sec_info->entry; ent < sec_info->entry + sec_info->count; ++ent)
1525
0
    if (ent->size == 4)
1526
      /* There should only be one zero terminator, on the last input
1527
   file supplying .eh_frame (crtend.o).  Remove any others.  */
1528
0
      ent->removed = sec->map_head.s != NULL;
1529
0
    else if (!ent->cie && ent->u.fde.cie_inf != NULL)
1530
0
      {
1531
0
  bool keep;
1532
0
  if ((sec->flags & SEC_LINKER_CREATED) != 0 && cookie->rels == NULL)
1533
0
    {
1534
0
      unsigned int width
1535
0
        = get_DW_EH_PE_width (ent->fde_encoding, ptr_size);
1536
0
      bfd_vma value
1537
0
        = read_value (abfd, sec->contents + ent->offset + 8 + width,
1538
0
          width, get_DW_EH_PE_signed (ent->fde_encoding));
1539
0
      keep = value != 0;
1540
0
    }
1541
0
  else
1542
0
    {
1543
0
      cookie->rel = cookie->rels + ent->reloc_index;
1544
      /* FIXME: octets_per_byte.  */
1545
0
      BFD_ASSERT (cookie->rel < cookie->relend
1546
0
      && cookie->rel->r_offset == ent->offset + 8);
1547
0
      keep = !(*reloc_symbol_deleted_p) (ent->offset + 8, cookie);
1548
0
    }
1549
0
  if (keep)
1550
0
    {
1551
0
      if (bfd_link_pic (info)
1552
0
    && (((ent->fde_encoding & 0x70) == DW_EH_PE_absptr
1553
0
         && ent->make_relative == 0)
1554
0
        || (ent->fde_encoding & 0x70) == DW_EH_PE_aligned))
1555
0
        {
1556
0
    static int num_warnings_issued = 0;
1557
1558
    /* If a shared library uses absolute pointers
1559
       which we cannot turn into PC relative,
1560
       don't create the binary search table,
1561
       since it is affected by runtime relocations.  */
1562
0
    hdr_info->u.dwarf.table = false;
1563
    /* Only warn if --eh-frame-hdr was specified.  */
1564
0
    if (info->eh_frame_hdr_type != 0)
1565
0
      {
1566
0
        if (num_warnings_issued < 10)
1567
0
          {
1568
0
      _bfd_error_handler
1569
        /* xgettext:c-format */
1570
0
        (_("FDE encoding in %pB(%pA) prevents .eh_frame_hdr"
1571
0
           " table being created"), abfd, sec);
1572
0
      num_warnings_issued ++;
1573
0
          }
1574
0
        else if (num_warnings_issued == 10)
1575
0
          {
1576
0
      _bfd_error_handler
1577
0
        (_("further warnings about FDE encoding preventing .eh_frame_hdr generation dropped"));
1578
0
      num_warnings_issued ++;
1579
0
          }
1580
0
      }
1581
0
        }
1582
0
      ent->removed = 0;
1583
0
      hdr_info->u.dwarf.fde_count++;
1584
0
      ent->u.fde.cie_inf = find_merged_cie (abfd, info, sec, hdr_info,
1585
0
              cookie, ent->u.fde.cie_inf);
1586
0
    }
1587
0
      }
1588
1589
0
  free (sec_info->cies);
1590
0
  sec_info->cies = NULL;
1591
1592
  /* It may be that some .eh_frame input section has greater alignment
1593
     than other .eh_frame sections.  In that case we run the risk of
1594
     padding with zeros before that section, which would be seen as a
1595
     zero terminator.  Alignment padding must be added *inside* the
1596
     last FDE instead.  For other FDEs we align according to their
1597
     encoding, in order to align FDE address range entries naturally.  */
1598
0
  offset = 0;
1599
0
  changed = 0;
1600
0
  for (ent = sec_info->entry; ent < sec_info->entry + sec_info->count; ++ent)
1601
0
    if (!ent->removed)
1602
0
      {
1603
0
  eh_alignment = 4;
1604
0
  if (ent->size == 4)
1605
0
    ;
1606
0
  else if (ent->cie)
1607
0
    {
1608
0
      if (ent->u.cie.per_encoding_aligned8)
1609
0
        eh_alignment = 8;
1610
0
    }
1611
0
  else
1612
0
    {
1613
0
      eh_alignment = get_DW_EH_PE_width (ent->fde_encoding, ptr_size);
1614
0
      if (eh_alignment < 4)
1615
0
        eh_alignment = 4;
1616
0
    }
1617
0
  offset = (offset + eh_alignment - 1) & -eh_alignment;
1618
0
  ent->new_offset = offset;
1619
0
  if (ent->new_offset != ent->offset)
1620
0
    changed = 1;
1621
0
  offset += size_of_output_cie_fde (ent);
1622
0
      }
1623
1624
0
  eh_alignment = 4;
1625
0
  offset = (offset + eh_alignment - 1) & -eh_alignment;
1626
0
  if (sec->rawsize == 0)
1627
0
    sec->rawsize = sec->size;
1628
0
  if (sec->size != offset)
1629
0
    changed = 2;
1630
0
  sec->size = offset;
1631
1632
0
  if (changed)
1633
0
    {
1634
0
      Elf_Internal_Sym *locsyms = adjust_eh_frame_local_symbols (sec, cookie);
1635
0
      if (locsyms != NULL)
1636
0
  {
1637
0
    Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (abfd);
1638
0
    symtab_hdr->contents = (unsigned char *) locsyms;
1639
0
  }
1640
0
    }
1641
0
  return changed;
1642
0
}
1643
1644
/* This function is called for .eh_frame_hdr section after
1645
   _bfd_elf_discard_section_eh_frame has been called on all .eh_frame
1646
   input sections.  It finalizes the size of .eh_frame_hdr section.  */
1647
1648
bool
1649
_bfd_elf_discard_section_eh_frame_hdr (struct bfd_link_info *info)
1650
0
{
1651
0
  struct elf_link_hash_table *htab;
1652
0
  struct eh_frame_hdr_info *hdr_info;
1653
0
  asection *sec;
1654
1655
0
  htab = elf_hash_table (info);
1656
0
  hdr_info = &htab->eh_info;
1657
1658
0
  if (!hdr_info->frame_hdr_is_compact && hdr_info->u.dwarf.cies != NULL)
1659
0
    {
1660
0
      htab_delete (hdr_info->u.dwarf.cies);
1661
0
      hdr_info->u.dwarf.cies = NULL;
1662
0
    }
1663
1664
0
  if (info->eh_frame_hdr_type == 0
1665
0
      || bfd_link_relocatable (info))
1666
0
    return false;
1667
1668
0
  sec = hdr_info->hdr_sec;
1669
0
  if (sec == NULL)
1670
0
    return false;
1671
1672
0
  if (info->eh_frame_hdr_type == COMPACT_EH_HDR)
1673
0
    {
1674
      /* For compact frames we only add the header.  The actual table comes
1675
   from the .eh_frame_entry sections.  */
1676
0
      sec->size = 8;
1677
0
    }
1678
0
  else
1679
0
    {
1680
0
      sec->size = EH_FRAME_HDR_SIZE;
1681
0
      if (hdr_info->u.dwarf.table)
1682
0
  sec->size += 4 + hdr_info->u.dwarf.fde_count * 8;
1683
0
    }
1684
1685
0
  return true;
1686
0
}
1687
1688
/* Return true if there is at least one non-empty .eh_frame section in
1689
   input files.  Can only be called after ld has mapped input to
1690
   output sections, and before sections are stripped.  */
1691
1692
bool
1693
_bfd_elf_eh_frame_present (struct bfd_link_info *info)
1694
0
{
1695
0
  asection *eh = bfd_get_section_by_name (info->output_bfd, ".eh_frame");
1696
1697
0
  if (eh == NULL)
1698
0
    return false;
1699
1700
  /* Count only sections which have at least a single CIE or FDE.
1701
     There cannot be any CIE or FDE <= 8 bytes.  */
1702
0
  for (eh = eh->map_head.s; eh != NULL; eh = eh->map_head.s)
1703
0
    if (eh->size > 8)
1704
0
      return true;
1705
1706
0
  return false;
1707
0
}
1708
1709
/* Return true if there is at least one .eh_frame_entry section in
1710
   input files.  */
1711
1712
bool
1713
_bfd_elf_eh_frame_entry_present (struct bfd_link_info *info)
1714
0
{
1715
0
  asection *o;
1716
0
  bfd *abfd;
1717
1718
0
  for (abfd = info->input_bfds; abfd != NULL; abfd = abfd->link.next)
1719
0
    {
1720
0
      for (o = abfd->sections; o; o = o->next)
1721
0
  {
1722
0
    const char *name = bfd_section_name (o);
1723
1724
0
    if (strcmp (name, ".eh_frame_entry")
1725
0
        && !bfd_is_abs_section (o->output_section))
1726
0
      return true;
1727
0
  }
1728
0
    }
1729
0
  return false;
1730
0
}
1731
1732
/* This function is called from size_dynamic_sections.
1733
   It needs to decide whether .eh_frame_hdr should be output or not,
1734
   because when the dynamic symbol table has been sized it is too late
1735
   to strip sections.  */
1736
1737
bool
1738
_bfd_elf_maybe_strip_eh_frame_hdr (struct bfd_link_info *info)
1739
0
{
1740
0
  struct elf_link_hash_table *htab;
1741
0
  struct eh_frame_hdr_info *hdr_info;
1742
0
  struct bfd_link_hash_entry *bh = NULL;
1743
0
  struct elf_link_hash_entry *h;
1744
1745
0
  htab = elf_hash_table (info);
1746
0
  hdr_info = &htab->eh_info;
1747
0
  if (hdr_info->hdr_sec == NULL)
1748
0
    return true;
1749
1750
0
  if (bfd_is_abs_section (hdr_info->hdr_sec->output_section)
1751
0
      || info->eh_frame_hdr_type == 0
1752
0
      || (info->eh_frame_hdr_type == DWARF2_EH_HDR
1753
0
    && !_bfd_elf_eh_frame_present (info))
1754
0
      || (info->eh_frame_hdr_type == COMPACT_EH_HDR
1755
0
    && !_bfd_elf_eh_frame_entry_present (info)))
1756
0
    {
1757
0
      hdr_info->hdr_sec->flags |= SEC_EXCLUDE;
1758
0
      hdr_info->hdr_sec = NULL;
1759
0
      return true;
1760
0
    }
1761
1762
  /* Add a hidden symbol so that systems without access to PHDRs can
1763
     find the table.  */
1764
0
  if (! (_bfd_generic_link_add_one_symbol
1765
0
   (info, info->output_bfd, "__GNU_EH_FRAME_HDR", BSF_LOCAL,
1766
0
    hdr_info->hdr_sec, 0, NULL, false, false, &bh)))
1767
0
    return false;
1768
1769
0
  h = (struct elf_link_hash_entry *) bh;
1770
0
  h->def_regular = 1;
1771
0
  h->other = STV_HIDDEN;
1772
0
  get_elf_backend_data
1773
0
    (info->output_bfd)->elf_backend_hide_symbol (info, h, true);
1774
1775
0
  if (!hdr_info->frame_hdr_is_compact)
1776
0
    hdr_info->u.dwarf.table = true;
1777
0
  return true;
1778
0
}
1779
1780
/* Adjust an address in the .eh_frame section.  Given OFFSET within
1781
   SEC, this returns the new offset in the adjusted .eh_frame section,
1782
   or -1 if the address refers to a CIE/FDE which has been removed
1783
   or to offset with dynamic relocation which is no longer needed.  */
1784
1785
bfd_vma
1786
_bfd_elf_eh_frame_section_offset (bfd *output_bfd ATTRIBUTE_UNUSED,
1787
          struct bfd_link_info *info ATTRIBUTE_UNUSED,
1788
          asection *sec,
1789
          bfd_vma offset)
1790
0
{
1791
0
  struct eh_frame_sec_info *sec_info;
1792
0
  unsigned int lo, hi, mid;
1793
1794
0
  if (sec->sec_info_type != SEC_INFO_TYPE_EH_FRAME)
1795
0
    return offset;
1796
0
  sec_info = sec->sec_info;
1797
1798
0
  if (offset >= sec->rawsize)
1799
0
    return offset - sec->rawsize + sec->size;
1800
1801
0
  lo = 0;
1802
0
  hi = sec_info->count;
1803
0
  mid = 0;
1804
0
  while (lo < hi)
1805
0
    {
1806
0
      mid = (lo + hi) / 2;
1807
0
      if (offset < sec_info->entry[mid].offset)
1808
0
  hi = mid;
1809
0
      else if (offset
1810
0
         >= sec_info->entry[mid].offset + sec_info->entry[mid].size)
1811
0
  lo = mid + 1;
1812
0
      else
1813
0
  break;
1814
0
    }
1815
1816
0
  BFD_ASSERT (lo < hi);
1817
1818
  /* FDE or CIE was removed.  */
1819
0
  if (sec_info->entry[mid].removed)
1820
0
    return (bfd_vma) -1;
1821
1822
  /* If converting personality pointers to DW_EH_PE_pcrel, there will be
1823
     no need for run-time relocation against the personality field.  */
1824
0
  if (sec_info->entry[mid].cie
1825
0
      && sec_info->entry[mid].u.cie.make_per_encoding_relative
1826
0
      && offset == (sec_info->entry[mid].offset + 8
1827
0
        + sec_info->entry[mid].u.cie.personality_offset))
1828
0
    return (bfd_vma) -2;
1829
1830
  /* If converting to DW_EH_PE_pcrel, there will be no need for run-time
1831
     relocation against FDE's initial_location field.  */
1832
0
  if (!sec_info->entry[mid].cie
1833
0
      && sec_info->entry[mid].make_relative
1834
0
      && offset == sec_info->entry[mid].offset + 8)
1835
0
    return (bfd_vma) -2;
1836
1837
  /* If converting LSDA pointers to DW_EH_PE_pcrel, there will be no need
1838
     for run-time relocation against LSDA field.  */
1839
0
  if (!sec_info->entry[mid].cie
1840
0
      && sec_info->entry[mid].u.fde.cie_inf->u.cie.make_lsda_relative
1841
0
      && offset == (sec_info->entry[mid].offset + 8
1842
0
        + sec_info->entry[mid].lsda_offset))
1843
0
    return (bfd_vma) -2;
1844
1845
  /* If converting to DW_EH_PE_pcrel, there will be no need for run-time
1846
     relocation against DW_CFA_set_loc's arguments.  */
1847
0
  if (sec_info->entry[mid].set_loc
1848
0
      && sec_info->entry[mid].make_relative
1849
0
      && (offset >= sec_info->entry[mid].offset + 8
1850
0
        + sec_info->entry[mid].set_loc[1]))
1851
0
    {
1852
0
      unsigned int cnt;
1853
1854
0
      for (cnt = 1; cnt <= sec_info->entry[mid].set_loc[0]; cnt++)
1855
0
  if (offset == sec_info->entry[mid].offset + 8
1856
0
          + sec_info->entry[mid].set_loc[cnt])
1857
0
    return (bfd_vma) -2;
1858
0
    }
1859
1860
  /* Any new augmentation bytes go before the first relocation.  */
1861
0
  return (offset + sec_info->entry[mid].new_offset
1862
0
    - sec_info->entry[mid].offset
1863
0
    + extra_augmentation_string_bytes (sec_info->entry + mid)
1864
0
    + extra_augmentation_data_bytes (sec_info->entry + mid));
1865
0
}
1866
1867
/* Write out .eh_frame_entry section.  Add CANTUNWIND terminator if needed.
1868
   Also check that the contents look sane.  */
1869
1870
bool
1871
_bfd_elf_write_section_eh_frame_entry (bfd *abfd, struct bfd_link_info *info,
1872
               asection *sec, bfd_byte *contents)
1873
0
{
1874
0
  elf_backend_data *bed;
1875
0
  bfd_byte cantunwind[8];
1876
0
  bfd_vma addr;
1877
0
  bfd_vma last_addr;
1878
0
  bfd_vma offset;
1879
0
  asection *text_sec = sec->sec_info;
1880
1881
0
  if (!sec->rawsize)
1882
0
    sec->rawsize = sec->size;
1883
1884
0
  BFD_ASSERT (sec->sec_info_type == SEC_INFO_TYPE_EH_FRAME_ENTRY);
1885
1886
  /* Check to make sure that the text section corresponding to this eh_frame_entry
1887
     section has not been excluded.  In particular, mips16 stub entries will be
1888
     excluded outside of the normal process.  */
1889
0
  if (sec->flags & SEC_EXCLUDE
1890
0
      || text_sec->flags & SEC_EXCLUDE)
1891
0
    return true;
1892
1893
0
  if (!bfd_set_section_contents (abfd, sec->output_section, contents,
1894
0
         sec->output_offset, sec->rawsize))
1895
0
      return false;
1896
1897
0
  last_addr = bfd_get_signed_32 (abfd, contents);
1898
  /* Check that all the entries are in order.  */
1899
0
  for (offset = 8; offset < sec->rawsize; offset += 8)
1900
0
    {
1901
0
      addr = bfd_get_signed_32 (abfd, contents + offset) + offset;
1902
0
      if (addr <= last_addr)
1903
0
  {
1904
    /* xgettext:c-format */
1905
0
    _bfd_error_handler (_("%pB: %pA not in order"), sec->owner, sec);
1906
0
    return false;
1907
0
  }
1908
1909
0
      last_addr = addr;
1910
0
    }
1911
1912
0
  addr = text_sec->output_section->vma + text_sec->output_offset
1913
0
   + text_sec->size;
1914
0
  addr &= ~1;
1915
0
  addr -= (sec->output_section->vma + sec->output_offset + sec->rawsize);
1916
0
  if (addr & 1)
1917
0
    {
1918
      /* xgettext:c-format */
1919
0
      _bfd_error_handler (_("%pB: %pA invalid input section size"),
1920
0
        sec->owner, sec);
1921
0
      bfd_set_error (bfd_error_bad_value);
1922
0
      return false;
1923
0
    }
1924
0
  if (last_addr >= addr + sec->rawsize)
1925
0
    {
1926
      /* xgettext:c-format */
1927
0
      _bfd_error_handler (_("%pB: %pA points past end of text section"),
1928
0
        sec->owner, sec);
1929
0
      bfd_set_error (bfd_error_bad_value);
1930
0
      return false;
1931
0
    }
1932
1933
0
  if (sec->size == sec->rawsize)
1934
0
    return true;
1935
1936
0
  bed = get_elf_backend_data (abfd);
1937
0
  BFD_ASSERT (sec->size == sec->rawsize + 8);
1938
0
  BFD_ASSERT ((addr & 1) == 0);
1939
0
  BFD_ASSERT (bed->cant_unwind_opcode);
1940
1941
0
  bfd_put_32 (abfd, addr, cantunwind);
1942
0
  bfd_put_32 (abfd, (*bed->cant_unwind_opcode) (info), cantunwind + 4);
1943
0
  return bfd_set_section_contents (abfd, sec->output_section, cantunwind,
1944
0
           sec->output_offset + sec->rawsize, 8);
1945
0
}
1946
1947
/* Write out .eh_frame section.  This is called with the relocated
1948
   contents.  */
1949
1950
bool
1951
_bfd_elf_write_section_eh_frame (bfd *abfd,
1952
         struct bfd_link_info *info,
1953
         asection *sec,
1954
         bfd_byte *contents)
1955
0
{
1956
0
  struct eh_frame_sec_info *sec_info;
1957
0
  struct elf_link_hash_table *htab;
1958
0
  struct eh_frame_hdr_info *hdr_info;
1959
0
  unsigned int ptr_size;
1960
0
  struct eh_cie_fde *ent, *last_ent;
1961
1962
0
  if (sec->sec_info_type != SEC_INFO_TYPE_EH_FRAME)
1963
    /* FIXME: octets_per_byte.  */
1964
0
    return bfd_set_section_contents (abfd, sec->output_section, contents,
1965
0
             sec->output_offset, sec->size);
1966
1967
0
  ptr_size = (get_elf_backend_data (abfd)
1968
0
        ->elf_backend_eh_frame_address_size (abfd, sec));
1969
0
  BFD_ASSERT (ptr_size != 0);
1970
1971
0
  sec_info = sec->sec_info;
1972
0
  htab = elf_hash_table (info);
1973
0
  hdr_info = &htab->eh_info;
1974
1975
0
  if (hdr_info->u.dwarf.table && hdr_info->u.dwarf.array == NULL)
1976
0
    {
1977
0
      hdr_info->frame_hdr_is_compact = false;
1978
0
      hdr_info->u.dwarf.array = (struct eh_frame_array_ent *)
1979
0
  bfd_malloc (hdr_info->u.dwarf.fde_count
1980
0
        * sizeof (*hdr_info->u.dwarf.array));
1981
0
    }
1982
0
  if (hdr_info->u.dwarf.array == NULL)
1983
0
    hdr_info = NULL;
1984
1985
  /* The new offsets can be bigger or smaller than the original offsets.
1986
     We therefore need to make two passes over the section: one backward
1987
     pass to move entries up and one forward pass to move entries down.
1988
     The two passes won't interfere with each other because entries are
1989
     not reordered  */
1990
0
  for (ent = sec_info->entry + sec_info->count; ent-- != sec_info->entry;)
1991
0
    if (!ent->removed && ent->new_offset > ent->offset)
1992
0
      memmove (contents + ent->new_offset, contents + ent->offset, ent->size);
1993
1994
0
  for (ent = sec_info->entry; ent < sec_info->entry + sec_info->count; ++ent)
1995
0
    if (!ent->removed && ent->new_offset < ent->offset)
1996
0
      memmove (contents + ent->new_offset, contents + ent->offset, ent->size);
1997
1998
0
  last_ent = sec_info->entry + sec_info->count;
1999
0
  for (ent = sec_info->entry; ent < last_ent; ++ent)
2000
0
    {
2001
0
      unsigned char *buf, *end;
2002
0
      unsigned int new_size;
2003
2004
0
      if (ent->removed)
2005
0
  continue;
2006
2007
0
      if (ent->size == 4)
2008
0
  {
2009
    /* Any terminating FDE must be at the end of the section.  */
2010
0
    BFD_ASSERT (ent == last_ent - 1);
2011
0
    continue;
2012
0
  }
2013
2014
0
      buf = contents + ent->new_offset;
2015
0
      end = buf + ent->size;
2016
0
      new_size = next_cie_fde_offset (ent, last_ent, sec) - ent->new_offset;
2017
2018
      /* Update the size.  It may be shrinked.  */
2019
0
      bfd_put_32 (abfd, new_size - 4, buf);
2020
2021
      /* Filling the extra bytes with DW_CFA_nops.  */
2022
0
      if (new_size != ent->size)
2023
0
  memset (end, 0, new_size - ent->size);
2024
2025
0
      if (ent->cie)
2026
0
  {
2027
    /* CIE */
2028
0
    if (ent->make_relative
2029
0
        || ent->u.cie.make_lsda_relative
2030
0
        || ent->u.cie.per_encoding_relative)
2031
0
      {
2032
0
        char *aug;
2033
0
        unsigned int version, action, extra_string, extra_data;
2034
0
        unsigned int per_width, per_encoding;
2035
2036
        /* Need to find 'R' or 'L' augmentation's argument and modify
2037
     DW_EH_PE_* value.  */
2038
0
        action = ((ent->make_relative ? 1 : 0)
2039
0
      | (ent->u.cie.make_lsda_relative ? 2 : 0)
2040
0
      | (ent->u.cie.per_encoding_relative ? 4 : 0));
2041
0
        extra_string = extra_augmentation_string_bytes (ent);
2042
0
        extra_data = extra_augmentation_data_bytes (ent);
2043
2044
        /* Skip length, id.  */
2045
0
        buf += 8;
2046
0
        version = *buf++;
2047
0
        aug = (char *) buf;
2048
0
        buf += strlen (aug) + 1;
2049
0
        skip_leb128 (&buf, end);
2050
0
        skip_leb128 (&buf, end);
2051
0
        if (version == 1)
2052
0
    skip_bytes (&buf, end, 1);
2053
0
        else
2054
0
    skip_leb128 (&buf, end);
2055
0
        if (*aug == 'z')
2056
0
    {
2057
      /* The uleb128 will always be a single byte for the kind
2058
         of augmentation strings that we're prepared to handle.  */
2059
0
      *buf++ += extra_data;
2060
0
      aug++;
2061
0
    }
2062
2063
        /* Make room for the new augmentation string and data bytes.  */
2064
0
        memmove (buf + extra_string + extra_data, buf, end - buf);
2065
0
        memmove (aug + extra_string, aug, buf - (bfd_byte *) aug);
2066
0
        buf += extra_string;
2067
0
        end += extra_string + extra_data;
2068
2069
0
        if (ent->add_augmentation_size)
2070
0
    {
2071
0
      *aug++ = 'z';
2072
0
      *buf++ = extra_data - 1;
2073
0
    }
2074
0
        if (ent->u.cie.add_fde_encoding)
2075
0
    {
2076
0
      BFD_ASSERT (action & 1);
2077
0
      *aug++ = 'R';
2078
0
      *buf++ = make_pc_relative (DW_EH_PE_absptr, ptr_size);
2079
0
      action &= ~1;
2080
0
    }
2081
2082
0
        while (action)
2083
0
    switch (*aug++)
2084
0
      {
2085
0
      case 'L':
2086
0
        if (action & 2)
2087
0
          {
2088
0
      BFD_ASSERT (*buf == ent->lsda_encoding);
2089
0
      *buf = make_pc_relative (*buf, ptr_size);
2090
0
      action &= ~2;
2091
0
          }
2092
0
        buf++;
2093
0
        break;
2094
0
      case 'P':
2095
0
        if (ent->u.cie.make_per_encoding_relative)
2096
0
          *buf = make_pc_relative (*buf, ptr_size);
2097
0
        per_encoding = *buf++;
2098
0
        per_width = get_DW_EH_PE_width (per_encoding, ptr_size);
2099
0
        BFD_ASSERT (per_width != 0);
2100
0
        BFD_ASSERT (((per_encoding & 0x70) == DW_EH_PE_pcrel)
2101
0
        == ent->u.cie.per_encoding_relative);
2102
0
        if ((per_encoding & 0x70) == DW_EH_PE_aligned)
2103
0
          buf = (contents
2104
0
           + ((buf - contents + per_width - 1)
2105
0
        & ~((bfd_size_type) per_width - 1)));
2106
0
        if (action & 4)
2107
0
          {
2108
0
      bfd_vma val;
2109
2110
0
      val = read_value (abfd, buf, per_width,
2111
0
            get_DW_EH_PE_signed (per_encoding));
2112
0
      if (ent->u.cie.make_per_encoding_relative)
2113
0
        val -= (sec->output_section->vma
2114
0
          + sec->output_offset
2115
0
          + (buf - contents));
2116
0
      else
2117
0
        {
2118
0
          val += (bfd_vma) ent->offset - ent->new_offset;
2119
0
          val -= extra_string + extra_data;
2120
0
        }
2121
0
      write_value (abfd, buf, val, per_width);
2122
0
      action &= ~4;
2123
0
          }
2124
0
        buf += per_width;
2125
0
        break;
2126
0
      case 'R':
2127
0
        if (action & 1)
2128
0
          {
2129
0
      BFD_ASSERT (*buf == ent->fde_encoding);
2130
0
      *buf = make_pc_relative (*buf, ptr_size);
2131
0
      action &= ~1;
2132
0
          }
2133
0
        buf++;
2134
0
        break;
2135
0
      case 'S':
2136
0
        break;
2137
0
      default:
2138
0
        BFD_FAIL ();
2139
0
      }
2140
0
      }
2141
0
  }
2142
0
      else
2143
0
  {
2144
    /* FDE */
2145
0
    bfd_vma value, address;
2146
0
    unsigned int width;
2147
0
    bfd_byte *start;
2148
0
    struct eh_cie_fde *cie;
2149
2150
    /* Skip length.  */
2151
0
    cie = ent->u.fde.cie_inf;
2152
0
    buf += 4;
2153
0
    value = ((ent->new_offset + sec->output_offset + 4)
2154
0
       - (cie->new_offset + cie->u.cie.u.sec->output_offset));
2155
0
    bfd_put_32 (abfd, value, buf);
2156
0
    if (bfd_link_relocatable (info))
2157
0
      continue;
2158
0
    buf += 4;
2159
0
    width = get_DW_EH_PE_width (ent->fde_encoding, ptr_size);
2160
0
    value = read_value (abfd, buf, width,
2161
0
            get_DW_EH_PE_signed (ent->fde_encoding));
2162
0
    address = value;
2163
0
    if (value)
2164
0
      {
2165
0
        switch (ent->fde_encoding & 0x70)
2166
0
    {
2167
0
    case DW_EH_PE_textrel:
2168
0
      BFD_ASSERT (hdr_info == NULL);
2169
0
      break;
2170
0
    case DW_EH_PE_datarel:
2171
0
      {
2172
0
        switch (abfd->arch_info->arch)
2173
0
          {
2174
0
          case bfd_arch_ia64:
2175
0
      BFD_ASSERT (elf_gp (abfd) != 0);
2176
0
      address += elf_gp (abfd);
2177
0
      break;
2178
0
          default:
2179
0
      _bfd_error_handler
2180
0
        (_("DW_EH_PE_datarel unspecified"
2181
0
           " for this architecture"));
2182
      /* Fall thru */
2183
0
          case bfd_arch_frv:
2184
0
          case bfd_arch_i386:
2185
0
      BFD_ASSERT (htab->hgot != NULL
2186
0
            && ((htab->hgot->root.type
2187
0
           == bfd_link_hash_defined)
2188
0
          || (htab->hgot->root.type
2189
0
              == bfd_link_hash_defweak)));
2190
0
      address
2191
0
        += (htab->hgot->root.u.def.value
2192
0
            + htab->hgot->root.u.def.section->output_offset
2193
0
            + (htab->hgot->root.u.def.section->output_section
2194
0
         ->vma));
2195
0
      break;
2196
0
          }
2197
0
      }
2198
0
      break;
2199
0
    case DW_EH_PE_pcrel:
2200
0
      value += (bfd_vma) ent->offset - ent->new_offset;
2201
0
      address += (sec->output_section->vma
2202
0
            + sec->output_offset
2203
0
            + ent->offset + 8);
2204
0
      break;
2205
0
    }
2206
0
        if (ent->make_relative)
2207
0
    value -= (sec->output_section->vma
2208
0
        + sec->output_offset
2209
0
        + ent->new_offset + 8);
2210
0
        write_value (abfd, buf, value, width);
2211
0
      }
2212
2213
0
    start = buf;
2214
2215
0
    if (hdr_info)
2216
0
      {
2217
        /* The address calculation may overflow, giving us a
2218
     value greater than 4G on a 32-bit target when
2219
     dwarf_vma is 64-bit.  */
2220
0
        if (sizeof (address) > 4 && ptr_size == 4)
2221
0
    address &= 0xffffffff;
2222
0
        hdr_info->u.dwarf.array[hdr_info->array_count].initial_loc
2223
0
    = address;
2224
0
        hdr_info->u.dwarf.array[hdr_info->array_count].range
2225
0
    = read_value (abfd, buf + width, width, false);
2226
0
        hdr_info->u.dwarf.array[hdr_info->array_count++].fde
2227
0
    = (sec->output_section->vma
2228
0
       + sec->output_offset
2229
0
       + ent->new_offset);
2230
0
      }
2231
2232
0
    if ((ent->lsda_encoding & 0x70) == DW_EH_PE_pcrel
2233
0
        || cie->u.cie.make_lsda_relative)
2234
0
      {
2235
0
        buf += ent->lsda_offset;
2236
0
        width = get_DW_EH_PE_width (ent->lsda_encoding, ptr_size);
2237
0
        value = read_value (abfd, buf, width,
2238
0
          get_DW_EH_PE_signed (ent->lsda_encoding));
2239
0
        if (value)
2240
0
    {
2241
0
      if ((ent->lsda_encoding & 0x70) == DW_EH_PE_pcrel)
2242
0
        value += (bfd_vma) ent->offset - ent->new_offset;
2243
0
      else if (cie->u.cie.make_lsda_relative)
2244
0
        value -= (sec->output_section->vma
2245
0
            + sec->output_offset
2246
0
            + ent->new_offset + 8 + ent->lsda_offset);
2247
0
      write_value (abfd, buf, value, width);
2248
0
    }
2249
0
      }
2250
0
    else if (ent->add_augmentation_size)
2251
0
      {
2252
        /* Skip the PC and length and insert a zero byte for the
2253
     augmentation size.  */
2254
0
        buf += width * 2;
2255
0
        memmove (buf + 1, buf, end - buf);
2256
0
        *buf = 0;
2257
0
      }
2258
2259
0
    if (ent->set_loc)
2260
0
      {
2261
        /* Adjust DW_CFA_set_loc.  */
2262
0
        unsigned int cnt;
2263
0
        bfd_vma new_offset;
2264
2265
0
        width = get_DW_EH_PE_width (ent->fde_encoding, ptr_size);
2266
0
        new_offset = ent->new_offset + 8
2267
0
         + extra_augmentation_string_bytes (ent)
2268
0
         + extra_augmentation_data_bytes (ent);
2269
2270
0
        for (cnt = 1; cnt <= ent->set_loc[0]; cnt++)
2271
0
    {
2272
0
      buf = start + ent->set_loc[cnt];
2273
2274
0
      value = read_value (abfd, buf, width,
2275
0
              get_DW_EH_PE_signed (ent->fde_encoding));
2276
0
      if (!value)
2277
0
        continue;
2278
2279
0
      if ((ent->fde_encoding & 0x70) == DW_EH_PE_pcrel)
2280
0
        value += (bfd_vma) ent->offset + 8 - new_offset;
2281
0
      if (ent->make_relative)
2282
0
        value -= (sec->output_section->vma
2283
0
            + sec->output_offset
2284
0
            + new_offset + ent->set_loc[cnt]);
2285
0
      write_value (abfd, buf, value, width);
2286
0
    }
2287
0
      }
2288
0
  }
2289
0
    }
2290
2291
  /* FIXME: octets_per_byte.  */
2292
0
  return bfd_set_section_contents (abfd, sec->output_section,
2293
0
           contents, (file_ptr) sec->output_offset,
2294
0
           sec->size);
2295
0
}
2296
2297
/* A handy wrapper for writing linker generated .eh_frame sections
2298
   with contents that may need to be extended beyond the initial size
2299
   allocated.  */
2300
2301
bool
2302
_bfd_elf_write_linker_section_eh_frame (bfd *obfd, struct bfd_link_info *info,
2303
          asection *sec, bfd_byte *bigbuf)
2304
0
{
2305
0
  bfd_size_type initial_size = sec->rawsize != 0 ? sec->rawsize : sec->size;
2306
0
  memcpy (bigbuf, sec->contents, initial_size);
2307
0
  if (!_bfd_elf_write_section_eh_frame (obfd, info, sec, bigbuf))
2308
0
    return false;
2309
0
  if (sec->size > initial_size)
2310
0
    {
2311
0
      if (sec->alloced)
2312
0
  sec->contents = bfd_alloc (sec->owner, sec->size);
2313
0
      else
2314
0
  {
2315
0
    free (sec->contents);
2316
0
    sec->contents = bfd_malloc (sec->size);
2317
0
  }
2318
0
      if (sec->contents == NULL)
2319
0
  return false;
2320
0
    }
2321
0
  memcpy (sec->contents, bigbuf, sec->size);
2322
0
  return true;
2323
0
}
2324
2325
/* Helper function used to sort .eh_frame_hdr search table by increasing
2326
   VMA of FDE initial location.  */
2327
2328
static int
2329
vma_compare (const void *a, const void *b)
2330
0
{
2331
0
  const struct eh_frame_array_ent *p = (const struct eh_frame_array_ent *) a;
2332
0
  const struct eh_frame_array_ent *q = (const struct eh_frame_array_ent *) b;
2333
0
  if (p->initial_loc > q->initial_loc)
2334
0
    return 1;
2335
0
  if (p->initial_loc < q->initial_loc)
2336
0
    return -1;
2337
0
  if (p->range > q->range)
2338
0
    return 1;
2339
0
  if (p->range < q->range)
2340
0
    return -1;
2341
0
  return 0;
2342
0
}
2343
2344
/* Reorder .eh_frame_entry sections to match the associated text sections.
2345
   This routine is called during the final linking step, just before writing
2346
   the contents.  At this stage, sections in the eh_frame_hdr_info are already
2347
   sorted in order of increasing text section address and so we simply need
2348
   to make the .eh_frame_entrys follow that same order.  Note that it is
2349
   invalid for a linker script to try to force a particular order of
2350
   .eh_frame_entry sections.  */
2351
2352
bool
2353
_bfd_elf_fixup_eh_frame_hdr (struct bfd_link_info *info)
2354
0
{
2355
0
  asection *sec = NULL;
2356
0
  asection *osec;
2357
0
  struct eh_frame_hdr_info *hdr_info;
2358
0
  unsigned int i;
2359
0
  bfd_vma offset;
2360
0
  struct bfd_link_order *p;
2361
2362
0
  hdr_info = &elf_hash_table (info)->eh_info;
2363
2364
0
  if (hdr_info->hdr_sec == NULL
2365
0
      || info->eh_frame_hdr_type != COMPACT_EH_HDR
2366
0
      || hdr_info->array_count == 0)
2367
0
    return true;
2368
2369
  /* Change section output offsets to be in text section order.  */
2370
0
  offset = 8;
2371
0
  osec = hdr_info->u.compact.entries[0]->output_section;
2372
0
  for (i = 0; i < hdr_info->array_count; i++)
2373
0
    {
2374
0
      sec = hdr_info->u.compact.entries[i];
2375
0
      if (sec->output_section != osec)
2376
0
  {
2377
0
    _bfd_error_handler
2378
0
      (_("invalid output section for .eh_frame_entry: %pA"),
2379
0
       sec->output_section);
2380
0
    return false;
2381
0
  }
2382
0
      sec->output_offset = offset;
2383
0
      offset += sec->size;
2384
0
    }
2385
2386
2387
  /* Fix the link_order to match.  */
2388
0
  for (p = sec->output_section->map_head.link_order; p != NULL; p = p->next)
2389
0
    {
2390
0
      if (p->type != bfd_indirect_link_order)
2391
0
  abort();
2392
2393
0
      p->offset = p->u.indirect.section->output_offset;
2394
0
      if (p->next != NULL)
2395
0
  i--;
2396
0
    }
2397
2398
0
  if (i != 0)
2399
0
    {
2400
0
      _bfd_error_handler
2401
0
  (_("invalid contents in %pA section"), osec);
2402
0
      return false;
2403
0
    }
2404
2405
0
  return true;
2406
0
}
2407
2408
/* The .eh_frame_hdr format for Compact EH frames:
2409
   ubyte version    (2)
2410
   ubyte eh_ref_enc   (DW_EH_PE_* encoding of typinfo references)
2411
   uint32_t count   (Number of entries in table)
2412
   [array from .eh_frame_entry sections]  */
2413
2414
static bool
2415
write_compact_eh_frame_hdr (bfd *abfd, struct bfd_link_info *info)
2416
0
{
2417
0
  struct elf_link_hash_table *htab;
2418
0
  struct eh_frame_hdr_info *hdr_info;
2419
0
  asection *sec;
2420
0
  elf_backend_data *bed;
2421
0
  bfd_vma count;
2422
0
  bfd_byte contents[8];
2423
0
  unsigned int i;
2424
2425
0
  htab = elf_hash_table (info);
2426
0
  hdr_info = &htab->eh_info;
2427
0
  sec = hdr_info->hdr_sec;
2428
2429
0
  if (sec->size != 8)
2430
0
    abort();
2431
2432
0
  for (i = 0; i < sizeof (contents); i++)
2433
0
    contents[i] = 0;
2434
2435
0
  contents[0] = COMPACT_EH_HDR;
2436
0
  bed = get_elf_backend_data (abfd);
2437
2438
0
  BFD_ASSERT (bed->compact_eh_encoding);
2439
0
  contents[1] = (*bed->compact_eh_encoding) (info);
2440
2441
0
  count = (sec->output_section->size - 8) / 8;
2442
0
  bfd_put_32 (abfd, count, contents + 4);
2443
0
  return bfd_set_section_contents (abfd, sec->output_section, contents,
2444
0
           (file_ptr) sec->output_offset, sec->size);
2445
0
}
2446
2447
/* The .eh_frame_hdr format for DWARF frames:
2448
2449
   ubyte version    (currently 1)
2450
   ubyte eh_frame_ptr_enc (DW_EH_PE_* encoding of pointer to start of
2451
         .eh_frame section)
2452
   ubyte fde_count_enc    (DW_EH_PE_* encoding of total FDE count
2453
         number (or DW_EH_PE_omit if there is no
2454
         binary search table computed))
2455
   ubyte table_enc    (DW_EH_PE_* encoding of binary search table,
2456
         or DW_EH_PE_omit if not present.
2457
         DW_EH_PE_datarel is using address of
2458
         .eh_frame_hdr section start as base)
2459
   [encoded] eh_frame_ptr (pointer to start of .eh_frame section)
2460
   optionally followed by:
2461
   [encoded] fde_count    (total number of FDEs in .eh_frame section)
2462
   fde_count x [encoded] initial_loc, fde
2463
        (array of encoded pairs containing
2464
         FDE initial_location field and FDE address,
2465
         sorted by increasing initial_loc).  */
2466
2467
static bool
2468
write_dwarf_eh_frame_hdr (bfd *abfd, struct bfd_link_info *info)
2469
0
{
2470
0
  struct elf_link_hash_table *htab;
2471
0
  struct eh_frame_hdr_info *hdr_info;
2472
0
  asection *sec;
2473
0
  bool retval = false;
2474
2475
0
  htab = elf_hash_table (info);
2476
0
  hdr_info = &htab->eh_info;
2477
0
  sec = hdr_info->hdr_sec;
2478
0
  bfd_byte *contents;
2479
0
  asection *eh_frame_sec;
2480
0
  bfd_size_type size;
2481
0
  bfd_vma encoded_eh_frame;
2482
2483
0
  size = EH_FRAME_HDR_SIZE;
2484
0
  if (hdr_info->u.dwarf.array
2485
0
      && hdr_info->array_count == hdr_info->u.dwarf.fde_count)
2486
0
    size += 4 + hdr_info->u.dwarf.fde_count * 8;
2487
0
  contents = (bfd_byte *) bfd_malloc (size);
2488
0
  if (contents == NULL)
2489
0
    goto out;
2490
2491
0
  eh_frame_sec = bfd_get_section_by_name (abfd, ".eh_frame");
2492
0
  if (eh_frame_sec == NULL)
2493
0
    goto out;
2494
2495
0
  memset (contents, 0, EH_FRAME_HDR_SIZE);
2496
  /* Version.  */
2497
0
  contents[0] = 1;
2498
  /* .eh_frame offset.  */
2499
0
  contents[1] = get_elf_backend_data (abfd)->elf_backend_encode_eh_address
2500
0
    (abfd, info, eh_frame_sec, 0, sec, 4, &encoded_eh_frame);
2501
2502
0
  if (hdr_info->u.dwarf.array
2503
0
      && hdr_info->array_count == hdr_info->u.dwarf.fde_count)
2504
0
    {
2505
      /* FDE count encoding.  */
2506
0
      contents[2] = DW_EH_PE_udata4;
2507
      /* Search table encoding.  */
2508
0
      contents[3] = DW_EH_PE_datarel | DW_EH_PE_sdata4;
2509
0
    }
2510
0
  else
2511
0
    {
2512
0
      contents[2] = DW_EH_PE_omit;
2513
0
      contents[3] = DW_EH_PE_omit;
2514
0
    }
2515
0
  bfd_put_32 (abfd, encoded_eh_frame, contents + 4);
2516
2517
0
  retval = true;
2518
0
  if (contents[2] != DW_EH_PE_omit)
2519
0
    {
2520
0
      unsigned int i;
2521
0
      bool overlap, overflow;
2522
2523
0
      bfd_put_32 (abfd, hdr_info->u.dwarf.fde_count,
2524
0
      contents + EH_FRAME_HDR_SIZE);
2525
0
      qsort (hdr_info->u.dwarf.array, hdr_info->u.dwarf.fde_count,
2526
0
       sizeof (*hdr_info->u.dwarf.array), vma_compare);
2527
0
      overlap = false;
2528
0
      overflow = false;
2529
0
      for (i = 0; i < hdr_info->u.dwarf.fde_count; i++)
2530
0
  {
2531
0
    bfd_vma val;
2532
2533
0
    val = hdr_info->u.dwarf.array[i].initial_loc
2534
0
      - sec->output_section->vma;
2535
0
    val = ((val & 0xffffffff) ^ 0x80000000) - 0x80000000;
2536
0
    if (elf_elfheader (abfd)->e_ident[EI_CLASS] == ELFCLASS64
2537
0
        && (hdr_info->u.dwarf.array[i].initial_loc
2538
0
      != sec->output_section->vma + val))
2539
0
      overflow = true;
2540
0
    bfd_put_32 (abfd, val, contents + EH_FRAME_HDR_SIZE + i * 8 + 4);
2541
0
    val = hdr_info->u.dwarf.array[i].fde - sec->output_section->vma;
2542
0
    val = ((val & 0xffffffff) ^ 0x80000000) - 0x80000000;
2543
0
    if (elf_elfheader (abfd)->e_ident[EI_CLASS] == ELFCLASS64
2544
0
        && (hdr_info->u.dwarf.array[i].fde
2545
0
      != sec->output_section->vma + val))
2546
0
      overflow = true;
2547
0
    bfd_put_32 (abfd, val, contents + EH_FRAME_HDR_SIZE + i * 8 + 8);
2548
0
    if (i != 0
2549
0
        && (hdr_info->u.dwarf.array[i].initial_loc
2550
0
      < (hdr_info->u.dwarf.array[i - 1].initial_loc
2551
0
         + hdr_info->u.dwarf.array[i - 1].range)))
2552
0
      overlap = true;
2553
0
  }
2554
0
      if (overflow)
2555
0
  _bfd_error_handler (_(".eh_frame_hdr entry overflow"));
2556
0
      if (overlap)
2557
0
  _bfd_error_handler (_(".eh_frame_hdr refers to overlapping FDEs"));
2558
0
      if (overflow || overlap)
2559
0
  {
2560
0
    bfd_set_error (bfd_error_bad_value);
2561
0
    retval = false;
2562
0
  }
2563
0
    }
2564
2565
  /* FIXME: octets_per_byte.  */
2566
0
  if (!bfd_set_section_contents (abfd, sec->output_section, contents,
2567
0
         (file_ptr) sec->output_offset,
2568
0
         size))
2569
0
    retval = false;
2570
0
 out:
2571
0
  free (contents);
2572
0
  free (hdr_info->u.dwarf.array);
2573
0
  hdr_info->u.dwarf.array = NULL;
2574
0
  return retval;
2575
0
}
2576
2577
/* Write out .eh_frame_hdr section.  This must be called after
2578
   _bfd_elf_write_section_eh_frame has been called on all input
2579
   .eh_frame sections.  */
2580
2581
bool
2582
_bfd_elf_write_section_eh_frame_hdr (bfd *abfd, struct bfd_link_info *info)
2583
0
{
2584
0
  struct elf_link_hash_table *htab;
2585
0
  struct eh_frame_hdr_info *hdr_info;
2586
0
  asection *sec;
2587
2588
0
  htab = elf_hash_table (info);
2589
0
  hdr_info = &htab->eh_info;
2590
0
  sec = hdr_info->hdr_sec;
2591
2592
0
  if (info->eh_frame_hdr_type == 0 || sec == NULL)
2593
0
    return true;
2594
2595
0
  if (info->eh_frame_hdr_type == COMPACT_EH_HDR)
2596
0
    return write_compact_eh_frame_hdr (abfd, info);
2597
0
  else
2598
0
    return write_dwarf_eh_frame_hdr (abfd, info);
2599
0
}
2600
2601
/* Return the width of FDE addresses.  This is the default implementation.  */
2602
2603
unsigned int
2604
_bfd_elf_eh_frame_address_size (bfd *abfd, const asection *sec ATTRIBUTE_UNUSED)
2605
0
{
2606
0
  return elf_elfheader (abfd)->e_ident[EI_CLASS] == ELFCLASS64 ? 8 : 4;
2607
0
}
2608
2609
/* Decide whether we can use a PC-relative encoding within the given
2610
   EH frame section.  This is the default implementation.  */
2611
2612
bool
2613
_bfd_elf_can_make_relative (bfd *input_bfd ATTRIBUTE_UNUSED,
2614
          struct bfd_link_info *info ATTRIBUTE_UNUSED,
2615
          asection *eh_frame_section ATTRIBUTE_UNUSED)
2616
0
{
2617
0
  return true;
2618
0
}
2619
2620
/* Select an encoding for the given address.  Preference is given to
2621
   PC-relative addressing modes.  */
2622
2623
bfd_byte
2624
_bfd_elf_encode_eh_address (bfd *abfd ATTRIBUTE_UNUSED,
2625
          struct bfd_link_info *info ATTRIBUTE_UNUSED,
2626
          asection *osec, bfd_vma offset,
2627
          asection *loc_sec, bfd_vma loc_offset,
2628
          bfd_vma *encoded)
2629
0
{
2630
0
  *encoded = osec->vma + offset -
2631
0
    (loc_sec->output_section->vma + loc_sec->output_offset + loc_offset);
2632
0
  return DW_EH_PE_pcrel | DW_EH_PE_sdata4;
2633
0
}