C'è un modo per far leggere objdump da STDIN invece che da un file?


8

Nel mio caso specifico, voglio usarlo per scaricare ciò che io echo.
Non voglio coinvolgere alcun file ...
Esiste un modo per objdumpleggere STDINinvece?


Potresti spiegare un po 'di più la tua situazione?
quanti

Risposte:


5

puoi sempre fare

objdump -d /dev/stdin < t2.o

o

cat t2.o | objdump -d /dev/stdin

campione

[root @ myhost cc] # objdump -h / dev / stdin <t2.o

/ dev / stdin: formato file elf64-x86-64

Sezioni: Nome
IDx Dimensione VMA LMA File off Algn 0 .group 00000008 0000000000000000 0000000000000000 00000040 2 ** 2 CONTENUTO, PRONTO, ESCLUDI, GRUPPO, LINK_ONCE_DISCARD


1
cat t2.o | objdump -d /dev/stdinnon funziona. /dev/stdinfunziona solo quando corrisponde a un file reale. Poiché la soluzione richiede la presenza di quel file, questo non risponde all'OP.
Dragonroot,

Questo potrebbe funzionare per questa invocazione objdumpin particolare, ma potrebbe non riuscire per altri nel caso in cui esegua seekoperazioni sul file. Quando gli strumenti non hanno -per lo stdin, questo è spesso il caso.
Ciro Santilli 28 病毒 审查 六四 事件 法轮功

5

Non puoi. Non c'è niente da fare, dovrai usare il file temporaneo.

Il file sorgente readelf.c ha questo controllo incondizionato (almeno in binutils 2.22-8) prima ancora di tentare di aprire il file:

if (! S_ISREG (statbuf.st_mode))
    {
      error (_("'%s' is not an ordinary file\n"), file_name);
      return 1;
    }

Quindi, se il file è tutt'altro che normale file (come collegamento simbolico, o dispositivo char come nel caso di /dev/stdin, /proc/self/fd/*e così via) non funzionerà.

In alternativa, è possibile modificare l'origine e utilizzare objdump modificato, ma va bene la portabilità.


0

È in uso una sorta di soluzione alternativa tee. Quindi per smontare un file chiamato inputuse

cat input | tee a.out | objdump -d

E, per dare un esempio per il passaggio di alcuni byte con il echocomando, il seguente dovrebbe essere un buon esempio (i parametri sono descritti in questa buona risposta SO ):

Per smontare la sequenza di byte del codice x86

b8 01 00 00 00 bb 0a 00 00 00 cd 80

prefissalo con 0:e usa il 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

Il suo output è:

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

che è solo il codice assembly per uscire da un programma Linux i386 con il codice di uscita 0xA.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.