Apply Thoams de Lellis's patch to fic disassembly of Thumb instructions when

bounded by non-function labels.
This commit is contained in:
Nick Clifton 2000-01-27 20:05:32 +00:00
parent fa3061313c
commit 2f0ca46a49
8 changed files with 80 additions and 33 deletions

View file

@ -1,3 +1,10 @@
2000-01-27 Thomas de Lellis <tdel@wrs.com>
* elf32-arm.h (elf32_arm_get_symbol_type): If a symbol has the
STT_ARM_16BIT flag set, but it is not attached to a data object
return STT_ARM_16BIT so that it will be treated as code by the
disassembler.
2000-01-27 Alan Modra <alan@spri.levels.unisa.edu.au>
* coff-i386.c (i3coff_object_p): Remove prototype.

View file

@ -714,7 +714,7 @@ bfd_elf32_arm_process_before_allocation (abfd, link_info, no_pipeline_knowledge)
{
case R_ARM_PC24:
/* This one is a call from arm code. We need to look up
the target of the call. If it is a thumb target, we
the target of the call. If it is a thumb target, we
insert glue. */
if (ELF_ST_TYPE(h->type) == STT_ARM_TFUNC)
@ -723,7 +723,7 @@ bfd_elf32_arm_process_before_allocation (abfd, link_info, no_pipeline_knowledge)
case R_ARM_THM_PC22:
/* This one is a call from thumb code. We look
up the target of the call. If it is not a thumb
up the target of the call. If it is not a thumb
target, we insert glue. */
if (ELF_ST_TYPE (h->type) != STT_ARM_TFUNC)
@ -737,6 +737,7 @@ bfd_elf32_arm_process_before_allocation (abfd, link_info, no_pipeline_knowledge)
}
return true;
error_return:
if (free_relocs != NULL)
free (free_relocs);
@ -744,8 +745,8 @@ error_return:
free (free_contents);
if (free_extsyms != NULL)
free (free_extsyms);
return false;
}
/* The thumb form of a long branch is a bit finicky, because the offset
@ -2103,10 +2104,22 @@ elf32_arm_get_symbol_type (elf_sym, type)
Elf_Internal_Sym * elf_sym;
int type;
{
if (ELF_ST_TYPE (elf_sym->st_info) == STT_ARM_TFUNC)
return ELF_ST_TYPE (elf_sym->st_info);
else
return type;
switch (ELF_ST_TYPE (elf_sym->st_info))
{
case STT_ARM_TFUNC:
return ELF_ST_TYPE (elf_sym->st_info);
break;
case STT_ARM_16BIT:
/* If the symbol is not an object, return the STT_ARM_16BIT flag.
This allows us to distinguish between data used by Thumb instructions
and non-data (which is probably code) inside Thumb regions of an
executable. */
if (type != STT_OBJECT)
return ELF_ST_TYPE (elf_sym->st_info);
break;
}
return type;
}
static asection *

View file

@ -1,3 +1,10 @@
2000-01-27 Thomas de Lellis <tdel@windriver.com>
* config/tc-arm.c (armadjust_symtab): If the assembler is in
Thumb mode but the label seen was not declared as '.thumb_func'
then set the ST_INFO type to STT_ARM_16BIT mode. This allows
correct disassembly of Thumb code bounded by non function labels.
2000-01-27 Alan Modra <alan@spri.levels.unisa.edu.au>
* Makefile.am (MULTI_CFILES): Add config/e-i386aout.c

View file

@ -6888,12 +6888,14 @@ arm_adjust_symtab ()
{
if (ARM_IS_THUMB (sym))
{
elf_sym = elf_symbol (symbol_get_bfdsym (sym));
bind = ELF_ST_BIND (elf_sym);
/* If it's a .thumb_func, declare it as so, else tag label as .code 16. */
if (THUMB_IS_FUNC (sym))
{
elf_sym = elf_symbol (symbol_get_bfdsym (sym));
bind = ELF_ST_BIND (elf_sym);
elf_sym->internal_elf_sym.st_info = ELF_ST_INFO (bind, STT_ARM_TFUNC);
}
elf_sym->internal_elf_sym.st_info = ELF_ST_INFO (bind, STT_ARM_TFUNC);
else
elf_sym->internal_elf_sym.st_info = ELF_ST_INFO (bind, STT_ARM_16BIT);
}
}
#endif

View file

@ -1,3 +1,9 @@
2000-01-27 Thomas de Lellis <tdel@windriver.com>
* arm.h (STT_ARM_TFUNC): Define in terms of STT_LOPROC.
(STT_ARM_16BIT): New flag. Denotes a label that was defined in
Thumb block but was does not identify a function.
2000-01-20 Nick Clifton <nickc@cygnus.com>
* common.h (EM_MCORE): Fix spelling of Motorola.

View file

