갑작스러운 Emacs 실행 오류: libz.1.dylib 실종 사건 (feat. Antigravity)
오래간만에 Emacs로 뭔가를 하고 싶어 져서 Doom Emacs 스타일에 맞게 설정을 하고 doom sync를 진행했다. 그런데 하는 도중 갑자기 못 보던 오류가 발생했다.
$ ~/.config/emacs/bin/doom sync
dyld[92444]: Library not loaded: /usr/local/opt/zlib/lib/libz.1.dylib
Referenced from: <XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX> /usr/local/Cellar/emacs-plus@30/30.2/Emacs.app/Contents/MacOS/Emacs
Reason: tried: '/usr/local/opt/zlib/lib/libz.1.dylib' (no such file), '/System/Volumes/Preboot/Cryptexes/OS/usr/local/opt/zlib/lib/libz.1.dylib' (no such file), '/usr/local/opt/zlib/lib/libz.1.dylib' (no such file)
/Users/seorenn/.config/emacs/bin/doom: line 13: 92444 Abort trap: 6 emacs -q --no-site-file --batch --eval "(setq warning-inhibit-types '((files missing-lexbind-cookie)))" --load /Users/seorenn/.config/emacs/bin/doom -- sync
이 오류가 발생했을 때 이런 GUI 오류 팝업도 떴었다.
메시지의 내용은 정말 간단했다. libz.1.dylib 파일이 사라졌다는 거다. dylib이라는 이름에서 동적 라이브러리 파일이고 libz면 이미지 관련 라이브러리일 것임을 유추했다. 당연히 이는 Emacs 구동에 중요한 파일일 것이다.
그런데 가장 큰 문제는 이게 왜 사라졌냐는 것이다. 하지만 힌트가 너무 없었다. 그 사이에 있었던 일이라곤 Antigravity CLI(이하 agy)에게 Emacs 설정 파일 개선에 대해 뭔가를 물어보고 약간 변형을 가하게 한 것이 전부였다. Gemini에게 물어봐도 딱히 설득력 있는 대답은 찾을 수 없었다.
설마 해킹당한 걸까? 이것 조차도 판단하긴 참 어려웠다.
결국 원인에 대해서는 짐작도 못 했지만 그대로 놔둘 수도 없었다. 그래서 일단은 이 libz.1.dylib을 다시 부활시키기로 했다.
이 글은 이 libz.1.dylib 부활과 관련된 일기에 가까운 글임에 주의하자.
libz.1.dylib 부활시키기
일단 이 문제 해결을 위해 agy에게 물어보니 jpeg 패키지와 관련이 있다는 것 같다. 그래서 이 패키지를 Homebrew를 통해 우선 설치해 봤다.
brew install jpeg
아무 문제없이 설치가 되었다. 근데 이것도 좀 이상하다. 실종되었다면 그전에 이 패키지가 원래는 설치되어 있었어야 하는 게 아닌가 하는 의문이 들었다. 하지만 이것도 짐작할 만한 힌트가 없었다. 그래서 그냥 넘어갈 수밖에 없었다.
어쨌거나 그냥 설치가 되었다는 점에서 문제 해결은 안 되었을 것이라고 유추 가능하다. 실제로도 실종된 파일은 여전히 없다는 오류가 떴다. agy라고 완벽할 리는 없을 거다.
이후로 진척이 없었다. AI도 명쾌한 해답이 없었는데 검색으로도 뭔가 답이 나올 리가 없었다.
그러다 갑자기 어떤 생각이 들었다. 있던 파일이 사라졌다면 혹시 패키지 관리 쪽에서 뭔가 문제가 생긴 게 아닐까 말이다. 그래서 Homebrew에 뭔가 문제가 있나 살펴봤다.
brew doctor
그랬더니... 아니 도대체 무슨 문제가 이렇게 많이 나와? 관련이 아예 없는 건 아닐지도 모르겠다는 생각이 들었다.
그런데 Homebrew가 지적한 문제들을 하나하나 해결하기엔 좀 무리가 있어 보였다. 그래서 그냥 과감하게 이런 짓을 저질렀다.
brew upgrade
옛날에는 설치된 패키지들 업그레이드를 하루의 일과로 생각하던 때가 있었다. 하지만 어느 날 의존성이 꼬이고 깨지는 문제를 겪은 뒤론 딱히 시스템이 별다른 불평을 하지 않는 한은 이 업그레이드 커맨드를 사용하지 않고 있었다.
하지만 너무 오래 관리하지 않는 것도 문제를 키울 수 있을지도 모른다.
그래서 오랜만에 Homebrew 패키지들을 오랜만에 통째로 업그레이드를 시켰다. 재미있게도 업그레이드만 되는 게 아니라 disable 된 패키지를 cleanup 해주기도 하는 게 약간 신선한 느낌도 들었다.
그 후 꽤 오랜 시간이 흘렀다.
그런데 업그레이드가 점심 식사를 하고 왔는데도 안 끝났었다. 커피 한 잔을 마시고 왔는데도 안 끝났었다. 운동까지 하고 왔는데도 안 끝났었다. 마침 더운데 아이스크림이라도 먹자며 "야호 신난다 룰루랄라~"하며 시간을 더 때웠는데도 안 끝났다. 도대체 얼마나 오랫동안 관리가 안 된 것인지 느낄 수 있다. 낡고 늙은 맥북프로를 너무 혹사시키고 있는 것 같아서 약간 미안함 감도 없진 않았다.
한참 후에 드디어 업그레이드가 끝이 나있었다. 하지만 그렇다고 이 실종문제가 바로 해결되진 않았다.
결국 마지막 한 단계를 더 나아가기로 했다. Emacs를 새로 빌드하는 것이다.
brew reinstall emacs-plus@30 --with-imagemagick
옵션이 하나 더 붙어있는데 Emacs에서 AVIF 이미지가 안 보일 때를 대비해서 미리 imagemagick 지원을 추가해서 빌드하는 옵션이다.
잠시 후 빌드가 끝났다.
이번엔 리빌드이긴 하지만 reinstall이니 버전도 그대로일 것이고 그러니 Doom Emacs를 새로 빌드할 필요는 없겠지라며 두근거리며 실행을 시켜봤다.
다행히도 문제없이 바로 실행이 되었다. 실종사건 자체는 이걸로 해결되었다.
하지만 이어서 괜히 뭔가(?)를 긁어서 부스럼을 만들고야 말았다.
괜한 짓을 해서 또 문제를 키웠다
Emacs가 잘 돌아가니 "죽다 살아난 느낌이 이런 거구나"하며 안도했다. 그러다 갑자기 마음속에서 이상한 욕구가 올라왔다.
"너무 오래 관리를 안 하면 이 사달이 나는데 Doom Emacs도 그렇지 않을까?"
운명이라고 생각하고 '쓸 때마다 높은 확률로 문제를 일으켜 봉인해 뒀던' doom upgrade 커맨드를 정말 오랜만에 때려봤다.
~/.config/emacs/bin/doom upgrade
왜 이걸 운명이라고만 생각하고 뭔가 문제는 생기지 않을까를 생각하지 않았을까? 터미널에 바로 아래와 같은 오류가 찍히면서 갑자기 업그레이드가 중단되었다.
Message: Could not find package let-completion. Updating recipe repositories: (org-elpa melpa nongnu-elpa gnu-elpa-mirror el-get emacsmirror-mirror) with ‘straight-pull-recipe-repositories’ may fix this
"하아. 시X."
뭐가 한 번에 제대로 되는 게 없다.
하도 귀찮아져서 agy를 띄웠다. doom upgrade 도중에 문제가 생기는 것 같은데 처리해 달라고 부탁해 봤다. 그래. 이러려고 에이전트를 쓰는 거니 말이다.
친절한 agy는 문제를 직접 확인하기 위해 doom upgrade를 직접 실행시켰다. 참 신박하다. 정말이지 이런 에이전트 없이는 못 사는 세상이 곧 올 것 같다.
그런데 문제는 agy 녀석이 대답을 한참을 안 하더라는 점이다. 아마도 doom upgrade 진행 여부를 묻는 프롬프트에서 대답을 안 하고 그냥 멀뚱멀뚱 기다리는 거 아닌가 하는 느낌이 들었다.
그래서 바로 agy에게 진행을 중지해 달라고 한 다음 오류 메시지를 직접 붙여주면서 해결을 해달라고 부탁했다.
그러자 바로 뭔가 힌트가 되었는지 agy가 doom sync -u를 실행시켰다. 응? 이거 upgrade랑 비슷한 커맨드 아니었나?
참고로 'doom upgrade'는 Doom Emacs 코드 및 확장 패키지 전체를 업그레이드하는 명령이고 'doom sync -u'는 확장 패키지만 업그레이드하는 명령이다.
그런데 agy가 또 한참 대답을 안 하고 있었다. "이 녀석 또 진행 여부 프롬프트에서 멀뚱멀뚱하고 있는 거 아니야?" 이런 느낌이었다.
이번엔 agy에게 그냥 중단시키는 게 아니라 개선도 지시했다. "너 이 녀석 그냥 구경만 하고 있었지? 그럴 땐 y를 누르라고!" 이런 투로 말이다.
그러자 agy가 바로 알아들었는지 아래와 같은 바뀐 명령을 시도하였다.
doom --noninteractive sync -u
오오오. 아마도 프롬프트가 아예 안 뜨도록 바꾸려는 건가 보구나.
...
이후 AI 에이전트에 또다시 실망하는 계기를 겪었다.
agy는 위 커맨드를 실행시킨 이후로 또 한참 대답을 안 하고 있었다. 물론 업그레이드를 진행 중이어서 대답을 안 하는 것일 수도 있다. 하지만 그 시간이 너무 오래 걸리니 어쩔 수가 없었다.
"잘 되고 있니?"
그런데 이 말을 들은 agy가 갑자기 이전에 하던 일을 취소시켰다. 아니 왜???? 그리고 다른 방법을 갑자기 제시하기 시작했다. 아무리 봐도 해결이 될 것 같지 않은 것들을 말이다. 아니 그 사이에 도대에 무슨 일들이 있었던 거야? 확인할 뭔가는 보이지도 않고 답답했다.
결국 고생했다며 agy를 퇴근시켰다. 그리고 직접 doom sync -u도 같은 오류가 발생하는 것을 확인하였다. 정말 agy는 뭘 하고 있었던 걸까?
마지막으로 직접 최후의 커맨드를 입력했다.
rm ~/.config/emacs/.local/straight
~/.config/emacs/bin/doom sync -u
무사히 Doom Emacs의 재설치가 끝났다. 이에 이어서 doom upgrade도 했는데 이미 적용은 된 듯하니 아무 일도 없었다.
이후 Emacs도 정상적으로 실행되었다. 다만 엄청나게 느렸다. 아마도 또 뭔가 빌드 중인 듯하였다. 이건 기다리는 게 답이라 정말 끝이라고 보면 된다.
뭐 하여간 이걸로 이 일기는 끝이다. 이걸로 Emacs를 빌드하면 어떤 식으로든 문제는 생긴다는 것을 또 확인할 수 있었다. 하아....