Mac OS X과 Linux 간의 이진 호환성


27

스스로를 속이십시오.이 질문은 시스템과 같은 유닉스의 내부 작업과 일반적으로 프로그래밍에 대해 비교적 새로운 것으로 보았을 때 순진하고 어리석은 것처럼 보일 것입니다.

준비된? 승인! 나는 약 3 단계의 ludicrosity를 겪을 것이고, 내가 갈수록 증가합니다.


우리는 비슷한 하드웨어를 가진 두 개의 시스템을 가지고 있습니다 (주요 지점은 표준 인텔 코어 2 듀오입니다).

하나는 (리눅스 배포판을 삽입하십시오 : 우분투는 이후에 사용될 것입니다), 다른 하나는 Mac OS X이라고 말하고 있습니다.

하나는 동등한 프로그램을 컴파일합니다.

int main()
{
    int cat = 33;
    int dog = 5*cat;
    return dog;
}

공유 라이브러리의 의미를 아직 고려하고 싶지 않기 때문에 코드는 매우 간단합니다.

해당 시스템에서 컴파일 할 때. ELF와 Mach-O의 결과가 출력의 주요 차이점이 아닙니까? 플랫 바이너리를 남기고 포맷의 각 바이너리를 제거해야한다면 분해 된 기계 명령어가 동일하지 않습니까? (컴파일러 습관 / 경향에 따라 약간의 차이가있을 수 있습니다).

1.) 우분투 시스템에서 생성 된 플랫 바이너리를 Mach-O 형식으로 재 포장하는 프로그램을 개발하려는 경우 Mac OS X 시스템에서 실행됩니까? 그렇다면 위의 가정 된 프로그램의 컴파일 된 바이너리 만 가지고 있고 플랫 바이너리를 다시 포장하기위한이 신비로운 도구를 가지고 있다면 간단한 프로그램을 Mac OS X 시스템에서 실행할 수 있습니까?


이제 좀 더 살펴 보겠습니다.

이제 다음과 같은 소스가있는 프로그램이 있습니다.

#include <stdio.h>
int main()
{
    printf("I like tortoises, but not porpoises");
    return 0;
}

2.) 이 프로그램이 컴파일되고 정적으로 링크되어 있다고 가정하면, 우리의 마법 프로그램은 여전히 ​​원시 바이너리를 Mach-O 형식으로 다시 패키지 할 수 있고 mac os X에서 작동합니까? 다른 바이너리에 의존 할 필요가없는 것으로 보았습니다 (이 경우 mac 시스템에는 없을 것입니다)


그리고 이제 최종 레벨을 위해;

3.) 이 가정 된 프로그램을 사용하여 필요한 모든 공유 라이브러리를 Mach-O 형식으로 변환 한 다음 대신 동적 링크로 위의 프로그램을 컴파일하면 어떻게 될까요? 프로그램이 계속 실행됩니까?

현재로서는 불합리한 각 단계가 이전의 기초에 의존하여 이해하기 쉽습니다. 따라서 첫 번째 기둥이 파괴되면 나머지 계층에 많은 장점이 있는지 의심합니다.

나는 GUI를 염두에 둔 프로그램으로 이것을 생각하지 않을 것입니다. 윈도우 시스템은 아마도 다른 두통 일 것입니다. 이 단계에서는 명령 줄 프로그램 만 고려하고 있습니다.

이제 저는 세상에 저를 바로 잡아달라고 말하고 부조리 한 사고 방식에 문제가있는 모든 것을 말해주었습니다.


: OS X 바이너리 와인의 동등한 달링 darling.dolezel.info
strugee

답변:


25

중요한 것을 잊어 버리십시오. 즉, 흥미로운 일을하기 위해서는 프로그램이 운영 체제와 상호 작용해야합니다.

리눅스와 OS X의 관례는 다르기 때문에 동일한 바이너리는 그대로 운영 할 수 없으며 운영 체제 의존 코드가 없어도 상호 작용할 수 있습니다. 이러한 것들 중 많은 것들이 라이브러리에 숨겨져 있으므로 링크해야합니다. 즉, 프로그램을 연결할 수 있어야하고 두 시스템간에 연결도 다릅니다.

