Summary
On Linux, ICU libraries export versioned symbols (e.g. unum_open_76 instead of unum_open). ICUGetProcAddress in source/shared/ICU.pas looks up bare names only, so all symbol resolution fails silently and ICU is never loaded. All Intl formatting falls through to the CLDR path.
Why
The CLDR fallback lacks significant digits, rounding modes, rounding increments, collation sensitivity, proper datetime formatting, and locale-aware canonicalization. With ICU disabled, ~50+ intl402 test262 tests that depend on correct ICU behavior either fail or pass vacuously.
Current behavior
# On Ubuntu 25.04 with ICU 76:
nm -D /lib/aarch64-linux-gnu/libicui18n.so.76 | grep "T unum_open"
# 00000000002ccd80 T unum_open_76 (versioned, no bare alias)
TryLoadLinuxICU loads libicui18n.so.76 successfully, but every GetProcAddress(Handle, 'unum_open') call returns nil. TryLoadIntlFunctions returns False.
Expected behavior
ICUGetProcAddress should try the versioned name (unum_open_76) when the bare lookup fails. The version suffix is already known from TryLoadLinuxICU which iterates ICU_VERSION_MAX downto ICU_VERSION_MIN.
Scope notes
Summary
On Linux, ICU libraries export versioned symbols (e.g.
unum_open_76instead ofunum_open).ICUGetProcAddressinsource/shared/ICU.paslooks up bare names only, so all symbol resolution fails silently and ICU is never loaded. All Intl formatting falls through to the CLDR path.Why
The CLDR fallback lacks significant digits, rounding modes, rounding increments, collation sensitivity, proper datetime formatting, and locale-aware canonicalization. With ICU disabled, ~50+ intl402 test262 tests that depend on correct ICU behavior either fail or pass vacuously.
Current behavior
TryLoadLinuxICUloadslibicui18n.so.76successfully, but everyGetProcAddress(Handle, 'unum_open')call returns nil.TryLoadIntlFunctionsreturns False.Expected behavior
ICUGetProcAddressshould try the versioned name (unum_open_76) when the bare lookup fails. The version suffix is already known fromTryLoadLinuxICUwhich iteratesICU_VERSION_MAXdowntoICU_VERSION_MIN.Scope notes
source/shared/ICU.pas: store the discovered version suffix duringTryLoadLinuxICUand append it inICUGetProcAddresswhen the bare name isn't found.intl402/Collator/prototype/compare/non-normative-basic.jsintl402/Collator/prototype/compare/non-normative-sensitivity.jsintl402/DateTimeFormat/prototype/format/offset-timezone-gmt-same.jsintl402/DateTimeFormat/prototype/formatToParts/related-year-zh.jsintl402/DateTimeFormat/prototype/formatToParts/time-clip-to-integer.jsintl402/Intl/getCanonicalLocales/grandfathered.jsintl402/supportedLocalesOf-unicode-extensions-ignored.js