Index: bfd/bfd-in2.h =================================================================== RCS file: /cvs/src/src/bfd/bfd-in2.h,v retrieving revision 1.293 diff -u -p -r1.293 bfd-in2.h --- bfd/bfd-in2.h 30 Jul 2004 10:07:59 -0000 1.293 +++ bfd/bfd-in2.h 6 Aug 2004 16:08:13 -0000 @@ -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, Index: bfd/elfarm-nabi.c =================================================================== RCS file: /cvs/src/src/bfd/elfarm-nabi.c,v retrieving revision 1.19 diff -u -p -r1.19 elfarm-nabi.c --- bfd/elfarm-nabi.c 24 Jun 2004 04:46:22 -0000 1.19 +++ bfd/elfarm-nabi.c 6 Aug 2004 16:08:13 -0000 @@ -188,16 +188,16 @@ static reloc_howto_type elf32_arm_howto_ 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_ 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 {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 * Index: bfd/libbfd.h =================================================================== RCS file: /cvs/src/src/bfd/libbfd.h,v retrieving revision 1.120 diff -u -p -r1.120 libbfd.h --- bfd/libbfd.h 30 Jul 2004 15:37:04 -0000 1.120 +++ bfd/libbfd.h 6 Aug 2004 16:08:13 -0000 @@ -1134,6 +1134,9 @@ static const char *const bfd_reloc_code_ "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", Index: bfd/reloc.c =================================================================== RCS file: /cvs/src/src/bfd/reloc.c,v retrieving revision 1.109 diff -u -p -r1.109 reloc.c --- bfd/reloc.c 29 Jul 2004 05:17:39 -0000 1.109 +++ bfd/reloc.c 6 Aug 2004 16:08:14 -0000 @@ -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 Index: gas/config/tc-arm.c =================================================================== RCS file: /cvs/src/src/gas/config/tc-arm.c,v retrieving revision 1.170 diff -u -p -r1.170 tc-arm.c --- gas/config/tc-arm.c 16 Jul 2004 22:12:26 -0000 1.170 +++ gas/config/tc-arm.c 6 Aug 2004 16:08:17 -0000 @@ -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 }; Index: gas/testsuite/gas/arm/pic.d =================================================================== RCS file: /cvs/src/src/gas/testsuite/gas/arm/pic.d,v retrieving revision 1.5 diff -u -p -r1.5 pic.d --- gas/testsuite/gas/arm/pic.d 14 Nov 2003 15:12:43 -0000 1.5 +++ gas/testsuite/gas/arm/pic.d 6 Aug 2004 16:08:17 -0000 @@ -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 Index: gas/testsuite/gas/arm/pic.s =================================================================== RCS file: /cvs/src/src/gas/testsuite/gas/arm/pic.s,v retrieving revision 1.1 diff -u -p -r1.1 pic.s --- gas/testsuite/gas/arm/pic.s 1 Jan 2001 13:43:06 -0000 1.1 +++ gas/testsuite/gas/arm/pic.s 6 Aug 2004 16:08:17 -0000 @@ -9,3 +9,5 @@ .word sym(GOTOFF) 1: .word _GLOBAL_OFFSET_TABLE_ - 1b + .word foo2(RELABS) + .word foo3(SBREL) Index: include/elf/arm.h =================================================================== RCS file: /cvs/src/src/include/elf/arm.h,v retrieving revision 1.13 diff -u -p -r1.13 arm.h --- include/elf/arm.h 23 Mar 2004 23:05:52 -0000 1.13 +++ include/elf/arm.h 6 Aug 2004 16:08:17 -0000 @@ -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)