Skip to content

Commit 70ca7bb

Browse files
ondrejmirtesclaude
andcommitted
Support PHP 8.2 in the Turbo extension
The shared core built against PHP 8.5 headers loads on PHP 8.2 next to a thin 8.2 extension; the shared-core gate reports identical shared code for 8.2 through 8.6. What 8.2 lacks or spells differently is routed through pt_abi or pinned in abi.h: - no engine C stack limit: Abi.cpp computes the bounds like 8.3 does and keeps them across fresh-stack coroutines - zend_fcall_info_cache.closure: 8.3's layout is declared on top of 8.2's - the literal-name arginfo bit is translated to the plain name bit - zend_zval_value_name() routes to zend_zval_type_name() on 8.2 - codegen pins for zend_string_*, smart_str_extract, ZEND_HASH_FILL_* and ZEND_ASSUME CI builds and tests 8.2 everywhere 8.3 is built; Alpine 3.24 has no php82 package, so the musl legs build it from the tarball. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0156KuUPxcWUY7jap6uxnA5h
1 parent acd0511 commit 70ca7bb

19 files changed

Lines changed: 470 additions & 72 deletions

‎.github/scripts/install-alpine-php.sh‎

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,26 @@
11
#!/bin/sh
22
# Installs PHP $PHP_MINOR and the extension's build tools into the Alpine
3-
# containers of the musl turbo legs in phar.yml. With PHP_ZTS=1 it builds a
4-
# thread-safe PHP from the release tarball instead (build-php.sh): Alpine
5-
# packages no thread-safe PHP, while the official php:*-alpine Docker images
6-
# are thread-safe from 8.6 on.
3+
# containers of the musl turbo legs in phar.yml. It builds PHP from the
4+
# release tarball instead (build-php.sh) with PHP_ZTS=1 — Alpine packages
5+
# no thread-safe PHP, while the official php:*-alpine Docker images are
6+
# thread-safe from 8.6 on — and for a minor the Alpine release no longer
7+
# packages (8.2).
78
set -eu
89

910
apk add --no-cache bash curl git make g++ musl-dev linux-headers patch tar zstd
1011

11-
if [ "${PHP_ZTS:-0}" = "1" ]; then
12-
apk add --no-cache jq pkgconf xz libxml2-dev oniguruma-dev curl-dev openssl-dev zlib-dev
13-
PHP_MINOR="$PHP_MINOR" PHP_ZTS=1 sh "$(dirname "$0")/../turbo-build/build-php.sh"
14-
exit 0
15-
fi
16-
1712
V="$(echo "$PHP_MINOR" | tr -d .)"
1813
# Alpine's php86 packages are currently only in edge/testing.
1914
if [ "$PHP_MINOR" = "8.6" ]; then
2015
echo 'https://dl-cdn.alpinelinux.org/alpine/edge/testing' >> /etc/apk/repositories
2116
fi
17+
18+
if [ "${PHP_ZTS:-0}" = "1" ] || [ -z "$(apk search -q -x "php$V")" ]; then
19+
apk add --no-cache jq pkgconf xz libxml2-dev oniguruma-dev curl-dev openssl-dev zlib-dev
20+
PHP_MINOR="$PHP_MINOR" PHP_ZTS="${PHP_ZTS:-0}" sh "$(dirname "$0")/../turbo-build/build-php.sh"
21+
exit 0
22+
fi
23+
2224
apk add --no-cache \
2325
"php$V" "php$V-dev" "php$V-ctype" "php$V-curl" "php$V-mbstring" \
2426
"php$V-tokenizer" "php$V-iconv" "php$V-openssl" "php$V-phar" \

‎.github/turbo-build/Dockerfile‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# Prebuilt image for the turbo-compile gnu legs in phar.yml, published to
2-
# ghcr.io/phpstan/turbo-build by turbo-build-image.yml (tags gnu-php8.3,
3-
# gnu-php8.4, gnu-php8.5, gnu-php8.6 and the thread-safe gnu-php8.3-zts to
4-
# gnu-php8.6-zts; each a linux/amd64 + linux/arm64 manifest).
2+
# ghcr.io/phpstan/turbo-build by turbo-build-image.yml (tags gnu-php8.2 to
3+
# gnu-php8.6 and the thread-safe gnu-php8.2-zts to gnu-php8.6-zts; each a
4+
# linux/amd64 + linux/arm64 manifest).
55
#
66
# Baking the PHP toolchain in keeps apt and the ondrej/php PPA out of the
77
# compile jobs entirely: ports.ubuntu.com (the only Ubuntu arm64 mirror,

