Respuestas:
siempre puedes hacer
objdump -d /dev/stdin < t2.o
o
cat t2.o | objdump -d /dev/stdin
muestra
[root @ myhost cc] # objdump -h / dev / stdin <t2.o
/ dev / stdin: formato de archivo elf64-x86-64
Secciones: Idx Nombre Tamaño VMA LMA
Archivo desactivado Algn 0 .grupo 00000008 0000000000000000 0000000000000000 00000040 2 ** 2 CONTENIDO, READONLY, EXCLUDE, GROUP, LINK_ONCE_DISCARD
cat t2.o | objdump -d /dev/stdin
No funciona. /dev/stdin
solo funciona cuando corresponde a un archivo real. Como su solución requiere la presencia de ese archivo, esto no responde al OP.
objdump
en particular, pero puede fallar para otros en caso de que realice seek
operaciones en el archivo. Cuando las herramientas no tienen -
para stdin, ese suele ser el caso.
No puedes No hay forma de evitarlo, tendrá que usar el archivo temporal.
El archivo fuente readelf.c tiene esta comprobación incondicional (en binutils 2.22-8 al menos) antes de intentar abrir el archivo:
if (! S_ISREG (statbuf.st_mode))
{
error (_("'%s' is not an ordinary file\n"), file_name);
return 1;
}
Así que si el archivo es cualquier cosa menos archivo normal (como enlace simbólico, o dispositivo de caracteres como en el caso de /dev/stdin
, /proc/self/fd/*
, etc.) no va a funcionar.
Alternativamente, puede modificar la fuente y usar objdump modificado, pero ahí va su portabilidad.
Se está utilizando una especie de solución alternativa tee
. Entonces, para desmontar un archivo llamado input
uso
cat input | tee a.out | objdump -d
Y, para dar un ejemplo para pasar algunos bytes con el echo
comando, el siguiente debería ser un buen ejemplo (los parámetros se describen en esta buena respuesta SO ):
Para desmontar la secuencia de bytes del código x86
b8 01 00 00 00 bb 0a 00 00 00 cd 80
ponerle el prefijo 0:
y usar el 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
Su salida es:
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
que es solo el código de ensamblaje para salir de un programa linux i386 con el código de salida 0xA.