summaryrefslogtreecommitdiff
path: root/bfd/elf-eh-frame.c
diff options
context:
space:
mode:
authorAlan Modra <amodra@bigpond.net.au>2007-05-10 15:08:02 +0000
committerAlan Modra <amodra@bigpond.net.au>2007-05-10 15:08:02 +0000
commit87b8235d9d971af3618b20b53aa96f5b770f43b4 (patch)
tree9edf341e5088587bc048dd231420a8fb3e130246 /bfd/elf-eh-frame.c
parent5cc8acf8853cebc138a95131d7d6728b385201c3 (diff)
downloadbinutils-redhat-87b8235d9d971af3618b20b53aa96f5b770f43b4.tar.gz
PR 4454
* elf-eh-frame.c (struct cie): Make "personality" a bfd_vma. (_bfd_elf_discard_section_eh_frame): Handle local syms on personality relocation.
Diffstat (limited to 'bfd/elf-eh-frame.c')
-rw-r--r--bfd/elf-eh-frame.c31
1 files changed, 29 insertions, 2 deletions
diff --git a/bfd/elf-eh-frame.c b/bfd/elf-eh-frame.c
index 63640f1baf..ae07f374a8 100644
--- a/bfd/elf-eh-frame.c
+++ b/bfd/elf-eh-frame.c
@@ -37,7 +37,7 @@ struct cie
bfd_signed_vma data_align;
bfd_vma ra_column;
bfd_vma augmentation_size;
- struct elf_link_hash_entry *personality;
+ bfd_vma personality;
asection *output_sec;
struct eh_cie_fde *cie_inf;
unsigned char per_encoding;
@@ -675,6 +675,7 @@ _bfd_elf_discard_section_eh_frame
if (GET_RELOC (buf) != NULL)
{
unsigned long r_symndx;
+ asection *sym_sec = NULL;
#ifdef BFD64
if (ptr_size == 8)
@@ -694,8 +695,34 @@ _bfd_elf_discard_section_eh_frame
h = (struct elf_link_hash_entry *)
h->root.u.i.link;
- cie->personality = h;
+ if (h->root.type == bfd_link_hash_defined
+ || h->root.type == bfd_link_hash_defweak)
+ {
+ cie->personality = h->root.u.def.value;
+ sym_sec = h->root.u.def.section;
+ }
}
+ else
+ {
+ Elf_Internal_Shdr *symtab_hdr;
+ Elf_Internal_Sym *sym;
+
+ symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
+ sym = bfd_elf_get_elf_syms (abfd, symtab_hdr,
+ 1, r_symndx,
+ NULL, NULL, NULL);
+ if (sym != NULL)
+ {
+ cie->personality = sym->st_value;
+ sym_sec = (bfd_section_from_elf_index
+ (abfd, sym->st_shndx));
+ free (sym);
+ }
+ }
+ if (sym_sec != NULL)
+ cie->personality += (sym_sec->output_section->vma
+ + sym_sec->output_offset);
+
/* Cope with MIPS-style composite relocations. */
do
cookie->rel++;