* elfarm-nabi.c (elf32_arm_howto_table): Add new EABI relocations.
	(elf32_arm_reloc_map): Add BFD_RELOC_ARM_RELABS32,
	BFD_RELOC_ARM_ROSEGREL32 and BFD_RELOC_ARM_SBREL32.
	* reloc.c: Add BFD_RELOC_ARM_RELABS32, BFD_RELOC_ARM_ROSEGREL32
	and BFD_RELOC_ARM_SBREL32.
	* bfd-in2.h, bbfd.h: Regenerate.
gas/
	* config/tc-arm.c (md_apply_fix3, tc_gen_reloc, arm_parse_reloc):
	Handle new relocations.
	* include/elf/arm.h (elf_arm_reloc_type): Add new EABI relocations.
gas/testsuite/
	* gas/arm/pic.s,d: Test RELABS and SBREL relocations.
This commit is contained in:
Paul Brook 2004-08-06 16:18:11 +00:00
parent deaa6723d2
commit db6579d415
11 changed files with 158 additions and 9 deletions

View File

@ -1,3 +1,12 @@
2004-08-06 Paul Brook <paul@codesourcery.com>
* elfarm-nabi.c (elf32_arm_howto_table): Add new EABI relocations.
(elf32_arm_reloc_map): Add BFD_RELOC_ARM_RELABS32,
BFD_RELOC_ARM_ROSEGREL32 and BFD_RELOC_ARM_SBREL32.
* reloc.c: Add BFD_RELOC_ARM_RELABS32, BFD_RELOC_ARM_ROSEGREL32
and BFD_RELOC_ARM_SBREL32.
* bfd-in2.h, bbfd.h: Regenerate.
2004-08-01 Thiemo Seufer <seufer@csv.ica.uni-stuttgart.de>
* elfxx-mips.c (mips_elf_calculate_relocation): Test only for

View File

@ -2639,6 +2639,16 @@ field in the instruction. */
BFD_RELOC_ARM_GOTOFF,
BFD_RELOC_ARM_GOTPC,
/* PC-relative or absolute relocation depending on target. Used for
entries in .init_array sections. */
BFD_RELOC_ARM_RELABS32,
/* Read-only segment base relative address. */
BFD_RELOC_ARM_ROSEGREL32,
/* Data segment base relative address. */
BFD_RELOC_ARM_SBREL32,
/* Renesas / SuperH SH relocs. Not all of these appear in object files. */
BFD_RELOC_SH_PCDISP8BY2,
BFD_RELOC_SH_PCDISP12BY2,

View File

