From 6db7e006e4767a0edcf6f4f7ebf80ea0e35a68c2 Mon Sep 17 00:00:00 2001 From: "Maciej W. Rozycki" Date: Tue, 16 Jun 2009 02:23:09 +0000 Subject: [PATCH] bfd/ * elf32-vax.c (elf_vax_plt_sym_val): New function. (elf_backend_plt_sym_val): Define. opcodes/ * vax-dis.c (is_function_entry): Return success for synthetic symbols too. (is_plt_tail): New function. (print_insn_vax): Decode PLT entry offset longword. --- bfd/ChangeLog | 5 +++++ bfd/elf32-vax.c | 10 ++++++++++ opcodes/ChangeLog | 7 +++++++ opcodes/vax-dis.c | 45 ++++++++++++++++++++++++++++++++++++++------- 4 files changed, 60 insertions(+), 7 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 1bc2789189..b0f4726be5 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,8 @@ +2009-06-16 Maciej W. Rozycki + + * elf32-vax.c (elf_vax_plt_sym_val): New function. + (elf_backend_plt_sym_val): Define. + 2009-06-16 Maciej W. Rozycki * elf32-vax.c (elf_vax_reloc_type_class): New function. diff --git a/bfd/elf32-vax.c b/bfd/elf32-vax.c index f0ab1efd14..ef5ceb4c50 100644 --- a/bfd/elf32-vax.c +++ b/bfd/elf32-vax.c @@ -47,6 +47,8 @@ static bfd_boolean elf_vax_finish_dynamic_symbol (bfd *, struct bfd_link_info *, Elf_Internal_Sym *); static bfd_boolean elf_vax_finish_dynamic_sections (bfd *, struct bfd_link_info *); +static bfd_vma elf_vax_plt_sym_val (bfd_vma, const asection *, + const arelent *); static bfd_boolean elf32_vax_set_private_flags (bfd *, flagword); static bfd_boolean elf32_vax_merge_private_bfd_data (bfd *, bfd *); @@ -2091,6 +2093,13 @@ elf_vax_reloc_type_class (const Elf_Internal_Rela *rela) } } +static bfd_vma +elf_vax_plt_sym_val (bfd_vma i, const asection *plt, + const arelent *rel ATTRIBUTE_UNUSED) +{ + return plt->vma + (i + 1) * PLT_ENTRY_SIZE; +} + #define TARGET_LITTLE_SYM bfd_elf32_vax_vec #define TARGET_LITTLE_NAME "elf32-vax" #define ELF_MACHINE_CODE EM_VAX @@ -2116,6 +2125,7 @@ elf_vax_reloc_type_class (const Elf_Internal_Rela *rela) #define elf_backend_reloc_type_class elf_vax_reloc_type_class #define elf_backend_gc_mark_hook elf_vax_gc_mark_hook #define elf_backend_gc_sweep_hook elf_vax_gc_sweep_hook +#define elf_backend_plt_sym_val elf_vax_plt_sym_val #define bfd_elf32_bfd_merge_private_bfd_data \ elf32_vax_merge_private_bfd_data #define bfd_elf32_bfd_set_private_flags \ diff --git a/opcodes/ChangeLog b/opcodes/ChangeLog index 05966313ad..156a82a0d2 100644 --- a/opcodes/ChangeLog +++ b/opcodes/ChangeLog @@ -1,3 +1,10 @@ +2009-06-16 Maciej W. Rozycki + + * vax-dis.c (is_function_entry): Return success for synthetic + symbols too. + (is_plt_tail): New function. + (print_insn_vax): Decode PLT entry offset longword. + 2009-06-15 Nick Clifton PR 10186 diff --git a/opcodes/vax-dis.c b/opcodes/vax-dis.c index 8c474372db..63884f6b15 100644 --- a/opcodes/vax-dis.c +++ b/opcodes/vax-dis.c @@ -171,21 +171,24 @@ free_entry_array (void) } } #endif -/* Check if the given address is a known function entry. Either there must - be a symbol of function type at this address, or the address must be - a forced entry point. The later helps in disassembling ROM images, because - there's no symbol table at all. Forced entry points can be given by - supplying several -M options to objdump: -M entry:0xffbb7730. */ +/* Check if the given address is a known function entry point. This is + the case if there is a symbol of the function type at this address. + We also check for synthetic symbols as these are used for PLT entries + (weak undefined symbols may not have the function type set). Finally + the address may have been forced to be treated as an entry point. The + latter helps in disassembling ROM images, because there's no symbol + table at all. Forced entry points can be given by supplying several + -M options to objdump: -M entry:0xffbb7730. */ static bfd_boolean is_function_entry (struct disassemble_info *info, bfd_vma addr) { unsigned int i; - /* Check if there's a BSF_FUNCTION symbol at our address. */ + /* Check if there's a function or PLT symbol at our address. */ if (info->symbols && info->symbols[0] - && (info->symbols[0]->flags & BSF_FUNCTION) + && (info->symbols[0]->flags & (BSF_FUNCTION | BSF_SYNTHETIC)) && addr == bfd_asymbol_value (info->symbols[0])) return TRUE; @@ -197,6 +200,22 @@ is_function_entry (struct disassemble_info *info, bfd_vma addr) return FALSE; } +/* Check if the given address is the last longword of a PLT entry. + This longword is data and depending on the value it may interfere + with disassembly of further PLT entries. We make use of the fact + PLT symbols are marked BSF_SYNTHETIC. */ +static bfd_boolean +is_plt_tail (struct disassemble_info *info, bfd_vma addr) +{ + if (info->symbols + && info->symbols[0] + && (info->symbols[0]->flags & BSF_SYNTHETIC) + && addr == bfd_asymbol_value (info->symbols[0]) + 8) + return TRUE; + + return FALSE; +} + static int print_insn_mode (const char *d, int size, @@ -412,6 +431,18 @@ print_insn_vax (bfd_vma memaddr, disassemble_info *info) return 2; } + /* Decode PLT entry offset longword. */ + if (is_plt_tail (info, memaddr)) + { + int offset; + + FETCH_DATA (info, buffer + 4); + offset = buffer[3] << 24 | buffer[2] << 16 | buffer[1] << 8 | buffer[0]; + (*info->fprintf_func) (info->stream, ".long 0x%08x", offset); + + return 4; + } + for (votp = &votstrs[0]; votp->name[0]; votp++) { vax_opcodeT opcode = votp->detail.code; -- 2.34.1