ld64: 954.16 -> 956.6 (#510469)

This commit is contained in:
Randy Eckenrode
2026-04-19 13:37:36 +00:00
committed by GitHub
8 changed files with 193 additions and 59 deletions
+28 -13
View File
@@ -19,25 +19,35 @@ let
# Copy the files from their original sources instead of using patches to reduce the size of the patch set in nixpkgs.
otherSrcs = {
# The last version of ld64 to have dyldinfo
ld64 = fetchFromGitHub {
dyldinfo = fetchFromGitHub {
owner = "apple-oss-distributions";
repo = "ld64";
tag = "ld64-762";
hash = "sha256-UIq/fwO40vk8yvoTfx+UlLhnuzkI0Ih+Ym6W/BwnP0s=";
};
# The last version of ld64 to have machochecker and libpruntrie
machochecker = fetchFromGitHub {
owner = "apple-oss-distributions";
repo = "ld64";
tag = "ld64-954.16";
hash = "sha256-CVIyL2J9ISZnI4+r+wp4QtOb3+3Tmz2z2Z7/qeRqHS0=";
};
# Provides the source files used in the vendored libtapi. The libtapi derivation puts `tapi-src` first.
libtapi = lib.head libtapi.srcs;
};
ld64src = lib.escapeShellArg "${otherSrcs.ld64}";
dyldinfoSrc = lib.escapeShellArg "${otherSrcs.dyldinfo}";
machocheckerSrc = lib.escapeShellArg "${otherSrcs.machochecker}";
libprunetrieSrc = lib.escapeShellArg "${otherSrcs.machochecker}";
libtapisrc = lib.escapeShellArg "${otherSrcs.libtapi}";
llvmPath = "${lib.getLib llvm}";
in
stdenv.mkDerivation (finalAttrs: {
pname = "ld64";
version = "954.16";
version = "956.6";
outputs = [
"out"
@@ -49,16 +59,15 @@ stdenv.mkDerivation (finalAttrs: {
owner = "apple-oss-distributions";
repo = "ld64";
tag = "ld64-${finalAttrs.version}";
hash = "sha256-CVIyL2J9ISZnI4+r+wp4QtOb3+3Tmz2z2Z7/qeRqHS0=";
hash = "sha256-2VlBjlCZ+ZPKGZ0f5UuG3jJTLZIBXf8IZOiD6snheh4=";
};
patches = [
# These patches are vendored from https://github.com/reckenrode/ld64/tree/ld64-951.9-nixpkgs.
# These patches are vendored from https://github.com/reckenrode/ld64/tree/ld64-956.6-nixpkgs.
# See their comments for more on what they do.
./patches/0001-Always-use-write-instead-of-mmap.patch
./patches/0002-Add-compile_stubs.h-using-Clang-s-embed-extension-fo.patch
./patches/0003-Inline-missing-definitions-instead-of-using-private-.patch
./patches/0004-Removed-unused-Blob-clone-method.patch
./patches/0005-Use-std-atomics-and-std-mutex-for-portability.patch
./patches/0006-Add-Meson-build-system.patch
./patches/0007-Add-CrashReporterClient-header.patch
@@ -73,16 +82,22 @@ stdenv.mkDerivation (finalAttrs: {
./patches/0016-Add-dyldinfo-to-the-ld64-build.patch
./patches/0017-Fix-dyldinfo-build.patch
./patches/0018-Use-STL-containers-instead-of-LLVM-containers.patch
# Fix zippered versions on macOS 26+. Part of upstream ld64-956.6. Remove on next version bump.
# https://github.com/apple-oss-distributions/ld64/commit/1a4389663d65d6630e4b3e31ace2a86b6183b452
./patches/0019-Fix-zippered-versions-macos-26.patch
./patches/0019-Deduplicate-RPATH-entries.patch
./patches/0020-Remove-private-analytics-APIs.patch
./patches/0021-Support-text-based-stubs-with-compatible-architectur.patch
];
prePatch = ''
# Copy dyldinfo source files
cp ${ld64src}/doc/man/man1/dyldinfo.1 doc/man/man1/dyldinfo.1
cp ${ld64src}/src/other/dyldinfo.cpp src/other/dyldinfo.cpp
cp ${dyldinfoSrc}/doc/man/man1/dyldinfo.1 doc/man/man1/dyldinfo.1
cp ${dyldinfoSrc}/src/other/dyldinfo.cpp src/other/dyldinfo.cpp
# Copy machochecker source files
cp ${machocheckerSrc}/src/other/machochecker.cpp src/other/machochecker.cpp
# The current version of cctools in Nixpkgs needs libprunetrie
cp ${libprunetrieSrc}/src/other/PruneTrie.cpp src/other/PruneTrie.cpp
cp ${libprunetrieSrc}/src/other/prune_trie.h src/other/prune_trie.h
# Copy files needed from libtapi by ld64
mkdir -p subprojects/libtapi/tapi
@@ -104,7 +119,7 @@ stdenv.mkDerivation (finalAttrs: {
done
'';
xcodeHash = "sha256-qip/1eiGn8PdLThonhPq3oq2veN4E1zOiamDPBfTeNE=";
xcodeHash = "sha256-b0KCdHkMWsdOb68LB8B2rbZPAQma8AOnGUGQNvHOnV0=";
xcodeProject = "ld64.xcodeproj";
nativeBuildInputs = [
@@ -1,7 +1,7 @@
From ddcefc16f5db7fd36c885cf3bcd3713c8383e93b Mon Sep 17 00:00:00 2001
From 57222d068a4ba1d64249d19fb4a281d8dd9c0a5e Mon Sep 17 00:00:00 2001
From: Randy Eckenrode <randy@largeandhighquality.com>
Date: Wed, 13 Nov 2024 13:53:14 -0500
Subject: [PATCH 03/18] Inline missing definitions instead of using private
Subject: [PATCH] Inline missing definitions instead of using private
mach-o/dyld_private.h header
Based on: https://github.com/llvm/llvm-project/blob/38870fe124eb5e6e24136f9d3e4551a62370faee/libunwind/src/AddressSpace.hpp#L57-L67
@@ -11,7 +11,7 @@ Based on: https://github.com/llvm/llvm-project/blob/38870fe124eb5e6e24136f9d3e45
2 files changed, 9 insertions(+), 2 deletions(-)
diff --git a/src/ld/Options.cpp b/src/ld/Options.cpp
index 991387f..cde3fad 100644
index b52747a..9841689 100644
--- a/src/ld/Options.cpp
+++ b/src/ld/Options.cpp
@@ -35,7 +35,6 @@
@@ -19,9 +19,9 @@ index 991387f..cde3fad 100644
#include <Availability.h>
#include <tapi/tapi.h>
-#include <mach-o/dyld_priv.h>
#include <CoreAnalytics/CoreAnalytics.h>
#include <algorithm>
#include <vector>
diff --git a/src/ld/parsers/libunwind/AddressSpace.hpp b/src/ld/parsers/libunwind/AddressSpace.hpp
index eb47390..0788cc2 100644
--- a/src/ld/parsers/libunwind/AddressSpace.hpp
@@ -52,5 +52,5 @@ index eb47390..0788cc2 100644
namespace libunwind {
--
2.47.2
2.51.2
@@ -1,27 +0,0 @@
From 3c0038576173103e8aaa5286f853046b619c35fe Mon Sep 17 00:00:00 2001
From: Randy Eckenrode <randy@largeandhighquality.com>
Date: Wed, 13 Nov 2024 13:53:14 -0500
Subject: [PATCH 04/18] Removed unused `Blob::clone` method
Fixes a compiler error due to a missing `BlobCore::clone` method.
---
src/ld/code-sign-blobs/blob.h | 3 ---
1 file changed, 3 deletions(-)
diff --git a/src/ld/code-sign-blobs/blob.h b/src/ld/code-sign-blobs/blob.h
index 19c63a9..2ac0aa8 100644
--- a/src/ld/code-sign-blobs/blob.h
+++ b/src/ld/code-sign-blobs/blob.h
@@ -179,9 +179,6 @@ public:
return p;
return NULL;
}
-
- BlobType *clone() const
- { assert(validateBlob()); return specific(this->BlobCore::clone()); }
static BlobType *readBlob(int fd)
{ return specific(BlobCore::readBlob(fd, _magic, sizeof(BlobType), 0), true); }
--
2.47.2
@@ -35,7 +35,7 @@ index 0000000..cd4e8da
+ license : 'APSL-2.0',
+ license_files : 'APPLE_LICENSE',
+ meson_version : '>=1.6.0',
+ version : '954.16',
+ version : '956.6',
+)
+
+add_project_arguments(
@@ -0,0 +1,72 @@
From 19919df4055361b5c24458766754dbe01b67df69 Mon Sep 17 00:00:00 2001
From: Ben Simms <ben@bensimms.moe>
Date: Wed, 15 Apr 2026 21:53:24 -0400
Subject: [PATCH] Deduplicate RPATH entries
This is required for MacOS 15.4 and above, which rejects loading
libraries with duplicate RPATH entries
---
src/ld/HeaderAndLoadCommands.hpp | 29 +-
src/ld/HeaderAndLoadCommands.hpp.orig | 1828 +++++++++++++++++++++++++
2 files changed, 1855 insertions(+), 2 deletions(-)
create mode 100644 src/ld/HeaderAndLoadCommands.hpp.orig
diff --git a/src/ld/HeaderAndLoadCommands.hpp b/src/ld/HeaderAndLoadCommands.hpp
index 55700768df..4001f47c0e 100644
--- a/src/ld/HeaderAndLoadCommands.hpp
+++ b/src/ld/HeaderAndLoadCommands.hpp
@@ -472,7 +472,14 @@
if ( _hasRPathLoadCommands ) {
const std::vector<const char*>& rpaths = _options.rpaths();
+ std::set<std::string> seen;
+
for (std::vector<const char*>::const_iterator it = rpaths.begin(); it != rpaths.end(); ++it) {
+ std::string it_(*it);
+ if (seen.find(it_) != std::end(seen))
+ continue;
+ seen.insert(it_);
+
sz += alignedSize(sizeof(macho_rpath_command<P>) + strlen(*it) + 1);
}
}
@@ -581,8 +588,18 @@
count += _dylibLoadCommmandsCount;
- count += _options.rpaths().size();
-
+ {
+ const std::vector<const char*>& rpaths = _options.rpaths();
+ std::set<std::string> seen;
+ for (std::vector<const char*>::const_iterator it = rpaths.begin(); it != rpaths.end(); ++it) {
+ std::string it_(*it);
+ if (seen.find(it_) != std::end(seen))
+ continue;
+ seen.insert(it_);
+ ++count;
+ }
+ }
+
if ( _hasSubFrameworkLoadCommand )
++count;
@@ -1771,7 +1788,15 @@
if ( _hasRPathLoadCommands ) {
const std::vector<const char*>& rpaths = _options.rpaths();
+ std::set<std::string> seen;
+
for (std::vector<const char*>::const_iterator it = rpaths.begin(); it != rpaths.end(); ++it) {
+ std::string it_(*it);
+ if (seen.find(it_) != std::end(seen))
+ continue;
+
+ seen.insert(it_);
+
p = this->copyRPathLoadCommand(p, *it);
}
}
--
2.51.2
@@ -1,13 +0,0 @@
diff --git a/src/ld/Options.cpp b/src/ld/Options.cpp
--- a/src/ld/Options.cpp
+++ b/src/ld/Options.cpp
@@ -4882,7 +4885,8 @@ void Options::reconfigureDefaults()
uint32_t iOSMacOSMajorVersion = (iOSMacVersion >> 16) & 0xFFFF;
// macOS 11 -> iOSMac 14, and so on
- uint32_t newMajorVersion = macOSMajorVersion + 3;
+ uint32_t newMajorVersion = macOSMajorVersion < 26 ? macOSMajorVersion + 3 : macOSMajorVersion;
+ // rdar://154107557 (ld64 fix handling of zippered versions for macOS 26+)
if ( newMajorVersion > iOSMacOSMajorVersion ) {
uint32_t newVersion = newMajorVersion << 16;
std::string oldVersionString = getVersionString32(iOSMacVersion);
@@ -0,0 +1,52 @@
From 0b587a5f6df1cbab0ff145b96672a95faed301d1 Mon Sep 17 00:00:00 2001
From: Randy Eckenrode <randy@largeandhighquality.com>
Date: Tue, 14 Apr 2026 21:35:22 -0400
Subject: [PATCH] Remove private analytics APIs
---
src/ld/Options.cpp | 2 --
src/ld/Options.h | 3 ---
2 files changed, 5 deletions(-)
diff --git a/src/ld/Options.cpp b/src/ld/Options.cpp
index 9841689..00adba2 100644
--- a/src/ld/Options.cpp
+++ b/src/ld/Options.cpp
@@ -35,13 +35,11 @@
#include <spawn.h>
#include <Availability.h>
#include <tapi/tapi.h>
-#include <CoreAnalytics/CoreAnalytics.h>
#include <algorithm>
#include <vector>
#include <map>
#include <sstream>
-#include <xpc/xpc.h>
#include "ld.hpp"
#include "Options.h"
diff --git a/src/ld/Options.h b/src/ld/Options.h
index e1cd720..20ba2ab 100644
--- a/src/ld/Options.h
+++ b/src/ld/Options.h
@@ -33,7 +33,6 @@
#include <vector>
#include <unordered_set>
#include <unordered_map>
-#include <xpc/xpc.h>
#include "ld.hpp"
#include "Snapshot.h"
@@ -664,8 +663,6 @@ private:
void cannotBeUsedWithBitcode(const char* arg);
void loadImplictZipperFile(const char *path,std::vector<const char*>& paths);
void inferArchAndPlatform();
- xpc_object_t makeAnalyticsObject() const;
- void sendAnalytics() const;
// ObjectFile::ReaderOptions fReaderOptions;
--
2.51.2
@@ -0,0 +1,35 @@
From f18377dd297f669be5b9fbf10c132698f452c318 Mon Sep 17 00:00:00 2001
From: Randy Eckenrode <randy@largeandhighquality.com>
Date: Tue, 14 Apr 2026 21:35:22 -0400
Subject: [PATCH] Support text-based stubs with compatible architectures
This is necessary to support newer (e.g., 26.4) SDKs, which only include
symbol definitions for arm64e. Fortunately, arm64e dylibs are
ABI-compatible with arm64 binaries.
---
subprojects/libtapi/LinkerInterfaceFile.cpp | 10 +++++++++-
1 file changed, 9 insertions(+), 1 deletion(-)
diff --git a/subprojects/libtapi/LinkerInterfaceFile.cpp b/subprojects/libtapi/LinkerInterfaceFile.cpp
index 632eac8b0f..dfc5a18a73 100644
--- a/subprojects/libtapi/LinkerInterfaceFile.cpp
+++ b/subprojects/libtapi/LinkerInterfaceFile.cpp
@@ -186,6 +186,15 @@
if (enforceCpuSubType)
return AK_unknown;
+
+ // Check whether any archs has a compatible cpu type and return that if so.
+ for (const auto& targetArch : archs) {
+ auto [targetCpuType, _] = getCPUTypeFromArchitecture(targetArch);
+ if (cpuType == targetCpuType) {
+ return targetArch;
+ }
+ }
+
return arch;
}
--
2.51.2