그리고 계속해서 진행됩니다. 표면에서 같은 일을하는 것처럼 들리는 것은 실제 세부 사항에서 매우 다릅니다.


5
이것은 기본적으로 문제가 무엇인지에 대해서는 정확하지만 문제는 실제로 라이브러리 (드래그 될 수 있음)가 아니라 OS 커널에 대한 요청 인 시스템 호출입니다. OS가 호환 가능한 시스템 호출 인터페이스를 제공하지 않으면 운이 좋지 않습니다.
mattdm

1
아아, 이거 훌륭합니다. 이것은 내가 바랐던 건설적인 정정의 종류입니다. 고마워요 : D이 시스템 호출에 대해 더 알려 주시거나 더 배울 수있는 곳으로 안내해 주시겠습니까?
zec

3
그들은 "추정 된"것이 아니라 실제입니다. :) 여기에 좋은 출발이 있습니다 : ibm.com/developerworks/linux/library/l-system-calls
mattdm

7
즉, "미친"아이디어가 완전히 불가능한 것은 아닙니다. 단지 많은 작업. Wine 프로젝트는 기본적으로 Linux (또는 OS X)에서 MS Windows 바이너리를 실행하기위한 프로젝트입니다. 시스템 호출을위한 변환 계층을 제공합니다. wiki.winehq.org/…
mattdm

1
글쎄, 나는 그것이 완전히 불가능하지는 않을 것이라고 생각했지만, 내가 묘사 한 것만 큼 간단하지는 않을 것이라고 생각했다. 나는 고칠 의도로 질문을 썼다. 이것은 때때로 "Linux 바이너리를 Mac OS에서 실행하도록 변환하는 방법"과 같은 직접적인 질문을하는 것보다 문제의 핵심을 이해하는보다 효율적인 방법 인 것 같습니다. 또한 나는 때때로 와인을 사용했지만, 이전에는 어떻게 작동했는지에 대해 깊이 생각해 본 적이 없었습니다. 지금은 나중에 살펴볼 것이라고 생각합니다.
zec

17

누군가가 충분한 시간을 보내려고 할 때 가능합니다. 달링 프로젝트는 이 글을 작성로서, 그것은 매우 원시적 인 상태로 비록,이 시도된다.

다른 플랫폼에서 이전에 성공적으로 수행되었습니다.

OS X에는 FreeBSD가 많이 포함 되어 있으므로 Linux 지원을 포팅하는 것이 간단 할 수 있습니다.


2
이것이 Linux 프로그램 → 다른 플랫폼에 큰 영향을 미치지 않는 이유 중 하나는 소스를 사용할 수없는 중요한 Linux 전용 앱이 없다는 것입니다. OS X 또는 Solaris에서 프로그램을 실행하고 다시 컴파일하려고합니다. 리눅스 고유의 방식으로 코드가 작성된 위치에 약간의 포팅이있을 수 있지만 일반적으로 호환성 레이어를 유지하는 것과 비교하면 많은 작업이 아닙니다. Netscape가 Linux 전용으로 배포 된 바이너리 일 때 FreeBSD의 Linux 호환성은 큰 문제였으며, 아마도 여전히 Adobe Flash Player에 사용될 것입니다.
mattdm

@ Jörg W Mittag — 또한 다른 플랫폼의 시스템 라이브러리가 필요했습니다. 이것은 AutoZone에 대한 소송의 기초 일 수 있습니다. 그러나 솔직히 나는 세부 사항을 잊고 간신히 신경 쓰지 않습니다. :)
mattdm

기본적으로 운영 체제 X가 운영 체제 Y와 동일한 서비스를 제공하는 경우 바이너리는 두 가지 모두에서 실행될 수 있습니다. 이것은 사실이지만, 내가 OS X에서이 방법으로 호환되는 모든 운영 체제의 인식입니다 시스템 X 용 의도적 인 노력이 필요
Thorbjørn Ravn 안데르센

썩은? 내가 보여 줄게
GnP

3