‎.github/workflows/phar.yml‎

Lines changed: 32 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -188,8 +188,8 @@ jobs:
188188
with:
189189
egress-policy: audit
190190

191-
# the compiler-tests job runs the phar on PHP 8.2, where no binary exists
192-
# and the note is not printed
191+
# the compiler-tests job runs the phar only for `list`, which prints
192+
# no note
193193
- name: "Install PHP"
194194
uses: "shivammathur/setup-php@eb7c497e18156a6bbabfef1d3a82760b9eda3962" # 2.40.0
195195
with:
@@ -828,7 +828,7 @@ jobs:
828828
strategy:
829829
fail-fast: false
830830
matrix:
831-
php-version: ["8.3", "8.4", "8.5", "8.6"]
831+
php-version: ["8.2", "8.3", "8.4", "8.5", "8.6"]
832832
# the musl arm64 legs are in turbo-compile-musl-arm64
833833
target:
834834
- name: "linux-gnu-x86_64"
@@ -1002,7 +1002,7 @@ jobs:
10021002
strategy:
10031003
fail-fast: false
10041004
matrix:
1005-
php-version: ["8.3", "8.4", "8.5", "8.6"]
1005+
php-version: ["8.2", "8.3", "8.4", "8.5", "8.6"]
10061006
# thread-safe for every minor too, see turbo-compile
10071007
ts: ["nts", "zts"]
10081008
# see turbo-compile
@@ -1125,7 +1125,7 @@ jobs:
11251125
fail-fast: false
11261126
matrix:
11271127
# every PHP the cores run on; thread-safe builds are "<minor>-zts"
1128-
php-version: ["8.3", "8.4", "8.5", "8.6", "8.3-zts", "8.4-zts", "8.5-zts", "8.6-zts"]
1128+
php-version: ["8.2", "8.3", "8.4", "8.5", "8.6", "8.2-zts", "8.3-zts", "8.4-zts", "8.5-zts", "8.6-zts"]
11291129

