From 746a85793340219c460f7ac05dc5dd001d774894 Mon Sep 17 00:00:00 2001 From: Nick Clifton Date: Thu, 18 Mar 2010 11:22:43 +0000 Subject: [PATCH] bfd/ 2010-03-15 Wei Guozhi PR gas/11323 * bfd-in2.h (enum bfd_reloc_code_real): New BFD_RELOC_GOT_PREL type. * elf32-arm.c (elf32_arm_reloc_map): BFD_RELOC_GOT_PREL to R_ARM_GOT_PREL map. * libbfd.h (bfd_reloc_code_real_names): BFD_RELOC_GOT_PREL name. * reloc.c (comments): Document the new relocation. gas/ 2010-03-15 Wei Guozhi PR gas/11323 * config/tc-arm.c (reloc_names): New relocation names. (md_apply_fix): New case for BFD_RELOC_ARM_GOT_PREL. (tc_gen_reloc): New case for BFD_RELOC_ARM_GOT_PREL. * doc/c-arm.texi (ARM-Relocations): Document the new relocation. gas/testsuite 2010-03-15 Wei Guozhi PR gas/11323 * gas/arm/got_prel.s: New test case. * gas/arm/got_prel.d: Likewise. --- bfd/ChangeLog | 9 +++++++++ bfd/bfd-in2.h | 1 + bfd/elf32-arm.c | 1 + bfd/libbfd.h | 1 + bfd/reloc.c | 2 ++ gas/ChangeLog | 8 ++++++++ gas/config/tc-arm.c | 13 ++++++++++--- gas/doc/c-arm.texi | 3 ++- gas/testsuite/ChangeLog | 6 ++++++ gas/testsuite/gas/arm/got_prel.d | 19 +++++++++++++++++++ gas/testsuite/gas/arm/got_prel.s | 23 +++++++++++++++++++++++ 11 files changed, 82 insertions(+), 4 deletions(-) create mode 100644 gas/testsuite/gas/arm/got_prel.d create mode 100644 gas/testsuite/gas/arm/got_prel.s diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 0172fdf80..d8af13c07 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,12 @@ +2010-03-18 Wei Guozhi + + PR gas/11323 + * elf32-arm.c (elf32_arm_reloc_map): Map BFD_RELOC_ARM_GOT_PREL to + R_ARM_GOT_PREL. + * reloc.c (BFD_RELOC_ARM_GOT_PREL): New ARM relocation. + * bfd-in2.h: Regenerate. + * libbfd.h: Regenerate. + 2010-03-17 H.J. Lu * reloc.c (BFD_RELOC_SPU_PIC18): Removed. diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h index c90ac2db2..31af74f91 100644 --- a/bfd/bfd-in2.h +++ b/bfd/bfd-in2.h @@ -3114,6 +3114,7 @@ pc-relative or some form of GOT-indirect relocation. */ BFD_RELOC_ARM_RELATIVE, BFD_RELOC_ARM_GOTOFF, BFD_RELOC_ARM_GOTPC, + BFD_RELOC_ARM_GOT_PREL, /* ARM thread-local storage relocations. */ BFD_RELOC_ARM_TLS_GD32, diff --git a/bfd/elf32-arm.c b/bfd/elf32-arm.c index eede7ecbf..6bd29f69c 100644 --- a/bfd/elf32-arm.c +++ b/bfd/elf32-arm.c @@ -1721,6 +1721,7 @@ static const struct elf32_arm_reloc_map elf32_arm_reloc_map[] = {BFD_RELOC_ARM_RELATIVE, R_ARM_RELATIVE}, {BFD_RELOC_ARM_GOTOFF, R_ARM_GOTOFF32}, {BFD_RELOC_ARM_GOTPC, R_ARM_GOTPC}, + {BFD_RELOC_ARM_GOT_PREL, R_ARM_GOT_PREL}, {BFD_RELOC_ARM_GOT32, R_ARM_GOT32}, {BFD_RELOC_ARM_PLT32, R_ARM_PLT32}, {BFD_RELOC_ARM_TARGET1, R_ARM_TARGET1}, diff --git a/bfd/libbfd.h b/bfd/libbfd.h index fa9d18760..65cfccf89 100644 --- a/bfd/libbfd.h +++ b/bfd/libbfd.h @@ -1330,6 +1330,7 @@ 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_GOT_PREL", "BFD_RELOC_ARM_TLS_GD32", "BFD_RELOC_ARM_TLS_LDO32", "BFD_RELOC_ARM_TLS_LDM32", diff --git a/bfd/reloc.c b/bfd/reloc.c index 1974851d8..cacd0de00 100644 --- a/bfd/reloc.c +++ b/bfd/reloc.c @@ -2936,6 +2936,8 @@ ENUMX BFD_RELOC_ARM_GOTOFF ENUMX BFD_RELOC_ARM_GOTPC +ENUMX + BFD_RELOC_ARM_GOT_PREL ENUMDOC Relocations for setting up GOTs and PLTs for shared libraries. diff --git a/gas/ChangeLog b/gas/ChangeLog index 5110a41fe..929cb7be0 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,11 @@ +2010-03-18 Wei Guozhi + + PR gas/11323 + * config/tc-arm.c (reloc_names): New relocation names. + (md_apply_fix): New case for BFD_RELOC_ARM_GOT_PREL. + (tc_gen_reloc): New case for BFD_RELOC_ARM_GOT_PREL. + * doc/c-arm.texi (ARM-Relocations): Document the new relocation. + 2010-03-15 Thomas Schwinge * dw2gencfi.c (output_cie): Consider emitting the S augmentation in all diff --git a/gas/config/tc-arm.c b/gas/config/tc-arm.c index 16f4fd321..557b9f910 100644 --- a/gas/config/tc-arm.c +++ b/gas/config/tc-arm.c @@ -1,6 +1,6 @@ /* tc-arm.c -- Assemble for the ARM Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, - 2004, 2005, 2006, 2007, 2008, 2009 + 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. Contributed by Richard Earnshaw (rwe@pegasus.esprit.ec.org) Modified by David Taylor (dtaylor@armltd.co.uk) @@ -16191,7 +16191,8 @@ static struct reloc_entry reloc_names[] = { "tlsldm", BFD_RELOC_ARM_TLS_LDM32}, { "TLSLDM", BFD_RELOC_ARM_TLS_LDM32}, { "tlsldo", BFD_RELOC_ARM_TLS_LDO32}, { "TLSLDO", BFD_RELOC_ARM_TLS_LDO32}, { "gottpoff",BFD_RELOC_ARM_TLS_IE32}, { "GOTTPOFF",BFD_RELOC_ARM_TLS_IE32}, - { "tpoff", BFD_RELOC_ARM_TLS_LE32}, { "TPOFF", BFD_RELOC_ARM_TLS_LE32} + { "tpoff", BFD_RELOC_ARM_TLS_LE32}, { "TPOFF", BFD_RELOC_ARM_TLS_LE32}, + { "got_prel", BFD_RELOC_ARM_GOT_PREL}, { "GOT_PREL", BFD_RELOC_ARM_GOT_PREL} }; #endif @@ -20477,7 +20478,12 @@ md_apply_fix (fixS * fixP, if (fixP->fx_done || !seg->use_rela_p) md_number_to_chars (buf, 0, 4); break; - + + case BFD_RELOC_ARM_GOT_PREL: + if (fixP->fx_done || !seg->use_rela_p) + md_number_to_chars (buf, value, 4); + break; + case BFD_RELOC_ARM_TARGET2: /* TARGET2 is not partial-inplace, so we need to write the addend here for REL targets, because it won't be written out @@ -21062,6 +21068,7 @@ tc_gen_reloc (asection *section, fixS *fixp) #ifdef OBJ_ELF case BFD_RELOC_ARM_GOT32: case BFD_RELOC_ARM_GOTOFF: + case BFD_RELOC_ARM_GOT_PREL: case BFD_RELOC_ARM_PLT32: case BFD_RELOC_ARM_TARGET1: case BFD_RELOC_ARM_ROSEGREL32: diff --git a/gas/doc/c-arm.texi b/gas/doc/c-arm.texi index 11d7215be..60a455798 100644 --- a/gas/doc/c-arm.texi +++ b/gas/doc/c-arm.texi @@ -452,7 +452,8 @@ The following relocations are supported: @code{TLSGD}, @code{TLSLDM}, @code{TLSLDO}, -@code{GOTTPOFF} +@code{GOTTPOFF}, +@code{GOT_PREL} and @code{TPOFF}. diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog index dd0807e71..86d14dc01 100644 --- a/gas/testsuite/ChangeLog +++ b/gas/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2010-03-18 Wei Guozhi + + PR gas/11323 + * gas/arm/got_prel.s: New test case. + * gas/arm/got_prel.d: Expected disassembly. + 2010-03-17 H.J. Lu * gas/i386/i386.exp: Run list-1, list-2 and list-3 only for diff --git a/gas/testsuite/gas/arm/got_prel.d b/gas/testsuite/gas/arm/got_prel.d new file mode 100644 index 000000000..ad74dfc3b --- /dev/null +++ b/gas/testsuite/gas/arm/got_prel.d @@ -0,0 +1,19 @@ +# name: R_ARM_GOT_PREL relocation +# source: got_prel.s +# as: -march=armv5te -meabi=5 +# readelf: -x 4 -r +# target: *-*-*eabi *-*-symbianelf *-*-linux-* *-*-elf + +Relocation section '.rel.text.foo' at offset 0x3f0 contains 1 entries: + Offset Info Type Sym.Value Sym. Name +00000010 00000c60 R_ARM_GOT_PREL 00000000 i + +Relocation section '.rel.ARM.exidx.text.foo' at offset 0x3f8 contains 2 entries: + Offset Info Type Sym.Value Sym. Name +00000000 0000042a R_ARM_PREL31 00000000 .text.foo +00000000 00000d00 R_ARM_NONE 00000000 __aeabi_unwind_cpp_pr0 + +Hex dump of section '.text.foo': + NOTE: This section has relocations against it, but these have NOT been applied to this dump. + 0x00000000 034b7b44 1b681a68 1860101c 7047c046 .K{D.h.h.`..pG.F + 0x00000010 0a000000 .... diff --git a/gas/testsuite/gas/arm/got_prel.s b/gas/testsuite/gas/arm/got_prel.s new file mode 100644 index 000000000..9628d4724 --- /dev/null +++ b/gas/testsuite/gas/arm/got_prel.s @@ -0,0 +1,23 @@ + .code 16 + .text +.Ltext0: + .section .text.foo,"ax",%progbits + .align 2 + .global foo + .code 16 + .thumb_func + .type foo, %function +foo: + .fnstart + ldr r3, .L3 +.LPIC0: + add r3, pc + ldr r3, [r3] + ldr r2, [r3] + str r0, [r3] + mov r0, r2 + bx lr + .align 2 +.L3: + .word i(GOT_PREL) + (. - (.LPIC0+4)) + .fnend -- 2.11.4.GIT