bfd/
[deliverable/binutils-gdb.git] / bfd / elf-eh-frame.c
CommitLineData
65765700 1/* .eh_frame section optimization.
64be1553
AM
2 Copyright 2001, 2002, 2003, 2004, 2005, 2006, 2007
3 Free Software Foundation, Inc.
65765700
JJ
4 Written by Jakub Jelinek <jakub@redhat.com>.
5
5ed6aba4 6 This file is part of BFD, the Binary File Descriptor library.
65765700 7
5ed6aba4
NC
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
cd123cb7 10 the Free Software Foundation; either version 3 of the License, or
5ed6aba4 11 (at your option) any later version.
65765700 12
5ed6aba4
NC
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
65765700 17
5ed6aba4
NC
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
cd123cb7
NC
20 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
21 MA 02110-1301, USA. */
65765700 22
65765700 23#include "sysdep.h"
3db64b00 24#include "bfd.h"
65765700
JJ
25#include "libbfd.h"
26#include "elf-bfd.h"
27#include "elf/dwarf2.h"
28
29#define EH_FRAME_HDR_SIZE 8
30
bce613b9
JJ
31struct cie
32{
33 unsigned int length;
34 unsigned int hash;
35 unsigned char version;
f137a54e 36 unsigned char local_personality;
bce613b9
JJ
37 char augmentation[20];
38 bfd_vma code_align;
39 bfd_signed_vma data_align;
40 bfd_vma ra_column;
41 bfd_vma augmentation_size;
f137a54e
AM
42 union {
43 struct elf_link_hash_entry *h;
44 bfd_vma val;
45 } personality;
bce613b9
JJ
46 asection *output_sec;
47 struct eh_cie_fde *cie_inf;
48 unsigned char per_encoding;
49 unsigned char lsda_encoding;
50 unsigned char fde_encoding;
51 unsigned char initial_insn_length;
52 unsigned char make_relative;
53 unsigned char make_lsda_relative;
54 unsigned char initial_instructions[50];
55};
56
57
58
2c42be65
RS
59/* If *ITER hasn't reached END yet, read the next byte into *RESULT and
60 move onto the next byte. Return true on success. */
61
62static inline bfd_boolean
63read_byte (bfd_byte **iter, bfd_byte *end, unsigned char *result)
64{
65 if (*iter >= end)
66 return FALSE;
67 *result = *((*iter)++);
68 return TRUE;
69}
70
71/* Move *ITER over LENGTH bytes, or up to END, whichever is closer.
72 Return true it was possible to move LENGTH bytes. */
73
74static inline bfd_boolean
75skip_bytes (bfd_byte **iter, bfd_byte *end, bfd_size_type length)
76{
77 if ((bfd_size_type) (end - *iter) < length)
78 {
79 *iter = end;
80 return FALSE;
81 }
82 *iter += length;
83 return TRUE;
84}
85
86/* Move *ITER over an leb128, stopping at END. Return true if the end
87 of the leb128 was found. */
88
89static bfd_boolean
90skip_leb128 (bfd_byte **iter, bfd_byte *end)
91{
92 unsigned char byte;
93 do
94 if (!read_byte (iter, end, &byte))
95 return FALSE;
96 while (byte & 0x80);
97 return TRUE;
98}
99
100/* Like skip_leb128, but treat the leb128 as an unsigned value and
101 store it in *VALUE. */
102
103static bfd_boolean
104read_uleb128 (bfd_byte **iter, bfd_byte *end, bfd_vma *value)
105{
106 bfd_byte *start, *p;
107
108 start = *iter;
109 if (!skip_leb128 (iter, end))
110 return FALSE;
111
112 p = *iter;
113 *value = *--p;
114 while (p > start)
115 *value = (*value << 7) | (*--p & 0x7f);
116
117 return TRUE;
118}
119
120/* Like read_uleb128, but for signed values. */
121
122static bfd_boolean
123read_sleb128 (bfd_byte **iter, bfd_byte *end, bfd_signed_vma *value)
124{
125 bfd_byte *start, *p;
126
127 start = *iter;
128 if (!skip_leb128 (iter, end))
129 return FALSE;
130
131 p = *iter;
132 *value = ((*--p & 0x7f) ^ 0x40) - 0x40;
133 while (p > start)
134 *value = (*value << 7) | (*--p & 0x7f);
135
136 return TRUE;
137}
65765700
JJ
138
139/* Return 0 if either encoding is variable width, or not yet known to bfd. */
140
141static
c39a58e6 142int get_DW_EH_PE_width (int encoding, int ptr_size)
65765700
JJ
143{
144 /* DW_EH_PE_ values of 0x60 and 0x70 weren't defined at the time .eh_frame
145 was added to bfd. */
146 if ((encoding & 0x60) == 0x60)
147 return 0;
148
149 switch (encoding & 7)
150 {
151 case DW_EH_PE_udata2: return 2;
152 case DW_EH_PE_udata4: return 4;
153 case DW_EH_PE_udata8: return 8;
154 case DW_EH_PE_absptr: return ptr_size;
155 default:
156 break;
157 }
158
159 return 0;
160}
161
84f97cb6
AS
162#define get_DW_EH_PE_signed(encoding) (((encoding) & DW_EH_PE_signed) != 0)
163
9e2a4898
JJ
164/* Read a width sized value from memory. */
165
166static bfd_vma
c39a58e6 167read_value (bfd *abfd, bfd_byte *buf, int width, int is_signed)
9e2a4898
JJ
168{
169 bfd_vma value;
170
171 switch (width)
172 {
84f97cb6
AS
173 case 2:
174 if (is_signed)
175 value = bfd_get_signed_16 (abfd, buf);
176 else
177 value = bfd_get_16 (abfd, buf);
178 break;
179 case 4:
180 if (is_signed)
181 value = bfd_get_signed_32 (abfd, buf);
182 else
183 value = bfd_get_32 (abfd, buf);
184 break;
185 case 8:
186 if (is_signed)
187 value = bfd_get_signed_64 (abfd, buf);
188 else
189 value = bfd_get_64 (abfd, buf);
190 break;
191 default:
192 BFD_FAIL ();
193 return 0;
9e2a4898
JJ
194 }
195
196 return value;
197}
b34976b6 198
9e2a4898
JJ
199/* Store a width sized value to memory. */
200
201static void
c39a58e6 202write_value (bfd *abfd, bfd_byte *buf, bfd_vma value, int width)
9e2a4898
JJ
203{
204 switch (width)
205 {
206 case 2: bfd_put_16 (abfd, value, buf); break;
207 case 4: bfd_put_32 (abfd, value, buf); break;
208 case 8: bfd_put_64 (abfd, value, buf); break;
209 default: BFD_FAIL ();
210 }
211}
212
bce613b9 213/* Return one if C1 and C2 CIEs can be merged. */
65765700 214
bce613b9
JJ
215static int
216cie_eq (const void *e1, const void *e2)
65765700 217{
bce613b9
JJ
218 const struct cie *c1 = e1;
219 const struct cie *c2 = e2;
220
221 if (c1->hash == c2->hash
222 && c1->length == c2->length
65765700 223 && c1->version == c2->version
f137a54e 224 && c1->local_personality == c2->local_personality
65765700
JJ
225 && strcmp (c1->augmentation, c2->augmentation) == 0
226 && strcmp (c1->augmentation, "eh") != 0
227 && c1->code_align == c2->code_align
228 && c1->data_align == c2->data_align
229 && c1->ra_column == c2->ra_column
230 && c1->augmentation_size == c2->augmentation_size
f137a54e
AM
231 && memcmp (&c1->personality, &c2->personality,
232 sizeof (c1->personality)) == 0
bce613b9 233 && c1->output_sec == c2->output_sec
65765700
JJ
234 && c1->per_encoding == c2->per_encoding
235 && c1->lsda_encoding == c2->lsda_encoding
236 && c1->fde_encoding == c2->fde_encoding
c39a58e6 237 && c1->initial_insn_length == c2->initial_insn_length
65765700
JJ
238 && memcmp (c1->initial_instructions,
239 c2->initial_instructions,
240 c1->initial_insn_length) == 0)
bce613b9 241 return 1;
65765700 242
bce613b9
JJ
243 return 0;
244}
245
246static hashval_t
247cie_hash (const void *e)
248{
249 const struct cie *c = e;
250 return c->hash;
251}
252
253static hashval_t
254cie_compute_hash (struct cie *c)
255{
256 hashval_t h = 0;
257 h = iterative_hash_object (c->length, h);
258 h = iterative_hash_object (c->version, h);
259 h = iterative_hash (c->augmentation, strlen (c->augmentation) + 1, h);
260 h = iterative_hash_object (c->code_align, h);
261 h = iterative_hash_object (c->data_align, h);
262 h = iterative_hash_object (c->ra_column, h);
263 h = iterative_hash_object (c->augmentation_size, h);
264 h = iterative_hash_object (c->personality, h);
265 h = iterative_hash_object (c->output_sec, h);
266 h = iterative_hash_object (c->per_encoding, h);
267 h = iterative_hash_object (c->lsda_encoding, h);
268 h = iterative_hash_object (c->fde_encoding, h);
269 h = iterative_hash_object (c->initial_insn_length, h);
270 h = iterative_hash (c->initial_instructions, c->initial_insn_length, h);
271 c->hash = h;
272 return h;
65765700
JJ
273}
274
353057a5
RS
275/* Return the number of extra bytes that we'll be inserting into
276 ENTRY's augmentation string. */
277
278static INLINE unsigned int
279extra_augmentation_string_bytes (struct eh_cie_fde *entry)
280{
281 unsigned int size = 0;
282 if (entry->cie)
283 {
284 if (entry->add_augmentation_size)
285 size++;
286 if (entry->add_fde_encoding)
287 size++;
288 }
289 return size;
290}
291
292/* Likewise ENTRY's augmentation data. */
293
294static INLINE unsigned int
295extra_augmentation_data_bytes (struct eh_cie_fde *entry)
296{
297 unsigned int size = 0;
298 if (entry->cie)
299 {
300 if (entry->add_augmentation_size)
301 size++;
302 if (entry->add_fde_encoding)
303 size++;
304 }
305 else
306 {
155eaaa0 307 if (entry->u.fde.cie_inf->add_augmentation_size)
353057a5
RS
308 size++;
309 }
310 return size;
311}
312
313/* Return the size that ENTRY will have in the output. ALIGNMENT is the
314 required alignment of ENTRY in bytes. */
315
316static unsigned int
317size_of_output_cie_fde (struct eh_cie_fde *entry, unsigned int alignment)
318{
319 if (entry->removed)
320 return 0;
321 if (entry->size == 4)
322 return 4;
323 return (entry->size
324 + extra_augmentation_string_bytes (entry)
325 + extra_augmentation_data_bytes (entry)
326 + alignment - 1) & -alignment;
327}
328
dcf507a6
RS
329/* Assume that the bytes between *ITER and END are CFA instructions.
330 Try to move *ITER past the first instruction and return true on
331 success. ENCODED_PTR_WIDTH gives the width of pointer entries. */
332
333static bfd_boolean
334skip_cfa_op (bfd_byte **iter, bfd_byte *end, unsigned int encoded_ptr_width)
335{
336 bfd_byte op;
337 bfd_vma length;
338
339 if (!read_byte (iter, end, &op))
340 return FALSE;
341
ac685e6a 342 switch (op & 0xc0 ? op & 0xc0 : op)
dcf507a6
RS
343 {
344 case DW_CFA_nop:
345 case DW_CFA_advance_loc:
346 case DW_CFA_restore:
ac685e6a
JJ
347 case DW_CFA_remember_state:
348 case DW_CFA_restore_state:
349 case DW_CFA_GNU_window_save:
dcf507a6
RS
350 /* No arguments. */
351 return TRUE;
352
353 case DW_CFA_offset:
354 case DW_CFA_restore_extended:
355 case DW_CFA_undefined:
356 case DW_CFA_same_value:
357 case DW_CFA_def_cfa_register:
358 case DW_CFA_def_cfa_offset:
359 case DW_CFA_def_cfa_offset_sf:
360 case DW_CFA_GNU_args_size:
361 /* One leb128 argument. */
362 return skip_leb128 (iter, end);
363
ac685e6a
JJ
364 case DW_CFA_val_offset:
365 case DW_CFA_val_offset_sf:
dcf507a6
RS
366 case DW_CFA_offset_extended:
367 case DW_CFA_register:
368 case DW_CFA_def_cfa:
369 case DW_CFA_offset_extended_sf:
370 case DW_CFA_GNU_negative_offset_extended:
371 case DW_CFA_def_cfa_sf:
372 /* Two leb128 arguments. */
373 return (skip_leb128 (iter, end)
374 && skip_leb128 (iter, end));
375
376 case DW_CFA_def_cfa_expression:
377 /* A variable-length argument. */
378 return (read_uleb128 (iter, end, &length)
379 && skip_bytes (iter, end, length));
380
381 case DW_CFA_expression:
ac685e6a 382 case DW_CFA_val_expression:
dcf507a6
RS
383 /* A leb128 followed by a variable-length argument. */
384 return (skip_leb128 (iter, end)
385 && read_uleb128 (iter, end, &length)
386 && skip_bytes (iter, end, length));
387
388 case DW_CFA_set_loc:
389 return skip_bytes (iter, end, encoded_ptr_width);
390
391 case DW_CFA_advance_loc1:
392 return skip_bytes (iter, end, 1);
393
394 case DW_CFA_advance_loc2:
395 return skip_bytes (iter, end, 2);
396
397 case DW_CFA_advance_loc4:
398 return skip_bytes (iter, end, 4);
399
400 case DW_CFA_MIPS_advance_loc8:
401 return skip_bytes (iter, end, 8);
402
403 default:
404 return FALSE;
405 }
406}
407
408/* Try to interpret the bytes between BUF and END as CFA instructions.
409 If every byte makes sense, return a pointer to the first DW_CFA_nop
410 padding byte, or END if there is no padding. Return null otherwise.
411 ENCODED_PTR_WIDTH is as for skip_cfa_op. */
412
413static bfd_byte *
ac685e6a
JJ
414skip_non_nops (bfd_byte *buf, bfd_byte *end, unsigned int encoded_ptr_width,
415 unsigned int *set_loc_count)
dcf507a6
RS
416{
417 bfd_byte *last;
418
419 last = buf;
420 while (buf < end)
421 if (*buf == DW_CFA_nop)
422 buf++;
423 else
424 {
ac685e6a
JJ
425 if (*buf == DW_CFA_set_loc)
426 ++*set_loc_count;
dcf507a6
RS
427 if (!skip_cfa_op (&buf, end, encoded_ptr_width))
428 return 0;
429 last = buf;
430 }
431 return last;
432}
433
65765700
JJ
434/* This function is called for each input file before the .eh_frame
435 section is relocated. It discards duplicate CIEs and FDEs for discarded
b34976b6 436 functions. The function returns TRUE iff any entries have been
65765700
JJ
437 deleted. */
438
b34976b6 439bfd_boolean
c39a58e6
AM
440_bfd_elf_discard_section_eh_frame
441 (bfd *abfd, struct bfd_link_info *info, asection *sec,
442 bfd_boolean (*reloc_symbol_deleted_p) (bfd_vma, void *),
443 struct elf_reloc_cookie *cookie)
65765700 444{
acfe5567
RS
445#define REQUIRE(COND) \
446 do \
447 if (!(COND)) \
448 goto free_no_table; \
449 while (0)
450
65765700 451 bfd_byte *ehbuf = NULL, *buf;
bce613b9
JJ
452 bfd_byte *last_fde;
453 struct eh_cie_fde *ent, *this_inf;
454 unsigned int hdr_length, hdr_id;
455 struct extended_cie
456 {
457 struct cie cie;
458 unsigned int offset;
459 unsigned int usage_count;
460 unsigned int entry;
461 } *ecies = NULL, *ecie;
462 unsigned int ecie_count = 0, ecie_alloced = 0;
463 struct cie *cie;
126495ed 464 struct elf_link_hash_table *htab;
65765700 465 struct eh_frame_hdr_info *hdr_info;
68f69152 466 struct eh_frame_sec_info *sec_info = NULL;
bce613b9 467 unsigned int offset;
65765700 468 unsigned int ptr_size;
bce613b9 469 unsigned int entry_alloced;
65765700 470
eea6121a 471 if (sec->size == 0)
65765700
JJ
472 {
473 /* This file does not contain .eh_frame information. */
b34976b6 474 return FALSE;
65765700
JJ
475 }
476
e460dd0d 477 if (bfd_is_abs_section (sec->output_section))
65765700
JJ
478 {
479 /* At least one of the sections is being discarded from the
3472e2e9 480 link, so we should just ignore them. */
b34976b6 481 return FALSE;
65765700
JJ
482 }
483
126495ed
AM
484 htab = elf_hash_table (info);
485 hdr_info = &htab->eh_info;
68f69152 486
bce613b9
JJ
487 if (hdr_info->cies == NULL && !info->relocatable)
488 hdr_info->cies = htab_try_create (1, cie_hash, cie_eq, free);
489
65765700
JJ
490 /* Read the frame unwind information from abfd. */
491
acfe5567 492 REQUIRE (bfd_malloc_and_get_section (abfd, sec, &ehbuf));
68f69152 493
eea6121a 494 if (sec->size >= 4
65765700
JJ
495 && bfd_get_32 (abfd, ehbuf) == 0
496 && cookie->rel == cookie->relend)
497 {
498 /* Empty .eh_frame section. */
499 free (ehbuf);
b34976b6 500 return FALSE;
65765700
JJ
501 }
502
65765700
JJ
503 /* If .eh_frame section size doesn't fit into int, we cannot handle
504 it (it would need to use 64-bit .eh_frame format anyway). */
acfe5567 505 REQUIRE (sec->size == (unsigned int) sec->size);
65765700 506
8c946ed5
RS
507 ptr_size = (get_elf_backend_data (abfd)
508 ->elf_backend_eh_frame_address_size (abfd, sec));
509 REQUIRE (ptr_size != 0);
510
65765700 511 buf = ehbuf;
65765700
JJ
512 sec_info = bfd_zmalloc (sizeof (struct eh_frame_sec_info)
513 + 99 * sizeof (struct eh_cie_fde));
acfe5567 514 REQUIRE (sec_info);
eea6121a 515
bce613b9 516 entry_alloced = 100;
65765700
JJ
517
518#define ENSURE_NO_RELOCS(buf) \
acfe5567
RS
519 REQUIRE (!(cookie->rel < cookie->relend \
520 && (cookie->rel->r_offset \
521 < (bfd_size_type) ((buf) - ehbuf)) \
522 && cookie->rel->r_info != 0))
65765700
JJ
523
524#define SKIP_RELOCS(buf) \
525 while (cookie->rel < cookie->relend \
3472e2e9 526 && (cookie->rel->r_offset \
65765700
JJ
527 < (bfd_size_type) ((buf) - ehbuf))) \
528 cookie->rel++
529
530#define GET_RELOC(buf) \
531 ((cookie->rel < cookie->relend \
532 && (cookie->rel->r_offset \
3472e2e9 533 == (bfd_size_type) ((buf) - ehbuf))) \
65765700
JJ
534 ? cookie->rel : NULL)
535
536 for (;;)
537 {
f075ee0c 538 char *aug;
ac685e6a 539 bfd_byte *start, *end, *insns, *insns_end;
2c42be65 540 bfd_size_type length;
ac685e6a 541 unsigned int set_loc_count;
65765700 542
bce613b9 543 if (sec_info->count == entry_alloced)
65765700
JJ
544 {
545 sec_info = bfd_realloc (sec_info,
546 sizeof (struct eh_frame_sec_info)
bce613b9 547 + ((entry_alloced + 99)
fda3ecf2 548 * sizeof (struct eh_cie_fde)));
acfe5567 549 REQUIRE (sec_info);
65765700 550
bce613b9 551 memset (&sec_info->entry[entry_alloced], 0,
65765700 552 100 * sizeof (struct eh_cie_fde));
bce613b9 553 entry_alloced += 100;
65765700
JJ
554 }
555
fda3ecf2 556 this_inf = sec_info->entry + sec_info->count;
65765700 557 last_fde = buf;
bce613b9 558
eea6121a 559 if ((bfd_size_type) (buf - ehbuf) == sec->size)
bce613b9 560 break;
acfe5567 561
bce613b9
JJ
562 /* Read the length of the entry. */
563 REQUIRE (skip_bytes (&buf, ehbuf + sec->size, 4));
564 hdr_length = bfd_get_32 (abfd, buf - 4);
acfe5567 565
bce613b9
JJ
566 /* 64-bit .eh_frame is not supported. */
567 REQUIRE (hdr_length != 0xffffffff);
65765700 568
bce613b9
JJ
569 /* The CIE/FDE must be fully contained in this input section. */
570 REQUIRE ((bfd_size_type) (buf - ehbuf) + hdr_length <= sec->size);
571 end = buf + hdr_length;
65765700 572
bce613b9
JJ
573 this_inf->offset = last_fde - ehbuf;
574 this_inf->size = 4 + hdr_length;
155eaaa0 575 this_inf->reloc_index = cookie->rel - cookie->rels;
bce613b9
JJ
576
577 if (hdr_length == 0)
578 {
579 /* A zero-length CIE should only be found at the end of
580 the section. */
581 REQUIRE ((bfd_size_type) (buf - ehbuf) == sec->size);
582 ENSURE_NO_RELOCS (buf);
583 sec_info->count++;
584 break;
65765700
JJ
585 }
586
bce613b9
JJ
587 REQUIRE (skip_bytes (&buf, end, 4));
588 hdr_id = bfd_get_32 (abfd, buf - 4);
589
590 if (hdr_id == 0)
65765700
JJ
591 {
592 unsigned int initial_insn_length;
593
594 /* CIE */
bce613b9
JJ
595 this_inf->cie = 1;
596
597 if (ecie_count == ecie_alloced)
65765700 598 {
bce613b9
JJ
599 ecies = bfd_realloc (ecies,
600 (ecie_alloced + 20) * sizeof (*ecies));
601 REQUIRE (ecies);
602 memset (&ecies[ecie_alloced], 0, 20 * sizeof (*ecies));
603 ecie_alloced += 20;
65765700
JJ
604 }
605
bce613b9
JJ
606 cie = &ecies[ecie_count].cie;
607 ecies[ecie_count].offset = this_inf->offset;
608 ecies[ecie_count++].entry = sec_info->count;
609 cie->length = hdr_length;
ac685e6a 610 start = buf;
bce613b9 611 REQUIRE (read_byte (&buf, end, &cie->version));
65765700
JJ
612
613 /* Cannot handle unknown versions. */
bce613b9
JJ
614 REQUIRE (cie->version == 1 || cie->version == 3);
615 REQUIRE (strlen ((char *) buf) < sizeof (cie->augmentation));
65765700 616
bce613b9 617 strcpy (cie->augmentation, (char *) buf);
f075ee0c 618 buf = (bfd_byte *) strchr ((char *) buf, '\0') + 1;
65765700
JJ
619 ENSURE_NO_RELOCS (buf);
620 if (buf[0] == 'e' && buf[1] == 'h')
621 {
622 /* GCC < 3.0 .eh_frame CIE */
623 /* We cannot merge "eh" CIEs because __EXCEPTION_TABLE__
624 is private to each CIE, so we don't need it for anything.
625 Just skip it. */
2c42be65 626 REQUIRE (skip_bytes (&buf, end, ptr_size));
65765700
JJ
627 SKIP_RELOCS (buf);
628 }
bce613b9
JJ
629 REQUIRE (read_uleb128 (&buf, end, &cie->code_align));
630 REQUIRE (read_sleb128 (&buf, end, &cie->data_align));
631 if (cie->version == 1)
2c42be65
RS
632 {
633 REQUIRE (buf < end);
bce613b9 634 cie->ra_column = *buf++;
2c42be65 635 }
0da76f83 636 else
bce613b9 637 REQUIRE (read_uleb128 (&buf, end, &cie->ra_column));
65765700 638 ENSURE_NO_RELOCS (buf);
bce613b9
JJ
639 cie->lsda_encoding = DW_EH_PE_omit;
640 cie->fde_encoding = DW_EH_PE_omit;
641 cie->per_encoding = DW_EH_PE_omit;
642 aug = cie->augmentation;
65765700
JJ
643 if (aug[0] != 'e' || aug[1] != 'h')
644 {
645 if (*aug == 'z')
646 {
647 aug++;
bce613b9 648 REQUIRE (read_uleb128 (&buf, end, &cie->augmentation_size));
65765700
JJ
649 ENSURE_NO_RELOCS (buf);
650 }
651
652 while (*aug != '\0')
653 switch (*aug++)
654 {
655 case 'L':
bce613b9 656 REQUIRE (read_byte (&buf, end, &cie->lsda_encoding));
65765700 657 ENSURE_NO_RELOCS (buf);
bce613b9 658 REQUIRE (get_DW_EH_PE_width (cie->lsda_encoding, ptr_size));
65765700
JJ
659 break;
660 case 'R':
bce613b9 661 REQUIRE (read_byte (&buf, end, &cie->fde_encoding));
65765700 662 ENSURE_NO_RELOCS (buf);
bce613b9 663 REQUIRE (get_DW_EH_PE_width (cie->fde_encoding, ptr_size));
65765700 664 break;
63752a75
JJ
665 case 'S':
666 break;
65765700
JJ
667 case 'P':
668 {
669 int per_width;
670
bce613b9
JJ
671 REQUIRE (read_byte (&buf, end, &cie->per_encoding));
672 per_width = get_DW_EH_PE_width (cie->per_encoding,
65765700 673 ptr_size);
acfe5567 674 REQUIRE (per_width);
bce613b9 675 if ((cie->per_encoding & 0xf0) == DW_EH_PE_aligned)
2c42be65
RS
676 {
677 length = -(buf - ehbuf) & (per_width - 1);
678 REQUIRE (skip_bytes (&buf, end, length));
679 }
65765700 680 ENSURE_NO_RELOCS (buf);
f137a54e 681 /* Ensure we have a reloc here. */
99eb2ac8 682 if (GET_RELOC (buf) != NULL)
65765700
JJ
683 {
684 unsigned long r_symndx;
685
686#ifdef BFD64
888cab37
RS
687 if (elf_elfheader (abfd)->e_ident[EI_CLASS]
688 == ELFCLASS64)
65765700
JJ
689 r_symndx = ELF64_R_SYM (cookie->rel->r_info);
690 else
691#endif
692 r_symndx = ELF32_R_SYM (cookie->rel->r_info);
f137a54e
AM
693 if (r_symndx >= cookie->locsymcount
694 || ELF_ST_BIND (cookie->locsyms[r_symndx]
695 .st_info) != STB_LOCAL)
65765700
JJ
696 {
697 struct elf_link_hash_entry *h;
698
699 r_symndx -= cookie->extsymoff;
700 h = cookie->sym_hashes[r_symndx];
701
702 while (h->root.type == bfd_link_hash_indirect
703 || h->root.type == bfd_link_hash_warning)
704 h = (struct elf_link_hash_entry *)
705 h->root.u.i.link;
706
f137a54e 707 cie->personality.h = h;
65765700 708 }
ef8c95ad
AM
709 else
710 {
ef8c95ad 711 Elf_Internal_Sym *sym;
f137a54e
AM
712 asection *sym_sec;
713 bfd_vma val;
714
715 sym = &cookie->locsyms[r_symndx];
716 sym_sec = (bfd_section_from_elf_index
717 (abfd, sym->st_shndx));
3e5484db 718 if (sym_sec != NULL)
ef8c95ad 719 {
3e5484db
AM
720 if (sym_sec->kept_section != NULL)
721 sym_sec = sym_sec->kept_section;
722 if (sym_sec->output_section != NULL)
723 {
724 val = (sym->st_value
725 + sym_sec->output_offset
726 + sym_sec->output_section->vma);
727 cie->personality.val = val;
728 cie->local_personality = 1;
729 }
ef8c95ad
AM
730 }
731 }
ef8c95ad 732
f4a6705c
RS
733 /* Cope with MIPS-style composite relocations. */
734 do
735 cookie->rel++;
736 while (GET_RELOC (buf) != NULL);
65765700 737 }
2c42be65 738 REQUIRE (skip_bytes (&buf, end, per_width));
f137a54e 739 REQUIRE (cie->local_personality || cie->personality.h);
65765700
JJ
740 }
741 break;
742 default:
743 /* Unrecognized augmentation. Better bail out. */
744 goto free_no_table;
745 }
746 }
747
748 /* For shared libraries, try to get rid of as many RELATIVE relocs
0bb2d96a 749 as possible. */
3472e2e9 750 if (info->shared
ec3391e7
AO
751 && (get_elf_backend_data (abfd)
752 ->elf_backend_can_make_relative_eh_frame
353057a5
RS
753 (abfd, info, sec)))
754 {
bce613b9
JJ
755 if ((cie->fde_encoding & 0xf0) == DW_EH_PE_absptr)
756 cie->make_relative = 1;
353057a5
RS
757 /* If the CIE doesn't already have an 'R' entry, it's fairly
758 easy to add one, provided that there's no aligned data
759 after the augmentation string. */
bce613b9
JJ
760 else if (cie->fde_encoding == DW_EH_PE_omit
761 && (cie->per_encoding & 0xf0) != DW_EH_PE_aligned)
353057a5 762 {
bce613b9 763 if (*cie->augmentation == 0)
353057a5
RS
764 this_inf->add_augmentation_size = 1;
765 this_inf->add_fde_encoding = 1;
bce613b9 766 cie->make_relative = 1;
353057a5
RS
767 }
768 }
65765700 769
0bb2d96a 770 if (info->shared
ec3391e7
AO
771 && (get_elf_backend_data (abfd)
772 ->elf_backend_can_make_lsda_relative_eh_frame
773 (abfd, info, sec))
bce613b9
JJ
774 && (cie->lsda_encoding & 0xf0) == DW_EH_PE_absptr)
775 cie->make_lsda_relative = 1;
9e2a4898 776
65765700
JJ
777 /* If FDE encoding was not specified, it defaults to
778 DW_EH_absptr. */
bce613b9
JJ
779 if (cie->fde_encoding == DW_EH_PE_omit)
780 cie->fde_encoding = DW_EH_PE_absptr;
65765700 781
dcf507a6 782 initial_insn_length = end - buf;
bce613b9 783 if (initial_insn_length <= sizeof (cie->initial_instructions))
65765700 784 {
bce613b9
JJ
785 cie->initial_insn_length = initial_insn_length;
786 memcpy (cie->initial_instructions, buf, initial_insn_length);
65765700 787 }
dcf507a6 788 insns = buf;
65765700
JJ
789 buf += initial_insn_length;
790 ENSURE_NO_RELOCS (buf);
65765700
JJ
791 }
792 else
793 {
bce613b9
JJ
794 /* Find the corresponding CIE. */
795 unsigned int cie_offset = this_inf->offset + 4 - hdr_id;
796 for (ecie = ecies; ecie < ecies + ecie_count; ++ecie)
797 if (cie_offset == ecie->offset)
798 break;
799
800 /* Ensure this FDE references one of the CIEs in this input
801 section. */
802 REQUIRE (ecie != ecies + ecie_count);
803 cie = &ecie->cie;
65765700
JJ
804
805 ENSURE_NO_RELOCS (buf);
acfe5567 806 REQUIRE (GET_RELOC (buf));
fda3ecf2 807
65765700 808 if ((*reloc_symbol_deleted_p) (buf - ehbuf, cookie))
353057a5
RS
809 /* This is a FDE against a discarded section. It should
810 be deleted. */
811 this_inf->removed = 1;
65765700
JJ
812 else
813 {
0bb2d96a 814 if (info->shared
bce613b9
JJ
815 && (((cie->fde_encoding & 0xf0) == DW_EH_PE_absptr
816 && cie->make_relative == 0)
817 || (cie->fde_encoding & 0xf0) == DW_EH_PE_aligned))
0bb2d96a 818 {
73722af0 819 /* If a shared library uses absolute pointers
0bb2d96a
JJ
820 which we cannot turn into PC relative,
821 don't create the binary search table,
822 since it is affected by runtime relocations. */
b34976b6 823 hdr_info->table = FALSE;
64be1553
AM
824 (*info->callbacks->einfo)
825 (_("%P: fde encoding in %B(%A) prevents .eh_frame_hdr"
826 " table being created.\n"), abfd, sec);
0bb2d96a 827 }
bce613b9 828 ecie->usage_count++;
65765700 829 hdr_info->fde_count++;
155eaaa0 830 this_inf->u.fde.cie_inf = (void *) (ecie - ecies);
65765700 831 }
bce613b9 832
2c42be65
RS
833 /* Skip the initial location and address range. */
834 start = buf;
bce613b9 835 length = get_DW_EH_PE_width (cie->fde_encoding, ptr_size);
2c42be65
RS
836 REQUIRE (skip_bytes (&buf, end, 2 * length));
837
838 /* Skip the augmentation size, if present. */
bce613b9 839 if (cie->augmentation[0] == 'z')
dcf507a6
RS
840 REQUIRE (read_uleb128 (&buf, end, &length));
841 else
842 length = 0;
2c42be65
RS
843
844 /* Of the supported augmentation characters above, only 'L'
845 adds augmentation data to the FDE. This code would need to
846 be adjusted if any future augmentations do the same thing. */
bce613b9 847 if (cie->lsda_encoding != DW_EH_PE_omit)
dcf507a6
RS
848 {
849 this_inf->lsda_offset = buf - start;
850 /* If there's no 'z' augmentation, we don't know where the
851 CFA insns begin. Assume no padding. */
bce613b9 852 if (cie->augmentation[0] != 'z')
dcf507a6
RS
853 length = end - buf;
854 }
855
856 /* Skip over the augmentation data. */
857 REQUIRE (skip_bytes (&buf, end, length));
858 insns = buf;
9e2a4898 859
bce613b9 860 buf = last_fde + 4 + hdr_length;
65765700
JJ
861 SKIP_RELOCS (buf);
862 }
863
dcf507a6
RS
864 /* Try to interpret the CFA instructions and find the first
865 padding nop. Shrink this_inf's size so that it doesn't
ac685e6a 866 include the padding. */
bce613b9 867 length = get_DW_EH_PE_width (cie->fde_encoding, ptr_size);
ac685e6a
JJ
868 set_loc_count = 0;
869 insns_end = skip_non_nops (insns, end, length, &set_loc_count);
870 /* If we don't understand the CFA instructions, we can't know
871 what needs to be adjusted there. */
872 if (insns_end == NULL
873 /* For the time being we don't support DW_CFA_set_loc in
874 CIE instructions. */
875 || (set_loc_count && this_inf->cie))
876 goto free_no_table;
877 this_inf->size -= end - insns_end;
bce613b9
JJ
878 if (insns_end != end && this_inf->cie)
879 {
880 cie->initial_insn_length -= end - insns_end;
881 cie->length -= end - insns_end;
882 }
ac685e6a 883 if (set_loc_count
bce613b9
JJ
884 && ((cie->fde_encoding & 0xf0) == DW_EH_PE_pcrel
885 || cie->make_relative))
ac685e6a
JJ
886 {
887 unsigned int cnt;
888 bfd_byte *p;
889
890 this_inf->set_loc = bfd_malloc ((set_loc_count + 1)
891 * sizeof (unsigned int));
892 REQUIRE (this_inf->set_loc);
893 this_inf->set_loc[0] = set_loc_count;
894 p = insns;
895 cnt = 0;
896 while (p < end)
897 {
898 if (*p == DW_CFA_set_loc)
899 this_inf->set_loc[++cnt] = p + 1 - start;
900 REQUIRE (skip_cfa_op (&p, end, length));
901 }
902 }
dcf507a6 903
bce613b9
JJ
904 this_inf->fde_encoding = cie->fde_encoding;
905 this_inf->lsda_encoding = cie->lsda_encoding;
65765700
JJ
906 sec_info->count++;
907 }
908
909 elf_section_data (sec)->sec_info = sec_info;
68bfbfcc 910 sec->sec_info_type = ELF_INFO_TYPE_EH_FRAME;
65765700 911
bce613b9
JJ
912 /* Look at all CIEs in this section and determine which can be
913 removed as unused, which can be merged with previous duplicate
914 CIEs and which need to be kept. */
915 for (ecie = ecies; ecie < ecies + ecie_count; ++ecie)
916 {
917 if (ecie->usage_count == 0)
918 {
919 sec_info->entry[ecie->entry].removed = 1;
920 continue;
921 }
922 ecie->cie.output_sec = sec->output_section;
923 ecie->cie.cie_inf = sec_info->entry + ecie->entry;
924 cie_compute_hash (&ecie->cie);
925 if (hdr_info->cies != NULL)
926 {
927 void **loc = htab_find_slot_with_hash (hdr_info->cies, &ecie->cie,
928 ecie->cie.hash, INSERT);
929 if (loc != NULL)
930 {
931 if (*loc != HTAB_EMPTY_ENTRY)
932 {
933 sec_info->entry[ecie->entry].removed = 1;
934 ecie->cie.cie_inf = ((struct cie *) *loc)->cie_inf;
935 continue;
936 }
937
938 *loc = malloc (sizeof (struct cie));
939 if (*loc == NULL)
940 *loc = HTAB_DELETED_ENTRY;
941 else
942 memcpy (*loc, &ecie->cie, sizeof (struct cie));
943 }
944 }
945 ecie->cie.cie_inf->make_relative = ecie->cie.make_relative;
946 ecie->cie.cie_inf->make_lsda_relative = ecie->cie.make_lsda_relative;
947 ecie->cie.cie_inf->per_encoding_relative
948 = (ecie->cie.per_encoding & 0x70) == DW_EH_PE_pcrel;
949 }
950
65765700
JJ
951 /* Ok, now we can assign new offsets. */
952 offset = 0;
fda3ecf2
AM
953 for (ent = sec_info->entry; ent < sec_info->entry + sec_info->count; ++ent)
954 if (!ent->removed)
955 {
bce613b9
JJ
956 if (!ent->cie)
957 {
155eaaa0
RS
958 ecie = ecies + (bfd_hostptr_t) ent->u.fde.cie_inf;
959 ent->u.fde.cie_inf = ecie->cie.cie_inf;
bce613b9 960 }
353057a5
RS
961 ent->new_offset = offset;
962 offset += size_of_output_cie_fde (ent, ptr_size);
fda3ecf2 963 }
65765700 964
353057a5 965 /* Resize the sec as needed. */
eea6121a 966 sec->rawsize = sec->size;
353057a5 967 sec->size = offset;
65765700 968
68f69152 969 free (ehbuf);
bce613b9
JJ
970 if (ecies)
971 free (ecies);
353057a5 972 return offset != sec->rawsize;
65765700
JJ
973
974free_no_table:
64be1553
AM
975 (*info->callbacks->einfo)
976 (_("%P: error in %B(%A); no .eh_frame_hdr table will be created.\n"),
977 abfd, sec);
68f69152
JJ
978 if (ehbuf)
979 free (ehbuf);
65765700
JJ
980 if (sec_info)
981 free (sec_info);
bce613b9
JJ
982 if (ecies)
983 free (ecies);
b34976b6 984 hdr_info->table = FALSE;
b34976b6 985 return FALSE;
acfe5567
RS
986
987#undef REQUIRE
65765700
JJ
988}
989
990/* This function is called for .eh_frame_hdr section after
991 _bfd_elf_discard_section_eh_frame has been called on all .eh_frame
992 input sections. It finalizes the size of .eh_frame_hdr section. */
993
b34976b6 994bfd_boolean
c39a58e6 995_bfd_elf_discard_section_eh_frame_hdr (bfd *abfd, struct bfd_link_info *info)
65765700 996{
126495ed 997 struct elf_link_hash_table *htab;
65765700 998 struct eh_frame_hdr_info *hdr_info;
126495ed 999 asection *sec;
65765700 1000
126495ed
AM
1001 htab = elf_hash_table (info);
1002 hdr_info = &htab->eh_info;
bce613b9
JJ
1003
1004 if (hdr_info->cies != NULL)
1005 {
1006 htab_delete (hdr_info->cies);
1007 hdr_info->cies = NULL;
1008 }
1009
126495ed
AM
1010 sec = hdr_info->hdr_sec;
1011 if (sec == NULL)
b34976b6 1012 return FALSE;
126495ed 1013
eea6121a 1014 sec->size = EH_FRAME_HDR_SIZE;
65765700 1015 if (hdr_info->table)
eea6121a 1016 sec->size += 4 + hdr_info->fde_count * 8;
65765700 1017
126495ed 1018 elf_tdata (abfd)->eh_frame_hdr = sec;
b34976b6 1019 return TRUE;
65765700
JJ
1020}
1021
68f69152
JJ
1022/* This function is called from size_dynamic_sections.
1023 It needs to decide whether .eh_frame_hdr should be output or not,
8423293d
AM
1024 because when the dynamic symbol table has been sized it is too late
1025 to strip sections. */
68f69152 1026
b34976b6 1027bfd_boolean
c39a58e6 1028_bfd_elf_maybe_strip_eh_frame_hdr (struct bfd_link_info *info)
68f69152 1029{
126495ed 1030 asection *o;
68f69152 1031 bfd *abfd;
126495ed 1032 struct elf_link_hash_table *htab;
68f69152
JJ
1033 struct eh_frame_hdr_info *hdr_info;
1034
126495ed
AM
1035 htab = elf_hash_table (info);
1036 hdr_info = &htab->eh_info;
1037 if (hdr_info->hdr_sec == NULL)
b34976b6 1038 return TRUE;
68f69152 1039
126495ed
AM
1040 if (bfd_is_abs_section (hdr_info->hdr_sec->output_section))
1041 {
1042 hdr_info->hdr_sec = NULL;
b34976b6 1043 return TRUE;
126495ed 1044 }
68f69152
JJ
1045
1046 abfd = NULL;
1047 if (info->eh_frame_hdr)
1048 for (abfd = info->input_bfds; abfd != NULL; abfd = abfd->link_next)
1049 {
1050 /* Count only sections which have at least a single CIE or FDE.
1051 There cannot be any CIE or FDE <= 8 bytes. */
1052 o = bfd_get_section_by_name (abfd, ".eh_frame");
eea6121a 1053 if (o && o->size > 8 && !bfd_is_abs_section (o->output_section))
68f69152
JJ
1054 break;
1055 }
1056
1057 if (abfd == NULL)
1058 {
8423293d 1059 hdr_info->hdr_sec->flags |= SEC_EXCLUDE;
126495ed 1060 hdr_info->hdr_sec = NULL;
b34976b6 1061 return TRUE;
68f69152 1062 }
126495ed 1063
b34976b6
AM
1064 hdr_info->table = TRUE;
1065 return TRUE;
68f69152
JJ
1066}
1067
65765700
JJ
1068/* Adjust an address in the .eh_frame section. Given OFFSET within
1069 SEC, this returns the new offset in the adjusted .eh_frame section,
1070 or -1 if the address refers to a CIE/FDE which has been removed
1071 or to offset with dynamic relocation which is no longer needed. */
1072
1073bfd_vma
c39a58e6 1074_bfd_elf_eh_frame_section_offset (bfd *output_bfd ATTRIBUTE_UNUSED,
92e4ec35 1075 struct bfd_link_info *info,
c39a58e6
AM
1076 asection *sec,
1077 bfd_vma offset)
65765700
JJ
1078{
1079 struct eh_frame_sec_info *sec_info;
92e4ec35
AM
1080 struct elf_link_hash_table *htab;
1081 struct eh_frame_hdr_info *hdr_info;
65765700
JJ
1082 unsigned int lo, hi, mid;
1083
68bfbfcc 1084 if (sec->sec_info_type != ELF_INFO_TYPE_EH_FRAME)
65765700 1085 return offset;
c39a58e6 1086 sec_info = elf_section_data (sec)->sec_info;
65765700 1087
eea6121a
AM
1088 if (offset >= sec->rawsize)
1089 return offset - sec->rawsize + sec->size;
65765700 1090
92e4ec35
AM
1091 htab = elf_hash_table (info);
1092 hdr_info = &htab->eh_info;
1093 if (hdr_info->offsets_adjusted)
1094 offset += sec->output_offset;
1095
65765700
JJ
1096 lo = 0;
1097 hi = sec_info->count;
1098 mid = 0;
1099 while (lo < hi)
1100 {
1101 mid = (lo + hi) / 2;
1102 if (offset < sec_info->entry[mid].offset)
1103 hi = mid;
1104 else if (offset
1105 >= sec_info->entry[mid].offset + sec_info->entry[mid].size)
1106 lo = mid + 1;
1107 else
1108 break;
1109 }
1110
1111 BFD_ASSERT (lo < hi);
1112
1113 /* FDE or CIE was removed. */
1114 if (sec_info->entry[mid].removed)
1115 return (bfd_vma) -1;
1116
1117 /* If converting to DW_EH_PE_pcrel, there will be no need for run-time
1118 relocation against FDE's initial_location field. */
fda3ecf2 1119 if (!sec_info->entry[mid].cie
155eaaa0 1120 && sec_info->entry[mid].u.fde.cie_inf->make_relative
353057a5
RS
1121 && offset == sec_info->entry[mid].offset + 8)
1122 return (bfd_vma) -2;
65765700 1123
9e2a4898
JJ
1124 /* If converting LSDA pointers to DW_EH_PE_pcrel, there will be no need
1125 for run-time relocation against LSDA field. */
fda3ecf2 1126 if (!sec_info->entry[mid].cie
155eaaa0 1127 && sec_info->entry[mid].u.fde.cie_inf->make_lsda_relative
126495ed 1128 && (offset == (sec_info->entry[mid].offset + 8
92e4ec35 1129 + sec_info->entry[mid].lsda_offset))
155eaaa0 1130 && (sec_info->entry[mid].u.fde.cie_inf->need_lsda_relative
92e4ec35 1131 || !hdr_info->offsets_adjusted))
8935b81f 1132 {
155eaaa0 1133 sec_info->entry[mid].u.fde.cie_inf->need_lsda_relative = 1;
8935b81f
AM
1134 return (bfd_vma) -2;
1135 }
9e2a4898 1136
ac685e6a
JJ
1137 /* If converting to DW_EH_PE_pcrel, there will be no need for run-time
1138 relocation against DW_CFA_set_loc's arguments. */
1139 if (sec_info->entry[mid].set_loc
1140 && (sec_info->entry[mid].cie
1141 ? sec_info->entry[mid].make_relative
155eaaa0 1142 : sec_info->entry[mid].u.fde.cie_inf->make_relative)
ac685e6a
JJ
1143 && (offset >= sec_info->entry[mid].offset + 8
1144 + sec_info->entry[mid].set_loc[1]))
1145 {
1146 unsigned int cnt;
1147
1148 for (cnt = 1; cnt <= sec_info->entry[mid].set_loc[0]; cnt++)
1149 if (offset == sec_info->entry[mid].offset + 8
1150 + sec_info->entry[mid].set_loc[cnt])
1151 return (bfd_vma) -2;
1152 }
1153
92e4ec35
AM
1154 if (hdr_info->offsets_adjusted)
1155 offset -= sec->output_offset;
353057a5 1156 /* Any new augmentation bytes go before the first relocation. */
c68836a9 1157 return (offset + sec_info->entry[mid].new_offset
353057a5
RS
1158 - sec_info->entry[mid].offset
1159 + extra_augmentation_string_bytes (sec_info->entry + mid)
1160 + extra_augmentation_data_bytes (sec_info->entry + mid));
65765700
JJ
1161}
1162
1163/* Write out .eh_frame section. This is called with the relocated
1164 contents. */
1165
b34976b6 1166bfd_boolean
c39a58e6
AM
1167_bfd_elf_write_section_eh_frame (bfd *abfd,
1168 struct bfd_link_info *info,
1169 asection *sec,
1170 bfd_byte *contents)
65765700
JJ
1171{
1172 struct eh_frame_sec_info *sec_info;
126495ed 1173 struct elf_link_hash_table *htab;
65765700 1174 struct eh_frame_hdr_info *hdr_info;
65765700 1175 unsigned int ptr_size;
fda3ecf2 1176 struct eh_cie_fde *ent;
65765700 1177
68bfbfcc 1178 if (sec->sec_info_type != ELF_INFO_TYPE_EH_FRAME)
c39a58e6 1179 return bfd_set_section_contents (abfd, sec->output_section, contents,
eea6121a 1180 sec->output_offset, sec->size);
8c946ed5
RS
1181
1182 ptr_size = (get_elf_backend_data (abfd)
1183 ->elf_backend_eh_frame_address_size (abfd, sec));
1184 BFD_ASSERT (ptr_size != 0);
1185
c39a58e6 1186 sec_info = elf_section_data (sec)->sec_info;
126495ed
AM
1187 htab = elf_hash_table (info);
1188 hdr_info = &htab->eh_info;
3472e2e9
AM
1189
1190 /* First convert all offsets to output section offsets, so that a
1191 CIE offset is valid if the CIE is used by a FDE from some other
1192 section. This can happen when duplicate CIEs are deleted in
1193 _bfd_elf_discard_section_eh_frame. We do all sections here because
1194 this function might not be called on sections in the same order as
1195 _bfd_elf_discard_section_eh_frame. */
1196 if (!hdr_info->offsets_adjusted)
1197 {
1198 bfd *ibfd;
1199 asection *eh;
1200 struct eh_frame_sec_info *eh_inf;
1201
1202 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
1203 {
1204 if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
1205 || (ibfd->flags & DYNAMIC) != 0)
1206 continue;
1207
1208 eh = bfd_get_section_by_name (ibfd, ".eh_frame");
1209 if (eh == NULL || eh->sec_info_type != ELF_INFO_TYPE_EH_FRAME)
1210 continue;
1211
1212 eh_inf = elf_section_data (eh)->sec_info;
1213 for (ent = eh_inf->entry; ent < eh_inf->entry + eh_inf->count; ++ent)
1214 {
1215 ent->offset += eh->output_offset;
1216 ent->new_offset += eh->output_offset;
1217 }
1218 }
1219 hdr_info->offsets_adjusted = TRUE;
1220 }
1221
126495ed
AM
1222 if (hdr_info->table && hdr_info->array == NULL)
1223 hdr_info->array
1224 = bfd_malloc (hdr_info->fde_count * sizeof(*hdr_info->array));
1225 if (hdr_info->array == NULL)
1226 hdr_info = NULL;
65765700 1227
353057a5
RS
1228 /* The new offsets can be bigger or smaller than the original offsets.
1229 We therefore need to make two passes over the section: one backward
1230 pass to move entries up and one forward pass to move entries down.
1231 The two passes won't interfere with each other because entries are
1232 not reordered */
1233 for (ent = sec_info->entry + sec_info->count; ent-- != sec_info->entry;)
1234 if (!ent->removed && ent->new_offset > ent->offset)
1235 memmove (contents + ent->new_offset - sec->output_offset,
1236 contents + ent->offset - sec->output_offset, ent->size);
1237
1238 for (ent = sec_info->entry; ent < sec_info->entry + sec_info->count; ++ent)
1239 if (!ent->removed && ent->new_offset < ent->offset)
1240 memmove (contents + ent->new_offset - sec->output_offset,
1241 contents + ent->offset - sec->output_offset, ent->size);
1242
fda3ecf2 1243 for (ent = sec_info->entry; ent < sec_info->entry + sec_info->count; ++ent)
65765700 1244 {
353057a5
RS
1245 unsigned char *buf, *end;
1246 unsigned int new_size;
1247
fda3ecf2
AM
1248 if (ent->removed)
1249 continue;
1250
353057a5
RS
1251 if (ent->size == 4)
1252 {
1253 /* Any terminating FDE must be at the end of the section. */
1254 BFD_ASSERT (ent == sec_info->entry + sec_info->count - 1);
1255 continue;
1256 }
1257
1258 buf = contents + ent->new_offset - sec->output_offset;
1259 end = buf + ent->size;
1260 new_size = size_of_output_cie_fde (ent, ptr_size);
1261
a34a056a
L
1262 /* Update the size. It may be shrinked. */
1263 bfd_put_32 (abfd, new_size - 4, buf);
1264
1265 /* Filling the extra bytes with DW_CFA_nops. */
353057a5 1266 if (new_size != ent->size)
a34a056a 1267 memset (end, 0, new_size - ent->size);
353057a5 1268
fda3ecf2 1269 if (ent->cie)
65765700
JJ
1270 {
1271 /* CIE */
353057a5 1272 if (ent->make_relative
fda3ecf2
AM
1273 || ent->need_lsda_relative
1274 || ent->per_encoding_relative)
65765700 1275 {
f075ee0c 1276 char *aug;
353057a5 1277 unsigned int action, extra_string, extra_data;
2c42be65 1278 unsigned int per_width, per_encoding;
65765700 1279
9e2a4898 1280 /* Need to find 'R' or 'L' augmentation's argument and modify
65765700 1281 DW_EH_PE_* value. */
353057a5 1282 action = ((ent->make_relative ? 1 : 0)
fda3ecf2
AM
1283 | (ent->need_lsda_relative ? 2 : 0)
1284 | (ent->per_encoding_relative ? 4 : 0));
353057a5
RS
1285 extra_string = extra_augmentation_string_bytes (ent);
1286 extra_data = extra_augmentation_data_bytes (ent);
1287
65765700
JJ
1288 /* Skip length, id and version. */
1289 buf += 9;
f075ee0c
AM
1290 aug = (char *) buf;
1291 buf += strlen (aug) + 1;
2c42be65
RS
1292 skip_leb128 (&buf, end);
1293 skip_leb128 (&buf, end);
1294 skip_leb128 (&buf, end);
65765700
JJ
1295 if (*aug == 'z')
1296 {
353057a5
RS
1297 /* The uleb128 will always be a single byte for the kind
1298 of augmentation strings that we're prepared to handle. */
1299 *buf++ += extra_data;
65765700
JJ
1300 aug++;
1301 }
1302
353057a5
RS
1303 /* Make room for the new augmentation string and data bytes. */
1304 memmove (buf + extra_string + extra_data, buf, end - buf);
f075ee0c 1305 memmove (aug + extra_string, aug, buf - (bfd_byte *) aug);
353057a5 1306 buf += extra_string;
2c42be65 1307 end += extra_string + extra_data;
353057a5
RS
1308
1309 if (ent->add_augmentation_size)
1310 {
1311 *aug++ = 'z';
1312 *buf++ = extra_data - 1;
1313 }
1314 if (ent->add_fde_encoding)
1315 {
1316 BFD_ASSERT (action & 1);
1317 *aug++ = 'R';
1318 *buf++ = DW_EH_PE_pcrel;
1319 action &= ~1;
1320 }
1321
9e2a4898 1322 while (action)
65765700
JJ
1323 switch (*aug++)
1324 {
1325 case 'L':
9e2a4898
JJ
1326 if (action & 2)
1327 {
fda3ecf2 1328 BFD_ASSERT (*buf == ent->lsda_encoding);
9e2a4898
JJ
1329 *buf |= DW_EH_PE_pcrel;
1330 action &= ~2;
1331 }
65765700
JJ
1332 buf++;
1333 break;
1334 case 'P':
1335 per_encoding = *buf++;
3472e2e9 1336 per_width = get_DW_EH_PE_width (per_encoding, ptr_size);
65765700 1337 BFD_ASSERT (per_width != 0);
09ae86c2 1338 BFD_ASSERT (((per_encoding & 0x70) == DW_EH_PE_pcrel)
fda3ecf2 1339 == ent->per_encoding_relative);
65765700
JJ
1340 if ((per_encoding & 0xf0) == DW_EH_PE_aligned)
1341 buf = (contents
1342 + ((buf - contents + per_width - 1)
1343 & ~((bfd_size_type) per_width - 1)));
09ae86c2
JJ
1344 if (action & 4)
1345 {
fda3ecf2
AM
1346 bfd_vma val;
1347
1348 val = read_value (abfd, buf, per_width,
1349 get_DW_EH_PE_signed (per_encoding));
1350 val += ent->offset - ent->new_offset;
353057a5 1351 val -= extra_string + extra_data;
fda3ecf2 1352 write_value (abfd, buf, val, per_width);
09ae86c2
JJ
1353 action &= ~4;
1354 }
65765700
JJ
1355 buf += per_width;
1356 break;
9e2a4898
JJ
1357 case 'R':
1358 if (action & 1)
1359 {
fda3ecf2 1360 BFD_ASSERT (*buf == ent->fde_encoding);
9e2a4898
JJ
1361 *buf |= DW_EH_PE_pcrel;
1362 action &= ~1;
1363 }
1364 buf++;
1365 break;
63752a75
JJ
1366 case 'S':
1367 break;
65765700
JJ
1368 default:
1369 BFD_FAIL ();
1370 }
65765700
JJ
1371 }
1372 }
353057a5 1373 else
65765700
JJ
1374 {
1375 /* FDE */
fda3ecf2 1376 bfd_vma value, address;
9e2a4898 1377 unsigned int width;
ac685e6a 1378 bfd_byte *start;
155eaaa0 1379 struct eh_cie_fde *cie;
65765700 1380
b34976b6 1381 /* Skip length. */
155eaaa0 1382 cie = ent->u.fde.cie_inf;
65765700 1383 buf += 4;
155eaaa0 1384 value = ent->new_offset + 4 - cie->new_offset;
fda3ecf2 1385 bfd_put_32 (abfd, value, buf);
65765700 1386 buf += 4;
fda3ecf2
AM
1387 width = get_DW_EH_PE_width (ent->fde_encoding, ptr_size);
1388 value = read_value (abfd, buf, width,
1389 get_DW_EH_PE_signed (ent->fde_encoding));
1390 address = value;
9e2a4898 1391 if (value)
65765700 1392 {
fda3ecf2 1393 switch (ent->fde_encoding & 0xf0)
9e2a4898
JJ
1394 {
1395 case DW_EH_PE_indirect:
1396 case DW_EH_PE_textrel:
1397 BFD_ASSERT (hdr_info == NULL);
1398 break;
1399 case DW_EH_PE_datarel:
1400 {
1401 asection *got = bfd_get_section_by_name (abfd, ".got");
1402
1403 BFD_ASSERT (got != NULL);
1404 address += got->vma;
1405 }
1406 break;
1407 case DW_EH_PE_pcrel:
fda3ecf2
AM
1408 value += ent->offset - ent->new_offset;
1409 address += sec->output_section->vma + ent->offset + 8;
9e2a4898
JJ
1410 break;
1411 }
155eaaa0 1412 if (cie->make_relative)
fda3ecf2 1413 value -= sec->output_section->vma + ent->new_offset + 8;
9e2a4898 1414 write_value (abfd, buf, value, width);
65765700
JJ
1415 }
1416
ac685e6a
JJ
1417 start = buf;
1418
65765700
JJ
1419 if (hdr_info)
1420 {
1421 hdr_info->array[hdr_info->array_count].initial_loc = address;
1422 hdr_info->array[hdr_info->array_count++].fde
fda3ecf2 1423 = sec->output_section->vma + ent->new_offset;
65765700 1424 }
9e2a4898 1425
fda3ecf2 1426 if ((ent->lsda_encoding & 0xf0) == DW_EH_PE_pcrel
155eaaa0 1427 || cie->need_lsda_relative)
9e2a4898 1428 {
fda3ecf2
AM
1429 buf += ent->lsda_offset;
1430 width = get_DW_EH_PE_width (ent->lsda_encoding, ptr_size);
84f97cb6 1431 value = read_value (abfd, buf, width,
fda3ecf2 1432 get_DW_EH_PE_signed (ent->lsda_encoding));
9e2a4898
JJ
1433 if (value)
1434 {
fda3ecf2
AM
1435 if ((ent->lsda_encoding & 0xf0) == DW_EH_PE_pcrel)
1436 value += ent->offset - ent->new_offset;
155eaaa0 1437 else if (cie->need_lsda_relative)
fda3ecf2
AM
1438 value -= (sec->output_section->vma + ent->new_offset + 8
1439 + ent->lsda_offset);
9e2a4898
JJ
1440 write_value (abfd, buf, value, width);
1441 }
1442 }
155eaaa0 1443 else if (cie->add_augmentation_size)
353057a5
RS
1444 {
1445 /* Skip the PC and length and insert a zero byte for the
1446 augmentation size. */
1447 buf += width * 2;
1448 memmove (buf + 1, buf, end - buf);
1449 *buf = 0;
1450 }
ac685e6a
JJ
1451
1452 if (ent->set_loc)
1453 {
1454 /* Adjust DW_CFA_set_loc. */
1455 unsigned int cnt, width;
1456 bfd_vma new_offset;
1457
1458 width = get_DW_EH_PE_width (ent->fde_encoding, ptr_size);
1459 new_offset = ent->new_offset + 8
1460 + extra_augmentation_string_bytes (ent)
1461 + extra_augmentation_data_bytes (ent);
1462
1463 for (cnt = 1; cnt <= ent->set_loc[0]; cnt++)
1464 {
1465 bfd_vma value;
1466 buf = start + ent->set_loc[cnt];
1467
1468 value = read_value (abfd, buf, width,
1469 get_DW_EH_PE_signed (ent->fde_encoding));
1470 if (!value)
1471 continue;
1472
1473 if ((ent->fde_encoding & 0xf0) == DW_EH_PE_pcrel)
1474 value += ent->offset + 8 - new_offset;
155eaaa0 1475 if (cie->make_relative)
ac685e6a
JJ
1476 value -= sec->output_section->vma + new_offset
1477 + ent->set_loc[cnt];
1478 write_value (abfd, buf, value, width);
1479 }
1480 }
65765700 1481 }
65765700
JJ
1482 }
1483
a34a056a
L
1484 /* We don't align the section to its section alignment since the
1485 runtime library only expects all CIE/FDE records aligned at
4e591bc1 1486 the pointer size. _bfd_elf_discard_section_eh_frame should
a34a056a
L
1487 have padded CIE/FDE records to multiple of pointer size with
1488 size_of_output_cie_fde. */
1489 if ((sec->size % ptr_size) != 0)
1490 abort ();
a5eb27e6 1491
65765700 1492 return bfd_set_section_contents (abfd, sec->output_section,
3472e2e9
AM
1493 contents, (file_ptr) sec->output_offset,
1494 sec->size);
65765700
JJ
1495}
1496
1497/* Helper function used to sort .eh_frame_hdr search table by increasing
1498 VMA of FDE initial location. */
1499
1500static int
c39a58e6 1501vma_compare (const void *a, const void *b)
65765700 1502{
c39a58e6
AM
1503 const struct eh_frame_array_ent *p = a;
1504 const struct eh_frame_array_ent *q = b;
65765700
JJ
1505 if (p->initial_loc > q->initial_loc)
1506 return 1;
1507 if (p->initial_loc < q->initial_loc)
1508 return -1;
1509 return 0;
1510}
1511
1512/* Write out .eh_frame_hdr section. This must be called after
1513 _bfd_elf_write_section_eh_frame has been called on all input
1514 .eh_frame sections.
1515 .eh_frame_hdr format:
1516 ubyte version (currently 1)
1517 ubyte eh_frame_ptr_enc (DW_EH_PE_* encoding of pointer to start of
1518 .eh_frame section)
1519 ubyte fde_count_enc (DW_EH_PE_* encoding of total FDE count
1520 number (or DW_EH_PE_omit if there is no
1521 binary search table computed))
1522 ubyte table_enc (DW_EH_PE_* encoding of binary search table,
1523 or DW_EH_PE_omit if not present.
1524 DW_EH_PE_datarel is using address of
1525 .eh_frame_hdr section start as base)
1526 [encoded] eh_frame_ptr (pointer to start of .eh_frame section)
1527 optionally followed by:
1528 [encoded] fde_count (total number of FDEs in .eh_frame section)
1529 fde_count x [encoded] initial_loc, fde
1530 (array of encoded pairs containing
1531 FDE initial_location field and FDE address,
5ed6aba4 1532 sorted by increasing initial_loc). */
65765700 1533
b34976b6 1534bfd_boolean
c39a58e6 1535_bfd_elf_write_section_eh_frame_hdr (bfd *abfd, struct bfd_link_info *info)
65765700 1536{
126495ed 1537 struct elf_link_hash_table *htab;
65765700 1538 struct eh_frame_hdr_info *hdr_info;
126495ed 1539 asection *sec;
65765700
JJ
1540 bfd_byte *contents;
1541 asection *eh_frame_sec;
1542 bfd_size_type size;
5ed6aba4 1543 bfd_boolean retval;
ec3391e7 1544 bfd_vma encoded_eh_frame;
65765700 1545
126495ed
AM
1546 htab = elf_hash_table (info);
1547 hdr_info = &htab->eh_info;
1548 sec = hdr_info->hdr_sec;
1549 if (sec == NULL)
b34976b6 1550 return TRUE;
57a72197 1551
65765700
JJ
1552 size = EH_FRAME_HDR_SIZE;
1553 if (hdr_info->array && hdr_info->array_count == hdr_info->fde_count)
1554 size += 4 + hdr_info->fde_count * 8;
1555 contents = bfd_malloc (size);
1556 if (contents == NULL)
b34976b6 1557 return FALSE;
65765700
JJ
1558
1559 eh_frame_sec = bfd_get_section_by_name (abfd, ".eh_frame");
1560 if (eh_frame_sec == NULL)
5ed6aba4
NC
1561 {
1562 free (contents);
1563 return FALSE;
1564 }
65765700
JJ
1565
1566 memset (contents, 0, EH_FRAME_HDR_SIZE);
5ed6aba4 1567 contents[0] = 1; /* Version. */
ec3391e7
AO
1568 contents[1] = get_elf_backend_data (abfd)->elf_backend_encode_eh_address
1569 (abfd, info, eh_frame_sec, 0, sec, 4,
1570 &encoded_eh_frame); /* .eh_frame offset. */
1571
65765700
JJ
1572 if (hdr_info->array && hdr_info->array_count == hdr_info->fde_count)
1573 {
5ed6aba4
NC
1574 contents[2] = DW_EH_PE_udata4; /* FDE count encoding. */
1575 contents[3] = DW_EH_PE_datarel | DW_EH_PE_sdata4; /* Search table enc. */
65765700
JJ
1576 }
1577 else
1578 {
1579 contents[2] = DW_EH_PE_omit;
1580 contents[3] = DW_EH_PE_omit;
1581 }
ec3391e7
AO
1582 bfd_put_32 (abfd, encoded_eh_frame, contents + 4);
1583
65765700
JJ
1584 if (contents[2] != DW_EH_PE_omit)
1585 {
1586 unsigned int i;
1587
1588 bfd_put_32 (abfd, hdr_info->fde_count, contents + EH_FRAME_HDR_SIZE);
1589 qsort (hdr_info->array, hdr_info->fde_count, sizeof (*hdr_info->array),
1590 vma_compare);
1591 for (i = 0; i < hdr_info->fde_count; i++)
1592 {
1593 bfd_put_32 (abfd,
1594 hdr_info->array[i].initial_loc
1595 - sec->output_section->vma,
1596 contents + EH_FRAME_HDR_SIZE + i * 8 + 4);
1597 bfd_put_32 (abfd,
1598 hdr_info->array[i].fde - sec->output_section->vma,
1599 contents + EH_FRAME_HDR_SIZE + i * 8 + 8);
1600 }
1601 }
1602
5ed6aba4
NC
1603 retval = bfd_set_section_contents (abfd, sec->output_section,
1604 contents, (file_ptr) sec->output_offset,
eea6121a 1605 sec->size);
5ed6aba4
NC
1606 free (contents);
1607 return retval;
65765700 1608}
ec3391e7 1609
8c946ed5
RS
1610/* Return the width of FDE addresses. This is the default implementation. */
1611
1612unsigned int
1613_bfd_elf_eh_frame_address_size (bfd *abfd, asection *sec ATTRIBUTE_UNUSED)
1614{
1615 return elf_elfheader (abfd)->e_ident[EI_CLASS] == ELFCLASS64 ? 8 : 4;
1616}
1617
ec3391e7
AO
1618/* Decide whether we can use a PC-relative encoding within the given
1619 EH frame section. This is the default implementation. */
1620
1621bfd_boolean
1622_bfd_elf_can_make_relative (bfd *input_bfd ATTRIBUTE_UNUSED,
1623 struct bfd_link_info *info ATTRIBUTE_UNUSED,
1624 asection *eh_frame_section ATTRIBUTE_UNUSED)
1625{
1626 return TRUE;
1627}
1628
1629/* Select an encoding for the given address. Preference is given to
1630 PC-relative addressing modes. */
1631
1632bfd_byte
1633_bfd_elf_encode_eh_address (bfd *abfd ATTRIBUTE_UNUSED,
1634 struct bfd_link_info *info ATTRIBUTE_UNUSED,
1635 asection *osec, bfd_vma offset,
1636 asection *loc_sec, bfd_vma loc_offset,
1637 bfd_vma *encoded)
1638{
1639 *encoded = osec->vma + offset -
1640 (loc_sec->output_section->vma + loc_sec->output_offset + loc_offset);
1641 return DW_EH_PE_pcrel | DW_EH_PE_sdata4;
1642}
This page took 0.41206 seconds and 4 git commands to generate.