¿Hay alguna manera de hacer que objdump se lea desde STDIN en lugar de un archivo?


8

En mi caso específico, quiero usarlo para volcar lo que yo echo.
No quiero involucrar ningún archivo ...
¿Hay alguna forma de hacer una objdumplectura en su STDINlugar?


¿Podría explicar su situación un poco más?
cuantos

Respuestas:


5

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


1
cat t2.o | objdump -d /dev/stdinNo funciona. /dev/stdinsolo funciona cuando corresponde a un archivo real. Como su solución requiere la presencia de ese archivo, esto no responde al OP.
Dragonroot

Esto puede funcionar para esta invocación objdumpen particular, pero puede fallar para otros en caso de que realice seekoperaciones en el archivo. Cuando las herramientas no tienen -para stdin, ese suele ser el caso.
Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功

5

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.


0

Se está utilizando una especie de solución alternativa tee. Entonces, para desmontar un archivo llamado inputuso

cat input | tee a.out | objdump -d

Y, para dar un ejemplo para pasar algunos bytes con el echocomando, 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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.