about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog7
-rw-r--r--NEWS14
-rw-r--r--elf/Makefile4
-rw-r--r--sysdeps/arm/configure49
-rw-r--r--sysdeps/arm/configure.ac40
5 files changed, 103 insertions, 11 deletions
diff --git a/ChangeLog b/ChangeLog
index 90d5fa016a..71ec1f3c2e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,12 @@
 2015-07-08  Roland McGrath  <roland@hack.frob.com>
 
+	[BZ #18383]
+	* sysdeps/arm/configure.ac (libc_cv_arm_tpoff_addend): New check.
+	Emit test-xfail-tst-tlsalign{,-static}=yes if it fails.
+	* sysdeps/arm/configure: Regenerated.
+	* elf/Makefile (test-xfail-tst-tlsalign): Variable removed.
+	(test-xfail-tst-tlsalign-static): Variable removed.
+
 	* Makerules (do-install-so): Use $(LN_S) rather than explicit 'ln -s'.
 	* elf/Makefile ($(objpfx)$(rtld-installed-name)): Use $(make-link)
 	rather than explicit 'ln -s'.
diff --git a/NEWS b/NEWS
index ae0b753cde..40472a415a 100644
--- a/NEWS
+++ b/NEWS
@@ -21,13 +21,13 @@ Version 2.22
   18049, 18068, 18080, 18093, 18100, 18104, 18110, 18111, 18116, 18125,
   18128, 18138, 18185, 18196, 18197, 18206, 18210, 18211, 18217, 18219,
   18220, 18221, 18234, 18244, 18245, 18247, 18287, 18319, 18324, 18333,
-  18346, 18371, 18397, 18409, 18410, 18412, 18418, 18422, 18434, 18435,
-  18444, 18468, 18469, 18470, 18479, 18483, 18495, 18496, 18497, 18498,
-  18502, 18507, 18508, 18512, 18513, 18519, 18520, 18522, 18527, 18528,
-  18529, 18530, 18532, 18533, 18534, 18536, 18539, 18540, 18542, 18544,
-  18545, 18546, 18547, 18549, 18553, 18557, 18558, 18569, 18583, 18585,
-  18586, 18592, 18593, 18594, 18602, 18612, 18613, 18619, 18633, 18641.
-  18643.
+  18346, 18371, 18383, 18397, 18409, 18410, 18412, 18418, 18422, 18434,
+  18435, 18444, 18468, 18469, 18470, 18479, 18483, 18495, 18496, 18497,
+  18498, 18502, 18507, 18508, 18512, 18513, 18519, 18520, 18522, 18527,
+  18528, 18529, 18530, 18532, 18533, 18534, 18536, 18539, 18540, 18542,
+  18544, 18545, 18546, 18547, 18549, 18553, 18557, 18558, 18569, 18583,
+  18585, 18586, 18592, 18593, 18594, 18602, 18612, 18613, 18619, 18633,
+  18641, 18643.
 
 * Cache information can be queried via sysconf() function on s390 e.g. with
   _SC_LEVEL1_ICACHE_SIZE as argument.
diff --git a/elf/Makefile b/elf/Makefile
index e439527fb9..535421f250 100644
--- a/elf/Makefile
+++ b/elf/Makefile
@@ -525,10 +525,6 @@ $(objpfx)tst-initorder: $(objpfx)tst-initordera4.so $(objpfx)tst-initordera1.so
 $(objpfx)tst-null-argv: $(objpfx)tst-null-argv-lib.so
 $(objpfx)tst-tlsalign: $(objpfx)tst-tlsalign-lib.so
 
-# BZ#18383: broken on at least ARM (both).
-test-xfail-tst-tlsalign = yes
-test-xfail-tst-tlsalign-static = yes
-
 $(objpfx)tst-tlsalign-extern: $(objpfx)tst-tlsalign-vars.o
 $(objpfx)tst-tlsalign-extern-static: $(objpfx)tst-tlsalign-vars.o
 
diff --git a/sysdeps/arm/configure b/sysdeps/arm/configure
index 52f2185c29..158116b5a7 100644
--- a/sysdeps/arm/configure
+++ b/sysdeps/arm/configure
@@ -260,6 +260,55 @@ if test $libc_cv_arm_pcrel_movw = yes; then
 
 fi
 
+# This was buggy in assemblers from GNU binutils versions before 2.25.1
+# (it's known to be broken in 2.24 and 2.25; see
+# https://sourceware.org/bugzilla/show_bug.cgi?id=18383).
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether TPOFF relocs with addends are assembled correctly" >&5
+$as_echo_n "checking whether TPOFF relocs with addends are assembled correctly... " >&6; }
+if ${libc_cv_arm_tpoff_addend+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+
+cat > conftest.s <<\EOF
+	.syntax unified
+	.arm
+	.arch armv7-a
+
+	.text
+foo:
+	.word tbase(tpoff)+4
+
+	.section .tdata,"awT",%progbits
+	.word -4
+tbase:	.word 0
+	.word 4
+EOF
+libc_cv_arm_tpoff_addend=no
+${CC-cc} -c $CFLAGS $CPPFLAGS \
+	 -o conftest.o conftest.s 1>&5 2>&5 &&
+LC_ALL=C $READELF -x.text conftest.o > conftest.x 2>&5 &&
+{
+  cat conftest.x 1>&5
+  $AWK 'BEGIN { result = 2 }
+$1 ~ /0x0+/ && $2 ~ /[0-9a-f]+/ {
+# Check for little-endian or big-endian encoding of 4 in the in-place addend.
+  result = ($2 == "04000000" || $2 == "00000004") ? 0 : 1
+}
+END { exit(result) }
+' conftest.x 2>&5 && libc_cv_arm_tpoff_addend=yes
+}
+rm -f conftest*
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_arm_tpoff_addend" >&5
+$as_echo "$libc_cv_arm_tpoff_addend" >&6; }
+if test $libc_cv_arm_tpoff_addend = no; then
+  config_vars="$config_vars
+test-xfail-tst-tlsalign = yes"
+  config_vars="$config_vars
+test-xfail-tst-tlsalign-static = yes"
+fi
+
+
 libc_cv_gcc_unwind_find_fde=no
 
 # Remove -fno-unwind-tables that was added in sysdeps/arm/preconfigure.ac.
