2010-05-05 28 views
5

Tôi thấy những gì tôi nghĩ là hành vi lạ từ các tệp đối tượng đầu ra bởi các công cụ Microsoft Visual Studio 2003. Tiện ích file nói với tôi:Tháo rời Microsoft Visual Studio 2003 đầu ra trình biên dịch

asmfile.obj: 80386 COFF executable not stripped - version 30821 

Đối với đối tượng được tạo ra bởi các nhà lắp ráp, nhưng đối với đối tượng đến từ các tập tin C, tôi nhận được chỉ là:

cfile.obj: data 

Sử dụng dumpbin tiện ích của Microsoft và objdump tôi nhận được từ Cygwin , Tôi có thể tháo rời tập tin được xây dựng lắp ráp, nhưng tôi không nhận được kết quả hữu ích nào từ một trong hai tiện ích cho các tệp C-built.

Tôi có một vài câu hỏi liên quan đến sự khác biệt này:

  1. gì là định dạng tập tin đối tượng được tạo ra bởi trình biên dịch MSVC2003?
  2. Làm cách nào để có thể tháo rời tệp đối tượng đó?

Tôi đặc biệt quan tâm đến việc tháo gỡ trong cú pháp AT & T - Tôi đang làm cổng của cơ sở nguồn lớn để làm việc với GCC và tôi muốn sử dụng phương pháp này làm lối tắt cho một số thói quen lắp ráp nội tuyến trong dự án.

Chỉnh sửa: Thêm một số thông tin khác.

Khi tôi chạy dumpbin trên một trong những tập tin này mang lại cho tôi không có kết quả:

C:\> dumpbin /disasm Func.obj 
Microsoft (R) COFF/PE Dumper Version 7.10.6030  
Copyright (C) Microsoft Corporation. All rights reserved. 


Dump of file Func.obj 

FileType: ANONYMOUS OBJECT 

Với objdump, nó mang lại:

$ objdump -d Func.obj 
objdump: Func.obj: File truncated 

Mở các tập tin được xây dựng từ lắp ráp, tôi nhận được kết quả hợp lý.

Chỉnh sửa lại: Thêm thông tin dòng lệnh.

Các tập tin lắp ráp được xây dựng với một dòng lệnh tương tự như sau:

ml -nologo -W3 -WX -c -coff -FoAssemblyFile.obj -Zi -Cx AssemblyFile.asm 

ml khi thực hiện bởi chính nó nói:

Microsoft (R) Macro Assembler Version 6.15.8803 
Copyright (C) Microsoft Corp 1981-2000. All rights reserved. 

Các tập tin C được xây dựng với lệnh sau:

cl -nologo -W4 -WX -Gs32768 -GX -Gy -c -FdCFile.pdb -FoCFile.obj -Zi 
    -Gm -O1 -Oy- -Gy -GL -X CFile.c 

Có một sốCác tùy chọnvà -D được chuyển đến ml và đến cl, nhưng tôi đã bỏ qua các tùy chọn này ngắn gọn tại đây. Các tùy chọn cl được mô tả here.

Trả lời

4

Chỉnh sửa dựa trên các tùy chọn dòng lệnh cl được bổ sung cho câu hỏi:

Tôi nghĩ vấn đề là việc sử dụng các tùy chọn /GL, xác định rằng liên kết thời gian tối ưu hóa hệ mã sẽ được thực hiện.từ trang doc trên tùy chọn đó:

tệp obj được tạo bằng/GL sẽ không có sẵn cho các tiện ích liên kết như EDITBIN và DUMPBIN.

Sử dụng tùy chọn này làm cho trình biên dịch tạo ra các tệp .obj mà trình liên kết có thể thực hiện tối ưu hóa trên toàn chương trình - dường như định dạng tệp là độc quyền (có thể tài liệu ở đâu đó, nhưng tôi không ngờ).

Tài liệu cho /GL (còn được gọi là "tối ưu hóa toàn bộ chương trình", "tạo mã thời gian liên kết" hoặc LTCG) chứa một số cảnh báo về khả năng tương tác của các tệp .obj hoặc thư viện chứa các tệp đối tượng đó.


Original câu trả lời:

gì chính xác là trong nguồn C cho file .obj bạn đang cố gắng tháo gỡ? Tôi nhận được như sau sử dụng dumpbin /disasm test.obj cho một 'hello world' chương trình đơn giản:

Microsoft (R) COFF/PE Dumper Version 8.00.50727.42 
Copyright (C) Microsoft Corporation. All rights reserved. 


Dump of file test.obj 

File Type: COFF OBJECT 

_main: 
    00000000: 55     push  ebp 
    00000001: 8B EC    mov   ebp,esp 
    00000003: 6A 01    push  1 
    00000005: 68 00 00 00 00  push  offset $SG4665 
    0000000A: E8 00 00 00 00  call  _printf 
    0000000F: 83 C4 08   add   esp,8 
    00000012: 33 C0    xor   eax,eax 
    00000014: 3B EC    cmp   ebp,esp 
    00000016: E8 00 00 00 00  call  __RTC_CheckEsp 
    0000001B: 5D     pop   ebp 
    0000001C: C3     ret 

    Summary 

     7AC .debug$S 
      30 .debug$T 
      2F .drectve 
      4 .rdata 
      4 .rtc$IMZ 
      4 .rtc$TMZ 
      1D .text 

Lưu ý: đây là sử dụng một tập tin .obj biên soạn bởi một dumpbin cung cấp bởi VS2005, nhưng tôi không thể tưởng tượng công cụ này sẽ có thay đổi nhiều từ VS2003.

+0

@Michael: bạn nói đúng - mặc dù mã thực tế được tạo có thể thay đổi, các công cụ như dumpbin không thay đổi đáng kể (các phiên bản cũ không xử lý tất cả các tập lệnh mới nhất, nhưng đó là về nó). –

+0

Tôi sẽ chỉnh sửa để thêm một số chi tiết khác. Nguồn C có thể là * bất cứ điều gì * theo như tôi có thể nói - mọi đầu ra đối tượng trong toàn bộ dự án này có cùng một hành vi. –

+0

'File' cho bạn biết loại tệp đối tượng đó là gì? –

Các vấn đề liên quan