거기 상황이 좀 이상해요. ARM 플랫폼(32비트)용 BusyBox 1.32.1의 정적 실행 파일을 컴파일했는데 이상하게도 두 플랫폼 모두에서 문제 없이 실행됩니다. 직접 살펴보세요:
root@smallbuntu /m/n/b/i/n/rootfs# readelf -h bin/busybox-initrd
ELF Header:
Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
Class: ELF32
Data: 2's complement, little endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI Version: 0
Type: EXEC (Executable file)
Machine: ARM
Version: 0x1
Entry point address: 0x1f419
Start of program headers: 52 (bytes into file)
Start of section headers: 1482800 (bytes into file)
Flags: 0x5000002, Version5 EABI, <unknown>
Size of this header: 52 (bytes)
Size of program headers: 32 (bytes)
Number of program headers: 6
Size of section headers: 40 (bytes)
Number of section headers: 27
Section header string table index: 26
root@smallbuntu /m/n/b/i/n/rootfs#
그 다음에:
root@smallbuntu /m/n/b/i/n/rootfs# bin/busybox-initrd ls
bin home media proc srv var
boot kobo mnt root sys
dev lib modules run tmp
etc lost+found opt sbin usr
root@smallbuntu /m/n/b/i/n/rootfs# bin/busybox-initrd uname -a
Linux smallbuntu 5.8.0-50-generic #56-Ubuntu SMP Mon Apr 12 17:18:36 UTC 2021 armv7l GNU/Linux
root@smallbuntu /m/n/b/i/n/rootfs#
uname -a
armv7l
busybox 바이너리에 의해 반환되는 것 같습니다 . 이것은 정상적인 출력입니다:
Linux smallbuntu 5.8.0-50-generic #56-Ubuntu SMP Mon Apr 12 17:18:36 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
무슨 일이 일어났는지 아세요?
감사해요!
답변1
내부를 살펴보면 다음과 같은 내용과 이름이 비슷한 파일이 /proc/sys/fs/binfmt_misc
보일 수 있습니다 .qemu-arm
enabled
interpreter /usr/bin/qemu-arm-static
flags: OCF
offset 0
magic 7f454c4601010100000000000000000002002800
mask ffffffffffffff00fffffffffffffffffeffffff
이는 커널에게 바이너리를 "해석"하도록 지시합니다.주어진 값에 맞는 매직값을 사용하세요 /usr/bin/qemu-arm-static
. 이를 통해 QEMU를 사용하여 ARM CPU를 에뮬레이트하고(ARM ABI와 일치하도록 시스템 호출을 수정) QEMU가 ARM CPU(64비트 x86 PC 포함)를 에뮬레이트할 수 있는 모든 시스템에서 ARM 바이너리를 투명하게 실행할 수 있습니다.
귀하의 경우 ARM 바이너리는 정적으로 링크되어 있으므로 추가 설정이 필요하지 않습니다. 동적으로 링크된 바이너리에는 기본 라이브러리도 사용 가능해야 합니다.
qemu-user-static
Debian 기반 시스템(Ubuntu 기반 시스템 포함)에서 이는 및 package에 의해 설정됩니다 binfmt-support
. qemu-user-static
패키지 등록 binfmt_misc
구성 QEMU는 다음 명령을 사용하여 처리할 수 있습니다.update-binfmts
, binfmt-support
패키지는 등록된 구성이 커널( binfmt_misc
커널 모듈)에 로드되도록 합니다.
당신은 또한 볼 수 있습니다Linux에는 어떤 유형의 실행 파일이 있습니까?,/proc/sys/fs/binfmt_misc/ 아래의 파일에는 어떤 유형의 실행 파일 형식이 허용됩니까?, 그리고모노의 놀라운 점은 무엇인가요?