aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bfd/ChangeLog9
-rw-r--r--bfd/bfd-in2.h1
-rw-r--r--bfd/elf32-arm.c1
-rw-r--r--bfd/libbfd.h1
-rw-r--r--bfd/reloc.c2
-rw-r--r--gas/ChangeLog8
-rw-r--r--gas/config/tc-arm.c13
-rw-r--r--gas/doc/c-arm.texi3
-rw-r--r--gas/testsuite/ChangeLog6
-rw-r--r--gas/testsuite/gas/arm/got_prel.d19
-rw-r--r--gas/testsuite/gas/arm/got_prel.s23
11 files changed, 82 insertions, 4 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 0172fdf..d8af13c 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,12 @@
+2010-03-18 Wei Guozhi <carrot@google.com>
+
+ 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 <hongjiu.lu@intel.com>
* reloc.c (BFD_RELOC_SPU_PIC18): Removed.
diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h
index c90ac2d..31af74f 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 eede7ec..6bd29f6 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 fa9d187..65cfccf 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 1974851..cacd0de 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 5110a41..929cb7b 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,3 +1,11 @@
+2010-03-18 Wei Guozhi <carrot@google.com>
+
+ 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 <thomas@codesourcery.com>
* 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 16f4fd3..557b9f9 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 11d7215..60a4557 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 dd0807e..86d14dc 100644
--- a/gas/testsuite/ChangeLog
+++ b/gas/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2010-03-18 Wei Guozhi <carrot@google.com>
+
+ PR gas/11323
+ * gas/arm/got_prel.s: New test case.
+ * gas/arm/got_prel.d: Expected disassembly.
+
2010-03-17 H.J. Lu <hongjiu.lu@intel.com>
* 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 0000000..ad74dfc
--- /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 0000000..9628d47
--- /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