Câu trả lời:
bạn luôn có thể làm
objdump -d /dev/stdin < t2.o
hoặc là
cat t2.o | objdump -d /dev/stdin
mẫu vật
[root @ myhost cc] # objdump -h / dev / stdin <t2.o
/ dev / stdin: định dạng tệp elf64-x86-64
Phần: Kích thước tên Idx VMA LMA
Tắt tệp Algn 0 .group 00000008 0000000000000000 0000000000000000 00000040 2 ** 2 NỘI DUNG, SYN SÀNG, LOẠI TRỪ, NHÓM, LINK_ONCE_DISCARD
cat t2.o | objdump -d /dev/stdin
không hoạt động. /dev/stdin
chỉ hoạt động khi nó tương ứng với một tập tin thực sự. Vì giải pháp của bạn yêu cầu sự hiện diện của tệp đó, điều này không trả lời OP.
objdump
đặc biệt này, nhưng nó có thể thất bại cho những người khác trong trường hợp nó seek
hoạt động trên tệp. Khi các công cụ không có -
cho stdin, đó thường là trường hợp.
Bạn không thể. Không có cách nào khác, bạn sẽ phải sử dụng tệp tạm thời.
Tệp nguồn readelf.c có kiểm tra vô điều kiện này (ít nhất là trong binutils 2,22-8) trước khi cố gắng mở tệp:
if (! S_ISREG (statbuf.st_mode))
{
error (_("'%s' is not an ordinary file\n"), file_name);
return 1;
}
Vì vậy, nếu các tập tin là bất cứ điều gì nhưng tập tin thường xuyên (như liên kết tượng trưng, hoặc thiết bị char như trong trường hợp của /dev/stdin
, /proc/self/fd/*
vv) nó sẽ không làm việc.
Ngoài ra, bạn có thể sửa đổi nguồn và sử dụng objdump đã sửa đổi, nhưng sẽ có tính di động của bạn.
Một loại cách giải quyết đang sử dụng tee
. Vì vậy, để tháo rời một tập tin có tên input
sử dụng
cat input | tee a.out | objdump -d
Và, để đưa ra một ví dụ cho việc truyền một số byte bằng echo
lệnh, sau đây phải là một ví dụ tốt (Các tham số được mô tả trong câu trả lời SO tốt này ):
Để tháo chuỗi byte mã x86
b8 01 00 00 00 bb 0a 00 00 00 cd 80
tiền tố nó với 0:
và sử dụng lệnh
echo "0: b8 01 00 00 00 bb 0a 00 00 00 cd 80" | xxd -r | tee a.out | objdump -D -Mintel,i386 -b binary -m i386
Đầu ra của nó là:
a.out: file format binary
Disassembly of section .data:
00000000 <.data>:
0: b8 01 00 00 00 mov eax,0x1
5: bb 0a 00 00 00 mov ebx,0xa
a: cd 80 int 0x80
đó chỉ là mã lắp ráp để thoát khỏi chương trình linux i386 với mã thoát 0xA.