Fix formatting
This commit is contained in:
parent
345a835d18
commit
9b485d32de
|
@ -1,3 +1,7 @@
|
||||||
|
2000-08-10 Nick Clifton <nickc@cygnus.com>
|
||||||
|
|
||||||
|
* elf32-arm.h: Fix formatting.
|
||||||
|
|
||||||
2000-08-10 Bernd Schmidt <bernds@cygnus.co.uk>
|
2000-08-10 Bernd Schmidt <bernds@cygnus.co.uk>
|
||||||
|
|
||||||
* elf32-sh.c (sh_elf_reloc_loop): Make LAST_SYMBOL_SECTION static.
|
* elf32-sh.c (sh_elf_reloc_loop): Make LAST_SYMBOL_SECTION static.
|
||||||
|
|
226
bfd/elf32-arm.h
226
bfd/elf32-arm.h
|
@ -37,7 +37,6 @@ static bfd_reloc_status_type elf32_arm_final_link_relocate
|
||||||
PARAMS ((reloc_howto_type *, bfd *, bfd *, asection *, bfd_byte *,
|
PARAMS ((reloc_howto_type *, bfd *, bfd *, asection *, bfd_byte *,
|
||||||
Elf_Internal_Rela *, bfd_vma, struct bfd_link_info *, asection *,
|
Elf_Internal_Rela *, bfd_vma, struct bfd_link_info *, asection *,
|
||||||
const char *, unsigned char, struct elf_link_hash_entry *));
|
const char *, unsigned char, struct elf_link_hash_entry *));
|
||||||
|
|
||||||
static insn32 insert_thumb_branch
|
static insn32 insert_thumb_branch
|
||||||
PARAMS ((insn32, int));
|
PARAMS ((insn32, int));
|
||||||
static struct elf_link_hash_entry *find_thumb_glue
|
static struct elf_link_hash_entry *find_thumb_glue
|
||||||
|
@ -57,14 +56,12 @@ static int elf32_thumb_to_arm_stub
|
||||||
PARAMS ((struct bfd_link_info *, const char *, bfd *, bfd *, asection *,
|
PARAMS ((struct bfd_link_info *, const char *, bfd *, bfd *, asection *,
|
||||||
bfd_byte *, asection *, bfd_vma, bfd_signed_vma, bfd_vma));
|
bfd_byte *, asection *, bfd_vma, bfd_signed_vma, bfd_vma));
|
||||||
|
|
||||||
|
#define INTERWORK_FLAG(abfd) (elf_elfheader (abfd)->e_flags & EF_INTERWORK)
|
||||||
|
|
||||||
/* The linker script knows the section names for placement.
|
/* The linker script knows the section names for placement.
|
||||||
The entry_names are used to do simple name mangling on the stubs.
|
The entry_names are used to do simple name mangling on the stubs.
|
||||||
Given a function name, and its type, the stub can be found. The
|
Given a function name, and its type, the stub can be found. The
|
||||||
name can be changed. The only requirement is the %s be present.
|
name can be changed. The only requirement is the %s be present. */
|
||||||
*/
|
|
||||||
|
|
||||||
#define INTERWORK_FLAG( abfd ) (elf_elfheader (abfd)->e_flags & EF_INTERWORK)
|
|
||||||
|
|
||||||
#define THUMB2ARM_GLUE_SECTION_NAME ".glue_7t"
|
#define THUMB2ARM_GLUE_SECTION_NAME ".glue_7t"
|
||||||
#define THUMB2ARM_GLUE_ENTRY_NAME "__%s_from_thumb"
|
#define THUMB2ARM_GLUE_ENTRY_NAME "__%s_from_thumb"
|
||||||
|
|
||||||
|
@ -76,14 +73,12 @@ static int elf32_thumb_to_arm_stub
|
||||||
#define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so.1"
|
#define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so.1"
|
||||||
|
|
||||||
/* The size in bytes of an entry in the procedure linkage table. */
|
/* The size in bytes of an entry in the procedure linkage table. */
|
||||||
|
|
||||||
#define PLT_ENTRY_SIZE 16
|
#define PLT_ENTRY_SIZE 16
|
||||||
|
|
||||||
/* The first entry in a procedure linkage table looks like
|
/* The first entry in a procedure linkage table looks like
|
||||||
this. It is set up so that any shared library function that is
|
this. It is set up so that any shared library function that is
|
||||||
called before the relocation has been set up calls the dynamic
|
called before the relocation has been set up calls the dynamic
|
||||||
linker first */
|
linker first. */
|
||||||
|
|
||||||
static const bfd_byte elf32_arm_plt0_entry [PLT_ENTRY_SIZE] =
|
static const bfd_byte elf32_arm_plt0_entry [PLT_ENTRY_SIZE] =
|
||||||
{
|
{
|
||||||
0x04, 0xe0, 0x2d, 0xe5, /* str lr, [sp, #-4]! */
|
0x04, 0xe0, 0x2d, 0xe5, /* str lr, [sp, #-4]! */
|
||||||
|
@ -94,7 +89,6 @@ static const bfd_byte elf32_arm_plt0_entry [PLT_ENTRY_SIZE] =
|
||||||
|
|
||||||
/* Subsequent entries in a procedure linkage table look like
|
/* Subsequent entries in a procedure linkage table look like
|
||||||
this. */
|
this. */
|
||||||
|
|
||||||
static const bfd_byte elf32_arm_plt_entry [PLT_ENTRY_SIZE] =
|
static const bfd_byte elf32_arm_plt_entry [PLT_ENTRY_SIZE] =
|
||||||
{
|
{
|
||||||
0x04, 0xc0, 0x9f, 0xe5, /* ldr ip, [pc, #4] */
|
0x04, 0xc0, 0x9f, 0xe5, /* ldr ip, [pc, #4] */
|
||||||
|
@ -103,7 +97,6 @@ static const bfd_byte elf32_arm_plt_entry [PLT_ENTRY_SIZE] =
|
||||||
0x00, 0x00, 0x00, 0x00 /* offset to symbol in got */
|
0x00, 0x00, 0x00, 0x00 /* offset to symbol in got */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
/* The ARM linker needs to keep track of the number of relocs that it
|
/* The ARM linker needs to keep track of the number of relocs that it
|
||||||
decides to copy in check_relocs for each symbol. This is so that
|
decides to copy in check_relocs for each symbol. This is so that
|
||||||
it can discard PC relative relocs if it doesn't need them when
|
it can discard PC relative relocs if it doesn't need them when
|
||||||
|
@ -112,7 +105,6 @@ static const bfd_byte elf32_arm_plt_entry [PLT_ENTRY_SIZE] =
|
||||||
|
|
||||||
/* This structure keeps track of the number of PC relative relocs we
|
/* This structure keeps track of the number of PC relative relocs we
|
||||||
have copied for a given symbol. */
|
have copied for a given symbol. */
|
||||||
|
|
||||||
struct elf32_arm_pcrel_relocs_copied
|
struct elf32_arm_pcrel_relocs_copied
|
||||||
{
|
{
|
||||||
/* Next section. */
|
/* Next section. */
|
||||||
|
@ -124,7 +116,6 @@ struct elf32_arm_pcrel_relocs_copied
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Arm ELF linker hash entry. */
|
/* Arm ELF linker hash entry. */
|
||||||
|
|
||||||
struct elf32_arm_link_hash_entry
|
struct elf32_arm_link_hash_entry
|
||||||
{
|
{
|
||||||
struct elf_link_hash_entry root;
|
struct elf_link_hash_entry root;
|
||||||
|
@ -134,12 +125,10 @@ struct elf32_arm_link_hash_entry
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Declare this now that the above structures are defined. */
|
/* Declare this now that the above structures are defined. */
|
||||||
|
|
||||||
static boolean elf32_arm_discard_copies
|
static boolean elf32_arm_discard_copies
|
||||||
PARAMS ((struct elf32_arm_link_hash_entry *, PTR));
|
PARAMS ((struct elf32_arm_link_hash_entry *, PTR));
|
||||||
|
|
||||||
/* Traverse an arm ELF linker hash table. */
|
/* Traverse an arm ELF linker hash table. */
|
||||||
|
|
||||||
#define elf32_arm_link_hash_traverse(table, func, info) \
|
#define elf32_arm_link_hash_traverse(table, func, info) \
|
||||||
(elf_link_hash_traverse \
|
(elf_link_hash_traverse \
|
||||||
(&(table)->root, \
|
(&(table)->root, \
|
||||||
|
@ -150,9 +139,9 @@ static boolean elf32_arm_discard_copies
|
||||||
#define elf32_arm_hash_table(info) \
|
#define elf32_arm_hash_table(info) \
|
||||||
((struct elf32_arm_link_hash_table *) ((info)->hash))
|
((struct elf32_arm_link_hash_table *) ((info)->hash))
|
||||||
|
|
||||||
/* ARM ELF linker hash table */
|
/* ARM ELF linker hash table. */
|
||||||
struct elf32_arm_link_hash_table
|
struct elf32_arm_link_hash_table
|
||||||
{
|
{
|
||||||
/* The main hash table. */
|
/* The main hash table. */
|
||||||
struct elf_link_hash_table root;
|
struct elf_link_hash_table root;
|
||||||
|
|
||||||
|
@ -168,7 +157,7 @@ struct elf32_arm_link_hash_table
|
||||||
/* A boolean indicating whether knowledge of the ARM's pipeline
|
/* A boolean indicating whether knowledge of the ARM's pipeline
|
||||||
length should be applied by the linker. */
|
length should be applied by the linker. */
|
||||||
int no_pipeline_knowledge;
|
int no_pipeline_knowledge;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
/* Create an entry in an ARM ELF linker hash table. */
|
/* Create an entry in an ARM ELF linker hash table. */
|
||||||
|
@ -201,7 +190,7 @@ elf32_arm_link_hash_newfunc (entry, table, string)
|
||||||
return (struct bfd_hash_entry *) ret;
|
return (struct bfd_hash_entry *) ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Create an ARM elf linker hash table */
|
/* Create an ARM elf linker hash table. */
|
||||||
|
|
||||||
static struct bfd_link_hash_table *
|
static struct bfd_link_hash_table *
|
||||||
elf32_arm_link_hash_table_create (abfd)
|
elf32_arm_link_hash_table_create (abfd)
|
||||||
|
@ -229,6 +218,8 @@ elf32_arm_link_hash_table_create (abfd)
|
||||||
return &ret->root.root;
|
return &ret->root.root;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Locate the Thumb encoded calling stub for NAME. */
|
||||||
|
|
||||||
static struct elf_link_hash_entry *
|
static struct elf_link_hash_entry *
|
||||||
find_thumb_glue (link_info, name, input_bfd)
|
find_thumb_glue (link_info, name, input_bfd)
|
||||||
struct bfd_link_info *link_info;
|
struct bfd_link_info *link_info;
|
||||||
|
@ -242,7 +233,6 @@ find_thumb_glue (link_info, name, input_bfd)
|
||||||
/* We need a pointer to the armelf specific hash table. */
|
/* We need a pointer to the armelf specific hash table. */
|
||||||
hash_table = elf32_arm_hash_table (link_info);
|
hash_table = elf32_arm_hash_table (link_info);
|
||||||
|
|
||||||
|
|
||||||
tmp_name = ((char *)
|
tmp_name = ((char *)
|
||||||
bfd_malloc (strlen (name) + strlen (THUMB2ARM_GLUE_ENTRY_NAME) + 1));
|
bfd_malloc (strlen (name) + strlen (THUMB2ARM_GLUE_ENTRY_NAME) + 1));
|
||||||
|
|
||||||
|
@ -255,7 +245,7 @@ find_thumb_glue (link_info, name, input_bfd)
|
||||||
|
|
||||||
if (hash == NULL)
|
if (hash == NULL)
|
||||||
/* xgettext:c-format */
|
/* xgettext:c-format */
|
||||||
_bfd_error_handler (_ ("%s: unable to find THUMB glue '%s' for `%s'"),
|
_bfd_error_handler (_("%s: unable to find THUMB glue '%s' for `%s'"),
|
||||||
bfd_get_filename (input_bfd), tmp_name, name);
|
bfd_get_filename (input_bfd), tmp_name, name);
|
||||||
|
|
||||||
free (tmp_name);
|
free (tmp_name);
|
||||||
|
@ -263,6 +253,8 @@ find_thumb_glue (link_info, name, input_bfd)
|
||||||
return hash;
|
return hash;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Locate the ARM encoded calling stub for NAME. */
|
||||||
|
|
||||||
static struct elf_link_hash_entry *
|
static struct elf_link_hash_entry *
|
||||||
find_arm_glue (link_info, name, input_bfd)
|
find_arm_glue (link_info, name, input_bfd)
|
||||||
struct bfd_link_info *link_info;
|
struct bfd_link_info *link_info;
|
||||||
|
@ -288,7 +280,7 @@ find_arm_glue (link_info, name, input_bfd)
|
||||||
|
|
||||||
if (myh == NULL)
|
if (myh == NULL)
|
||||||
/* xgettext:c-format */
|
/* xgettext:c-format */
|
||||||
_bfd_error_handler (_ ("%s: unable to find ARM glue '%s' for `%s'"),
|
_bfd_error_handler (_("%s: unable to find ARM glue '%s' for `%s'"),
|
||||||
bfd_get_filename (input_bfd), tmp_name, name);
|
bfd_get_filename (input_bfd), tmp_name, name);
|
||||||
|
|
||||||
free (tmp_name);
|
free (tmp_name);
|
||||||
|
@ -296,24 +288,21 @@ find_arm_glue (link_info, name, input_bfd)
|
||||||
return myh;
|
return myh;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/* ARM->Thumb glue:
|
||||||
ARM->Thumb glue:
|
|
||||||
|
|
||||||
.arm
|
.arm
|
||||||
__func_from_arm:
|
__func_from_arm:
|
||||||
ldr r12, __func_addr
|
ldr r12, __func_addr
|
||||||
bx r12
|
bx r12
|
||||||
__func_addr:
|
__func_addr:
|
||||||
.word func @ behave as if you saw a ARM_32 reloc
|
.word func @ behave as if you saw a ARM_32 reloc. */
|
||||||
*/
|
|
||||||
|
|
||||||
#define ARM2THUMB_GLUE_SIZE 12
|
#define ARM2THUMB_GLUE_SIZE 12
|
||||||
static const insn32 a2t1_ldr_insn = 0xe59fc000;
|
static const insn32 a2t1_ldr_insn = 0xe59fc000;
|
||||||
static const insn32 a2t2_bx_r12_insn = 0xe12fff1c;
|
static const insn32 a2t2_bx_r12_insn = 0xe12fff1c;
|
||||||
static const insn32 a2t3_func_addr_insn = 0x00000001;
|
static const insn32 a2t3_func_addr_insn = 0x00000001;
|
||||||
|
|
||||||
/*
|
/* Thumb->ARM: Thumb->(non-interworking aware) ARM
|
||||||
Thumb->ARM: Thumb->(non-interworking aware) ARM
|
|
||||||
|
|
||||||
.thumb .thumb
|
.thumb .thumb
|
||||||
.align 2 .align 2
|
.align 2 .align 2
|
||||||
|
@ -327,8 +316,7 @@ static const insn32 a2t3_func_addr_insn = 0x00000001;
|
||||||
ldmia r13! {r6, lr}
|
ldmia r13! {r6, lr}
|
||||||
bx lr
|
bx lr
|
||||||
__func_addr:
|
__func_addr:
|
||||||
.word func
|
.word func */
|
||||||
*/
|
|
||||||
|
|
||||||
#define THUMB2ARM_GLUE_SIZE 8
|
#define THUMB2ARM_GLUE_SIZE 8
|
||||||
static const insn16 t2a1_bx_pc_insn = 0x4778;
|
static const insn16 t2a1_bx_pc_insn = 0x4778;
|
||||||
|
@ -408,7 +396,6 @@ record_arm_to_thumb_glue (link_info, h)
|
||||||
s = bfd_get_section_by_name
|
s = bfd_get_section_by_name
|
||||||
(globals->bfd_of_glue_owner, ARM2THUMB_GLUE_SECTION_NAME);
|
(globals->bfd_of_glue_owner, ARM2THUMB_GLUE_SECTION_NAME);
|
||||||
|
|
||||||
|
|
||||||
BFD_ASSERT (s != NULL);
|
BFD_ASSERT (s != NULL);
|
||||||
|
|
||||||
tmp_name = ((char *)
|
tmp_name = ((char *)
|
||||||
|
@ -423,14 +410,14 @@ record_arm_to_thumb_glue (link_info, h)
|
||||||
|
|
||||||
if (myh != NULL)
|
if (myh != NULL)
|
||||||
{
|
{
|
||||||
|
/* We've already seen this guy. */
|
||||||
free (tmp_name);
|
free (tmp_name);
|
||||||
return; /* we've already seen this guy */
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* The only trick here is using hash_table->arm_glue_size as the value. Even
|
/* The only trick here is using hash_table->arm_glue_size as the value. Even
|
||||||
though the section isn't allocated yet, this is where we will be putting
|
though the section isn't allocated yet, this is where we will be putting
|
||||||
it. */
|
it. */
|
||||||
|
|
||||||
_bfd_generic_link_add_one_symbol (link_info, globals->bfd_of_glue_owner, tmp_name,
|
_bfd_generic_link_add_one_symbol (link_info, globals->bfd_of_glue_owner, tmp_name,
|
||||||
BSF_GLOBAL,
|
BSF_GLOBAL,
|
||||||
s, globals->arm_glue_size + 1,
|
s, globals->arm_glue_size + 1,
|
||||||
|
@ -477,8 +464,9 @@ record_thumb_to_arm_glue (link_info, h)
|
||||||
|
|
||||||
if (myh != NULL)
|
if (myh != NULL)
|
||||||
{
|
{
|
||||||
|
/* We've already seen this guy. */
|
||||||
free (tmp_name);
|
free (tmp_name);
|
||||||
return; /* we've already seen this guy */
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
_bfd_generic_link_add_one_symbol (link_info, hash_table->bfd_of_glue_owner, tmp_name,
|
_bfd_generic_link_add_one_symbol (link_info, hash_table->bfd_of_glue_owner, tmp_name,
|
||||||
|
@ -486,17 +474,16 @@ record_thumb_to_arm_glue (link_info, h)
|
||||||
NULL, true, false,
|
NULL, true, false,
|
||||||
(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. */
|
||||||
bind = ELF_ST_BIND (myh->type);
|
bind = ELF_ST_BIND (myh->type);
|
||||||
myh->type = ELF_ST_INFO (bind, STT_ARM_TFUNC);
|
myh->type = ELF_ST_INFO (bind, STT_ARM_TFUNC);
|
||||||
|
|
||||||
free (tmp_name);
|
free (tmp_name);
|
||||||
|
|
||||||
/* Allocate another symbol to mark where we switch to arm mode. */
|
|
||||||
|
|
||||||
#define CHANGE_TO_ARM "__%s_change_to_arm"
|
#define CHANGE_TO_ARM "__%s_change_to_arm"
|
||||||
#define BACK_FROM_ARM "__%s_back_from_arm"
|
#define BACK_FROM_ARM "__%s_back_from_arm"
|
||||||
|
|
||||||
|
/* Allocate another symbol to mark where we switch to Arm mode. */
|
||||||
tmp_name = (char *) bfd_malloc (strlen (name) + strlen (CHANGE_TO_ARM) + 1);
|
tmp_name = (char *) bfd_malloc (strlen (name) + strlen (CHANGE_TO_ARM) + 1);
|
||||||
|
|
||||||
BFD_ASSERT (tmp_name);
|
BFD_ASSERT (tmp_name);
|
||||||
|
@ -520,6 +507,7 @@ record_thumb_to_arm_glue (link_info, h)
|
||||||
/* Select a BFD to be used to hold the sections used by the glue code.
|
/* Select a BFD to be used to hold the sections used by the glue code.
|
||||||
This function is called from the linker scripts in ld/emultempl/
|
This function is called from the linker scripts in ld/emultempl/
|
||||||
{armelf/pe}.em */
|
{armelf/pe}.em */
|
||||||
|
|
||||||
boolean
|
boolean
|
||||||
bfd_elf32_arm_get_bfd_for_interworking (abfd, info)
|
bfd_elf32_arm_get_bfd_for_interworking (abfd, info)
|
||||||
bfd *abfd;
|
bfd *abfd;
|
||||||
|
@ -608,7 +596,6 @@ bfd_elf32_arm_process_before_allocation (abfd, link_info, no_pipeline_knowledge)
|
||||||
|
|
||||||
/* 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. */
|
||||||
|
|
||||||
globals = elf32_arm_hash_table (link_info);
|
globals = elf32_arm_hash_table (link_info);
|
||||||
|
|
||||||
BFD_ASSERT (globals != NULL);
|
BFD_ASSERT (globals != NULL);
|
||||||
|
@ -628,8 +615,8 @@ bfd_elf32_arm_process_before_allocation (abfd, link_info, no_pipeline_knowledge)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
|
symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
|
||||||
/* Load the relocs. */
|
|
||||||
|
|
||||||
|
/* Load the relocs. */
|
||||||
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));
|
||||||
|
|
||||||
|
@ -646,7 +633,7 @@ bfd_elf32_arm_process_before_allocation (abfd, link_info, no_pipeline_knowledge)
|
||||||
r_type = ELF32_R_TYPE (irel->r_info);
|
r_type = ELF32_R_TYPE (irel->r_info);
|
||||||
r_index = ELF32_R_SYM (irel->r_info);
|
r_index = ELF32_R_SYM (irel->r_info);
|
||||||
|
|
||||||
/* These are the only relocation types we care about */
|
/* These are the only relocation types we care about. */
|
||||||
if ( r_type != R_ARM_PC24
|
if ( r_type != R_ARM_PC24
|
||||||
&& r_type != R_ARM_THM_PC22)
|
&& r_type != R_ARM_THM_PC22)
|
||||||
continue;
|
continue;
|
||||||
|
@ -663,6 +650,7 @@ bfd_elf32_arm_process_before_allocation (abfd, link_info, no_pipeline_knowledge)
|
||||||
contents = (bfd_byte *) bfd_malloc (sec->_raw_size);
|
contents = (bfd_byte *) bfd_malloc (sec->_raw_size);
|
||||||
if (contents == NULL)
|
if (contents == NULL)
|
||||||
goto error_return;
|
goto error_return;
|
||||||
|
|
||||||
free_contents = contents;
|
free_contents = contents;
|
||||||
|
|
||||||
if (!bfd_get_section_contents (abfd, sec, contents,
|
if (!bfd_get_section_contents (abfd, sec, contents,
|
||||||
|
@ -684,7 +672,9 @@ bfd_elf32_arm_process_before_allocation (abfd, link_info, no_pipeline_knowledge)
|
||||||
bfd_malloc (symtab_hdr->sh_size));
|
bfd_malloc (symtab_hdr->sh_size));
|
||||||
if (extsyms == NULL)
|
if (extsyms == NULL)
|
||||||
goto error_return;
|
goto error_return;
|
||||||
|
|
||||||
free_extsyms = extsyms;
|
free_extsyms = extsyms;
|
||||||
|
|
||||||
if (bfd_seek (abfd, symtab_hdr->sh_offset, SEEK_SET) != 0
|
if (bfd_seek (abfd, symtab_hdr->sh_offset, SEEK_SET) != 0
|
||||||
|| (bfd_read (extsyms, 1, symtab_hdr->sh_size, abfd)
|
|| (bfd_read (extsyms, 1, symtab_hdr->sh_size, abfd)
|
||||||
!= symtab_hdr->sh_size))
|
!= symtab_hdr->sh_size))
|
||||||
|
@ -693,14 +683,13 @@ bfd_elf32_arm_process_before_allocation (abfd, link_info, no_pipeline_knowledge)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If the relocation is not against a symbol it cannot concern us. */
|
/* If the relocation is not against a symbol it cannot concern us. */
|
||||||
|
|
||||||
h = NULL;
|
h = NULL;
|
||||||
|
|
||||||
/* We don't care about local symbols */
|
/* We don't care about local symbols. */
|
||||||
if (r_index < symtab_hdr->sh_info)
|
if (r_index < symtab_hdr->sh_info)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
/* This is an external symbol */
|
/* This is an external symbol. */
|
||||||
r_index -= symtab_hdr->sh_info;
|
r_index -= symtab_hdr->sh_info;
|
||||||
h = (struct elf_link_hash_entry *)
|
h = (struct elf_link_hash_entry *)
|
||||||
elf_sym_hashes (abfd)[r_index];
|
elf_sym_hashes (abfd)[r_index];
|
||||||
|
@ -716,7 +705,6 @@ bfd_elf32_arm_process_before_allocation (abfd, link_info, no_pipeline_knowledge)
|
||||||
/* This one is a call from arm code. We need to look up
|
/* 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. */
|
insert glue. */
|
||||||
|
|
||||||
if (ELF_ST_TYPE(h->type) == STT_ARM_TFUNC)
|
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;
|
||||||
|
@ -725,7 +713,6 @@ bfd_elf32_arm_process_before_allocation (abfd, link_info, no_pipeline_knowledge)
|
||||||
/* This one is a call from thumb code. We look
|
/* 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. */
|
target, we insert glue. */
|
||||||
|
|
||||||
if (ELF_ST_TYPE (h->type) != STT_ARM_TFUNC)
|
if (ELF_ST_TYPE (h->type) != STT_ARM_TFUNC)
|
||||||
record_thumb_to_arm_glue (link_info, h);
|
record_thumb_to_arm_glue (link_info, h);
|
||||||
break;
|
break;
|
||||||
|
@ -788,7 +775,6 @@ insert_thumb_branch (br_insn, rel_off)
|
||||||
unsigned int low_bits;
|
unsigned int low_bits;
|
||||||
unsigned int high_bits;
|
unsigned int high_bits;
|
||||||
|
|
||||||
|
|
||||||
BFD_ASSERT ((rel_off & 1) != 1);
|
BFD_ASSERT ((rel_off & 1) != 1);
|
||||||
|
|
||||||
rel_off >>= 1; /* Half word aligned address. */
|
rel_off >>= 1; /* Half word aligned address. */
|
||||||
|
@ -800,14 +786,14 @@ insert_thumb_branch (br_insn, rel_off)
|
||||||
else if ((br_insn & HI_LOW_ORDER) == HI_LOW_ORDER)
|
else if ((br_insn & HI_LOW_ORDER) == HI_LOW_ORDER)
|
||||||
br_insn = HI_LOW_ORDER | (high_bits << 16) | low_bits;
|
br_insn = HI_LOW_ORDER | (high_bits << 16) | low_bits;
|
||||||
else
|
else
|
||||||
abort (); /* error - not a valid branch instruction form */
|
|
||||||
|
|
||||||
/* FIXME: abort is probably not the right call. krk@cygnus.com */
|
/* FIXME: abort is probably not the right call. krk@cygnus.com */
|
||||||
|
abort (); /* error - not a valid branch instruction form. */
|
||||||
|
|
||||||
return br_insn;
|
return br_insn;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Thumb code calling an ARM function */
|
/* Thumb code calling an ARM function. */
|
||||||
|
|
||||||
static int
|
static int
|
||||||
elf32_thumb_to_arm_stub (info, name, input_bfd, output_bfd, input_section,
|
elf32_thumb_to_arm_stub (info, name, input_bfd, output_bfd, input_section,
|
||||||
hit_data, sym_sec, offset, addend, val)
|
hit_data, sym_sec, offset, addend, val)
|
||||||
|
@ -854,10 +840,10 @@ elf32_thumb_to_arm_stub (info, name, input_bfd, output_bfd, input_section,
|
||||||
&& !INTERWORK_FLAG (sym_sec->owner))
|
&& !INTERWORK_FLAG (sym_sec->owner))
|
||||||
{
|
{
|
||||||
_bfd_error_handler
|
_bfd_error_handler
|
||||||
(_ ("%s(%s): warning: interworking not enabled."),
|
(_("%s(%s): warning: interworking not enabled."),
|
||||||
bfd_get_filename (sym_sec->owner), name);
|
bfd_get_filename (sym_sec->owner), name);
|
||||||
_bfd_error_handler
|
_bfd_error_handler
|
||||||
(_ (" first occurrence: %s: thumb call to arm"),
|
(_(" first occurrence: %s: thumb call to arm"),
|
||||||
bfd_get_filename (input_bfd));
|
bfd_get_filename (input_bfd));
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
|
@ -873,13 +859,19 @@ elf32_thumb_to_arm_stub (info, name, input_bfd, output_bfd, input_section,
|
||||||
s->contents + my_offset + 2);
|
s->contents + my_offset + 2);
|
||||||
|
|
||||||
ret_offset =
|
ret_offset =
|
||||||
((bfd_signed_vma) val) /* Address of destination of the stub */
|
/* Address of destination of the stub. */
|
||||||
|
((bfd_signed_vma) val)
|
||||||
- ((bfd_signed_vma)
|
- ((bfd_signed_vma)
|
||||||
(s->output_offset /* Offset from the start of the current section to the start of the stubs. */
|
/* Offset from the start of the current section to the start of the stubs. */
|
||||||
+ my_offset /* Offset of the start of this stub from the start of the stubs. */
|
(s->output_offset
|
||||||
+ s->output_section->vma) /* Address of the start of the current section. */
|
/* Offset of the start of this stub from the start of the stubs. */
|
||||||
+ 4 /* The branch instruction is 4 bytes into the stub. */
|
+ my_offset
|
||||||
+ 8); /* ARM branches work from the pc of the instruction + 8. */
|
/* Address of the start of the current section. */
|
||||||
|
+ s->output_section->vma)
|
||||||
|
/* The branch instruction is 4 bytes into the stub. */
|
||||||
|
+ 4
|
||||||
|
/* ARM branches work from the pc of the instruction + 8. */
|
||||||
|
+ 8);
|
||||||
|
|
||||||
bfd_put_32 (output_bfd,
|
bfd_put_32 (output_bfd,
|
||||||
t2a3_b_insn | ((ret_offset >> 2) & 0x00FFFFFF),
|
t2a3_b_insn | ((ret_offset >> 2) & 0x00FFFFFF),
|
||||||
|
@ -907,7 +899,8 @@ elf32_thumb_to_arm_stub (info, name, input_bfd, output_bfd, input_section,
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Arm code calling a Thumb function */
|
/* Arm code calling a Thumb function. */
|
||||||
|
|
||||||
static int
|
static int
|
||||||
elf32_arm_to_thumb_stub (info, name, input_bfd, output_bfd, input_section,
|
elf32_arm_to_thumb_stub (info, name, input_bfd, output_bfd, input_section,
|
||||||
hit_data, sym_sec, offset, addend, val)
|
hit_data, sym_sec, offset, addend, val)
|
||||||
|
@ -952,12 +945,13 @@ elf32_arm_to_thumb_stub (info, name, input_bfd, output_bfd, input_section,
|
||||||
&& !INTERWORK_FLAG (sym_sec->owner))
|
&& !INTERWORK_FLAG (sym_sec->owner))
|
||||||
{
|
{
|
||||||
_bfd_error_handler
|
_bfd_error_handler
|
||||||
(_ ("%s(%s): warning: interworking not enabled."),
|
(_("%s(%s): warning: interworking not enabled."),
|
||||||
bfd_get_filename (sym_sec->owner), name);
|
bfd_get_filename (sym_sec->owner), name);
|
||||||
_bfd_error_handler
|
_bfd_error_handler
|
||||||
(_ (" first occurrence: %s: arm call to thumb"),
|
(_(" first occurrence: %s: arm call to thumb"),
|
||||||
bfd_get_filename (input_bfd));
|
bfd_get_filename (input_bfd));
|
||||||
}
|
}
|
||||||
|
|
||||||
--my_offset;
|
--my_offset;
|
||||||
myh->root.u.def.value = my_offset;
|
myh->root.u.def.value = my_offset;
|
||||||
|
|
||||||
|
@ -995,6 +989,7 @@ elf32_arm_to_thumb_stub (info, name, input_bfd, output_bfd, input_section,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Perform a relocation as part of a final link. */
|
/* Perform a relocation as part of a final link. */
|
||||||
|
|
||||||
static bfd_reloc_status_type
|
static bfd_reloc_status_type
|
||||||
elf32_arm_final_link_relocate (howto, input_bfd, output_bfd,
|
elf32_arm_final_link_relocate (howto, input_bfd, output_bfd,
|
||||||
input_section, contents, rel, value,
|
input_section, contents, rel, value,
|
||||||
|
@ -1067,7 +1062,6 @@ elf32_arm_final_link_relocate (howto, input_bfd, output_bfd,
|
||||||
#endif
|
#endif
|
||||||
/* When generating a shared object, these relocations are copied
|
/* When generating a shared object, these relocations are copied
|
||||||
into the output file to be resolved at run time. */
|
into the output file to be resolved at run time. */
|
||||||
|
|
||||||
if (info->shared
|
if (info->shared
|
||||||
&& (r_type != R_ARM_PC24
|
&& (r_type != R_ARM_PC24
|
||||||
|| (h != NULL
|
|| (h != NULL
|
||||||
|
@ -1167,7 +1161,6 @@ elf32_arm_final_link_relocate (howto, input_bfd, output_bfd,
|
||||||
if (! relocate)
|
if (! relocate)
|
||||||
return bfd_reloc_ok;
|
return bfd_reloc_ok;
|
||||||
|
|
||||||
|
|
||||||
return _bfd_final_link_relocate (howto, input_bfd, input_section,
|
return _bfd_final_link_relocate (howto, input_bfd, input_section,
|
||||||
contents, rel->r_offset, value,
|
contents, rel->r_offset, value,
|
||||||
(bfd_vma) 0);
|
(bfd_vma) 0);
|
||||||
|
@ -1208,7 +1201,6 @@ elf32_arm_final_link_relocate (howto, input_bfd, output_bfd,
|
||||||
{
|
{
|
||||||
/* The old way of doing things. Trearing the addend as a
|
/* The old way of doing things. Trearing the addend as a
|
||||||
byte sized field and adding in the pipeline offset. */
|
byte sized field and adding in the pipeline offset. */
|
||||||
|
|
||||||
value -= (input_section->output_section->vma
|
value -= (input_section->output_section->vma
|
||||||
+ input_section->output_offset);
|
+ input_section->output_offset);
|
||||||
value -= rel->r_offset;
|
value -= rel->r_offset;
|
||||||
|
@ -1237,7 +1229,6 @@ elf32_arm_final_link_relocate (howto, input_bfd, output_bfd,
|
||||||
Note: None of these operations have knowledge of the pipeline
|
Note: None of these operations have knowledge of the pipeline
|
||||||
size of the processor, thus it is up to the assembler to encode
|
size of the processor, thus it is up to the assembler to encode
|
||||||
this information into the addend. */
|
this information into the addend. */
|
||||||
|
|
||||||
value -= (input_section->output_section->vma
|
value -= (input_section->output_section->vma
|
||||||
+ input_section->output_offset);
|
+ input_section->output_offset);
|
||||||
value -= rel->r_offset;
|
value -= rel->r_offset;
|
||||||
|
@ -1259,7 +1250,6 @@ elf32_arm_final_link_relocate (howto, input_bfd, output_bfd,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Perform a signed range check. */
|
|
||||||
signed_addend = value;
|
signed_addend = value;
|
||||||
signed_addend >>= howto->rightshift;
|
signed_addend >>= howto->rightshift;
|
||||||
|
|
||||||
|
@ -1269,6 +1259,7 @@ elf32_arm_final_link_relocate (howto, input_bfd, output_bfd,
|
||||||
about getting the destination exactly right. */
|
about getting the destination exactly right. */
|
||||||
if (! h || h->root.type != bfd_link_hash_undefweak)
|
if (! h || h->root.type != bfd_link_hash_undefweak)
|
||||||
{
|
{
|
||||||
|
/* Perform a signed range check. */
|
||||||
if ( signed_addend > ((bfd_signed_vma) (howto->dst_mask >> 1))
|
if ( signed_addend > ((bfd_signed_vma) (howto->dst_mask >> 1))
|
||||||
|| signed_addend < - ((bfd_signed_vma) ((howto->dst_mask + 1) >> 1)))
|
|| signed_addend < - ((bfd_signed_vma) ((howto->dst_mask + 1) >> 1)))
|
||||||
return bfd_reloc_overflow;
|
return bfd_reloc_overflow;
|
||||||
|
@ -1371,7 +1362,7 @@ elf32_arm_final_link_relocate (howto, input_bfd, output_bfd,
|
||||||
{
|
{
|
||||||
bfd_vma upper = upper_insn & 0x7ff;
|
bfd_vma upper = upper_insn & 0x7ff;
|
||||||
bfd_vma lower = lower_insn & 0x7ff;
|
bfd_vma lower = lower_insn & 0x7ff;
|
||||||
upper = (upper ^ 0x400) - 0x400; /* sign extend */
|
upper = (upper ^ 0x400) - 0x400; /* Sign extend. */
|
||||||
addend = (upper << 12) | (lower << 1);
|
addend = (upper << 12) | (lower << 1);
|
||||||
signed_addend = addend;
|
signed_addend = addend;
|
||||||
}
|
}
|
||||||
|
@ -1413,7 +1404,7 @@ elf32_arm_final_link_relocate (howto, input_bfd, output_bfd,
|
||||||
|
|
||||||
if (! globals->no_pipeline_knowledge)
|
if (! globals->no_pipeline_knowledge)
|
||||||
{
|
{
|
||||||
Elf_Internal_Ehdr * i_ehdrp; /* Elf file header, internal form */
|
Elf_Internal_Ehdr * i_ehdrp; /* Elf file header, internal form. */
|
||||||
|
|
||||||
i_ehdrp = elf_elfheader (input_bfd);
|
i_ehdrp = elf_elfheader (input_bfd);
|
||||||
|
|
||||||
|
@ -1482,7 +1473,6 @@ elf32_arm_final_link_relocate (howto, input_bfd, output_bfd,
|
||||||
define _GLOBAL_OFFSET_TABLE in a different way, as is
|
define _GLOBAL_OFFSET_TABLE in a different way, as is
|
||||||
permitted by the ABI, we might have to change this
|
permitted by the ABI, we might have to change this
|
||||||
calculation. */
|
calculation. */
|
||||||
|
|
||||||
value -= sgot->output_section->vma;
|
value -= sgot->output_section->vma;
|
||||||
return _bfd_final_link_relocate (howto, input_bfd, input_section,
|
return _bfd_final_link_relocate (howto, input_bfd, input_section,
|
||||||
contents, rel->r_offset, value,
|
contents, rel->r_offset, value,
|
||||||
|
@ -1490,7 +1480,6 @@ elf32_arm_final_link_relocate (howto, input_bfd, output_bfd,
|
||||||
|
|
||||||
case R_ARM_GOTPC:
|
case R_ARM_GOTPC:
|
||||||
/* Use global offset table as symbol value. */
|
/* Use global offset table as symbol value. */
|
||||||
|
|
||||||
BFD_ASSERT (sgot != NULL);
|
BFD_ASSERT (sgot != NULL);
|
||||||
|
|
||||||
if (sgot == NULL)
|
if (sgot == NULL)
|
||||||
|
@ -1527,7 +1516,6 @@ elf32_arm_final_link_relocate (howto, input_bfd, output_bfd,
|
||||||
When doing a dynamic link, we create a .rel.got relocation
|
When doing a dynamic link, we create a .rel.got relocation
|
||||||
entry to initialize the value. This is done in the
|
entry to initialize the value. This is done in the
|
||||||
finish_dynamic_symbol routine. */
|
finish_dynamic_symbol routine. */
|
||||||
|
|
||||||
if ((off & 1) != 0)
|
if ((off & 1) != 0)
|
||||||
off &= ~1;
|
off &= ~1;
|
||||||
else
|
else
|
||||||
|
@ -1770,6 +1758,7 @@ elf32_arm_relocate_section (output_bfd, info, input_bfd, input_section,
|
||||||
h = NULL;
|
h = NULL;
|
||||||
sym = NULL;
|
sym = NULL;
|
||||||
sec = NULL;
|
sec = NULL;
|
||||||
|
|
||||||
if (r_symndx < symtab_hdr->sh_info)
|
if (r_symndx < symtab_hdr->sh_info)
|
||||||
{
|
{
|
||||||
sym = local_syms + r_symndx;
|
sym = local_syms + r_symndx;
|
||||||
|
@ -1781,10 +1770,12 @@ elf32_arm_relocate_section (output_bfd, info, input_bfd, input_section,
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
h = sym_hashes[r_symndx - symtab_hdr->sh_info];
|
h = sym_hashes[r_symndx - symtab_hdr->sh_info];
|
||||||
while (h->root.type == bfd_link_hash_indirect
|
|
||||||
|
while ( h->root.type == bfd_link_hash_indirect
|
||||||
|| h->root.type == bfd_link_hash_warning)
|
|| h->root.type == bfd_link_hash_warning)
|
||||||
h = (struct elf_link_hash_entry *) h->root.u.i.link;
|
h = (struct elf_link_hash_entry *) h->root.u.i.link;
|
||||||
if (h->root.type == bfd_link_hash_defined
|
|
||||||
|
if ( h->root.type == bfd_link_hash_defined
|
||||||
|| h->root.type == bfd_link_hash_defweak)
|
|| h->root.type == bfd_link_hash_defweak)
|
||||||
{
|
{
|
||||||
int relocation_needed = 1;
|
int relocation_needed = 1;
|
||||||
|
@ -1900,19 +1891,19 @@ elf32_arm_relocate_section (output_bfd, info, input_bfd, input_section,
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case bfd_reloc_outofrange:
|
case bfd_reloc_outofrange:
|
||||||
msg = _ ("internal error: out of range error");
|
msg = _("internal error: out of range error");
|
||||||
goto common_error;
|
goto common_error;
|
||||||
|
|
||||||
case bfd_reloc_notsupported:
|
case bfd_reloc_notsupported:
|
||||||
msg = _ ("internal error: unsupported relocation error");
|
msg = _("internal error: unsupported relocation error");
|
||||||
goto common_error;
|
goto common_error;
|
||||||
|
|
||||||
case bfd_reloc_dangerous:
|
case bfd_reloc_dangerous:
|
||||||
msg = _ ("internal error: dangerous error");
|
msg = _("internal error: dangerous error");
|
||||||
goto common_error;
|
goto common_error;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
msg = _ ("internal error: unknown error");
|
msg = _("internal error: unknown error");
|
||||||
/* fall through */
|
/* fall through */
|
||||||
|
|
||||||
common_error:
|
common_error:
|
||||||
|
@ -1940,11 +1931,11 @@ elf32_arm_set_private_flags (abfd, flags)
|
||||||
if (EF_ARM_EABI_VERSION (flags) == EF_ARM_EABI_UNKNOWN)
|
if (EF_ARM_EABI_VERSION (flags) == EF_ARM_EABI_UNKNOWN)
|
||||||
{
|
{
|
||||||
if (flags & EF_INTERWORK)
|
if (flags & EF_INTERWORK)
|
||||||
_bfd_error_handler (_ ("\
|
_bfd_error_handler (_("\
|
||||||
Warning: Not setting interwork flag of %s since it has already been specified as non-interworking"),
|
Warning: Not setting interwork flag of %s since it has already been specified as non-interworking"),
|
||||||
bfd_get_filename (abfd));
|
bfd_get_filename (abfd));
|
||||||
else
|
else
|
||||||
_bfd_error_handler (_ ("\
|
_bfd_error_handler (_("\
|
||||||
Warning: Clearing the interwork flag of %s due to outside request"),
|
Warning: Clearing the interwork flag of %s due to outside request"),
|
||||||
bfd_get_filename (abfd));
|
bfd_get_filename (abfd));
|
||||||
}
|
}
|
||||||
|
@ -1959,6 +1950,7 @@ Warning: Clearing the interwork flag of %s due to outside request"),
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Copy backend specific data from one object module to another. */
|
/* Copy backend specific data from one object module to another. */
|
||||||
|
|
||||||
static boolean
|
static boolean
|
||||||
elf32_arm_copy_private_bfd_data (ibfd, obfd)
|
elf32_arm_copy_private_bfd_data (ibfd, obfd)
|
||||||
bfd *ibfd;
|
bfd *ibfd;
|
||||||
|
@ -1995,7 +1987,7 @@ elf32_arm_copy_private_bfd_data (ibfd, obfd)
|
||||||
if ((in_flags & EF_INTERWORK) != (out_flags & EF_INTERWORK))
|
if ((in_flags & EF_INTERWORK) != (out_flags & EF_INTERWORK))
|
||||||
{
|
{
|
||||||
if (out_flags & EF_INTERWORK)
|
if (out_flags & EF_INTERWORK)
|
||||||
_bfd_error_handler (_ ("\
|
_bfd_error_handler (_("\
|
||||||
Warning: Clearing the interwork flag in %s because non-interworking code in %s has been linked with it"),
|
Warning: Clearing the interwork flag in %s because non-interworking code in %s has been linked with it"),
|
||||||
bfd_get_filename (obfd), bfd_get_filename (ibfd));
|
bfd_get_filename (obfd), bfd_get_filename (ibfd));
|
||||||
|
|
||||||
|
@ -2011,6 +2003,7 @@ Warning: Clearing the interwork flag in %s because non-interworking code in %s h
|
||||||
|
|
||||||
/* Merge backend specific data from an object file to the output
|
/* Merge backend specific data from an object file to the output
|
||||||
object file when linking. */
|
object file when linking. */
|
||||||
|
|
||||||
static boolean
|
static boolean
|
||||||
elf32_arm_merge_private_bfd_data (ibfd, obfd)
|
elf32_arm_merge_private_bfd_data (ibfd, obfd)
|
||||||
bfd * ibfd;
|
bfd * ibfd;
|
||||||
|
@ -2019,7 +2012,7 @@ elf32_arm_merge_private_bfd_data (ibfd, obfd)
|
||||||
flagword out_flags;
|
flagword out_flags;
|
||||||
flagword in_flags;
|
flagword in_flags;
|
||||||
|
|
||||||
/* Check if we have the same endianess */
|
/* Check if we have the same endianess. */
|
||||||
if (_bfd_generic_verify_endian_match (ibfd, obfd) == false)
|
if (_bfd_generic_verify_endian_match (ibfd, obfd) == false)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
@ -2030,7 +2023,7 @@ elf32_arm_merge_private_bfd_data (ibfd, obfd)
|
||||||
/* The input BFD must have had its flags initialised. */
|
/* The input BFD must have had its flags initialised. */
|
||||||
/* The following seems bogus to me -- The flags are initialized in
|
/* The following seems bogus to me -- The flags are initialized in
|
||||||
the assembler but I don't think an elf_flags_init field is
|
the assembler but I don't think an elf_flags_init field is
|
||||||
written into the object */
|
written into the object. */
|
||||||
/* BFD_ASSERT (elf_flags_init (ibfd)); */
|
/* BFD_ASSERT (elf_flags_init (ibfd)); */
|
||||||
|
|
||||||
in_flags = elf_elfheader (ibfd)->e_flags;
|
in_flags = elf_elfheader (ibfd)->e_flags;
|
||||||
|
@ -2076,7 +2069,7 @@ Error: %s compiled for EABI version %d, whereas %s is compiled for version %d"),
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
if ((in_flags & EF_APCS_26) != (out_flags & EF_APCS_26))
|
if ((in_flags & EF_APCS_26) != (out_flags & EF_APCS_26))
|
||||||
_bfd_error_handler (_ ("\
|
_bfd_error_handler (_("\
|
||||||
Error: %s compiled for APCS-%d, whereas %s is compiled for APCS-%d"),
|
Error: %s compiled for APCS-%d, whereas %s is compiled for APCS-%d"),
|
||||||
bfd_get_filename (ibfd),
|
bfd_get_filename (ibfd),
|
||||||
in_flags & EF_APCS_26 ? 26 : 32,
|
in_flags & EF_APCS_26 ? 26 : 32,
|
||||||
|
@ -2084,36 +2077,37 @@ Error: %s compiled for APCS-%d, whereas %s is compiled for APCS-%d"),
|
||||||
out_flags & EF_APCS_26 ? 26 : 32);
|
out_flags & EF_APCS_26 ? 26 : 32);
|
||||||
|
|
||||||
if ((in_flags & EF_APCS_FLOAT) != (out_flags & EF_APCS_FLOAT))
|
if ((in_flags & EF_APCS_FLOAT) != (out_flags & EF_APCS_FLOAT))
|
||||||
_bfd_error_handler (_ ("\
|
_bfd_error_handler (_("\
|
||||||
Error: %s passes floats in %s registers, whereas %s passes them in %s registers"),
|
Error: %s passes floats in %s registers, whereas %s passes them in %s registers"),
|
||||||
bfd_get_filename (ibfd),
|
bfd_get_filename (ibfd),
|
||||||
in_flags & EF_APCS_FLOAT ? _ ("float") : _ ("integer"),
|
in_flags & EF_APCS_FLOAT ? _("float") : _("integer"),
|
||||||
bfd_get_filename (obfd),
|
bfd_get_filename (obfd),
|
||||||
out_flags & EF_APCS_26 ? _ ("float") : _ ("integer"));
|
out_flags & EF_APCS_26 ? _("float") : _("integer"));
|
||||||
|
|
||||||
if ((in_flags & EF_PIC) != (out_flags & EF_PIC))
|
if ((in_flags & EF_PIC) != (out_flags & EF_PIC))
|
||||||
_bfd_error_handler (_ ("\
|
_bfd_error_handler (_("\
|
||||||
Error: %s is compiled as position %s code, whereas %s is not"),
|
Error: %s is compiled as position %s code, whereas %s is not"),
|
||||||
bfd_get_filename (ibfd),
|
bfd_get_filename (ibfd),
|
||||||
in_flags & EF_PIC ? _ ("independent") : _ ("dependent"),
|
in_flags & EF_PIC ? _("independent") : _("dependent"),
|
||||||
bfd_get_filename (obfd));
|
bfd_get_filename (obfd));
|
||||||
|
|
||||||
/* Interworking mismatch is only a warning. */
|
/* Interworking mismatch is only a warning. */
|
||||||
if ((in_flags & EF_INTERWORK) != (out_flags & EF_INTERWORK))
|
if ((in_flags & EF_INTERWORK) != (out_flags & EF_INTERWORK))
|
||||||
{
|
{
|
||||||
_bfd_error_handler (_ ("\
|
_bfd_error_handler (_("\
|
||||||
Warning: %s %s interworking, whereas %s %s"),
|
Warning: %s %s interworking, whereas %s %s"),
|
||||||
bfd_get_filename (ibfd),
|
bfd_get_filename (ibfd),
|
||||||
in_flags & EF_INTERWORK ? _ ("supports") : _ ("does not support"),
|
in_flags & EF_INTERWORK ? _("supports") : _("does not support"),
|
||||||
bfd_get_filename (obfd),
|
bfd_get_filename (obfd),
|
||||||
out_flags & EF_INTERWORK ? _ ("does not") : _ ("does"));
|
out_flags & EF_INTERWORK ? _("does not") : _("does"));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Display the flags field */
|
/* Display the flags field. */
|
||||||
|
|
||||||
static boolean
|
static boolean
|
||||||
elf32_arm_print_private_bfd_data (abfd, ptr)
|
elf32_arm_print_private_bfd_data (abfd, ptr)
|
||||||
bfd *abfd;
|
bfd *abfd;
|
||||||
|
@ -2128,10 +2122,11 @@ elf32_arm_print_private_bfd_data (abfd, ptr)
|
||||||
_bfd_elf_print_private_bfd_data (abfd, ptr);
|
_bfd_elf_print_private_bfd_data (abfd, ptr);
|
||||||
|
|
||||||
flags = elf_elfheader (abfd)->e_flags;
|
flags = elf_elfheader (abfd)->e_flags;
|
||||||
/* Ignore init flag - it may not be set, despite the flags field containing valid data. */
|
/* Ignore init flag - it may not be set, despite the flags field
|
||||||
|
containing valid data. */
|
||||||
|
|
||||||
/* xgettext:c-format */
|
/* xgettext:c-format */
|
||||||
fprintf (file, _ ("private flags = %lx:"), elf_elfheader (abfd)->e_flags);
|
fprintf (file, _("private flags = %lx:"), elf_elfheader (abfd)->e_flags);
|
||||||
|
|
||||||
switch (EF_ARM_EABI_VERSION (flags))
|
switch (EF_ARM_EABI_VERSION (flags))
|
||||||
{
|
{
|
||||||
|
@ -2140,60 +2135,60 @@ elf32_arm_print_private_bfd_data (abfd, ptr)
|
||||||
official ARM ELF extended ABI. Hence they are only decoded if
|
official ARM ELF extended ABI. Hence they are only decoded if
|
||||||
the EABI version is not set. */
|
the EABI version is not set. */
|
||||||
if (flags & EF_INTERWORK)
|
if (flags & EF_INTERWORK)
|
||||||
fprintf (file, _ (" [interworking enabled]"));
|
fprintf (file, _(" [interworking enabled]"));
|
||||||
|
|
||||||
if (flags & EF_APCS_26)
|
if (flags & EF_APCS_26)
|
||||||
fprintf (file, _ (" [APCS-26]"));
|
fprintf (file, _(" [APCS-26]"));
|
||||||
else
|
else
|
||||||
fprintf (file, _ (" [APCS-32]"));
|
fprintf (file, _(" [APCS-32]"));
|
||||||
|
|
||||||
if (flags & EF_APCS_FLOAT)
|
if (flags & EF_APCS_FLOAT)
|
||||||
fprintf (file, _ (" [floats passed in float registers]"));
|
fprintf (file, _(" [floats passed in float registers]"));
|
||||||
|
|
||||||
if (flags & EF_PIC)
|
if (flags & EF_PIC)
|
||||||
fprintf (file, _ (" [position independent]"));
|
fprintf (file, _(" [position independent]"));
|
||||||
|
|
||||||
if (flags & EF_NEW_ABI)
|
if (flags & EF_NEW_ABI)
|
||||||
fprintf (file, _ (" [new ABI]"));
|
fprintf (file, _(" [new ABI]"));
|
||||||
|
|
||||||
if (flags & EF_OLD_ABI)
|
if (flags & EF_OLD_ABI)
|
||||||
fprintf (file, _ (" [old ABI]"));
|
fprintf (file, _(" [old ABI]"));
|
||||||
|
|
||||||
if (flags & EF_SOFT_FLOAT)
|
if (flags & EF_SOFT_FLOAT)
|
||||||
fprintf (file, _ (" [software FP]"));
|
fprintf (file, _(" [software FP]"));
|
||||||
|
|
||||||
flags &= ~(EF_INTERWORK | EF_APCS_26 | EF_APCS_FLOAT | EF_PIC
|
flags &= ~(EF_INTERWORK | EF_APCS_26 | EF_APCS_FLOAT | EF_PIC
|
||||||
| EF_NEW_ABI | EF_OLD_ABI | EF_SOFT_FLOAT);
|
| EF_NEW_ABI | EF_OLD_ABI | EF_SOFT_FLOAT);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case EF_ARM_EABI_VER1:
|
case EF_ARM_EABI_VER1:
|
||||||
fprintf (file, _ (" [Version1 EABI]"));
|
fprintf (file, _(" [Version1 EABI]"));
|
||||||
|
|
||||||
if (flags & EF_ARM_SYMSARESORTED)
|
if (flags & EF_ARM_SYMSARESORTED)
|
||||||
fprintf (file, _ (" [sorted symbol table]"));
|
fprintf (file, _(" [sorted symbol table]"));
|
||||||
else
|
else
|
||||||
fprintf (file, _ (" [unsorted symbol table]"));
|
fprintf (file, _(" [unsorted symbol table]"));
|
||||||
|
|
||||||
flags &= ~ EF_ARM_SYMSARESORTED;
|
flags &= ~ EF_ARM_SYMSARESORTED;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
fprintf (file, _ (" <EABI version unrecognised>"));
|
fprintf (file, _(" <EABI version unrecognised>"));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
flags &= ~ EF_ARM_EABIMASK;
|
flags &= ~ EF_ARM_EABIMASK;
|
||||||
|
|
||||||
if (flags & EF_ARM_RELEXEC)
|
if (flags & EF_ARM_RELEXEC)
|
||||||
fprintf (file, _ (" [relocatable executable]"));
|
fprintf (file, _(" [relocatable executable]"));
|
||||||
|
|
||||||
if (flags & EF_ARM_HASENTRY)
|
if (flags & EF_ARM_HASENTRY)
|
||||||
fprintf (file, _ (" [has entry point]"));
|
fprintf (file, _(" [has entry point]"));
|
||||||
|
|
||||||
flags &= ~ (EF_ARM_RELEXEC | EF_ARM_HASENTRY);
|
flags &= ~ (EF_ARM_RELEXEC | EF_ARM_HASENTRY);
|
||||||
|
|
||||||
if (flags)
|
if (flags)
|
||||||
fprintf (file, _ ("<Unrecognised flag bits set>"));
|
fprintf (file, _("<Unrecognised flag bits set>"));
|
||||||
|
|
||||||
fputc ('\n', file);
|
fputc ('\n', file);
|
||||||
|
|
||||||
|
@ -2311,7 +2306,9 @@ elf32_arm_check_relocs (abfd, info, sec, relocs)
|
||||||
|
|
||||||
symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
|
symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
|
||||||
sym_hashes = elf_sym_hashes (abfd);
|
sym_hashes = elf_sym_hashes (abfd);
|
||||||
sym_hashes_end = sym_hashes + symtab_hdr->sh_size/sizeof(Elf32_External_Sym);
|
sym_hashes_end = sym_hashes
|
||||||
|
+ symtab_hdr->sh_size / sizeof (Elf32_External_Sym);
|
||||||
|
|
||||||
if (!elf_bad_symtab (abfd))
|
if (!elf_bad_symtab (abfd))
|
||||||
sym_hashes_end -= symtab_hdr->sh_info;
|
sym_hashes_end -= symtab_hdr->sh_info;
|
||||||
|
|
||||||
|
@ -2722,7 +2719,6 @@ elf32_arm_adjust_dynamic_symbol (info, h)
|
||||||
|
|
||||||
/* We also need to make an entry in the .got.plt section, which
|
/* We also need to make an entry in the .got.plt section, which
|
||||||
will be placed in the .got section by the linker script. */
|
will be placed in the .got section by the linker script. */
|
||||||
|
|
||||||
s = bfd_get_section_by_name (dynobj, ".got.plt");
|
s = bfd_get_section_by_name (dynobj, ".got.plt");
|
||||||
BFD_ASSERT (s != NULL);
|
BFD_ASSERT (s != NULL);
|
||||||
s->_raw_size += 4;
|
s->_raw_size += 4;
|
||||||
|
@ -2767,7 +2763,6 @@ elf32_arm_adjust_dynamic_symbol (info, h)
|
||||||
determine the address it must put in the global offset table, so
|
determine the address it must put in the global offset table, so
|
||||||
both the dynamic object and the regular object will refer to the
|
both the dynamic object and the regular object will refer to the
|
||||||
same memory location for the variable. */
|
same memory location for the variable. */
|
||||||
|
|
||||||
s = bfd_get_section_by_name (dynobj, ".dynbss");
|
s = bfd_get_section_by_name (dynobj, ".dynbss");
|
||||||
BFD_ASSERT (s != NULL);
|
BFD_ASSERT (s != NULL);
|
||||||
|
|
||||||
|
@ -2980,7 +2975,7 @@ elf32_arm_size_dynamic_sections (output_bfd, info)
|
||||||
|
|
||||||
if (plt)
|
if (plt)
|
||||||
{
|
{
|
||||||
if (! bfd_elf32_add_dynamic_entry (info, DT_PLTGOT, 0)
|
if ( ! bfd_elf32_add_dynamic_entry (info, DT_PLTGOT, 0)
|
||||||
|| ! bfd_elf32_add_dynamic_entry (info, DT_PLTRELSZ, 0)
|
|| ! bfd_elf32_add_dynamic_entry (info, DT_PLTRELSZ, 0)
|
||||||
|| ! bfd_elf32_add_dynamic_entry (info, DT_PLTREL, DT_REL)
|
|| ! bfd_elf32_add_dynamic_entry (info, DT_PLTREL, DT_REL)
|
||||||
|| ! bfd_elf32_add_dynamic_entry (info, DT_JMPREL, 0))
|
|| ! bfd_elf32_add_dynamic_entry (info, DT_JMPREL, 0))
|
||||||
|
@ -2989,7 +2984,7 @@ elf32_arm_size_dynamic_sections (output_bfd, info)
|
||||||
|
|
||||||
if (relocs)
|
if (relocs)
|
||||||
{
|
{
|
||||||
if (! bfd_elf32_add_dynamic_entry (info, DT_REL, 0)
|
if ( ! bfd_elf32_add_dynamic_entry (info, DT_REL, 0)
|
||||||
|| ! bfd_elf32_add_dynamic_entry (info, DT_RELSZ, 0)
|
|| ! bfd_elf32_add_dynamic_entry (info, DT_RELSZ, 0)
|
||||||
|| ! bfd_elf32_add_dynamic_entry (info, DT_RELENT,
|
|| ! bfd_elf32_add_dynamic_entry (info, DT_RELENT,
|
||||||
sizeof (Elf32_External_Rel)))
|
sizeof (Elf32_External_Rel)))
|
||||||
|
@ -3119,7 +3114,6 @@ elf32_arm_finish_dynamic_symbol (output_bfd, info, h, sym)
|
||||||
|
|
||||||
/* This symbol has an entry in the global offset table. Set it
|
/* This symbol has an entry in the global offset table. Set it
|
||||||
up. */
|
up. */
|
||||||
|
|
||||||
sgot = bfd_get_section_by_name (dynobj, ".got");
|
sgot = bfd_get_section_by_name (dynobj, ".got");
|
||||||
srel = bfd_get_section_by_name (dynobj, ".rel.got");
|
srel = bfd_get_section_by_name (dynobj, ".rel.got");
|
||||||
BFD_ASSERT (sgot != NULL && srel != NULL);
|
BFD_ASSERT (sgot != NULL && srel != NULL);
|
||||||
|
@ -3154,7 +3148,6 @@ elf32_arm_finish_dynamic_symbol (output_bfd, info, h, sym)
|
||||||
Elf_Internal_Rel rel;
|
Elf_Internal_Rel rel;
|
||||||
|
|
||||||
/* This symbol needs a copy reloc. Set it up. */
|
/* This symbol needs a copy reloc. Set it up. */
|
||||||
|
|
||||||
BFD_ASSERT (h->dynindx != -1
|
BFD_ASSERT (h->dynindx != -1
|
||||||
&& (h->root.type == bfd_link_hash_defined
|
&& (h->root.type == bfd_link_hash_defined
|
||||||
|| h->root.type == bfd_link_hash_defweak));
|
|| h->root.type == bfd_link_hash_defweak));
|
||||||
|
@ -3208,6 +3201,7 @@ elf32_arm_finish_dynamic_sections (output_bfd, info)
|
||||||
|
|
||||||
dyncon = (Elf32_External_Dyn *) sdyn->contents;
|
dyncon = (Elf32_External_Dyn *) sdyn->contents;
|
||||||
dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->_raw_size);
|
dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->_raw_size);
|
||||||
|
|
||||||
for (; dyncon < dynconend; dyncon++)
|
for (; dyncon < dynconend; dyncon++)
|
||||||
{
|
{
|
||||||
Elf_Internal_Dyn dyn;
|
Elf_Internal_Dyn dyn;
|
||||||
|
@ -3298,7 +3292,7 @@ elf32_arm_post_process_headers (abfd, link_info)
|
||||||
bfd * abfd;
|
bfd * abfd;
|
||||||
struct bfd_link_info * link_info ATTRIBUTE_UNUSED;
|
struct bfd_link_info * link_info ATTRIBUTE_UNUSED;
|
||||||
{
|
{
|
||||||
Elf_Internal_Ehdr * i_ehdrp; /* Elf file header, internal form */
|
Elf_Internal_Ehdr * i_ehdrp; /* ELF file header, internal form. */
|
||||||
|
|
||||||
i_ehdrp = elf_elfheader (abfd);
|
i_ehdrp = elf_elfheader (abfd);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue