Don't use vma to identify eh_frame personality function
authorAlan Modra <amodra@gmail.com>
Wed, 30 Apr 2014 00:41:56 +0000 (10:11 +0930)
committerAlan Modra <amodra@gmail.com>
Wed, 30 Apr 2014 00:41:56 +0000 (10:11 +0930)
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.

bfd/ChangeLog
bfd/elf-eh-frame.c

index 5eb59d3..4a4d3cf 100644 (file)
@@ -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
index 8c3712f..0f0a563 100644 (file)
@@ -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;
        }