COFF는 컴퓨터 과학 분야에서 널리 사용되는 용어로, 주로 두 가지 의미를 지닌다. 가장 일반적인 의미는 Common Object File Format(공통 목적 파일 형식)의 약어이며, 부차적으로 스코틀랜드 방언에서 "사다, 구입하다"를 뜻하는 동사로도 사용된다.
1. Common Object File Format (공통 목적 파일 형식)
COFF는 실행 파일, 목적 코드(object code), 공유 라이브러리 컴퓨터 파일을 저장하는 데 사용되는 바이너리 파일 형식이다. 1983년 AT&T의 UNIX System V에서 32비트 플랫폼(예: 3B20)을 위해 처음 도입되었으며, 이전에 사용되던 a.out 형식을 대체하였다.
주요 역사적 경위:
- 기존의 a.out 형식은 공유 라이브러리 지원, 외부 형식 식별, 명시적 주소 연결 등의 측면에서 한계가 있었다.
- COFF는 임의의 섹션(section) 지원, 명시적 프로세서 선언, 명시적 주소 연결 등의 개선점을 제공하였다.
- 그러나 설계 자체가 제한적이고 명세가 불완전하여, 실제 구현에서 표준을 위반하는 사례가 많았다. 섹션 수, 섹션 이름 길이, 포함 소스 파일 수에 제한이 있었으며, C 언어 및 이후 C++와 같은 언어의 심볼릭 디버깅 정보를 충분히 지원하지 못했다.
- 이에 따라 여러 확장 형식이 등장했다. IBM의 AIX 운영체제에서는 XCOFF, DEC와 SGI 등에서는 ECOFF가 사용되었으며, 임베디드 개발용 툴체인에서도 서로 호환되지 않는 다양한 변형이 만들어졌다.
- 1990년대 초반, AT&T는 SVR4 출시와 함께 COFF를 Executable and Linkable Format(ELF)으로 대체하였다.
현대적 사용:
- ELF가 대부분의 Unix 계열 시스템에서 COFF를 대체했지만, COFF 및 그 변형은 일부 임베디드 시스템과 Unix 계열 플랫폼에서 계속 사용되고 있다.
- 가장 광범위한 사용은 마이크로소프트의 Portable Executable(PE) 형식에서 찾을 수 있다. Windows NT용으로 개발된 PE 형식(때로 PE/COFF로 표기)은 목적 파일에서 COFF 헤더를 사용하며, 실행 파일의 PE 헤더 구성 요소로도 COFF를 사용한다.
- UEFI 환경과 일부 임베디드 개발 시스템에서도 여전히 사용된다.
형식의 특징:
- COFF의 주요 개선점은 객체 파일에 여러 개의 명명된 섹션을 도입한 것이다. 각 객체 파일은 서로 다른 수와 유형의 섹션을 가질 수 있다.
- 파일 헤더는 생성 날짜와 시간을 1970년 1월 1일 이후 경과된 초 수를 나타내는 32비트 정수로 저장한다. 이로 인해 2038년 1월 19일 이후의 날짜를 저장할 수 없는 이른바 "Year 2038 문제"가 존재한다.
- 심볼 테이블은 함수와 변수의 심볼릭 이름, 저장 클래스, 유형, 값, 섹션 번호 등의 정보를 저장한다. 8자 이하의 짧은 이름은 심볼 테이블에 직접 저장되고, 더 긴 이름은 파일 끝의 문자열 테이블에 대한 오프셋으로 저장된다.
- 확장자로는
.o,.obj,.lib등이 사용되며, 개발 주체는 AT&T Corporation이다.
관련 확장 형식:
- XCOFF (IBM AIX)
- ECOFF (DEC, SGI 등)
- Portable Executable (마이크로소프트 Windows)
- ELF (Executable and Linkable Format)
2. 스코틀랜드 방언으로서의 coff
COFF는 스코틀랜드 방언에서 "사다(구매하다)"를 뜻하는 동사로 사용된다. 과거형과 과거분사형은 coft 또는 coffed이며, 어원은 중세 네덜란드어의 coft, cocht("구입함")에서 유래한 것으로 추정된다. 이 용법은 현대 영어에서 일반적으로 사용되는 표현은 아니며, 주로 문헌적 또는 방언적 맥락에서 나타난다.
참고 문헌
- Wikipedia: "COFF" 문서
- Merriam-Webster Dictionary: "coff" 항목
- Wiktionary: "coff" 항목
- Microsoft Corporation, "Common Object File Format (COFF)" 명세서