From: Alan Modra Date: Wed, 30 Apr 2014 00:41:56 +0000 (+0930) Subject: Don't use vma to identify eh_frame personality function X-Git-Tag: gdb-7.8-release~448 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=5087d529319fc6d5985032183c138dd715d707b3;p=external%2Fbinutils.git Don't use vma to identify eh_frame personality function This is all we should need to be able to run the eh_frame parts of bfd_elf_discard_info before bfd_elf_size_dynamic_sections * elf-eh-frame.c (struct cie.personality): Replace val with sym. (find_merged_cie): Identify personality functions by (bfd_id,index) pair when a local sym is used. --- diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 5eb59d3..4a4d3cf 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,9 @@ +2014-04-30 Alan Modra + + * elf-eh-frame.c (struct cie.personality): Replace val with sym. + (find_merged_cie): Identify personality functions by (bfd_id,index) + pair when a local sym is used. + 2014-04-29 Christian Svensson * elf32-or1k.c: Fix a bug where non-TLS relocations would be forced diff --git a/bfd/elf-eh-frame.c b/bfd/elf-eh-frame.c index 8c3712f..0f0a563 100644 --- a/bfd/elf-eh-frame.c +++ b/bfd/elf-eh-frame.c @@ -40,7 +40,10 @@ struct cie bfd_vma augmentation_size; union { struct elf_link_hash_entry *h; - bfd_vma val; + struct { + unsigned int bfd_id; + unsigned int index; + } sym; unsigned int reloc_index; } personality; asection *output_sec; @@ -1030,8 +1033,12 @@ find_merged_cie (bfd *abfd, struct bfd_link_info *info, asection *sec, { bfd_boolean per_binds_local; - /* Work out the address of personality routine, either as an absolute - value or as a symbol. */ + /* Work out the address of personality routine, or at least + enough info that we could calculate the address had we made a + final section layout. The symbol on the reloc is enough, + either the hash for a global, or (bfd id, index) pair for a + local. The assumption here is that no one uses addends on + the reloc. */ rel = cookie->rels + cie->personality.reloc_index; memset (&cie->personality, 0, sizeof (cie->personality)); #ifdef BFD64 @@ -1071,9 +1078,8 @@ find_merged_cie (bfd *abfd, struct bfd_link_info *info, asection *sec, return cie_inf; cie->local_personality = 1; - cie->personality.val = (sym->st_value - + sym_sec->output_offset - + sym_sec->output_section->vma); + cie->personality.sym.bfd_id = abfd->id; + cie->personality.sym.index = r_symndx; per_binds_local = TRUE; }