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
?
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". –
@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! –
@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ó. –