Есть ли способ заставить objdump читать из STDIN вместо файла?


8

В моем конкретном случае я хочу использовать его, чтобы сбросить то, что я echo.
Я не хочу включать какой-либо файл ...
Есть ли способ сделать objdumpчтение STDINвместо?


Не могли бы вы объяснить немного больше вашей ситуации?
кванты

Ответы:


5

ты всегда можешь сделать

objdump -d /dev/stdin < t2.o

или

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

образец

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

/ dev / stdin: формат файла elf64-x86-64

Разделы: Idx Имя Размер VMA LMA
Файл выключен Algn 0 .группа 00000008 0000000000000000 0000000000000000 00000040 2 ** 2 СОДЕРЖАНИЕ, ЧИТАТЬ, ИСКЛЮЧИТЬ, ГРУППА, LINK_ONCE_DISCARD


1
cat t2.o | objdump -d /dev/stdinне работает. /dev/stdinработает только тогда, когда это соответствует реальному файлу. Поскольку ваше решение требует наличия этого файла, это не отвечает OP.
dragonroot

Это может работать, objdumpв частности, для этого вызова , но может не работать для других, если он выполняет seekоперации с файлом. Когда инструменты не -подходят для стандартного ввода, это часто бывает.
Сиро Сантилли 冠状 病毒 审查 六四 事件 法轮功

5

Ты не можешь Обойти это невозможно, вам придется использовать временный файл.

Исходный файл readelf.c имеет эту безусловную проверку (по крайней мере в binutils 2.22-8) перед тем, как даже пытаться открыть файл:

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

Так что, если файл ничего , кроме обычного файл (например , линк, или символьное устройство , как и в случае /dev/stdin, /proc/self/fd/*и т.д.) , он не будет работать.

В качестве альтернативы, вы можете изменить исходный код и использовать модифицированный objdump, но это переносит вашу переносимость.


0

Это своего рода обходной путь tee. Таким образом, чтобы разобрать файл с именем inputиспользования

cat input | tee a.out | objdump -d

И, чтобы привести пример для передачи некоторых байтов с помощью echoкоманды, хороший пример должен быть следующий (параметры описаны в этом хорошем ответе SO ):

Разобрать последовательность байтов кода x86

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

добавьте к нему префикс 0:и используйте команду

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

Его вывод:

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

это просто код сборки для выхода из программы Linux i386 с кодом выхода 0xA.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.