回答:
いつでもできる
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 Name Size VMA LMA
File off Algn 0 .group 00000008 0000000000000000 0000000000000000 00000040 2 ** 2 CONTENTS、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;
}
そのため、ファイルが通常のファイル(symlink、またはの場合のようにcharデバイスなど)以外の場合は/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プログラムを終了するためのアセンブリコードです。