@ -1,5 +1,5 @@
/* ARM ELF support for BFD.
Copyright (C) 1998, 1999 Free Software Foundation, Inc.
Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc.
This file is part of BFD, the Binary File Descriptor library.
@ -29,7 +29,7 @@
#define EF_APCS_26 0x08
#define EF_APCS_FLOAT 0x10
#define EF_PIC 0x20
#define EF_ALIGN8 0x40 /* 8-bit structure alignment is in use */
#define EF_ALIGN8 0x40 /* 8-bit structure alignment is in use. */
#define EF_NEW_ABI 0x80
#define EF_OLD_ABI 0x100
#define EF_SOFT_FLOAT 0x200
@ -41,15 +41,16 @@
#define F_PIC EF_PIC
#define F_SOFT_FLOAT EF_SOFT_FLOAT
/* Additional symbol types for Thumb */
#define STT_ARM_TFUNC 0xd
/* Additional symbol types for Thumb. */
#define STT_ARM_TFUNC STT_LOPROC /* A Thumb function. */
#define STT_ARM_16BIT STT_HIPROC /* A Thumb label. */
/* ARM-specific values for sh_flags */
#define SHF_ENTRYSECT 0x10000000 /* Section contains an entry point */
#define SHF_COMDEF 0x80000000 /* Section may be multiply defined in the input to a link step */
/* ARM-specific values for sh_flags. */
#define SHF_ENTRYSECT 0x10000000 /* Section contains an entry point. */
#define SHF_COMDEF 0x80000000 /* Section may be multiply defined in the input to a link step. */
/* ARM-specific program header flags */
#define PF_ARM_SB 0x10000000 /* Segment contains the location addressed by the static base */
/* ARM-specific program header flags. */
#define PF_ARM_SB 0x10000000 /* Segment contains the location addressed by the static base. */
/* Relocation types. */
START_RELOC_NUMBERS (elf_arm_reloc_type)
@ -82,8 +83,8 @@ START_RELOC_NUMBERS (elf_arm_reloc_type)
FAKE_RELOC (LAST_INVALID_RELOC1, 99)
RELOC_NUMBER (R_ARM_GNU_VTENTRY, 100)
RELOC_NUMBER (R_ARM_GNU_VTINHERIT, 101)
RELOC_NUMBER (R_ARM_THM_PC11, 102) /* cygnus extension to abi: thumb unconditional branch */
RELOC_NUMBER (R_ARM_THM_PC9, 103) /* cygnus extension to abi: thumb conditional branch */
RELOC_NUMBER (R_ARM_THM_PC11, 102) /* Cygnus extension to abi: Thumb unconditional branch */
RELOC_NUMBER (R_ARM_THM_PC9, 103) /* Cygnus extension to abi: Thumb conditional branch */
FAKE_RELOC (FIRST_INVALID_RELOC2, 104)
FAKE_RELOC (LAST_INVALID_RELOC2, 248)
RELOC_NUMBER (R_ARM_RXPC25, 249)

View file

@ -1,3 +1,10 @@
2000-01-27 Thomas de Lellis <tdel@windriver.com>
* arm-dis.c (printf_insn_big_arm): Treat ELF symbols with the
ARM_STT_16BIT flag as Thumb code symbols.
* arm-dis.c (printf_insn_little_arm): Ditto.
2000-01-25 Thomas de Lellis <tdel@windriver.com>
* arm-dis.c (printf_insn_thumb): Prevent double dumping

View file

@ -871,15 +871,13 @@ print_insn_big_arm (pc, info)
unsigned char b[4];
long given;
int status;
coff_symbol_type * cs;
elf_symbol_type * es;
int is_thumb;
if (info->disassembler_options)
{
parse_disassembler_options (info->disassembler_options);
/* To avoid repeated parsing of this option, we remove it here. */
/* To avoid repeated parsing of the options, we remove it here. */
info->disassembler_options = NULL;
}
@ -889,6 +887,8 @@ print_insn_big_arm (pc, info)
{
if (bfd_asymbol_flavour (*info->symbols) == bfd_target_coff_flavour)
{
coff_symbol_type * cs;
cs = coffsymbol (*info->symbols);
is_thumb = ( cs->native->u.syment.n_sclass == C_THUMBEXT
|| cs->native->u.syment.n_sclass == C_THUMBSTAT
@ -898,9 +898,11 @@ print_insn_big_arm (pc, info)
}
else if (bfd_asymbol_flavour (*info->symbols) == bfd_target_elf_flavour)
{
elf_symbol_type * es;
es = *(elf_symbol_type **)(info->symbols);
is_thumb = ELF_ST_TYPE (es->internal_elf_sym.st_info) ==
STT_ARM_TFUNC;
is_thumb = (ELF_ST_TYPE (es->internal_elf_sym.st_info) == STT_ARM_TFUNC)
|| (ELF_ST_TYPE (es->internal_elf_sym.st_info) == STT_ARM_16BIT);
}
}
@ -953,15 +955,13 @@ print_insn_little_arm (pc, info)
unsigned char b[4];
long given;
int status;
coff_symbol_type * cs;
elf_symbol_type * es;
int is_thumb;
if (info->disassembler_options)
{
parse_disassembler_options (info->disassembler_options);
/* To avoid repeated parsing of this option, we remove it here. */
/* To avoid repeated parsing of the options, we remove it here. */
info->disassembler_options = NULL;
}
@ -971,6 +971,8 @@ print_insn_little_arm (pc, info)
{
if (bfd_asymbol_flavour (*info->symbols) == bfd_target_coff_flavour)
{
coff_symbol_type * cs;
cs = coffsymbol (*info->symbols);
is_thumb = ( cs->native->u.syment.n_sclass == C_THUMBEXT
|| cs->native->u.syment.n_sclass == C_THUMBSTAT
@ -980,9 +982,11 @@ print_insn_little_arm (pc, info)
}
else if (bfd_asymbol_flavour (*info->symbols) == bfd_target_elf_flavour)
{
elf_symbol_type * es;
es = *(elf_symbol_type **)(info->symbols);
is_thumb = ELF_ST_TYPE (es->internal_elf_sym.st_info) ==
STT_ARM_TFUNC;
is_thumb = (ELF_ST_TYPE (es->internal_elf_sym.st_info) == STT_ARM_TFUNC)
|| (ELF_ST_TYPE (es->internal_elf_sym.st_info) == STT_ARM_16BIT);
}
}