2009-04-30 36 views
8

Có cách nào để tìm tệp đối tượng mà tệp thực thi hiện tại được tạo trong Linux (RHEL cụ thể) hay không. Tôi hiểu rằng người ta có thể sử dụng "nm" để tìm các ký hiệu đã xuất, "ldd" để tìm đối tượng chia sẻ phụ thuộc.Tệp đối tượng trong tệp thực thi trong Linux

Nhưng tôi không thể tìm thấy lệnh để tìm ra tên của tệp đối tượng (.o) có thể thực thi được. Có thể không?

Trả lời

6

Nếu nó đã được biên dịch với thông tin gỡ lỗi có. Sử dụng gdb (man gdb) để tìm thông tin.

Nếu nó chưa được biên soạn mà không có thông tin gỡ lỗi. Bạn không may mắn.

1

Ngoài nullptr, "đối tượng chia sẻ" đề cập đến các thư viện chia sẻ khác (liên kết), không để đối tượng gốc (không liên kết)

1

Bạn cũng có thể sử dụng objdump (miễn là thực thi và các đối tượng được biên soạn với thông tin gỡ lỗi):

# gcc -g -c -o /tmp/some_object.o /tmp/some_object.c 
# gcc -g -o /tmp/file /tmp/file.c /tmp/some_object.o 
# objdump -g /tmp/file | awk 'BEGIN{out=0} /Directory Table/{out=1} /Line Number Statements/{out=0} {if(out){print $0}}' 
The Directory Table (offset 0x1b): 
    1  /tmp 

The File Name Table (offset 0x21): 
    Entry Dir  Time Size Name 
    1  1  0  0  file.c 

The Directory Table (offset 0x5a): 
    1  /tmp 

The File Name Table (offset 0x60): 
    Entry Dir  Time Size Name 
    1  1  0  0  some_object.c 

awk được sử dụng chỉ để trích xuất các thông tin liên quan (nếu bạn không sử dụng, bạn sẽ nhận được thông tin gỡ lỗi đầy đủ trong thực thi và đối tượng).

4

Tên gốc của tệp đối tượng không được lưu trữ trong thông tin gỡ lỗi DWARF.

Mỗi tệp đối tượng có mục nhập DW_TAG_compile_unit trong mục .debug_info. Mục nhập này chứa tham chiếu đến "tệp nguồn chính mà từ đó đơn vị biên dịch được bắt nguồn", nhưng không phải là tên của tệp đối tượng. The DWARF standard chứa danh sách các thuộc tính có thể được lưu trữ cho mỗi đơn vị biên dịch (mục 3.1.1, trang số 44, trang pdf 58).

Bạn có thể xem các thông tin được lưu trữ với lệnh sau đây:

$ readelf --debug-dump=info --dwarf-depth=1 hw 

Output:

Contents of the .debug_info section: 
<some compilation units removed>  
    Compilation Unit @ offset 0x133: 
    Length:  0x8b (32-bit) 
    Version:  4 
    Abbrev Offset: 0x64 
    Pointer Size: 4 
<0><13e>: Abbrev Number: 1 (DW_TAG_compile_unit) 
    <13f> DW_AT_producer : (indirect string, offset: 0x131): GNU C11 5.3.0 -mtune=generic -march=pentiumpro -g 
    <143> DW_AT_language : 12  (ANSI C99) 
    <144> DW_AT_name  : (indirect string, offset: 0x163): hw.c 
    <148> DW_AT_comp_dir : (indirect string, offset: 0x168): /home/mikel/src/hw 
    <14c> DW_AT_low_pc  : 0x80483db 
    <150> DW_AT_high_pc  : 0x2e 
    <154> DW_AT_stmt_list : 0xea 
<1><158>: ... 
<some compilation units removed> 
1

Một tập tin đối tượng chuyển đến một thực thi sau khi kết nối. Nếu liên kết được chia sẻ, thì bạn có thể nhận được thông qua thư viện được chia sẻ (ldd). Tuy nhiên, nếu liên kết là tĩnh, thì chỉ có cách thông qua thông tin gỡ lỗi. Bạn có thể cài đặt các gói debuginfo trong RHEL (hoặc Fedora cho vấn đề đó). Dưới đây là các hướng dẫn

Và sau đó sử dụng gdb info sources như đã mô tả ở đây:

Điều này sẽ cung cấp cho bạn một l ist tệp nguồn. Nhưng để thực sự có được các tập tin đối tượng, bạn cần phải nhìn sâu hơn vào các công cụ xây dựng (rpmbuild).Và để thực sự chạy rpmbuild bạn sẽ cần gói Nguồn RPM, mà bạn có thể có được bằng cách sử dụng hướng dẫn liệt kê ở đây:

Bây giờ bạn có thể xây dựng các chính mình gói, và mổ xẻ mà .o tập tin kết quả vào thực thi.

Tôi hy vọng điều đó sẽ hữu ích.

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