2009-06-08 6 views
12

최근 저는 VC++ 6.0으로 작성된 레거시 프로젝트를 유지하고 있습니다. 이 코드는이 컴파일러의 많은 고유 한 특성을 사용하여 최신 표준 컴파일러로 이식하는 것이 어려운 일임이 판명되었습니다.OMF와 COFF 형식의 차이점은 무엇입니까?

프로젝트의 수천 줄의 코드 중에서 네 개의 어셈블러 파일이 있습니다. 나는 어떤 이유로 MASM615 나 TASM도 그들을 컴파일 할 수 없다는 것을 이해하지 못한다. (에러를 보낸다.) 그럼에도 불구하고 나는 오브젝트 파일을 가지고있다. 나는 도서관을 연결 그러나 때 메시지를받을

경고 LNK4033 : 예상대로

라이브러리 작품, COFF

에 OMF에서 개체 형식을 변환하지만 이러한 이진의 차이점을 무엇 궁금했는데 형식 또는이 변환에서 추악한 것을 기대해야하는 경우 에서 흠집

+1

http://www.iecc.com/linker/linker03.html을보십시오. – avakar

+0

@ avakar : 왜 그 링크를 적절한 답으로 부으십니까? – xtofl

답변

14

대답 "MetaWINDOW의 자주 묻는 질문 - OMF는 COFF 개체 파일 Formats.htm 대"시간에 대한 때까지 PC 문명 최대의 새벽부터

마이크로 소프트 Win32 프로그래밍 도구, 함께 생산 된 거의 모든 PC 컴파일러 오브젝트 파일을했다 OMF (Intel Object Module Format) 표준을 사용합니다. 나중에 Intel은 386 개의 프로세서와 32 비트 보호 모드를 도입하여 32 비트 용 OMF 사양을 확장하여 대부분의 PC 보호 모드 환경의 표준이 된 "OMF-386"을 이끌었습니다. 같은시기에 원래 Windows NT 개발 팀은 인텔 프로세서뿐만 아니라 다른 공급 업체의 프로세서도 지원하도록 코드를 설계했습니다. Microsoft NT 팀은 UNIX System V의 공식 개체 코드 형식에서 파생 된 COFF (Common Object File Format)라는 더 이식 가능한 개체 모듈 형식을 선택했습니다. 나중에 COFF 개체 모듈은 모든 Microsoft Win32 개발 도구의 기본 표준이되었으며 Win32 (COFF 형식 링커는 OMF 형식 파일보다 COFF 파일에서 32 비트 EXE 또는 DLL을 만드는 작업이 훨씬 적음)의 실행 가능 형식 인 Portable Executable 파일과 훨씬 더 밀접한 관련이 있습니다.

OMF 및 COFF 형식 개체 파일 (.obj)과 마찬가지로 OMF 및 COFF 형식 라이브러리 파일 (.lib)도 있습니다. 다행스럽게도 라이브러리는 기본적으로 개체 파일의 모음이며 링커가 라이브러리에서 사용할 개체 파일을 결정할 수 있도록 몇 가지 헤더 정보와 함께 제공됩니다. 그러나 OMF와 COFF 모두 동일한 파일 이름 확장자 인 .obj와 .lib를 사용하여 두 가지 유형의 객체 및 라이브러리 파일 형식을 참조합니다 (이 때문에 파일 이름 확장명을 볼 수 없습니다. 개체 모듈 또는 라이브러리 파일이 OMF 또는 COFF인지 확인하는 데 사용됩니다.

다른 컴파일러 공급 업체의 개체 파일과 라이브러리 파일을 혼합 할 때의 문제는 일부 공급 업체가 COFF를 지원하고 다른 공급 업체는 OMF를 사용하며 일부는 둘 다 처리 할 수 ​​있다는 것입니다. 예를 들어 Borland는 OMF 개체 파일과 라이브러리를 사용하는 반면 Microsoft의 32 비트 컴파일러는 COFF 형식 파일을 생성합니다. Watcom C/C++ v11.0은 Windows 응용 프로그램을 컴파일하고 연결할 때 COFF를 선호하지만 DOS4GW 32 비트 보호 모드 DOS 확장기와 함께 사용할 OMF 개체 파일을 생성합니다. 이와 함께 Microsoft MASM 6.13은 기본적으로 OMF 파일을 생성하지만/coff 스위치를 사용하면 COFF 개체 파일을 대신 내보낼 수 있습니다.

다른 형식의 파일을 연결할 때가되면 다른 링커가 다른 작업을 수행합니다. 예를 들어 Microsoft Visual C/C++ 링커는 COFF 형식의 개체 파일과 라이브러리 용으로 설계되었지만 필요한 경우 OMF 개체 파일을 COFF 파일로 변환하려고 시도합니다. 일부 경우에는 작동하지만 불행히도 Microsoft LINK는 모든 OMF 레코드 유형을 지원하지 않으므로 대부분의 경우 OMF 형식의 개체 파일이 제공되면 링커가 계속 실패 할 수 있습니다. 또한 Microsoft LINK는 OMF 개체 파일에 대한 일부 지원을 시도하지만 모든 OMF 형식 라이브러리 처리를 거부합니다.Borland의 TLINK와 같은 다른 링커는 OMF 개체 파일 용으로 설계되었으며 COFF 형식 개체 또는 라이브러리 파일 작업을 거부합니다. Phar Lap과 같은 일부 DOS Extender와 임베디드 시스템 공급 업체는 OMF와 COFF를 모두 지원하는 자체 링커를 제공하므로 선택의 여지가 있습니다.

결론은 OMF 및 COFF 개체와 라이브러리 파일 형식을 혼합하면 엉망이 될 수 있으며 링커의 암호 오류 메시지가 도움이되지 않습니다. 링커가 특별히 지원하지 않는 한 컴파일러/링커/플랫폼에 대한 권장 객체 및 라이브러리 형식을 고수하고 OMF 및 COFF 파일을 혼합하지 않아야합니다.

+0

하단 라인은 오히려 _his_ 링커가 변환을하는 것 같습니다. 오류를 생성하지 않습니다. – xtofl

+0

하지만 모든 전환이 원활하게 진행되는 것은 아닙니다. 런타임 오류 또는 함수 실패가있는 경우 lib lib 또는 obj 또는 obj를 lib 미리보기에서 찾습니다. 물론 모든 것이 잘 될 수 있습니다. – kingchris

+0

모든 링커는 Windows 플랫폼에서 실행하기 위해 마지막에 PE-COFF 실행 파일을 만들어야합니까? 즉, 연결 프로세스가 완료된 최종 실행 파일은 다른 오브젝트 형식과 같은 특정 데이터 및 구조를 포함 할 수 있습니다. OMF? 그렇다면 어떻게 작동합니까? (또는 어떻게 할 수 있습니까?) – greatwolf