Назад | Перейти на главную страницу

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

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

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

Исходный файл 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

образец

[корень @ 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

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

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