Answers:
你总是可以做
objdump -d /dev/stdin < t2.o
要么
cat t2.o | objdump -d /dev/stdin
样品
[root @ myhost cc]#objdump -h / dev / stdin <t2.o
/ dev / stdin:文件格式elf64-x86-64
节:Idx名称大小VMA LMA
文件关闭Algn 0 .group 00000008 0000000000000000 0000000000000000 00000040 2 ** 2目录,READONLY,EXCLUDE,GROUP,LINK_ONCE_DISCARD
cat t2.o | objdump -d /dev/stdin
不起作用。/dev/stdin
仅在与实际文件相对应时起作用。由于您的解决方案需要该文件的存在,因此不会回答OP。
objdump
尤其适用于此调用,但是如果seek
对文件执行操作,则可能对其他调用失败。当工具没有-
标准输入时,通常就是这种情况。
你不能 无法解决,您将不得不使用临时文件。
源文件readelf.c甚至在尝试打开文件之前都具有此无条件检查(至少在binutils 2.22-8中):
if (! S_ISREG (statbuf.st_mode))
{
error (_("'%s' is not an ordinary file\n"), file_name);
return 1;
}
因此,如果该文件是什么,但普通文件(如符号链接,或字符设备如的情况下/dev/stdin
,/proc/self/fd/*
等)将无法正常工作。
另外,您可以修改源代码并使用修改后的objdump,但是可移植性就可以了。
一种解决方法是使用tee
。因此要反汇编一个名为input
use 的文件
cat input | tee a.out | objdump -d
并且,为了给出一个使用echo
命令传递一些字节的示例,以下应该是一个很好的示例(参数在此良好的SO答案中进行了描述):
分解x86代码字节序列
b8 01 00 00 00 bb 0a 00 00 00 cd 80
加上前缀0:
并使用命令
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
其输出为:
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
这只是退出代码为0xA的i386 linux程序的汇编代码。