有没有办法让 objdump 从 STDIN 而不是文件读取?

有没有办法让 objdump 从 STDIN 而不是文件读取?

在我的特定情况下,我想用它来转储我想要的东西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。

相关内容