trả lời nicked ra khỏi "MetaWINDOW FAQ - OMF vs COFF Object file Formats.htm"
Kể từ buổi bình minh của nền văn minh máy tính lên đến khoảng thời gian các công cụ lập trình Microsoft Win32 đến cùng, hầu hết các trình biên dịch PC sản xuất các file đối tượng sử dụng tiêu chuẩn Định dạng Mô-đun đối tượng Intel (OMF). Sau đó, Intel giới thiệu 386 bộ vi xử lý và chế độ bảo vệ 32 bit tại thời điểm đó chúng cũng mở rộng đặc tả OMF cho 32 bit, dẫn đến "OMF-386" trở thành tiêu chuẩn cho hầu hết các môi trường chế độ bảo vệ PC. Khoảng thời gian này, nhóm phát triển Windows NT ban đầu cũng đang thiết kế mã, không chỉ cho các bộ vi xử lý của Intel mà còn hỗ trợ các bộ vi xử lý từ các nhà cung cấp khác. Nhóm Microsoft NT đã chọn một định dạng mô-đun đối tượng di động được gọi là Định dạng tệp đối tượng chung (COFF) có nguồn gốc từ định dạng mã đối tượng chính thức cho mô-đun đối tượng UNIX System V. COFF sau này trở thành tiêu chuẩn defacto cho tất cả các công cụ phát triển Microsoft Win32. một định dạng có thể thực thi cho Win32 (một trình liên kết định dạng COFF có ít công việc hơn để tạo ra một EXE 32 bit hoặc DLL từ một tệp COFF so với tệp định dạng OMF).
Cũng giống như có các tệp đối tượng định dạng OMF và COFF (.obj's), cũng có các tệp thư viện định dạng OMF và COFF (.lib's). Các thư viện, may mắn thay, về cơ bản chỉ là một tập hợp các tệp đối tượng, cùng với một số thông tin tiêu đề cho phép trình liên kết xác định tệp đối tượng nào cần sử dụng từ thư viện. Tuy nhiên, để làm cho mọi thứ trở nên khó khăn, cả OMF và COFF đều sử dụng cùng một phần mở rộng tên tệp, .obj và .lib, để tham chiếu hai loại định dạng tệp đối tượng và thư viện khác nhau (vì điều này bạn không thể chỉ xem phần mở rộng của tên tệp). để biết mô-đun đối tượng hoặc tệp thư viện là OMF hay COFF).
Sự cố với tệp đối tượng trộn và tệp thư viện từ các nhà cung cấp trình biên dịch khác nhau là một số nhà cung cấp hỗ trợ COFF, các nhà cung cấp khác sử dụng OMF và một số có thể xử lý cả hai. Borland, ví dụ, vẫn sử dụng các tập tin và thư viện đối tượng OMF, trong khi các trình biên dịch 32 bit của Microsoft tạo ra các tệp định dạng COFF. Watcom C/C++ v11.0 dường như thích COFF hơn khi biên dịch và liên kết các ứng dụng Windows, nhưng tạo ra các tệp đối tượng OMF để sử dụng với DOS -GW 32-bit chế độ bảo vệ DOS-extender của họ. Cùng với điều này, Microsoft MASM 6.13 tạo ra các tệp OMF theo mặc định, nhưng với công cụ/coff switch có thể phát ra các tệp đối tượng COFF thay thế.
Khi đến lúc liên kết tệp với các định dạng khác nhau, các trình liên kết khác nhau sẽ làm những điều khác biệt. Ví dụ, trình liên kết Microsoft Visual C/C++ được thiết kế cho các tệp đối tượng định dạng COFF và các thư viện, nhưng sẽ cố gắng chuyển đổi các tệp đối tượng OMF thành các tệp COFF nếu cần thiết. Điều này làm việc trong một số trường hợp, nhưng tiếc là Microsoft LINK không hỗ trợ tất cả các loại bản ghi OMF, vì vậy trong nhiều trường hợp, trình liên kết có thể vẫn thất bại khi được cung cấp các tệp đối tượng định dạng OMF. Ngoài ra trong khi Microsoft LINK cố gắng hỗ trợ một số tệp đối tượng OMF, nó sẽ từ chối xử lý bất kỳ thư viện định dạng OMF nào.Các liên kết khác, chẳng hạn như Tlink của Borland, được thiết kế cho các tệp đối tượng OMF và sẽ tương tự từ chối làm việc với các tệp thư viện hoặc đối tượng định dạng COFF. Một số nhà cung cấp hệ thống mở rộng và nhúng của hệ điều hành DOS, chẳng hạn như Phar Lap, cung cấp các trình liên kết riêng hỗ trợ cả OMF và COFF, cho bạn lựa chọn.
Điểm mấu chốt là trộn các đối tượng OMF và COFF và các loại tệp thư viện có thể là một mớ hỗn độn (cộng với các thông báo lỗi khó hiểu từ các trình liên kết không giúp ích). Trừ khi mối liên kết của bạn đặc biệt hỗ trợ nó, bạn nên gắn với định dạng đối tượng và thư viện được đề xuất cho trình biên dịch/trình liên kết/nền tảng của bạn và tránh trộn các tệp OMF và COFF.
Hãy xem http://www.iecc.com/linker/linker03.html. – avakar
@avakar: tại sao không đổ liên kết đó vào câu trả lời đúng? – xtofl