크로스 컴파일이 가능하려면 비결이 있습니다. 정적 qemu 바이너리를 파일 시스템에 복사 <different-arch-root-to-be>/usr/bin
하고 해당 파일 시스템으로 chroot하면 파일 시스템에 비네이티브 바이너리가 있고 마술처럼 이러한 바이너리를 파일에서 사용할 수 있습니다. 호스트 CPU에 의해 실행되고 uname -a
유사하게 대상 아키텍처에 있음을 선언합니다. 최종 결과는 매우 간단한 크로스 컴파일을 얻을 수 있다는 것입니다.
작동할 수 있는 방법을 상상할 수 있지만 chroot
주의할 점이 있습니다 qemu
.
그렇습니까? 이것이 어떻게 작동하는지에 대한 문서를 찾을 수 없는 것 같습니다.
답변1
Linux에는 파일을 실행하라는 지시가 있을 때 커널이 인터프리터 프로그램을 호출하도록 플러그인을 등록할 수 있는 메커니즘이 있습니다.binfmt_misc. 간단히 말하면, 실행 파일이 실행될 때 커널은 다음과 같이 처음 몇 바이트를 읽습니다.
- 4바이트로 시작하고
\x7fELF
그 뒤에 유효한 것처럼 보이는 ELF 헤더가 옵니까? 그렇다면 다음을 사용하십시오.매우 낮은 주파수커널의 로더는 프로그램을 로드하고 실행합니다. - 2바이트로 시작합니까
#!
(셰르본)? 그렇다면 첫 번째 줄을 읽고 뒤따르는 내용을 구문 분석한#!
후 해당 줄을 실행하고 경로를 실행 파일에 인수로 전달합니다. - binfmt_misc 메커니즘을 통해 등록된 마법 값 중 하나로 시작되나요? 그렇다면 등록된 인터프리터가 실행됩니다.
Qemu를 통해 외부 아키텍처 바이너리를 실행하려면 지원되는 각 아키텍처의 ELF 헤더에 해당하는 매직 값을 binfmt_misc 메커니즘을 통해 등록해야 합니다. /proc/sys/fs/binfmt_misc/
현재 커널에 등록된 binfmt_misc 인터프리터 세트를 나타내는 특수 파일 시스템인 디렉토리를 나열하여 지원되는 내용을 확인할 수 있습니다 . 예를 들어:
cat /proc/sys/fs/binfmt_misc/qemu-arm
enabled
interpreter /usr/bin/qemu-arm-static
flags:
offset 0
magic 7f454c4601010100000000000000000002002800
mask ffffffffffffff00fffffffffffffffffeffffff
따라서 실행 파일이 지정된 /somewhere/foo
매직 바이트로 시작하는 경우 ./somewhere/foo arg1 arg2
/usr/bin/qemu-arm-static /somewhere/foo arg1 arg2
이 메커니즘은 chroot를 사용하지 않고도 작동하며 실행 파일은 어디에나 위치할 수 있습니다. 동적 실행 파일이 작동하도록 하려면 chrooting 이 편리합니다. 동적 실행 파일에는 로더에 대한 절대 경로가 포함되어 있으므로 예를 들어 ARM 실행 파일을 실행하면 /lib
로더가 실제로 위치할 것으로 예상합니다 . /different-arch-root-to-be
실행 파일은 로더를 찾기 위해 디렉토리를 chroot해야 합니다.