У 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), и его вывод обычно может быть as
передан в GNU (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
вместо этого), что актуально для архитектур, которые существуют в любом порядке.