[BUG] v2.1.257 aborts at launch on macOS 12 (dyld: _DNSServiceGetAddrInfoEx) — auto-updater installs it and leaves the install unable to start

Status Fixed / completed
Reported on v2.1.257
Maintainer reply None cached
Activity 3 comments · opened Sep 1, 2026 · closed Sep 2, 2026

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:

  1. The background auto-updater installed 2.1.257 and repointed ~/.local/bin/claude at 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.
  2. 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."
  3. 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

  1. Intel Mac on macOS 12.x with a working native install of 2.1.252
  2. Let the background auto-update run (or install 2.1.257 directly)
  3. Run any command, e.g. claude --version
  4. 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.json return 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.

View original on GitHub ↗

3 Comments

MilkyWay008 · 1 day ago

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_AUTOUPDATER set 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.

sfuruya · 20 hours ago

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:

dyld: Symbol not found: (_DNSServiceGetAddrInfoEx)
Referenced from: '/Users/.../.local/share/claude/versions/2.1.257'
Expected in: '/usr/lib/libSystem.B.dylib'

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).

adamjali · 14 hours ago

2.1.258 fixes it. Confirmed on the same machine that hit this, macOS 12.7.4 Monterey on Intel:

$ claude --version
2.1.258 (Claude Code)

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:

  • 2.1.257 imported _DNSServiceGetAddrInfoEx and _kDNSServiceAttrAllowFailover as strong, non-weak references. 2.1.258 is back to plain _DNSServiceGetAddrInfo and drops the attribute constant.
  • LC_BUILD_VERSION minos is 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.
  • Diffing the full dynamic import tables, the only additions in 2.1.258 over the known-good 2.1.252 are two ordinary std::string methods, 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.