starblue и hlovdal у обоих есть части канонического ответа. Если вы хотите дизассемблировать необработанный код i8086, вам обычно нужен синтаксис Intel, а не синтаксис AT&T, поэтому используйте:
objdump -D -Mintel,i8086 -b binary -m i386 mbr.bin
objdump -D -Mintel,i386 -b binary -m i386 foo.bin # for 32-bit code
objdump -D -Mintel,x86-64 -b binary -m i386 foo.bin # for 64-bit code
Если ваш код ELF (или a.out (или (E)COFF)), вы можете использовать короткую форму:
objdump -D -Mintel,i8086 a.out # disassembles the entire file
objdump -d -Mintel,i8086 a.out # disassembles only code sections
Для 32-битного или 64-битного кода опустите ,8086
; заголовок ELF уже включает эту информацию.
ndisasm
, как предлагает jameslin, также является хорошим выбором, но objdump
обычно поставляется с ОС и может работать со всеми архитектурами. поддерживается GNU binutils (надмножество тех, которые поддерживаются GCC), и его вывод обычно может быть передан в GNU as
(хотя, конечно, ndisasm обычно может быть передан в nasm
).
Питер Кордес предполагает, что "objconv Агнера Фога очень хорош. Он ставит метки на цели ветвления, что значительно упрощает понимание того, что делает код. Он может дизассемблироваться в синтаксис NASM, YASM, MASM или AT&T (GNU)».
Мультимедийный Майк уже узнал о --adjust-vma
; эквивалентом ndisasm
является опция -o
.
Чтобы дизассемблировать, скажем, код sh4
(я использовал для тестирования один бинарник от Debian), используйте это с GNU binutils (почти все остальные дизассемблеры ограничены одной платформой, например x86 с ndisasm
и objconv
):
objdump -D -b binary -m sh -EL x
-m
— это машина, а -EL
означает Little Endian (для sh4eb
вместо этого используйте -EB
), что актуально для архитектур, которые существуют в любом порядке байтов.
person
mirabilos
schedule
22.12.2015