diff options
-rw-r--r-- | bfd/ChangeLog | 6 | ||||
-rw-r--r-- | bfd/elf-eh-frame.c | 18 |
2 files changed, 18 insertions, 6 deletions
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 <amodra@gmail.com> + + * 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 <blue@cmd.nu> * 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; } |