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/stdin
ne marche pas. /dev/stdin
ne 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.
objdump
en particulier, mais il peut échouer pour d'autres au cas où il effectue des seek
opé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é input
use
cat input | tee a.out | objdump -d
Et, pour donner un exemple de passage de quelques octets avec la echo
commande, 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.