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.