From 6ae644278840e277da797f9076c848d1cbc07f57 Mon Sep 17 00:00:00 2001 From: Paul Brook Date: Fri, 6 Aug 2004 16:18:11 +0000 Subject: [PATCH] bfd/ * 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. --- bfd/ChangeLog | 9 +++++ bfd/bfd-in2.h | 10 +++++ bfd/elfarm-nabi.c | 97 ++++++++++++++++++++++++++++++++++++++++++--- bfd/libbfd.h | 3 ++ bfd/reloc.c | 13 ++++++ gas/ChangeLog | 6 +++ gas/config/tc-arm.c | 8 ++++ gas/testsuite/ChangeLog | 4 ++ gas/testsuite/gas/arm/pic.d | 2 + gas/testsuite/gas/arm/pic.s | 2 + include/elf/arm.h | 13 ++++-- 11 files changed, 158 insertions(+), 9 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index c431b3ec1..42132adf0 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,12 @@ +2004-08-06 Paul Brook + + * 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 * elfxx-mips.c (mips_elf_calculate_relocation): Test only for diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h index 8f5d59bda..f2ec29d71 100644 --- a/bfd/bfd-in2.h +++ b/bfd/bfd-in2.h @@ -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, diff --git a/bfd/elfarm-nabi.c b/bfd/elfarm-nabi.c index e2e34f3f6..1abe9b1a2 100644 --- a/bfd/elfarm-nabi.c +++ b/bfd/elfarm-nabi.c @@ -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 * diff --git a/bfd/libbfd.h b/bfd/libbfd.h index f3bd57af4..de3ead65d 100644 --- a/bfd/libbfd.h +++ b/bfd/libbfd.h @@ -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", diff --git a/bfd/reloc.c b/bfd/reloc.c index 74492f028..48166db51 100644 --- a/bfd/reloc.c +++ b/bfd/reloc.c @@ -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 diff --git a/gas/ChangeLog b/gas/ChangeLog index f221a1580..4361aa3a1 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,9 @@ +2004-08-06 Paul Brook + + * 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 * write.c (relax_segment): Use was_address instead of address when diff --git a/gas/config/tc-arm.c b/gas/config/tc-arm.c index 96cf3ca7b..f7eeca7d7 100644 --- a/gas/config/tc-arm.c +++ b/gas/config/tc-arm.c @@ -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 }; diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog index f0679ebc3..f91cf6d1b 100644 --- a/gas/testsuite/ChangeLog +++ b/gas/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2004-08-06 Paul Brook + + * gas/arm/pic.s,d: Test RELABS and SBREL relocations. + 2004-08-05 Nitin Yewale * h8300/h8300.exp: Addition of new test case to check rx diff --git a/gas/testsuite/gas/arm/pic.d b/gas/testsuite/gas/arm/pic.d index 6c4a04330..bd69d1bbd 100644 --- a/gas/testsuite/gas/arm/pic.d +++ b/gas/testsuite/gas/arm/pic.d @@ -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 diff --git a/gas/testsuite/gas/arm/pic.s b/gas/testsuite/gas/arm/pic.s index f538908e9..8d0842cfc 100644 --- a/gas/testsuite/gas/arm/pic.s +++ b/gas/testsuite/gas/arm/pic.s @@ -9,3 +9,5 @@ .word sym(GOTOFF) 1: .word _GLOBAL_OFFSET_TABLE_ - 1b + .word foo2(RELABS) + .word foo3(SBREL) diff --git a/include/elf/arm.h b/include/elf/arm.h index 158a4b55e..a391a0e68 100644 --- a/include/elf/arm.h +++ b/include/elf/arm.h @@ -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) -- 2.11.4.GIT