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> 2004-10-26 H.J. Lu <hongjiu.lu@intel.com>
PR 475 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. */ /* 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;

View file

@ -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;
} }

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> 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'.

View file

@ -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)