diff options
author | Matthew Pickering <matthewtpickering@gmail.com> | 2023-01-07 11:11:15 +0000 |
---|---|---|
committer | Zubin Duggal <zubin.duggal@gmail.com> | 2023-02-07 18:47:09 +0530 |
commit | 8ef4fec100d02d18465ffffa7b14f6672f051353 (patch) | |
tree | 9d2a6b98f22734686bd9a67401ec6fe6aa5208e8 | |
parent | 8e0c0da573062bde6dd084f3bc1c0f548b82cc73 (diff) | |
download | haskell-8ef4fec100d02d18465ffffa7b14f6672f051353.tar.gz |
Pass -Wl,-no_fixup_chains to ld64 when appropiate
Recent versions of MacOS use a version of ld where `-fixup_chains` is on by default.
This is incompatible with our usage of `-undefined dynamic_lookup`. Therefore we
explicitly disable `fixup-chains` by passing `-no_fixup_chains` to the linker on
darwin. This results in a warning of the form:
ld: warning: -undefined dynamic_lookup may not work with chained fixups
The manual explains the incompatible nature of these two flags:
-undefined treatment
Specifies how undefined symbols are to be treated. Options are: error, warning,
suppress, or dynamic_lookup. The default is error. Note: dynamic_lookup that
depends on lazy binding will not work with chained fixups.
A relevant ticket is #22429
Here are also a few other links which are relevant to the issue:
Official comment: https://developer.apple.com/forums/thread/719961
More relevant links:
https://openradar.appspot.com/radar?id=5536824084660224
https://github.com/python/cpython/issues/97524
Note in release notes: https://developer.apple.com/documentation/xcode-release-notes/xcode-13-releas e-notes
(cherry picked from commit 8c0ea25fb4a27d4729aabf73f4c00b912bb0c58d)
-rw-r--r-- | configure.ac | 4 | ||||
-rw-r--r-- | m4/fp_ld_no_fixup_chains.m4 | 24 |
2 files changed, 28 insertions, 0 deletions
diff --git a/configure.ac b/configure.ac index 18a39591f1..19f6d72fe0 100644 --- a/configure.ac +++ b/configure.ac @@ -780,6 +780,10 @@ FPTOOLS_SET_C_LD_FLAGS([target],[CONF_CC_OPTS_STAGE1],[CONF_GCC_LINKER_OPTS_STAG FPTOOLS_SET_C_LD_FLAGS([target],[CONF_CC_OPTS_STAGE2],[CONF_GCC_LINKER_OPTS_STAGE2],[CONF_LD_LINKER_OPTS_STAGE2],[CONF_CPP_OPTS_STAGE2]) # Stage 3 won't be supported by cross-compilation +FP_LD_NO_FIXUP_CHAINS([target], [LDFLAGS]) +FP_LD_NO_FIXUP_CHAINS([build], [CONF_GCC_LINKER_OPTS_STAGE0]) +FP_LD_NO_FIXUP_CHAINS([target], [CONF_GCC_LINKER_OPTS_STAGE1]) +FP_LD_NO_FIXUP_CHAINS([target], [CONF_GCC_LINKER_OPTS_STAGE2]) dnl ** See whether cc supports --target=<triple> and set dnl CONF_CC_OPTS_STAGE[12] accordingly. FP_CC_SUPPORTS_TARGET diff --git a/m4/fp_ld_no_fixup_chains.m4 b/m4/fp_ld_no_fixup_chains.m4 new file mode 100644 index 0000000000..1d62fd3b20 --- /dev/null +++ b/m4/fp_ld_no_fixup_chains.m4 @@ -0,0 +1,24 @@ +# FP_LD_NO_FIXUP_CHAINS +# -------------------- +# See if whether we are using a version of ld64 on darwin platforms which +# requires us to pass -no_fixup_chains +# +# $1 = the platform +# $2 = the name of the linker flags variable when linking with $CC +AC_DEFUN([FP_LD_NO_FIXUP_CHAINS], [ + case $$1 in + *-darwin) + AC_MSG_CHECKING([whether ld64 requires -no_fixup_chains]) + echo 'int main(void) {return 0;}' > conftest.c + if $CC -o conftest.o -Wl,-no_fixup_chains conftest.c > /dev/null 2>&1 + then + $2="-Wl,-no_fixup_chains" + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + fi + rm -f conftest.c conftest.o + ;; + + esac +]) |