Index: glibc-fsf-trunk-quilt/config.make.in
===================================================================
--- glibc-fsf-trunk-quilt.orig/config.make.in	2014-06-19 22:24:26.231947549 +0100
+++ glibc-fsf-trunk-quilt/config.make.in	2014-06-19 22:25:11.741944867 +0100
@@ -65,6 +65,7 @@ bind-now = @bindnow@
 have-hash-style = @libc_cv_hashstyle@
 use-default-link = @use_default_link@
 output-format = @libc_cv_output_format@
+have-arm-tls-desc = @have_arm_tls_desc@
 
 static-libgcc = @libc_cv_gcc_static_libgcc@
 
Index: glibc-fsf-trunk-quilt/configure
===================================================================
--- glibc-fsf-trunk-quilt.orig/configure	2014-06-19 22:24:26.231947549 +0100
+++ glibc-fsf-trunk-quilt/configure	2014-06-19 22:25:12.241747789 +0100
@@ -581,6 +581,7 @@ shared
 static
 ldd_rewrite_script
 use_ldconfig
+have_arm_tls_desc
 libc_cv_forced_unwind
 libc_cv_rootsbindir
 libc_cv_localstatedir
@@ -7225,6 +7226,7 @@ libc_cv_sysconfdir=$sysconfdir
 libc_cv_localstatedir=$localstatedir
 libc_cv_gcc_unwind_find_fde=no
 libc_cv_idn=no
+have_arm_tls_desc=no
 
 # Iterate over all the sysdep directories we will use, running their
 # configure fragments.
@@ -7295,6 +7297,8 @@ fi
 
 
 
+
+
 if test x$use_ldconfig = xyes; then
   $as_echo "#define USE_LDCONFIG 1" >>confdefs.h
 
Index: glibc-fsf-trunk-quilt/configure.ac
===================================================================
--- glibc-fsf-trunk-quilt.orig/configure.ac	2014-06-19 22:24:26.231947549 +0100
+++ glibc-fsf-trunk-quilt/configure.ac	2014-06-19 22:25:12.241747789 +0100
@@ -2065,6 +2065,7 @@ libc_cv_sysconfdir=$sysconfdir
 libc_cv_localstatedir=$localstatedir
 libc_cv_gcc_unwind_find_fde=no
 libc_cv_idn=no
+have_arm_tls_desc=no
 
 # Iterate over all the sysdep directories we will use, running their
 # configure fragments.
@@ -2127,6 +2128,8 @@ AC_SUBST(libc_cv_localstatedir)
 AC_SUBST(libc_cv_rootsbindir)
 AC_SUBST(libc_cv_forced_unwind)
 
+AC_SUBST(have_arm_tls_desc)
+
 if test x$use_ldconfig = xyes; then
   AC_DEFINE(USE_LDCONFIG)
 fi
Index: glibc-fsf-trunk-quilt/sysdeps/arm/Makefile
===================================================================
--- glibc-fsf-trunk-quilt.orig/sysdeps/arm/Makefile	2014-06-19 22:24:26.231947549 +0100
+++ glibc-fsf-trunk-quilt/sysdeps/arm/Makefile	2014-06-19 22:25:12.741947016 +0100
@@ -11,6 +11,16 @@ $(objpfx)libgcc-stubs.a: $(objpfx)aeabi_
 	$(build-extra-lib)
 
 lib-noranlib: $(objpfx)libgcc-stubs.a
+
+ifeq ($(build-shared),yes)
+ifeq ($(have-arm-tls-desc),yes)
+tests += tst-armtlsdesc
+modules-names += tst-armtlsdescmod
+CFLAGS-tst-armtlsdescmod.c += -mtls-dialect=gnu2
+tst-armtlsdesc-ENV = LD_BIND_NOW=1
+$(objpfx)tst-armtlsdesc: $(objpfx)tst-armtlsdescmod.so
+endif
+endif
 endif
 
 ifeq ($(subdir),csu)
