Fix segmentation fault on macOS 15.4 (#21176)

Strips off additional bits that are not part of the actual TLV key to avoid applications using DRuntime crashing during initialization.

Fixes #21126.
This commit is contained in:
Sönke Ludwig 2025-04-12 11:53:18 +02:00 committed by GitHub
parent 1b34fea478
commit 09ed02ce56
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 14 additions and 1 deletions

View file

@ -0,0 +1,7 @@
Fixed generated binaries crashing on macOS 15.4
macOS 15.4 has introduced an undocumented ABI change to the format of
thread local variable section, which causes almost all executable built with
previous D compiler versions to crash during initialization, if they use
DRuntime. This release introduces a mitigation for this issue that is
backwards compatible with previous versions of macOS.

View file

@ -145,7 +145,13 @@ pthread_key_t firstTLVKey(const mach_header_64* header) pure nothrow @nogc
if ((section.flags & SECTION_TYPE) != S_THREAD_LOCAL_VARIABLES)
continue;
return section.firstTLVDescriptor(slide).key;
// NOTE: macOS 15.4 has started to fill the upper 32 bits of
// the `key` field with an additional number. Using the whole
// 64-bit field as a key results in a segmentation fault. Even
// though none of this appears to be documented anywhere, we
// assume that only the lower 32 bits are used for the actual
// key and this results in binaries that execute normally.
return section.firstTLVDescriptor(slide).key & 0xFFFF_FFFF;
}
}