OSX와 Linux 사이에 많은 차이점이 있다는 것을 알고 있지만 근본적으로 호환되지 않을 정도로 차이점이 있는 이유는 무엇입니까?
답변1
전반적인ABIsepp2k가 언급한 것처럼 바이너리 형식(Mach-O 대 ELF)뿐만 아니라 다릅니다.
예를 들어 Linux와 Darwin/XNU(OS X 커널)는 모두 sc
PowerPC 및 // int 0x80
x86 에서 시스템 호출 항목을 사용하지만 그 이후에는 공통점이 많지 않았습니다.sysenter
syscall
Darwin은 Mach 마이크로커널에서는 음수 시스템 호출 번호를 나타내고 BSD 모놀리식 커널에서는 양수 시스템 호출 번호를 나타냅니다.xnu/osfmk/mach/syscall_sw.h그리고xnu/bsd/kern/syscalls.master. Linux의 시스템 호출 수는 아키텍처에 따라 다릅니다.리눅스/아치/powerpc/include/asm/unistd.h,리눅스/아치/x86/include/asm/unistd_32.h, 그리고리눅스/아치/x86/include/asm/unistd_64.h— 그러나 모두 음수가 아닙니다. 따라서 분명히 시스템 호출 번호, 시스템 호출 매개변수, 심지어어느시스템 호출에는 차이가 있습니다.
표준 C 런타임 라이브러리도 다릅니다. Darwin은 대부분 FreeBSD의 libc를 상속하는 반면 Linux는 일반적으로 glibc를 사용합니다(그러나 eglibc, Dietlibc, uclibc 및 Bionic과 같은 대안도 있습니다).
OS 서버 통신의 GUI 프로그램인 전체 Cocoa Objective-C 라이브러리를 무시하면 전체 그래픽 스택이 다르다는 것은 말할 것도 없습니다. 물론 예외도 있습니다. Darwin에서 X를 실행할 수 있고 Linux에서 X를 우회할 수 있지만 OS X 애플리케이션은 절대 X와 통신하지 않습니다.
와인처럼 누군가가 노력을 기울이면
- Mach-O용 바이너리 로더 구현
- 모든 XNU 시스템 호출을 캡처하고 이를 적절한 Linux 시스템 호출로 변환합니다.
- 필요에 따라 CoreFoundation과 같은 OS X 라이브러리에 대한 대체 작성
- 필요에 따라 WindowServer와 같은 OS X 서비스에 대한 대체 작성
글쎄요, Linux에서 OS X 프로그램을 "기본적으로" 실행하는 것이 가능합니다. Kyle Moffet은 몇 년 전 첫 번째 프로젝트에서 몇 가지 작업을 수행하여 프로토타입을 만들었습니다.binfmt_mach-oLinux에서 프로젝트를 진행했지만 완료되지 않았으며 내가 아는 한 다른 유사한 프로젝트는 없습니다.
(이것은 이론상 전적으로 가능하며 유사한 노력이 여러 번 이루어졌습니다. Wine 외에도 Linux 자체는 HP-UX 및 Tru64와 같은 다른 UNIX에서 바이너리 실행을 지원합니다.그란딕스이 프로젝트는 Linux에 Plan 9 호환성을 제공하는 것을 목표로 합니다. )
누구가지다Linux용 Mach-O 바이너리 로더와 API 변환기를 구현하기 위해 열심히 노력하고 있습니다!
shinh/maloader - GitHub바이너리를 로드하고 사용자 공간에서 모든 라이브러리 호출을 캡처/번역하는 데 Wine과 같은 접근 방식을 취합니다. 시스템 호출과 모든 그래픽 관련 라이브러리를 완전히 무시하지만 많은 콘솔 프로그램을 실행하는 데 충분합니다.
꿀Maloader를 기반으로 라이브러리 및 기타 지원 런타임 비트를 추가합니다.
답변2
OSX 애플리케이션이 Linux에서 기본적으로 실행되지 않는 이유:
첫째, OSX는 Linux와 다른 바이너리 형식을 사용하므로 Linux는 OSX용으로 컴파일된 바이너리를 실행할 수 없습니다(Windows나 BSD용으로 컴파일된 바이너리를 실행할 수 없는 것처럼).
둘째, GUI 애플리케이션에 대해 이야기한다면 Apple의 GUI 툴킷 Cocoa는 a) OSX에서만 작동하고 b) X11에서는 실행되지 않습니다.
OSX 애플리케이션에 와인과 동등한 기능이 없는 이유:
와인이 반쯤 사용 가능한 상태에 도달하기 전에 수행해야 할 작업이 여전히 많습니다. OSX에 상응하는 제품에 대한 수요가 많지 않기 때문에 아직까지 그러한 프로젝트에 많은 노력을 기울인 사람은 없습니다.
답변3
OS X 응용 프로그램이 Linux에서 실행되지 않는 가장 중요한 이유는 이러한 운영 체제가 다른 시스템 호출을 사용하기 때문입니다.
일부 이전 답변에서는 라이브러리를 언급했지만 일반적으로 그렇지 않습니다. Core Foundation은 주로 CFLite라는 이름으로 Apple에서 오픈 소스로 제공되며 모든 플랫폼으로 쉽게 포팅될 수 있습니다(iTunes의 Windows 버전은 실제로 Core의 Windows 포트 위에 위치합니다). Foundation이며 일부 컴파일러를 수정했으며 Linux 배포판에서 clang을 사용하여 CFLite를 직접 만들 수 있습니다. Objective-C 환경(주로 Foundation 및 AppKit)을 Linux로 포팅하려는 오픈 소스 노력도 있습니다. 특히 OpenStep A인 GNUstep이 있습니다. Apple Cocoa 이전의 GNU 구현(NeXT Computer가 아직 있었을 때 시작되었습니다.)
누군가가 마음먹으면 모든 Mach-O 시스템 호출을 캡처하여 해당 Linux 시스템 호출로 변환하고 적절한 ABI 변환을 통해 이러한 오픈 소스 라이브러리 "상대 부분"을 바이너리에 동적으로 연결하는 로더를 설계할 수 있습니다.
참고로 Mach-O 애플리케이션의 소스 코드를 얻을 수 있다면 포팅을 고려해 볼 수도 있고 꽤 간단할 수도 있습니다. 예를 들어, OS와 함께 번들로 제공되는 TextEdit 애플리케이션은 NeXTSTEP(또한 OS X의 전신)에서 TextEdit 애플리케이션을 다시 컴파일하고 "© 1995 NeXT" 라벨도 유지합니다. TextEdit은 BSD에 따라 라이센스가 부여됩니다.
답변4
2012년 12월 8일에 새로운 프로젝트인 Darling이 출시되었습니다.