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


8

在我的特定情况下,我想用它来转储我的东西echo
我不想涉及任何文件...
是否可以从中进行objdump读取STDIN


您能否再说明一下您的情况?
量子

Answers:


5

你总是可以做

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


1
cat t2.o | objdump -d /dev/stdin不起作用。/dev/stdin仅在与实际文件相对应时起作用。由于您的解决方案需要该文件的存在,因此不会回答OP。
Dragonroot

这可能objdump尤其适用于此调用,但是如果seek对文件执行操作,则可能对其他调用失败。当工具没有-标准输入时,通常就是这种情况。
Ciro Santilli冠状病毒审查六四事件法轮功

5

你不能 无法解决,您将不得不使用临时文件。

源文件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,但是可移植性就可以了。


0

一种解决方法是使用tee。因此要反汇编一个名为inputuse 的文件

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程序的汇编代码。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.