bfd/
authorMaciej W. Rozycki <macro@linux-mips.org>
Tue, 16 Jun 2009 02:23:09 +0000 (02:23 +0000)
committerMaciej W. Rozycki <macro@linux-mips.org>
Tue, 16 Jun 2009 02:23:09 +0000 (02:23 +0000)
* 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
bfd/elf32-vax.c
opcodes/ChangeLog
opcodes/vax-dis.c

index 1bc27891890b1afe66aa100bbfa0a047e7a7b638..b0f4726be50ea26f69d23add39db598efb564359 100644 (file)
@@ -1,3 +1,8 @@
+2009-06-16  Maciej W. Rozycki  <macro@linux-mips.org>
+
+       * elf32-vax.c (elf_vax_plt_sym_val): New function.
+       (elf_backend_plt_sym_val): Define.
+
 2009-06-16  Maciej W. Rozycki  <macro@linux-mips.org>
 
        * elf32-vax.c (elf_vax_reloc_type_class): New function.
index f0ab1efd1499df0b2be0bd142792677586921698..ef5ceb4c501512c7c59168e039adf49b7a960e01 100644 (file)
@@ -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 \
index 05966313ada8cb3c189af85ea6a639e48c055df0..156a82a0d2959dd079c5365c2a1ee3edd454a160 100644 (file)
@@ -1,3 +1,10 @@
+2009-06-16  Maciej W. Rozycki  <macro@linux-mips.org>
+
+       * 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  <nickc@redhat.com>
 
        PR 10186
index 8c474372db4e6d0a1506cb1ff9668fef7265a26c..63884f6b158cf0603140f0b8b07f79f9e9d3dafe 100644 (file)
@@ -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;