Existe uma maneira de fazer objdump ler de STDIN em vez de um arquivo?


8

No meu caso específico, quero usá-lo para despejar o que eu echo.
Não quero envolver nenhum arquivo ...
Existe uma maneira de fazer a objdumpleitura STDIN?


Poderia, por favor, explicar um pouco mais a sua situação?
— Quanta

Respostas:


5

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


1
cat t2.o | objdump -d /dev/stdinnão funciona. /dev/stdinsó funciona quando corresponde a um arquivo real. Como sua solução exige a presença desse arquivo, isso não responde ao OP.
— dragonroot

Isso pode funcionar para essa chamada objdumpem particular, mas pode falhar para outras pessoas, caso faça seekoperações no arquivo. Quando as ferramentas não são necessárias -para o stdin, esse geralmente é o caso.
— Ciro Santilli publicou 28/08/15

5

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.


0

Um tipo de solução alternativa está usando tee. Então, para desmontar um arquivo chamado inputuse

cat input | tee a.out | objdump -d

E, para dar um exemplo de passagem de alguns bytes com o echocomando, 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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.