diff --git a/sysdeps/arm/configure.ac b/sysdeps/arm/configure.ac
index 168f2e7c80..859c92a002 100644
--- a/sysdeps/arm/configure.ac
+++ b/sysdeps/arm/configure.ac
@@ -79,6 +79,46 @@ if test $libc_cv_arm_pcrel_movw = yes; then
   AC_DEFINE([ARM_PCREL_MOVW_OK])
 fi
 
+# This was buggy in assemblers from GNU binutils versions before 2.25.1
+# (it's known to be broken in 2.24 and 2.25; see
+# https://sourceware.org/bugzilla/show_bug.cgi?id=18383).
+AC_CACHE_CHECK([whether TPOFF relocs with addends are assembled correctly],
+	       libc_cv_arm_tpoff_addend, [
+cat > conftest.s <<\EOF
+	.syntax unified
+	.arm
+	.arch armv7-a
+
+	.text
+foo:
+	.word tbase(tpoff)+4
+
+	.section .tdata,"awT",%progbits
+	.word -4
+tbase:	.word 0
+	.word 4
+EOF
+libc_cv_arm_tpoff_addend=no
+${CC-cc} -c $CFLAGS $CPPFLAGS \
+	 -o conftest.o conftest.s 1>&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD &&
+LC_ALL=C $READELF -x.text conftest.o > conftest.x 2>&AS_MESSAGE_LOG_FD &&
+{
+  cat conftest.x 1>&AS_MESSAGE_LOG_FD
+  $AWK 'BEGIN { result = 2 }
+$1 ~ /0x0+/ && $2 ~ /[[0-9a-f]]+/ {
+# Check for little-endian or big-endian encoding of 4 in the in-place addend.
+  result = ($2 == "04000000" || $2 == "00000004") ? 0 : 1
+}
+END { exit(result) }
+' conftest.x 2>&AS_MESSAGE_LOG_FD && libc_cv_arm_tpoff_addend=yes
+}
+rm -f conftest*])
+if test $libc_cv_arm_tpoff_addend = no; then
+  LIBC_CONFIG_VAR([test-xfail-tst-tlsalign], [yes])
+  LIBC_CONFIG_VAR([test-xfail-tst-tlsalign-static], [yes])
+fi
+
+
 libc_cv_gcc_unwind_find_fde=no
 
 # Remove -fno-unwind-tables that was added in sysdeps/arm/preconfigure.ac.