11301130
steps:
11311131
- name: Harden the runner (Audit all outbound calls)
@@ -1257,6 +1257,7 @@ jobs:
12571257
fail-fast: false
12581258
matrix:
12591259
image:
1260+
- "php:8.2-cli-bookworm"
12601261
- "php:8.3.21-cli-bookworm"
12611262
- "php:8.3.22-cli-bookworm"
12621263
- "php:8.4-cli-bookworm"
@@ -1267,6 +1268,9 @@ jobs:
12671268
- "php:8.6-rc-cli-alpine"
12681269
check: ["tests", "phpstan"]
12691270
include:
1271+
- image: "php:8.2-cli-bookworm"
1272+
php-version: "8.2"
1273+
binary: "linux-gnu-x86_64-php8.2"
12701274
- image: "php:8.3.21-cli-bookworm"
12711275
php-version: "8.3"
12721276
binary: "linux-gnu-x86_64-php8.3"
@@ -1562,16 +1566,19 @@ jobs:
15621566
strategy:
15631567
fail-fast: false
15641568
matrix:
1565-
php-version: ["8.3", "8.4", "8.5", "8.6"]
1569+
php-version: ["8.2", "8.3", "8.4", "8.5", "8.6"]
15661570
ts: ["nts", "zts"]
15671571
# see turbo-compile
15681572
variant: ${{ fromJSON((startsWith(github.ref, 'refs/tags/') || contains(github.event.pull_request.labels.*.name, 'turbo-pie')) && '["split", "pie"]' || '["split"]') }}
1569-
# The official 8.3 Windows binaries are built with VS16 (linker
1570-
# 14.2x) and PHP's module loader is one-directional (module toolset
1571-
# generation <= core's), so the 8.3 DLL must be linked with the v142
1572-
# toolset — which the windows-2022 image ships alongside the default
1573-
# v143. The devel pack name carries the same vs infix.
1573+
# The official 8.2 and 8.3 Windows binaries are built with VS16
1574+
# (linker 14.2x) and PHP's module loader is one-directional (module
1575+
# toolset generation <= core's), so their DLLs must be linked with
1576+
# the v142 toolset — which the windows-2022 image ships alongside the
1577+
# default v143. The devel pack name carries the same vs infix.
15741578
include:
1579+
- php-version: "8.2"
1580+
vs: "vs16"
1581+
toolset: "14.29"
15751582
- php-version: "8.3"
15761583
vs: "vs16"
15771584
toolset: "14.29"
@@ -1851,7 +1858,7 @@ jobs:
18511858
strategy:
18521859
fail-fast: false
18531860
matrix:
1854-
php-version: ["8.3", "8.4", "8.5", "8.6"]
1861+
php-version: ["8.2", "8.3", "8.4", "8.5", "8.6"]
18551862
target: ["linux-gnu-x86_64", "linux-gnu-arm64", "macos-arm64", "windows-x86_64"]
18561863
ts: ["nts", "zts"]
18571864
# macOS ships no ZTS binary (see turbo-compile)
@@ -1878,6 +1885,16 @@ jobs:
18781885
container: "ghcr.io/phpstan/turbo-build:gnu-php8.6"
18791886
# the linux-gnu ZTS legs, in the image the binary is compiled in
18801887
# (see above); the official php:*-zts images get turbo-docker-run
1888+
- target: "linux-gnu-x86_64"
1889+
php-version: "8.2"
1890+
ts: "zts"
1891+
runs-on: "ubuntu-latest"
1892+
container: "ghcr.io/phpstan/turbo-build:gnu-php8.2-zts"
1893+
- target: "linux-gnu-arm64"
1894+
php-version: "8.2"
1895+
ts: "zts"
1896+
runs-on: "ubuntu-24.04-arm"
1897+
container: "ghcr.io/phpstan/turbo-build:gnu-php8.2-zts"
18811898
- target: "linux-gnu-x86_64"
18821899
php-version: "8.3"
18831900
ts: "zts"
@@ -2049,7 +2066,7 @@ jobs:
20492066
fail-fast: false
20502067
matrix:
20512068
arch: ["x86_64", "arm64"]
2052-
php-version: ["8.3", "8.4", "8.5", "8.6"]
2069+
php-version: ["8.2", "8.3", "8.4", "8.5", "8.6"]
20532070
# thread-safe for every minor too, see turbo-compile
20542071
ts: ["nts", "zts"]
20552072

@@ -2148,7 +2165,7 @@ jobs:
21482165
# vs17-built official PHP loads it fine.
21492166
matrix:
21502167
operating-system: ["ubuntu-latest", "windows-latest"]
2151-
php-version: ["8.3", "8.4", "8.5", "8.6"]
2168+
php-version: ["8.2", "8.3", "8.4", "8.5", "8.6"]
21522169
ts: ["nts", "zts"]
21532170
script: ["make tests", "make phpstan"]
21542171
# The Linux ZTS binaries run the same checks in turbo-docker-run, in
@@ -2346,7 +2363,7 @@ jobs:
23462363
include:
23472364
# below TurboExtensionSelector::MINIMUM_PHP_VERSION_ID there is no
23482365
# binary to find: the workers get the OPcache entries alone
2349-
- php-version: "8.2"
2366+
- php-version: "8.1"
23502367
turbo: "off"
23512368
- php-version: "8.5"
23522369
turbo: "on"

‎.github/workflows/turbo-build-image.yml‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
name: "Build Turbo compile images"
44

