Rolldown 팀이 Termux 환경에서 실행되는 Android ARM64 기기에서 Vite가 “Illegal instruction” 오류로 인해 충돌하는 문제를 해결하는 수정 사항을 병합했습니다. 개발자들이 코드를 실행하기도 전에 빌드가 중단되는 현상을 10개월 동안 지켜본 끝에, 마침내 문제가 해결되었으며 npm의 다음 Rolldown 릴리스부터는 별도의 설정 없이 바로 사용할 수 있습니다.
왜 이 충돌이 중요했는가
Termux는 사용자가 Android 폰에서 Linux 스타일의 환경을 실행할 수 있게 해주며, 점점 더 많은 커뮤니티가 이를 유일한 개발 워크스테이션으로 활용하고 있습니다. 방글라데시, 나이지리아, 인도네시아의 많은 프로그래머들은 웹 애플리케이션을 작성하고 번들링하기 위해 노트북 대신 휴대폰을 사용합니다. 수많은 현대적 사이트를 구동하는 빠른 빌드 도구인 Vite는 이러한 워크플로우의 핵심 부분입니다. Vite를 시작하려고 하면 즉시 “Illegal instruction” 오류가 발생하며, JavaScript가 파싱되기도 전에 프로세스가 종료되었습니다. 이 오류는 네이티브 라이브러리를 로드하는 중에 발생했기 때문에 스택 트레이스(stack trace)나 로그를 남기지 않았고, 이로 인해 개발자들은 명확한 해결 방법 없이 막막한 상황에 처했습니다.
기술적 불일치
근본 원인은 Rolldown의 네이티브 바인딩에 내장된 저수준(low-level) 가정에 있었습니다. 해당 코드는 프로세서가 ARMv8.1 명령어를 지원한다고 가정했는데, 이 명령어 세트는 최신 칩에는 존재하지만 Cortex-A53과 같이 널리 사용되는 많은 Android SoC에는 없습니다. 해당 명령어가 없는 기기에서 라이브러리를 로드하려고 하면 CPU는 illegal-instruction 예외를 발생시킵니다.
상황을 더 복잡하게 만든 것은, 문제가 된 코드가 mimalloc이라는 의존성에 포함되어 있었다는 점입니다. mimalloc은 지원되지 않는 명령어 사용을 차단하도록 설계된 안전 플래그를 포함하는 메모리 할당자입니다. 하지만 이 플래그는 “표준 Linux” 환경에서만 작동했습니다. Android는 Linux 커널을 사용하지만 자신을 다르게 식별하기 때문에, 안전 장치가 활성화되지 않았고 충돌이 그대로 발생했습니다.
수정 사항이 구축된 방식
병합된 변경 사항은 mimalloc의 안전 검사를 확장하여 Android(및 FreeBSD)를 동일한 보호가 필요한 플랫폼으로 인식하도록 합니다. 개발자들에게 패키지를 다시 빌드하거나 교체하도록 강요하는 대신 라이브러리를 직접 패치함으로써, 최종 사용자에게 추가적인 단계 없이 호환성을 복구합니다.
개발자가 얻는 이점
- 커스텀 Termux 패키지가 필요하지 않습니다. 이제 Rolldown의 표준 npm install은 새로운 안전 검사를 준수하는 바이너리를 가져옵니다.
- 즉각적인 테스트가 가능합니다. 열려 있는 pull request에 첨부된 프리뷰 빌드를 통해, 다음 공식 Rolldown 버전이 npm에 출시되기 전이라도 ARM64 Android 기기를 가진 누구나 오늘 바로 수정 사항을 확인할 수 있습니다.
남은 고려 사항
해결은 Rolldown 유지 관리자가 업데이트된 패키지를 게시하는 것에 달려 있습니다. 그전까지 사용자는 프리뷰 빌드에 의존해야 합니다.
다음 확인 사항
- npm 출시 타이밍. Rolldown 변경 로그(changelog)를 계속 주시하십시오. 새 버전이 레지스트리에 등록되는 즉시, 간단한
npm install rolldown명령으로 운영 환경에 수정 사항을 적용할 수 있습니다.
이번에 병합된 패치는 몇 달간 지속된 교착 상태를 일상적인 업데이트로 바꾸어 놓았습니다. 이는 실제 사용 데이터와 커뮤니티의 지속적인 보고가 어떻게 "계획되지 않은" 버그를 해결된 문제로 바꿀 수 있는지를 보여줍니다. 휴대폰으로 웹 앱을 구축하는 모든 이들에게, 다음 Rolldown 릴리스는 마침내 프로세서를 중단시키지 않고 Vite를 시작할 수 있게 해줄 것입니다.
