프로젝트 소개

이 프로젝트는 Bionic libc를 사용해 Android/Termux(aarch64)에서 네이티브로 실행되는 [Bun](https://bun.sh)의 수정된 빌드를 제공합니다. proot, glibc-runner, LD_PRELOAD, termux-exec 없음 — 모든 수정은 `#[cfg(target_os = "android")]` Rust 분기를 통해 바이너리에 직접 컴파일됩니다. ### 해결 내용 업스트림 Bun 1.4의 Android 빌드는 Termux에서 세 가지 남은 문제에 직면합니다: - `bun install`이 SIGSYS로 크래시 — Android의 zygote seccomp 프로필이 `fchmodat2`와 `openat2`를 ENOSYS 대신 트랩해 업스트림 런타임 폴백 실행 불가. - `bunx <pkg>`가 ENOENT로 실패 — npm shims가 `#!/usr/bin/env node` shebang을 보유하고 있으며 Android에는 `/usr/bin` 없음. - `bun:ffi cc()`가 TinyCC 비활성화 보고 — 업스트림이 Android에서 이 기능을 비활성화. 이 포크는 각 문제를 수정하기 위해 Bun v1.4.0 기준으로 7개의 소스 레벨 패치를 적용합니다. ### 기능 - **완전한 FFI 지원**: `dlopen`, `cc()`, `JSCallback` 모두 작동. - **Android용 TinyCC 활성화**: `memfd_create` + ARM64 long-call veneers를 통한 SELinux 안전 JIT 메모리. - **seccomp 트랩 우회**: `lchmod`가 트랩된 `fchmodat2` 대신 `fchmodat(AT_SYMLINK_NOFOLLOW)` 사용; resolver walk가 트랩된 `openat2` 대신 일반 `openat` 사용. - **shebang 재매핑**: 간 Interpreter가 없는 스크립트는 `/usr/bin` 같은 경로를 `$PREFIX/bin`으로 재매핑. - **`bunx` 작동**: 런처가 스크립트 시작을 위해 `argv[0]`를 올바르게 설정. ### 호환성 | 항목 | 상태 | |---|---| | 아키텍처 | `aarch64` (arm64) | | Android | 10+ (API 29+, SELinux untrusted_app_27+) | | Bun 버전 | 1.4.0 | | `bun install` | 작동 (seccomp 우회) | | `bun run` / `bunx` | 작동 | | `bun build --compile` | 작동 (업스트림 수정) | | `bun:ffi` `dlopen` / `cc()` / `JSCallback` | 작동 | | opentui TUI | 작동 | ### 설치 ```bash curl -fsSL https://raw.githubusercontent.com/bd-loser/bun-termux/main/scripts/install.sh | bash ``` `bun`과 `bunx`를 `$PREFIX/bin`에 설치합니다. ### 소스 빌드 Rust, NDK r27c, clang 18, CMake, Ninja, 그리고 버스트래핑용 Bun 필요. 전체 지침은 [docs/BUILD.md](docs/BUILD.md) 참조. ### 라이선스 포크 패치: MIT / TinyCC 구성요소: LGPL-2.1 / 업스트림 Bun: MIT.