Existe-t-il un moyen de faire lire objdump depuis STDIN au lieu d'un fichier?

8

Dans mon cas spécifique, je veux l'utiliser pour vider ce que je echo.
Je ne veux pas impliquer de fichier ...
Y a-t-il un moyen de faire une objdumplecture à la STDINplace?

OMG
la source
Pourriez-vous expliquer un peu plus votre situation?
quanta

Réponses:

5

tu peux toujours faire

objdump -d /dev/stdin < t2.o

ou

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

échantillon

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

/ dev / stdin: format de fichier elf64-x86-64

Sections: Idx Name Size VMA LMA
File off Algn 0 .group 00000008 0000000000000000 0000000000000000 00000040 2 ** 2 CONTENU, READONLY, EXCLUDE, GROUP, LINK_ONCE_DISCARD

user237419
la source
1
cat t2.o | objdump -d /dev/stdinne marche pas. /dev/stdinne fonctionne que lorsqu'il correspond à un vrai fichier. Étant donné que votre solution nécessite la présence de ce fichier, cela ne répond pas à l'OP.
dragonroot
Cela peut fonctionner pour cette invocation de objdumpen particulier, mais il peut échouer pour d'autres au cas où il effectue des seekopérations sur le fichier. Lorsque les outils n'ont pas -pour stdin, c'est souvent le cas.
Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功
5

Tu ne peux pas. Il n'y a aucun moyen de contourner cela, vous devrez utiliser le fichier temporaire.

Le fichier source readelf.c a cette vérification inconditionnelle (dans binutils 2.22-8 au moins) avant même d'essayer d'ouvrir le fichier:

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

Donc , si le fichier est tout sauf un fichier régulier (comme symlink ou dispositif char comme dans le cas de /dev/stdin, /proc/self/fd/*, etc.) , il ne fonctionnera pas.

Alternativement, vous pouvez modifier la source et utiliser objdump modifié, mais là est votre portabilité.

Matija Nalis
la source
0

Une sorte de solution de contournement utilise tee. Donc, pour démonter un fichier nommé inputuse

cat input | tee a.out | objdump -d

Et, pour donner un exemple de passage de quelques octets avec la echocommande, ce qui suit devrait être un bon exemple (les paramètres sont décrits dans cette bonne réponse SO ):

Pour démonter la séquence d'octets de code x86

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

préfixez-le avec 0:et utilisez la commande

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

Sa sortie est:

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

qui est juste le code assembleur pour quitter un programme linux i386 avec le code de sortie 0xA.

zx485
la source