Réponses:
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
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.
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.
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é.
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.