From e08ce498f03f12ae155b29a35c24adb26d4e8888 Mon Sep 17 00:00:00 2001 From: Peter Waller
Date: Sun, 3 Sep 2023 13:44:28 +0100 Subject: [PATCH] cc-wrapper: Account for NIX_LDFLAGS and NIX_CFLAGS_LINK in linkType Without this, pkgsStatic.pkgsLLVM.hello fails with segfaulting binaries because of the issue described at [0]. In summary, llvm's linker has a different behaviour to GCC's when supplied with both -static and -Wl,-dynamic-linker=...; GCC copes with it, but LLVM produces a binary which segfaults on startup. It appears to be necessary to omit the dynamic linker in this case. nixpkgs' static adaptor passes -static via NIX_CFLAGS_LINK which was not accounted for prior to this commit in the checkLinkType logic. For good measure I put the other NIX_ flags affecting link in the same logic. Additionally, $NIX_CFLAGS_LINK_@suffixSalt@ is not available until later than it was originally set, so set $linkType close to its point of use. I checked for earlier uses by studying the shell trace output and couldn't find any. [0] https://github.com/NixOS/nixpkgs/issues/111010#issuecomment-1536424163 Signed-off-by: Peter Waller
--- pkgs/build-support/cc-wrapper/cc-wrapper.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkgs/build-support/cc-wrapper/cc-wrapper.sh b/pkgs/build-support/cc-wrapper/cc-wrapper.sh index 9dcd29c64431..6c43f8cbfa6d 100644 --- a/pkgs/build-support/cc-wrapper/cc-wrapper.sh +++ b/pkgs/build-support/cc-wrapper/cc-wrapper.sh @@ -31,7 +31,6 @@ cxxLibrary=1 cInclude=1 expandResponseParams "$@" -linkType=$(checkLinkType "${params[@]}") declare -ag positionalArgs=() declare -i n=0 @@ -175,6 +174,7 @@ extraAfter=(${hardeningCFlagsAfter[@]+"${hardeningCFlagsAfter[@]}"} $NIX_CFLAGS_ extraBefore=(${hardeningCFlagsBefore[@]+"${hardeningCFlagsBefore[@]}"} $NIX_CFLAGS_COMPILE_BEFORE_@suffixSalt@) if [ "$dontLink" != 1 ]; then + linkType=$(checkLinkType $NIX_LDFLAGS_BEFORE_@suffixSalt@ "${params[@]}" ${NIX_CFLAGS_LINK_@suffixSalt@:-} $NIX_LDFLAGS_@suffixSalt@) # Add the flags that should only be passed to the compiler when # linking.