나는 모든 사람들과 동의하지만, 상당한 시간과 노력이 들지만, 와인을 개발하는 데 걸리는 것만 큼 크지는 않을 것이라고 덧붙이고 싶습니다.

Wine 개발에서 어려운 점은 폐쇄 형 소스 운영 체제에서 이진 형식을 포팅하고 있으며 많은 시스템 호출이 문서화되어 있지 않다는 것입니다. 운영 체제를 근본적으로 역 엔지니어링해야했습니다.

누군가가 하나의 개방형 OS에서 다른 개방형 OS 로이 작업을 수행하는 경우 동등한 기본 시스템 호출로 호환성 계층을 다른 OS에서 복사 / 붙여 넣을 수 있기 때문에 1/10의 시간 내에 완료 할 수 있습니다. 존재하지 않습니다. 물론 POSIX 세계의 대부분의 경우 기본 통화가 가능합니다.

주목해야 할 또 다른 프로젝트는 ReactOS인데, 여기에서 본질적으로 완전한 바이너리 호환 버전의 Windows를 만들지 만 와인이 필요하지 않습니다.


1

macOS에서는 기술적으로 가능하지만 많은 노력이 필요하지는 않지만 일부 노력은 이미 우리를 위해 수행되었습니다.

  • macOS와 리 브랜딩 된 Red Hat Enterprise Linux는 모두 UNIX 03으로 인증되었습니다. 이는 원칙적으로 POSIX 호출이 동일한 API를 가져야 함을 의미합니다.
  • macOS와 Linux는 모두 amd64 플랫폼에 System V ABI를 사용합니다. 이는 amd64 macOS 및 Linux의 경우 호환되는 ABI 및 API가 있어야 함을 의미합니다.
  • macOS는 Mach-O를 기본 실행 파일 형식으로 사용하고 Linux는 ELF를 사용합니다. 실행 파일 형식을 사용하여 호환성 계층을 호출해야하는지 여부를 구별 할 수 있기 때문에 훨씬 쉽게 작업 할 수 있습니다. 이것은 다음과 같은 것을 요구할 것입니다binfmt_misc그래도 .
  • 정확하게 제공하는 타사 macOS 커널 확장이 있습니다. 이제 macOS에 ELF를로드하도록 설득 할 수있는 방법이 있습니다.ld-linux.so 있습니다. ELF를로드하고 실행하는 Mach-O 실행 파일 자체가 합니다.

이제 우리에게 필요한 것은 적어도 특별합니다 ld-linux.so 다음을 수행 할 수 입니다.

  • Mach-O 실행 파일이거나 dyld 그 자체가되어야합니다.
  • 올바른 주소의 Linux ELF 파일을 메모리에로드 할 수 있습니다.
  • 희망 맥 OS들 (예 리눅스 불리는지도 할 수있는 능력이있다 /lib/libc.so.6/lib/libSystem.B.dylib일치하는 ELF가 발견되지 않을 때 우리는 맥 OS 라이브러리를 재사용 할 수 있도록, 마하-O 해당) 및로드를

직접 syscall을 작성하지 않는 ELF 이상의 로더 만 있으면 작업 할 가능성이 높지만 syscalls가있는 ELF는 작동하지 않을 수 있습니다. 유용한 두 번째 구성 요소는 Linux syscall을 잡아서 macOS에 매핑하는 커널 확장입니다. 데스크톱 사용시 Linux 그래픽 호출을 OpenGL.framework및 에 매핑하려면 특수 메사 구현이 필요합니다 Metal.framework.


0

도움이 될만한 특수한 Linux 응용 프로그램이 많이 있습니다. FPGA 측면에서 Quartus와 Vivado는 Linux에서 실행되는 프로그램의 좋은 예이며 최신 FPGA를 대상으로하는 유사한 프로그램이나 그와 유사한 프로그램에 사용할 수있는 소스 코드는 없습니다.

귀하의 질문에 대한 간단한 대답은 소스가있는 MacOS에서 다시 컴파일하고 시간이 있으면 기능을 제공하는 그룹을 형성하는 것입니다. 시간이 많이 걸리는 작업입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.