Mach-O

Mach-O(Mach Object)는 Mach 계통의 운영체제를 위해 발전한 실행 파일·오브젝트 파일 형식이다. 실행 코드와 라이브러리, 심볼, 세그먼트·섹션, 로드 명령 및 동적 링킹에 필요한 정보를 저장하며, 현대에는 Darwin과 macOS·iOS의 네이티브 바이너리 형식으로 사용...

정식 명칭Mach Object
분류오브젝트 파일·실행 파일 형식
기술 계보Mach → NeXTSTEP → Darwin
주 사용 운영체제macOS, iOS 등
일반 확장자실행 파일, .o, .dylib, .bundle 등
핵심 구조헤더, 로드 명령, 세그먼트, 섹션
동적 링커dyld
아키텍처x86-64, ARM64 등
다중 아키텍처Universal Binary
관련 파일 형식ELF, PE/COFF
상태현대 Apple 운영체제에서 사용
공식 문서Apple Mach-O Topics

Mach-O(Mach Object)는 Mach 계통의 운영체제를 위해 발전한 실행 파일·오브젝트 파일 형식이다. 실행 코드와 라이브러리, 심볼, 세그먼트·섹션, 로드 명령 및 동적 링킹에 필요한 정보를 저장하며, 현대에는 Darwin과 macOS·iOS의 네이티브 바이너리 형식으로 사용된다. Linux·FreeBSD에서 흔한 ELF와는 별개의 파일 형식이다.[1]

Mach-O 파일은 실행 파일·동적 라이브러리·재배치 가능한 오브젝트 등에 필요한 메타데이터를 로드 명령(load command) 중심으로 기록한다. 헤더에는 CPU 아키텍처와 파일 종류 등이 지정되고, 로드 명령은 세그먼트와 섹션, 동적 링커·의존 라이브러리 및 진입점 같은 실행 정보를 설명한다. 프로그램의 기계어와 데이터는 각 세그먼트에 배치되며, 심볼·재배치 정보는 링킹 및 디버깅 도구에 활용된다.[2]

Darwin과 macOS에서는 dyld와 여러 도구가 Mach-O 바이너리를 적재하고 라이브러리 및 심볼을 처리한다. 여러 CPU 아키텍처용 바이너리를 하나의 파일에 담는 Universal Binary도 Apple 플랫폼에서 발전한 배포 방식이다. Mach-O는 Mach 커널 자체가 아니라 Mach 계열 운영체제를 위한 바이너리·링커 도구의 역사에서 발전한 파일 형식이며, ELF와는 헤더·링킹 정보 및 실행 환경의 규약이 다르다.

Mach-O의 로드 명령은 실행 파일을 메모리에 배치하는 과정에서 필요한 정보와 라이브러리 의존성, 심볼과 관련 메타데이터를 설명한다. 커널과 동적 링커는 프로그램 파일을 읽고 필요한 세그먼트를 매핑하며, dyld는 공유 라이브러리와 실행 파일의 연결을 담당한다. 각 세그먼트 안의 섹션은 코드·상수·데이터 등의 역할에 맞게 배치될 수 있어 컴파일러와 링커·디버거가 동일한 파일 구조를 활용한다.[3]

하나의 바이너리에 여러 CPU 아키텍처용 Mach-O 이미지를 저장하는 Universal Binary는 PowerPC·Intel 및 Apple silicon으로 이동하던 시기에 응용 프로그램 배포에 활용되었다. 파일 형식 자체는 운영체제 커널의 구조와 별개이며, Mach-O 코드를 생성했다고 해서 macOS 앱에 필요한 프레임워크·서명·런타임 요구 사항이 자동으로 충족되는 것은 아니다. Mach-O는 Mach 계보의 운영체제가 이용하는 응용 프로그램·도구 체인 기술로 분류한다.

역사

Mach 운영체제와 오브젝트 형식

NeXTSTEP

Darwin과 macOS

파일 구조

Mach-O 헤더

로드 명령

세그먼트와 섹션

심볼 테이블

재배치 정보

실행 파일과 라이브러리

동적 링커와 dyld

Fat·Universal Binary

코드 서명

CPU 아키텍처

개발 도구

ld64

otool

llvm-objdump

ELF와의 차이

관련 문서

  1. 관련 기술 문서 ↩
  2. Apple: Mach-O Runtime Architecture ↩
  3. Apple Mach-O Runtime Architecture ↩