[BUG] v2.1.257 aborts at launch on macOS 12 (dyld: _DNSServiceGetAddrInfoEx) — auto-updater installs it and leaves the install unable to start
Preflight Checklist
- [x] I have searched existing issues and this hasn't been reported yet
- [x] This is a single bug report (please file separate reports for different bugs)
- [x] I am using the latest version of Claude Code
What's Wrong?
Auto-update moved me to 2.1.257 on macOS 12 (Monterey), and Claude Code now aborts before any app code runs. Every invocation dies the same way, including claude --version:
dyld[51991]: Symbol not found: (_DNSServiceGetAddrInfoEx)
Referenced from: '~/.local/share/claude/versions/2.1.257'
Expected in: '/usr/lib/libSystem.B.dylib'
zsh: abort claude
DNSServiceGetAddrInfoEx doesn't exist in macOS 12's libSystem. A symbol probe confirms it: the older DNSServiceGetAddrInfo resolves fine, the Ex variant doesn't, so dyld kills the process (SIGABRT, exit 134).
I know macOS 12 is below the documented minimum (macOS 13.0+ per the setup docs), so this is not a request to support Monterey. The bug is in how the floor lands:
- The background auto-updater installed 2.1.257 and repointed
~/.local/bin/claudeat it on a host it can't run on. It did this on two user accounts on this machine. Nothing checks the OS floor before the switch, and nothing rolls back when the new binary can't execute, so the install is simply dead until you manually reinstall an older version. - There's no minimum-OS message anywhere in the failure. A raw dyld abort reads like a corrupted install, not "your macOS is too old."
- The 2.1.257 changelog doesn't mention the change that made the floor real.
What Should Happen?
Any one of these would have avoided a bricked install:
- The updater compares the host OS against the new binary's declared minimum (it's right in the Mach-O header,
LC_BUILD_VERSION minos=13.0) before switching the launcher, and skips the update with a notice on hosts below it. - Failing that, a rollback: the previous working version is still sitting in
~/.local/share/claude/versions/, so when the freshly installed binary can't even start, the launcher could fall back to it. - At minimum, a clear message: "macOS 12.7 is below the minimum supported version (13.0)" instead of a dyld abort.
And a secondary ask, freely ignorable: if this really comes down to the one hard reference, weak-linking DNSServiceGetAddrInfoEx with a runtime fallback to plain DNSServiceGetAddrInfo would keep macOS 12 running as best-effort. This machine can't go past Monterey, so 2.1.252 is where it ends otherwise. Happy to test a build. The three items above are the real ask though.
Error Messages/Logs
$ claude --version
dyld[59079]: Symbol not found: (_DNSServiceGetAddrInfoEx)
Referenced from: '~/.local/share/claude/versions/2.1.257'
Expected in: '/usr/lib/libSystem.B.dylib'
zsh: abort claude --version
$ echo $?
134
Steps to Reproduce
- Intel Mac on macOS 12.x with a working native install of 2.1.252
- Let the background auto-update run (or install 2.1.257 directly)
- Run any command, e.g.
claude --version - Immediate dyld abort, exit code 134
Claude Model
None
Is this a regression?
Yes, this worked in a previous version
Last Working Version
2.1.252
Claude Code Version
2.1.257 (Claude Code)
Platform
Anthropic API
Operating System
macOS
Terminal/Shell
Terminal.app (macOS)
Additional Information
Details that may save you the bisect:
- 2.1.252 launches and works; 2.1.257 aborts. 2.1.253 through 2.1.256 were never published (their release manifests at
downloads.claude.ai/claude-code-releases/<v>/manifest.jsonreturn 404 while 2.1.252 and 2.1.257 return 200), so these are consecutive releases and the break is exactly at 2.1.257. - 2.1.251, 2.1.252, and 2.1.257 all already declare
LC_BUILD_VERSION minos=13.0.0. Older builds ran on macOS 12 anyway because dyld only fails on a missing symbol; 2.1.257 is the first release that actually references a 13.0+-only symbol. - This is a repeat of a known pattern: #50383 (v2.1.113 vs macOS 11,
_ubrk_clone) was the same dyld failure class, and #50456 reported the same silent auto-update-into-a-broken-build behavior on macOS 11 back in April. Both went stale-closed.
Workaround for anyone stuck on macOS 12:
curl -fsSL https://claude.ai/install.sh | bash -s 2.1.252
then add "DISABLE_AUTOUPDATER": "1" to the env block of ~/.claude/settings.json, otherwise the next background update quietly reinstalls the broken build. You lose Fable 5.1 (it needs the newer CLI), but the install works.
Environment: macOS 12.7.4 Monterey (21H1123), Intel x64 (2015 MacBook Air), native installer, zsh.
3 Comments
The
dyld: Symbol not found: (_DNSServiceGetAddrInfoEx)on a 2015 Intel MacBook is the 13.0-only symbol landing on 12.7.4, so no amount of reinstalling fixes it, the binary just can't run there. Your pin-back command is the right call, and 2.1.252 is still in the versions dir if the symlink ever gets repointed again.Only thing I'd add: that auto-updater will try again, so keep
DISABLE_AUTOUPDATERset and double-check it after any other claude update, since the brick happens silently. I'd also note this is the same dyld class as the old #50383 case, so it's a known failure pattern, not something you did wrong.Confirming the same crash independently: iMac, macOS 12.7.6 (Monterey), Claude Code auto-updated to 2.1.257 and now aborts immediately on every invocation with:
2.1.252 and 2.1.251 both launch fine on the same machine, matching the report above exactly. Rolled back to 2.1.252 and disabled the auto-updater as a workaround. +1 for the proposed fix (OS-floor check before switching the launcher, or rollback on failed first launch).
2.1.258 fixes it. Confirmed on the same machine that hit this, macOS 12.7.4 Monterey on Intel:
The changelog attributes the regression to 2.1.255, which reconciles with the bisect above rather than contradicting it: 2.1.253 through 2.1.256 were never published (their manifests still 404 today), so 2.1.257 was the first release anyone could actually receive it in.
What changed in the binary, for anyone who lands here from a search:
_DNSServiceGetAddrInfoExand_kDNSServiceAttrAllowFailoveras strong, non-weak references. 2.1.258 is back to plain_DNSServiceGetAddrInfoand drops the attribute constant.LC_BUILD_VERSION minosis still 13.0.0 on 2.1.251, 2.1.252, 2.1.257 and 2.1.258 alike, so the declared floor was never the thing that changed. The single hard symbol reference was.std::stringmethods, and every strong import resolves on Monterey.One detail worth recording against the secondary ask above: the same binary already carries exactly one weak import,
_posix_spawn_file_actions_addfchdir, which is also 13.0+. dyld binds that to NULL instead of aborting, so weak-linking a newer libSystem symbol is a pattern already in use here.If you came for the workaround and pinned to 2.1.252 with
DISABLE_AUTOUPDATER=1, you can drop both now.Closing, since the break itself is fixed. The three asks in the report are about the updater rather than the symbol, and none of them are addressed by 2.1.258: comparing the host OS against the new binary's declared minimum before repointing the launcher, rolling back when a freshly installed binary cannot start, and printing a minimum-OS message instead of a raw dyld abort. Any one of them would have made this a skipped update instead of a dead install on two accounts, and the same failure class has now happened on macOS 11 (#50383, #50456) and macOS 12. Worth folding into a separate issue if it's something you want tracked.