summary refs log tree commit diff
path: root/pkgs/os-specific/darwin/apple-source-releases/Libsystem/default.nix
diff options
context:
space:
mode:
authorDan Peebles <pumpkin@me.com>2016-10-10 09:50:25 -0400
committerDan Peebles <pumpkin@me.com>2016-10-12 00:08:13 -0400
commitd8a0307a5d36551c641578a3bf1a7d29103df511 (patch)
tree672e5fcbc1d77bc1f0a7addbcf9815c22567bf4d /pkgs/os-specific/darwin/apple-source-releases/Libsystem/default.nix
parent7098404505003887b62cdee10ee74dfa56ead741 (diff)
downloadnixpkgs-d8a0307a5d36551c641578a3bf1a7d29103df511.tar
nixpkgs-d8a0307a5d36551c641578a3bf1a7d29103df511.tar.gz
nixpkgs-d8a0307a5d36551c641578a3bf1a7d29103df511.tar.bz2
nixpkgs-d8a0307a5d36551c641578a3bf1a7d29103df511.tar.lz
nixpkgs-d8a0307a5d36551c641578a3bf1a7d29103df511.tar.xz
nixpkgs-d8a0307a5d36551c641578a3bf1a7d29103df511.tar.zst
nixpkgs-d8a0307a5d36551c641578a3bf1a7d29103df511.zip
[darwin.stdenv] Fix to work on Sierra
This reinstates the libSystem selective symbol export machinery we used
to have, but locks it to the symbols that were present in 10.11 and skips
the actual compiled code we put into that library in favor of the system
initialization code. That should make it more stable and less likely to
do weird stuff than the last time we did this.
Diffstat (limited to 'pkgs/os-specific/darwin/apple-source-releases/Libsystem/default.nix')
-rw-r--r--pkgs/os-specific/darwin/apple-source-releases/Libsystem/default.nix37
1 files changed, 34 insertions, 3 deletions
diff --git a/pkgs/os-specific/darwin/apple-source-releases/Libsystem/default.nix b/pkgs/os-specific/darwin/apple-source-releases/Libsystem/default.nix
index 27d2360a980..aac213bb804 100644
--- a/pkgs/os-specific/darwin/apple-source-releases/Libsystem/default.nix
+++ b/pkgs/os-specific/darwin/apple-source-releases/Libsystem/default.nix
@@ -56,9 +56,40 @@ appleDerivation rec {
     # The startup object files
     cp ${Csu}/lib/* $out/lib
 
-    # OMG impurity
-    ln -s /usr/lib/libSystem.B.dylib $out/lib/libSystem.B.dylib
-    ln -s /usr/lib/libSystem.dylib $out/lib/libSystem.dylib
+    # Narrowly speaking, these would work if we re-exported libsystem_c and libsystem_kernel,
+    # but we also need to run the original central libsystem constructor (which initializes
+    # a ton of crap for its consitutent libraries) so we link against the central library here.
+    mkdir -p $out/lib/system
+    ld -macosx_version_min 10.7 -arch x86_64 -dylib \
+       -o $out/lib/system/libsystem_c.dylib \
+       /usr/lib/libSystem.dylib \
+       -reexported_symbols_list ${./system_c_symbols}
+
+    ld -macosx_version_min 10.7 -arch x86_64 -dylib \
+       -o $out/lib/system/libsystem_kernel.dylib \
+       /usr/lib/libSystem.dylib \
+       -reexported_symbols_list ${./system_kernel_symbols}
+
+    libs=$(otool -arch x86_64 -L /usr/lib/libSystem.dylib | tail -n +3 | awk '{ print $1 }')
+
+
+    for i in $libs; do
+      if [ "$i" != "/usr/lib/system/libsystem_kernel.dylib" ] && [ "$i" != "/usr/lib/system/libsystem_c.dylib" ]; then
+        args="$args -reexport_library $i"
+      fi
+    done
+
+    ld -macosx_version_min 10.7 \
+       -arch x86_64 \
+       -dylib \
+       -o $out/lib/libSystem.B.dylib \
+       -compatibility_version 1.0 \
+       -current_version 1226.10.1 \
+       -reexport_library $out/lib/system/libsystem_c.dylib \
+       -reexport_library $out/lib/system/libsystem_kernel.dylib \
+       $args
+
+    ln -s libSystem.B.dylib $out/lib/libSystem.dylib
 
     # Set up links to pretend we work like a conventional unix (Apple's design, not mine!)
     for name in c dbm dl info m mx poll proc pthread rpcsvc util gcc_s.10.4 gcc_s.10.5; do