* 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> 2004-08-01 Thiemo Seufer <seufer@csv.ica.uni-stuttgart.de>
* elfxx-mips.c (mips_elf_calculate_relocation): Test only for * 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_GOTOFF,
BFD_RELOC_ARM_GOTPC, 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. */ /* Renesas / SuperH SH relocs. Not all of these appear in object files. */
BFD_RELOC_SH_PCDISP8BY2, BFD_RELOC_SH_PCDISP8BY2,
BFD_RELOC_SH_PCDISP12BY2, BFD_RELOC_SH_PCDISP12BY2,

View file

@ -188,16 +188,16 @@ static reloc_howto_type elf32_arm_howto_table[] =
HOWTO (R_ARM_SBREL32, /* type */ HOWTO (R_ARM_SBREL32, /* type */
0, /* rightshift */ 0, /* rightshift */
0, /* size (0 = byte, 1 = short, 2 = long) */ 2, /* size (0 = byte, 1 = short, 2 = long) */
0, /* bitsize */ 32, /* bitsize */
FALSE, /* pc_relative */ FALSE, /* pc_relative */
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_SBREL32", /* name */ "R_ARM_SBREL32", /* name */
FALSE, /* partial_inplace */ FALSE, /* partial_inplace */
0, /* src_mask */ 0xffffffff, /* src_mask */
0, /* dst_mask */ 0xffffffff, /* dst_mask */
FALSE), /* pcrel_offset */ FALSE), /* pcrel_offset */
HOWTO (R_ARM_THM_PC22, /* type */ HOWTO (R_ARM_THM_PC22, /* type */
@ -557,6 +557,90 @@ static reloc_howto_type elf32_arm_howto_table[] =
0x00000fff, /* src_mask */ 0x00000fff, /* src_mask */
0x00000fff, /* dst_mask */ 0x00000fff, /* dst_mask */
TRUE), /* pcrel_offset */ 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 */ /* 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_GOTOFF, R_ARM_GOTOFF},
{BFD_RELOC_ARM_GOTPC, R_ARM_GOTPC}, {BFD_RELOC_ARM_GOTPC, R_ARM_GOTPC},
{BFD_RELOC_ARM_GOT32, R_ARM_GOT32}, {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 * 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_RELATIVE",
"BFD_RELOC_ARM_GOTOFF", "BFD_RELOC_ARM_GOTOFF",
"BFD_RELOC_ARM_GOTPC", "BFD_RELOC_ARM_GOTPC",
"BFD_RELOC_ARM_RELABS32",
"BFD_RELOC_ARM_ROSEGREL32",
"BFD_RELOC_ARM_SBREL32",
"BFD_RELOC_SH_PCDISP8BY2", "BFD_RELOC_SH_PCDISP8BY2",
"BFD_RELOC_SH_PCDISP12BY2", "BFD_RELOC_SH_PCDISP12BY2",
"BFD_RELOC_SH_IMM3", "BFD_RELOC_SH_IMM3",

View file

@ -2608,6 +2608,19 @@ ENUMX
ENUMDOC ENUMDOC
These relocs are only used within the ARM assembler. They are not These relocs are only used within the ARM assembler. They are not
(at present) written to any object files. (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 ENUM
BFD_RELOC_SH_PCDISP8BY2 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> 2004-08-05 Bob Wilson <bob.wilson@acm.org>
* write.c (relax_segment): Use was_address instead of address when * 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_RVA:
case BFD_RELOC_32: 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) if (fixP->fx_done || fixP->fx_pcrel)
md_number_to_chars (buf, value, 4); md_number_to_chars (buf, value, 4);
#ifdef OBJ_ELF #ifdef OBJ_ELF
@ -12774,6 +12777,9 @@ tc_gen_reloc (section, fixp)
case BFD_RELOC_ARM_GOT32: case BFD_RELOC_ARM_GOT32:
case BFD_RELOC_ARM_GOTOFF: case BFD_RELOC_ARM_GOTOFF:
case BFD_RELOC_ARM_PLT32: 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; code = fixp->fx_r_type;
break; break;
#endif #endif
@ -14132,6 +14138,8 @@ arm_parse_reloc ()
/* ScottB: Jan 30, 1998 - Added support for parsing "var(PLT)" /* ScottB: Jan 30, 1998 - Added support for parsing "var(PLT)"
branch instructions generated by GCC for PLT relocs. */ branch instructions generated by GCC for PLT relocs. */
MAP ("(plt)", BFD_RELOC_ARM_PLT32), MAP ("(plt)", BFD_RELOC_ARM_PLT32),
MAP ("(relabs)", BFD_RELOC_ARM_RELABS32),
MAP ("(sbrel)", BFD_RELOC_ARM_SBREL32),
{ NULL, 0, BFD_RELOC_UNUSED } { NULL, 0, BFD_RELOC_UNUSED }
#undef MAP #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> 2004-08-05 Nitin Yewale <nitiny@kpitcummins.com>
* h8300/h8300.exp: Addition of new test case to check rx * 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 c: R_ARM_GOT32 sym
10: R_ARM_GOTOFF sym 10: R_ARM_GOTOFF sym
14: R_ARM_GOTPC _GLOBAL_OFFSET_TABLE_ 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) .word sym(GOTOFF)
1: 1:
.word _GLOBAL_OFFSET_TABLE_ - 1b .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_PCREL7_0, 32)
RELOC_NUMBER (R_ARM_ALU_PCREL15_8, 33) RELOC_NUMBER (R_ARM_ALU_PCREL15_8, 33)
RELOC_NUMBER (R_ARM_ALU_PCREL23_15, 34) RELOC_NUMBER (R_ARM_ALU_PCREL23_15, 34)
RELOC_NUMBER (R_ARM_LDR_SBREL11_0, 35) RELOC_NUMBER (R_ARM_LDR_SBREL_11_0, 35)
RELOC_NUMBER (R_ARM_ALU_SBREL19_12, 36) RELOC_NUMBER (R_ARM_ALU_SBREL_19_12, 36)
RELOC_NUMBER (R_ARM_ALU_SBREL27_20, 37) RELOC_NUMBER (R_ARM_ALU_SBREL_27_20, 37)
FAKE_RELOC (FIRST_INVALID_RELOC2, 38) 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) FAKE_RELOC (LAST_INVALID_RELOC2, 99)
RELOC_NUMBER (R_ARM_GNU_VTENTRY, 100) RELOC_NUMBER (R_ARM_GNU_VTENTRY, 100)
RELOC_NUMBER (R_ARM_GNU_VTINHERIT, 101) RELOC_NUMBER (R_ARM_GNU_VTINHERIT, 101)