diff options
author | Alan Modra <amodra@gmail.com> | 2007-05-10 15:08:02 +0000 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2007-05-10 15:08:02 +0000 |
commit | ef8c95ad21ce77af37eb10fc918dfe6ae3116231 (patch) | |
tree | da50ff93df63ad3fbfb3c46bd7ba40fffe1b7210 /bfd/elf-eh-frame.c | |
parent | 8c252fd9c3e28b18ce8982d1c798ea569969a0a4 (diff) | |
download | gdb-ef8c95ad21ce77af37eb10fc918dfe6ae3116231.zip gdb-ef8c95ad21ce77af37eb10fc918dfe6ae3116231.tar.gz gdb-ef8c95ad21ce77af37eb10fc918dfe6ae3116231.tar.bz2 |
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.c | 31 |
1 files changed, 29 insertions, 2 deletions
diff --git a/bfd/elf-eh-frame.c b/bfd/elf-eh-frame.c index 63640f1..ae07f37 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++; |