diff options
author | Ben Gamari <bgamari.foss@gmail.com> | 2017-06-29 19:37:03 -0400 |
---|---|---|
committer | Ben Gamari <ben@smart-cactus.org> | 2017-06-29 19:37:04 -0400 |
commit | 6171b0b326e52221a0631cf75eb4866b36abe631 (patch) | |
tree | e59cd011a13a4afa6c7cde0a95fea537d9d4538c /aclocal.m4 | |
parent | 7de2c07d61d8ff952164ee8e6948c1415514ee6d (diff) | |
download | haskell-6171b0b326e52221a0631cf75eb4866b36abe631.tar.gz |
configure: Check for binutils #17166
This bug affects bfd ld on ARMv7, causing ld to incorrectly emit
R_REL_COPY relocations, breaking tables-next-to-code. We've known about
it for several years now and there is not yet a fix upstream. Previously
we would simply force use of ld.gold on ARM. However, given the rework
of linking configuration, I thought a more principled solution was in
order.
Test Plan: Validate on armv7
Reviewers: austin, hvr
Subscribers: angerman, rwbarton, thomie, erikd
GHC Trac Issues: #4210
Differential Revision: https://phabricator.haskell.org/D3676
Diffstat (limited to 'aclocal.m4')
-rw-r--r-- | aclocal.m4 | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/aclocal.m4 b/aclocal.m4 index db394f38d6..b94f70bada 100644 --- a/aclocal.m4 +++ b/aclocal.m4 @@ -2047,6 +2047,65 @@ AC_DEFUN([FIND_LD],[ $2="$LD" ;; esac + CHECK_LD_COPY_BUG($1) +]) + +# CHECK_LD_COPY_BUG() +# ------------------- +# Check for binutils bug #16177 present in some versions of the bfd ld +# implementation affecting ARM relocations. +# https://sourceware.org/bugzilla/show_bug.cgi?id=16177 +# +# $1 = the platform +# +AC_DEFUN([CHECK_LD_COPY_BUG],[ + case $1 in + arm*linux*) + AC_CHECK_TARGET_TOOL([READELF], [readelf]) + AC_CHECK_TARGET_TOOL([AS], [as]) + AC_MSG_CHECKING([for ld bug 16177]) + cat >actest.s <<-EOF + .globl _start + .p2align 4 + _start: + bkpt + + .data + .globl data_object + object_reference: + .long data_object + .size object_reference, 4 +EOF + + cat >aclib.s <<-EOF + .data + .globl data_object + .type data_object, %object + .size data_object, 4 + data_object: + .long 123 +EOF + + $AS -o aclib.o aclib.s + $LD -shared -o aclib.so aclib.o + + $AS -o actest.o actest.s + $LD -o actest actest.o aclib.so + + if $READELF -r actest | grep R_ARM_COPY > /dev/null; then + AC_MSG_RESULT([affected]) + AC_MSG_ERROR( + [Your linker is affected by binutils #16177, which + critically breaks linkage of GHC objects. Please either upgrade + binutils or supply a different linker with the LD environment + variable.]) + else + AC_MSG_RESULT([unaffected]) + fi + ;; + *) + ;; + esac ]) # FIND_GHC_BOOTSTRAP_PROG() |