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>.
6 This file is part of BFD, the Binary File Descriptor library.
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.
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.
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. */
27 #include "elf/dwarf2.h"
29 #define EH_FRAME_HDR_SIZE 8
35 unsigned char version;
36 unsigned char local_personality;
37 char augmentation[20];
39 bfd_signed_vma data_align;
41 bfd_vma augmentation_size;
43 struct elf_link_hash_entry *h;
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];
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. */
62 static inline bfd_boolean
63 read_byte (bfd_byte **iter, bfd_byte *end, unsigned char *result)
67 *result = *((*iter)++);
71 /* Move *ITER over LENGTH bytes, or up to END, whichever is closer.
72 Return true it was possible to move LENGTH bytes. */
74 static inline bfd_boolean
75 skip_bytes (bfd_byte **iter, bfd_byte *end, bfd_size_type length)
77 if ((bfd_size_type) (end - *iter) < length)
86 /* Move *ITER over an leb128, stopping at END. Return true if the end
87 of the leb128 was found. */
90 skip_leb128 (bfd_byte **iter, bfd_byte *end)
94 if (!read_byte (iter, end, &byte))
100 /* Like skip_leb128, but treat the leb128 as an unsigned value and
101 store it in *VALUE. */
104 read_uleb128 (bfd_byte **iter, bfd_byte *end, bfd_vma *value)
109 if (!skip_leb128 (iter, end))
115 *value = (*value << 7) | (*--p & 0x7f);
120 /* Like read_uleb128, but for signed values. */
123 read_sleb128 (bfd_byte **iter, bfd_byte *end, bfd_signed_vma *value)
128 if (!skip_leb128 (iter, end))
132 *value = ((*--p & 0x7f) ^ 0x40) - 0x40;
134 *value = (*value << 7) | (*--p & 0x7f);
139 /* Return 0 if either encoding is variable width, or not yet known to bfd. */
142 int get_DW_EH_PE_width (int encoding, int ptr_size)
144 /* DW_EH_PE_ values of 0x60 and 0x70 weren't defined at the time .eh_frame
146 if ((encoding & 0x60) == 0x60)
149 switch (encoding & 7)
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;
162 #define get_DW_EH_PE_signed(encoding) (((encoding) & DW_EH_PE_signed) != 0)
164 /* Read a width sized value from memory. */
167 read_value (bfd *abfd, bfd_byte *buf, int width, int is_signed)
175 value = bfd_get_signed_16 (abfd, buf);
177 value = bfd_get_16 (abfd, buf);
181 value = bfd_get_signed_32 (abfd, buf);
183 value = bfd_get_32 (abfd, buf);
187 value = bfd_get_signed_64 (abfd, buf);
189 value = bfd_get_64 (abfd, buf);
199 /* Store a width sized value to memory. */
202 write_value (bfd *abfd, bfd_byte *buf, bfd_vma value, int width)
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 ();
213 /* Return one if C1 and C2 CIEs can be merged. */
216 cie_eq (const void *e1, const void *e2)
218 const struct cie *c1 = e1;
219 const struct cie *c2 = e2;
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)
247 cie_hash (const void *e)
249 const struct cie *c = e;
254 cie_compute_hash (struct cie *c)
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);
275 /* Return the number of extra bytes that we'll be inserting into
276 ENTRY's augmentation string. */
278 static INLINE unsigned int
279 extra_augmentation_string_bytes (struct eh_cie_fde *entry)
281 unsigned int size = 0;
284 if (entry->add_augmentation_size)
286 if (entry->add_fde_encoding)
292 /* Likewise ENTRY's augmentation data. */
294 static INLINE unsigned int
295 extra_augmentation_data_bytes (struct eh_cie_fde *entry)
297 unsigned int size = 0;
300 if (entry->add_augmentation_size)
302 if (entry->add_fde_encoding)
307 if (entry->u.fde.cie_inf->add_augmentation_size)
313 /* Return the size that ENTRY will have in the output. ALIGNMENT is the
314 required alignment of ENTRY in bytes. */
317 size_of_output_cie_fde (struct eh_cie_fde *entry, unsigned int alignment)
321 if (entry->size == 4)
324 + extra_augmentation_string_bytes (entry)
325 + extra_augmentation_data_bytes (entry)
326 + alignment - 1) & -alignment;
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. */
334 skip_cfa_op (bfd_byte **iter, bfd_byte *end, unsigned int encoded_ptr_width)
339 if (!read_byte (iter, end, &op))
342 switch (op & 0xc0 ? op & 0xc0 : op)
345 case DW_CFA_advance_loc:
347 case DW_CFA_remember_state:
348 case DW_CFA_restore_state:
349 case DW_CFA_GNU_window_save:
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);
364 case DW_CFA_val_offset:
365 case DW_CFA_val_offset_sf:
366 case DW_CFA_offset_extended:
367 case DW_CFA_register:
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));
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));
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));
389 return skip_bytes (iter, end, encoded_ptr_width);
391 case DW_CFA_advance_loc1:
392 return skip_bytes (iter, end, 1);
394 case DW_CFA_advance_loc2:
395 return skip_bytes (iter, end, 2);
397 case DW_CFA_advance_loc4:
398 return skip_bytes (iter, end, 4);
400 case DW_CFA_MIPS_advance_loc8:
401 return skip_bytes (iter, end, 8);
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. */
414 skip_non_nops (bfd_byte *buf, bfd_byte *end, unsigned int encoded_ptr_width,
415 unsigned int *set_loc_count)
421 if (*buf == DW_CFA_nop)
425 if (*buf == DW_CFA_set_loc)
427 if (!skip_cfa_op (&buf, end, encoded_ptr_width))
434 /* Called before calling _bfd_elf_parse_eh_frame on every input bfd's
435 .eh_frame section. */
438 _bfd_elf_begin_eh_frame_parsing (struct bfd_link_info *info)
440 struct eh_frame_hdr_info *hdr_info;
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);
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. */
452 _bfd_elf_parse_eh_frame (bfd *abfd, struct bfd_link_info *info,
453 asection *sec, struct elf_reloc_cookie *cookie)
455 #define REQUIRE(COND) \
458 goto free_no_table; \
461 bfd_byte *ehbuf = NULL, *buf, *end;
463 struct eh_cie_fde *this_inf;
464 unsigned int hdr_length, hdr_id;
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;
479 htab = elf_hash_table (info);
480 hdr_info = &htab->eh_info;
481 if (hdr_info->parsed_eh_frames)
486 /* This file does not contain .eh_frame information. */
490 if (bfd_is_abs_section (sec->output_section))
492 /* At least one of the sections is being discarded from the
493 link, so we should just ignore them. */
497 /* Read the frame unwind information from abfd. */
499 REQUIRE (bfd_malloc_and_get_section (abfd, sec, &ehbuf));
502 && bfd_get_32 (abfd, ehbuf) == 0
503 && cookie->rel == cookie->relend)
505 /* Empty .eh_frame section. */
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);
514 ptr_size = (get_elf_backend_data (abfd)
515 ->elf_backend_eh_frame_address_size (abfd, sec));
516 REQUIRE (ptr_size != 0);
518 /* Go through the section contents and work out how many FDEs and
521 end = ehbuf + sec->size;
528 /* Read the length of the entry. */
529 REQUIRE (skip_bytes (&buf, end, 4));
530 hdr_length = bfd_get_32 (abfd, buf - 4);
532 /* 64-bit .eh_frame is not supported. */
533 REQUIRE (hdr_length != 0xffffffff);
537 REQUIRE (skip_bytes (&buf, end, 4));
538 hdr_id = bfd_get_32 (abfd, buf - 4);
542 REQUIRE (skip_bytes (&buf, end, hdr_length - 4));
545 sec_info = bfd_zmalloc (sizeof (struct eh_frame_sec_info)
546 + (num_entries - 1) * sizeof (struct eh_cie_fde));
549 ecies = bfd_zmalloc (num_cies * sizeof (*ecies));
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)
556 local_cies = bfd_zmalloc (num_cies * sizeof (*local_cies));
557 REQUIRE (local_cies);
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))
566 #define SKIP_RELOCS(buf) \
567 while (cookie->rel < cookie->relend \
568 && (cookie->rel->r_offset \
569 < (bfd_size_type) ((buf) - ehbuf))) \
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)
580 while ((bfd_size_type) (buf - ehbuf) != sec->size)
583 bfd_byte *start, *insns, *insns_end;
584 bfd_size_type length;
585 unsigned int set_loc_count;
587 this_inf = sec_info->entry + sec_info->count;
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);
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;
598 this_inf->offset = last_fde - ehbuf;
599 this_inf->size = 4 + hdr_length;
600 this_inf->reloc_index = cookie->rel - cookie->rels;
604 /* A zero-length CIE should only be found at the end of
606 REQUIRE ((bfd_size_type) (buf - ehbuf) == sec->size);
607 ENSURE_NO_RELOCS (buf);
612 REQUIRE (skip_bytes (&buf, end, 4));
613 hdr_id = bfd_get_32 (abfd, buf - 4);
617 unsigned int initial_insn_length;
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. */
626 cie = local_cies + ecie_count;
630 memset (cie, 0, sizeof (*cie));
632 cie->cie_inf = this_inf;
633 cie->length = hdr_length;
634 cie->output_sec = sec->output_section;
636 REQUIRE (read_byte (&buf, end, &cie->version));
638 /* Cannot handle unknown versions. */
639 REQUIRE (cie->version == 1 || cie->version == 3);
640 REQUIRE (strlen ((char *) buf) < sizeof (cie->augmentation));
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')
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.
651 REQUIRE (skip_bytes (&buf, end, ptr_size));
654 REQUIRE (read_uleb128 (&buf, end, &cie->code_align));
655 REQUIRE (read_sleb128 (&buf, end, &cie->data_align));
656 if (cie->version == 1)
659 cie->ra_column = *buf++;
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')
673 REQUIRE (read_uleb128 (&buf, end, &cie->augmentation_size));
674 ENSURE_NO_RELOCS (buf);
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));
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));
696 REQUIRE (read_byte (&buf, end, &cie->per_encoding));
697 per_width = get_DW_EH_PE_width (cie->per_encoding,
700 if ((cie->per_encoding & 0xf0) == DW_EH_PE_aligned)
702 length = -(buf - ehbuf) & (per_width - 1);
703 REQUIRE (skip_bytes (&buf, end, length));
705 ENSURE_NO_RELOCS (buf);
706 /* Ensure we have a reloc here. */
707 if (GET_RELOC (buf) != NULL)
709 unsigned long r_symndx;
712 if (elf_elfheader (abfd)->e_ident[EI_CLASS]
714 r_symndx = ELF64_R_SYM (cookie->rel->r_info);
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)
722 struct elf_link_hash_entry *h;
724 r_symndx -= cookie->extsymoff;
725 h = cookie->sym_hashes[r_symndx];
727 while (h->root.type == bfd_link_hash_indirect
728 || h->root.type == bfd_link_hash_warning)
729 h = (struct elf_link_hash_entry *)
732 cie->personality.h = h;
736 Elf_Internal_Sym *sym;
740 sym = &cookie->locsyms[r_symndx];
741 sym_sec = (bfd_section_from_elf_index
742 (abfd, sym->st_shndx));
745 if (sym_sec->kept_section != NULL)
746 sym_sec = sym_sec->kept_section;
747 if (sym_sec->output_section != NULL)
750 + sym_sec->output_offset
751 + sym_sec->output_section->vma);
752 cie->personality.val = val;
753 cie->local_personality = 1;
758 /* Cope with MIPS-style composite relocations. */
761 while (GET_RELOC (buf) != NULL);
763 REQUIRE (skip_bytes (&buf, end, per_width));
764 REQUIRE (cie->local_personality || cie->personality.h);
768 /* Unrecognized augmentation. Better bail out. */
773 /* For shared libraries, try to get rid of as many RELATIVE relocs
776 && (get_elf_backend_data (abfd)
777 ->elf_backend_can_make_relative_eh_frame
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)
788 if (*cie->augmentation == 0)
789 this_inf->add_augmentation_size = 1;
790 this_inf->add_fde_encoding = 1;
791 cie->make_relative = 1;
796 && (get_elf_backend_data (abfd)
797 ->elf_backend_can_make_lsda_relative_eh_frame
799 && (cie->lsda_encoding & 0xf0) == DW_EH_PE_absptr)
800 cie->make_lsda_relative = 1;
802 /* If FDE encoding was not specified, it defaults to
804 if (cie->fde_encoding == DW_EH_PE_omit)
805 cie->fde_encoding = DW_EH_PE_absptr;
807 initial_insn_length = end - buf;
808 if (initial_insn_length <= sizeof (cie->initial_instructions))
810 cie->initial_insn_length = initial_insn_length;
811 memcpy (cie->initial_instructions, buf, initial_insn_length);
814 buf += initial_insn_length;
815 ENSURE_NO_RELOCS (buf);
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;
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)
830 /* Ensure this FDE references one of the CIEs in this input
832 REQUIRE (ecie != ecies + ecie_count);
834 this_inf->u.fde.cie_inf = ecie->local_cie;
836 ENSURE_NO_RELOCS (buf);
837 REQUIRE (GET_RELOC (buf));
839 /* Skip the initial location and address range. */
841 length = get_DW_EH_PE_width (cie->fde_encoding, ptr_size);
842 REQUIRE (skip_bytes (&buf, end, 2 * length));
844 /* Skip the augmentation size, if present. */
845 if (cie->augmentation[0] == 'z')
846 REQUIRE (read_uleb128 (&buf, end, &length));
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)
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')
862 /* Skip over the augmentation data. */
863 REQUIRE (skip_bytes (&buf, end, length));
866 buf = last_fde + 4 + hdr_length;
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);
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
881 || (set_loc_count && this_inf->cie))
883 this_inf->size -= end - insns_end;
884 if (insns_end != end && this_inf->cie)
886 cie->initial_insn_length -= end - insns_end;
887 cie->length -= end - insns_end;
890 && ((cie->fde_encoding & 0xf0) == DW_EH_PE_pcrel
891 || cie->make_relative))
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;
904 if (*p == DW_CFA_set_loc)
905 this_inf->set_loc[++cnt] = p + 1 - start;
906 REQUIRE (skip_cfa_op (&p, end, length));
910 this_inf->removed = 1;
911 this_inf->fde_encoding = cie->fde_encoding;
912 this_inf->lsda_encoding = cie->lsda_encoding;
915 /* We have now finished constructing the struct cie. */
916 if (hdr_info->cies != NULL)
918 /* See if we can merge this CIE with an earlier one. */
921 cie_compute_hash (cie);
922 loc = htab_find_slot_with_hash (hdr_info->cies, cie,
925 if (*loc == HTAB_EMPTY_ENTRY)
927 *loc = malloc (sizeof (struct cie));
929 memcpy (*loc, cie, sizeof (struct cie));
931 cie = (struct cie *) *loc;
933 this_inf->u.cie.merged = cie->cie_inf;
934 ecies[ecie_count].cie = cie;
935 ecies[ecie_count++].local_cie = this_inf;
939 BFD_ASSERT (sec_info->count == num_entries);
940 BFD_ASSERT (ecie_count == num_cies);
942 elf_section_data (sec)->sec_info = sec_info;
943 sec->sec_info_type = ELF_INFO_TYPE_EH_FRAME;
947 (*info->callbacks->einfo)
948 (_("%P: error in %B(%A); no .eh_frame_hdr table will be created.\n"),
950 hdr_info->table = FALSE;
963 /* Finish a pass over all .eh_frame sections. */
966 _bfd_elf_end_eh_frame_parsing (struct bfd_link_info *info)
968 struct eh_frame_hdr_info *hdr_info;
970 hdr_info = &elf_hash_table (info)->eh_info;
971 if (hdr_info->cies != NULL)
973 htab_delete (hdr_info->cies);
974 hdr_info->cies = NULL;
976 hdr_info->parsed_eh_frames = TRUE;
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
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)
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;
995 sec_info = (struct eh_frame_sec_info *) elf_section_data (sec)->sec_info;
996 if (sec_info == NULL)
999 hdr_info = &elf_hash_table (info)->eh_info;
1000 for (ent = sec_info->entry; ent < sec_info->entry + sec_info->count; ++ent)
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))
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))
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);
1023 hdr_info->fde_count++;
1025 cie = ent->u.fde.cie_inf;
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;
1038 /* Make the local CIE represent the merged group. */
1039 merged->u.cie.merged = cie;
1046 ptr_size = (get_elf_backend_data (sec->owner)
1047 ->elf_backend_eh_frame_address_size (sec->owner, sec));
1049 for (ent = sec_info->entry; ent < sec_info->entry + sec_info->count; ++ent)
1052 ent->new_offset = offset;
1053 offset += size_of_output_cie_fde (ent, ptr_size);
1056 sec->rawsize = sec->size;
1058 return offset != sec->rawsize;
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. */
1066 _bfd_elf_discard_section_eh_frame_hdr (bfd *abfd, struct bfd_link_info *info)
1068 struct elf_link_hash_table *htab;
1069 struct eh_frame_hdr_info *hdr_info;
1072 htab = elf_hash_table (info);
1073 hdr_info = &htab->eh_info;
1075 sec = hdr_info->hdr_sec;
1079 sec->size = EH_FRAME_HDR_SIZE;
1080 if (hdr_info->table)
1081 sec->size += 4 + hdr_info->fde_count * 8;
1083 elf_tdata (abfd)->eh_frame_hdr = sec;
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. */
1093 _bfd_elf_maybe_strip_eh_frame_hdr (struct bfd_link_info *info)
1097 struct elf_link_hash_table *htab;
1098 struct eh_frame_hdr_info *hdr_info;
1100 htab = elf_hash_table (info);
1101 hdr_info = &htab->eh_info;
1102 if (hdr_info->hdr_sec == NULL)
1105 if (bfd_is_abs_section (hdr_info->hdr_sec->output_section))
1107 hdr_info->hdr_sec = NULL;
1112 if (info->eh_frame_hdr)
1113 for (abfd = info->input_bfds; abfd != NULL; abfd = abfd->link_next)
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))
1124 hdr_info->hdr_sec->flags |= SEC_EXCLUDE;
1125 hdr_info->hdr_sec = NULL;
1129 hdr_info->table = TRUE;
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. */
1139 _bfd_elf_eh_frame_section_offset (bfd *output_bfd ATTRIBUTE_UNUSED,
1140 struct bfd_link_info *info,
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;
1149 if (sec->sec_info_type != ELF_INFO_TYPE_EH_FRAME)
1151 sec_info = elf_section_data (sec)->sec_info;
1153 if (offset >= sec->rawsize)
1154 return offset - sec->rawsize + sec->size;
1156 htab = elf_hash_table (info);
1157 hdr_info = &htab->eh_info;
1158 if (hdr_info->offsets_adjusted)
1159 offset += sec->output_offset;
1162 hi = sec_info->count;
1166 mid = (lo + hi) / 2;
1167 if (offset < sec_info->entry[mid].offset)
1170 >= sec_info->entry[mid].offset + sec_info->entry[mid].size)
1176 BFD_ASSERT (lo < hi);
1178 /* FDE or CIE was removed. */
1179 if (sec_info->entry[mid].removed)
1180 return (bfd_vma) -1;
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;
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))
1198 sec_info->entry[mid].u.fde.cie_inf->need_lsda_relative = 1;
1199 return (bfd_vma) -2;
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]))
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;
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));
1228 /* Write out .eh_frame section. This is called with the relocated
1232 _bfd_elf_write_section_eh_frame (bfd *abfd,
1233 struct bfd_link_info *info,
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;
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);
1247 ptr_size = (get_elf_backend_data (abfd)
1248 ->elf_backend_eh_frame_address_size (abfd, sec));
1249 BFD_ASSERT (ptr_size != 0);
1251 sec_info = elf_section_data (sec)->sec_info;
1252 htab = elf_hash_table (info);
1253 hdr_info = &htab->eh_info;
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)
1265 struct eh_frame_sec_info *eh_inf;
1267 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
1269 if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
1270 || (ibfd->flags & DYNAMIC) != 0)
1273 eh = bfd_get_section_by_name (ibfd, ".eh_frame");
1274 if (eh == NULL || eh->sec_info_type != ELF_INFO_TYPE_EH_FRAME)
1277 eh_inf = elf_section_data (eh)->sec_info;
1278 for (ent = eh_inf->entry; ent < eh_inf->entry + eh_inf->count; ++ent)
1280 ent->offset += eh->output_offset;
1281 ent->new_offset += eh->output_offset;
1284 hdr_info->offsets_adjusted = TRUE;
1287 if (hdr_info->table && hdr_info->array == NULL)
1289 = bfd_malloc (hdr_info->fde_count * sizeof(*hdr_info->array));
1290 if (hdr_info->array == NULL)
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
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);
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);
1308 for (ent = sec_info->entry; ent < sec_info->entry + sec_info->count; ++ent)
1310 unsigned char *buf, *end;
1311 unsigned int new_size;
1318 /* Any terminating FDE must be at the end of the section. */
1319 BFD_ASSERT (ent == sec_info->entry + sec_info->count - 1);
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);
1327 /* Update the size. It may be shrinked. */
1328 bfd_put_32 (abfd, new_size - 4, buf);
1330 /* Filling the extra bytes with DW_CFA_nops. */
1331 if (new_size != ent->size)
1332 memset (end, 0, new_size - ent->size);
1337 if (ent->make_relative
1338 || ent->need_lsda_relative
1339 || ent->per_encoding_relative)
1342 unsigned int action, extra_string, extra_data;
1343 unsigned int per_width, per_encoding;
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);
1353 /* Skip length, id and version. */
1356 buf += strlen (aug) + 1;
1357 skip_leb128 (&buf, end);
1358 skip_leb128 (&buf, end);
1359 skip_leb128 (&buf, end);
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;
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;
1374 if (ent->add_augmentation_size)
1377 *buf++ = extra_data - 1;
1379 if (ent->add_fde_encoding)
1381 BFD_ASSERT (action & 1);
1383 *buf++ = DW_EH_PE_pcrel;
1393 BFD_ASSERT (*buf == ent->lsda_encoding);
1394 *buf |= DW_EH_PE_pcrel;
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)
1407 + ((buf - contents + per_width - 1)
1408 & ~((bfd_size_type) per_width - 1)));
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);
1425 BFD_ASSERT (*buf == ent->fde_encoding);
1426 *buf |= DW_EH_PE_pcrel;
1441 bfd_vma value, address;
1444 struct eh_cie_fde *cie;
1447 cie = ent->u.fde.cie_inf;
1449 value = ent->new_offset + 4 - cie->new_offset;
1450 bfd_put_32 (abfd, value, buf);
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));
1458 switch (ent->fde_encoding & 0xf0)
1460 case DW_EH_PE_indirect:
1461 case DW_EH_PE_textrel:
1462 BFD_ASSERT (hdr_info == NULL);
1464 case DW_EH_PE_datarel:
1466 asection *got = bfd_get_section_by_name (abfd, ".got");
1468 BFD_ASSERT (got != NULL);
1469 address += got->vma;
1472 case DW_EH_PE_pcrel:
1473 value += ent->offset - ent->new_offset;
1474 address += sec->output_section->vma + ent->offset + 8;
1477 if (cie->make_relative)
1478 value -= sec->output_section->vma + ent->new_offset + 8;
1479 write_value (abfd, buf, value, width);
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;
1491 if ((ent->lsda_encoding & 0xf0) == DW_EH_PE_pcrel
1492 || cie->need_lsda_relative)
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));
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);
1508 else if (cie->add_augmentation_size)
1510 /* Skip the PC and length and insert a zero byte for the
1511 augmentation size. */
1513 memmove (buf + 1, buf, end - buf);
1519 /* Adjust DW_CFA_set_loc. */
1520 unsigned int cnt, width;
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);
1528 for (cnt = 1; cnt <= ent->set_loc[0]; cnt++)
1531 buf = start + ent->set_loc[cnt];
1533 value = read_value (abfd, buf, width,
1534 get_DW_EH_PE_signed (ent->fde_encoding));
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);
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)
1557 return bfd_set_section_contents (abfd, sec->output_section,
1558 contents, (file_ptr) sec->output_offset,
1562 /* Helper function used to sort .eh_frame_hdr search table by increasing
1563 VMA of FDE initial location. */
1566 vma_compare (const void *a, const void *b)
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)
1572 if (p->initial_loc < q->initial_loc)
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
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
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). */
1600 _bfd_elf_write_section_eh_frame_hdr (bfd *abfd, struct bfd_link_info *info)
1602 struct elf_link_hash_table *htab;
1603 struct eh_frame_hdr_info *hdr_info;
1606 asection *eh_frame_sec;
1609 bfd_vma encoded_eh_frame;
1611 htab = elf_hash_table (info);
1612 hdr_info = &htab->eh_info;
1613 sec = hdr_info->hdr_sec;
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)
1624 eh_frame_sec = bfd_get_section_by_name (abfd, ".eh_frame");
1625 if (eh_frame_sec == NULL)
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. */
1637 if (hdr_info->array && hdr_info->array_count == hdr_info->fde_count)
1639 contents[2] = DW_EH_PE_udata4; /* FDE count encoding. */
1640 contents[3] = DW_EH_PE_datarel | DW_EH_PE_sdata4; /* Search table enc. */
1644 contents[2] = DW_EH_PE_omit;
1645 contents[3] = DW_EH_PE_omit;
1647 bfd_put_32 (abfd, encoded_eh_frame, contents + 4);
1649 if (contents[2] != DW_EH_PE_omit)
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),
1656 for (i = 0; i < hdr_info->fde_count; i++)
1659 hdr_info->array[i].initial_loc
1660 - sec->output_section->vma,
1661 contents + EH_FRAME_HDR_SIZE + i * 8 + 4);
1663 hdr_info->array[i].fde - sec->output_section->vma,
1664 contents + EH_FRAME_HDR_SIZE + i * 8 + 8);
1668 retval = bfd_set_section_contents (abfd, sec->output_section,
1669 contents, (file_ptr) sec->output_offset,
1675 /* Return the width of FDE addresses. This is the default implementation. */
1678 _bfd_elf_eh_frame_address_size (bfd *abfd, asection *sec ATTRIBUTE_UNUSED)
1680 return elf_elfheader (abfd)->e_ident[EI_CLASS] == ELFCLASS64 ? 8 : 4;
1683 /* Decide whether we can use a PC-relative encoding within the given
1684 EH frame section. This is the default implementation. */
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)
1694 /* Select an encoding for the given address. Preference is given to
1695 PC-relative addressing modes. */
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,
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;