COFF는 Common Object File Format의 약자로, 컴퓨터 시스템에서 사용되는 이진 파일 형식의 일종입니다. 주로 컴파일된 프로그램 코드(오브젝트 파일), 실행 파일, 공유 라이브러리 등의 저장을 위해 설계되었습니다. 이 형식은 AT&T System V 유닉스 시스템에서 처음 개발되었으며, 기계 독립적인 방식으로 오브젝트 파일을 표현하는 것을 목표로 했습니다.
개요
COFF는 컴파일러가 생성하는 중간 결과물인 오브젝트 파일과 링커가 오브젝트 파일들을 결합하여 생성하는 최종 실행 파일의 구조를 정의합니다. 이는 프로그램의 코드, 데이터, 심볼 정보, 재배치 정보 등을 체계적으로 구성하여, 운영체제가 해당 파일을 메모리에 로드하고 실행할 수 있도록 합니다.
역사
COFF는 1980년대 초반 AT&T System V 유닉스 시스템의 표준 오브젝트 파일 형식으로 등장했습니다. 당시 존재하던 여러 비표준 오브젝트 파일 형식들의 단점을 극복하고, 다양한 하드웨어 아키텍처에서 사용할 수 있는 유연한 형식을 제공하고자 했습니다.
COFF는 이후 다양한 유닉스 계열 운영체제에서 채택되거나 영향을 주었으며, 특히 마이크로소프트 윈도우 운영체제의 PE(Portable Executable) 형식은 COFF를 기반으로 확장된 형태입니다(PE/COFF). 그러나 대부분의 현대 유닉스 및 리눅스 시스템에서는 ELF(Executable and Linkable Format) 형식으로 대체되었습니다.
구조 및 주요 특징
COFF 파일은 여러 섹션으로 구성되어 있으며, 각 섹션은 코드, 데이터, 메타데이터 등을 담고 있습니다. 주요 구성 요소는 다음과 같습니다:
- COFF 헤더: 파일 유형, 대상 아키텍처(CPU), 섹션 수, 심볼 테이블 위치 등의 전반적인 정보를 포함합니다.
- 선택적 헤더 (Optional Header): 주로 실행 파일에 해당하며, 프로그램의 진입점 주소, 이미지 베이스 주소, 스택 및 힙 크기 등의 로더 관련 정보를 포함합니다. (PE/COFF에서 더욱 중요하게 다뤄짐)
- 섹션 헤더: 각 섹션(.text, .data, .bss 등)의 이름, 크기, 가상 주소, 파일 내 위치, 속성 등을 설명합니다.
- 섹션 데이터: 실제 실행 코드(.text), 초기화된 데이터(.data), 초기화되지 않은 데이터 공간(.bss) 등이 저장됩니다.
- 심볼 테이블: 함수, 전역 변수 등의 이름과 해당 엔티티의 주소 정보를 담고 있습니다. 링커가 외부 참조를 해결하고 디버거가 심볼을 해석하는 데 사용됩니다.
- 재배치 정보 (Relocation Information): 프로그램이 메모리에 로드될 때 또는 링크될 때, 고정된 주소가 아닌 상대 주소나 심볼 참조를 절대 주소로 수정해야 하는 위치 정보를 포함합니다.
- 라인 번호 정보 (Line Number Information): 디버깅을 위해 소스 코드의 라인 번호와 실행 코드의 오프셋을 매핑하는 정보를 포함합니다.
관련 형식
- PE (Portable Executable): 마이크로소프트 윈도우 운영체제에서 사용되는 실행 파일(.exe), DLL(.dll) 등의 형식입니다. COFF를 기반으로 확장 및 변형된 형식으로, 일반적으로 PE/COFF라고도 불립니다.
- ELF (Executable and Linkable Format): 리눅스 및 대부분의 현대 유닉스 계열 운영체제에서 사용되는 표준 오브젝트 파일 형식입니다. COFF의 많은 개념을 계승하면서도 보다 유연하고 확장 가능한 구조를 가집니다.
- Mach-O: 애플의 macOS 및 iOS 운영체제에서 사용되는 오브젝트 파일 형식입니다.
용도
- 컴파일러 출력: 컴파일러는 소스 코드를 컴파일하여 COFF 형식의 오브젝트 파일을 생성합니다.
- 링킹: 링커는 여러 오브젝트 파일들을 결합하여 최종 실행 파일이나 라이브러리를 만듭니다. 이 과정에서 심볼 테이블과 재배치 정보를 활용합니다.
- 디버깅: 디버거는 COFF 파일 내의 심볼 및 라인 번호 정보를 사용하여 프로그램 실행을 추적하고 디버깅합니다.