분포간에 실행 가능한 이진 파일 사이에 차이가 있습니까?

StackOverflow https://stackoverflow.com/questions/1030238

  •  06-07-2019
  •  | 
  •  

문제

모든 Linux 배포판이 동일한 커널을 사용하므로 실행 가능한 이진 파일 사이에 차이가 있습니까?

그렇다면 주요 차이점은 무엇입니까? 아니면 우리가 범용 Linux 실행 파일을 빌드 할 수 있다는 것을 의미합니까?

도움이 되었습니까?

해결책

모든 Linux 배포판은 동일한 바이너리 형식 ELF를 사용하지만 여전히 몇 가지 차이점이 있습니다.

  1. 다른 CPU 아치는 다른 명령어 세트를 사용합니다.
  2. 동일한 CPU 아치는 다른 ABI를 사용할 수 있으며 ABI는 레지스터 파일 사용 방법, 루틴을 호출/반환하는 방법을 정의합니다. 다른 ABI는 함께 작동 할 수 없습니다.
  3. 같은 아치에서도 같은 ABI에서도 여전히 하나의 이진 파일을 다른 바이너리 파일을 다른 바이너리 파일로 복사 할 수 있다는 의미는 아닙니다. 대부분의 바이너리 파일이 정적으로 연결되어 있지 않으므로 배포의 라이브러리에 따라 다르므로 다른 배포판이 라이브러리의 다른 버전 또는 다른 컴파일 구성을 사용할 수 있음을 의미합니다.

따라서 프로그램이 모든 배포판에서 실행되기를 원한다면 커널의 SyScall에만 의존하는 버전을 정적으로 연결해야 할 수도 있습니다.이조차도 지정된 아치 만 실행할 수 있습니다.

아치에서 프로그램을 실제로 실행하려면 모든 아치에 대해 바이너리를 컴파일하고 쉘 스크립트를 사용하여 올바른 스크립트를 시작해야합니다.

다른 팁

모든 Linux 포트 (즉, 다른 프로세서의 Linux 커널) 사용 꼬마 요정 실행 파일 및 라이브러리의 파일 형식으로 특정 ELF 바이너리에는 단일 아키텍처/OS가 실행될 수있는 단일 아키텍처/OS가 표시되어 있습니다 (일부 OS는 다른 OS에서 ELF BINARIE를 실행할 수있는 호환성이 있지만).

대부분의 항구는 오래된 항구를 지원합니다 A. 아웃 체재. (일부 프로세서는 A.out 실행 파일이 존재하지 않을 정도로 새로운 것이 었습니다.)

일부 포트는 다른 실행 파일 형식도 지원합니다. 예를 들어, PA-RISC 포트는 HP-UX의 오래된 것을 지원합니다. 실행 파일 및 μClinux (Nonmmu) 포트는 자체 플랫 형식을 지원합니다.

리눅스도 가지고 있습니다 binfmt_misc, 사용자 공간이 임의의 이진 형식에 대한 핸들러를 등록 할 수 있습니다. 일부 배포판은이를 활용하여 Windows, .NET 또는 Java 응용 프로그램을 실행할 수 있습니다. 실제로 통역사를 시작하고 있지만 사용자에게는 완전히 투명합니다.


Alpha의 Linux는 Intel Binaries 로딩을 지원합니다. em86 에뮬레이터.

등록 할 수 있습니다 binfmt_misc 다른 아키텍처의 실행 파일을 위해 qemu-user.

이론적으로, 뚱뚱한 바이너리에 대한 새로운 형식 (엘프에 새로운 "아키텍처"를 등록 할 수 있습니다. 그런 다음 커널 binfmt 로더는이 새로운 형식에 대해 가르쳐야 할 것이며, 당신은 ld-linux.so 동적 링커 및 전체 빌드 툴체인. 그러한 기능에 대한 관심은 거의 없었으며, 내가 아는 한 아무도 그와 같은 일을하지 않습니다.

거의 모든 Linux 프로그램 파일은 다음을 사용합니다 꼬마 요정 기준.

오래된 유닉스도 사용했습니다 체재. 이 형식으로 YORE의 시간부터 여전히 실행 파일을 찾을 수 있습니다. Linux는 여전히이를 지원하고 있습니다 (그러나 현재 배포판에서 컴파일되었는지 모르겠습니다).

모든 Linux 배포판을 실행하는 프로그램을 만들려면 사용을 고려할 수 있습니다. 스크립팅 언어 (처럼 Python 그리고 Perl) 또는 a 플랫폼 독립 프로그래밍 언어 처럼 Java.

스크립팅 언어로 작성된 프로그램은 실행 시간에 준수되므로 항상 실행되는 플랫폼과 일치하도록 컴파일되므로 항상 작동해야합니다 (라이브러리가 올바르게 설정되어야합니다).

작성된 프로그램 Java, 반면에 배포하기 전에 컴파일되지만 Java VM이 설치된 한 Linux 배포에서 실행할 수 있습니다.

또한 프로그램이 작성되었습니다 Java 같은 다른 운영 체제에서 실행할 수 있습니다 MS Windows 그리고 Mac OS.

많은 프로그램에 대해서도 마찬가지입니다 Python 그리고 Perl; 그러나 a Python 또는 Perl 프로그램은 다른 운영 체제에서 작동 할 것입니다. 해당 프로그램에서 사용되는 라이브러리와 이러한 라이브러리가 다른 운영 체제에서 사용할 수 있는지 여부에 따라 다릅니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top