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

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

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, но это переносит вашу переносимость.

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

objdump -d /dev/stdin < t2.o

или же

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

образец

[root@myhost cc]# objdump -h /dev/stdin

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

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

принимает ввод stdin со стандартом-вариант.llvm-objdumpОпции cli имитируют GNUobjdumpдля всех распространенных случаев использования.

Пример использования:clang src.c -c -o - | llvm-objdump -d -

я использовалndisasm -b 64 -в качестве обходного пути.

например, я хотел:

echo 41 89 1b | xxd -r -p | objdump -d -

Но вышеописанное не работает. Хотя это работает:

echo 41 89 1b | xxd -r -p | ndisasm -b 64 -

Своего рода обходной путь использует 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.

Другие вопросы по тегам