63b6ba45f94b1b4da8de625e47c641e5552b7242
[deliverable/binutils-gdb.git] / bfd / elf-eh-frame.c
1 /* .eh_frame section optimization.
2 Copyright 2001, 2002, 2003, 2004, 2005, 2006, 2007
3 Free Software Foundation, Inc.
4 Written by Jakub Jelinek <jakub@redhat.com>.
5
6 This file is part of BFD, the Binary File Descriptor library.
7
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
10 the Free Software Foundation; either version 3 of the License, or
11 (at your option) any later version.
12
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.
17
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
20 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
21 MA 02110-1301, USA. */
22
23 #include "sysdep.h"
24 #include "bfd.h"
25 #include "libbfd.h"
26 #include "elf-bfd.h"
27 #include "elf/dwarf2.h"
28
29 #define EH_FRAME_HDR_SIZE 8
30
31 struct cie
32 {
33 unsigned int length;
34 unsigned int hash;
35 unsigned char version;
36 unsigned char local_personality;
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;
42 union {
43 struct elf_link_hash_entry *h;
44 bfd_vma val;
45 } personality;
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
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
62 static inline bfd_boolean
63 read_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
74 static inline bfd_boolean
75 skip_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
89 static bfd_boolean
90 skip_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
103 static bfd_boolean
104 read_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
122 static bfd_boolean
123 read_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 }
138
139 /* Return 0 if either encoding is variable width, or not yet known to bfd. */
140
141 static
142 int get_DW_EH_PE_width (int encoding, int ptr_size)
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
162 #define get_DW_EH_PE_signed(encoding) (((encoding) & DW_EH_PE_signed) != 0)
163
164 /* Read a width sized value from memory. */
165
166 static bfd_vma
167 read_value (bfd *abfd, bfd_byte *buf, int width, int is_signed)
168 {
169 bfd_vma value;
170
171 switch (width)
172 {
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;
194 }
195
196 return value;
197 }
198
199 /* Store a width sized value to memory. */
200
201 static void
202 write_value (bfd *abfd, bfd_byte *buf, bfd_vma value, int width)
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
213 /* Return one if C1 and C2 CIEs can be merged. */
214
215 static int
216 cie_eq (const void *e1, const void *e2)
217 {
218 const struct cie *c1 = e1;
219 const struct cie *c2 = e2;
220
221 if (c1->hash == c2->hash
222 && c1->length == c2->length
223 && c1->version == c2->version
224 && c1->local_personality == c2->local_personality
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
231 && memcmp (&c1->personality, &c2->personality,
232 sizeof (c1->personality)) == 0
233 && c1->output_sec == c2->output_sec
234 && c1->per_encoding == c2->per_encoding
235 && c1->lsda_encoding == c2->lsda_encoding
236 && c1->fde_encoding == c2->fde_encoding
237 && c1->initial_insn_length == c2->initial_insn_length
238 && memcmp (c1->initial_instructions,
239 c2->initial_instructions,
240 c1->initial_insn_length) == 0)
241 return 1;
242
243 return 0;
244 }
245
246 static hashval_t
247 cie_hash (const void *e)
248 {
249 const struct cie *c = e;
250 return c->hash;
251 }
252
253 static hashval_t
254 cie_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;
273 }
274
275 /* Return the number of extra bytes that we'll be inserting into
276 ENTRY's augmentation string. */
277
278 static INLINE unsigned int
279 extra_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
294 static INLINE unsigned int
295 extra_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 {
307 if (entry->u.fde.cie_inf->add_augmentation_size)
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
316 static unsigned int
317 size_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
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
333 static bfd_boolean
334 skip_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
342 switch (op & 0xc0 ? op & 0xc0 : op)
343 {
344 case DW_CFA_nop:
345 case DW_CFA_advance_loc:
346 case DW_CFA_restore:
347 case DW_CFA_remember_state:
348 case DW_CFA_restore_state:
349 case DW_CFA_GNU_window_save:
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
364 case DW_CFA_val_offset:
365 case DW_CFA_val_offset_sf:
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:
382 case DW_CFA_val_expression:
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
413 static bfd_byte *
414 skip_non_nops (bfd_byte *buf, bfd_byte *end, unsigned int encoded_ptr_width,
415 unsigned int *set_loc_count)
416 {
417 bfd_byte *last;
418
419 last = buf;
420 while (buf < end)
421 if (*buf == DW_CFA_nop)
422 buf++;
423 else
424 {
425 if (*buf == DW_CFA_set_loc)
426 ++*set_loc_count;
427 if (!skip_cfa_op (&buf, end, encoded_ptr_width))
428 return 0;
429 last = buf;
430 }
431 return last;
432 }
433
434 /* Called before calling _bfd_elf_parse_eh_frame on every input bfd's
435 .eh_frame section. */
436
437 void
438 _bfd_elf_begin_eh_frame_parsing (struct bfd_link_info *info)
439 {
440 struct eh_frame_hdr_info *hdr_info;
441
442 hdr_info = &elf_hash_table (info)->eh_info;
443 if (!hdr_info->parsed_eh_frames && !info->relocatable)
444 hdr_info->cies = htab_try_create (1, cie_hash, cie_eq, free);
445 }
446
447 /* Try to parse .eh_frame section SEC, which belongs to ABFD. Store the
448 information in the section's sec_info field on success. COOKIE
449 describes the relocations in SEC. */
450
451 void
452 _bfd_elf_parse_eh_frame (bfd *abfd, struct bfd_link_info *info,
453 asection *sec, struct elf_reloc_cookie *cookie)
454 {
455 #define REQUIRE(COND) \
456 do \
457 if (!(COND)) \
458 goto free_no_table; \
459 while (0)
460
461 bfd_byte *ehbuf = NULL, *buf, *end;
462 bfd_byte *last_fde;
463 struct eh_cie_fde *this_inf;
464 unsigned int hdr_length, hdr_id;
465 struct extended_cie
466 {
467 struct cie *cie;
468 struct eh_cie_fde *local_cie;
469 } *ecies = NULL, *ecie;
470 unsigned int ecie_count;
471 struct cie *cie, *local_cies = NULL, tmp_cie;
472 struct elf_link_hash_table *htab;
473 struct eh_frame_hdr_info *hdr_info;
474 struct eh_frame_sec_info *sec_info = NULL;
475 unsigned int ptr_size;
476 unsigned int num_cies;
477 unsigned int num_entries;
478
479 htab = elf_hash_table (info);
480 hdr_info = &htab->eh_info;
481 if (hdr_info->parsed_eh_frames)
482 return;
483
484 if (sec->size == 0)
485 {
486 /* This file does not contain .eh_frame information. */
487 return;
488 }
489
490 if (bfd_is_abs_section (sec->output_section))
491 {
492 /* At least one of the sections is being discarded from the
493 link, so we should just ignore them. */
494 return;
495 }
496
497 /* Read the frame unwind information from abfd. */
498
499 REQUIRE (bfd_malloc_and_get_section (abfd, sec, &ehbuf));
500
501 if (sec->size >= 4
502 && bfd_get_32 (abfd, ehbuf) == 0
503 && cookie->rel == cookie->relend)
504 {
505 /* Empty .eh_frame section. */
506 free (ehbuf);
507 return;
508 }
509
510 /* If .eh_frame section size doesn't fit into int, we cannot handle
511 it (it would need to use 64-bit .eh_frame format anyway). */
512 REQUIRE (sec->size == (unsigned int) sec->size);
513
514 ptr_size = (get_elf_backend_data (abfd)
515 ->elf_backend_eh_frame_address_size (abfd, sec));
516 REQUIRE (ptr_size != 0);
517
518 /* Go through the section contents and work out how many FDEs and
519 CIEs there are. */
520 buf = ehbuf;
521 end = ehbuf + sec->size;
522 num_cies = 0;
523 num_entries = 0;
524 while (buf != end)
525 {
526 num_entries++;
527
528 /* Read the length of the entry. */
529 REQUIRE (skip_bytes (&buf, end, 4));
530 hdr_length = bfd_get_32 (abfd, buf - 4);
531
532 /* 64-bit .eh_frame is not supported. */
533 REQUIRE (hdr_length != 0xffffffff);
534 if (hdr_length == 0)
535 break;
536
537 REQUIRE (skip_bytes (&buf, end, 4));
538 hdr_id = bfd_get_32 (abfd, buf - 4);
539 if (hdr_id == 0)
540 num_cies++;
541
542 REQUIRE (skip_bytes (&buf, end, hdr_length - 4));
543 }
544
545 sec_info = bfd_zmalloc (sizeof (struct eh_frame_sec_info)
546 + (num_entries - 1) * sizeof (struct eh_cie_fde));
547 REQUIRE (sec_info);
548
549 ecies = bfd_zmalloc (num_cies * sizeof (*ecies));
550 REQUIRE (ecies);
551
552 /* If we're not merging CIE entries (such as for a relocatable link),
553 we need to have a "struct cie" for each CIE in this section. */
554 if (hdr_info->cies == NULL)
555 {
556 local_cies = bfd_zmalloc (num_cies * sizeof (*local_cies));
557 REQUIRE (local_cies);
558 }
559
560 #define ENSURE_NO_RELOCS(buf) \
561 REQUIRE (!(cookie->rel < cookie->relend \
562 && (cookie->rel->r_offset \
563 < (bfd_size_type) ((buf) - ehbuf)) \
564 && cookie->rel->r_info != 0))
565
566 #define SKIP_RELOCS(buf) \
567 while (cookie->rel < cookie->relend \
568 && (cookie->rel->r_offset \
569 < (bfd_size_type) ((buf) - ehbuf))) \
570 cookie->rel++
571
572 #define GET_RELOC(buf) \
573 ((cookie->rel < cookie->relend \
574 && (cookie->rel->r_offset \
575 == (bfd_size_type) ((buf) - ehbuf))) \
576 ? cookie->rel : NULL)
577
578 buf = ehbuf;
579 ecie_count = 0;
580 while ((bfd_size_type) (buf - ehbuf) != sec->size)
581 {
582 char *aug;
583 bfd_byte *start, *insns, *insns_end;
584 bfd_size_type length;
585 unsigned int set_loc_count;
586
587 this_inf = sec_info->entry + sec_info->count;
588 last_fde = buf;
589
590 /* Read the length of the entry. */
591 REQUIRE (skip_bytes (&buf, ehbuf + sec->size, 4));
592 hdr_length = bfd_get_32 (abfd, buf - 4);
593
594 /* The CIE/FDE must be fully contained in this input section. */
595 REQUIRE ((bfd_size_type) (buf - ehbuf) + hdr_length <= sec->size);
596 end = buf + hdr_length;
597
598 this_inf->offset = last_fde - ehbuf;
599 this_inf->size = 4 + hdr_length;
600 this_inf->reloc_index = cookie->rel - cookie->rels;
601
602 if (hdr_length == 0)
603 {
604 /* A zero-length CIE should only be found at the end of
605 the section. */
606 REQUIRE ((bfd_size_type) (buf - ehbuf) == sec->size);
607 ENSURE_NO_RELOCS (buf);
608 sec_info->count++;
609 break;
610 }
611
612 REQUIRE (skip_bytes (&buf, end, 4));
613 hdr_id = bfd_get_32 (abfd, buf - 4);
614
615 if (hdr_id == 0)
616 {
617 unsigned int initial_insn_length;
618
619 /* CIE */
620 this_inf->cie = 1;
621
622 /* If we're merging CIEs, construct the struct cie in TMP_CIE;
623 we'll enter it into the global pool later. Otherwise point
624 CIE to one of the section-local cie structures. */
625 if (local_cies)
626 cie = local_cies + ecie_count;
627 else
628 {
629 cie = &tmp_cie;
630 memset (cie, 0, sizeof (*cie));
631 }
632 cie->cie_inf = this_inf;
633 cie->length = hdr_length;
634 cie->output_sec = sec->output_section;
635 start = buf;
636 REQUIRE (read_byte (&buf, end, &cie->version));
637
638 /* Cannot handle unknown versions. */
639 REQUIRE (cie->version == 1 || cie->version == 3);
640 REQUIRE (strlen ((char *) buf) < sizeof (cie->augmentation));
641
642 strcpy (cie->augmentation, (char *) buf);
643 buf = (bfd_byte *) strchr ((char *) buf, '\0') + 1;
644 ENSURE_NO_RELOCS (buf);
645 if (buf[0] == 'e' && buf[1] == 'h')
646 {
647 /* GCC < 3.0 .eh_frame CIE */
648 /* We cannot merge "eh" CIEs because __EXCEPTION_TABLE__
649 is private to each CIE, so we don't need it for anything.
650 Just skip it. */
651 REQUIRE (skip_bytes (&buf, end, ptr_size));
652 SKIP_RELOCS (buf);
653 }
654 REQUIRE (read_uleb128 (&buf, end, &cie->code_align));
655 REQUIRE (read_sleb128 (&buf, end, &cie->data_align));
656 if (cie->version == 1)
657 {
658 REQUIRE (buf < end);
659 cie->ra_column = *buf++;
660 }
661 else
662 REQUIRE (read_uleb128 (&buf, end, &cie->ra_column));
663 ENSURE_NO_RELOCS (buf);
664 cie->lsda_encoding = DW_EH_PE_omit;
665 cie->fde_encoding = DW_EH_PE_omit;
666 cie->per_encoding = DW_EH_PE_omit;
667 aug = cie->augmentation;
668 if (aug[0] != 'e' || aug[1] != 'h')
669 {
670 if (*aug == 'z')
671 {
672 aug++;
673 REQUIRE (read_uleb128 (&buf, end, &cie->augmentation_size));
674 ENSURE_NO_RELOCS (buf);
675 }
676
677 while (*aug != '\0')
678 switch (*aug++)
679 {
680 case 'L':
681 REQUIRE (read_byte (&buf, end, &cie->lsda_encoding));
682 ENSURE_NO_RELOCS (buf);
683 REQUIRE (get_DW_EH_PE_width (cie->lsda_encoding, ptr_size));
684 break;
685 case 'R':
686 REQUIRE (read_byte (&buf, end, &cie->fde_encoding));
687 ENSURE_NO_RELOCS (buf);
688 REQUIRE (get_DW_EH_PE_width (cie->fde_encoding, ptr_size));
689 break;
690 case 'S':
691 break;
692 case 'P':
693 {
694 int per_width;
695
696 REQUIRE (read_byte (&buf, end, &cie->per_encoding));
697 per_width = get_DW_EH_PE_width (cie->per_encoding,
698 ptr_size);
699 REQUIRE (per_width);
700 if ((cie->per_encoding & 0xf0) == DW_EH_PE_aligned)
701 {
702 length = -(buf - ehbuf) & (per_width - 1);
703 REQUIRE (skip_bytes (&buf, end, length));
704 }
705 ENSURE_NO_RELOCS (buf);
706 /* Ensure we have a reloc here. */
707 if (GET_RELOC (buf) != NULL)
708 {
709 unsigned long r_symndx;
710
711 #ifdef BFD64
712 if (elf_elfheader (abfd)->e_ident[EI_CLASS]
713 == ELFCLASS64)
714 r_symndx = ELF64_R_SYM (cookie->rel->r_info);
715 else
716 #endif
717 r_symndx = ELF32_R_SYM (cookie->rel->r_info);
718 if (r_symndx >= cookie->locsymcount
719 || ELF_ST_BIND (cookie->locsyms[r_symndx]
720 .st_info) != STB_LOCAL)
721 {
722 struct elf_link_hash_entry *h;
723
724 r_symndx -= cookie->extsymoff;
725 h = cookie->sym_hashes[r_symndx];
726
727 while (h->root.type == bfd_link_hash_indirect
728 || h->root.type == bfd_link_hash_warning)
729 h = (struct elf_link_hash_entry *)
730 h->root.u.i.link;
731
732 cie->personality.h = h;
733 }
734 else
735 {
736 Elf_Internal_Sym *sym;
737 asection *sym_sec;
738 bfd_vma val;
739
740 sym = &cookie->locsyms[r_symndx];
741 sym_sec = (bfd_section_from_elf_index
742 (abfd, sym->st_shndx));
743 if (sym_sec != NULL)
744 {
745 if (sym_sec->kept_section != NULL)
746 sym_sec = sym_sec->kept_section;
747 if (sym_sec->output_section != NULL)
748 {
749 val = (sym->st_value
750 + sym_sec->output_offset
751 + sym_sec->output_section->vma);
752 cie->personality.val = val;
753 cie->local_personality = 1;
754 }
755 }
756 }
757
758 /* Cope with MIPS-style composite relocations. */
759 do
760 cookie->rel++;
761 while (GET_RELOC (buf) != NULL);
762 }
763 REQUIRE (skip_bytes (&buf, end, per_width));
764 REQUIRE (cie->local_personality || cie->personality.h);
765 }
766 break;
767 default:
768 /* Unrecognized augmentation. Better bail out. */
769 goto free_no_table;
770 }
771 }
772
773 /* For shared libraries, try to get rid of as many RELATIVE relocs
774 as possible. */
775 if (info->shared
776 && (get_elf_backend_data (abfd)
777 ->elf_backend_can_make_relative_eh_frame
778 (abfd, info, sec)))
779 {
780 if ((cie->fde_encoding & 0xf0) == DW_EH_PE_absptr)
781 cie->make_relative = 1;
782 /* If the CIE doesn't already have an 'R' entry, it's fairly
783 easy to add one, provided that there's no aligned data
784 after the augmentation string. */
785 else if (cie->fde_encoding == DW_EH_PE_omit
786 && (cie->per_encoding & 0xf0) != DW_EH_PE_aligned)
787 {
788 if (*cie->augmentation == 0)
789 this_inf->add_augmentation_size = 1;
790 this_inf->add_fde_encoding = 1;
791 cie->make_relative = 1;
792 }
793 }
794
795 if (info->shared
796 && (get_elf_backend_data (abfd)
797 ->elf_backend_can_make_lsda_relative_eh_frame
798 (abfd, info, sec))
799 && (cie->lsda_encoding & 0xf0) == DW_EH_PE_absptr)
800 cie->make_lsda_relative = 1;
801
802 /* If FDE encoding was not specified, it defaults to
803 DW_EH_absptr. */
804 if (cie->fde_encoding == DW_EH_PE_omit)
805 cie->fde_encoding = DW_EH_PE_absptr;
806
807 initial_insn_length = end - buf;
808 if (initial_insn_length <= sizeof (cie->initial_instructions))
809 {
810 cie->initial_insn_length = initial_insn_length;
811 memcpy (cie->initial_instructions, buf, initial_insn_length);
812 }
813 insns = buf;
814 buf += initial_insn_length;
815 ENSURE_NO_RELOCS (buf);
816
817 this_inf->make_relative = cie->make_relative;
818 this_inf->make_lsda_relative = cie->make_lsda_relative;
819 this_inf->per_encoding_relative
820 = (cie->per_encoding & 0x70) == DW_EH_PE_pcrel;
821 }
822 else
823 {
824 /* Find the corresponding CIE. */
825 unsigned int cie_offset = this_inf->offset + 4 - hdr_id;
826 for (ecie = ecies; ecie < ecies + ecie_count; ++ecie)
827 if (cie_offset == ecie->local_cie->offset)
828 break;
829
830 /* Ensure this FDE references one of the CIEs in this input
831 section. */
832 REQUIRE (ecie != ecies + ecie_count);
833 cie = ecie->cie;
834 this_inf->u.fde.cie_inf = ecie->local_cie;
835
836 ENSURE_NO_RELOCS (buf);
837 REQUIRE (GET_RELOC (buf));
838
839 /* Skip the initial location and address range. */
840 start = buf;
841 length = get_DW_EH_PE_width (cie->fde_encoding, ptr_size);
842 REQUIRE (skip_bytes (&buf, end, 2 * length));
843
844 /* Skip the augmentation size, if present. */
845 if (cie->augmentation[0] == 'z')
846 REQUIRE (read_uleb128 (&buf, end, &length));
847 else
848 length = 0;
849
850 /* Of the supported augmentation characters above, only 'L'
851 adds augmentation data to the FDE. This code would need to
852 be adjusted if any future augmentations do the same thing. */
853 if (cie->lsda_encoding != DW_EH_PE_omit)
854 {
855 this_inf->lsda_offset = buf - start;
856 /* If there's no 'z' augmentation, we don't know where the
857 CFA insns begin. Assume no padding. */
858 if (cie->augmentation[0] != 'z')
859 length = end - buf;
860 }
861
862 /* Skip over the augmentation data. */
863 REQUIRE (skip_bytes (&buf, end, length));
864 insns = buf;
865
866 buf = last_fde + 4 + hdr_length;
867 SKIP_RELOCS (buf);
868 }
869
870 /* Try to interpret the CFA instructions and find the first
871 padding nop. Shrink this_inf's size so that it doesn't
872 include the padding. */
873 length = get_DW_EH_PE_width (cie->fde_encoding, ptr_size);
874 set_loc_count = 0;
875 insns_end = skip_non_nops (insns, end, length, &set_loc_count);
876 /* If we don't understand the CFA instructions, we can't know
877 what needs to be adjusted there. */
878 if (insns_end == NULL
879 /* For the time being we don't support DW_CFA_set_loc in
880 CIE instructions. */
881 || (set_loc_count && this_inf->cie))
882 goto free_no_table;
883 this_inf->size -= end - insns_end;
884 if (insns_end != end && this_inf->cie)
885 {
886 cie->initial_insn_length -= end - insns_end;
887 cie->length -= end - insns_end;
888 }
889 if (set_loc_count
890 && ((cie->fde_encoding & 0xf0) == DW_EH_PE_pcrel
891 || cie->make_relative))
892 {
893 unsigned int cnt;
894 bfd_byte *p;
895
896 this_inf->set_loc = bfd_malloc ((set_loc_count + 1)
897 * sizeof (unsigned int));
898 REQUIRE (this_inf->set_loc);
899 this_inf->set_loc[0] = set_loc_count;
900 p = insns;
901 cnt = 0;
902 while (p < end)
903 {
904 if (*p == DW_CFA_set_loc)
905 this_inf->set_loc[++cnt] = p + 1 - start;
906 REQUIRE (skip_cfa_op (&p, end, length));
907 }
908 }
909
910 this_inf->removed = 1;
911 this_inf->fde_encoding = cie->fde_encoding;
912 this_inf->lsda_encoding = cie->lsda_encoding;
913 if (this_inf->cie)
914 {
915 /* We have now finished constructing the struct cie. */
916 if (hdr_info->cies != NULL)
917 {
918 /* See if we can merge this CIE with an earlier one. */
919 void **loc;
920
921 cie_compute_hash (cie);
922 loc = htab_find_slot_with_hash (hdr_info->cies, cie,
923 cie->hash, INSERT);
924 REQUIRE (loc);
925 if (*loc == HTAB_EMPTY_ENTRY)
926 {
927 *loc = malloc (sizeof (struct cie));
928 REQUIRE (*loc);
929 memcpy (*loc, cie, sizeof (struct cie));
930 }
931 cie = (struct cie *) *loc;
932 }
933 this_inf->u.cie.merged = cie->cie_inf;
934 ecies[ecie_count].cie = cie;
935 ecies[ecie_count++].local_cie = this_inf;
936 }
937 sec_info->count++;
938 }
939 BFD_ASSERT (sec_info->count == num_entries);
940 BFD_ASSERT (ecie_count == num_cies);
941
942 elf_section_data (sec)->sec_info = sec_info;
943 sec->sec_info_type = ELF_INFO_TYPE_EH_FRAME;
944 goto success;
945
946 free_no_table:
947 (*info->callbacks->einfo)
948 (_("%P: error in %B(%A); no .eh_frame_hdr table will be created.\n"),
949 abfd, sec);
950 hdr_info->table = FALSE;
951 if (sec_info)
952 free (sec_info);
953 success:
954 if (ehbuf)
955 free (ehbuf);
956 if (ecies)
957 free (ecies);
958 if (local_cies)
959 free (local_cies);
960 #undef REQUIRE
961 }
962
963 /* Finish a pass over all .eh_frame sections. */
964
965 void
966 _bfd_elf_end_eh_frame_parsing (struct bfd_link_info *info)
967 {
968 struct eh_frame_hdr_info *hdr_info;
969
970 hdr_info = &elf_hash_table (info)->eh_info;
971 if (hdr_info->cies != NULL)
972 {
973 htab_delete (hdr_info->cies);
974 hdr_info->cies = NULL;
975 }
976 hdr_info->parsed_eh_frames = TRUE;
977 }
978
979 /* This function is called for each input file before the .eh_frame
980 section is relocated. It discards duplicate CIEs and FDEs for discarded
981 functions. The function returns TRUE iff any entries have been
982 deleted. */
983
984 bfd_boolean
985 _bfd_elf_discard_section_eh_frame
986 (bfd *abfd, struct bfd_link_info *info, asection *sec,
987 bfd_boolean (*reloc_symbol_deleted_p) (bfd_vma, void *),
988 struct elf_reloc_cookie *cookie)
989 {
990 struct eh_cie_fde *ent, *cie, *merged;
991 struct eh_frame_sec_info *sec_info;
992 struct eh_frame_hdr_info *hdr_info;
993 unsigned int ptr_size, offset;
994
995 sec_info = (struct eh_frame_sec_info *) elf_section_data (sec)->sec_info;
996 if (sec_info == NULL)
997 return FALSE;
998
999 hdr_info = &elf_hash_table (info)->eh_info;
1000 for (ent = sec_info->entry; ent < sec_info->entry + sec_info->count; ++ent)
1001 if (!ent->cie)
1002 {
1003 cookie->rel = cookie->rels + ent->reloc_index;
1004 BFD_ASSERT (cookie->rel < cookie->relend
1005 && cookie->rel->r_offset == ent->offset + 8);
1006 if (!(*reloc_symbol_deleted_p) (ent->offset + 8, cookie))
1007 {
1008 if (info->shared
1009 && (((ent->fde_encoding & 0xf0) == DW_EH_PE_absptr
1010 && ent->u.fde.cie_inf->make_relative == 0)
1011 || (ent->fde_encoding & 0xf0) == DW_EH_PE_aligned))
1012 {
1013 /* If a shared library uses absolute pointers
1014 which we cannot turn into PC relative,
1015 don't create the binary search table,
1016 since it is affected by runtime relocations. */
1017 hdr_info->table = FALSE;
1018 (*info->callbacks->einfo)
1019 (_("%P: fde encoding in %B(%A) prevents .eh_frame_hdr"
1020 " table being created.\n"), abfd, sec);
1021 }
1022 ent->removed = 0;
1023 hdr_info->fde_count++;
1024
1025 cie = ent->u.fde.cie_inf;
1026 if (cie->removed)
1027 {
1028 merged = cie->u.cie.merged;
1029 if (!merged->removed)
1030 /* We have decided to keep the group representative. */
1031 ent->u.fde.cie_inf = merged;
1032 else if (merged->u.cie.merged != merged)
1033 /* We didn't keep the original group representative,
1034 but we did keep an alternative. */
1035 ent->u.fde.cie_inf = merged->u.cie.merged;
1036 else
1037 {
1038 /* Make the local CIE represent the merged group. */
1039 merged->u.cie.merged = cie;
1040 cie->removed = 0;
1041 }
1042 }
1043 }
1044 }
1045
1046 ptr_size = (get_elf_backend_data (sec->owner)
1047 ->elf_backend_eh_frame_address_size (sec->owner, sec));
1048 offset = 0;
1049 for (ent = sec_info->entry; ent < sec_info->entry + sec_info->count; ++ent)
1050 if (!ent->removed)
1051 {
1052 ent->new_offset = offset;
1053 offset += size_of_output_cie_fde (ent, ptr_size);
1054 }
1055
1056 sec->rawsize = sec->size;
1057 sec->size = offset;
1058 return offset != sec->rawsize;
1059 }
1060
1061 /* This function is called for .eh_frame_hdr section after
1062 _bfd_elf_discard_section_eh_frame has been called on all .eh_frame
1063 input sections. It finalizes the size of .eh_frame_hdr section. */
1064
1065 bfd_boolean
1066 _bfd_elf_discard_section_eh_frame_hdr (bfd *abfd, struct bfd_link_info *info)
1067 {
1068 struct elf_link_hash_table *htab;
1069 struct eh_frame_hdr_info *hdr_info;
1070 asection *sec;
1071
1072 htab = elf_hash_table (info);
1073 hdr_info = &htab->eh_info;
1074
1075 sec = hdr_info->hdr_sec;
1076 if (sec == NULL)
1077 return FALSE;
1078
1079 sec->size = EH_FRAME_HDR_SIZE;
1080 if (hdr_info->table)
1081 sec->size += 4 + hdr_info->fde_count * 8;
1082
1083 elf_tdata (abfd)->eh_frame_hdr = sec;
1084 return TRUE;
1085 }
1086
1087 /* This function is called from size_dynamic_sections.
1088 It needs to decide whether .eh_frame_hdr should be output or not,
1089 because when the dynamic symbol table has been sized it is too late
1090 to strip sections. */
1091
1092 bfd_boolean
1093 _bfd_elf_maybe_strip_eh_frame_hdr (struct bfd_link_info *info)
1094 {
1095 asection *o;
1096 bfd *abfd;
1097 struct elf_link_hash_table *htab;
1098 struct eh_frame_hdr_info *hdr_info;
1099
1100 htab = elf_hash_table (info);
1101 hdr_info = &htab->eh_info;
1102 if (hdr_info->hdr_sec == NULL)
1103 return TRUE;
1104
1105 if (bfd_is_abs_section (hdr_info->hdr_sec->output_section))
1106 {
1107 hdr_info->hdr_sec = NULL;
1108 return TRUE;
1109 }
1110
1111 abfd = NULL;
1112 if (info->eh_frame_hdr)
1113 for (abfd = info->input_bfds; abfd != NULL; abfd = abfd->link_next)
1114 {
1115 /* Count only sections which have at least a single CIE or FDE.
1116 There cannot be any CIE or FDE <= 8 bytes. */
1117 o = bfd_get_section_by_name (abfd, ".eh_frame");
1118 if (o && o->size > 8 && !bfd_is_abs_section (o->output_section))
1119 break;
1120 }
1121
1122 if (abfd == NULL)
1123 {
1124 hdr_info->hdr_sec->flags |= SEC_EXCLUDE;
1125 hdr_info->hdr_sec = NULL;
1126 return TRUE;
1127 }
1128
1129 hdr_info->table = TRUE;
1130 return TRUE;
1131 }
1132
1133 /* Adjust an address in the .eh_frame section. Given OFFSET within
1134 SEC, this returns the new offset in the adjusted .eh_frame section,
1135 or -1 if the address refers to a CIE/FDE which has been removed
1136 or to offset with dynamic relocation which is no longer needed. */
1137
1138 bfd_vma
1139 _bfd_elf_eh_frame_section_offset (bfd *output_bfd ATTRIBUTE_UNUSED,
1140 struct bfd_link_info *info,
1141 asection *sec,
1142 bfd_vma offset)
1143 {
1144 struct eh_frame_sec_info *sec_info;
1145 struct elf_link_hash_table *htab;
1146 struct eh_frame_hdr_info *hdr_info;
1147 unsigned int lo, hi, mid;
1148
1149 if (sec->sec_info_type != ELF_INFO_TYPE_EH_FRAME)
1150 return offset;
1151 sec_info = elf_section_data (sec)->sec_info;
1152
1153 if (offset >= sec->rawsize)
1154 return offset - sec->rawsize + sec->size;
1155
1156 htab = elf_hash_table (info);
1157 hdr_info = &htab->eh_info;
1158 if (hdr_info->offsets_adjusted)
1159 offset += sec->output_offset;
1160
1161 lo = 0;
1162 hi = sec_info->count;
1163 mid = 0;
1164 while (lo < hi)
1165 {
1166 mid = (lo + hi) / 2;
1167 if (offset < sec_info->entry[mid].offset)
1168 hi = mid;
1169 else if (offset
1170 >= sec_info->entry[mid].offset + sec_info->entry[mid].size)
1171 lo = mid + 1;
1172 else
1173 break;
1174 }
1175
1176 BFD_ASSERT (lo < hi);
1177
1178 /* FDE or CIE was removed. */
1179 if (sec_info->entry[mid].removed)
1180 return (bfd_vma) -1;
1181
1182 /* If converting to DW_EH_PE_pcrel, there will be no need for run-time
1183 relocation against FDE's initial_location field. */
1184 if (!sec_info->entry[mid].cie
1185 && sec_info->entry[mid].u.fde.cie_inf->make_relative
1186 && offset == sec_info->entry[mid].offset + 8)
1187 return (bfd_vma) -2;
1188
1189 /* If converting LSDA pointers to DW_EH_PE_pcrel, there will be no need
1190 for run-time relocation against LSDA field. */
1191 if (!sec_info->entry[mid].cie
1192 && sec_info->entry[mid].u.fde.cie_inf->make_lsda_relative
1193 && (offset == (sec_info->entry[mid].offset + 8
1194 + sec_info->entry[mid].lsda_offset))
1195 && (sec_info->entry[mid].u.fde.cie_inf->need_lsda_relative
1196 || !hdr_info->offsets_adjusted))
1197 {
1198 sec_info->entry[mid].u.fde.cie_inf->need_lsda_relative = 1;
1199 return (bfd_vma) -2;
1200 }
1201
1202 /* If converting to DW_EH_PE_pcrel, there will be no need for run-time
1203 relocation against DW_CFA_set_loc's arguments. */
1204 if (sec_info->entry[mid].set_loc
1205 && (sec_info->entry[mid].cie
1206 ? sec_info->entry[mid].make_relative
1207 : sec_info->entry[mid].u.fde.cie_inf->make_relative)
1208 && (offset >= sec_info->entry[mid].offset + 8
1209 + sec_info->entry[mid].set_loc[1]))
1210 {
1211 unsigned int cnt;
1212
1213 for (cnt = 1; cnt <= sec_info->entry[mid].set_loc[0]; cnt++)
1214 if (offset == sec_info->entry[mid].offset + 8
1215 + sec_info->entry[mid].set_loc[cnt])
1216 return (bfd_vma) -2;
1217 }
1218
1219 if (hdr_info->offsets_adjusted)
1220 offset -= sec->output_offset;
1221 /* Any new augmentation bytes go before the first relocation. */
1222 return (offset + sec_info->entry[mid].new_offset
1223 - sec_info->entry[mid].offset
1224 + extra_augmentation_string_bytes (sec_info->entry + mid)
1225 + extra_augmentation_data_bytes (sec_info->entry + mid));
1226 }
1227
1228 /* Write out .eh_frame section. This is called with the relocated
1229 contents. */
1230
1231 bfd_boolean
1232 _bfd_elf_write_section_eh_frame (bfd *abfd,
1233 struct bfd_link_info *info,
1234 asection *sec,
1235 bfd_byte *contents)
1236 {
1237 struct eh_frame_sec_info *sec_info;
1238 struct elf_link_hash_table *htab;
1239 struct eh_frame_hdr_info *hdr_info;
1240 unsigned int ptr_size;
1241 struct eh_cie_fde *ent;
1242
1243 if (sec->sec_info_type != ELF_INFO_TYPE_EH_FRAME)
1244 return bfd_set_section_contents (abfd, sec->output_section, contents,
1245 sec->output_offset, sec->size);
1246
1247 ptr_size = (get_elf_backend_data (abfd)
1248 ->elf_backend_eh_frame_address_size (abfd, sec));
1249 BFD_ASSERT (ptr_size != 0);
1250
1251 sec_info = elf_section_data (sec)->sec_info;
1252 htab = elf_hash_table (info);
1253 hdr_info = &htab->eh_info;
1254
1255 /* First convert all offsets to output section offsets, so that a
1256 CIE offset is valid if the CIE is used by a FDE from some other
1257 section. This can happen when duplicate CIEs are deleted in
1258 _bfd_elf_discard_section_eh_frame. We do all sections here because
1259 this function might not be called on sections in the same order as
1260 _bfd_elf_discard_section_eh_frame. */
1261 if (!hdr_info->offsets_adjusted)
1262 {
1263 bfd *ibfd;
1264 asection *eh;
1265 struct eh_frame_sec_info *eh_inf;
1266
1267 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
1268 {
1269 if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
1270 || (ibfd->flags & DYNAMIC) != 0)
1271 continue;
1272
1273 eh = bfd_get_section_by_name (ibfd, ".eh_frame");
1274 if (eh == NULL || eh->sec_info_type != ELF_INFO_TYPE_EH_FRAME)
1275 continue;
1276
1277 eh_inf = elf_section_data (eh)->sec_info;
1278 for (ent = eh_inf->entry; ent < eh_inf->entry + eh_inf->count; ++ent)
1279 {
1280 ent->offset += eh->output_offset;
1281 ent->new_offset += eh->output_offset;
1282 }
1283 }
1284 hdr_info->offsets_adjusted = TRUE;
1285 }
1286
1287 if (hdr_info->table && hdr_info->array == NULL)
1288 hdr_info->array
1289 = bfd_malloc (hdr_info->fde_count * sizeof(*hdr_info->array));
1290 if (hdr_info->array == NULL)
1291 hdr_info = NULL;
1292
1293 /* The new offsets can be bigger or smaller than the original offsets.
1294 We therefore need to make two passes over the section: one backward
1295 pass to move entries up and one forward pass to move entries down.
1296 The two passes won't interfere with each other because entries are
1297 not reordered */
1298 for (ent = sec_info->entry + sec_info->count; ent-- != sec_info->entry;)
1299 if (!ent->removed && ent->new_offset > ent->offset)
1300 memmove (contents + ent->new_offset - sec->output_offset,
1301 contents + ent->offset - sec->output_offset, ent->size);
1302
1303 for (ent = sec_info->entry; ent < sec_info->entry + sec_info->count; ++ent)
1304 if (!ent->removed && ent->new_offset < ent->offset)
1305 memmove (contents + ent->new_offset - sec->output_offset,
1306 contents + ent->offset - sec->output_offset, ent->size);
1307
1308 for (ent = sec_info->entry; ent < sec_info->entry + sec_info->count; ++ent)
1309 {
1310 unsigned char *buf, *end;
1311 unsigned int new_size;
1312
1313 if (ent->removed)
1314 continue;
1315
1316 if (ent->size == 4)
1317 {
1318 /* Any terminating FDE must be at the end of the section. */
1319 BFD_ASSERT (ent == sec_info->entry + sec_info->count - 1);
1320 continue;
1321 }
1322
1323 buf = contents + ent->new_offset - sec->output_offset;
1324 end = buf + ent->size;
1325 new_size = size_of_output_cie_fde (ent, ptr_size);
1326
1327 /* Update the size. It may be shrinked. */
1328 bfd_put_32 (abfd, new_size - 4, buf);
1329
1330 /* Filling the extra bytes with DW_CFA_nops. */
1331 if (new_size != ent->size)
1332 memset (end, 0, new_size - ent->size);
1333
1334 if (ent->cie)
1335 {
1336 /* CIE */
1337 if (ent->make_relative
1338 || ent->need_lsda_relative
1339 || ent->per_encoding_relative)
1340 {
1341 char *aug;
1342 unsigned int action, extra_string, extra_data;
1343 unsigned int per_width, per_encoding;
1344
1345 /* Need to find 'R' or 'L' augmentation's argument and modify
1346 DW_EH_PE_* value. */
1347 action = ((ent->make_relative ? 1 : 0)
1348 | (ent->need_lsda_relative ? 2 : 0)
1349 | (ent->per_encoding_relative ? 4 : 0));
1350 extra_string = extra_augmentation_string_bytes (ent);
1351 extra_data = extra_augmentation_data_bytes (ent);
1352
1353 /* Skip length, id and version. */
1354 buf += 9;
1355 aug = (char *) buf;
1356 buf += strlen (aug) + 1;
1357 skip_leb128 (&buf, end);
1358 skip_leb128 (&buf, end);
1359 skip_leb128 (&buf, end);
1360 if (*aug == 'z')
1361 {
1362 /* The uleb128 will always be a single byte for the kind
1363 of augmentation strings that we're prepared to handle. */
1364 *buf++ += extra_data;
1365 aug++;
1366 }
1367
1368 /* Make room for the new augmentation string and data bytes. */
1369 memmove (buf + extra_string + extra_data, buf, end - buf);
1370 memmove (aug + extra_string, aug, buf - (bfd_byte *) aug);
1371 buf += extra_string;
1372 end += extra_string + extra_data;
1373
1374 if (ent->add_augmentation_size)
1375 {
1376 *aug++ = 'z';
1377 *buf++ = extra_data - 1;
1378 }
1379 if (ent->add_fde_encoding)
1380 {
1381 BFD_ASSERT (action & 1);
1382 *aug++ = 'R';
1383 *buf++ = DW_EH_PE_pcrel;
1384 action &= ~1;
1385 }
1386
1387 while (action)
1388 switch (*aug++)
1389 {
1390 case 'L':
1391 if (action & 2)
1392 {
1393 BFD_ASSERT (*buf == ent->lsda_encoding);
1394 *buf |= DW_EH_PE_pcrel;
1395 action &= ~2;
1396 }
1397 buf++;
1398 break;
1399 case 'P':
1400 per_encoding = *buf++;
1401 per_width = get_DW_EH_PE_width (per_encoding, ptr_size);
1402 BFD_ASSERT (per_width != 0);
1403 BFD_ASSERT (((per_encoding & 0x70) == DW_EH_PE_pcrel)
1404 == ent->per_encoding_relative);
1405 if ((per_encoding & 0xf0) == DW_EH_PE_aligned)
1406 buf = (contents
1407 + ((buf - contents + per_width - 1)
1408 & ~((bfd_size_type) per_width - 1)));
1409 if (action & 4)
1410 {
1411 bfd_vma val;
1412
1413 val = read_value (abfd, buf, per_width,
1414 get_DW_EH_PE_signed (per_encoding));
1415 val += ent->offset - ent->new_offset;
1416 val -= extra_string + extra_data;
1417 write_value (abfd, buf, val, per_width);
1418 action &= ~4;
1419 }
1420 buf += per_width;
1421 break;
1422 case 'R':
1423 if (action & 1)
1424 {
1425 BFD_ASSERT (*buf == ent->fde_encoding);
1426 *buf |= DW_EH_PE_pcrel;
1427 action &= ~1;
1428 }
1429 buf++;
1430 break;
1431 case 'S':
1432 break;
1433 default:
1434 BFD_FAIL ();
1435 }
1436 }
1437 }
1438 else
1439 {
1440 /* FDE */
1441 bfd_vma value, address;
1442 unsigned int width;
1443 bfd_byte *start;
1444 struct eh_cie_fde *cie;
1445
1446 /* Skip length. */
1447 cie = ent->u.fde.cie_inf;
1448 buf += 4;
1449 value = ent->new_offset + 4 - cie->new_offset;
1450 bfd_put_32 (abfd, value, buf);
1451 buf += 4;
1452 width = get_DW_EH_PE_width (ent->fde_encoding, ptr_size);
1453 value = read_value (abfd, buf, width,
1454 get_DW_EH_PE_signed (ent->fde_encoding));
1455 address = value;
1456 if (value)
1457 {
1458 switch (ent->fde_encoding & 0xf0)
1459 {
1460 case DW_EH_PE_indirect:
1461 case DW_EH_PE_textrel:
1462 BFD_ASSERT (hdr_info == NULL);
1463 break;
1464 case DW_EH_PE_datarel:
1465 {
1466 asection *got = bfd_get_section_by_name (abfd, ".got");
1467
1468 BFD_ASSERT (got != NULL);
1469 address += got->vma;
1470 }
1471 break;
1472 case DW_EH_PE_pcrel:
1473 value += ent->offset - ent->new_offset;
1474 address += sec->output_section->vma + ent->offset + 8;
1475 break;
1476 }
1477 if (cie->make_relative)
1478 value -= sec->output_section->vma + ent->new_offset + 8;
1479 write_value (abfd, buf, value, width);
1480 }
1481
1482 start = buf;
1483
1484 if (hdr_info)
1485 {
1486 hdr_info->array[hdr_info->array_count].initial_loc = address;
1487 hdr_info->array[hdr_info->array_count++].fde
1488 = sec->output_section->vma + ent->new_offset;
1489 }
1490
1491 if ((ent->lsda_encoding & 0xf0) == DW_EH_PE_pcrel
1492 || cie->need_lsda_relative)
1493 {
1494 buf += ent->lsda_offset;
1495 width = get_DW_EH_PE_width (ent->lsda_encoding, ptr_size);
1496 value = read_value (abfd, buf, width,
1497 get_DW_EH_PE_signed (ent->lsda_encoding));
1498 if (value)
1499 {
1500 if ((ent->lsda_encoding & 0xf0) == DW_EH_PE_pcrel)
1501 value += ent->offset - ent->new_offset;
1502 else if (cie->need_lsda_relative)
1503 value -= (sec->output_section->vma + ent->new_offset + 8
1504 + ent->lsda_offset);
1505 write_value (abfd, buf, value, width);
1506 }
1507 }
1508 else if (cie->add_augmentation_size)
1509 {
1510 /* Skip the PC and length and insert a zero byte for the
1511 augmentation size. */
1512 buf += width * 2;
1513 memmove (buf + 1, buf, end - buf);
1514 *buf = 0;
1515 }
1516
1517 if (ent->set_loc)
1518 {
1519 /* Adjust DW_CFA_set_loc. */
1520 unsigned int cnt, width;
1521 bfd_vma new_offset;
1522
1523 width = get_DW_EH_PE_width (ent->fde_encoding, ptr_size);
1524 new_offset = ent->new_offset + 8
1525 + extra_augmentation_string_bytes (ent)
1526 + extra_augmentation_data_bytes (ent);
1527
1528 for (cnt = 1; cnt <= ent->set_loc[0]; cnt++)
1529 {
1530 bfd_vma value;
1531 buf = start + ent->set_loc[cnt];
1532
1533 value = read_value (abfd, buf, width,
1534 get_DW_EH_PE_signed (ent->fde_encoding));
1535 if (!value)
1536 continue;
1537
1538 if ((ent->fde_encoding & 0xf0) == DW_EH_PE_pcrel)
1539 value += ent->offset + 8 - new_offset;
1540 if (cie->make_relative)
1541 value -= sec->output_section->vma + new_offset
1542 + ent->set_loc[cnt];
1543 write_value (abfd, buf, value, width);
1544 }
1545 }
1546 }
1547 }
1548
1549 /* We don't align the section to its section alignment since the
1550 runtime library only expects all CIE/FDE records aligned at
1551 the pointer size. _bfd_elf_discard_section_eh_frame should
1552 have padded CIE/FDE records to multiple of pointer size with
1553 size_of_output_cie_fde. */
1554 if ((sec->size % ptr_size) != 0)
1555 abort ();
1556
1557 return bfd_set_section_contents (abfd, sec->output_section,
1558 contents, (file_ptr) sec->output_offset,
1559 sec->size);
1560 }
1561
1562 /* Helper function used to sort .eh_frame_hdr search table by increasing
1563 VMA of FDE initial location. */
1564
1565 static int
1566 vma_compare (const void *a, const void *b)
1567 {
1568 const struct eh_frame_array_ent *p = a;
1569 const struct eh_frame_array_ent *q = b;
1570 if (p->initial_loc > q->initial_loc)
1571 return 1;
1572 if (p->initial_loc < q->initial_loc)
1573 return -1;
1574 return 0;
1575 }
1576
1577 /* Write out .eh_frame_hdr section. This must be called after
1578 _bfd_elf_write_section_eh_frame has been called on all input
1579 .eh_frame sections.
1580 .eh_frame_hdr format:
1581 ubyte version (currently 1)
1582 ubyte eh_frame_ptr_enc (DW_EH_PE_* encoding of pointer to start of
1583 .eh_frame section)
1584 ubyte fde_count_enc (DW_EH_PE_* encoding of total FDE count
1585 number (or DW_EH_PE_omit if there is no
1586 binary search table computed))
1587 ubyte table_enc (DW_EH_PE_* encoding of binary search table,
1588 or DW_EH_PE_omit if not present.
1589 DW_EH_PE_datarel is using address of
1590 .eh_frame_hdr section start as base)
1591 [encoded] eh_frame_ptr (pointer to start of .eh_frame section)
1592 optionally followed by:
1593 [encoded] fde_count (total number of FDEs in .eh_frame section)
1594 fde_count x [encoded] initial_loc, fde
1595 (array of encoded pairs containing
1596 FDE initial_location field and FDE address,
1597 sorted by increasing initial_loc). */
1598
1599 bfd_boolean
1600 _bfd_elf_write_section_eh_frame_hdr (bfd *abfd, struct bfd_link_info *info)
1601 {
1602 struct elf_link_hash_table *htab;
1603 struct eh_frame_hdr_info *hdr_info;
1604 asection *sec;
1605 bfd_byte *contents;
1606 asection *eh_frame_sec;
1607 bfd_size_type size;
1608 bfd_boolean retval;
1609 bfd_vma encoded_eh_frame;
1610
1611 htab = elf_hash_table (info);
1612 hdr_info = &htab->eh_info;
1613 sec = hdr_info->hdr_sec;
1614 if (sec == NULL)
1615 return TRUE;
1616
1617 size = EH_FRAME_HDR_SIZE;
1618 if (hdr_info->array && hdr_info->array_count == hdr_info->fde_count)
1619 size += 4 + hdr_info->fde_count * 8;
1620 contents = bfd_malloc (size);
1621 if (contents == NULL)
1622 return FALSE;
1623
1624 eh_frame_sec = bfd_get_section_by_name (abfd, ".eh_frame");
1625 if (eh_frame_sec == NULL)
1626 {
1627 free (contents);
1628 return FALSE;
1629 }
1630
1631 memset (contents, 0, EH_FRAME_HDR_SIZE);
1632 contents[0] = 1; /* Version. */
1633 contents[1] = get_elf_backend_data (abfd)->elf_backend_encode_eh_address
1634 (abfd, info, eh_frame_sec, 0, sec, 4,
1635 &encoded_eh_frame); /* .eh_frame offset. */
1636
1637 if (hdr_info->array && hdr_info->array_count == hdr_info->fde_count)
1638 {
1639 contents[2] = DW_EH_PE_udata4; /* FDE count encoding. */
1640 contents[3] = DW_EH_PE_datarel | DW_EH_PE_sdata4; /* Search table enc. */
1641 }
1642 else
1643 {
1644 contents[2] = DW_EH_PE_omit;
1645 contents[3] = DW_EH_PE_omit;
1646 }
1647 bfd_put_32 (abfd, encoded_eh_frame, contents + 4);
1648
1649 if (contents[2] != DW_EH_PE_omit)
1650 {
1651 unsigned int i;
1652
1653 bfd_put_32 (abfd, hdr_info->fde_count, contents + EH_FRAME_HDR_SIZE);
1654 qsort (hdr_info->array, hdr_info->fde_count, sizeof (*hdr_info->array),
1655 vma_compare);
1656 for (i = 0; i < hdr_info->fde_count; i++)
1657 {
1658 bfd_put_32 (abfd,
1659 hdr_info->array[i].initial_loc
1660 - sec->output_section->vma,
1661 contents + EH_FRAME_HDR_SIZE + i * 8 + 4);
1662 bfd_put_32 (abfd,
1663 hdr_info->array[i].fde - sec->output_section->vma,
1664 contents + EH_FRAME_HDR_SIZE + i * 8 + 8);
1665 }
1666 }
1667
1668 retval = bfd_set_section_contents (abfd, sec->output_section,
1669 contents, (file_ptr) sec->output_offset,
1670 sec->size);
1671 free (contents);
1672 return retval;
1673 }
1674
1675 /* Return the width of FDE addresses. This is the default implementation. */
1676
1677 unsigned int
1678 _bfd_elf_eh_frame_address_size (bfd *abfd, asection *sec ATTRIBUTE_UNUSED)
1679 {
1680 return elf_elfheader (abfd)->e_ident[EI_CLASS] == ELFCLASS64 ? 8 : 4;
1681 }
1682
1683 /* Decide whether we can use a PC-relative encoding within the given
1684 EH frame section. This is the default implementation. */
1685
1686 bfd_boolean
1687 _bfd_elf_can_make_relative (bfd *input_bfd ATTRIBUTE_UNUSED,
1688 struct bfd_link_info *info ATTRIBUTE_UNUSED,
1689 asection *eh_frame_section ATTRIBUTE_UNUSED)
1690 {
1691 return TRUE;
1692 }
1693
1694 /* Select an encoding for the given address. Preference is given to
1695 PC-relative addressing modes. */
1696
1697 bfd_byte
1698 _bfd_elf_encode_eh_address (bfd *abfd ATTRIBUTE_UNUSED,
1699 struct bfd_link_info *info ATTRIBUTE_UNUSED,
1700 asection *osec, bfd_vma offset,
1701 asection *loc_sec, bfd_vma loc_offset,
1702 bfd_vma *encoded)
1703 {
1704 *encoded = osec->vma + offset -
1705 (loc_sec->output_section->vma + loc_sec->output_offset + loc_offset);
1706 return DW_EH_PE_pcrel | DW_EH_PE_sdata4;
1707 }
This page took 0.093291 seconds and 4 git commands to generate.