BusyBox 정적으로 컴파일된 ARM 바이너리가 x86_64 PC에서 실행되는 이유는 무엇입니까? [복사]

BusyBox 정적으로 컴파일된 ARM 바이너리가 x86_64 PC에서 실행되는 이유는 무엇입니까? [복사]

거기 상황이 좀 이상해요. 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 -aarmv7lbusybox 바이너리에 의해 반환되는 것 같습니다 . 이것은 정상적인 출력입니다:

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-staticDebian 기반 시스템(Ubuntu 기반 시스템 포함)에서 이는 및 package에 의해 설정됩니다 binfmt-support. qemu-user-static패키지 등록 binfmt_misc구성 QEMU는 다음 명령을 사용하여 처리할 수 있습니다.update-binfmts, binfmt-support패키지는 등록된 구성이 커널( binfmt_misc커널 모듈)에 로드되도록 합니다.

당신은 또한 볼 수 있습니다Linux에는 어떤 유형의 실행 파일이 있습니까?,/proc/sys/fs/binfmt_misc/ 아래의 파일에는 어떤 유형의 실행 파일 형식이 허용됩니까?, 그리고모노의 놀라운 점은 무엇인가요?

관련 정보