바이너리 파일은 다른 컴퓨터에서 어떻게 실행됩니까?

바이너리 파일은 다른 컴퓨터에서 어떻게 실행됩니까?

나는 항상 실행 가능한 바이너리 파일이 실제로 어떻게 작동하는지 궁금했습니다. 편집은 항상 다음과 같이 명시됩니다.

소스코드를 가져와서 기계어로 번역하는 것

하지만 그게 실제로 무엇을 의미하는 걸까요? 즉:

  1. 컴퓨터 A에서 컴퓨터 B로 바이너리 파일을 이동하고 작동할 것으로 기대할 수 있습니까? (적절한 라이브러리도 이동한다고 가정)
  2. 모든 실행 가능한 바이너리 파일은 특정 프로세서와 작동하도록 만들어졌습니까?
  3. 실행 가능한 바이너리 파일에는 어떤 종류의 정보가 들어있나요?
  4. Windows의 실행 파일을 모든 Windows 버전에서 실행할 수 있는 이유는 무엇입니까? (작동한다면 이야기가 다릅니다)
  5. Windows에서 Linux 실행 파일을 실행할 수 없는 이유는 무엇입니까? 커널(프로세서가 아님)과 관련이 있습니까?

나는 프로세서와 컴파일러에 대한 지식이 제한적이며 어셈블리에 대한 지식은 없습니다.

답변1

  1. 반드시 그런 것은 아닙니다. 이식성을 위해 빌드되었으며 플랫폼이 호환된다면 그렇습니다(예: 64비트 Windows 버전은 32비트 및 64비트 Windows 실행 파일을 실행할 수 있지만 더 이상 16비트 실행 파일은 실행할 수 없습니다).
  2. 반드시 그런 것은 아닙니다. 특정 명령어 세트를 위해 만들어졌습니다. 이는 일반적으로 확장 기능이고 이전 버전과의 호환성이 있으므로 최신 프로세서에서 오래된 파일을 실행할 수 있지만 반드시 그 반대일 필요는 없습니다. 예를 들어, Windows 95용으로 컴파일된 프로그램은 오늘날의 하드웨어에서도 여전히 실행될 수 있지만, 오래된 Windows 95 시스템에서는 최신 하드웨어용으로 컴파일된 프로그램을 실행할 수 없습니다. 그러나 두 시스템이 완전히 다른 명령어를 실행하는 경우 실행 파일은 호환되지 않습니다(예: Intel 대 ARM).
  3. 이는 플랫폼에 따라 다르며 헤더와 항목이 다른 여러 형식이 있지만 기본적으로 항상 색인으로 작동하는 일종의 헤더가 있어 운영 체제에 특정 항목(예: 기본 진입점)을 찾을 수 있는 위치를 알려줍니다.
  4. 실제로는 그렇게 할 수 없습니다(위의 #2 참조).
  5. 우선, Windows와 Linux는 실행 파일에 서로 다른 형식을 사용합니다. 그러나 그럼에도 불구하고 전체 환경과 제공된 플랫폼 API/라이브러리 등에는 차이가 있습니다. 예를 들어, Linux 실행 파일은 일반적으로 X11과 같은 창 관리자와 통신을 시도하는 반면 Windows 프로그램은 Windows API 호출을 시도합니다. 그러나 이러한 작업을 수행할 수 있는 방법이 있습니다. 이전 버전의 Windows(NT?)에는 실제로 POSIX 확장이 있어서 내가 아는 한 제한된 Linux 프로그램 세트를 실행할 수 있었습니다. 비록 실제로 시도해 본 적도 없고 자세히 살펴본 적도 없습니다. 반면에 Linux에는 API 파일, 경로 변환 등을 제공하여 Windows 환경을 에뮬레이트하는 Wine과 같은 도구가 있습니다. 가상 머신을 사용하는 것과 같이 완전한 에뮬레이션은 아닙니다.

답변2

  1. 매우 통제된 상황에서만: 두 컴퓨터 모두 호환 가능한 프로세서와 운영 체제가 있어야 합니다.

  2. 특정 프로세서가 아니라 호환 가능한 프로세서 세트입니다. 예를 들어 x86과의 호환성을 위해 컴파일되고 확장자가 없는 파일은 OS가 호환된다는 가정 하에 모든 Intel, AMD x86 또는 x64 프로세서에서 작동합니다.

  3. 무엇보다도 컴파일 단계의 기계어 코드입니다. 그 외에도 소위 "섹션"이라고 불리는 몇 가지 다른 리소스(실행 파일이 실행되고 있지 않더라도 Windows에서 전용 아이콘이 있는 이유가 궁금했지만 탐색기에는 표시됨), 바이너리 호환성에 대한 설명 및 더.

  4. 이는 1.의 부작용입니다. OS가 실행 가능한 형식과의 호환성을 제공할 때마다 실행할 수 있습니다. 최신 Windows 버전은 다양한 호환성을 제공합니다. DOS, Win16, Win32, Win64, dotnet이 가장 중요합니다.

  5. OS는 실행 파일에 실행에 꼭 필요한 환경을 제공합니다. 이러한 환경은 Linux와 Windows 간에 크게 다릅니다. 즉, 실행 파일을 서로 직접 실행할 수는 없습니다. 이러한 격차를 해소하기 위한 프로젝트가 진행 중입니다. WINE 프로젝트는 Linux(및 기타 OS)에서 Windows 실행 파일을 시작할 수 있도록 하는 것을 목표로 하고, Cygwin 프로젝트는 Windows에서 Linux 소프트웨어를 실행할 수 있도록 하는 것을 목표로 합니다. Cygwin은 바이너리 호환성을 목표로 하지 않지만 수정되지 않은 소스의 재컴파일을 허용합니다.

실행 파일(예: .exe)이 다음과 같다는 점을 이해하는 것이 중요합니다.~ 아니다컴파일 프로세스의 결과 - 다음의 결과입니다.연결3에서 설명한 내용을 생성하는 데 필요한 다른 구성 요소와 컴파일 출력을 결합하는 프로세스입니다.

관련 정보