55
# Builds .github/turbo-build/Dockerfile natively on x86_64 and arm64
6-
# runners and publishes ghcr.io/phpstan/turbo-build:gnu-php{8.3,8.4,8.5,8.6}
7-
# and the thread-safe gnu-php{8.3,8.4,8.5,8.6}-zts as multi-arch manifests. The
6+
# runners and publishes ghcr.io/phpstan/turbo-build:gnu-php{8.2,8.3,8.4,8.5,8.6}
7+
# and the thread-safe gnu-php{8.2,8.3,8.4,8.5,8.6}-zts as multi-arch manifests. The
88
# turbo-compile gnu legs in phar.yml run in these images, so their only
99
# network dependency is a GHCR pull — no apt, no ports.ubuntu.com, no PPA at
1010
# compile time.
@@ -47,7 +47,7 @@ jobs:
4747
fail-fast: false
4848
matrix:
4949
# <minor>[-zts]; a -zts tag builds a thread-safe PHP of that minor
50-
tag: ["8.3", "8.4", "8.5", "8.6", "8.3-zts", "8.4-zts", "8.5-zts", "8.6-zts"]
50+
tag: ["8.2", "8.3", "8.4", "8.5", "8.6", "8.2-zts", "8.3-zts", "8.4-zts", "8.5-zts", "8.6-zts"]
5151
platform:
5252
- arch: "amd64"
5353
runs-on: "ubuntu-latest"
@@ -106,7 +106,7 @@ jobs:
106106

107107
strategy:
108108
matrix:
109-
tag: ["8.3", "8.4", "8.5", "8.6", "8.3-zts", "8.4-zts", "8.5-zts", "8.6-zts"]
109+
tag: ["8.2", "8.3", "8.4", "8.5", "8.6", "8.2-zts", "8.3-zts", "8.4-zts", "8.5-zts", "8.6-zts"]
110110

111111
env:
112112
TAG: "ghcr.io/phpstan/turbo-build:gnu-php${{ matrix.tag }}"

‎src/Turbo/TurboExtensionSelector.php‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ final class TurboExtensionSelector
5656
* matrix. Older runtimes have no binary to find, so they skip the lookup
5757
* (and with it the process restart) entirely.
5858
*/
59-
public const MINIMUM_PHP_VERSION_ID = 80300;
59+
public const MINIMUM_PHP_VERSION_ID = 80200;
6060

6161
/** @api */
6262
public const EXTENSION_PATH_INI = 'phpstan.turboExtensionPath';

‎turbo-ext/README.md‎

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ self-analysis).
1414
**Most users do not need to install anything.** The
1515
[phpstan/phpstan](https://github.com/phpstan/phpstan) Composer package ships
1616
prebuilt binaries for the most common platforms — Linux (glibc and musl,
17-
x86_64 and arm64), macOS (arm64), and Windows (x86_64), for PHP 8.3 and newer — and
17+
x86_64 and arm64), macOS (arm64), and Windows (x86_64), for PHP 8.2 and newer — and
1818
PHPStan automatically loads the one matching your runtime into its worker
1919
processes.
2020

