2010-06-15 35 views
42

Trong các giai đoạn biên dịch khác nhau trong C hoặc C++, tôi biết rằng tệp đối tượng được tạo (tức là, tệp any_name.o). Tệp .o này chứa gì? Tôi không thể mở nó vì nó là một tệp nhị phân.Tệp đối tượng chứa gì?

Ai đó có thể giúp tôi được không? Nội dung của tệp đối tượng có phụ thuộc chủ yếu vào trình biên dịch mà chúng tôi sử dụng trên Unix không?

+1

Có một loạt các công cụ * nix để tìm kiếm bên trong một tệp đối tượng: bắt đầu bằng nm, http://unixhelp.ed.ac.uk/CGI/man-cgi?nm –

Trả lời

45

file Object có thể chứa một loạt các công cụ: Về cơ bản nó là một số hoặc tất cả các danh sách dưới đây:

  • Symbol Tên
  • mã biên dịch
  • dữ liệu liên tục, ví dụ.strings
  • Nhập - biểu thị các tham chiếu mã được biên dịch (được cố định bởi trình liên kết)
  • Xuất - biểu tượng tệp đối tượng khả dụng cho các tệp đối tượng KHÁC.

Trình liên kết biến một loạt tệp đối tượng thành tệp thực thi, bằng cách kết hợp tất cả nhập và xuất và sửa đổi mã đã biên dịch để các hàm chính xác được gọi.

3

Sử dụng lệnh tệp cho những thứ như thế này. Đây là tệp đối tượng ELF trên hệ thống Linux hiện đại. Ví dụ. nếu được biên dịch cho x86 32 bit.

ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not stripped 

Ngược lại, một thực thi tự động liên kết có thể trông giống như:

ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.15, not stripped 

Để xem tiêu đề, bao gồm tên, bạn có thể sử dụng:

objdump -x any_name.o 

Để tháo rời:

objdump -d any_name.o 
3

Đối tượng tệp là nguồn được biên dịch.

Điều này có nghĩa rằng đó là mã máy, phụ thuộc vào nền tảng đích (bạn có thể biên dịch cho Unix trên Windows nếu bạn thực sự muốn) và trình biên dịch được sử dụng. Các trình biên dịch khác nhau sẽ tạo ra mã máy khác nhau từ cùng một tệp nguồn.

5

Đầu tiên hãy đọc wiki page. Bạn có thể sử dụng objdump để kiểm tra một tập tin như vậy :)

1

Các tập tin chứa dữ liệu nhị phân mà phải được chạy qua một linker để tạo ra một thực thi. Về cơ bản nó là một loạt các hướng dẫn mã máy với các phần được đặt tên (tương ứng với các chức năng của bạn). Từ 'Object File' bài viết của wikipedia:

Trong khoa học máy tính, một tập tin đối tượng là một bộ sưu tập có tổ chức riêng biệt, chuỗi tên của máy mã số [cần dẫn nguồn]. Mỗi chuỗi, hoặc đối tượng, thường chứa hướng dẫn cho máy chủ để thực hiện một số nhiệm vụ, có thể kèm theo dữ liệu có liên quan và siêu dữ liệu (ví dụ như di dời thông tin, ngăn xếp unwinding thông tin, ý kiến, chương trình biểu tượng, gỡ lỗi hoặc hồ sơ thông tin). Trình liên kết thường là được sử dụng để tạo thư viện thực thi hoặc bằng cách kết hợp các phần của đối tượng tệp.

7

Có một số định dạng được chuẩn hóa (COFF, ELF trên Unix), về cơ bản chúng là các biến thể có cùng định dạng được sử dụng cho thực thi nhưng thiếu một số thông tin. Những thông tin còn thiếu sẽ được hoàn thành khi liên kết.

Objects file định dạng cơ bản chứa các thông tin tương tự:

  • mã nhị phân kết quả của tổng hợp (đối với một bộ xử lý mục tiêu)
  • dữ liệu tĩnh được sử dụng bởi một phần của chương trình (như các hằng xâu, vv). Bạn có thể phân biệt tốt hơn giữa BSS (dữ liệu đã xuất) và Văn bản (dữ liệu không được chương trình sửa đổi). Nhưng điều đó chủ yếu quan trọng đối với trình biên dịch và trình liên kết. Lưu ý rằng giống như mã nhị phân, dữ liệu cũng phụ thuộc vào mục tiêu (big-endian, little-endian, 32bits, 64bits).
  • bảng các biểu tượng xuất khẩu của khu vực này của chương trình (chủ yếu là chức năng điểm entry)
  • bảng các biểu tượng bên ngoài được sử dụng bởi phần này của chương trình

Khi đối tượng sẽ được liên kết với nhau các phần của mã đề cập đến các ký hiệu bên ngoài sẽ được thay thế bằng các giá trị thực tế (tốt, vẫn còn quá đơn giản, có phần cuối sẽ được thực hiện khi tải chương trình, nhưng đó là ý tưởng).

