* Makefile.am: Add elf32-arm.c.
* Makefile.in: Rebuild. * elf-bfd.h: Add elf_backend_get_symbol_type. * elf.c (swap_out_syms): If defined, call elf_backend_get_symbol_type. * elf32-arm.c: Define elf_backend_get_symbol_type. (elf32_arm_get_symbol-type): New routine. (record_thumb_to_arm_glue): Change to use STT_ARM_TFUNC. (bfd_elf32_arm_process_before_allocation): Change to check for STT_ARM_TFUNC. (elf32_arm_final_link_relocate): Likewise. * elfxx-target.h: Add elf_backend_get_symbol_type.
This commit is contained in:
parent
4ff5d55a08
commit
bb3b4377a4
@ -1,3 +1,18 @@
|
|||||||
|
Mon Aug 31 10:23:40 1998 Catherine Moore <clm@cygnus.com>
|
||||||
|
|
||||||
|
* Makefile.am: Add elf32-arm.c.
|
||||||
|
* Makefile.in: Rebuild.
|
||||||
|
* elf-bfd.h: Add elf_backend_get_symbol_type.
|
||||||
|
* elf.c (swap_out_syms): If defined, call
|
||||||
|
elf_backend_get_symbol_type.
|
||||||
|
* elf32-arm.c: Define elf_backend_get_symbol_type.
|
||||||
|
(elf32_arm_get_symbol-type): New routine.
|
||||||
|
(record_thumb_to_arm_glue): Change to use STT_ARM_TFUNC.
|
||||||
|
(bfd_elf32_arm_process_before_allocation): Change to
|
||||||
|
check for STT_ARM_TFUNC.
|
||||||
|
(elf32_arm_final_link_relocate): Likewise.
|
||||||
|
* elfxx-target.h: Add elf_backend_get_symbol_type.
|
||||||
|
|
||||||
Fri Aug 28 19:44:07 1998 Richard Henderson <rth@cygnus.com>
|
Fri Aug 28 19:44:07 1998 Richard Henderson <rth@cygnus.com>
|
||||||
|
|
||||||
* archures.c (bfd_mach_alpha_ev[456]): New.
|
* archures.c (bfd_mach_alpha_ev[456]): New.
|
||||||
|
@ -313,6 +313,10 @@ struct elf_backend_data
|
|||||||
elf_symbol_type *,
|
elf_symbol_type *,
|
||||||
unsigned int));
|
unsigned int));
|
||||||
|
|
||||||
|
/* A function to set the type of the info field. Processor-specific
|
||||||
|
types should be handled here. */
|
||||||
|
int (*elf_backend_get_symbol_type) PARAMS (( Elf_Internal_Sym *));
|
||||||
|
|
||||||
/* A function to do additional processing on the ELF section header
|
/* A function to do additional processing on the ELF section header
|
||||||
just before writing it out. This is used to set the flags and
|
just before writing it out. This is used to set the flags and
|
||||||
type fields for some sections, or to actually write out data for
|
type fields for some sections, or to actually write out data for
|
||||||
|
@ -4001,6 +4001,10 @@ swap_out_syms (abfd, sttp, relocatable_p)
|
|||||||
else
|
else
|
||||||
type = STT_NOTYPE;
|
type = STT_NOTYPE;
|
||||||
|
|
||||||
|
/* Processor-specific types */
|
||||||
|
if (bed->elf_backend_get_symbol_type)
|
||||||
|
type = (*bed->elf_backend_get_symbol_type) (&type_ptr->internal_elf_sym);
|
||||||
|
|
||||||
if (bfd_is_com_section (syms[idx]->section))
|
if (bfd_is_com_section (syms[idx]->section))
|
||||||
sym.st_info = ELF_ST_INFO (STB_GLOBAL, type);
|
sym.st_info = ELF_ST_INFO (STB_GLOBAL, type);
|
||||||
else if (bfd_is_und_section (syms[idx]->section))
|
else if (bfd_is_und_section (syms[idx]->section))
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
/* start-sanitize-armelf */
|
|
||||||
/* 32-bit ELF support for ARM
|
/* 32-bit ELF support for ARM
|
||||||
Copyright 1993, 1995, 1998 Free Software Foundation, Inc.
|
Copyright 1993, 1995, 1998 Free Software Foundation, Inc.
|
||||||
|
|
||||||
@ -40,6 +39,8 @@ static boolean elf32_arm_merge_private_bfd_data
|
|||||||
PARAMS ((bfd *, bfd *));
|
PARAMS ((bfd *, bfd *));
|
||||||
static boolean elf32_arm_print_private_bfd_data
|
static boolean elf32_arm_print_private_bfd_data
|
||||||
PARAMS ((bfd *, PTR));
|
PARAMS ((bfd *, PTR));
|
||||||
|
static int elf32_arm_get_symbol_type
|
||||||
|
PARAMS (( Elf_Internal_Sym *));
|
||||||
static struct bfd_link_hash_table *elf32_arm_link_hash_table_create
|
static struct bfd_link_hash_table *elf32_arm_link_hash_table_create
|
||||||
PARAMS ((bfd *));
|
PARAMS ((bfd *));
|
||||||
|
|
||||||
@ -344,6 +345,7 @@ record_thumb_to_arm_glue (link_info, h)
|
|||||||
char *tmp_name;
|
char *tmp_name;
|
||||||
struct elf_link_hash_entry *myh;
|
struct elf_link_hash_entry *myh;
|
||||||
struct elf32_arm_link_hash_table *hash_table;
|
struct elf32_arm_link_hash_table *hash_table;
|
||||||
|
char bind;
|
||||||
|
|
||||||
hash_table = elf32_arm_hash_table (link_info);
|
hash_table = elf32_arm_hash_table (link_info);
|
||||||
|
|
||||||
@ -376,7 +378,8 @@ record_thumb_to_arm_glue (link_info, h)
|
|||||||
(struct bfd_link_hash_entry **) &myh);
|
(struct bfd_link_hash_entry **) &myh);
|
||||||
|
|
||||||
/* If we mark it 'thumb', the disassembler will do a better job. */
|
/* If we mark it 'thumb', the disassembler will do a better job. */
|
||||||
myh->other = C_THUMBEXTFUNC;
|
bind = ELF_ST_BIND (myh->type);
|
||||||
|
myh->type = ELF_ST_INFO (bind, STT_ARM_TFUNC);
|
||||||
|
|
||||||
free (tmp_name);
|
free (tmp_name);
|
||||||
|
|
||||||
@ -487,8 +490,6 @@ bfd_elf32_arm_process_before_allocation (abfd, link_info)
|
|||||||
/* Here we have a bfd that is to be included on the link. We have a hook
|
/* Here we have a bfd that is to be included on the link. We have a hook
|
||||||
to do reloc rummaging, before section sizes are nailed down. */
|
to do reloc rummaging, before section sizes are nailed down. */
|
||||||
|
|
||||||
/* _bfd_coff_get_external_symbols (abfd); */
|
|
||||||
|
|
||||||
globals = elf32_arm_hash_table (link_info);
|
globals = elf32_arm_hash_table (link_info);
|
||||||
|
|
||||||
BFD_ASSERT (globals != NULL);
|
BFD_ASSERT (globals != NULL);
|
||||||
@ -502,8 +503,6 @@ bfd_elf32_arm_process_before_allocation (abfd, link_info)
|
|||||||
|
|
||||||
for (; sec != NULL; sec = sec->next)
|
for (; sec != NULL; sec = sec->next)
|
||||||
{
|
{
|
||||||
struct internal_reloc *i;
|
|
||||||
struct internal_reloc *rel;
|
|
||||||
|
|
||||||
if (sec->reloc_count == 0)
|
if (sec->reloc_count == 0)
|
||||||
continue;
|
continue;
|
||||||
@ -514,7 +513,7 @@ bfd_elf32_arm_process_before_allocation (abfd, link_info)
|
|||||||
irel = (_bfd_elf32_link_read_relocs (abfd, sec, (PTR) NULL,
|
irel = (_bfd_elf32_link_read_relocs (abfd, sec, (PTR) NULL,
|
||||||
(Elf_Internal_Rela *) NULL, false));
|
(Elf_Internal_Rela *) NULL, false));
|
||||||
|
|
||||||
BFD_ASSERT (i != 0);
|
BFD_ASSERT (irel != 0);
|
||||||
|
|
||||||
irelend = irel + sec->reloc_count;
|
irelend = irel + sec->reloc_count;
|
||||||
for (; irel < irelend; irel++)
|
for (; irel < irelend; irel++)
|
||||||
@ -599,30 +598,18 @@ bfd_elf32_arm_process_before_allocation (abfd, link_info)
|
|||||||
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. */
|
insert glue. */
|
||||||
|
|
||||||
if (h->other == C_THUMBEXTFUNC)
|
if (ELF_ST_TYPE(h->type) == STT_ARM_TFUNC)
|
||||||
record_arm_to_thumb_glue (link_info, h);
|
record_arm_to_thumb_glue (link_info, h);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case R_ARM_THM_PC22:
|
case R_ARM_THM_PC22:
|
||||||
|
|
||||||
/* This one is a call from thumb code. We used to look
|
/* This one is a call from thumb code. We look
|
||||||
for ARM_THUMB9 and ARM_THUMB12 as well. We need to look
|
up the target of the call. If it is not a thumb
|
||||||
up the target of the call. If it is an arm target, we
|
target, we insert glue. */
|
||||||
insert glue. If the symbol does not exist it will be
|
|
||||||
given a class of C_EXT and so we will generate a stub
|
|
||||||
for it. This is not really a problem, since the link
|
|
||||||
is doomed anyway. */
|
|
||||||
|
|
||||||
switch (h->other)
|
if (ELF_ST_TYPE (h->type) != STT_ARM_TFUNC)
|
||||||
{
|
record_thumb_to_arm_glue (link_info, h);
|
||||||
case C_EXT:
|
|
||||||
case C_STAT:
|
|
||||||
case C_LABEL:
|
|
||||||
record_thumb_to_arm_glue (link_info, h);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
;
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
@ -1225,8 +1212,7 @@ elf32_arm_final_link_relocate (howto, input_bfd, output_bfd,
|
|||||||
/* Arm B/BL instruction */
|
/* Arm B/BL instruction */
|
||||||
|
|
||||||
/* check for arm calling thumb function */
|
/* check for arm calling thumb function */
|
||||||
if (sym_flags == C_THUMBSTATFUNC
|
if (sym_flags == STT_ARM_TFUNC)
|
||||||
|| sym_flags == C_THUMBEXTFUNC)
|
|
||||||
{
|
{
|
||||||
elf32_arm_to_thumb_stub (info, sym_name, input_bfd, output_bfd,
|
elf32_arm_to_thumb_stub (info, sym_name, input_bfd, output_bfd,
|
||||||
input_section, hit_data, sym_sec, offset, addend, value);
|
input_section, hit_data, sym_sec, offset, addend, value);
|
||||||
@ -1246,8 +1232,7 @@ elf32_arm_final_link_relocate (howto, input_bfd, output_bfd,
|
|||||||
|
|
||||||
case R_ARM_ABS32:
|
case R_ARM_ABS32:
|
||||||
value += addend;
|
value += addend;
|
||||||
if (sym_flags == C_THUMBSTATFUNC
|
if (sym_flags == STT_ARM_TFUNC)
|
||||||
|| sym_flags == C_THUMBEXTFUNC)
|
|
||||||
value |= 1;
|
value |= 1;
|
||||||
bfd_put_32 (input_bfd, value, hit_data);
|
bfd_put_32 (input_bfd, value, hit_data);
|
||||||
return bfd_reloc_ok;
|
return bfd_reloc_ok;
|
||||||
@ -1316,9 +1301,8 @@ elf32_arm_final_link_relocate (howto, input_bfd, output_bfd,
|
|||||||
bfd_vma add;
|
bfd_vma add;
|
||||||
bfd_signed_vma signed_add;
|
bfd_signed_vma signed_add;
|
||||||
|
|
||||||
if (sym_flags == C_EXT
|
/* If it's not a call to thumb, assume call to arm */
|
||||||
|| sym_flags == C_STAT
|
if (sym_flags != STT_ARM_TFUNC)
|
||||||
|| sym_flags == C_LABEL)
|
|
||||||
{
|
{
|
||||||
elf32_thumb_to_arm_stub (info, sym_name, input_bfd, output_bfd, input_section,
|
elf32_thumb_to_arm_stub (info, sym_name, input_bfd, output_bfd, input_section,
|
||||||
hit_data, sym_sec, offset, addend, value);
|
hit_data, sym_sec, offset, addend, value);
|
||||||
@ -1526,7 +1510,7 @@ elf32_arm_relocate_section (output_bfd, info, input_bfd, input_section,
|
|||||||
contents, rel->r_offset,
|
contents, rel->r_offset,
|
||||||
relocation, rel->r_addend,
|
relocation, rel->r_addend,
|
||||||
info, sec, name,
|
info, sec, name,
|
||||||
(h ? h->other : sym->st_other));
|
(h ? ELF_ST_TYPE (h->type) : ELF_ST_TYPE (sym->st_info)));
|
||||||
|
|
||||||
|
|
||||||
if (r != bfd_reloc_ok)
|
if (r != bfd_reloc_ok)
|
||||||
@ -1785,6 +1769,13 @@ elf32_arm_print_private_bfd_data (abfd, ptr)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
elf32_arm_get_symbol_type (elf_sym)
|
||||||
|
Elf_Internal_Sym *elf_sym;
|
||||||
|
{
|
||||||
|
return ELF_ST_TYPE(elf_sym->st_info);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#define TARGET_LITTLE_SYM bfd_elf32_littlearm_vec
|
#define TARGET_LITTLE_SYM bfd_elf32_littlearm_vec
|
||||||
#define TARGET_LITTLE_NAME "elf32-littlearm"
|
#define TARGET_LITTLE_NAME "elf32-littlearm"
|
||||||
@ -1802,8 +1793,7 @@ elf32_arm_print_private_bfd_data (abfd, ptr)
|
|||||||
#define bfd_elf32_bfd_set_private_flags elf32_arm_set_private_flags
|
#define bfd_elf32_bfd_set_private_flags elf32_arm_set_private_flags
|
||||||
#define bfd_elf32_bfd_print_private_bfd_data elf32_arm_print_private_bfd_data
|
#define bfd_elf32_bfd_print_private_bfd_data elf32_arm_print_private_bfd_data
|
||||||
#define bfd_elf32_bfd_link_hash_table_create elf32_arm_link_hash_table_create
|
#define bfd_elf32_bfd_link_hash_table_create elf32_arm_link_hash_table_create
|
||||||
|
#define elf_backend_get_symbol_type elf32_arm_get_symbol_type
|
||||||
#define elf_symbol_leading_char '_'
|
#define elf_symbol_leading_char '_'
|
||||||
|
|
||||||
#include "elf32-target.h"
|
#include "elf32-target.h"
|
||||||
/* end-sanitize-armelf */
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user