@@ -420,6 +420,10 @@ layout moved through `abi.h`:
420420
| `ZSTR_KNOWN()` ids, `IS_REFERENCE_EX`, `ZEND_ACC_USE_GUARDS`, lazy-object flags | `pt_abi` values (`PT_ABI_KNOWN_STRINGS`, …) |
421421
| ZPP error codes / `Z_EXPECTED_*` numbering, parse slow paths (8.6) | neutral ZPP macros in `abi.h`, translated by `Abi.cpp` |
422422
| functions whose signature or behaviour changed (`zend_create_closure`, `zend_dval_to_lval`, …) or that stopped being exported (`zend_call_known_function`, …) | function pointers in `pt_abi`, implemented in `Abi.cpp` |
423+
| `EG(stack_base)` / `EG(stack_limit)` and `zend_call_stack.h` (8.3) | `pt_abi.eg_stack_*`; before 8.3, `Abi.cpp`'s own pair, determined like 8.3 does, and the two inline helpers spelled out in `abi.h` |
424+
| `zend_fcall_info_cache.closure` (8.3 appended it) | 8.3's layout declared over the older headers' struct (`support.h`, `abi.h`); the older engines use the first four members, the shared code never reads `closure` |
425+
| class names of internal arginfo (`_ZEND_TYPE_LITERAL_NAME_BIT`, 8.3) | pinned in `abi.h`, turned into the plain name bit by `Abi.cpp` before 8.3 |
426+
| `zend_zval_value_name()` (8.3; 8.2's type errors use `zend_zval_type_name()`) | `pt_abi.zval_value_name` |
423427
| `#if PHP_VERSION_ID` gates | `PT_ABI_SINCE(version, then, otherwise)`, decided at run time |
424428
| helpers re-spelled without changing behaviour (macro → inline function) | one definition pinned in `abi.h` ("codegen pins") |
425429

@@ -459,7 +463,7 @@ against them (the import library expected in `turbo-ext/`).
459463

460464
In CI (`.github/workflows/phar.yml`), `turbo-compile-core*` build one core
461465
per platform — profile-guided, against `php-version` of its matrix (Windows:
462-
against 8.3 with VS16, the oldest toolset, since PHP checks the toolset of
466+
against 8.3 with VS16, the oldest toolset — 8.2's too — since PHP checks the toolset of
463467
the DLL it loads, the extension, and a core linked with an older one runs on
464468
any newer VC runtime) — and are what `turbo-origins` reuses from earlier
465469
runs; `turbo-compile*` link each version's extension against them in a

‎turbo-ext/bin/shared-core/check-linux.sh‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ set -euo pipefail
2121
S=${SHARED_CORE_WORK_DIR:?set SHARED_CORE_WORK_DIR to a scratch directory}
2222
HERE=$(cd "$(dirname "$0")" && pwd)
2323
REFERENCE=${GATE_REFERENCE:-8.5}
24-
VERSIONS=${GATE_VERSIONS:-8.3 8.4 8.5 8.6 8.3-zts 8.4-zts 8.5-zts 8.6-zts}
24+
VERSIONS=${GATE_VERSIONS:-8.2 8.3 8.4 8.5 8.6 8.2-zts 8.3-zts 8.4-zts 8.5-zts 8.6-zts}
2525
case " $VERSIONS " in
2626
*" $REFERENCE "*) ;;
2727
*) VERSIONS="$REFERENCE $VERSIONS" ;;

‎turbo-ext/bin/shared-core/fingerprint-linux.sh‎

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,14 @@
77
# one version each; gate.py compare then needs only the .tsv files.
88
#
99
# Needs docker and an llvm-objdump (LLVM_OBJDUMP, else the newest found).
10+
# GATE_BASE_IMAGE replaces ghcr.io/phpstan/turbo-build, e.g. with images
11+
# built locally from .github/turbo-build.
1012
# Usage: SHARED_CORE_WORK_DIR=<scratch directory> [GATE_VERSIONS="8.4 8.6-zts"] fingerprint-linux.sh
1113
set -euo pipefail
1214

1315
S=${SHARED_CORE_WORK_DIR:?set SHARED_CORE_WORK_DIR to a scratch directory}
1416
HERE=$(cd "$(dirname "$0")" && pwd)
15-
VERSIONS=${GATE_VERSIONS:-8.3 8.4 8.5 8.6 8.3-zts 8.4-zts 8.5-zts 8.6-zts}
17+
VERSIONS=${GATE_VERSIONS:-8.2 8.3 8.4 8.5 8.6 8.2-zts 8.3-zts 8.4-zts 8.5-zts 8.6-zts}
1618
if [ -z "${LLVM_OBJDUMP:-}" ]; then
1719
LLVM_OBJDUMP=$(command -v llvm-objdump || { ls /usr/bin/llvm-objdump-* /opt/homebrew/opt/llvm/bin/llvm-objdump 2>/dev/null || true; } | sort -V | tail -1)
1820
fi
@@ -21,7 +23,7 @@ export LLVM_OBJDUMP
2123

