diff --git a/aclocal.m4 b/aclocal.m4 index 99ff1bf6b85f91932d73cb3d2ee4b6dc091f97de..cf934744bce08f6b0dee4d7d5697839776318f83 100644 --- a/aclocal.m4 +++ b/aclocal.m4 @@ -2355,6 +2355,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 @@ -2367,10 +2368,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 ec96d2ca99229e9d1e0e33ff64471bfa0c37d33b..57d76b45ce27ab8b09046aa777cefff126e19b66 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 86c626dccd3e83f6f060dcd9da935c5f063ed7f2..e5ec04a19509b8b00c7c1246bb90eeb3db1277bd 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 9c101c4a9d9188a67d4f7bab92a28d65d92bea15..8d14b7a3e21785ef846be55ac6b7376a2dcf043e 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"