Есть ли способ заставить 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.