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