Tệp đối tượng cũng có thể chứa nhiều thông tin biểu tượng hơn cần thiết để giải quyết việc nhập và xuất (hữu ích để gỡ lỗi). Có thể xóa thông tin đó bằng lệnh dải.

1

Trong môi trường biên dịch GNU, bạn có thể xem với objdump cả trong tệp thi hành và tệp đối tượng.

Như bạn có thể thấy đối tượng chỉ chứa mã của các hàm được khai báo/tham chiếu trong tệp được biên dịch (tệp chỉ chứa hàm chính với lệnh gọi scanf và cuộc gọi printf).

$ objdump -t scanf_sample.o 

scanf_sample.o:  file format pe-i386 

SYMBOL TABLE: 
[ 0](sec -2)(fl 0x00)(ty 0)(scl 103) (nx 1) 0x00000000 scanf_sample.c 
File 
[ 2](sec 1)(fl 0x00)(ty 20)(scl 2) (nx 0) 0x00000000 _main 
[ 3](sec 1)(fl 0x00)(ty 0)(scl 3) (nx 1) 0x00000000 .text 
AUX scnlen 0x91 nreloc 9 nlnno 0 
[ 5](sec 2)(fl 0x00)(ty 0)(scl 3) (nx 1) 0x00000000 .data 
AUX scnlen 0x0 nreloc 0 nlnno 0 
[ 7](sec 3)(fl 0x00)(ty 0)(scl 3) (nx 1) 0x00000000 .bss 
AUX scnlen 0x0 nreloc 0 nlnno 0 
[ 9](sec 4)(fl 0x00)(ty 0)(scl 3) (nx 1) 0x00000000 .rdata 
AUX scnlen 0x54 nreloc 0 nlnno 0 
[ 11](sec 0)(fl 0x00)(ty 20)(scl 2) (nx 1) 0x00000000 ___main 
AUX tagndx 0 ttlsiz 0x0 lnnos 0 next 0 
[ 13](sec 0)(fl 0x00)(ty 0)(scl 2) (nx 0) 0x00000000 __alloca 
[ 14](sec 0)(fl 0x00)(ty 20)(scl 2) (nx 0) 0x00000000 _memset 
[ 15](sec 0)(fl 0x00)(ty 20)(scl 2) (nx 0) 0x00000000 _scanf 
[ 16](sec 0)(fl 0x00)(ty 20)(scl 2) (nx 0) 0x00000000 _printf 

Nếu bạn sử dụng objdump trên một thực thi bạn có thể thấy rất nhiều chức năng (ngoài những mặt hàng bên trong đối tượng). Điều này chứng tỏ rằng tệp đối tượng chỉ chứa các hàm được định nghĩa trong tệp nguồn có tham chiếu đến các hàm khác. Các tham chiếu đó sẽ được giải quyết ở giai đoạn liên kết.

Đọc thêm về linking, compilationobjects.

+0

Tôi đã sử dụng MinGW trong Windows cho mẫu ở trên - nó hoạt động tương tự dưới * nix – INS

3

Đầu tiên, tệp nhị phân có thể mở! Đừng sợ nó, bạn chỉ cần những công cụ phù hợp! Là dữ liệu nhị phân, một trình soạn thảo văn bản không phải là công cụ phù hợp; một công cụ thích hợp có thể là trình chỉnh sửa hex hoặc trình chỉnh sửa nâng cao như emacs hoặc công cụ thay vì chỉ đơn giản là "xuất" byte trong biểu diễn "hex" của chúng và cho phép bạn một mình giải thích dữ liệu, biết định dạng cụ thể đó và " diễn giải "dữ liệu đúng, ở một mức nào đó (vdGIMP diễn giải một tệp PNG dưới dạng hình ảnh và hiển thị nó, một trình phân tích PNG sẽ "phân tích" dữ liệu bên trong phần PNG hiển thị cho bạn biết các cờ trong một số byte nhất định, ... vv).

Trong trường hợp của bạn, câu trả lời chung là tệp đối tượng chứa mã được biên dịch (và dữ liệu) của bạn, cộng với tất cả thông tin bổ sung cần thiết bởi trình liên kết và cuối cùng là hơn.

Làm thế nào các thông tin này được "sắp xếp" và trong một số trường hợp trong những gì "dần dần" bao gồm, nó phụ thuộc vào định dạng đối tượng cụ thể. Một số liên kết wikipedia liệt kê một số khả năng là this, this, this, this ...

Mỗi công cụ này có thể phân tích nội dung; ví dụ. readelf đối với ELF, objdump đối với một số định dạng (hãy thử objdump -i) tùy thuộc vào cách được biên dịch.

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