Index: glibc-fsf-trunk-quilt/sysdeps/arm/configure
===================================================================
--- glibc-fsf-trunk-quilt.orig/sysdeps/arm/configure	2014-06-19 22:24:26.231947549 +0100
+++ glibc-fsf-trunk-quilt/sysdeps/arm/configure	2014-06-19 22:25:12.741947016 +0100
@@ -203,3 +203,33 @@ else
   config_vars="$config_vars
 default-abi = soft"
 fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the build tools support the GNU descriptor TLS scheme" >&5
+$as_echo_n "checking whether the build tools support the GNU descriptor TLS scheme... " >&6; }
+if ${libc_cv_arm_tls_desc+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  old_CFLAGS="$CFLAGS"
+  CFLAGS="$CFLAGS -mtls-dialect=gnu2"
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+asm (".word\tfoo(tlsdesc)");
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  libc_cv_arm_tls_desc=yes
+else
+  libc_cv_arm_tls_desc=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  CFLAGS="$old_CFLAGS"
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_arm_tls_desc" >&5
+$as_echo "$libc_cv_arm_tls_desc" >&6; }
+have_arm_tls_desc=$libc_cv_arm_tls_desc
Index: glibc-fsf-trunk-quilt/sysdeps/arm/configure.ac
===================================================================
--- glibc-fsf-trunk-quilt.orig/sysdeps/arm/configure.ac	2014-06-19 22:24:26.231947549 +0100
+++ glibc-fsf-trunk-quilt/sysdeps/arm/configure.ac	2014-06-19 22:25:12.741947016 +0100
@@ -44,3 +44,12 @@ if test $libc_cv_arm_pcs_vfp = yes; then
 else
   LIBC_CONFIG_VAR([default-abi], [soft])
 fi
+
+AC_CACHE_CHECK([whether the build tools support the GNU descriptor TLS scheme],
+  [libc_cv_arm_tls_desc],
+  [old_CFLAGS="$CFLAGS"
+  CFLAGS="$CFLAGS -mtls-dialect=gnu2"
+  AC_COMPILE_IFELSE([AC_LANG_PROGRAM([asm (".word\tfoo(tlsdesc)");], [])],
+    [libc_cv_arm_tls_desc=yes], [libc_cv_arm_tls_desc=no])
+  CFLAGS="$old_CFLAGS"])
+have_arm_tls_desc=$libc_cv_arm_tls_desc
Index: glibc-fsf-trunk-quilt/sysdeps/arm/dl-machine.h
===================================================================
--- glibc-fsf-trunk-quilt.orig/sysdeps/arm/dl-machine.h	2014-06-19 22:24:23.731968218 +0100
+++ glibc-fsf-trunk-quilt/sysdeps/arm/dl-machine.h	2014-06-19 22:25:06.741661376 +0100
@@ -452,7 +452,10 @@ elf_machine_rel (struct link_map *map, c
 	    else
 # endif
 	      {
-		value = sym->st_value + td->argument.value;
+		if (td->argument.value & 0x80000000)
+		  value = sym->st_value;
+		else
+		  value = td->argument.value;
 
 # ifndef RTLD_BOOTSTRAP
 #  ifndef SHARED
Index: glibc-fsf-trunk-quilt/sysdeps/arm/tst-armtlsdesc.c
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ glibc-fsf-trunk-quilt/sysdeps/arm/tst-armtlsdesc.c	2014-06-19 22:25:12.741947016 +0100
@@ -0,0 +1,28 @@
+/* ARM immediate binding GNU TLS descriptor relocation test.
+   Copyright (C) 2013-2014 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+int getfoo (void);
+
+int
+do_test (void)
+{
+  return getfoo ();
+}
+
+#define TEST_FUNCTION do_test ()
+#include "../test-skeleton.c"
Index: glibc-fsf-trunk-quilt/sysdeps/arm/tst-armtlsdescmod.c
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ glibc-fsf-trunk-quilt/sysdeps/arm/tst-armtlsdescmod.c	2014-06-19 22:25:12.741947016 +0100
@@ -0,0 +1,25 @@
+/* DSO used for ARM immediate binding GNU TLS descriptor relocation test.
+   Copyright (C) 2013-2014 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+int __thread foo;
+
+int
+getfoo (void)
+{
+  return foo;
+}
