在我的特定情况下,我想用它来转储我想要的东西echo
。
我不想涉及任何文件...
有没有办法可以objdump
读取STDIN
?
答案1
不行。没有其他办法,你只能使用临时文件。
源文件 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,但这会降低可移植性。
答案2
你总是可以
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 CONTENTS、READONLY、EXCLUDE、GROUP、LINK_ONCE_DISCARD
答案3
llvm-objdump
使用标准选项接受 stdin 输入-
。clillvm-objdump
选项模仿 gnuobjdump
的所有常见用例。
使用示例:
clang src.c -c -o - | llvm-objdump -d -
答案4
一种解决方法是使用。因此,要反汇编名为使用的tee
文件input
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
这只是退出 i386 Linux 程序的汇编代码,退出代码为 0xA。