@ -188,16 +188,16 @@ static reloc_howto_type elf32_arm_howto_table[] =
HOWTO (R_ARM_SBREL32, /* type */
0, /* rightshift */
0, /* size (0 = byte, 1 = short, 2 = long) */
0, /* bitsize */
2, /* size (0 = byte, 1 = short, 2 = long) */
32, /* bitsize */
FALSE, /* pc_relative */
0, /* bitpos */
complain_overflow_dont,/* complain_on_overflow */
bfd_elf_generic_reloc, /* special_function */
"R_ARM_SBREL32", /* name */
FALSE, /* partial_inplace */
0, /* src_mask */
0, /* dst_mask */
0xffffffff, /* src_mask */
0xffffffff, /* dst_mask */
FALSE), /* pcrel_offset */
HOWTO (R_ARM_THM_PC22, /* type */
@ -557,6 +557,90 @@ static reloc_howto_type elf32_arm_howto_table[] =
0x00000fff, /* src_mask */
0x00000fff, /* dst_mask */
TRUE), /* pcrel_offset */
HOWTO (R_ARM_LDR_SBREL_11_0, /* type */
0, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
12, /* bitsize */
FALSE, /* pc_relative */
0, /* bitpos */
complain_overflow_dont,/* complain_on_overflow */
bfd_elf_generic_reloc, /* special_function */
"R_ARM_LDR_SBREL_11_0",/* name */
FALSE, /* partial_inplace */
0x00000fff, /* src_mask */
0x00000fff, /* dst_mask */
FALSE), /* pcrel_offset */
HOWTO (R_ARM_ALU_SBREL_19_12, /* type */
0, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
8, /* bitsize */
FALSE, /* pc_relative */
12, /* bitpos */
complain_overflow_dont,/* complain_on_overflow */
bfd_elf_generic_reloc, /* special_function */
"R_ARM_ALU_SBREL_19_12",/* name */
FALSE, /* partial_inplace */
0x000ff000, /* src_mask */
0x000ff000, /* dst_mask */
FALSE), /* pcrel_offset */
HOWTO (R_ARM_ALU_SBREL_27_20, /* type */
0, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
8, /* bitsize */
FALSE, /* pc_relative */
20, /* bitpos */
complain_overflow_dont,/* complain_on_overflow */
bfd_elf_generic_reloc, /* special_function */
"R_ARM_ALU_SBREL_27_20",/* name */
FALSE, /* partial_inplace */
0x0ff00000, /* src_mask */
0x0ff00000, /* dst_mask */
FALSE), /* pcrel_offset */
HOWTO (R_ARM_RELABS32, /* type */
0, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
32, /* bitsize */
FALSE, /* pc_relative */
0, /* bitpos */
complain_overflow_dont,/* complain_on_overflow */
bfd_elf_generic_reloc, /* special_function */
"R_ARM_RELABS32", /* name */
FALSE, /* partial_inplace */
0xffffffff, /* src_mask */
0xffffffff, /* dst_mask */
FALSE), /* pcrel_offset */
HOWTO (R_ARM_ROSEGREL32, /* type */
0, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
32, /* bitsize */
FALSE, /* pc_relative */
0, /* bitpos */
complain_overflow_dont,/* complain_on_overflow */
bfd_elf_generic_reloc, /* special_function */
"R_ARM_ROSEGREL32", /* name */
FALSE, /* partial_inplace */
0xffffffff, /* src_mask */
0xffffffff, /* dst_mask */
FALSE), /* pcrel_offset */
HOWTO (R_ARM_V4BX, /* type */
0, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
32, /* bitsize */
FALSE, /* pc_relative */
0, /* bitpos */
complain_overflow_dont,/* complain_on_overflow */
bfd_elf_generic_reloc, /* special_function */
"R_ARM_V4BX", /* name */
FALSE, /* partial_inplace */
0xffffffff, /* src_mask */
0xffffffff, /* dst_mask */
FALSE), /* pcrel_offset */
};
/* GNU extension to record C++ vtable hierarchy */
@ -689,7 +773,10 @@ static const struct elf32_arm_reloc_map elf32_arm_reloc_map[] =
{BFD_RELOC_ARM_GOTOFF, R_ARM_GOTOFF},
{BFD_RELOC_ARM_GOTPC, R_ARM_GOTPC},
{BFD_RELOC_ARM_GOT32, R_ARM_GOT32},
{BFD_RELOC_ARM_PLT32, R_ARM_PLT32}
{BFD_RELOC_ARM_PLT32, R_ARM_PLT32},
{BFD_RELOC_ARM_RELABS32, R_ARM_RELABS32},
{BFD_RELOC_ARM_ROSEGREL32, R_ARM_ROSEGREL32},
{BFD_RELOC_ARM_SBREL32, R_ARM_SBREL32}
};
static reloc_howto_type *

View File

