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.
This commit is contained in:
parent
9b90d8fd50
commit
6db7e006e4
|
@ -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.
|
||||
|
|
|
@ -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 \
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue