summaryrefslogtreecommitdiff
path: root/bfd/elf64-ppc.c
diff options
context:
space:
mode:
authorAlan Modra <amodra@bigpond.net.au>2012-01-23 06:16:33 +0000
committerAlan Modra <amodra@bigpond.net.au>2012-01-23 06:16:33 +0000
commit67425d452a0beb38a742d6ab34417c494d86ab51 (patch)
tree76a0eab0ada05b36138285d1199d75f80ad94022 /bfd/elf64-ppc.c
parent58380e79166722082c4bb9d58ce6d0159eff8582 (diff)
downloadbinutils-redhat-67425d452a0beb38a742d6ab34417c494d86ab51.tar.gz
* elf-bfd.h: Formatting.
(struct elf_backend_data): Add "maybe_function_sym". (_bfd_elf_maybe_function_sym): Declare. * elfxx-target.h (elf_backend_maybe_function_sym): Define. (elfNN_bed): Init new field. * elf.c (elf_find_function): Use maybe_function_sym. (_bfd_elf_maybe_function_sym): New function. * elf64-ppc.c (elf_backend_maybe_function_sym): Define. (ppc64_elf_maybe_function_sym): New function.
Diffstat (limited to 'bfd/elf64-ppc.c')
-rw-r--r--bfd/elf64-ppc.c21
1 files changed, 20 insertions, 1 deletions
diff --git a/bfd/elf64-ppc.c b/bfd/elf64-ppc.c
index 7ffbe0e42c..a51115e01a 100644
--- a/bfd/elf64-ppc.c
+++ b/bfd/elf64-ppc.c
@@ -105,6 +105,7 @@ static bfd_vma opd_entry_value
#define elf_backend_gc_sweep_hook ppc64_elf_gc_sweep_hook
#define elf_backend_adjust_dynamic_symbol ppc64_elf_adjust_dynamic_symbol
#define elf_backend_hide_symbol ppc64_elf_hide_symbol
+#define elf_backend_maybe_function_sym ppc64_elf_maybe_function_sym
#define elf_backend_always_size_sections ppc64_elf_func_desc_adjust
#define elf_backend_size_dynamic_sections ppc64_elf_size_dynamic_sections
#define elf_backend_init_index_section _bfd_elf_init_2_index_sections
@@ -5528,7 +5529,8 @@ opd_entry_value (asection *opd_sec,
Elf_Internal_Rela *lo, *hi, *look;
bfd_vma val;
- /* No relocs implies we are linking a --just-symbols object. */
+ /* No relocs implies we are linking a --just-symbols object, or looking
+ at a final linked executable with addr2line or somesuch. */
if (opd_sec->reloc_count == 0)
{
char buf[8];
@@ -5631,6 +5633,23 @@ opd_entry_value (asection *opd_sec,
return val;
}
+/* Return TRUE iff the ELF symbol SYM might be a function. Set *CODE_SEC
+ and *CODE_OFF to the function's entry point. */
+
+static bfd_boolean
+ppc64_elf_maybe_function_sym (const elf_symbol_type *sym,
+ asection **code_sec, bfd_vma *code_off)
+{
+ if (_bfd_elf_maybe_function_sym (sym, code_sec, code_off))
+ {
+ if (strcmp (sym->symbol.section->name, ".opd") == 0)
+ opd_entry_value (sym->symbol.section, sym->symbol.value,
+ code_sec, code_off);
+ return TRUE;
+ }
+ return FALSE;
+}
+
/* Return true if symbol is defined in a regular object file. */
static bfd_boolean