리눅스는 (텍스트가 아닌) 바이너리를 실행하기 위해 어떤 기능을 사용할지를 어떻게 결정합니까?


23

Linux는 shebang 라인을 사용하여 스크립팅 언어에 사용할 인터프리터를 결정하지만 바이너리에서는 어떻게 작동합니까?

Linux 바이너리를 실행할 수 있고 winemono , Windows 네이티브 및 .NET 바이너리를 모두 설치할 수 있습니다 . 그리고 그들 모두를 위해 그것을 ./binary-name실행하는 것은 단지 (PATH에 없다면)입니다.

Linux는 주어진 바이너리가 Linux 네이티브 바이너리, Windows 네이티브 바이너리 ( 와인 기능 사용) 또는 Windows .NET 바이너리 ( 단일 기능 사용) 로 실행되어야한다고 어떻게 판단 합니까?

답변:


29

한마디로 : binfmt_misc . 리눅스 전용의 이식성이없는 시설입니다.

내장 로직으로 커널이 인식하는 몇 가지 형식이 있습니다. 즉, ELF 형식 (일반 바이너리의 경우)과 shebang 규칙 (스크립트의 경우)입니다. ( 답의 다음 부분에 대해 zwol 에게 감사드립니다 ). 또한 Linux는 난해하거나 오래되었거나 호환되지 않는 내장 형식을 인식합니다. 당신은 아마 그들을 만나지 않을 것입니다. 그들은이다 a.out"em86", "평면"및 "elf_fdpic".

다른 모든 것은 binfmt_misc 시스템을 통해 등록해야합니다. 이 시스템을 사용하면 마법 번호와 해당 인터프리터를 기반으로 간단한 패턴 검사를 커널에 등록 할 수 있습니다.


6
OP가 Linux를 명시 적으로 요구했지만 Linux 및 다른 Unix 계열 시스템에서 작동하는 다른 많은 솔루션과 달리 이것은 완전히 Linux에 국한된다는 점에 주목할 가치가 있습니다.
cubuspl42

6
컴파일되지 않을 수도 있지만 Linux 소스 트리에는 a.out일반 ELF뿐만 아니라, "em86", "flat"및 "elf_fdpic"형식에 대한 내장 지원이 여전히 포함되어 있습니다. em86을 제외한 모든 것은 기본 이진 실행 가능 형식 인 것 같습니다. "flat"또는 "elf_fdpic"을 사용할시기를 알 수있는 정보가 충분하지 않습니다. em86은 특정 x86 에뮬레이터를 실행하기위한 pre-binfmt_misc 메커니즘 인 것으로 보이며, 이전 버전과의 호환성을 위해서만있을 것입니다.
zwol

2
데비안 리눅스에서 (RedHat 및 기타를 확인하지 않았습니다) 모든 현재 binfmt 항목을 표시하는 명령은update-binfmts --display
golem
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.