x86-64 바이너리를 AArch64로 변환하는 Elevator, JIT 없는 정적 번역!

by DD
3주 전
조회수 6

Elevator는 x86-64 바이너리를 AArch64로 변환하는 정적 바이너리 번역기(Static Binary Translator)로, 디버깅 정보나 코드 레이아웃에 대한 가정을 하지 않음

모든 바이트의 가능한 해석을 고려하여 다중 번역(Multiple Translations)을 생성하며, 비정상 종료로 이어지는 경로만 제거

코드 크기 증가(Code Size Expansion)가 주요 단점이나, 인증 가능성(Certification) 측면에서 JIT 컴파일러(JIT Compiler)보다 유리

커뮤니티에서는 성능, 코드 크기, 그리고 자기 수정 코드(Self-Modifying Code) 처리에 대한 의문 제기

Elevator의 성능 및 QEMU와의 비교

Elevator는 QEMU의 사용자 모드 JIT 에뮬레이션과 동등하거나 더 나은 성능을 보인다고 보고되었다. 하지만, QEMU JIT의 성능 개선 여지에 대한 의문이 제기되었으며, 과거 x86-64에서 aarch64로의 JIT 엔진 개발 경험을 바탕으로 QEMU보다 더 나은 성능을 낼 수 있다는 의견도 제시되었다. 주목할 점은 Elevator가 JIT 컴파일러를 사용하지 않음으로써 얻는 인증 가능성(Certification)이다.

코드 크기 증가와 트레이드오프

Elevator는 모든 바이트의 가능한 해석을 고려하여 여러 번역본을 생성하므로, 코드 크기(Code Size)가 크게 증가하는 단점이 있다. 한 댓글에서는 텍스트 섹션의 크기가 50배 증가하는 것을 언급하며, 이는 결정적 번역(Deterministic Translation)을 위한 합리적인 대가일 수 있다고 평가했다. 하지만, 다른 댓글에서는 코드 크기 증가는 캐시 미스(Cache Miss)를 유발하여 성능 저하를 가져올 수 있다고 지적했다.

자기 수정 코드 및 제약 사항

Elevator는 모든 바이트를 가능한 모든 방식으로 해석하기 때문에, 자기 수정 코드(Self-Modifying Code)를 처리하는 데 어려움이 있을 수 있다. 또한, Elevator는 x86-64 아키텍처에만 초점을 맞추고 있으며, 32비트 프로그램 변환에 대한 지원은 제공하지 않는다. Rice's theorem에 따라, 악의적인 코드를 포함한 모든 경우에 대해 정적 번역을 수행하는 것은 불가능하다는 점이 강조되었다.

인증 가능성과 산업적 활용

Elevator의 가장 흥미로운 측면 중 하나는 인증(Certification) 가능성이다. JIT 컴파일러를 사용할 수 없는 규제 산업(항공, 의료 기기)에서 Elevator는 실행되는 코드가 인증된 코드임을 보장할 수 있다. 이는 정적 번역(Static Translation)을 통해 생성된 바이너리에 서명할 수 있기 때문이다. 이러한 특징은 코드 크기 증가에도 불구하고, 특정 산업 분야에서 Elevator의 실용적 가치(Practical Value)를 높인다.

Deterministic Fully-Static Whole-Binary Translation Without Heuristics