From 1cd74ac70a69f60b826b20d2e31644f2a2be98ea Mon Sep 17 00:00:00 2001 From: John Ericson Date: Wed, 26 Jul 2017 20:26:57 -0400 Subject: cc-wrapper: Make sure symbol tables of child delegators is not empty As described in https://github.com/NixOS/nixpkgs/issues/18461, MacOS no longer accepts dylibs which only reexport other dylibs, because their symbol tables are empty. To get around this, we define an object file with a single "private extern" symbol, which hopefully won't clobber anything. --- pkgs/build-support/cc-wrapper/default.nix | 9 +++++---- .../cc-wrapper/macos-sierra-reexport-hack.bash | 16 ++++++++++++---- 2 files changed, 17 insertions(+), 8 deletions(-) (limited to 'pkgs/build-support/cc-wrapper') diff --git a/pkgs/build-support/cc-wrapper/default.nix b/pkgs/build-support/cc-wrapper/default.nix index 371db540b0ab..43cf3b1cafeb 100644 --- a/pkgs/build-support/cc-wrapper/default.nix +++ b/pkgs/build-support/cc-wrapper/default.nix @@ -299,10 +299,11 @@ stdenv.mkDerivation { '' + (if !useMacosReexportHack then '' wrap ${prefix}ld ${./ld-wrapper.sh} ''${ld:-$ldPath/${prefix}ld} '' else '' - export ldWrapper="$out/bin/${prefix}ld" innerLd="${prefix}ld-reexport-delegate" - wrap "$innerLd" ${./macos-sierra-reexport-hack.bash} ''${ld:-$ldPath/${prefix}ld} - wrap "${prefix}ld" ${./ld-wrapper.sh} "$out/bin/$innerLd" - unset ldWrapper + export binPrefix=${prefix} + ldInner="${prefix}ld-reexport-delegate" + wrap "$ldInner" ${./macos-sierra-reexport-hack.bash} ''${ld:-$ldPath/${prefix}ld} + wrap "${prefix}ld" ${./ld-wrapper.sh} "$out/bin/$ldInner" + unset ldInner '') + '' if [ -e ${binutils_bin}/bin/${prefix}ld.gold ]; then diff --git a/pkgs/build-support/cc-wrapper/macos-sierra-reexport-hack.bash b/pkgs/build-support/cc-wrapper/macos-sierra-reexport-hack.bash index 548be0c4dd45..ae920e4fdad1 100644 --- a/pkgs/build-support/cc-wrapper/macos-sierra-reexport-hack.bash +++ b/pkgs/build-support/cc-wrapper/macos-sierra-reexport-hack.bash @@ -74,18 +74,26 @@ else mkdir -p "$out/lib" + PATH="$PATH:@out@/bin" + + symbolBloatObject=$outputNameLibless-symbol-hack.o + if [[ ! -e $symbolBloatObject ]]; then + printf '.private_extern _______child_hack_foo\nchild_hack_foo:\n' \ + | @binPrefix@as -- -o $symbolBloatObject + fi + # first half of libs - @ldWrapper@ -macosx_version_min 10.10 -arch x86_64 -dylib \ + @binPrefix@ld -macosx_version_min 10.10 -arch x86_64 -dylib \ -o "$out/lib/lib${children[0]}.dylib" \ -install_name "$out/lib/lib${children[0]}.dylib" \ - "${childrenLookup[@]}" \ + "${childrenLookup[@]}" "$symbolBloatObject" \ "${childrenLink[@]:0:$((${#childrenLink[@]} / 2 ))}" # second half of libs - @ldWrapper@ -macosx_version_min 10.10 -arch x86_64 -dylib \ + @binPrefix@ld -macosx_version_min 10.10 -arch x86_64 -dylib \ -o "$out/lib/lib${children[1]}.dylib" \ -install_name "$out/lib/lib${children[1]}.dylib" \ - "${childrenLookup[@]}" \ + "${childrenLookup[@]}" "$symbolBloatObject" \ "${childrenLink[@]:$((${#childrenLink[@]} / 2 ))}" allArgs+=("-L$out/lib" "-l${children[0]}" "-l${children[1]}") -- cgit 1.4.1