kj0on

[Definition] COFF (Common Object File Format) 본문

Reversing/Definition

[Definition] COFF (Common Object File Format)

kj0on 2025. 7. 1. 11:03
목차 접기

1. 정의

 

오리지널 유닉스 오브젝트 파일 포맷 a.out은 공유 라이브러리, 외부 포맷 식별, 명시적인 주소 연결을 적절하게 지원하는 것이 불가능했다. 이에 대한 해결책으로 1983년 AT&T의 UNIX System V에서 3B20 등 비VAX 32비트 플랫폼용으로 COFF를 도입했다. COFF는 유닉스 시스템에서 컴파일 된 코드를 저장하는 데 사용되는 파일 포맷이다. 컴파일 과정 중 어셈블러, 링크 단계에서 생성된 오브젝트 파일은 COFF 형식에 맞게 저장되었다. 또한 각각의 함수나 프로그램 조각, 공유 라이브러리, 전체 실행 파일도 COFF 형식을 따랐다. 현재 파일 포맷과 유사하게 프로그램 섹션과 프로그램이 선언하거나 정의한 심볼에 대한 정보를 담고 있다.


2. 기존 COFF의 한계

 

AT&T의 UNIX System V에서 도입된 COFF의 설계는 너무 제한적이고 불완전하게 명세화 되었다. 기존 COFF는 섹션 수, 섹션 및 심볼 이름 제한 등 고정 길이 필드가 많았다. 또한 포함 소스 파일, 심볼 등 빈약한 디버그 정보는 C 등의 실제 쓰이는 언어, C++ 등 확장을 위한 예약 공간 부족으로 더 새로운 언어 및 새로운 프로세서를 지원하는 것이 불가능했다. 그 결과 실제 쓰이는 모든 COFF 구현체들은 필연적으로 표준 위반이 될 수밖에 없었다. 이런탓에 컴파일러와 링커들은 기능을 추가하려면 기존의 COFF 사양을 어길 수밖에 없었고, 플랫폼마다 상호 호환되지 않는 전용 확장판이 우후죽순 생겨나기 시작했다.


3. COFF 확장

 

COFF 확장 사용처 특징
XCOFF IBM AIX 64-비트 지원, 로더 섹션 임포트 파일 구조 추가
ECOFF DEC Ultrix/SGI IRIX/MIPS Linux MIPS 전용 재배치/디버그 확장, 넷야로즈 콘솔까지 채택
TI-COFF TI DSP/MCU 툴체인 실시간 임베디드용, 섹션 뱅크/메모리 매핑 지시자 강화
DJGPP-COFF 32bit DOS 개발 리틀엔디언 고정, coff.h에만 문서화
Microsoft COFF MSVC OBJ/LIB 32-비트 섹션 ID/Aux Symbol, /bigobj 확장 헤더 등 현대 C++ 규모에 맞춘 확장
PE/COFF Windows NT EXE/DLL DOS Stub + PE 시그너처 뒤에 COFF Header 삽입, 16 개 Data Directory 추가

4. 현재

 

MSVC의 어셈블러, 컴파일러가 지금도 Microsoft COFF .obj를 출력한다. 링커는 이를 그대로 결합해, 실행 이미지에는 PE/COFF 구조를 쓴다. 그러나 리눅스, 유닉스, macOS 에서는 ELF / Mach-O로 교체되었다. COFF 계열은 Windows PE/COFF와, 임베디드, 레거시 영역을 제외하면 ELF, Mach-O 대체된 상태다. 그럼에도, COFF가 남긴 모델은 현대 실행 파일 포맷 설계의 시초이자 지금도 여러 포맷의 구조를 나타내는 뼈대로 살아 있다.


5. 구조

 

ECOFF (https://www.ibm.com/docs/en/aix/7.3.0?topic=formats-xcoff-object-file-format)

DJGPP-COFF (https://www.delorie.com/djgpp/doc/coff/)

TI-COFF (https://www.ti.com/lit/an/spraao8/spraao8.pdf?ts=1751271489760&ref_url=https%253A%252F%252Fwww.google.com%252F)