2224
# the CI build images plus clang
2325
for v in $VERSIONS; do
24-
printf 'FROM ghcr.io/phpstan/turbo-build:gnu-php%s\nRUN apt-get update -qq && DEBIAN_FRONTEND=noninteractive apt-get install -y -qq clang-14 > /dev/null && rm -rf /var/lib/apt/lists/*\n' "$v" \
26+
printf 'FROM %s:gnu-php%s\nRUN apt-get update -qq && DEBIAN_FRONTEND=noninteractive apt-get install -y -qq clang-14 > /dev/null && rm -rf /var/lib/apt/lists/*\n' "${GATE_BASE_IMAGE:-ghcr.io/phpstan/turbo-build}" "$v" \
2527
| docker build -q ${GATE_PLATFORM:+--platform "$GATE_PLATFORM"} -t "turbo-build-clang:gnu-php$v" - > /dev/null
2628
done
2729

‎turbo-ext/bin/shared-core/gate-linux.sh‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
# compares the results function by function.
66
S=${SHARED_CORE_WORK_DIR:?set SHARED_CORE_WORK_DIR to a scratch directory}
77
WT=$(cd "$(dirname "$0")/../.." && pwd)
8-
VERSIONS=${GATE_VERSIONS:-8.3 8.4 8.5 8.6}
8+
VERSIONS=${GATE_VERSIONS:-8.2 8.3 8.4 8.5 8.6}
99
JOBS=${GATE_JOBS:-3} # per version; the versions build at the same time
1010
# GATE_PLATFORM (e.g. linux/amd64) runs the images of another architecture —
1111
# code generation differs between them, and CI gates on x86_64

‎turbo-ext/bin/shared-core/link-split-linux.sh‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
set -e
88
S=${SHARED_CORE_WORK_DIR:?set SHARED_CORE_WORK_DIR to a scratch directory}
99
REPO=$(cd "$(dirname "$0")/../../.." && pwd)
10-
VERSIONS=${GATE_VERSIONS:-8.3 8.4 8.5 8.6}
10+
VERSIONS=${GATE_VERSIONS:-8.2 8.3 8.4 8.5 8.6}
1111
CORE_FROM=${CORE_FROM:-8.4}
1212
OUT=$S/split-linux
1313
rm -rf "$OUT"; mkdir -p "$OUT"
@@ -17,14 +17,14 @@ SHIM='src/Abi.o src/Shadow.o src/TrustedTypes.o src/main.o src/TerminateHandler.
1717
# statically folded libstdc++ out of both dynamic symbol tables
1818
FLAGS='-static-libstdc++ -static-libgcc -Wl,--exclude-libs,ALL -Wl,--gc-sections -Wl,-z,relro,-z,now -Wl,-z,noexecstack'
1919

20-
docker run --rm -v "$S/lx-$CORE_FROM:/build" -v "$OUT:/out" -w /build "ghcr.io/phpstan/turbo-build:gnu-php$CORE_FROM" sh -ec "
20+
docker run --rm -v "$S/lx-$CORE_FROM:/build" -v "$OUT:/out" -w /build "${GATE_IMAGE:-ghcr.io/phpstan/turbo-build}:gnu-php$CORE_FROM" sh -ec "
2121
core=\$(find src -name '*.o' | grep -v -E 'src/(Abi|Shadow|TrustedTypes|main)\.o\$' | sort)
2222
g++ -shared $FLAGS -Wl,-soname,libphpstan_turbo_core.so -o /out/libphpstan_turbo_core.so \$core
2323
echo \"core exports: \$(nm -D --defined-only /out/libphpstan_turbo_core.so | wc -l)\"
2424
"
2525

2626
for v in $VERSIONS; do
27-
docker run --rm -v "$S/lx-$v:/build" -v "$OUT:/out" -v "$REPO:/repo:ro" -w /build "ghcr.io/phpstan/turbo-build:gnu-php$v" sh -ec "
27+
docker run --rm -v "$S/lx-$v:/build" -v "$OUT:/out" -v "$REPO:/repo:ro" -w /build "${GATE_IMAGE:-ghcr.io/phpstan/turbo-build}:gnu-php$v" sh -ec "
2828
g++ -shared $FLAGS -Wl,-rpath,'\$ORIGIN' -o /out/phpstan_turbo-$v.so $SHIM -L/out -lphpstan_turbo_core
2929
# every extension symbol must come from the core: undefined pt_*
3030
# symbols would only fail at load time

0 commit comments

Comments
 (0)