В моем конкретном случае я хочу использовать его для сброса того, что я 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.