2016-10-09 60 views
7

Tôi đang viết trình biên dịch và chỉ mới bắt đầu tạo các tệp thi hành ELF từ đầu. Tôi đang tạo một phần .text (mặc dù nó không có tên vì tôi chưa tạo bảng chuỗi) và cố gắng đặt nó trong phân đoạn PT_LOAD. Tuy nhiên, readelf không báo cáo rằng phần được ánh xạ vào phân đoạn và objdump từ chối tháo rời mã trong phần .text. Đây là readout của readelf, với một số bit bỏ qua cho ngắn gọn:Các phần ELF không được ánh xạ tới các phân đoạn như mong đợi

ELF Header: 
    Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 
    Class:        ELF64 
    Data:        2's complement, little endian 
    Version:       1 (current) 
    OS/ABI:       UNIX - System V 
    ABI Version:      0 
    Type:        EXEC (Executable file) 
    Machine:       Advanced Micro Devices X86-64 
    Version:       0x1 
    Entry point address:    0x0 
    Start of program headers:   64 (bytes into file) 
    Start of section headers:   122 (bytes into file) 
    Flags:        0x0 
    Size of this header:    64 (bytes) 
    Size of program headers:   56 (bytes) 
    Number of program headers:   1 
    Size of section headers:   64 (bytes) 
    Number of section headers:   2 
    Section header string table index: 0 

Section Headers: 
    [Nr] Name    Type    Address   Offset 
     Size    EntSize   Flags Link Info Align 
    [ 0] <no-name>   NULL    0000000000000000 00000000 
     0000000000000000 0000000000000000   0  0  0 
    [ 1] <no-name>   PROGBITS   0000000008048000 00000078 
     0000000000000002 0000000000000000 AX  0  0  16 
Key to Flags: 
    W (write), A (alloc), X (execute), M (merge), S (strings), l (large) 
    I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown) 
    O (extra OS processing required) o (OS specific), p (processor specific) 

There are no section groups in this file. 

Program Headers: 
    Type   Offset    VirtAddr   PhysAddr 
       FileSiz   MemSiz    Flags Align 
    LOAD   0x0000000000000078 0x0000000008048000 0x0000000008048000 
       0x0000000000000002 0x0000000000000002 R E 1000 

Tại bù đắp 0x78, tôi chỉ phát ra hai push ebx s (opcode 0x53) để thử nghiệm. Đây là bãi hex:

00000000 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 |.ELF............| 
00000010 02 00 3e 00 01 00 00 00 00 00 00 00 00 00 00 00 |..>.............| 
00000020 40 00 00 00 00 00 00 00 7a 00 00 00 00 00 00 00 |@.......z.......| 
00000030 00 00 00 00 40 00 38 00 01 00 40 00 02 00 00 00 |[email protected]@.....| 
00000040 01 00 00 00 05 00 00 00 78 00 00 00 00 00 00 00 |........x.......| 
00000050 00 80 04 08 00 00 00 00 00 80 04 08 00 00 00 00 |................| 
00000060 02 00 00 00 00 00 00 00 02 00 00 00 00 00 00 00 |................| 
00000070 00 10 00 00 00 00 00 00 53 53 00 00 00 00 00 00 |........SS......| 
00000080 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 
* 
000000b0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 |................| 
000000c0 00 00 06 00 00 00 00 00 00 00 00 80 04 08 00 00 |................| 
000000d0 00 00 78 00 00 00 00 00 00 00 02 00 00 00 00 00 |..x.............| 
000000e0 00 00 00 00 00 00 00 00 00 00 10 00 00 00 00 00 |................| 
* 
000000fa 

Chỉnh sửa: Câu hỏi - Tại sao không phải là một phần để lập bản đồ phân khúc thể hiện giữa hai, và tại sao không tháo thể hiện bởi objdump?

+0

Bạn có câu hỏi không? Bạn nói một loạt các sự kiện, và sau đó ...? Nếu câu hỏi của bạn là "tại sao không đọc phần hiển thị để phân đoạn ánh xạ, câu trả lời có thể sẽ là: không tạo một phần không có tên". –

+0

@EmployedRussian - đã thêm một câu hỏi. Vì vậy, là một bảng chuỗi với tên phần cần thiết để tháo gỡ với 'objdump' và hiển thị ánh xạ? Tôi sẽ thử thêm một bảng chuỗi khi tôi về nhà, và xem nó có tạo sự khác biệt không, cảm ơn! –

+0

@EmployedRussian yup - có vẻ như một bảng chuỗi là cần thiết để báo cáo ánh xạ vì một lý do nào đó. Nếu bạn muốn đăng câu trả lời đó, tôi sẽ chấp nhận nó. –

Trả lời

1

Tại sao không phải là một phần để lập bản đồ phân khúc thể hiện giữa hai

Bởi vì không có hợp lệ phần (như xa như readelf thể nói).

và tại sao không tháo gỡ được hiển thị bởi objdump?

objdump cũng sử dụng phần.

Mặc dù các phần không được yêu cầu cho thực thi một phần của thời gian ELF, rất nhiều công cụ phụ thuộc vào các phần đang có mặt. Ví dụ, phân đoạn đơn độc mà bạn có trong tệp thực thi của bạn chứa cả mã và tiêu đề ELF và tiêu đề chương trình. Nói chung, bạn không muốn tháo rời tiêu đề. Không có phần, objdump không biết bắt đầu từ đâu để tháo gỡ.

+2

Để xây dựng, cho một phần hợp lệ, trường 'tên' phải trỏ đến mục nhập khác 0 trong bảng chuỗi hợp lệ. –

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