@ -1134,6 +1134,9 @@ static const char *const bfd_reloc_code_real_names[] = { "@@uninitialized@@",
"BFD_RELOC_ARM_RELATIVE",
"BFD_RELOC_ARM_GOTOFF",
"BFD_RELOC_ARM_GOTPC",
"BFD_RELOC_ARM_RELABS32",
"BFD_RELOC_ARM_ROSEGREL32",
"BFD_RELOC_ARM_SBREL32",
"BFD_RELOC_SH_PCDISP8BY2",
"BFD_RELOC_SH_PCDISP12BY2",
"BFD_RELOC_SH_IMM3",

View File

@ -2608,6 +2608,19 @@ ENUMX
ENUMDOC
These relocs are only used within the ARM assembler. They are not
(at present) written to any object files.
ENUM
BFD_RELOC_ARM_RELABS32
ENUMDOC
Pc-relative or absolute relocation depending on target. Used for
entries in .init_array sections.
ENUM
BFD_RELOC_ARM_ROSEGREL32
ENUMDOC
Read-only segment base relative address.
ENUM
BFD_RELOC_ARM_SBREL32
ENUMDOC
Data segment base relative address.
ENUM
BFD_RELOC_SH_PCDISP8BY2

View File

@ -1,3 +1,9 @@
2004-08-06 Paul Brook <paul@codesourcery.com>
* config/tc-arm.c (md_apply_fix3, tc_gen_reloc, arm_parse_reloc):
Handle new relocations.
* include/elf/arm.h (elf_arm_reloc_type): Add new EABI relocations.
2004-08-05 Bob Wilson <bob.wilson@acm.org>
* write.c (relax_segment): Use was_address instead of address when

View File

@ -12487,6 +12487,9 @@ md_apply_fix3 (fixP, valP, seg)
case BFD_RELOC_RVA:
case BFD_RELOC_32:
case BFD_RELOC_ARM_RELABS32:
case BFD_RELOC_ARM_ROSEGREL32:
case BFD_RELOC_ARM_SBREL32:
if (fixP->fx_done || fixP->fx_pcrel)
md_number_to_chars (buf, value, 4);
#ifdef OBJ_ELF
@ -12774,6 +12777,9 @@ tc_gen_reloc (section, fixp)
case BFD_RELOC_ARM_GOT32:
case BFD_RELOC_ARM_GOTOFF:
case BFD_RELOC_ARM_PLT32:
case BFD_RELOC_ARM_RELABS32:
case BFD_RELOC_ARM_ROSEGREL32:
case BFD_RELOC_ARM_SBREL32:
code = fixp->fx_r_type;
break;
#endif
@ -14132,6 +14138,8 @@ arm_parse_reloc ()
/* ScottB: Jan 30, 1998 - Added support for parsing "var(PLT)"
branch instructions generated by GCC for PLT relocs. */
MAP ("(plt)", BFD_RELOC_ARM_PLT32),
MAP ("(relabs)", BFD_RELOC_ARM_RELABS32),
MAP ("(sbrel)", BFD_RELOC_ARM_SBREL32),
{ NULL, 0, BFD_RELOC_UNUSED }
#undef MAP
};

View File

@ -1,3 +1,7 @@
2004-08-06 Paul Brook <paul@codesourcery.com>
* gas/arm/pic.s,d: Test RELABS and SBREL relocations.
2004-08-05 Nitin Yewale <nitiny@kpitcummins.com>
* h8300/h8300.exp: Addition of new test case to check rx

View File

@ -15,3 +15,5 @@ Disassembly of section .text:
c: R_ARM_GOT32 sym
10: R_ARM_GOTOFF sym
14: R_ARM_GOTPC _GLOBAL_OFFSET_TABLE_
18: R_ARM_RELABS32 foo2
1c: R_ARM_SBREL32 foo3

View File

@ -9,3 +9,5 @@
.word sym(GOTOFF)
1:
.word _GLOBAL_OFFSET_TABLE_ - 1b
.word foo2(RELABS)
.word foo3(SBREL)

View File

@ -124,10 +124,15 @@ START_RELOC_NUMBERS (elf_arm_reloc_type)
RELOC_NUMBER (R_ARM_ALU_PCREL7_0, 32)
RELOC_NUMBER (R_ARM_ALU_PCREL15_8, 33)
RELOC_NUMBER (R_ARM_ALU_PCREL23_15, 34)
RELOC_NUMBER (R_ARM_LDR_SBREL11_0, 35)
RELOC_NUMBER (R_ARM_ALU_SBREL19_12, 36)
RELOC_NUMBER (R_ARM_ALU_SBREL27_20, 37)
FAKE_RELOC (FIRST_INVALID_RELOC2, 38)
RELOC_NUMBER (R_ARM_LDR_SBREL_11_0, 35)
RELOC_NUMBER (R_ARM_ALU_SBREL_19_12, 36)
RELOC_NUMBER (R_ARM_ALU_SBREL_27_20, 37)
RELOC_NUMBER (R_ARM_RELABS32, 38)
RELOC_NUMBER (R_ARM_ROSEGREL32, 39)
RELOC_NUMBER (R_ARM_V4BX, 40)
RELOC_NUMBER (R_ARM_STKCHK, 41)
RELOC_NUMBER (R_ARM_THM_STKCHK, 42)
FAKE_RELOC (FIRST_INVALID_RELOC2, 43)
FAKE_RELOC (LAST_INVALID_RELOC2, 99)
RELOC_NUMBER (R_ARM_GNU_VTENTRY, 100)
RELOC_NUMBER (R_ARM_GNU_VTINHERIT, 101)