use all symbols from libphp.a, so we don't need to build shared extensions

This commit is contained in:
DubbleClick
2025-08-29 10:24:51 +07:00
parent fad2314539
commit 56c90ca4a3

View File

@@ -33,15 +33,25 @@ abstract class UnixBuilderBase extends BuilderBase
private static array $undefined_symbols = []; private static array $undefined_symbols = [];
public static function getUndefinedSymbols(): array public static function getDynamicExportSymbols(): array
{ {
if (count(self::$undefined_symbols)) { if (count(self::$undefined_symbols)) {
return self::$undefined_symbols; return self::$undefined_symbols;
} }
$undefined = []; if (SPCTarget::isStatic()) { // no reason to keep symbols when we can't load shared extensions!
return [];
}
$addSymbolsFromString = function (string $out, &$list) { // keep all symbols defined in libphp.a
$defined = [];
$libphp = BUILD_LIB_PATH . '/libphp.a';
if (!is_file($libphp)) {
throw new WrongUsageException('You must build libphp.a before calling this function.');
}
$cmd = 'nm -g --defined-only -P ' . escapeshellarg($libphp) . ' 2>/dev/null';
$out = shell_exec($cmd) ?: '';
if ($out !== '') {
foreach (preg_split('/\R/', trim($out)) as $line) { foreach (preg_split('/\R/', trim($out)) as $line) {
if ($line === '') { if ($line === '') {
continue; continue;
@@ -52,40 +62,14 @@ abstract class UnixBuilderBase extends BuilderBase
} }
$name = preg_replace('/@.*$/', '', $name); $name = preg_replace('/@.*$/', '', $name);
if ($name !== '' && $name !== false) { if ($name !== '' && $name !== false) {
$list[$name] = true; $defined[$name] = true;
} }
} }
};
// collect undefined symbols from shared extensions
$files = glob(rtrim(BUILD_MODULES_PATH, '/') . DIRECTORY_SEPARATOR . '*.so') ?: [];
foreach ($files as $so) {
$cmd = 'nm -D --undefined-only -P ' . escapeshellarg($so) . ' 2>/dev/null';
$out = shell_exec($cmd);
if ($out !== '') {
$addSymbolsFromString($out, $undefined);
}
} }
sort($defined, SORT_STRING);
// keep only symbols defined in libphp.a self::$undefined_symbols = $defined;
$defined = []; return self::$undefined_symbols;
$libphp = BUILD_LIB_PATH . '/libphp.a';
if (!is_file($libphp)) {
throw new WrongUsageException('You must build libphp.a statically before calling this function.');
}
$cmd = 'nm -g --defined-only -P ' . escapeshellarg($libphp) . ' 2>/dev/null';
$out = shell_exec($cmd) ?: '';
if ($out !== '') {
$addSymbolsFromString($out, $defined);
}
// intersect: only undefined symbols that libphp.a actually defines
$keys = array_intersect_key($undefined, $defined);
$list = array_keys($keys);
sort($list, SORT_STRING);
self::$undefined_symbols = $list;
return $list;
} }
public function proveLibs(array $sorted_libraries): void public function proveLibs(array $sorted_libraries): void
@@ -209,7 +193,7 @@ abstract class UnixBuilderBase extends BuilderBase
foreach (glob(BUILD_LIB_PATH . "/libphp*.{$suffix}") as $file) { foreach (glob(BUILD_LIB_PATH . "/libphp*.{$suffix}") as $file) {
unlink($file); unlink($file);
} }
$symbols = self::getUndefinedSymbols(); // returns unique, version-stripped names $symbols = self::getDynamicExportSymbols(); // returns unique, version-stripped names
// turn list into many --export-dynamic-symbol=... flags // turn list into many --export-dynamic-symbol=... flags
$dynamic_exports = implode( $dynamic_exports = implode(
' ', ' ',
@@ -340,7 +324,7 @@ abstract class UnixBuilderBase extends BuilderBase
$debugFlags = $this->getOption('no-strip') ? '-w -s ' : ''; $debugFlags = $this->getOption('no-strip') ? '-w -s ' : '';
$dynamic_exports = ''; $dynamic_exports = '';
if (getenv('SPC_CMD_VAR_PHP_EMBED_TYPE') === 'static') { if (getenv('SPC_CMD_VAR_PHP_EMBED_TYPE') === 'static') {
$symbols = self::getUndefinedSymbols(); // returns unique, version-stripped names $symbols = self::getDynamicExportSymbols(); // returns unique, version-stripped names
// turn list into many --export-dynamic-symbol=... flags // turn list into many --export-dynamic-symbol=... flags
$dynamic_exports = ' ' . implode( $dynamic_exports = ' ' . implode(
' ', ' ',