2004-10-27 Richard Earnshaw <rearnsha@arm.com>
bfd/ * elf32-arm.h (bfd_elf32_arm_process_before_allocation): Handle R_ARM_CALL and R_ARM_JUMP24 as aliases of R_ARM_PC24. (elf32_arm_final_link_relocate): Ditto. (arm_add_to_rel, elf32_arm_relocate_section): Ditto. (elf32_arm_gc_sweep_hook, elf32_arm_check_relocs): Ditto (elf32_arm_adjust_dynamic_symbol): Ditto. * elfarm-nabi.c (elf32_arm_howto_table): Add R_ARM_CALL and R_ARM_JUMP32. Move R_ARM_R{REL32,ABS32,PC24,BASE}... (elf32_arm_r_howto): ... To here. (elf32_arm_howto_from_type): Use elf32_arm_r_howto. include/ * elf/arm.h: Add R_ARM_CALL and R_ARM_JUMP32.
This commit is contained in:
parent
fcad0fa40f
commit
5b5bb74101
5 changed files with 154 additions and 37 deletions
|
@ -1,3 +1,16 @@
|
||||||
|
2004-10-27 Richard Earnshaw <rearnsha@arm.com>
|
||||||
|
|
||||||
|
* elf32-arm.h (bfd_elf32_arm_process_before_allocation): Handle
|
||||||
|
R_ARM_CALL and R_ARM_JUMP24 as aliases of R_ARM_PC24.
|
||||||
|
(elf32_arm_final_link_relocate): Ditto.
|
||||||
|
(arm_add_to_rel, elf32_arm_relocate_section): Ditto.
|
||||||
|
(elf32_arm_gc_sweep_hook, elf32_arm_check_relocs): Ditto
|
||||||
|
(elf32_arm_adjust_dynamic_symbol): Ditto.
|
||||||
|
* elfarm-nabi.c (elf32_arm_howto_table): Add R_ARM_CALL and
|
||||||
|
R_ARM_JUMP32. Move R_ARM_R{REL32,ABS32,PC24,BASE}...
|
||||||
|
(elf32_arm_r_howto): ... To here.
|
||||||
|
(elf32_arm_howto_from_type): Use elf32_arm_r_howto.
|
||||||
|
|
||||||
2004-10-26 H.J. Lu <hongjiu.lu@intel.com>
|
2004-10-26 H.J. Lu <hongjiu.lu@intel.com>
|
||||||
|
|
||||||
PR 475
|
PR 475
|
||||||
|
|
|
@ -827,6 +827,10 @@ bfd_elf32_arm_process_before_allocation (bfd *abfd,
|
||||||
|
|
||||||
/* 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
|
||||||
|
#ifndef OLD_ARM_ABI
|
||||||
|
&& r_type != R_ARM_CALL
|
||||||
|
&& r_type != R_ARM_JUMP24
|
||||||
|
#endif
|
||||||
&& r_type != R_ARM_THM_PC22)
|
&& r_type != R_ARM_THM_PC22)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
@ -864,6 +868,10 @@ bfd_elf32_arm_process_before_allocation (bfd *abfd,
|
||||||
switch (r_type)
|
switch (r_type)
|
||||||
{
|
{
|
||||||
case R_ARM_PC24:
|
case R_ARM_PC24:
|
||||||
|
#ifndef OLD_ARM_ABI
|
||||||
|
case R_ARM_CALL:
|
||||||
|
case R_ARM_JUMP24:
|
||||||
|
#endif
|
||||||
/* 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. */
|
||||||
|
@ -1295,6 +1303,8 @@ elf32_arm_final_link_relocate (reloc_howto_type * howto,
|
||||||
case R_ARM_ABS32:
|
case R_ARM_ABS32:
|
||||||
case R_ARM_REL32:
|
case R_ARM_REL32:
|
||||||
#ifndef OLD_ARM_ABI
|
#ifndef OLD_ARM_ABI
|
||||||
|
case R_ARM_CALL:
|
||||||
|
case R_ARM_JUMP24:
|
||||||
case R_ARM_XPC25:
|
case R_ARM_XPC25:
|
||||||
case R_ARM_PREL31:
|
case R_ARM_PREL31:
|
||||||
#endif
|
#endif
|
||||||
|
@ -1344,6 +1354,10 @@ elf32_arm_final_link_relocate (reloc_howto_type * howto,
|
||||||
|| ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
|
|| ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
|
||||||
|| h->root.type != bfd_link_hash_undefweak)
|
|| h->root.type != bfd_link_hash_undefweak)
|
||||||
&& r_type != R_ARM_PC24
|
&& r_type != R_ARM_PC24
|
||||||
|
#ifndef OLD_ARM_ABI
|
||||||
|
&& r_type != R_ARM_CALL
|
||||||
|
&& r_type != R_ARM_JUMP24
|
||||||
|
#endif
|
||||||
&& r_type != R_ARM_PLT32)
|
&& r_type != R_ARM_PLT32)
|
||||||
{
|
{
|
||||||
Elf_Internal_Rela outrel;
|
Elf_Internal_Rela outrel;
|
||||||
|
@ -1416,6 +1430,8 @@ elf32_arm_final_link_relocate (reloc_howto_type * howto,
|
||||||
{
|
{
|
||||||
#ifndef OLD_ARM_ABI
|
#ifndef OLD_ARM_ABI
|
||||||
case R_ARM_XPC25: /* Arm BLX instruction. */
|
case R_ARM_XPC25: /* Arm BLX instruction. */
|
||||||
|
case R_ARM_CALL:
|
||||||
|
case R_ARM_JUMP24:
|
||||||
#endif
|
#endif
|
||||||
case R_ARM_PC24: /* Arm B/BL instruction */
|
case R_ARM_PC24: /* Arm B/BL instruction */
|
||||||
case R_ARM_PLT32:
|
case R_ARM_PLT32:
|
||||||
|
@ -2028,6 +2044,10 @@ arm_add_to_rel (bfd * abfd,
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case R_ARM_PC24:
|
case R_ARM_PC24:
|
||||||
|
#ifndef OLD_ARM_ABI
|
||||||
|
case R_ARM_CALL:
|
||||||
|
case R_ARM_JUMP24:
|
||||||
|
#endif
|
||||||
addend <<= howto->size;
|
addend <<= howto->size;
|
||||||
addend += increment;
|
addend += increment;
|
||||||
|
|
||||||
|
@ -2188,6 +2208,10 @@ elf32_arm_relocate_section (bfd * output_bfd,
|
||||||
switch (r_type)
|
switch (r_type)
|
||||||
{
|
{
|
||||||
case R_ARM_PC24:
|
case R_ARM_PC24:
|
||||||
|
#ifndef OLD_ARM_ABI
|
||||||
|
case R_ARM_CALL:
|
||||||
|
case R_ARM_JUMP24:
|
||||||
|
#endif
|
||||||
case R_ARM_ABS32:
|
case R_ARM_ABS32:
|
||||||
case R_ARM_THM_PC22:
|
case R_ARM_THM_PC22:
|
||||||
case R_ARM_PLT32:
|
case R_ARM_PLT32:
|
||||||
|
@ -2861,6 +2885,8 @@ elf32_arm_gc_sweep_hook (bfd * abfd ATTRIBUTE_UNUSED,
|
||||||
case R_ARM_PC24:
|
case R_ARM_PC24:
|
||||||
case R_ARM_PLT32:
|
case R_ARM_PLT32:
|
||||||
#ifndef OLD_ARM_ABI
|
#ifndef OLD_ARM_ABI
|
||||||
|
case R_ARM_CALL:
|
||||||
|
case R_ARM_JUMP24:
|
||||||
case R_ARM_PREL31:
|
case R_ARM_PREL31:
|
||||||
#endif
|
#endif
|
||||||
r_symndx = ELF32_R_SYM (rel->r_info);
|
r_symndx = ELF32_R_SYM (rel->r_info);
|
||||||
|
@ -3004,6 +3030,8 @@ elf32_arm_check_relocs (bfd *abfd, struct bfd_link_info *info,
|
||||||
case R_ARM_PC24:
|
case R_ARM_PC24:
|
||||||
case R_ARM_PLT32:
|
case R_ARM_PLT32:
|
||||||
#ifndef OLD_ARM_ABI
|
#ifndef OLD_ARM_ABI
|
||||||
|
case R_ARM_CALL:
|
||||||
|
case R_ARM_JUMP24:
|
||||||
case R_ARM_PREL31:
|
case R_ARM_PREL31:
|
||||||
#endif
|
#endif
|
||||||
if (h != NULL)
|
if (h != NULL)
|
||||||
|
@ -3022,6 +3050,10 @@ elf32_arm_check_relocs (bfd *abfd, struct bfd_link_info *info,
|
||||||
sure yet, because something later might force the
|
sure yet, because something later might force the
|
||||||
symbol local. */
|
symbol local. */
|
||||||
if (r_type == R_ARM_PC24
|
if (r_type == R_ARM_PC24
|
||||||
|
#ifndef OLD_ARM_ABI
|
||||||
|
|| r_type == R_ARM_CALL
|
||||||
|
|| r_type == R_ARM_JUMP24
|
||||||
|
#endif
|
||||||
|| r_type == R_ARM_PLT32)
|
|| r_type == R_ARM_PLT32)
|
||||||
h->needs_plt = 1;
|
h->needs_plt = 1;
|
||||||
|
|
||||||
|
@ -3047,6 +3079,8 @@ elf32_arm_check_relocs (bfd *abfd, struct bfd_link_info *info,
|
||||||
&& ((r_type != R_ARM_PC24
|
&& ((r_type != R_ARM_PC24
|
||||||
&& r_type != R_ARM_PLT32
|
&& r_type != R_ARM_PLT32
|
||||||
#ifndef OLD_ARM_ABI
|
#ifndef OLD_ARM_ABI
|
||||||
|
&& r_type != R_ARM_CALL
|
||||||
|
&& r_type != R_ARM_JUMP24
|
||||||
&& r_type != R_ARM_PREL31
|
&& r_type != R_ARM_PREL31
|
||||||
#endif
|
#endif
|
||||||
&& r_type != R_ARM_REL32)
|
&& r_type != R_ARM_REL32)
|
||||||
|
@ -3336,9 +3370,9 @@ elf32_arm_adjust_dynamic_symbol (struct bfd_link_info * info,
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
/* It's possible that we incorrectly decided a .plt reloc was
|
/* It's possible that we incorrectly decided a .plt reloc was
|
||||||
needed for an R_ARM_PC24 reloc to a non-function sym in
|
needed for an R_ARM_PC24 or similar reloc to a non-function sym
|
||||||
check_relocs. We can't decide accurately between function and
|
in check_relocs. We can't decide accurately between function
|
||||||
non-function syms in check-relocs; Objects loaded later in
|
and non-function syms in check-relocs; Objects loaded later in
|
||||||
the link may change h->type. So fix it now. */
|
the link may change h->type. So fix it now. */
|
||||||
h->plt.offset = (bfd_vma) -1;
|
h->plt.offset = (bfd_vma) -1;
|
||||||
|
|
||||||
|
|
|
@ -453,9 +453,35 @@ static reloc_howto_type elf32_arm_howto_table[] =
|
||||||
0x00ffffff, /* dst_mask */
|
0x00ffffff, /* dst_mask */
|
||||||
TRUE), /* pcrel_offset */
|
TRUE), /* pcrel_offset */
|
||||||
|
|
||||||
/* End of relocs used in ARM Linux */
|
HOWTO (R_ARM_CALL, /* type */
|
||||||
|
2, /* rightshift */
|
||||||
|
2, /* size (0 = byte, 1 = short, 2 = long) */
|
||||||
|
24, /* bitsize */
|
||||||
|
TRUE, /* pc_relative */
|
||||||
|
0, /* bitpos */
|
||||||
|
complain_overflow_signed,/* complain_on_overflow */
|
||||||
|
bfd_elf_generic_reloc, /* special_function */
|
||||||
|
"R_ARM_CALL", /* name */
|
||||||
|
FALSE, /* partial_inplace */
|
||||||
|
0x00ffffff, /* src_mask */
|
||||||
|
0x00ffffff, /* dst_mask */
|
||||||
|
TRUE), /* pcrel_offset */
|
||||||
|
|
||||||
HOWTO (R_ARM_RREL32, /* type */
|
HOWTO (R_ARM_JUMP24, /* type */
|
||||||
|
2, /* rightshift */
|
||||||
|
2, /* size (0 = byte, 1 = short, 2 = long) */
|
||||||
|
24, /* bitsize */
|
||||||
|
TRUE, /* pc_relative */
|
||||||
|
0, /* bitpos */
|
||||||
|
complain_overflow_signed,/* complain_on_overflow */
|
||||||
|
bfd_elf_generic_reloc, /* special_function */
|
||||||
|
"R_ARM_JUMP24", /* name */
|
||||||
|
FALSE, /* partial_inplace */
|
||||||
|
0x00ffffff, /* src_mask */
|
||||||
|
0x00ffffff, /* dst_mask */
|
||||||
|
TRUE), /* pcrel_offset */
|
||||||
|
|
||||||
|
HOWTO (R_ARM_NONE, /* type */
|
||||||
0, /* rightshift */
|
0, /* rightshift */
|
||||||
0, /* size (0 = byte, 1 = short, 2 = long) */
|
0, /* size (0 = byte, 1 = short, 2 = long) */
|
||||||
0, /* bitsize */
|
0, /* bitsize */
|
||||||
|
@ -463,13 +489,13 @@ static reloc_howto_type elf32_arm_howto_table[] =
|
||||||
0, /* bitpos */
|
0, /* bitpos */
|
||||||
complain_overflow_dont,/* complain_on_overflow */
|
complain_overflow_dont,/* complain_on_overflow */
|
||||||
bfd_elf_generic_reloc, /* special_function */
|
bfd_elf_generic_reloc, /* special_function */
|
||||||
"R_ARM_RREL32", /* name */
|
"R_ARM_unknown_30", /* name */
|
||||||
FALSE, /* partial_inplace */
|
FALSE, /* partial_inplace */
|
||||||
0, /* src_mask */
|
0, /* src_mask */
|
||||||
0, /* dst_mask */
|
0, /* dst_mask */
|
||||||
FALSE), /* pcrel_offset */
|
FALSE), /* pcrel_offset */
|
||||||
|
|
||||||
HOWTO (R_ARM_RABS32, /* type */
|
HOWTO (R_ARM_NONE, /* type */
|
||||||
0, /* rightshift */
|
0, /* rightshift */
|
||||||
0, /* size (0 = byte, 1 = short, 2 = long) */
|
0, /* size (0 = byte, 1 = short, 2 = long) */
|
||||||
0, /* bitsize */
|
0, /* bitsize */
|
||||||
|
@ -477,35 +503,7 @@ static reloc_howto_type elf32_arm_howto_table[] =
|
||||||
0, /* bitpos */
|
0, /* bitpos */
|
||||||
complain_overflow_dont,/* complain_on_overflow */
|
complain_overflow_dont,/* complain_on_overflow */
|
||||||
bfd_elf_generic_reloc, /* special_function */
|
bfd_elf_generic_reloc, /* special_function */
|
||||||
"R_ARM_RABS32", /* name */
|
"R_ARM_unknown_31", /* name */
|
||||||
FALSE, /* partial_inplace */
|
|
||||||
0, /* src_mask */
|
|
||||||
0, /* dst_mask */
|
|
||||||
FALSE), /* pcrel_offset */
|
|
||||||
|
|
||||||
HOWTO (R_ARM_RPC24, /* type */
|
|
||||||
0, /* rightshift */
|
|
||||||
0, /* size (0 = byte, 1 = short, 2 = long) */
|
|
||||||
0, /* bitsize */
|
|
||||||
FALSE, /* pc_relative */
|
|
||||||
0, /* bitpos */
|
|
||||||
complain_overflow_dont,/* complain_on_overflow */
|
|
||||||
bfd_elf_generic_reloc, /* special_function */
|
|
||||||
"R_ARM_RPC24", /* name */
|
|
||||||
FALSE, /* partial_inplace */
|
|
||||||
0, /* src_mask */
|
|
||||||
0, /* dst_mask */
|
|
||||||
FALSE), /* pcrel_offset */
|
|
||||||
|
|
||||||
HOWTO (R_ARM_RBASE, /* type */
|
|
||||||
0, /* rightshift */
|
|
||||||
0, /* size (0 = byte, 1 = short, 2 = long) */
|
|
||||||
0, /* bitsize */
|
|
||||||
FALSE, /* pc_relative */
|
|
||||||
0, /* bitpos */
|
|
||||||
complain_overflow_dont,/* complain_on_overflow */
|
|
||||||
bfd_elf_generic_reloc, /* special_function */
|
|
||||||
"R_ARM_RBASE", /* name */
|
|
||||||
FALSE, /* partial_inplace */
|
FALSE, /* partial_inplace */
|
||||||
0, /* src_mask */
|
0, /* src_mask */
|
||||||
0, /* dst_mask */
|
0, /* dst_mask */
|
||||||
|
@ -746,6 +744,66 @@ static reloc_howto_type elf32_arm_got_prel =
|
||||||
0xffffffff, /* dst_mask */
|
0xffffffff, /* dst_mask */
|
||||||
TRUE); /* pcrel_offset */
|
TRUE); /* pcrel_offset */
|
||||||
|
|
||||||
|
/* Currently unused relocations. */
|
||||||
|
static reloc_howto_type elf32_arm_r_howto[4] =
|
||||||
|
{
|
||||||
|
HOWTO (R_ARM_RREL32, /* type */
|
||||||
|
0, /* rightshift */
|
||||||
|
0, /* size (0 = byte, 1 = short, 2 = long) */
|
||||||
|
0, /* bitsize */
|
||||||
|
FALSE, /* pc_relative */
|
||||||
|
0, /* bitpos */
|
||||||
|
complain_overflow_dont,/* complain_on_overflow */
|
||||||
|
bfd_elf_generic_reloc, /* special_function */
|
||||||
|
"R_ARM_RREL32", /* name */
|
||||||
|
FALSE, /* partial_inplace */
|
||||||
|
0, /* src_mask */
|
||||||
|
0, /* dst_mask */
|
||||||
|
FALSE), /* pcrel_offset */
|
||||||
|
|
||||||
|
HOWTO (R_ARM_RABS32, /* type */
|
||||||
|
0, /* rightshift */
|
||||||
|
0, /* size (0 = byte, 1 = short, 2 = long) */
|
||||||
|
0, /* bitsize */
|
||||||
|
FALSE, /* pc_relative */
|
||||||
|
0, /* bitpos */
|
||||||
|
complain_overflow_dont,/* complain_on_overflow */
|
||||||
|
bfd_elf_generic_reloc, /* special_function */
|
||||||
|
"R_ARM_RABS32", /* name */
|
||||||
|
FALSE, /* partial_inplace */
|
||||||
|
0, /* src_mask */
|
||||||
|
0, /* dst_mask */
|
||||||
|
FALSE), /* pcrel_offset */
|
||||||
|
|
||||||
|
HOWTO (R_ARM_RPC24, /* type */
|
||||||
|
0, /* rightshift */
|
||||||
|
0, /* size (0 = byte, 1 = short, 2 = long) */
|
||||||
|
0, /* bitsize */
|
||||||
|
FALSE, /* pc_relative */
|
||||||
|
0, /* bitpos */
|
||||||
|
complain_overflow_dont,/* complain_on_overflow */
|
||||||
|
bfd_elf_generic_reloc, /* special_function */
|
||||||
|
"R_ARM_RPC24", /* name */
|
||||||
|
FALSE, /* partial_inplace */
|
||||||
|
0, /* src_mask */
|
||||||
|
0, /* dst_mask */
|
||||||
|
FALSE), /* pcrel_offset */
|
||||||
|
|
||||||
|
HOWTO (R_ARM_RBASE, /* type */
|
||||||
|
0, /* rightshift */
|
||||||
|
0, /* size (0 = byte, 1 = short, 2 = long) */
|
||||||
|
0, /* bitsize */
|
||||||
|
FALSE, /* pc_relative */
|
||||||
|
0, /* bitpos */
|
||||||
|
complain_overflow_dont,/* complain_on_overflow */
|
||||||
|
bfd_elf_generic_reloc, /* special_function */
|
||||||
|
"R_ARM_RBASE", /* name */
|
||||||
|
FALSE, /* partial_inplace */
|
||||||
|
0, /* src_mask */
|
||||||
|
0, /* dst_mask */
|
||||||
|
FALSE) /* pcrel_offset */
|
||||||
|
};
|
||||||
|
|
||||||
static reloc_howto_type *
|
static reloc_howto_type *
|
||||||
elf32_arm_howto_from_type (unsigned int r_type)
|
elf32_arm_howto_from_type (unsigned int r_type)
|
||||||
{
|
{
|
||||||
|
@ -769,6 +827,12 @@ elf32_arm_howto_from_type (unsigned int r_type)
|
||||||
case R_ARM_THM_PC9:
|
case R_ARM_THM_PC9:
|
||||||
return &elf32_arm_thm_pc9_howto;
|
return &elf32_arm_thm_pc9_howto;
|
||||||
|
|
||||||
|
case R_ARM_RREL32:
|
||||||
|
case R_ARM_RABS32:
|
||||||
|
case R_ARM_RPC24:
|
||||||
|
case R_ARM_RBASE:
|
||||||
|
return &elf32_arm_r_howto[r_type - R_ARM_RREL32];
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,3 +1,7 @@
|
||||||
|
2004-10-27 Richard Earnshaw <rearnsha@arm.com>
|
||||||
|
|
||||||
|
* elf/arm.h: Add R_ARM_CALL and R_ARM_JUMP32.
|
||||||
|
|
||||||
2004-10-27 Tomer Levi <Tomer.Levi@nsc.com>
|
2004-10-27 Tomer Levi <Tomer.Levi@nsc.com>
|
||||||
|
|
||||||
* opcode/crx.h (enum reg): Rearrange registers, remove 'ccfg' and `'pc'.
|
* opcode/crx.h (enum reg): Rearrange registers, remove 'ccfg' and `'pc'.
|
||||||
|
|
|
@ -123,7 +123,9 @@ START_RELOC_NUMBERS (elf_arm_reloc_type)
|
||||||
FAKE_RELOC (FIRST_INVALID_RELOC, 28)
|
FAKE_RELOC (FIRST_INVALID_RELOC, 28)
|
||||||
FAKE_RELOC (LAST_INVALID_RELOC, 249)
|
FAKE_RELOC (LAST_INVALID_RELOC, 249)
|
||||||
#else /* not OLD_ARM_ABI */
|
#else /* not OLD_ARM_ABI */
|
||||||
FAKE_RELOC (FIRST_INVALID_RELOC1, 28)
|
RELOC_NUMBER (R_ARM_CALL, 28)
|
||||||
|
RELOC_NUMBER (R_ARM_JUMP24, 29)
|
||||||
|
FAKE_RELOC (FIRST_INVALID_RELOC1, 30)
|
||||||
FAKE_RELOC (LAST_INVALID_RELOC1, 31)
|
FAKE_RELOC (LAST_INVALID_RELOC1, 31)
|
||||||
RELOC_NUMBER (R_ARM_ALU_PCREL7_0, 32)
|
RELOC_NUMBER (R_ARM_ALU_PCREL7_0, 32)
|
||||||
RELOC_NUMBER (R_ARM_ALU_PCREL15_8, 33)
|
RELOC_NUMBER (R_ARM_ALU_PCREL15_8, 33)
|
||||||
|
|
Loading…
Add table
Reference in a new issue