]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - bfd/elf-eh-frame.c
Automatic date update in version.in
[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;
740
741 /* CIE */
bce613b9
JJ
742 this_inf->cie = 1;
743
184d07da
RS
744 /* Point CIE to one of the section-local cie structures. */
745 cie = local_cies + cie_count++;
746
ca92cecb 747 cie->cie_inf = this_inf;
bce613b9 748 cie->length = hdr_length;
ac685e6a 749 start = buf;
bce613b9 750 REQUIRE (read_byte (&buf, end, &cie->version));
65765700
JJ
751
752 /* Cannot handle unknown versions. */
604282a7
JJ
753 REQUIRE (cie->version == 1
754 || cie->version == 3
755 || cie->version == 4);
bce613b9 756 REQUIRE (strlen ((char *) buf) < sizeof (cie->augmentation));
65765700 757
bce613b9 758 strcpy (cie->augmentation, (char *) buf);
f075ee0c 759 buf = (bfd_byte *) strchr ((char *) buf, '\0') + 1;
d7153c4a 760 this_inf->u.cie.aug_str_len = buf - start - 1;
65765700
JJ
761 ENSURE_NO_RELOCS (buf);
762 if (buf[0] == 'e' && buf[1] == 'h')
763 {
764 /* GCC < 3.0 .eh_frame CIE */
765 /* We cannot merge "eh" CIEs because __EXCEPTION_TABLE__
766 is private to each CIE, so we don't need it for anything.
767 Just skip it. */
2c42be65 768 REQUIRE (skip_bytes (&buf, end, ptr_size));
65765700
JJ
769 SKIP_RELOCS (buf);
770 }
604282a7
JJ
771 if (cie->version >= 4)
772 {
773 REQUIRE (buf + 1 < end);
774 REQUIRE (buf[0] == ptr_size);
775 REQUIRE (buf[1] == 0);
776 buf += 2;
777 }
bce613b9
JJ
778 REQUIRE (read_uleb128 (&buf, end, &cie->code_align));
779 REQUIRE (read_sleb128 (&buf, end, &cie->data_align));
780 if (cie->version == 1)
2c42be65
RS
781 {
782 REQUIRE (buf < end);
bce613b9 783 cie->ra_column = *buf++;
2c42be65 784 }
0da76f83 785 else
bce613b9 786 REQUIRE (read_uleb128 (&buf, end, &cie->ra_column));
65765700 787 ENSURE_NO_RELOCS (buf);
bce613b9
JJ
788 cie->lsda_encoding = DW_EH_PE_omit;
789 cie->fde_encoding = DW_EH_PE_omit;
790 cie->per_encoding = DW_EH_PE_omit;
791 aug = cie->augmentation;
65765700
JJ
792 if (aug[0] != 'e' || aug[1] != 'h')
793 {
794 if (*aug == 'z')
795 {
796 aug++;
bce613b9 797 REQUIRE (read_uleb128 (&buf, end, &cie->augmentation_size));
07d6d2b8 798 ENSURE_NO_RELOCS (buf);
65765700
JJ
799 }
800
801 while (*aug != '\0')
802 switch (*aug++)
803 {
3a67e1a6
ST
804 case 'B':
805 break;
65765700 806 case 'L':
bce613b9 807 REQUIRE (read_byte (&buf, end, &cie->lsda_encoding));
65765700 808 ENSURE_NO_RELOCS (buf);
bce613b9 809 REQUIRE (get_DW_EH_PE_width (cie->lsda_encoding, ptr_size));
65765700
JJ
810 break;
811 case 'R':
bce613b9 812 REQUIRE (read_byte (&buf, end, &cie->fde_encoding));
65765700 813 ENSURE_NO_RELOCS (buf);
bce613b9 814 REQUIRE (get_DW_EH_PE_width (cie->fde_encoding, ptr_size));
65765700 815 break;
63752a75
JJ
816 case 'S':
817 break;
65765700
JJ
818 case 'P':
819 {
820 int per_width;
821
bce613b9
JJ
822 REQUIRE (read_byte (&buf, end, &cie->per_encoding));
823 per_width = get_DW_EH_PE_width (cie->per_encoding,
65765700 824 ptr_size);
acfe5567 825 REQUIRE (per_width);
18e04883 826 if ((cie->per_encoding & 0x70) == DW_EH_PE_aligned)
2c42be65
RS
827 {
828 length = -(buf - ehbuf) & (per_width - 1);
829 REQUIRE (skip_bytes (&buf, end, length));
2e0ce1c8
AM
830 if (per_width == 8)
831 this_inf->u.cie.per_encoding_aligned8 = 1;
2c42be65 832 }
18e04883 833 this_inf->u.cie.personality_offset = buf - start;
65765700 834 ENSURE_NO_RELOCS (buf);
f137a54e 835 /* Ensure we have a reloc here. */
184d07da
RS
836 REQUIRE (GET_RELOC (buf));
837 cie->personality.reloc_index
838 = cookie->rel - cookie->rels;
839 /* Cope with MIPS-style composite relocations. */
840 do
841 cookie->rel++;
842 while (GET_RELOC (buf) != NULL);
2c42be65 843 REQUIRE (skip_bytes (&buf, end, per_width));
65765700
JJ
844 }
845 break;
846 default:
847 /* Unrecognized augmentation. Better bail out. */
848 goto free_no_table;
849 }
850 }
d7153c4a
AM
851 this_inf->u.cie.aug_data_len
852 = buf - start - 1 - this_inf->u.cie.aug_str_len;
65765700
JJ
853
854 /* For shared libraries, try to get rid of as many RELATIVE relocs
0bb2d96a 855 as possible. */
0e1862bb 856 if (bfd_link_pic (info)
ec3391e7
AO
857 && (get_elf_backend_data (abfd)
858 ->elf_backend_can_make_relative_eh_frame
353057a5
RS
859 (abfd, info, sec)))
860 {
18e04883 861 if ((cie->fde_encoding & 0x70) == DW_EH_PE_absptr)
6b2cc140 862 this_inf->make_relative = 1;
353057a5
RS
863 /* If the CIE doesn't already have an 'R' entry, it's fairly
864 easy to add one, provided that there's no aligned data
865 after the augmentation string. */
bce613b9 866 else if (cie->fde_encoding == DW_EH_PE_omit
18e04883 867 && (cie->per_encoding & 0x70) != DW_EH_PE_aligned)
353057a5 868 {
bce613b9 869 if (*cie->augmentation == 0)
353057a5 870 this_inf->add_augmentation_size = 1;
6b2cc140
RS
871 this_inf->u.cie.add_fde_encoding = 1;
872 this_inf->make_relative = 1;
353057a5 873 }
65765700 874
18e04883
RS
875 if ((cie->lsda_encoding & 0x70) == DW_EH_PE_absptr)
876 cie->can_make_lsda_relative = 1;
877 }
9e2a4898 878
65765700
JJ
879 /* If FDE encoding was not specified, it defaults to
880 DW_EH_absptr. */
bce613b9
JJ
881 if (cie->fde_encoding == DW_EH_PE_omit)
882 cie->fde_encoding = DW_EH_PE_absptr;
65765700 883
dcf507a6 884 initial_insn_length = end - buf;
99d190fa
AM
885 cie->initial_insn_length = initial_insn_length;
886 memcpy (cie->initial_instructions, buf,
887 initial_insn_length <= sizeof (cie->initial_instructions)
888 ? initial_insn_length : sizeof (cie->initial_instructions));
dcf507a6 889 insns = buf;
65765700
JJ
890 buf += initial_insn_length;
891 ENSURE_NO_RELOCS (buf);
ca92cecb 892
0e1862bb 893 if (!bfd_link_relocatable (info))
5b69e357
AM
894 {
895 /* Keep info for merging cies. */
896 this_inf->u.cie.u.full_cie = cie;
897 this_inf->u.cie.per_encoding_relative
898 = (cie->per_encoding & 0x70) == DW_EH_PE_pcrel;
899 }
65765700
JJ
900 }
901 else
902 {
bce613b9
JJ
903 /* Find the corresponding CIE. */
904 unsigned int cie_offset = this_inf->offset + 4 - hdr_id;
184d07da
RS
905 for (cie = local_cies; cie < local_cies + cie_count; cie++)
906 if (cie_offset == cie->cie_inf->offset)
bce613b9
JJ
907 break;
908
909 /* Ensure this FDE references one of the CIEs in this input
910 section. */
184d07da
RS
911 REQUIRE (cie != local_cies + cie_count);
912 this_inf->u.fde.cie_inf = cie->cie_inf;
913 this_inf->make_relative = cie->cie_inf->make_relative;
6b2cc140 914 this_inf->add_augmentation_size
184d07da 915 = cie->cie_inf->add_augmentation_size;
65765700
JJ
916
917 ENSURE_NO_RELOCS (buf);
e41b3a13 918 if ((sec->flags & SEC_LINKER_CREATED) == 0 || cookie->rels != NULL)
2a7b2e88 919 {
e41b3a13
JJ
920 asection *rsec;
921
922 REQUIRE (GET_RELOC (buf));
923
924 /* Chain together the FDEs for each section. */
1cce69b9
AM
925 rsec = _bfd_elf_gc_mark_rsec (info, sec, gc_mark_hook,
926 cookie, NULL);
e41b3a13
JJ
927 /* RSEC will be NULL if FDE was cleared out as it was belonging to
928 a discarded SHT_GROUP. */
929 if (rsec)
930 {
931 REQUIRE (rsec->owner == abfd);
932 this_inf->u.fde.next_for_section = elf_fde_list (rsec);
933 elf_fde_list (rsec) = this_inf;
934 }
2a7b2e88 935 }
9d0a14d3 936
2c42be65
RS
937 /* Skip the initial location and address range. */
938 start = buf;
bce613b9 939 length = get_DW_EH_PE_width (cie->fde_encoding, ptr_size);
2c42be65
RS
940 REQUIRE (skip_bytes (&buf, end, 2 * length));
941
c2aaac08
AM
942 SKIP_RELOCS (buf - length);
943 if (!GET_RELOC (buf - length)
0a1b45a2 944 && read_value (abfd, buf - length, length, false) == 0)
c2aaac08
AM
945 {
946 (*info->callbacks->minfo)
695344c0 947 /* xgettext:c-format */
871b3ab2 948 (_("discarding zero address range FDE in %pB(%pA).\n"),
c2aaac08
AM
949 abfd, sec);
950 this_inf->u.fde.cie_inf = NULL;
951 }
952
2c42be65 953 /* Skip the augmentation size, if present. */
bce613b9 954 if (cie->augmentation[0] == 'z')
dcf507a6
RS
955 REQUIRE (read_uleb128 (&buf, end, &length));
956 else
957 length = 0;
2c42be65
RS
958
959 /* Of the supported augmentation characters above, only 'L'
960 adds augmentation data to the FDE. This code would need to
961 be adjusted if any future augmentations do the same thing. */
bce613b9 962 if (cie->lsda_encoding != DW_EH_PE_omit)
dcf507a6 963 {
9f4b847e
RS
964 SKIP_RELOCS (buf);
965 if (cie->can_make_lsda_relative && GET_RELOC (buf))
966 cie->cie_inf->u.cie.make_lsda_relative = 1;
dcf507a6
RS
967 this_inf->lsda_offset = buf - start;
968 /* If there's no 'z' augmentation, we don't know where the
969 CFA insns begin. Assume no padding. */
bce613b9 970 if (cie->augmentation[0] != 'z')
dcf507a6
RS
971 length = end - buf;
972 }
973
974 /* Skip over the augmentation data. */
975 REQUIRE (skip_bytes (&buf, end, length));
976 insns = buf;
9e2a4898 977
bce613b9 978 buf = last_fde + 4 + hdr_length;
2a7b2e88 979
273f4430
JK
980 /* For NULL RSEC (cleared FDE belonging to a discarded section)
981 the relocations are commonly cleared. We do not sanity check if
982 all these relocations are cleared as (1) relocations to
983 .gcc_except_table will remain uncleared (they will get dropped
984 with the drop of this unused FDE) and (2) BFD already safely drops
985 relocations of any type to .eh_frame by
986 elf_section_ignore_discarded_relocs.
987 TODO: The .gcc_except_table entries should be also filtered as
988 .eh_frame entries; or GCC could rather use COMDAT for them. */
989 SKIP_RELOCS (buf);
65765700
JJ
990 }
991
dcf507a6
RS
992 /* Try to interpret the CFA instructions and find the first
993 padding nop. Shrink this_inf's size so that it doesn't
ac685e6a 994 include the padding. */
bce613b9 995 length = get_DW_EH_PE_width (cie->fde_encoding, ptr_size);
ac685e6a
JJ
996 set_loc_count = 0;
997 insns_end = skip_non_nops (insns, end, length, &set_loc_count);
998 /* If we don't understand the CFA instructions, we can't know
999 what needs to be adjusted there. */
1000 if (insns_end == NULL
1001 /* For the time being we don't support DW_CFA_set_loc in
1002 CIE instructions. */
1003 || (set_loc_count && this_inf->cie))
1004 goto free_no_table;
1005 this_inf->size -= end - insns_end;
bce613b9
JJ
1006 if (insns_end != end && this_inf->cie)
1007 {
1008 cie->initial_insn_length -= end - insns_end;
1009 cie->length -= end - insns_end;
1010 }
ac685e6a 1011 if (set_loc_count
18e04883 1012 && ((cie->fde_encoding & 0x70) == DW_EH_PE_pcrel
6b2cc140 1013 || this_inf->make_relative))
ac685e6a
JJ
1014 {
1015 unsigned int cnt;
1016 bfd_byte *p;
1017
701fe09b
AM
1018 this_inf->set_loc
1019 = bfd_alloc (abfd, (set_loc_count + 1) * sizeof (unsigned int));
ac685e6a
JJ
1020 REQUIRE (this_inf->set_loc);
1021 this_inf->set_loc[0] = set_loc_count;
1022 p = insns;
1023 cnt = 0;
1024 while (p < end)
1025 {
1026 if (*p == DW_CFA_set_loc)
1027 this_inf->set_loc[++cnt] = p + 1 - start;
1028 REQUIRE (skip_cfa_op (&p, end, length));
1029 }
1030 }
dcf507a6 1031
ca92cecb 1032 this_inf->removed = 1;
bce613b9
JJ
1033 this_inf->fde_encoding = cie->fde_encoding;
1034 this_inf->lsda_encoding = cie->lsda_encoding;
65765700
JJ
1035 sec_info->count++;
1036 }
ca92cecb 1037 BFD_ASSERT (sec_info->count == num_entries);
184d07da 1038 BFD_ASSERT (cie_count == num_cies);
65765700
JJ
1039
1040 elf_section_data (sec)->sec_info = sec_info;
dbaa2011 1041 sec->sec_info_type = SEC_INFO_TYPE_EH_FRAME;
0e1862bb 1042 if (!bfd_link_relocatable (info))
184d07da 1043 {
da44f4e5 1044 /* Keep info for merging cies. */
184d07da
RS
1045 sec_info->cies = local_cies;
1046 local_cies = NULL;
1047 }
ca92cecb 1048 goto success;
65765700 1049
ca92cecb 1050 free_no_table:
9793eb77 1051 _bfd_error_handler
695344c0 1052 /* xgettext:c-format */
9793eb77 1053 (_("error in %pB(%pA); no .eh_frame_hdr table will be created"),
ca92cecb 1054 abfd, sec);
0a1b45a2 1055 hdr_info->u.dwarf.table = false;
ca92cecb 1056 success:
584b30e4 1057 _bfd_elf_munmap_section_contents (sec, ehbuf);
c9594989 1058 free (local_cies);
ca92cecb
RS
1059#undef REQUIRE
1060}
bce613b9 1061
2f0c68f2
CM
1062/* Order eh_frame_hdr entries by the VMA of their text section. */
1063
1064static int
1065cmp_eh_frame_hdr (const void *a, const void *b)
1066{
1067 bfd_vma text_a;
1068 bfd_vma text_b;
1069 asection *sec;
1070
1071 sec = *(asection *const *)a;
1072 sec = (asection *) elf_section_data (sec)->sec_info;
1073 text_a = sec->output_section->vma + sec->output_offset;
1074 sec = *(asection *const *)b;
1075 sec = (asection *) elf_section_data (sec)->sec_info;
1076 text_b = sec->output_section->vma + sec->output_offset;
1077
1078 if (text_a < text_b)
1079 return -1;
1080 return text_a > text_b;
1081
1082}
1083
1084/* Add space for a CANTUNWIND terminator to SEC if the text sections
1085 referenced by it and NEXT are not contiguous, or NEXT is NULL. */
1086
1087static void
1088add_eh_frame_hdr_terminator (asection *sec,
1089 asection *next)
1090{
1091 bfd_vma end;
1092 bfd_vma next_start;
1093 asection *text_sec;
1094
1095 if (next)
1096 {
1097 /* See if there is a gap (presumably a text section without unwind info)
1098 between these two entries. */
1099 text_sec = (asection *) elf_section_data (sec)->sec_info;
1100 end = text_sec->output_section->vma + text_sec->output_offset
1101 + text_sec->size;
1102 text_sec = (asection *) elf_section_data (next)->sec_info;
1103 next_start = text_sec->output_section->vma + text_sec->output_offset;
1104 if (end == next_start)
1105 return;
1106 }
1107
1108 /* Add space for a CANTUNWIND terminator. */
1109 if (!sec->rawsize)
1110 sec->rawsize = sec->size;
1111
fd361982 1112 bfd_set_section_size (sec, sec->size + 8);
2f0c68f2
CM
1113}
1114
1115/* Finish a pass over all .eh_frame_entry sections. */
1116
0a1b45a2 1117bool
2f0c68f2
CM
1118_bfd_elf_end_eh_frame_parsing (struct bfd_link_info *info)
1119{
1120 struct eh_frame_hdr_info *hdr_info;
1121 unsigned int i;
1122
1123 hdr_info = &elf_hash_table (info)->eh_info;
1124
1125 if (info->eh_frame_hdr_type != COMPACT_EH_HDR
1126 || hdr_info->array_count == 0)
0a1b45a2 1127 return false;
2f0c68f2
CM
1128
1129 bfd_elf_discard_eh_frame_entry (hdr_info);
1130
1131 qsort (hdr_info->u.compact.entries, hdr_info->array_count,
1132 sizeof (asection *), cmp_eh_frame_hdr);
1133
1134 for (i = 0; i < hdr_info->array_count - 1; i++)
1135 {
1136 add_eh_frame_hdr_terminator (hdr_info->u.compact.entries[i],
1137 hdr_info->u.compact.entries[i + 1]);
1138 }
1139
1140 /* Add a CANTUNWIND terminator after the last entry. */
1141 add_eh_frame_hdr_terminator (hdr_info->u.compact.entries[i], NULL);
0a1b45a2 1142 return true;
2f0c68f2
CM
1143}
1144
9d0a14d3
RS
1145/* Mark all relocations against CIE or FDE ENT, which occurs in
1146 .eh_frame section SEC. COOKIE describes the relocations in SEC;
1147 its "rel" field can be changed freely. */
1148
0a1b45a2 1149static bool
9d0a14d3
RS
1150mark_entry (struct bfd_link_info *info, asection *sec,
1151 struct eh_cie_fde *ent, elf_gc_mark_hook_fn gc_mark_hook,
1152 struct elf_reloc_cookie *cookie)
1153{
5dabe785 1154 /* FIXME: octets_per_byte. */
9d0a14d3
RS
1155 for (cookie->rel = cookie->rels + ent->reloc_index;
1156 cookie->rel < cookie->relend
1157 && cookie->rel->r_offset < ent->offset + ent->size;
1158 cookie->rel++)
1159 if (!_bfd_elf_gc_mark_reloc (info, sec, gc_mark_hook, cookie))
0a1b45a2 1160 return false;
9d0a14d3 1161
0a1b45a2 1162 return true;
9d0a14d3
RS
1163}
1164
1165/* Mark all the relocations against FDEs that relate to code in input
1166 section SEC. The FDEs belong to .eh_frame section EH_FRAME, whose
1167 relocations are described by COOKIE. */
1168
0a1b45a2 1169bool
9d0a14d3
RS
1170_bfd_elf_gc_mark_fdes (struct bfd_link_info *info, asection *sec,
1171 asection *eh_frame, elf_gc_mark_hook_fn gc_mark_hook,
1172 struct elf_reloc_cookie *cookie)
1173{
184d07da 1174 struct eh_cie_fde *fde, *cie;
9d0a14d3
RS
1175
1176 for (fde = elf_fde_list (sec); fde; fde = fde->u.fde.next_for_section)
1177 {
1178 if (!mark_entry (info, eh_frame, fde, gc_mark_hook, cookie))
0a1b45a2 1179 return false;
9d0a14d3
RS
1180
1181 /* At this stage, all cie_inf fields point to local CIEs, so we
1182 can use the same cookie to refer to them. */
1183 cie = fde->u.fde.cie_inf;
c2aaac08 1184 if (cie != NULL && !cie->u.cie.gc_mark)
9d0a14d3 1185 {
184d07da 1186 cie->u.cie.gc_mark = 1;
9d0a14d3 1187 if (!mark_entry (info, eh_frame, cie, gc_mark_hook, cookie))
0a1b45a2 1188 return false;
9d0a14d3
RS
1189 }
1190 }
0a1b45a2 1191 return true;
9d0a14d3
RS
1192}
1193
184d07da
RS
1194/* Input section SEC of ABFD is an .eh_frame section that contains the
1195 CIE described by CIE_INF. Return a version of CIE_INF that is going
1196 to be kept in the output, adding CIE_INF to the output if necessary.
1197
1198 HDR_INFO is the .eh_frame_hdr information and COOKIE describes the
1199 relocations in REL. */
1200
1201static struct eh_cie_fde *
18e04883 1202find_merged_cie (bfd *abfd, struct bfd_link_info *info, asection *sec,
184d07da
RS
1203 struct eh_frame_hdr_info *hdr_info,
1204 struct elf_reloc_cookie *cookie,
1205 struct eh_cie_fde *cie_inf)
1206{
1207 unsigned long r_symndx;
1208 struct cie *cie, *new_cie;
1209 Elf_Internal_Rela *rel;
1210 void **loc;
1211
1212 /* Use CIE_INF if we have already decided to keep it. */
1213 if (!cie_inf->removed)
1214 return cie_inf;
1215
1216 /* If we have merged CIE_INF with another CIE, use that CIE instead. */
1217 if (cie_inf->u.cie.merged)
1218 return cie_inf->u.cie.u.merged_with;
1219
1220 cie = cie_inf->u.cie.u.full_cie;
1221
1222 /* Assume we will need to keep CIE_INF. */
1223 cie_inf->removed = 0;
1224 cie_inf->u.cie.u.sec = sec;
1225
1226 /* If we are not merging CIEs, use CIE_INF. */
1227 if (cie == NULL)
1228 return cie_inf;
1229
1230 if (cie->per_encoding != DW_EH_PE_omit)
1231 {
0a1b45a2 1232 bool per_binds_local;
18e04883 1233
5087d529
AM
1234 /* Work out the address of personality routine, or at least
1235 enough info that we could calculate the address had we made a
1236 final section layout. The symbol on the reloc is enough,
1237 either the hash for a global, or (bfd id, index) pair for a
1238 local. The assumption here is that no one uses addends on
1239 the reloc. */
184d07da
RS
1240 rel = cookie->rels + cie->personality.reloc_index;
1241 memset (&cie->personality, 0, sizeof (cie->personality));
1242#ifdef BFD64
1243 if (elf_elfheader (abfd)->e_ident[EI_CLASS] == ELFCLASS64)
1244 r_symndx = ELF64_R_SYM (rel->r_info);
1245 else
1246#endif
1247 r_symndx = ELF32_R_SYM (rel->r_info);
1248 if (r_symndx >= cookie->locsymcount
1249 || ELF_ST_BIND (cookie->locsyms[r_symndx].st_info) != STB_LOCAL)
1250 {
1251 struct elf_link_hash_entry *h;
1252
1253 r_symndx -= cookie->extsymoff;
1254 h = cookie->sym_hashes[r_symndx];
1255
1256 while (h->root.type == bfd_link_hash_indirect
1257 || h->root.type == bfd_link_hash_warning)
1258 h = (struct elf_link_hash_entry *) h->root.u.i.link;
1259
1260 cie->personality.h = h;
18e04883 1261 per_binds_local = SYMBOL_REFERENCES_LOCAL (info, h);
184d07da
RS
1262 }
1263 else
1264 {
1265 Elf_Internal_Sym *sym;
1266 asection *sym_sec;
1267
1268 sym = &cookie->locsyms[r_symndx];
1269 sym_sec = bfd_section_from_elf_index (abfd, sym->st_shndx);
1270 if (sym_sec == NULL)
1271 return cie_inf;
1272
1273 if (sym_sec->kept_section != NULL)
1274 sym_sec = sym_sec->kept_section;
1275 if (sym_sec->output_section == NULL)
1276 return cie_inf;
1277
1278 cie->local_personality = 1;
5087d529
AM
1279 cie->personality.sym.bfd_id = abfd->id;
1280 cie->personality.sym.index = r_symndx;
0a1b45a2 1281 per_binds_local = true;
18e04883
RS
1282 }
1283
1284 if (per_binds_local
0e1862bb 1285 && bfd_link_pic (info)
18e04883
RS
1286 && (cie->per_encoding & 0x70) == DW_EH_PE_absptr
1287 && (get_elf_backend_data (abfd)
1288 ->elf_backend_can_make_relative_eh_frame (abfd, info, sec)))
1289 {
1290 cie_inf->u.cie.make_per_encoding_relative = 1;
1291 cie_inf->u.cie.per_encoding_relative = 1;
184d07da
RS
1292 }
1293 }
1294
1295 /* See if we can merge this CIE with an earlier one. */
184d07da 1296 cie_compute_hash (cie);
2f0c68f2 1297 if (hdr_info->u.dwarf.cies == NULL)
184d07da 1298 {
2f0c68f2
CM
1299 hdr_info->u.dwarf.cies = htab_try_create (1, cie_hash, cie_eq, free);
1300 if (hdr_info->u.dwarf.cies == NULL)
184d07da
RS
1301 return cie_inf;
1302 }
2f0c68f2
CM
1303 loc = htab_find_slot_with_hash (hdr_info->u.dwarf.cies, cie,
1304 cie->hash, INSERT);
184d07da
RS
1305 if (loc == NULL)
1306 return cie_inf;
1307
1308 new_cie = (struct cie *) *loc;
1309 if (new_cie == NULL)
1310 {
1311 /* Keep CIE_INF and record it in the hash table. */
701fe09b 1312 new_cie = bfd_malloc (sizeof (*new_cie));
184d07da
RS
1313 if (new_cie == NULL)
1314 return cie_inf;
1315
1316 memcpy (new_cie, cie, sizeof (struct cie));
1317 *loc = new_cie;
1318 }
1319 else
1320 {
1321 /* Merge CIE_INF with NEW_CIE->CIE_INF. */
1322 cie_inf->removed = 1;
1323 cie_inf->u.cie.merged = 1;
1324 cie_inf->u.cie.u.merged_with = new_cie->cie_inf;
1325 if (cie_inf->u.cie.make_lsda_relative)
1326 new_cie->cie_inf->u.cie.make_lsda_relative = 1;
1327 }
1328 return new_cie->cie_inf;
1329}
1330
d7153c4a
AM
1331/* For a given OFFSET in SEC, return the delta to the new location
1332 after .eh_frame editing. */
1333
1334static bfd_signed_vma
76c20d54 1335offset_adjust (bfd_vma offset, const asection *sec)
d7153c4a
AM
1336{
1337 struct eh_frame_sec_info *sec_info
1338 = (struct eh_frame_sec_info *) elf_section_data (sec)->sec_info;
1339 unsigned int lo, hi, mid;
96d01d93 1340 struct eh_cie_fde *ent = NULL;
d7153c4a
AM
1341 bfd_signed_vma delta;
1342
1343 lo = 0;
1344 hi = sec_info->count;
1345 if (hi == 0)
1346 return 0;
1347
1348 while (lo < hi)
1349 {
1350 mid = (lo + hi) / 2;
1351 ent = &sec_info->entry[mid];
1352 if (offset < ent->offset)
1353 hi = mid;
1354 else if (mid + 1 >= hi)
1355 break;
1356 else if (offset >= ent[1].offset)
1357 lo = mid + 1;
1358 else
1359 break;
1360 }
1361
1362 if (!ent->removed)
1363 delta = (bfd_vma) ent->new_offset - (bfd_vma) ent->offset;
1364 else if (ent->cie && ent->u.cie.merged)
1365 {
1366 struct eh_cie_fde *cie = ent->u.cie.u.merged_with;
1367 delta = ((bfd_vma) cie->new_offset + cie->u.cie.u.sec->output_offset
1368 - (bfd_vma) ent->offset - sec->output_offset);
1369 }
1370 else
1371 {
1372 /* Is putting the symbol on the next entry best for a deleted
1373 CIE/FDE? */
1374 struct eh_cie_fde *last = sec_info->entry + sec_info->count;
1375 delta = ((bfd_vma) next_cie_fde_offset (ent, last, sec)
1376 - (bfd_vma) ent->offset);
1377 return delta;
1378 }
1379
1380 /* Account for editing within this CIE/FDE. */
1381 offset -= ent->offset;
1382 if (ent->cie)
1383 {
1384 unsigned int extra
1385 = ent->add_augmentation_size + ent->u.cie.add_fde_encoding;
1386 if (extra == 0
1387 || offset <= 9u + ent->u.cie.aug_str_len)
1388 return delta;
1389 delta += extra;
1390 if (offset <= 9u + ent->u.cie.aug_str_len + ent->u.cie.aug_data_len)
1391 return delta;
1392 delta += extra;
1393 }
1394 else
1395 {
1396 unsigned int ptr_size, width, extra = ent->add_augmentation_size;
1397 if (offset <= 12 || extra == 0)
1398 return delta;
1399 ptr_size = (get_elf_backend_data (sec->owner)
1400 ->elf_backend_eh_frame_address_size (sec->owner, sec));
1401 width = get_DW_EH_PE_width (ent->fde_encoding, ptr_size);
1402 if (offset <= 8 + 2 * width)
1403 return delta;
1404 delta += extra;
1405 }
1406
1407 return delta;
1408}
1409
1410/* Adjust a global symbol defined in .eh_frame, so that it stays
1411 relative to its original CIE/FDE. It is assumed that a symbol
1412 defined at the beginning of a CIE/FDE belongs to that CIE/FDE
1413 rather than marking the end of the previous CIE/FDE. This matters
1414 when a CIE is merged with a previous CIE, since the symbol is
1415 moved to the merged CIE. */
1416
0a1b45a2 1417bool
d7153c4a
AM
1418_bfd_elf_adjust_eh_frame_global_symbol (struct elf_link_hash_entry *h,
1419 void *arg ATTRIBUTE_UNUSED)
1420{
1421 asection *sym_sec;
1422 bfd_signed_vma delta;
1423
1424 if (h->root.type != bfd_link_hash_defined
1425 && h->root.type != bfd_link_hash_defweak)
0a1b45a2 1426 return true;
d7153c4a
AM
1427
1428 sym_sec = h->root.u.def.section;
1429 if (sym_sec->sec_info_type != SEC_INFO_TYPE_EH_FRAME
1430 || elf_section_data (sym_sec)->sec_info == NULL)
0a1b45a2 1431 return true;
d7153c4a
AM
1432
1433 delta = offset_adjust (h->root.u.def.value, sym_sec);
1434 h->root.u.def.value += delta;
1435
0a1b45a2 1436 return true;
d7153c4a
AM
1437}
1438
1439/* The same for all local symbols defined in .eh_frame. Returns true
1440 if any symbol was changed. */
1441
1442static int
76c20d54 1443adjust_eh_frame_local_symbols (const asection *sec,
d7153c4a
AM
1444 struct elf_reloc_cookie *cookie)
1445{
d7153c4a
AM
1446 int adjusted = 0;
1447
36f61bf2
AM
1448 if (cookie->locsymcount > 1)
1449 {
1450 unsigned int shndx = elf_section_data (sec)->this_idx;
1451 Elf_Internal_Sym *end_sym = cookie->locsyms + cookie->locsymcount;
1452 Elf_Internal_Sym *sym;
d7153c4a 1453
36f61bf2
AM
1454 for (sym = cookie->locsyms + 1; sym < end_sym; ++sym)
1455 if (sym->st_info <= ELF_ST_INFO (STB_LOCAL, STT_OBJECT)
1456 && sym->st_shndx == shndx)
d7153c4a 1457 {
36f61bf2
AM
1458 bfd_signed_vma delta = offset_adjust (sym->st_value, sec);
1459
1460 if (delta != 0)
1461 {
1462 adjusted = 1;
1463 sym->st_value += delta;
1464 }
d7153c4a 1465 }
36f61bf2 1466 }
d7153c4a
AM
1467 return adjusted;
1468}
1469
ca92cecb
RS
1470/* This function is called for each input file before the .eh_frame
1471 section is relocated. It discards duplicate CIEs and FDEs for discarded
1472 functions. The function returns TRUE iff any entries have been
1473 deleted. */
1474
0a1b45a2 1475bool
ca92cecb
RS
1476_bfd_elf_discard_section_eh_frame
1477 (bfd *abfd, struct bfd_link_info *info, asection *sec,
0a1b45a2 1478 bool (*reloc_symbol_deleted_p) (bfd_vma, void *),
ca92cecb
RS
1479 struct elf_reloc_cookie *cookie)
1480{
184d07da 1481 struct eh_cie_fde *ent;
ca92cecb
RS
1482 struct eh_frame_sec_info *sec_info;
1483 struct eh_frame_hdr_info *hdr_info;
2e0ce1c8 1484 unsigned int ptr_size, offset, eh_alignment;
d7153c4a 1485 int changed;
ca92cecb 1486
dbaa2011 1487 if (sec->sec_info_type != SEC_INFO_TYPE_EH_FRAME)
0a1b45a2 1488 return false;
4d16d575 1489
ca92cecb
RS
1490 sec_info = (struct eh_frame_sec_info *) elf_section_data (sec)->sec_info;
1491 if (sec_info == NULL)
0a1b45a2 1492 return false;
ca92cecb 1493
e41b3a13
JJ
1494 ptr_size = (get_elf_backend_data (sec->owner)
1495 ->elf_backend_eh_frame_address_size (sec->owner, sec));
1496
ca92cecb 1497 hdr_info = &elf_hash_table (info)->eh_info;
fda3ecf2 1498 for (ent = sec_info->entry; ent < sec_info->entry + sec_info->count; ++ent)
f60e73e9
AM
1499 if (ent->size == 4)
1500 /* There should only be one zero terminator, on the last input
1501 file supplying .eh_frame (crtend.o). Remove any others. */
1502 ent->removed = sec->map_head.s != NULL;
c2aaac08 1503 else if (!ent->cie && ent->u.fde.cie_inf != NULL)
fda3ecf2 1504 {
0a1b45a2 1505 bool keep;
e41b3a13
JJ
1506 if ((sec->flags & SEC_LINKER_CREATED) != 0 && cookie->rels == NULL)
1507 {
1508 unsigned int width
1509 = get_DW_EH_PE_width (ent->fde_encoding, ptr_size);
1510 bfd_vma value
1511 = read_value (abfd, sec->contents + ent->offset + 8 + width,
1512 width, get_DW_EH_PE_signed (ent->fde_encoding));
1513 keep = value != 0;
1514 }
1515 else
1516 {
1517 cookie->rel = cookie->rels + ent->reloc_index;
1518 /* FIXME: octets_per_byte. */
1519 BFD_ASSERT (cookie->rel < cookie->relend
1520 && cookie->rel->r_offset == ent->offset + 8);
1521 keep = !(*reloc_symbol_deleted_p) (ent->offset + 8, cookie);
1522 }
1523 if (keep)
bce613b9 1524 {
0e1862bb 1525 if (bfd_link_pic (info)
18e04883 1526 && (((ent->fde_encoding & 0x70) == DW_EH_PE_absptr
6b2cc140 1527 && ent->make_relative == 0)
18e04883 1528 || (ent->fde_encoding & 0x70) == DW_EH_PE_aligned))
ca92cecb 1529 {
83da6e74
NC
1530 static int num_warnings_issued = 0;
1531
ca92cecb
RS
1532 /* If a shared library uses absolute pointers
1533 which we cannot turn into PC relative,
1534 don't create the binary search table,
1535 since it is affected by runtime relocations. */
0a1b45a2 1536 hdr_info->u.dwarf.table = false;
bce7c9d6
SL
1537 /* Only warn if --eh-frame-hdr was specified. */
1538 if (info->eh_frame_hdr_type != 0)
83da6e74 1539 {
bce7c9d6
SL
1540 if (num_warnings_issued < 10)
1541 {
1542 _bfd_error_handler
1543 /* xgettext:c-format */
1544 (_("FDE encoding in %pB(%pA) prevents .eh_frame_hdr"
1545 " table being created"), abfd, sec);
1546 num_warnings_issued ++;
1547 }
1548 else if (num_warnings_issued == 10)
1549 {
1550 _bfd_error_handler
1551 (_("further warnings about FDE encoding preventing .eh_frame_hdr generation dropped"));
1552 num_warnings_issued ++;
1553 }
83da6e74 1554 }
ca92cecb
RS
1555 }
1556 ent->removed = 0;
2f0c68f2 1557 hdr_info->u.dwarf.fde_count++;
18e04883
RS
1558 ent->u.fde.cie_inf = find_merged_cie (abfd, info, sec, hdr_info,
1559 cookie, ent->u.fde.cie_inf);
bce613b9 1560 }
ca92cecb
RS
1561 }
1562
c9594989
AM
1563 free (sec_info->cies);
1564 sec_info->cies = NULL;
184d07da 1565
2e0ce1c8
AM
1566 /* It may be that some .eh_frame input section has greater alignment
1567 than other .eh_frame sections. In that case we run the risk of
1568 padding with zeros before that section, which would be seen as a
1569 zero terminator. Alignment padding must be added *inside* the
1570 last FDE instead. For other FDEs we align according to their
1571 encoding, in order to align FDE address range entries naturally. */
ca92cecb 1572 offset = 0;
d7153c4a 1573 changed = 0;
ca92cecb
RS
1574 for (ent = sec_info->entry; ent < sec_info->entry + sec_info->count; ++ent)
1575 if (!ent->removed)
1576 {
2e0ce1c8
AM
1577 eh_alignment = 4;
1578 if (ent->size == 4)
1579 ;
1580 else if (ent->cie)
1581 {
1582 if (ent->u.cie.per_encoding_aligned8)
1583 eh_alignment = 8;
1584 }
1585 else
1586 {
1587 eh_alignment = get_DW_EH_PE_width (ent->fde_encoding, ptr_size);
1588 if (eh_alignment < 4)
1589 eh_alignment = 4;
1590 }
1591 offset = (offset + eh_alignment - 1) & -eh_alignment;
353057a5 1592 ent->new_offset = offset;
d7153c4a
AM
1593 if (ent->new_offset != ent->offset)
1594 changed = 1;
2e0ce1c8 1595 offset += size_of_output_cie_fde (ent);
fda3ecf2 1596 }
65765700 1597
2e0ce1c8 1598 eh_alignment = 4;
2e0ce1c8 1599 offset = (offset + eh_alignment - 1) & -eh_alignment;
eea6121a 1600 sec->rawsize = sec->size;
353057a5 1601 sec->size = offset;
d7153c4a
AM
1602 if (sec->size != sec->rawsize)
1603 changed = 1;
1604
1605 if (changed && adjust_eh_frame_local_symbols (sec, cookie))
1606 {
1607 Elf_Internal_Shdr *symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1608 symtab_hdr->contents = (unsigned char *) cookie->locsyms;
1609 }
1610 return changed;
65765700
JJ
1611}
1612
1613/* This function is called for .eh_frame_hdr section after
1614 _bfd_elf_discard_section_eh_frame has been called on all .eh_frame
1615 input sections. It finalizes the size of .eh_frame_hdr section. */
1616
0a1b45a2 1617bool
8df52eee 1618_bfd_elf_discard_section_eh_frame_hdr (struct bfd_link_info *info)
65765700 1619{
126495ed 1620 struct elf_link_hash_table *htab;
65765700 1621 struct eh_frame_hdr_info *hdr_info;
126495ed 1622 asection *sec;
65765700 1623
126495ed
AM
1624 htab = elf_hash_table (info);
1625 hdr_info = &htab->eh_info;
bce613b9 1626
2f0c68f2 1627 if (!hdr_info->frame_hdr_is_compact && hdr_info->u.dwarf.cies != NULL)
184d07da 1628 {
2f0c68f2
CM
1629 htab_delete (hdr_info->u.dwarf.cies);
1630 hdr_info->u.dwarf.cies = NULL;
184d07da
RS
1631 }
1632
701fe09b
AM
1633 if (info->eh_frame_hdr_type == 0
1634 || bfd_link_relocatable (info))
1635 return false;
1636
126495ed
AM
1637 sec = hdr_info->hdr_sec;
1638 if (sec == NULL)
0a1b45a2 1639 return false;
126495ed 1640
2f0c68f2
CM
1641 if (info->eh_frame_hdr_type == COMPACT_EH_HDR)
1642 {
1643 /* For compact frames we only add the header. The actual table comes
07d6d2b8 1644 from the .eh_frame_entry sections. */
2f0c68f2
CM
1645 sec->size = 8;
1646 }
1647 else
1648 {
1649 sec->size = EH_FRAME_HDR_SIZE;
1650 if (hdr_info->u.dwarf.table)
1651 sec->size += 4 + hdr_info->u.dwarf.fde_count * 8;
1652 }
65765700 1653
0a1b45a2 1654 return true;
65765700
JJ
1655}
1656
9a2a56cc
AM
1657/* Return true if there is at least one non-empty .eh_frame section in
1658 input files. Can only be called after ld has mapped input to
1659 output sections, and before sections are stripped. */
2f0c68f2 1660
0a1b45a2 1661bool
9a2a56cc
AM
1662_bfd_elf_eh_frame_present (struct bfd_link_info *info)
1663{
1664 asection *eh = bfd_get_section_by_name (info->output_bfd, ".eh_frame");
1665
1666 if (eh == NULL)
0a1b45a2 1667 return false;
9a2a56cc
AM
1668
1669 /* Count only sections which have at least a single CIE or FDE.
1670 There cannot be any CIE or FDE <= 8 bytes. */
1671 for (eh = eh->map_head.s; eh != NULL; eh = eh->map_head.s)
1672 if (eh->size > 8)
0a1b45a2 1673 return true;
9a2a56cc 1674
0a1b45a2 1675 return false;
9a2a56cc
AM
1676}
1677
2f0c68f2
CM
1678/* Return true if there is at least one .eh_frame_entry section in
1679 input files. */
1680
0a1b45a2 1681bool
2f0c68f2
CM
1682_bfd_elf_eh_frame_entry_present (struct bfd_link_info *info)
1683{
1684 asection *o;
1685 bfd *abfd;
1686
1687 for (abfd = info->input_bfds; abfd != NULL; abfd = abfd->link.next)
1688 {
1689 for (o = abfd->sections; o; o = o->next)
1690 {
fd361982 1691 const char *name = bfd_section_name (o);
2f0c68f2
CM
1692
1693 if (strcmp (name, ".eh_frame_entry")
1694 && !bfd_is_abs_section (o->output_section))
0a1b45a2 1695 return true;
2f0c68f2
CM
1696 }
1697 }
0a1b45a2 1698 return false;
2f0c68f2
CM
1699}
1700
68f69152
JJ
1701/* This function is called from size_dynamic_sections.
1702 It needs to decide whether .eh_frame_hdr should be output or not,
8423293d
AM
1703 because when the dynamic symbol table has been sized it is too late
1704 to strip sections. */
68f69152 1705
0a1b45a2 1706bool
c39a58e6 1707_bfd_elf_maybe_strip_eh_frame_hdr (struct bfd_link_info *info)
68f69152 1708{
126495ed 1709 struct elf_link_hash_table *htab;
68f69152 1710 struct eh_frame_hdr_info *hdr_info;
2f0c68f2
CM
1711 struct bfd_link_hash_entry *bh = NULL;
1712 struct elf_link_hash_entry *h;
68f69152 1713
126495ed
AM
1714 htab = elf_hash_table (info);
1715 hdr_info = &htab->eh_info;
1716 if (hdr_info->hdr_sec == NULL)
0a1b45a2 1717 return true;
68f69152 1718
9a2a56cc 1719 if (bfd_is_abs_section (hdr_info->hdr_sec->output_section)
2f0c68f2
CM
1720 || info->eh_frame_hdr_type == 0
1721 || (info->eh_frame_hdr_type == DWARF2_EH_HDR
1722 && !_bfd_elf_eh_frame_present (info))
1723 || (info->eh_frame_hdr_type == COMPACT_EH_HDR
1724 && !_bfd_elf_eh_frame_entry_present (info)))
68f69152 1725 {
8423293d 1726 hdr_info->hdr_sec->flags |= SEC_EXCLUDE;
126495ed 1727 hdr_info->hdr_sec = NULL;
0a1b45a2 1728 return true;
68f69152 1729 }
126495ed 1730
2f0c68f2
CM
1731 /* Add a hidden symbol so that systems without access to PHDRs can
1732 find the table. */
1733 if (! (_bfd_generic_link_add_one_symbol
1734 (info, info->output_bfd, "__GNU_EH_FRAME_HDR", BSF_LOCAL,
0a1b45a2
AM
1735 hdr_info->hdr_sec, 0, NULL, false, false, &bh)))
1736 return false;
2f0c68f2
CM
1737
1738 h = (struct elf_link_hash_entry *) bh;
1739 h->def_regular = 1;
1740 h->other = STV_HIDDEN;
1741 get_elf_backend_data
0a1b45a2 1742 (info->output_bfd)->elf_backend_hide_symbol (info, h, true);
2f0c68f2
CM
1743
1744 if (!hdr_info->frame_hdr_is_compact)
0a1b45a2
AM
1745 hdr_info->u.dwarf.table = true;
1746 return true;
68f69152
JJ
1747}
1748
65765700
JJ
1749/* Adjust an address in the .eh_frame section. Given OFFSET within
1750 SEC, this returns the new offset in the adjusted .eh_frame section,
1751 or -1 if the address refers to a CIE/FDE which has been removed
1752 or to offset with dynamic relocation which is no longer needed. */
1753
1754bfd_vma
c39a58e6 1755_bfd_elf_eh_frame_section_offset (bfd *output_bfd ATTRIBUTE_UNUSED,
3d540e93 1756 struct bfd_link_info *info ATTRIBUTE_UNUSED,
c39a58e6
AM
1757 asection *sec,
1758 bfd_vma offset)
65765700
JJ
1759{
1760 struct eh_frame_sec_info *sec_info;
1761 unsigned int lo, hi, mid;
1762
dbaa2011 1763 if (sec->sec_info_type != SEC_INFO_TYPE_EH_FRAME)
65765700 1764 return offset;
a50b1753 1765 sec_info = (struct eh_frame_sec_info *) elf_section_data (sec)->sec_info;
65765700 1766
eea6121a
AM
1767 if (offset >= sec->rawsize)
1768 return offset - sec->rawsize + sec->size;
65765700
JJ
1769
1770 lo = 0;
1771 hi = sec_info->count;
1772 mid = 0;
1773 while (lo < hi)
1774 {
1775 mid = (lo + hi) / 2;
1776 if (offset < sec_info->entry[mid].offset)
1777 hi = mid;
1778 else if (offset
1779 >= sec_info->entry[mid].offset + sec_info->entry[mid].size)
1780 lo = mid + 1;
1781 else
1782 break;
1783 }
1784
1785 BFD_ASSERT (lo < hi);
1786
1787 /* FDE or CIE was removed. */
1788 if (sec_info->entry[mid].removed)
1789 return (bfd_vma) -1;
1790
18e04883
RS
1791 /* If converting personality pointers to DW_EH_PE_pcrel, there will be
1792 no need for run-time relocation against the personality field. */
1793 if (sec_info->entry[mid].cie
1794 && sec_info->entry[mid].u.cie.make_per_encoding_relative
1795 && offset == (sec_info->entry[mid].offset + 8
1796 + sec_info->entry[mid].u.cie.personality_offset))
1797 return (bfd_vma) -2;
1798
65765700
JJ
1799 /* If converting to DW_EH_PE_pcrel, there will be no need for run-time
1800 relocation against FDE's initial_location field. */
fda3ecf2 1801 if (!sec_info->entry[mid].cie
6b2cc140 1802 && sec_info->entry[mid].make_relative
353057a5
RS
1803 && offset == sec_info->entry[mid].offset + 8)
1804 return (bfd_vma) -2;
65765700 1805
9e2a4898
JJ
1806 /* If converting LSDA pointers to DW_EH_PE_pcrel, there will be no need
1807 for run-time relocation against LSDA field. */
fda3ecf2 1808 if (!sec_info->entry[mid].cie
9f4b847e
RS
1809 && sec_info->entry[mid].u.fde.cie_inf->u.cie.make_lsda_relative
1810 && offset == (sec_info->entry[mid].offset + 8
1811 + sec_info->entry[mid].lsda_offset))
1812 return (bfd_vma) -2;
9e2a4898 1813
ac685e6a
JJ
1814 /* If converting to DW_EH_PE_pcrel, there will be no need for run-time
1815 relocation against DW_CFA_set_loc's arguments. */
1816 if (sec_info->entry[mid].set_loc
6b2cc140 1817 && sec_info->entry[mid].make_relative
ac685e6a
JJ
1818 && (offset >= sec_info->entry[mid].offset + 8
1819 + sec_info->entry[mid].set_loc[1]))
1820 {
1821 unsigned int cnt;
1822
1823 for (cnt = 1; cnt <= sec_info->entry[mid].set_loc[0]; cnt++)
1824 if (offset == sec_info->entry[mid].offset + 8
1825 + sec_info->entry[mid].set_loc[cnt])
1826 return (bfd_vma) -2;
1827 }
1828
353057a5 1829 /* Any new augmentation bytes go before the first relocation. */
c68836a9 1830 return (offset + sec_info->entry[mid].new_offset
353057a5
RS
1831 - sec_info->entry[mid].offset
1832 + extra_augmentation_string_bytes (sec_info->entry + mid)
1833 + extra_augmentation_data_bytes (sec_info->entry + mid));
65765700
JJ
1834}
1835
2f0c68f2
CM
1836/* Write out .eh_frame_entry section. Add CANTUNWIND terminator if needed.
1837 Also check that the contents look sane. */
1838
0a1b45a2 1839bool
2f0c68f2
CM
1840_bfd_elf_write_section_eh_frame_entry (bfd *abfd, struct bfd_link_info *info,
1841 asection *sec, bfd_byte *contents)
1842{
1843 const struct elf_backend_data *bed;
1844 bfd_byte cantunwind[8];
1845 bfd_vma addr;
1846 bfd_vma last_addr;
1847 bfd_vma offset;
1848 asection *text_sec = (asection *) elf_section_data (sec)->sec_info;
1849
1850 if (!sec->rawsize)
1851 sec->rawsize = sec->size;
1852
1853 BFD_ASSERT (sec->sec_info_type == SEC_INFO_TYPE_EH_FRAME_ENTRY);
1854
1855 /* Check to make sure that the text section corresponding to this eh_frame_entry
1856 section has not been excluded. In particular, mips16 stub entries will be
1857 excluded outside of the normal process. */
1858 if (sec->flags & SEC_EXCLUDE
1859 || text_sec->flags & SEC_EXCLUDE)
0a1b45a2 1860 return true;
2f0c68f2
CM
1861
1862 if (!bfd_set_section_contents (abfd, sec->output_section, contents,
1863 sec->output_offset, sec->rawsize))
0a1b45a2 1864 return false;
2f0c68f2
CM
1865
1866 last_addr = bfd_get_signed_32 (abfd, contents);
1867 /* Check that all the entries are in order. */
1868 for (offset = 8; offset < sec->rawsize; offset += 8)
1869 {
1870 addr = bfd_get_signed_32 (abfd, contents + offset) + offset;
1871 if (addr <= last_addr)
1872 {
695344c0 1873 /* xgettext:c-format */
871b3ab2 1874 _bfd_error_handler (_("%pB: %pA not in order"), sec->owner, sec);
0a1b45a2 1875 return false;
2f0c68f2
CM
1876 }
1877
1878 last_addr = addr;
1879 }
1880
1881 addr = text_sec->output_section->vma + text_sec->output_offset
1882 + text_sec->size;
1883 addr &= ~1;
1884 addr -= (sec->output_section->vma + sec->output_offset + sec->rawsize);
1885 if (addr & 1)
1886 {
695344c0 1887 /* xgettext:c-format */
871b3ab2 1888 _bfd_error_handler (_("%pB: %pA invalid input section size"),
dae82561 1889 sec->owner, sec);
2f0c68f2 1890 bfd_set_error (bfd_error_bad_value);
0a1b45a2 1891 return false;
2f0c68f2
CM
1892 }
1893 if (last_addr >= addr + sec->rawsize)
1894 {
695344c0 1895 /* xgettext:c-format */
871b3ab2 1896 _bfd_error_handler (_("%pB: %pA points past end of text section"),
dae82561 1897 sec->owner, sec);
2f0c68f2 1898 bfd_set_error (bfd_error_bad_value);
0a1b45a2 1899 return false;
2f0c68f2
CM
1900 }
1901
1902 if (sec->size == sec->rawsize)
0a1b45a2 1903 return true;
2f0c68f2
CM
1904
1905 bed = get_elf_backend_data (abfd);
1906 BFD_ASSERT (sec->size == sec->rawsize + 8);
1907 BFD_ASSERT ((addr & 1) == 0);
1908 BFD_ASSERT (bed->cant_unwind_opcode);
1909
1910 bfd_put_32 (abfd, addr, cantunwind);
1911 bfd_put_32 (abfd, (*bed->cant_unwind_opcode) (info), cantunwind + 4);
1912 return bfd_set_section_contents (abfd, sec->output_section, cantunwind,
1913 sec->output_offset + sec->rawsize, 8);
1914}
1915
65765700
JJ
1916/* Write out .eh_frame section. This is called with the relocated
1917 contents. */
1918
0a1b45a2 1919bool
c39a58e6
AM
1920_bfd_elf_write_section_eh_frame (bfd *abfd,
1921 struct bfd_link_info *info,
1922 asection *sec,
1923 bfd_byte *contents)
65765700
JJ
1924{
1925 struct eh_frame_sec_info *sec_info;
126495ed 1926 struct elf_link_hash_table *htab;
65765700 1927 struct eh_frame_hdr_info *hdr_info;
65765700 1928 unsigned int ptr_size;
2e0ce1c8 1929 struct eh_cie_fde *ent, *last_ent;
65765700 1930
dbaa2011 1931 if (sec->sec_info_type != SEC_INFO_TYPE_EH_FRAME)
5dabe785 1932 /* FIXME: octets_per_byte. */
c39a58e6 1933 return bfd_set_section_contents (abfd, sec->output_section, contents,
eea6121a 1934 sec->output_offset, sec->size);
8c946ed5
RS
1935
1936 ptr_size = (get_elf_backend_data (abfd)
1937 ->elf_backend_eh_frame_address_size (abfd, sec));
1938 BFD_ASSERT (ptr_size != 0);
1939
a50b1753 1940 sec_info = (struct eh_frame_sec_info *) elf_section_data (sec)->sec_info;
126495ed
AM
1941 htab = elf_hash_table (info);
1942 hdr_info = &htab->eh_info;
3472e2e9 1943
2f0c68f2
CM
1944 if (hdr_info->u.dwarf.table && hdr_info->u.dwarf.array == NULL)
1945 {
0a1b45a2 1946 hdr_info->frame_hdr_is_compact = false;
2f0c68f2 1947 hdr_info->u.dwarf.array = (struct eh_frame_array_ent *)
07d6d2b8 1948 bfd_malloc (hdr_info->u.dwarf.fde_count
2f0c68f2
CM
1949 * sizeof (*hdr_info->u.dwarf.array));
1950 }
1951 if (hdr_info->u.dwarf.array == NULL)
126495ed 1952 hdr_info = NULL;
65765700 1953
353057a5
RS
1954 /* The new offsets can be bigger or smaller than the original offsets.
1955 We therefore need to make two passes over the section: one backward
1956 pass to move entries up and one forward pass to move entries down.
1957 The two passes won't interfere with each other because entries are
1958 not reordered */
1959 for (ent = sec_info->entry + sec_info->count; ent-- != sec_info->entry;)
1960 if (!ent->removed && ent->new_offset > ent->offset)
fc802241 1961 memmove (contents + ent->new_offset, contents + ent->offset, ent->size);
353057a5
RS
1962
1963 for (ent = sec_info->entry; ent < sec_info->entry + sec_info->count; ++ent)
1964 if (!ent->removed && ent->new_offset < ent->offset)
fc802241 1965 memmove (contents + ent->new_offset, contents + ent->offset, ent->size);
353057a5 1966
2e0ce1c8
AM
1967 last_ent = sec_info->entry + sec_info->count;
1968 for (ent = sec_info->entry; ent < last_ent; ++ent)
65765700 1969 {
353057a5
RS
1970 unsigned char *buf, *end;
1971 unsigned int new_size;
1972
fda3ecf2
AM
1973 if (ent->removed)
1974 continue;
1975
353057a5
RS
1976 if (ent->size == 4)
1977 {
1978 /* Any terminating FDE must be at the end of the section. */
2e0ce1c8 1979 BFD_ASSERT (ent == last_ent - 1);
353057a5
RS
1980 continue;
1981 }
1982
fc802241 1983 buf = contents + ent->new_offset;
353057a5 1984 end = buf + ent->size;
2e0ce1c8 1985 new_size = next_cie_fde_offset (ent, last_ent, sec) - ent->new_offset;
353057a5 1986
a34a056a
L
1987 /* Update the size. It may be shrinked. */
1988 bfd_put_32 (abfd, new_size - 4, buf);
1989
1990 /* Filling the extra bytes with DW_CFA_nops. */
353057a5 1991 if (new_size != ent->size)
a34a056a 1992 memset (end, 0, new_size - ent->size);
353057a5 1993
fda3ecf2 1994 if (ent->cie)
65765700
JJ
1995 {
1996 /* CIE */
353057a5 1997 if (ent->make_relative
9f4b847e 1998 || ent->u.cie.make_lsda_relative
6b2cc140 1999 || ent->u.cie.per_encoding_relative)
65765700 2000 {
f075ee0c 2001 char *aug;
4ffd2909 2002 unsigned int version, action, extra_string, extra_data;
2c42be65 2003 unsigned int per_width, per_encoding;
65765700 2004
9e2a4898 2005 /* Need to find 'R' or 'L' augmentation's argument and modify
65765700 2006 DW_EH_PE_* value. */
353057a5 2007 action = ((ent->make_relative ? 1 : 0)
9f4b847e 2008 | (ent->u.cie.make_lsda_relative ? 2 : 0)
6b2cc140 2009 | (ent->u.cie.per_encoding_relative ? 4 : 0));
353057a5
RS
2010 extra_string = extra_augmentation_string_bytes (ent);
2011 extra_data = extra_augmentation_data_bytes (ent);
2012
4ffd2909
TC
2013 /* Skip length, id. */
2014 buf += 8;
2015 version = *buf++;
f075ee0c
AM
2016 aug = (char *) buf;
2017 buf += strlen (aug) + 1;
2c42be65
RS
2018 skip_leb128 (&buf, end);
2019 skip_leb128 (&buf, end);
4ffd2909
TC
2020 if (version == 1)
2021 skip_bytes (&buf, end, 1);
2022 else
2023 skip_leb128 (&buf, end);
65765700
JJ
2024 if (*aug == 'z')
2025 {
353057a5
RS
2026 /* The uleb128 will always be a single byte for the kind
2027 of augmentation strings that we're prepared to handle. */
2028 *buf++ += extra_data;
65765700
JJ
2029 aug++;
2030 }
2031
353057a5
RS
2032 /* Make room for the new augmentation string and data bytes. */
2033 memmove (buf + extra_string + extra_data, buf, end - buf);
f075ee0c 2034 memmove (aug + extra_string, aug, buf - (bfd_byte *) aug);
353057a5 2035 buf += extra_string;
2c42be65 2036 end += extra_string + extra_data;
353057a5
RS
2037
2038 if (ent->add_augmentation_size)
2039 {
2040 *aug++ = 'z';
2041 *buf++ = extra_data - 1;
2042 }
6b2cc140 2043 if (ent->u.cie.add_fde_encoding)
353057a5
RS
2044 {
2045 BFD_ASSERT (action & 1);
2046 *aug++ = 'R';
30af5962 2047 *buf++ = make_pc_relative (DW_EH_PE_absptr, ptr_size);
353057a5
RS
2048 action &= ~1;
2049 }
2050
9e2a4898 2051 while (action)
65765700
JJ
2052 switch (*aug++)
2053 {
2054 case 'L':
9e2a4898
JJ
2055 if (action & 2)
2056 {
fda3ecf2 2057 BFD_ASSERT (*buf == ent->lsda_encoding);
30af5962 2058 *buf = make_pc_relative (*buf, ptr_size);
9e2a4898
JJ
2059 action &= ~2;
2060 }
65765700
JJ
2061 buf++;
2062 break;
2063 case 'P':
18e04883 2064 if (ent->u.cie.make_per_encoding_relative)
a10917ef 2065 *buf = make_pc_relative (*buf, ptr_size);
65765700 2066 per_encoding = *buf++;
3472e2e9 2067 per_width = get_DW_EH_PE_width (per_encoding, ptr_size);
65765700 2068 BFD_ASSERT (per_width != 0);
09ae86c2 2069 BFD_ASSERT (((per_encoding & 0x70) == DW_EH_PE_pcrel)
6b2cc140 2070 == ent->u.cie.per_encoding_relative);
18e04883 2071 if ((per_encoding & 0x70) == DW_EH_PE_aligned)
65765700
JJ
2072 buf = (contents
2073 + ((buf - contents + per_width - 1)
2074 & ~((bfd_size_type) per_width - 1)));
09ae86c2
JJ
2075 if (action & 4)
2076 {
fda3ecf2
AM
2077 bfd_vma val;
2078
2079 val = read_value (abfd, buf, per_width,
2080 get_DW_EH_PE_signed (per_encoding));
18e04883
RS
2081 if (ent->u.cie.make_per_encoding_relative)
2082 val -= (sec->output_section->vma
2083 + sec->output_offset
2084 + (buf - contents));
2085 else
2086 {
2087 val += (bfd_vma) ent->offset - ent->new_offset;
2088 val -= extra_string + extra_data;
2089 }
fda3ecf2 2090 write_value (abfd, buf, val, per_width);
09ae86c2
JJ
2091 action &= ~4;
2092 }
65765700
JJ
2093 buf += per_width;
2094 break;
9e2a4898
JJ
2095 case 'R':
2096 if (action & 1)
2097 {
fda3ecf2 2098 BFD_ASSERT (*buf == ent->fde_encoding);
30af5962 2099 *buf = make_pc_relative (*buf, ptr_size);
9e2a4898
JJ
2100 action &= ~1;
2101 }
2102 buf++;
2103 break;
63752a75
JJ
2104 case 'S':
2105 break;
65765700
JJ
2106 default:
2107 BFD_FAIL ();
2108 }
65765700
JJ
2109 }
2110 }
353057a5 2111 else
65765700
JJ
2112 {
2113 /* FDE */
fda3ecf2 2114 bfd_vma value, address;
9e2a4898 2115 unsigned int width;
ac685e6a 2116 bfd_byte *start;
155eaaa0 2117 struct eh_cie_fde *cie;
65765700 2118
b34976b6 2119 /* Skip length. */
155eaaa0 2120 cie = ent->u.fde.cie_inf;
65765700 2121 buf += 4;
fc802241
RS
2122 value = ((ent->new_offset + sec->output_offset + 4)
2123 - (cie->new_offset + cie->u.cie.u.sec->output_offset));
fda3ecf2 2124 bfd_put_32 (abfd, value, buf);
0e1862bb 2125 if (bfd_link_relocatable (info))
5b69e357 2126 continue;
65765700 2127 buf += 4;
fda3ecf2
AM
2128 width = get_DW_EH_PE_width (ent->fde_encoding, ptr_size);
2129 value = read_value (abfd, buf, width,
2130 get_DW_EH_PE_signed (ent->fde_encoding));
2131 address = value;
9e2a4898 2132 if (value)
65765700 2133 {
18e04883 2134 switch (ent->fde_encoding & 0x70)
9e2a4898 2135 {
9e2a4898
JJ
2136 case DW_EH_PE_textrel:
2137 BFD_ASSERT (hdr_info == NULL);
2138 break;
2139 case DW_EH_PE_datarel:
2140 {
cd9e734e
AM
2141 switch (abfd->arch_info->arch)
2142 {
2143 case bfd_arch_ia64:
2144 BFD_ASSERT (elf_gp (abfd) != 0);
2145 address += elf_gp (abfd);
2146 break;
2147 default:
9793eb77
AM
2148 _bfd_error_handler
2149 (_("DW_EH_PE_datarel unspecified"
2150 " for this architecture"));
cd9e734e
AM
2151 /* Fall thru */
2152 case bfd_arch_frv:
2153 case bfd_arch_i386:
2154 BFD_ASSERT (htab->hgot != NULL
2155 && ((htab->hgot->root.type
2156 == bfd_link_hash_defined)
2157 || (htab->hgot->root.type
2158 == bfd_link_hash_defweak)));
2159 address
2160 += (htab->hgot->root.u.def.value
2161 + htab->hgot->root.u.def.section->output_offset
2162 + (htab->hgot->root.u.def.section->output_section
2163 ->vma));
2164 break;
2165 }
9e2a4898
JJ
2166 }
2167 break;
2168 case DW_EH_PE_pcrel:
9c47c4c1 2169 value += (bfd_vma) ent->offset - ent->new_offset;
fc802241
RS
2170 address += (sec->output_section->vma
2171 + sec->output_offset
2172 + ent->offset + 8);
9e2a4898
JJ
2173 break;
2174 }
6b2cc140 2175 if (ent->make_relative)
fc802241
RS
2176 value -= (sec->output_section->vma
2177 + sec->output_offset
2178 + ent->new_offset + 8);
9e2a4898 2179 write_value (abfd, buf, value, width);
65765700
JJ
2180 }
2181
ac685e6a
JJ
2182 start = buf;
2183
65765700
JJ
2184 if (hdr_info)
2185 {
cd9e734e
AM
2186 /* The address calculation may overflow, giving us a
2187 value greater than 4G on a 32-bit target when
2188 dwarf_vma is 64-bit. */
2189 if (sizeof (address) > 4 && ptr_size == 4)
2190 address &= 0xffffffff;
2f0c68f2
CM
2191 hdr_info->u.dwarf.array[hdr_info->array_count].initial_loc
2192 = address;
2193 hdr_info->u.dwarf.array[hdr_info->array_count].range
0a1b45a2 2194 = read_value (abfd, buf + width, width, false);
2f0c68f2 2195 hdr_info->u.dwarf.array[hdr_info->array_count++].fde
fc802241
RS
2196 = (sec->output_section->vma
2197 + sec->output_offset
2198 + ent->new_offset);
65765700 2199 }
9e2a4898 2200
18e04883 2201 if ((ent->lsda_encoding & 0x70) == DW_EH_PE_pcrel
9f4b847e 2202 || cie->u.cie.make_lsda_relative)
9e2a4898 2203 {
fda3ecf2
AM
2204 buf += ent->lsda_offset;
2205 width = get_DW_EH_PE_width (ent->lsda_encoding, ptr_size);
84f97cb6 2206 value = read_value (abfd, buf, width,
fda3ecf2 2207 get_DW_EH_PE_signed (ent->lsda_encoding));
9e2a4898
JJ
2208 if (value)
2209 {
18e04883 2210 if ((ent->lsda_encoding & 0x70) == DW_EH_PE_pcrel)
9c47c4c1 2211 value += (bfd_vma) ent->offset - ent->new_offset;
9f4b847e 2212 else if (cie->u.cie.make_lsda_relative)
fc802241
RS
2213 value -= (sec->output_section->vma
2214 + sec->output_offset
2215 + ent->new_offset + 8 + ent->lsda_offset);
9e2a4898
JJ
2216 write_value (abfd, buf, value, width);
2217 }
2218 }
6b2cc140 2219 else if (ent->add_augmentation_size)
353057a5
RS
2220 {
2221 /* Skip the PC and length and insert a zero byte for the
2222 augmentation size. */
2223 buf += width * 2;
2224 memmove (buf + 1, buf, end - buf);
2225 *buf = 0;
2226 }
ac685e6a
JJ
2227
2228 if (ent->set_loc)
2229 {
2230 /* Adjust DW_CFA_set_loc. */
91d6fa6a 2231 unsigned int cnt;
ac685e6a
JJ
2232 bfd_vma new_offset;
2233
2234 width = get_DW_EH_PE_width (ent->fde_encoding, ptr_size);
2235 new_offset = ent->new_offset + 8
2236 + extra_augmentation_string_bytes (ent)
2237 + extra_augmentation_data_bytes (ent);
2238
2239 for (cnt = 1; cnt <= ent->set_loc[0]; cnt++)
2240 {
ac685e6a
JJ
2241 buf = start + ent->set_loc[cnt];
2242
2243 value = read_value (abfd, buf, width,
2244 get_DW_EH_PE_signed (ent->fde_encoding));
2245 if (!value)
2246 continue;
2247
18e04883 2248 if ((ent->fde_encoding & 0x70) == DW_EH_PE_pcrel)
9c47c4c1 2249 value += (bfd_vma) ent->offset + 8 - new_offset;
6b2cc140 2250 if (ent->make_relative)
fc802241
RS
2251 value -= (sec->output_section->vma
2252 + sec->output_offset
2253 + new_offset + ent->set_loc[cnt]);
ac685e6a
JJ
2254 write_value (abfd, buf, value, width);
2255 }
2256 }
65765700 2257 }
65765700
JJ
2258 }
2259
5dabe785 2260 /* FIXME: octets_per_byte. */
65765700 2261 return bfd_set_section_contents (abfd, sec->output_section,
3472e2e9
AM
2262 contents, (file_ptr) sec->output_offset,
2263 sec->size);
65765700
JJ
2264}
2265
2266/* Helper function used to sort .eh_frame_hdr search table by increasing
2267 VMA of FDE initial location. */
2268
2269static int
c39a58e6 2270vma_compare (const void *a, const void *b)
65765700 2271{
a50b1753
NC
2272 const struct eh_frame_array_ent *p = (const struct eh_frame_array_ent *) a;
2273 const struct eh_frame_array_ent *q = (const struct eh_frame_array_ent *) b;
65765700
JJ
2274 if (p->initial_loc > q->initial_loc)
2275 return 1;
2276 if (p->initial_loc < q->initial_loc)
2277 return -1;
c2aaac08
AM
2278 if (p->range > q->range)
2279 return 1;
2280 if (p->range < q->range)
2281 return -1;
65765700
JJ
2282 return 0;
2283}
2284
2f0c68f2
CM
2285/* Reorder .eh_frame_entry sections to match the associated text sections.
2286 This routine is called during the final linking step, just before writing
2287 the contents. At this stage, sections in the eh_frame_hdr_info are already
2288 sorted in order of increasing text section address and so we simply need
2289 to make the .eh_frame_entrys follow that same order. Note that it is
2290 invalid for a linker script to try to force a particular order of
2291 .eh_frame_entry sections. */
2292
0a1b45a2 2293bool
2f0c68f2
CM
2294_bfd_elf_fixup_eh_frame_hdr (struct bfd_link_info *info)
2295{
2296 asection *sec = NULL;
2297 asection *osec;
2298 struct eh_frame_hdr_info *hdr_info;
2299 unsigned int i;
2300 bfd_vma offset;
2301 struct bfd_link_order *p;
2302
2303 hdr_info = &elf_hash_table (info)->eh_info;
2304
2305 if (hdr_info->hdr_sec == NULL
2306 || info->eh_frame_hdr_type != COMPACT_EH_HDR
2307 || hdr_info->array_count == 0)
0a1b45a2 2308 return true;
2f0c68f2
CM
2309
2310 /* Change section output offsets to be in text section order. */
2311 offset = 8;
2312 osec = hdr_info->u.compact.entries[0]->output_section;
2313 for (i = 0; i < hdr_info->array_count; i++)
2314 {
2315 sec = hdr_info->u.compact.entries[i];
2316 if (sec->output_section != osec)
2317 {
4eca0228 2318 _bfd_error_handler
9793eb77 2319 (_("invalid output section for .eh_frame_entry: %pA"),
dae82561 2320 sec->output_section);
0a1b45a2 2321 return false;
2f0c68f2
CM
2322 }
2323 sec->output_offset = offset;
2324 offset += sec->size;
2325 }
2326
2327
2328 /* Fix the link_order to match. */
2329 for (p = sec->output_section->map_head.link_order; p != NULL; p = p->next)
2330 {
2331 if (p->type != bfd_indirect_link_order)
2332 abort();
2333
2334 p->offset = p->u.indirect.section->output_offset;
2335 if (p->next != NULL)
07d6d2b8 2336 i--;
2f0c68f2
CM
2337 }
2338
2339 if (i != 0)
2340 {
4eca0228 2341 _bfd_error_handler
9793eb77 2342 (_("invalid contents in %pA section"), osec);
0a1b45a2 2343 return false;
2f0c68f2
CM
2344 }
2345
0a1b45a2 2346 return true;
2f0c68f2
CM
2347}
2348
2349/* The .eh_frame_hdr format for Compact EH frames:
2350 ubyte version (2)
2351 ubyte eh_ref_enc (DW_EH_PE_* encoding of typinfo references)
2352 uint32_t count (Number of entries in table)
2353 [array from .eh_frame_entry sections] */
2354
0a1b45a2 2355static bool
2f0c68f2
CM
2356write_compact_eh_frame_hdr (bfd *abfd, struct bfd_link_info *info)
2357{
2358 struct elf_link_hash_table *htab;
2359 struct eh_frame_hdr_info *hdr_info;
2360 asection *sec;
2361 const struct elf_backend_data *bed;
2362 bfd_vma count;
2363 bfd_byte contents[8];
2364 unsigned int i;
2365
2366 htab = elf_hash_table (info);
2367 hdr_info = &htab->eh_info;
2368 sec = hdr_info->hdr_sec;
2369
2370 if (sec->size != 8)
2371 abort();
2372
2373 for (i = 0; i < sizeof (contents); i++)
2374 contents[i] = 0;
2375
2376 contents[0] = COMPACT_EH_HDR;
2377 bed = get_elf_backend_data (abfd);
2378
2379 BFD_ASSERT (bed->compact_eh_encoding);
2380 contents[1] = (*bed->compact_eh_encoding) (info);
2381
2382 count = (sec->output_section->size - 8) / 8;
2383 bfd_put_32 (abfd, count, contents + 4);
2384 return bfd_set_section_contents (abfd, sec->output_section, contents,
2385 (file_ptr) sec->output_offset, sec->size);
2386}
2387
2388/* The .eh_frame_hdr format for DWARF frames:
2389
65765700 2390 ubyte version (currently 1)
07d6d2b8 2391 ubyte eh_frame_ptr_enc (DW_EH_PE_* encoding of pointer to start of
65765700
JJ
2392 .eh_frame section)
2393 ubyte fde_count_enc (DW_EH_PE_* encoding of total FDE count
2394 number (or DW_EH_PE_omit if there is no
2395 binary search table computed))
2396 ubyte table_enc (DW_EH_PE_* encoding of binary search table,
2397 or DW_EH_PE_omit if not present.
2398 DW_EH_PE_datarel is using address of
2399 .eh_frame_hdr section start as base)
2400 [encoded] eh_frame_ptr (pointer to start of .eh_frame section)
2401 optionally followed by:
2402 [encoded] fde_count (total number of FDEs in .eh_frame section)
2403 fde_count x [encoded] initial_loc, fde
2404 (array of encoded pairs containing
2405 FDE initial_location field and FDE address,
5ed6aba4 2406 sorted by increasing initial_loc). */
65765700 2407
0a1b45a2 2408static bool
2f0c68f2 2409write_dwarf_eh_frame_hdr (bfd *abfd, struct bfd_link_info *info)
65765700 2410{
126495ed 2411 struct elf_link_hash_table *htab;
65765700 2412 struct eh_frame_hdr_info *hdr_info;
126495ed 2413 asection *sec;
ee8f3b6c 2414 bool retval = false;
65765700 2415
126495ed
AM
2416 htab = elf_hash_table (info);
2417 hdr_info = &htab->eh_info;
2418 sec = hdr_info->hdr_sec;
2f0c68f2
CM
2419 bfd_byte *contents;
2420 asection *eh_frame_sec;
2421 bfd_size_type size;
2422 bfd_vma encoded_eh_frame;
2423
2424 size = EH_FRAME_HDR_SIZE;
2425 if (hdr_info->u.dwarf.array
2426 && hdr_info->array_count == hdr_info->u.dwarf.fde_count)
2427 size += 4 + hdr_info->u.dwarf.fde_count * 8;
2428 contents = (bfd_byte *) bfd_malloc (size);
2429 if (contents == NULL)
ee8f3b6c 2430 goto out;
65765700 2431
2f0c68f2
CM
2432 eh_frame_sec = bfd_get_section_by_name (abfd, ".eh_frame");
2433 if (eh_frame_sec == NULL)
ee8f3b6c 2434 goto out;
65765700 2435
2f0c68f2
CM
2436 memset (contents, 0, EH_FRAME_HDR_SIZE);
2437 /* Version. */
2438 contents[0] = 1;
2439 /* .eh_frame offset. */
2440 contents[1] = get_elf_backend_data (abfd)->elf_backend_encode_eh_address
2441 (abfd, info, eh_frame_sec, 0, sec, 4, &encoded_eh_frame);
ec3391e7 2442
2f0c68f2
CM
2443 if (hdr_info->u.dwarf.array
2444 && hdr_info->array_count == hdr_info->u.dwarf.fde_count)
2445 {
2446 /* FDE count encoding. */
2447 contents[2] = DW_EH_PE_udata4;
2448 /* Search table encoding. */
2449 contents[3] = DW_EH_PE_datarel | DW_EH_PE_sdata4;
2450 }
2451 else
2452 {
2453 contents[2] = DW_EH_PE_omit;
2454 contents[3] = DW_EH_PE_omit;
2455 }
2456 bfd_put_32 (abfd, encoded_eh_frame, contents + 4);
ec3391e7 2457
ee8f3b6c 2458 retval = true;
2f0c68f2
CM
2459 if (contents[2] != DW_EH_PE_omit)
2460 {
2461 unsigned int i;
0a1b45a2 2462 bool overlap, overflow;
2f0c68f2
CM
2463
2464 bfd_put_32 (abfd, hdr_info->u.dwarf.fde_count,
2465 contents + EH_FRAME_HDR_SIZE);
2466 qsort (hdr_info->u.dwarf.array, hdr_info->u.dwarf.fde_count,
2467 sizeof (*hdr_info->u.dwarf.array), vma_compare);
0a1b45a2
AM
2468 overlap = false;
2469 overflow = false;
2f0c68f2 2470 for (i = 0; i < hdr_info->u.dwarf.fde_count; i++)
9f7c3e5e 2471 {
2f0c68f2
CM
2472 bfd_vma val;
2473
2474 val = hdr_info->u.dwarf.array[i].initial_loc
2475 - sec->output_section->vma;
2476 val = ((val & 0xffffffff) ^ 0x80000000) - 0x80000000;
2477 if (elf_elfheader (abfd)->e_ident[EI_CLASS] == ELFCLASS64
2478 && (hdr_info->u.dwarf.array[i].initial_loc
2479 != sec->output_section->vma + val))
0a1b45a2 2480 overflow = true;
2f0c68f2
CM
2481 bfd_put_32 (abfd, val, contents + EH_FRAME_HDR_SIZE + i * 8 + 4);
2482 val = hdr_info->u.dwarf.array[i].fde - sec->output_section->vma;
2483 val = ((val & 0xffffffff) ^ 0x80000000) - 0x80000000;
2484 if (elf_elfheader (abfd)->e_ident[EI_CLASS] == ELFCLASS64
2485 && (hdr_info->u.dwarf.array[i].fde
2486 != sec->output_section->vma + val))
0a1b45a2 2487 overflow = true;
2f0c68f2
CM
2488 bfd_put_32 (abfd, val, contents + EH_FRAME_HDR_SIZE + i * 8 + 8);
2489 if (i != 0
2490 && (hdr_info->u.dwarf.array[i].initial_loc
2491 < (hdr_info->u.dwarf.array[i - 1].initial_loc
2492 + hdr_info->u.dwarf.array[i - 1].range)))
0a1b45a2 2493 overlap = true;
9f7c3e5e 2494 }
2f0c68f2 2495 if (overflow)
9793eb77 2496 _bfd_error_handler (_(".eh_frame_hdr entry overflow"));
2f0c68f2 2497 if (overlap)
9793eb77 2498 _bfd_error_handler (_(".eh_frame_hdr refers to overlapping FDEs"));
2f0c68f2 2499 if (overflow || overlap)
9f7c3e5e 2500 {
2f0c68f2 2501 bfd_set_error (bfd_error_bad_value);
0a1b45a2 2502 retval = false;
9f7c3e5e 2503 }
2f0c68f2 2504 }
65765700 2505
2f0c68f2
CM
2506 /* FIXME: octets_per_byte. */
2507 if (!bfd_set_section_contents (abfd, sec->output_section, contents,
2508 (file_ptr) sec->output_offset,
5d4465be 2509 size))
0a1b45a2 2510 retval = false;
ee8f3b6c 2511 out:
2f0c68f2 2512 free (contents);
c9594989 2513 free (hdr_info->u.dwarf.array);
ee8f3b6c 2514 hdr_info->u.dwarf.array = NULL;
2f0c68f2
CM
2515 return retval;
2516}
9f7c3e5e 2517
2f0c68f2
CM
2518/* Write out .eh_frame_hdr section. This must be called after
2519 _bfd_elf_write_section_eh_frame has been called on all input
2520 .eh_frame sections. */
ae6c7e33 2521
0a1b45a2 2522bool
2f0c68f2
CM
2523_bfd_elf_write_section_eh_frame_hdr (bfd *abfd, struct bfd_link_info *info)
2524{
2525 struct elf_link_hash_table *htab;
2526 struct eh_frame_hdr_info *hdr_info;
2527 asection *sec;
aa8f4d1e 2528
2f0c68f2
CM
2529 htab = elf_hash_table (info);
2530 hdr_info = &htab->eh_info;
2531 sec = hdr_info->hdr_sec;
65765700 2532
2f0c68f2 2533 if (info->eh_frame_hdr_type == 0 || sec == NULL)
0a1b45a2 2534 return true;
2f0c68f2
CM
2535
2536 if (info->eh_frame_hdr_type == COMPACT_EH_HDR)
2537 return write_compact_eh_frame_hdr (abfd, info);
2538 else
2539 return write_dwarf_eh_frame_hdr (abfd, info);
65765700 2540}
ec3391e7 2541
8c946ed5
RS
2542/* Return the width of FDE addresses. This is the default implementation. */
2543
2544unsigned int
76c20d54 2545_bfd_elf_eh_frame_address_size (bfd *abfd, const asection *sec ATTRIBUTE_UNUSED)
8c946ed5
RS
2546{
2547 return elf_elfheader (abfd)->e_ident[EI_CLASS] == ELFCLASS64 ? 8 : 4;
2548}
2549
ec3391e7
AO
2550/* Decide whether we can use a PC-relative encoding within the given
2551 EH frame section. This is the default implementation. */
2552
0a1b45a2 2553bool
ec3391e7
AO
2554_bfd_elf_can_make_relative (bfd *input_bfd ATTRIBUTE_UNUSED,
2555 struct bfd_link_info *info ATTRIBUTE_UNUSED,
2556 asection *eh_frame_section ATTRIBUTE_UNUSED)
2557{
0a1b45a2 2558 return true;
ec3391e7
AO
2559}
2560
2561/* Select an encoding for the given address. Preference is given to
2562 PC-relative addressing modes. */
2563
2564bfd_byte
2565_bfd_elf_encode_eh_address (bfd *abfd ATTRIBUTE_UNUSED,
2566 struct bfd_link_info *info ATTRIBUTE_UNUSED,
2567 asection *osec, bfd_vma offset,
2568 asection *loc_sec, bfd_vma loc_offset,
2569 bfd_vma *encoded)
2570{
2571 *encoded = osec->vma + offset -
2572 (loc_sec->output_section->vma + loc_sec->output_offset + loc_offset);
2573 return DW_EH_PE_pcrel | DW_EH_PE_sdata4;
2574}