Respostas:
você sempre pode fazer
objdump -d /dev/stdin < t2.o
ou
cat t2.o | objdump -d /dev/stdin
amostra
[root @ myhost cc] # objdump -h / dev / stdin <t2.o
/ dev / stdin: formato de arquivo elf64-x86-64
Seções: Idx Nome Tamanho VMA LMA
Arquivo desativado Algn 0 .group 00000008 0000000000000000 0000000000000000 00000040 2 ** 2 CONTEÚDOS, READONLY, EXCLUDE, GROUP, LINK_ONCE_DISCARD
cat t2.o | objdump -d /dev/stdin
não funciona. /dev/stdin
só funciona quando corresponde a um arquivo real. Como sua solução exige a presença desse arquivo, isso não responde ao OP.
objdump
em particular, mas pode falhar para outras pessoas, caso faça seek
operações no arquivo. Quando as ferramentas não são necessárias -
para o stdin, esse geralmente é o caso.
Você não pode. Não há como contornar isso, você terá que usar o arquivo temporário.
O arquivo de origem readelf.c possui essa verificação incondicional (pelo menos nos binutils 2.22-8) antes mesmo de tentar abrir o arquivo:
if (! S_ISREG (statbuf.st_mode))
{
error (_("'%s' is not an ordinary file\n"), file_name);
return 1;
}
Então, se o arquivo não é nada arquivo regular (como ligação simbólica, ou dispositivo de char como no caso de /dev/stdin
, /proc/self/fd/*
, etc.) que não vai funcionar.
Como alternativa, você pode modificar a fonte e usar o objdump modificado, mas a portabilidade é a mesma.
Um tipo de solução alternativa está usando tee
. Então, para desmontar um arquivo chamado input
use
cat input | tee a.out | objdump -d
E, para dar um exemplo de passagem de alguns bytes com o echo
comando, o seguinte deve ser um bom exemplo (Os parâmetros são descritos nesta boa resposta do SO ):
Para desmontar a sequência de bytes do código x86
b8 01 00 00 00 bb 0a 00 00 00 cd 80
prefixe-o 0:
e use o comando
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
Sua saída é:
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
que é apenas o código de montagem para sair de um programa linux i386 com o código de saída 0xA.