* 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.
This commit is contained in:
Maciej W. Rozycki 2009-06-16 02:23:09 +00:00
parent 9b90d8fd50
commit 6db7e006e4
4 changed files with 60 additions and 7 deletions

View 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.

View 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 \

View 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

View 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;