Binaryen - WebAssembly 컴파일러 및 최적화 도구 체인 치트시트
Binaryen - WebAssembly 컴파일러 및 최적화 도구 체인 치트시트
Binaryen은 C++로 작성된 WebAssembly용 컴파일러 및 도구 체인 인프라 라이브러리입니다. 헤드라인 도구인 wasm-opt는 wasm 모듈을 중간 표현으로 로드하고 최적화 및 변환 passes를 실행합니다 — Emscripten과 같은 도구 체인이 wasm을 축소하고 가속화하기 위해 사용하는 동일한 메커니즘입니다. 역공학자의 경우 Binaryen의 분석기 (wasm-dis)와 분석/변환 passes (난독화 해제와 유사한 단순화 포함)는 WABT를 보완하는 유용한 도구입니다.
설치
| 플랫폼 | 명령어 |
|---|---|
| macOS (Homebrew) | brew install binaryen |
| Debian/Ubuntu | sudo apt install binaryen |
| Arch Linux | sudo pacman -S binaryen |
| npm | npm install -g binaryen (JS 바인딩) |
| 소스에서 | WebAssembly/binaryen 저장소에서 CMake로 빌드 |
| 확인 | wasm-opt --version |
핵심 도구
| 도구 | 수행 |
|---|---|
wasm-opt | 모듈 로드, 최적화/변환, 재내보내기 |
wasm-dis | .wasm → 텍스트 분석 |
wasm-as | 텍스트 → .wasm 어셈블 |
wasm-metadce | 모듈 + JS 전체의 데드코드 제거 |
wasm-ctor-eval | 빌드 타임에 생성자 평가 |
wasm-reduce | 동작을 보존하면서 모듈 축소 (버그 재현) |
wasm-shell | 스펙 테스트 셸 실행 |
모듈 최적화
# 속도와 크기 최적화
wasm-opt -O3 module.wasm -o module.opt.wasm
# 크기를 위해 공격적으로 최적화
wasm-opt -Oz module.wasm -o module.small.wasm
| 플래그 | 효과 |
|---|---|
-O / -O1..-O4 | 속도를 위한 증가하는 최적화 |
-Os | 크기 최적화 |
-Oz | 크기를 위한 공격적인 최적화 |
--enable-FEATURE | wasm 제안 활성화 (simd, threads, …) |
-o FILE | 출력 파일 |
개별 Passes 실행
wasm-opt는 선택적으로 실행할 수 있는 많은 이름이 지정된 passes를 노출합니다 — 역공학 (난독화된 코드 단순화)뿐만 아니라 빌드에도 유용합니다.
# 사용 가능한 모든 passes 나열
wasm-opt --help | grep -A2 "passes:"
# 특정 passes 실행 (예: 단순화 + 미사용 제거)
wasm-opt module.wasm --precompute --simplify-locals \
--remove-unused-names --vacuum -o clean.wasm
| Pass (예) | 목적 |
|---|---|
--precompute | 상수 표현 폴드 |
--simplify-locals | 중복 로컬 사용 감소 |
--vacuum | 명백히 데드 코드 제거 |
--remove-unused-module-elements | 미사용 함수/전역 제거 |
--flatten / --rereloop | 제어 흐름 재구성 |
분석 / 어셈블
# Binaryen의 텍스트 형식으로 분석
wasm-dis module.wasm -o module.wat
# 다시 어셈블
wasm-as module.wat -o module.wasm
역공학 사용: 단순화 후 읽기
실용적인 역공학 트릭은 Binaryen의 단순화 passes를 실행하여 컴파일러/난독화기 노이즈를 정리한 후 결과를 읽는 것입니다.
# 복잡한 모듈을 단순화한 후 WABT로 디컴파일
wasm-opt target.wasm --precompute --simplify-locals --vacuum -o simpler.wasm
wasm-decompile simpler.wasm -o simpler.dcmp
재현 최소화 (wasm-reduce)
# 스크립트가 여전히 관심 있는 동작을 보고하는 동안 모듈 축소
wasm-reduce big.wasm --command "node check.js" -o small.wasm
버그를 트리거하거나 특정 동작을 나타내는 최소 wasm을 격리하기에 좋습니다.
Binaryen vs 관련 도구
| 도구 | 초점 |
|---|---|
| Binaryen | wasm 최적화/변환/분석 (컴파일러 급) |
| WABT | 변환/검사/검증/디컴파일 |
| diswasm | 의사코드 디컴파일러 |
| wasm-tools | Rust 저수준 조작 |
역공학의 경우: Binaryen을 단순화하고, WABT/diswasm을 읽고, wasm-tools를 검증/변경하는 데 사용하세요.