[commit: ghc] master: Don't use ld.gold when building libraries for GHCi (0a3629a)

git at git.haskell.org git at git.haskell.org
Wed Feb 21 17:03:26 UTC 2018


Repository : ssh://git@git.haskell.org/ghc

On branch  : master
Link       : http://ghc.haskell.org/trac/ghc/changeset/0a3629af36e89de73b7012c726fd533c4c5460fb/ghc

>---------------------------------------------------------------

commit 0a3629af36e89de73b7012c726fd533c4c5460fb
Author: Simon Marlow <marlowsd at gmail.com>
Date:   Wed Feb 21 14:16:00 2018 +0000

    Don't use ld.gold when building libraries for GHCi
    
    Summary:
    ld.gold is buggy when using -r and a linker script.  See upstream bug
    https://sourceware.org/bugzilla/show_bug.cgi?id=22266
    
    This has been causing various brokenness for the GHC runtime linker,
    where we load these broken object files.
    
    Test Plan: Test program from #14675
    
    Reviewers: bgamari, RyanGlScott, alpmestan, hvr, erikd
    
    Subscribers: rwbarton, thomie, erikd, carter
    
    GHC Trac Issues: #14328, #14675, #14291
    
    Differential Revision: https://phabricator.haskell.org/D4431


>---------------------------------------------------------------

0a3629af36e89de73b7012c726fd533c4c5460fb
 aclocal.m4                 | 13 ++++++++++---
 configure.ac               |  2 ++
 mk/config.mk.in            |  1 +
 rules/build-package-way.mk |  7 +++++--
 4 files changed, 18 insertions(+), 5 deletions(-)

diff --git a/aclocal.m4 b/aclocal.m4
index 6f37972..5ad3752 100644
--- a/aclocal.m4
+++ b/aclocal.m4
@@ -2340,6 +2340,7 @@ AC_DEFUN([FIND_LD],[
         # Make sure the user didn't specify LD manually.
         if test "z$LD" != "z"; then
             AC_CHECK_TARGET_TOOL([LD], [ld])
+            LD_NO_GOLD=$LD
             return
         fi
 
@@ -2352,10 +2353,16 @@ AC_DEFUN([FIND_LD],[
             if test "x$TmpLd" = "x"; then continue; fi
 
             out=`$TmpLd --version`
+            LD_NO_GOLD=$TmpLd
             case $out in
-              "GNU ld"*)   FP_CC_LINKER_FLAG_TRY(bfd, $2) ;;
-              "GNU gold"*) FP_CC_LINKER_FLAG_TRY(gold, $2) ;;
-              "LLD"*)      FP_CC_LINKER_FLAG_TRY(lld, $2) ;;
+              "GNU ld"*)
+                   FP_CC_LINKER_FLAG_TRY(bfd, $2) ;;
+              "GNU gold"*)
+                   FP_CC_LINKER_FLAG_TRY(gold, $2)
+                   LD_NO_GOLD=ld
+                   ;;
+              "LLD"*)
+                   FP_CC_LINKER_FLAG_TRY(lld, $2) ;;
               *) AC_MSG_NOTICE([unknown linker version $out]) ;;
             esac
             if test "z$$2" = "z"; then
diff --git a/configure.ac b/configure.ac
index 216a97f..216f43f 100644
--- a/configure.ac
+++ b/configure.ac
@@ -544,8 +544,10 @@ FIND_LD([$target],[GccUseLdOpt])
 CONF_GCC_LINKER_OPTS_STAGE1="$CONF_GCC_LINKER_OPTS_STAGE1 $GccUseLdOpt"
 CONF_GCC_LINKER_OPTS_STAGE2="$CONF_GCC_LINKER_OPTS_STAGE2 $GccUseLdOpt"
 LdCmd="$LD"
+LdNoGoldCmd="$LD_NO_GOLD"
 CFLAGS="$CFLAGS $GccUseLdOpt"
 AC_SUBST([LdCmd])
+AC_SUBST([LdNoGoldCmd])
 
 FP_PROG_LD_IS_GNU
 FP_PROG_LD_BUILD_ID
diff --git a/mk/config.mk.in b/mk/config.mk.in
index 86c626d..e5ec04a 100644
--- a/mk/config.mk.in
+++ b/mk/config.mk.in
@@ -727,6 +727,7 @@ HaveDtrace		= @HaveDtrace@
 USE_DTRACE = $(HaveDtrace)
 DTRACE			= @DtraceCmd@
 
+LD_NO_GOLD = @LdNoGoldCmd@
 LD = @LdCmd@
 NM = @NmCmd@
 AR = @ArCmd@
diff --git a/rules/build-package-way.mk b/rules/build-package-way.mk
index 9c101c4..8d14b7a 100644
--- a/rules/build-package-way.mk
+++ b/rules/build-package-way.mk
@@ -121,8 +121,11 @@ BINDIST_LIBS += $$($1_$2_GHCI_LIB)
 endif
 endif
 $$($1_$2_GHCI_LIB) : $$($1_$2_$3_HS_OBJS) $$($1_$2_$3_CMM_OBJS) $$($1_$2_$3_C_OBJS) $$($1_$2_$3_S_OBJS) $$($1_$2_EXTRA_OBJS) $$($1_$2_LD_SCRIPT)
-	$$(call cmd,LD) $$(CONF_LD_LINKER_OPTS_STAGE$4) -r $$(if $$($1_$2_LD_SCRIPT),$$($1_$2_LD_SCRIPT_CMD) $$($1_$2_LD_SCRIPT)) -o $$@ $$(EXTRA_LD_LINKER_OPTS) $$($1_$2_$3_HS_OBJS) $$($1_$2_$3_CMM_OBJS) $$($1_$2_$3_C_OBJS) $$($1_$2_$3_S_OBJS) $$($1_$2_EXTRA_OBJS)
-
+	$$(call cmd,LD_NO_GOLD) $$(CONF_LD_LINKER_OPTS_STAGE$4) -r $$(if $$($1_$2_LD_SCRIPT),$$($1_$2_LD_SCRIPT_CMD) $$($1_$2_LD_SCRIPT)) -o $$@ $$(EXTRA_LD_LINKER_OPTS) $$($1_$2_$3_HS_OBJS) $$($1_$2_$3_CMM_OBJS) $$($1_$2_$3_C_OBJS) $$($1_$2_$3_S_OBJS) $$($1_$2_EXTRA_OBJS)
+# NB. LD_NO_GOLD above: see #14328 (symptoms: #14675,#14291). At least
+# some versions of ld.gold appear to have a bug that causes the
+# generated GHCi library to have some bogus relocations. Performance
+# isn't critical here, so we fall back to the ordinary ld.
 ifeq "$$($1_$2_BUILD_GHCI_LIB)" "YES"
 # Don't bother making ghci libs for bootstrapping packages
 ifneq "$4" "0"



More information about the ghc-commits mailing list