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:
Paul Brook 2004-10-27 20:48:22 +00:00
parent fcad0fa40f
commit 5b5bb74101
5 changed files with 154 additions and 37 deletions

View File

@ -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>
PR 475

View File

@ -827,6 +827,10 @@ bfd_elf32_arm_process_before_allocation (bfd *abfd,
/* These are the only relocation types we care about. */
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)
continue;
@ -864,6 +868,10 @@ bfd_elf32_arm_process_before_allocation (bfd *abfd,
switch (r_type)
{
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
the target of the call. If it is a thumb target, we
insert glue. */
@ -1295,6 +1303,8 @@ elf32_arm_final_link_relocate (reloc_howto_type * howto,
case R_ARM_ABS32:
case R_ARM_REL32:
#ifndef OLD_ARM_ABI
case R_ARM_CALL:
case R_ARM_JUMP24:
case R_ARM_XPC25:
case R_ARM_PREL31:
#endif
@ -1344,6 +1354,10 @@ elf32_arm_final_link_relocate (reloc_howto_type * howto,
|| ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
|| h->root.type != bfd_link_hash_undefweak)
&& 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)
{
Elf_Internal_Rela outrel;
@ -1416,6 +1430,8 @@ elf32_arm_final_link_relocate (reloc_howto_type * howto,
{
#ifndef OLD_ARM_ABI
case R_ARM_XPC25: /* Arm BLX instruction. */
case R_ARM_CALL:
case R_ARM_JUMP24:
#endif
case R_ARM_PC24: /* Arm B/BL instruction */
case R_ARM_PLT32:
@ -2028,6 +2044,10 @@ arm_add_to_rel (bfd * abfd,
break;
case R_ARM_PC24:
#ifndef OLD_ARM_ABI
case R_ARM_CALL:
case R_ARM_JUMP24:
#endif
addend <<= howto->size;
addend += increment;
@ -2188,6 +2208,10 @@ elf32_arm_relocate_section (bfd * output_bfd,
switch (r_type)
{
case R_ARM_PC24:
#ifndef OLD_ARM_ABI
case R_ARM_CALL:
case R_ARM_JUMP24:
#endif
case R_ARM_ABS32:
case R_ARM_THM_PC22:
case R_ARM_PLT32:
@ -2861,6 +2885,8 @@ elf32_arm_gc_sweep_hook (bfd * abfd ATTRIBUTE_UNUSED,
case R_ARM_PC24:
case R_ARM_PLT32:
#ifndef OLD_ARM_ABI
case R_ARM_CALL:
case R_ARM_JUMP24:
case R_ARM_PREL31:
#endif
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_PLT32:
#ifndef OLD_ARM_ABI
case R_ARM_CALL:
case R_ARM_JUMP24:
case R_ARM_PREL31:
#endif
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
symbol local. */
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)
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_PLT32
#ifndef OLD_ARM_ABI
&& r_type != R_ARM_CALL
&& r_type != R_ARM_JUMP24
&& r_type != R_ARM_PREL31
#endif
&& r_type != R_ARM_REL32)
@ -3336,9 +3370,9 @@ elf32_arm_adjust_dynamic_symbol (struct bfd_link_info * info,
}
else
/* It's possible that we incorrectly decided a .plt reloc was
needed for an R_ARM_PC24 reloc to a non-function sym in
check_relocs. We can't decide accurately between function and
non-function syms in check-relocs; Objects loaded later in
needed for an R_ARM_PC24 or similar reloc to a non-function sym
in check_relocs. We can't decide accurately between function
and non-function syms in check-relocs; Objects loaded later in
the link may change h->type. So fix it now. */
h->plt.offset = (bfd_vma) -1;

View File

@ -453,9 +453,35 @@ static reloc_howto_type elf32_arm_howto_table[] =
0x00ffffff, /* dst_mask */
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, /* size (0 = byte, 1 = short, 2 = long) */
0, /* bitsize */
@ -463,13 +489,13 @@ static reloc_howto_type elf32_arm_howto_table[] =
0, /* bitpos */
complain_overflow_dont,/* complain_on_overflow */
bfd_elf_generic_reloc, /* special_function */
"R_ARM_RREL32", /* name */
"R_ARM_unknown_30", /* name */
FALSE, /* partial_inplace */
0, /* src_mask */
0, /* dst_mask */
FALSE), /* pcrel_offset */
HOWTO (R_ARM_RABS32, /* type */
HOWTO (R_ARM_NONE, /* type */
0, /* rightshift */
0, /* size (0 = byte, 1 = short, 2 = long) */
0, /* bitsize */
@ -477,35 +503,7 @@ static reloc_howto_type elf32_arm_howto_table[] =
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 */
"R_ARM_unknown_31", /* name */
FALSE, /* partial_inplace */
0, /* src_mask */
0, /* dst_mask */
@ -746,6 +744,66 @@ static reloc_howto_type elf32_arm_got_prel =
0xffffffff, /* dst_mask */
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 *
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:
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:
return NULL;
}

View File

@ -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>
* opcode/crx.h (enum reg): Rearrange registers, remove 'ccfg' and `'pc'.

View File

@ -123,7 +123,9 @@ START_RELOC_NUMBERS (elf_arm_reloc_type)
FAKE_RELOC (FIRST_INVALID_RELOC, 28)
FAKE_RELOC (LAST_INVALID_RELOC, 249)
#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)
RELOC_NUMBER (R_ARM_ALU_PCREL7_0, 32)
RELOC_NUMBER (R_ARM_ALU_PCREL15_8, 33)