2009-06-08 12 views
12

Gần đây tôi đã duy trì một dự án kế thừa được viết bằng VC++ 6.0. Mã này sử dụng rất nhiều đặc điểm độc đáo của trình biên dịch này để chuyển nó sang trình biên dịch chuẩn gần đây hơn đã được chứng minh là một tác vụ mang tính dị giáo.Sự khác nhau giữa định dạng OMF và COFF là gì?

Trong số hàng nghìn dòng mã trong dự án, có bốn tệp lắp ráp. Vì một lý do nào đó mà tôi không hiểu, cũng như MASM615 cũng như TASM không thể biên dịch chúng (chúng gửi lỗi), tuy nhiên tôi có các tệp đối tượng. Tuy nhiên khi tôi liên kết thư viện tôi nhận được một thông điệp

LNK4033 cảnh báo: chuyển đổi định dạng đối tượng từ OMF để COFF

Các công trình thư viện như mong đợi, nhưng tôi đã tự hỏi điều gì là sự khác biệt giữa các nhị phân các định dạng hoặc nếu tôi mong đợi điều gì đó xấu xí từ chuyển đổi này.

+1

Hãy xem http://www.iecc.com/linker/linker03.html. – avakar

+0

@avakar: tại sao không đổ liên kết đó vào câu trả lời đúng? – xtofl

Trả lời

14

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.

+0

Điểm mấu chốt có vẻ như liên kết _his_ thực hiện chuyển đổi. Nó không tạo ra lỗi. – xtofl

+0

Nhưng không phải tất cả chuyển đổi đều diễn ra suôn sẻ. Nếu họ là bất kỳ lỗi thời gian chạy hoặc lỗi chức năng sau đó nhìn vào lib này hoặc obj hoặc obj trong một lib frist. Hoặc tất nhiên tất cả có thể là tốt. – kingchris

+0

Tất cả các trình liên kết có phải tạo một tệp PE-COFF ở cuối để nó chạy trên nền tảng cửa sổ không? Đó là sau khi quá trình liên kết có thể thực thi sản phẩm cuối cùng chứa dữ liệu và cấu trúc cụ thể cho một định dạng đối tượng khác ví dụ. OMF? Và nếu vậy, nó hoạt động như thế nào? (hoặc làm thế nào * có thể * mà làm việc?) – greatwolf