COFF
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
COFF는 1983년 AT&T의 유닉스 시스템 V에서 a.out 포맷을 대체하기 위해 도입된 객체 파일 형식이다. 32비트 플랫폼을 위해 설계되었으며, 임의의 섹션, 명시적인 프로세서 선언, 주소 연결 등의 기능을 제공했다. 그러나 설계상의 한계로 인해 다양한 확장 버전이 등장했으며, 이후 ELF로 대체되었다. 오늘날에는 마이크로소프트의 PE 포맷이 COFF를 기반으로 널리 사용되고 있다. COFF는 객체 파일 내 여러 섹션을 도입하여 유연성을 높였으며, 심볼릭 디버깅 정보와 상대 가상 주소(RVA)를 지원한다. 하지만 2038년 문제와 같은 문제점도 가지고 있다.
더 읽어볼만한 페이지
COFF - [IT 관련 정보]에 관한 문서 | |
---|---|
파일 정보 | |
![]() | |
일반 정보 | |
파일 확장자 | 없음, .o, .obj, .lib |
파일 유형 | 바이너리, 실행 가능, 오브젝트, 공유 라이브러리 |
개발자 | AT&T 코퍼레이션 |
기술 정보 | |
확장 포맷 | XCOFF, ECOFF, PE 포맷, Executable and Linkable Format |
매직 넘버 | 0x4C01 (i386) 0x6486 (AMD64) 0x0002 (Itanium) |
2. 역사
COFF는 1983년 AT&T의 유닉스 시스템 V에서 a.out을 대체하기 위해 개발되었다.
2. 1. a.out의 한계
a.out은 최초의 유닉스 오브젝트 파일 포맷으로, 공유 라이브러리, 외부 포맷 식별, 명시적인 주소 연결 등을 적절하게 지원하지 못했다. 유닉스 계열 시스템이 AT&T 안팎으로 계속 개발되면서, 이러한 문제들에 대한 각기 다른 해결책들이 등장하였다.2. 2. COFF의 등장과 발전
a.out은 공유 라이브러리, 외부 포맷 식별, 명시적인 주소 연결을 적절하게 지원할 수 없었다. 유닉스 계열 시스템이 AT&T 안팎으로 계속 개발되면서 이 문제와 다른 문제들에 대한 각기 다른 해결책들이 등장하였다.COFF는 1983년 AT&T의 유닉스 시스템 V에서 3B20 등 비VAX 32비트 플랫폼용으로 도입되었다. 기존 AT&T a.out 포맷의 개선사항으로는 임의의 섹션, 명시적인 프로세서 선언, 명시적인 주소 연결 등이 있었다.
그러나 COFF의 설계는 너무 제한적이고 불완전하게 명세화되었다. 최대 섹션 수, 섹션 이름 길이 등에 제한이 있었고, 포함된 소스 파일, 심볼 디버깅 정보는 C, C++ 등 더 새로운 언어나 새로운 프로세서를 지원하는 것이 불가능했다. 그 결과 실제 쓰이는 모든 COFF 구현체들은 필연적으로 표준을 위반할 수밖에 없었다. 이로 인해 수많은 COFF 확장들이 생겨났다. IBM은 XCOFF 포맷을 AIX에 사용하였다. DEC, SGI 등은 ECOFF를 사용하였다. 임베디드 개발을 대상으로 하는 수많은 SysV 포팅 및 도구 체인들은 자신들만의 비호환 변종들을 개발하였다.
SVR4 릴리스와 함께 AT&T는 COFF를 ELF로 대체하였다.
2. 3. ELF로의 대체와 현대적 사용
SVR4 릴리스와 함께 AT&T는 COFF를 ELF로 대체하였다. COFF 확장 버전들은 일부 유닉스 계열 플랫폼(주로 임베디드 시스템)에서 계속 사용되었으나, 오늘날 가장 널리 사용되는 COFF 포맷은 마이크로소프트의 PE 포맷이다. 윈도우 NT용으로 개발된 PE 포맷(PE/COFF라고도 부름)은 오브젝트 파일에 대해 COFF 헤더를 사용하며 실행 파일에 대해 PE 헤더 구성 요소로 사용한다.[7]3. 특징
COFF는 `a.out`에 비해 객체 파일에 여러 개의 이름을 가진 섹션을 도입하여 유연성을 높였다.[1] 서로 다른 객체 파일은 서로 다른 수와 유형의 섹션을 가질 수 있었다.
3. 1. 심볼릭 디버깅 정보
COFF 심볼릭 디버깅 정보는 프로그램 함수 및 변수의 심볼(문자열) 이름과 중단점 설정 및 추적 실행에 사용되는 줄 번호 정보로 구성된다.[1]심볼 이름은 COFF 심볼 테이블에 저장된다. 각 심볼 테이블 항목에는 이름, 저장 클래스, 유형, 값 및 섹션 번호가 포함된다. 짧은 이름(8자 이하)은 심볼 테이블에 직접 저장되고, 긴 이름은 COFF 개체 끝에 있는 문자열 테이블에 대한 오프셋으로 저장된다.[1]
저장 클래스는 심볼이 나타내는 엔티티 유형을 설명하며 외부 변수(C_EXT), 자동(스택) 변수(C_AUTO), 레지스터 변수(C_REG), 함수(C_FCN) 등을 포함할 수 있다. 심볼 유형은 심볼 엔티티 값의 해석을 설명하며 모든 C 데이터 유형에 대한 값을 포함한다.[1]
적절한 옵션으로 컴파일하면 COFF 개체 파일은 개체 파일의 텍스트 섹션에 있는 각 가능한 중단점에 대한 줄 번호 정보를 포함한다. 줄 번호 정보는 두 가지 형식을 취한다. 첫 번째 형식에서는 코드의 각 가능한 중단점에 대해 줄 번호 테이블 항목은 주소와 해당 일치하는 줄 번호를 기록한다. 두 번째 형식에서는 항목이 함수의 시작 부분을 나타내는 심볼 테이블 항목을 식별하여 함수의 이름을 사용하여 중단점을 설정할 수 있다.[1]
3. 2. 상대 가상 주소 (RVA)
COFF 파일이 생성될 때, 일반적으로 메모리의 어느 위치에 로드될지는 알려져 있지 않다. 파일의 첫 번째 바이트가 로드될 가상 주소는 이미지 기본 주소라고 한다. 파일의 나머지 부분은 반드시 연속적인 블록으로 로드되는 것이 아니라, 여러 다른 '''섹션'''으로 로드된다.상대 가상 주소(RVA)는 표준 가상 주소와 혼동해서는 안 된다. '''상대 가상 주소'''는 파일이 메모리에 로드된 후 파일 이미지의 기본 주소를 뺀, 파일 내 객체의 가상 주소이다. 파일이 디스크에서 메모리로 문자 그대로 매핑된다면, RVA는 파일 내 오프셋과 동일하겠지만, 이것은 실제로 매우 드문 경우이다.
RVA 용어는 이미지 파일 내 객체에만 사용된다는 점에 유의해야 한다. 메모리에 로드되면 이미지 기본 주소가 더해지고, 일반 VA가 사용된다.[1]
4. 문제점
COFF 파일 헤더는 객체 파일 생성 시간을 32비트 정수로 저장하여 2038년 문제가 발생한다.[4] 이는 유닉스 시간을 기준으로 1970년 1월 1일 00:00:00 UTC 이후의 초 수를 나타내기 때문인데, 2038년 1월 19일 이후의 시간은 이 포맷으로 저장할 수 없다.
참조
[1]
웹사이트
LIB Reference (Embedded Visual C++ Programmers Guide)
http://msdn.microsof[...]
2021-02-04
[2]
웹사이트
IMAGE_FILE_HEADER structure (winnt.h)
https://learn.micros[...]
2023-12-22
[3]
간행물
[4]
서적
UNIX System V/386 Release 3.2 Programmer's Guide, Volume II
http://bitsavers.org[...]
Prentice-Hall
1989
[5]
문서
http://support.micro[...]
[6]
간행물
[7]
간행물
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com