Gibt es eine Möglichkeit, objdump anstelle einer Datei von STDIN lesen zu lassen?


8

In meinem speziellen Fall möchte ich damit das ausgeben, was ich habe echo.
Ich möchte keine Datei einbeziehen ...
Gibt es eine Möglichkeit, stattdessen zu objdumplesen STDIN?


Könnten Sie bitte Ihre Situation etwas näher erläutern?
Quanten

Antworten:


5

das kannst du immer tun

objdump -d /dev/stdin < t2.o

oder

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

Stichprobe

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

/ dev / stdin: Dateiformat elf64-x86-64

Abschnitte: Idx Name Größe VMA LMA-
Datei aus Algn 0 .group 00000008 0000000000000000 0000000000000000 00000040 2 ** 2 INHALT, READONLY, EXCLUDE, GROUP, LINK_ONCE_DISCARD


1
cat t2.o | objdump -d /dev/stdinfunktioniert nicht. /dev/stdinfunktioniert nur, wenn es einer realen Datei entspricht. Da für Ihre Lösung das Vorhandensein dieser Datei erforderlich ist, wird das OP nicht beantwortet.
Drachenwurzel

Dies kann insbesondere für diesen Aufruf von funktionieren objdump, für andere jedoch möglicherweise fehlschlagen, falls seekOperationen an der Datei ausgeführt werden. Wenn Werkzeuge nicht -für stdin haben, ist das oft der Fall.
Ciro Santilli 28 病毒 审查 六四 事件 28

5

Das kannst du nicht. Daran führt kein Weg vorbei, Sie müssen die temporäre Datei verwenden.

Die Quelldatei readelf.c hat diese bedingungslose Prüfung (mindestens in binutils 2.22-8), bevor überhaupt versucht wird, die Datei zu öffnen:

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

Also , wenn die Datei alles andere als normale Datei ist (wie Symlink oder char Gerät wie bei /dev/stdin, /proc/self/fd/*usw.) wird es nicht funktionieren.

Alternativ können Sie die Quelle ändern und modifizierten objdump verwenden, aber Ihre Portabilität bleibt bestehen.


0

Eine Art Problemumgehung wird verwendet tee. So zerlegen Sie eine Datei mit dem Namen inputuse

cat input | tee a.out | objdump -d

Um ein Beispiel für die Übergabe einiger Bytes mit dem echoBefehl zu geben, sollte Folgendes ein gutes Beispiel sein (Die Parameter werden in dieser guten SO-Antwort beschrieben ):

So zerlegen Sie die x86-Codebyte-Sequenz

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

Stellen Sie ihm 0:den Befehl voran und verwenden Sie ihn

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

Seine Ausgabe ist:

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

Dies ist nur der Assemblycode zum Beenden eines i386-Linux-Programms mit dem Exit-Code 0xA.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.