Objdump linux как использовать

Обновлено: 03.07.2024

Всегда полезно иметь доступ к инструменту анализа при работе со скомпилированными исполняемыми файлами. В Linux ObjDump является одним из таких инструментов, который можно использовать для извлечения информации из объектных файлов.

В этой статье представлен обзор различных параметров командной строки ObjDump и их использования. В качестве целевой программы мы возьмем простую программу Hello World, написанную на ассемблере x86, и запустим для нее ObjDump.

Что такое ObjDump?

Как упоминалось в начале статьи, ObjDump — полезная утилита для извлечения информации из объектных файлов. Этот инструмент предустановлен в большинстве дистрибутивов Linux. Ниже приведены параметры справки, доступные при запуске ObjDump.

Отображать информацию из объекта .

Должен быть указан хотя бы один из следующих ключей:

-a, --archive-headers Показать информацию о заголовке архива

-f, --file-headers Показать содержимое общего заголовка файла

-p, --private-headers Отображать содержимое заголовка файла, связанное с форматом объекта

-P, --private=OPT,OPT… Отобразить содержимое, специфичное для формата объекта

-h, --[section-]headers Показать содержимое заголовков разделов

-x, --all-headers Показать содержимое всех заголовков

-d, --disassemble Отображать содержимое исполняемых секций на ассемблере

-D, --disassemble-all Показать содержимое всех разделов на ассемблере

–disassemble= Показать содержимое ассемблера из

-S, –source Исходный код Intermix с дизассемблированием

–source-comment[= ] Ставьте перед строками исходного кода

-s, --full-contents Показать полное содержимое всех запрошенных разделов

-g, --debugging Показать отладочную информацию в объектном файле

-e, --debugging-tags Отображать отладочную информацию в стиле ctags

-G, --stabs Показать (в необработанном виде) любую информацию о STABS в файле

Отображать информацию о DWARF в файле

–ctf=SECTION Показать информацию CTF из SECTION

-t, --syms Показать содержимое таблицы (таблиц) символов

-T, --dynamic-syms Показать содержимое таблицы динамических символов

-r, --reloc Показать записи перемещения в файле

-R, --dynamic-reloc Показать записи динамического перемещения в файле

@ Варианты чтения из

-v, --version Показать номер версии этой программы

-i, –info Список поддерживаемых форматов и архитектур объектов

Как извлечь ассемблерный код

Инструмент ObjDump можно использовать для извлечения ассемблерного кода из уже созданного двоичного файла. Давайте начнем с изучения следующей программы сборки, чтобы лучше понять подход, который можно использовать.

msg db ‘Привет, мир!’,0xa

Как видно из предыдущей программы, ассемблерный код написан в разделе .text. Таким образом, мы можем использовать ObjDump для извлечения раздела .text из объектного файла, созданного ассемблером. Также можно извлечь другие разделы, такие как .rodata. В следующих нескольких разделах мы обсудим, как это можно сделать.

Отображение содержимого заголовка с помощью ObjDump

Чтобы отобразить содержимое заголовка из двоичного файла, мы можем использовать флаг -x, как показано ниже.

helloworld: формат файла elf32-i386

EXEC_P, HAS_SYMS, D_PAGED

начальный адрес 0x08049000

LOAD off 0x00000000 vaddr 0x08048000 paddr 0x08048000 выравнивание 2**12

filesz 0x00000094 memsz 0x00000094 флаги r–

LOAD off 0x00001000 vaddr 0x08049000 paddr 0x08049000 выравнивание 2**12

filesz 0x00000022 memsz 0x00000022 флаги r-x

LOAD off 0x00002000 vaddr 0x0804a000 paddr 0x0804a000 выравнивание 2**12

filesz 0x0000000e memsz 0x0000000e флаги r–

Имя Idx Размер VMA LMA File off Algn

0 .text 00000022 08049000 08049000 00001000 2**4

СОДЕРЖИМОЕ, ​​РАЗМЕСТИТЬ, ЗАГРУЗИТЬ, ТОЛЬКО ДЛЯ ЧТЕНИЯ, КОД

1 .rodata 0000000e 0804a000 0804a000 00002000 2**2

СОДЕРЖАНИЕ, РАЗМЕЩЕНИЕ, ЗАГРУЗКА, ТОЛЬКО ДЛЯ ЧТЕНИЯ, ДАННЫЕ

08049000 л д .текст 00000000 .текст

0804a000 l d .rodata 00000000 .rodata

00000000 l df *ABS* 00000000 helloworld.nasm

0804a000 l .rodata 00000000 msg

0000000e l *ABS* 00000000 len

08049000 g .text 00000000 _start

0804b00e g .rodata 00000000 __bss_start

0804b00e g .rodata 00000000 _edata

Как упоминалось ранее, в качестве цели мы использовали программу Hello World. В предыдущем выводе показана извлеченная информация заголовка. Сюда входят метаданные двоичного файла elf (с такими подробностями, как формат файла, архитектура), заголовок программы, разделы, доступные в двоичном файле (.text, .rodata) и таблица символов.

Отображение ассемблерного содержимого исполняемых разделов с помощью ObjDump

Как обсуждалось ранее, мы можем использовать раздел .text для вывода ассемблерного кода из предварительно собранного двоичного файла. Это можно сделать с помощью флага -d, как показано в следующем отрывке.

Содержимое ассемблера из текстовой секции:

helloworld: формат файла elf32-i386

Разборка раздела .text:

8049000: ba 0e 00 00 00 mov $0xe,%edx

8049005: b9 00 a0 04 08 mov $0x804a000,%ecx

804900a: bb 01 00 00 00 mov $0x1,%ebx

804900f: b8 04 00 00 00 mov $0x4,%eax

8049014: cd 80 int $0x80

8049016: b8 01 00 00 00 mov $0x1,%eax

804901b: bb 00 00 00 00 mov $0x0,%ebx

Как видно из предыдущего отрывка, ассемблерный код показан, но в синтаксисе AT&T. Также возможно управлять синтаксисом вывода. Это можно сделать с помощью флага -M, как показано ниже.

Содержимое ассемблера из текстового раздела в синтаксисе ассемблера Intel:

helloworld: формат файла elf32-i386

Разборка раздела .text:

8049000: ba 0e 00 00 00 mov edx,0xe

8049005: b9 00 a0 04 08 mov ecx,0x804a000

804900a: bb 01 00 00 00 mov ebx,0x1

804900f: b8 04 00 00 00 mov eax,0x4

8049014: компакт-диск 80, интервал 0x80

8049016: b8 01 00 00 00 mov eax,0x1

804901b: bb 00 00 00 00 mov ebx,0x0

Как мы видим, выходные данные теперь представлены в синтаксисе Intel. Точно так же, если мы хотим явно отобразить ассемблерный код в синтаксисе AT&T, это можно сделать следующим образом.

Содержимое ассемблера из текстового раздела в синтаксисе ассемблера AT&T:

helloworld: формат файла elf32-i386

Разборка раздела .text:

8049000: ba 0e 00 00 00 mov $0xe,%edx

8049005: b9 00 a0 04 08 mov $0x804a000,%ecx

804900a: bb 01 00 00 00 mov $0x1,%ebx

804900f: b8 04 00 00 00 mov $0x4,%eax

8049014: cd 80 int $0x80

8049016: b8 01 00 00 00 mov $0x1,%eax

804901b: bb 00 00 00 00 mov $0x0,%ebx

Если мы хотим отобразить ассемблерный код из всех разделов, мы можем использовать флаг -D.

Содержимое ассемблера из всех разделов синтаксиса ассемблера Intel:

helloworld: формат файла elf32-i386

Разборка раздела .text:

8049000: ba 0e 00 00 00 mov edx,0xe

8049005: b9 00 a0 04 08 mov ecx,0x804a000

804900a: bb 01 00 00 00 mov ebx,0x1

804900f: b8 04 00 00 00 mov eax,0x4

8049014: компакт-диск 80, интервал 0x80

8049016: b8 01 00 00 00 mov eax,0x1

804901b: bb 00 00 00 00 mov ebx,0x0

8049020: компакт-диск 80, интервал 0x80

Разборка раздела .rodata:

804a000: 48 дес. экв.

804a001: 65 6c gs ins BYTE PTR es:[edi],dx

804a003: 6c ins BYTE PTR es:[edi],dx

804a004: 6f выходы dx,DWORD PTR ds:[esi]

804a005: 2c 20 sub al,0x20

804a007: 77 6f и 804a078

804a009: 72 6c jb 804a077

Аналогичным образом мы можем извлечь содержимое ассемблера, используя ObjDump в синтаксисе AT&T.

Отображение отладочной информации с помощью ObjDump

Мы можем использовать флаг -g ObjDump для отображения отладочной информации из двоичного файла. В следующем фрагменте показан вывод скомпилированной программы на C.

переход: формат файла elf64-x86-64

Содержимое раздела .eh_frame (загружается при переходе):

00000000 0000000000000014 00000000 CIE

Коэффициент выравнивания кода: 1

Коэффициент выравнивания данных: -8

Столбец обратного адреса: 16

Данные дополнения: 1b

DW_CFA_def_cfa: r7 (rsp) из 8

DW_CFA_offset: r16 (рип) на cfa-8

Отображение содержимого таблицы символов с помощью ObjDump

Согласно документам Oracle, «таблица символов содержит информацию для поиска и перемещения определений и ссылок символов. Ассемблер создает раздел таблицы символов для объектного файла. Он делает запись в таблице символов для каждого символа, который определен или указан во входном файле и необходим во время компоновки. Затем таблица символов используется редактором ссылок во время перемещения».

Флаг -t ObjDump можно использовать для отображения таблицы символов из исполняемого файла.

helloworld: формат файла elf32-i386

08049000 л д .текст 00000000 .текст

0804a000 l d .rodata 00000000 .rodata

00000000 l df *ABS* 00000000 helloworld.nasm

0804a000 l .rodata 00000000 msg

0000000e l *ABS* 00000000 len

08049000 g .text 00000000 _start

0804b00e g .rodata 00000000 __bss_start

0804b00e g .rodata 00000000 _edata

Как видно из предыдущего отрывка, на каждый символ, используемый в программе, есть ссылка в таблице символов.

Команда Objdump в Linux используется для предоставления подробной информации об объектных файлах. Эта команда в основном используется программистами, работающими с компиляторами, но все же это очень удобный инструмент для обычных программистов, когда дело доходит до отладки. В этой статье мы поймем, как использовать команду objdump на нескольких примерах.

Основной синтаксис objdump:

Для этой команды доступно множество параметров. В этом уроке мы постараемся охватить большую часть из них.

Примеры

Двоичный файл ELF следующей программы на C используется во всех примерах, упомянутых в этой статье.

Примечание. Приведенный выше код — это всего лишь тестовый код, который использовался для какой-то другой цели, но я нашел его достаточно простым для использования в этой статье.

1.Отобразить содержимое общего заголовка файла с помощью параметра -f

Рассмотрите следующий пример:

Итак, мы видим, что информация, относящаяся к общему заголовку файла, была показана в выводе.

ПРИМЕЧАНИЕ. В примерах используется формат исполняемого файла ELF. Чтобы узнать больше об этом, обратитесь к нашей статье о формате файла ELF.

2.Отображать содержимое заголовка файла, относящегося к формату объекта, с помощью параметра -p

В следующем примере печатается информация, относящаяся к формату объектного файла.

3. Отобразить содержимое заголовков разделов с помощью параметра -h

В объектном файле могут быть различные разделы. Связанную с ними информацию можно вывести с помощью параметра -h.

В следующих примерах показаны различные разделы. Как видите, их всего 26 (здесь показан только частичный вывод).

Итак, мы видим, что информация, относящаяся ко всем заголовкам разделов, была напечатана в выводе. В приведенном выше выводе Size — это размер загруженного раздела, VMA — адрес виртуальной памяти, LMA — адрес логической памяти, File off — смещение этого раздела от начала файла, Algn — выравнивание, CONTENTS, ALLOC, LOAD , ТОЛЬКО ДЛЯ ЧТЕНИЯ, ДАННЫЕ — это флаги, указывающие на то, что конкретный раздел должен быть ЗАГРУЖЕН или ТОЛЬКО ДЛЯ ЧТЕНИЯ и т. д.

4. Отобразить содержимое всех заголовков, используя параметр -x

Информацию, относящуюся ко всем заголовкам в объектном файле, можно получить с помощью параметра -x.

В следующем примере отображаются все разделы (здесь показан только частичный вывод):

5. Отображать содержимое исполняемых разделов на ассемблере с помощью опции -d

Рассмотрите следующий пример. Ассемблерное содержимое исполняемых разделов (в объектном файле) отображается в этом выводе (частичный вывод показан ниже):

6. Отобразить ассемблерное содержимое всех секций с помощью опции -D

В случае, если на выходе требуется ассемблерное содержимое всех секций, можно использовать опцию -D.

Рассмотрите следующий результат:

Итак, мы видим, что соответствующие выходные данные были отображены. Так как вывод был очень длинным, поэтому я его обрезал. Обратите внимание, что я использовал команду пейджера для управления выводом.

7. Отобразить полное содержимое всех разделов с помощью параметра -s

Рассмотрите следующий пример:

Итак, мы видим, что в выводе отображается полное содержимое всех разделов.

8. Отобразить отладочную информацию с помощью параметра -g

Рассмотрите следующий пример:

Итак, мы видим, что вся доступная отладочная информация была напечатана в выводе.

9. Отобразить содержимое таблицы символов (или таблиц) с помощью параметра -t

Рассмотрите следующий пример:

Итак, мы видим, что содержимое таблицы символов было отображено в выводе.

10. Отобразить содержимое таблицы динамических символов с помощью опции -T

Динамические символы — это те, которые разрешаются во время выполнения. Информацию об этих символах можно получить с помощью параметра -D.

Рассмотрите следующий пример:

Итак, мы видим, что информация, относящаяся к динамическим символам, отображалась в выводе.

11. Отобразить записи динамического перемещения в файле с помощью параметра -R

Рассмотрите следующий пример:

Итак, мы видим, что все записи о динамическом перемещении были отображены в выходных данных.

12. Отобразить интересующий раздел с помощью параметра -j

Это чрезвычайно полезно, когда вы знаете, к какому разделу относится информация. В этом случае используется опция -j.

Рассмотрите следующий пример:

Итак, мы видим, что информация, относящаяся к разделу родата, была показана выше.

13. Используйте старый формат дизассемблирования с опцией –prefix-addresses

Старый формат печатает полный адрес в каждой строке.

Рассмотрите следующий пример:

Итак, мы видим, что в выводе был напечатан полный адрес.

14. Принять параметры ввода из файла с помощью опции @

При желании параметры objdump можно прочитать из файла. Это можно сделать с помощью опции ‘@’.

Рассмотрите следующий пример:

В приведенном выше примере я использовал параметры -v и -i. В то время как -v используется для вывода информации о версии, -i используется для предоставления поддерживаемых форматов и архитектур объектов.

objdump [-a|--archive-headers]
[-b имя_bfd|--target=имя_bfd]
[-C |--demangle[=стиль] ]
[-d|--разобрать]
[-D|--разобрать-все]
[-z| --disassemble-zeroes]
[-EB|-EL|--endian=]
[-f|--file-headers]
[--file-start-context] < br />[-g|--debugging]
[-e|--debugging-tags]
[-h|--section-headers|--headers]
[-i |--info]
[-j раздел|--section=раздел]
[-l|--номера строк]
[-S|--source]
[-m машина|--architecture=машина]
[-M опции |--disassembler-options=опции]
[-p|--private-headers]
[-r|--reloc]
[-R|--dynamic-reloc]
[-s|--full-contents]
[-W|--dwarf]
[-G|--stabs]
[-G|--stabs]
/>[-t|--syms]
[-T|--dynamic-syms]
[-x|--all-headers]
[-w|--wide]
[--start-address=адрес]
[--stop-address=адрес]
[--prefix-addresses ]
[--[no-]show-raw-insn]
[--adjust-vma=off set]
[--special-syms]
[-V|--версия]
[-H|--help]
objfile< /i>.

objdump отображает информацию об одном или нескольких объектных файлах. Параметры определяют, какую конкретную информацию отображать. Эта информация в основном полезна для программистов, работающих с инструментами компиляции, в отличие от программистов, которые просто хотят, чтобы их программа компилировалась и работала.

объектный файл. являются объектными файлами, которые необходимо проверить. Когда вы указываете архивы, objdump показывает информацию о каждом из файлов объектов-членов.

Если целью является архитектура ARM, то этот переключатель можно использовать для выбора набора имен регистров, который будет использоваться во время дизассемблера. Указание -M reg-names-std (по умолчанию) выберет имена регистров, используемые в документации набора инструкций ARM, но с регистром 13 под названием «sp», регистром 14 под названием «lr» и регистром 15 под названием «pc». Указание -M reg-names-apcs выберет набор имен, используемый стандартом вызова процедур ARM, а указание -M reg-names-raw будет использовать только r, за которым следует номер регистра.

Есть также два варианта схемы именования регистров APCS, которые включаются параметрами -M reg-names-atpcs и -M reg-names-special-atpcs, которые используют стандартные соглашения об именах ARM/Thumb Procedure Call. (Либо с обычными именами регистров, либо со специальными именами регистров).

Этот параметр также можно использовать для архитектур ARM, чтобы заставить дизассемблер интерпретировать все инструкции как инструкции Thumb с помощью переключателя --disassembler-options=force-thumb. Это может быть полезно при попытке дизассемблировать код большого пальца, созданный другими компиляторами.

Для x86 некоторые параметры дублируют функции ключа -m, но обеспечивают более точное управление. Несколько вариантов из следующего могут быть указаны в виде строки, разделенной запятыми. x86-64, i386 и i8086 выбирают дизассемблирование для данной архитектуры. intel и att выбирают между режимом синтаксиса Intel и режимом синтаксиса AT&T. addr32, addr16, data32 и data16 определяют размер адреса по умолчанию и размер операнда. Эти четыре параметра будут переопределены, если x86-64, i386 или i8086 появятся позже в строке параметров. Наконец, суффикс в режиме AT&T указывает дизассемблеру напечатать мнемонический суффикс, даже если суффикс можно вывести из операндов.

Для PPC , booke, booke32 и booke64 выберите дизассемблирование инструкций BookE. 32 и 64 выбирают дизассемблирование PowerPC и PowerPC64 соответственно. e300 выбирает разборку для семейства e300.

Для MIPS этот параметр управляет печатью мнемонических имен инструкций и имен регистров в дизассемблированных инструкциях. Несколько вариантов из следующего могут быть указаны в виде строки, разделенной запятой, а недопустимые параметры игнорируются: ТегОписание без псевдонимов Печать «сырая» мнемоника инструкции вместо некоторой мнемоники псевдоинструкции. Т.е. печатать 'daddu' или 'or' вместо 'move', 'sll' вместо 'nop' и т. д. gpr-names= ABI Печать имен GPR (регистров общего назначения) в соответствии с указанным ABI. По умолчанию имена GPR выбираются в соответствии с ABI дизассемблируемого двоичного файла. fpr-names= ABI Вывести имена FPR (регистров с плавающей запятой) в соответствии с указанным ABI. По умолчанию вместо имен печатаются номера FPR. cp0-names= ARCH< /tt> Напечатайте имена регистров CP0 (сопроцессор управления системой; сопроцессор 0) в соответствии с ЦП или архитектурой, указанной ARCH . По умолчанию имена регистров CP0 выбираются в соответствии с архитектурой и ЦП дизассемблируемого двоичного файла. hwr-names= ARCH Печать Имя HWR (аппаратный регистр, используемый инструкцией rdhwr) соответствует ЦП или архитектуре, заданной ARCH . По умолчанию имена HWR выбираются в соответствии с архитектурой и ЦП дизассемблируемого двоичного файла. reg-names=< /tt> ABI Печать имен GPR и FPR в соответствии с выбранным ABI . reg-names= ARCH Печать имен регистров, специфичных для ЦП (регистр CP0 и имена HWR), в соответствии с выбранным ЦП или архитектурой .

Для любого из перечисленных выше параметров ABI или ARCH можно указать как числовое, чтобы для выбранных типов регистров печатались числа, а не имена. Вы можете перечислить доступные значения ABI и ARCH, используя параметр --help.

Авторское право (c) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.

objdump [-a|--archive-headers] [-b имя_bfd|--target=имя_bfd] [-C|--demangle[=style] ] [-d|--разобрать] [-D|--разобрать-все] [-z|--разобрать-нули] [-EB|-EL|--endian=] [- f|--file-headers] [-F|--file-offsets] [--file-start-context] [-g|--debugging] [-e|--debugging-tags] [-h|- -section-headers|--headers] [-i|--info] [-j раздел|--section=раздел] [-l|--line- числа] [-S|--источник] [-m машина|--architecture=машина] [-M опции|--дизассемблер -options=options] [-p|--private-headers] [-r|--reloc] [-R|--dynamic-reloc] [-s|--full-contents] [-W[lLiaprmfFsoR]| --dwarf[=rawline,=decodedline,=info,=abbrev,=pubnames,=arranges,=macro,=frames,=frames-interp,=str,=loc,=Ranges]] [-G|--stabs ] [-t|--syms] [-T|--dynamic-syms] [-x|--all-headers] [-w|--wide] [--start-address=адрес] [--stop-address=адрес] [--prefix-addresses] [--[no-]show-raw-insn] [--adjust-vma=смещение ] [--special-syms] [--prefix=префикс] [--prefix-strip=уровень] [--insn-width=< i>ширина] [-V|--версия] [-H|--help] objfile.

Описание

objdump отображает информацию об одном или нескольких объектных файлах. Параметры определяют, какую конкретную информацию отображать. Эта информация в основном полезна для программистов, работающих с инструментами компиляции, в отличие от программистов, которые просто хотят, чтобы их программа компилировалась и работала.

объектный файл. являются объектными файлами, которые необходимо проверить. Когда вы указываете архивы, objdump показывает информацию о каждом из файлов объектов-членов.

Параметры

Длинная и короткая формы параметров, показанные здесь как альтернативы, эквивалентны. Хотя бы один вариант из списка -a,-d,-D,-e,-f,-g,-G,-h,-H,-p,-r,-R,-s,-S,- t,-T,-V,-x должны быть заданы. -a --archive-header Если какой-либо из файлов objfile является архивом, отобразить информацию о заголовке архива (в формате, аналогичном ls -l). Помимо информации, которую вы можете перечислить с помощью ar tv, objdump -a показывает формат объектного файла каждого члена архива. --adjust-vma=offset При выводе информации сначала добавьте offset ко всем адресам секций. Это полезно, если адреса разделов не соответствуют таблице символов, что может произойти при размещении разделов по определенным адресам при использовании формата, который не может представлять адреса разделов, например a.out. -b имя_bfd --target=имя_bfd Указать, что формат объектного кода для объектных файлов — имя_bfd. Эта опция может не понадобиться; objdump может автоматически распознавать множество форматов.

Например, отображает сводную информацию из заголовков разделов (-h) файла fu.o, который явно указан (-m) как объектный файл VAX в формат, созданный компиляторами Oasys. Вы можете перечислить доступные форматы с помощью опции -i. -C --demangle[=стиль] Декодировать (demangle) низкоуровневые имена символов в имена пользовательского уровня. Помимо удаления любого начального символа подчеркивания, предваряемого системой, это делает имена функций C ++ читабельными. У разных компиляторов разные стили обработки. Необязательный аргумент стиля разборки можно использовать для выбора подходящего стиля разборки для вашего компилятора. -g --debugging Показать отладочную информацию. Это попытка проанализировать информацию формата отладки STABS и IEEE, хранящуюся в файле, и распечатать ее, используя синтаксис, подобный C. Если ни один из этих форматов не найден, эта опция использует опцию -W для печати любой информации DWARF в файле. -e --debugging-tags Аналогично -g, но информация генерируется в формате, совместимом с инструментом ctags. -d --disassemble Показать мнемонику ассемблера для машинных инструкций из objfile. Эта опция дизассемблирует только те разделы, которые должны содержать инструкции.-D --disassemble-all Аналогично -d, но дизассемблировать содержимое всех разделов, а не только тех, которые должны содержать инструкции.

Если целью является архитектура ARM, этот переключатель также заставляет дизассемблер декодировать фрагменты данных, найденные в разделах кода, как если бы они были инструкциями. --prefix-addresses При дизассемблировании печатать полный адрес в каждой строке. Это старый формат дизассемблирования. -ЭБ

-EL --endian= Указать порядок байтов объектных файлов. Это касается только разборки. Это может быть полезно при дизассемблировании формата файла, который не описывает информацию о порядке следования байтов, например, S-записи. -f --file-headers Показать сводную информацию из общего заголовка каждого из файлов objfile. -F --file-offsets При дизассемблировании разделов всякий раз, когда отображается символ, также отображать смещение в файле области данных, которые собираются выгрузить. Если нули пропускаются, то при возобновлении дизассемблирования сообщите пользователю, сколько нулей было пропущено и смещение в файле места, откуда возобновится дизассемблирование. При дампе разделов отображать смещение в файле места, откуда начинается дамп. --file-start-context Укажите, что при отображении интерлистированного исходного кода/дизассемблированного кода (предполагается -S) из файла, который еще не отображался, контекст расширяется до начала файла. -h --section-headers --headers Показать сводную информацию из заголовков разделов объектного файла.

Сегменты файлов можно перемещать по нестандартным адресам, например, используя параметры -Ttext, -Tdata или -Tbss для ld. Однако некоторые форматы объектных файлов, такие как a.out, не сохраняют начальный адрес сегментов файла. В таких ситуациях, несмотря на то, что ld правильно перемещает разделы, использование objdump -h для отображения заголовков разделов файла не может отображать правильные адреса. Вместо этого он показывает обычные адреса, неявные для цели. -H --help Напечатать сводку параметров objdump и выхода. -i --info Показать список всех архитектур и форматов объектов, доступных для указания с помощью -b или -m. -j имя --section=имя Показать информацию только для раздела имя. -l --line-numbers Пометить отображение (используя отладочную информацию) именем файла и номерами строк исходного кода, соответствующими отображаемому объектному коду или релокам. Полезно только с -d, -D или -r. -m machine --architecture=machine Указать архитектуру, используемую при дизассемблировании объектных файлов. Это может быть полезно при дизассемблировании объектных файлов, не описывающих информацию об архитектуре, таких как S-записи. Вы можете перечислить доступные архитектуры с параметром -i.

Если целью является архитектура ARM, этот переключатель имеет дополнительный эффект. Он ограничивает дизассемблирование только теми инструкциями, которые поддерживаются архитектурой, заданной machine. Если необходимо использовать этот переключатель, потому что входной файл не содержит никакой информации об архитектуре, но также желательно разобрать все инструкции, используйте -marm. -M options --disassembler-options=options Передать специфичную для цели информацию дизассемблеру. Поддерживается только на некоторых целях. Если необходимо указать более одной опции дизассемблера, можно использовать несколько опций -M или их можно поместить вместе в список, разделенный запятыми.

Если целью является архитектура ARM, то этот переключатель можно использовать для выбора набора имен регистров, который будет использоваться во время дизассемблера. Указание -M reg-names-std (по умолчанию) выберет имена регистров, используемые в документации набора инструкций ARM, но с регистром 13 под названием «sp», регистром 14 под названием «lr» и регистр 15 называется «ПК». Если указать -M reg-names-apcs, будет выбран набор имен, используемый стандартом вызова процедур ARM, тогда как указание -M reg-names-raw будет использовать только r, за которым следует номер регистра.

Существует также два варианта схемы именования регистров APCS, которые включаются параметрами -M reg-names-atpcs и -M reg-names-special-atpcs, которые используют стандарт именования вызовов процедур ARM/Thumb. соглашения. (Либо с обычными именами регистров, либо со специальными именами регистров).

Этот параметр также можно использовать для архитектур ARM, чтобы заставить дизассемблер интерпретировать все инструкции как инструкции Thumb с помощью переключателя --disassembler-options=force-thumb. Это может быть полезно при попытке дизассемблировать код большого пальца, созданный другими компиляторами.

Для x86 некоторые параметры дублируют функции ключа -m, но обеспечивают более точное управление. Несколько вариантов из следующего могут быть указаны в виде строки, разделенной запятыми. x86-64, i386 и i8086 выбирают дизассемблирование для данной архитектуры. intel и att выбирают между режимом синтаксиса Intel и режимом синтаксиса AT&T. intel-mnemonic и att-mnemonic выбирают между мнемоническим режимом Intel и мнемоническим режимом AT&T.intel-mnemonic подразумевает intel, а att-mnemonic подразумевает att. addr64, addr32, addr16, data32 и data16 задают размер адреса по умолчанию и размер операнда. Эти четыре параметра будут переопределены, если x86-64, i386 или i8086 появятся позже в строке параметров. Наконец, суффикс в режиме AT&T указывает дизассемблеру напечатать мнемонический суффикс, даже если суффикс может быть выведен из операндов.

Для PowerPC booke управляет дизассемблированием инструкций BookE. 32 и 64 выбирают дизассемблирование PowerPC и PowerPC64 соответственно. e300 выбирает разборку для семейства e300. 440 выбирает дизассемблирование для PowerPC 440. ppcps выбирает дизассемблирование для парных одиночных инструкций PPC750CL .

Для MIPS этот параметр управляет печатью мнемонических имен инструкций и имен регистров в дизассемблированных инструкциях. Несколько вариантов из следующего могут быть указаны в виде строки, разделенной запятыми, а недопустимые параметры игнорируются: "no-aliases" Печатать мнемонику "сырой" инструкции вместо мнемоники псевдоинструкции. То есть напечатайте 'daddu' или 'or' вместо 'move', 'sll' вместо 'nop' и т. д. "gpr-names=ABI " Print < Имена small>GPR (регистр общего назначения) в соответствии с указанным ABI . По умолчанию имена GPR выбираются в соответствии с ABI разбираемого двоичного файла. "fpr-names=ABI " Вывести имена FPR (регистр с плавающей запятой) в соответствии с указанным ABI . По умолчанию печатаются числа FPR, а не имена. "cp0-names=ARCH " Напечатать CP0 (сопроцессор управления системой; сопроцессор 0) регистрировать имена, соответствующие CPU или архитектура, указанная в ARCH . По умолчанию имена регистров CP0 выбираются в соответствии с архитектурой и CPU дизассемблируемого двоичного файла. "hwr-names=ARCH " Вывести имена HWR (аппаратный регистр, используемый инструкцией "rdhwr") в соответствии с CPU или архитектурой, заданной ARCH . По умолчанию имена HWR выбираются в соответствии с архитектурой и CPU разбираемого двоичного файла. "reg-names=ABI " Напечатать имена GPR и FPR в соответствии с выбранным ABI< /маленький> . "reg-names=ARCH " Печатать имена регистров, характерные для процессора (регистр CP0 и имена HWR) по мере необходимости для выбранного CPU или архитектуры. Для любого из перечисленных выше параметров ABI или ARCH можно указать как числовое, чтобы печатались числа, а не имена для выбранных типов регистров. Вы можете перечислить доступные значения ABI и ARCH, используя параметр --help.

Для VAX вы можете указать адреса входа функции с помощью -M entry:0xf00ba. Вы можете использовать это несколько раз, чтобы правильно дизассемблировать двоичные файлы VAX, которые не содержат таблиц символов (например, дампы ROM). В этих случаях маска входа функции была бы декодирована как инструкции VAX, что, вероятно, привело бы к неправильному дизассемблированию остальной части функции. -p --private-headers Вывести информацию, относящуюся к формату объектного файла. Точная печатаемая информация зависит от формата объектного файла. Для некоторых форматов объектных файлов дополнительная информация не печатается. -r --reloc Напечатать записи о перемещении файла. Если используется с -d или -D, перемещения печатаются вперемешку с дизассемблированием. -R --dynamic-reloc Напечатать записи динамического перемещения файла. Это имеет смысл только для динамических объектов, таких как определенные типы разделяемых библиотек. Что касается -r, то при использовании с -d или -D релокации печатаются вперемешку с дизассемблированием. -s --full-contents Показать полное содержимое всех запрошенных разделов. По умолчанию отображаются все непустые разделы. -S --source Показать исходный код, смешанный с дизассемблированием, если это возможно. Подразумевает -д. --prefix=префикс Укажите префикс для добавления к абсолютным путям при использовании с -S. --prefix-strip=уровень Укажите, сколько начальных имен каталогов нужно убрать из зашитых абсолютных путей. Без --prefix=prefix не действует. --show-raw-insn При дизассемблировании инструкций выводить инструкции как в шестнадцатеричном, так и в символьном виде. Это значение по умолчанию, за исключением случаев, когда используется --prefix-addresses. --no-show-raw-insn При дизассемблировании инструкций не печатать байты инструкции. Это значение по умолчанию при использовании --prefix-addresses. --insn-width=width Отображать width байтов в одной строке при дизассемблировании инструкций.-W[lLiaprmfFsoR] --dwarf[=rawline,=decodedline,=info,=abbrev,=pubnames,=arranges,=macro,=frames,=frames-interp,=str,=loc,=Ranges] Отображает содержимое разделов отладки в файле, если таковые имеются. Если за переключателем следует одна из необязательных букв или слов, будут выгружены только данные, найденные в этих конкретных разделах. -G --stabs Отобразить полное содержимое всех запрошенных разделов. Отображение содержимого разделов .stab и .stab.index и .stab.excl из файла ELF. Это полезно только в системах (таких как Solaris 2.0), в которых ".stab" отладочные записи таблицы символов переносятся в секцию ELF. В большинстве других форматов файлов записи отладочной таблицы символов чередуются с символами связи и видны в выводе --syms. --start-address=адрес Начать отображение данных по указанному адресу. Это влияет на вывод опций -d, -r и -s. --stop-address=адрес Остановить отображение данных по указанному адресу. Это влияет на вывод опций -d, -r и -s. -t --syms Вывести записи таблицы символов файла. Это похоже на информацию, предоставляемую программой nm, хотя формат отображения отличается. Формат вывода зависит от формата выводимого файла, но есть два основных типа. Один из них выглядит так: где число в квадратных скобках — номер записи в таблице символов, номер sec — номер раздела, значение fl — номер биты флага символа, число ty — тип символа, число scl — класс хранения символа, а значение nx — количество вспомогательных записи, связанные с символом. Последние два поля — это значение символа и его имя.

Другой распространенный формат вывода, который обычно используется в файлах на основе ELF, выглядит следующим образом: Здесь первое число — это значение символа (иногда называемое его адресом). Следующее поле на самом деле представляет собой набор символов и пробелов, указывающих биты флага, установленные в символе. Эти символы описаны ниже. Далее следует раздел, с которым связан символ, или *ABS*, если раздел является абсолютным (т. е. не связан ни с каким разделом), или *UND*, если раздел упоминается в выгружаемом файле, но не определяется там.

После названия раздела следует еще одно поле, число, которое для обычных символов является выравниванием, а для остальных символов — размером. Наконец отображается имя символа.

Символы флага разделены на 7 групп следующим образом: "l"

Символ является локальным (l), глобальным (g), уникальным глобальным (u), ни глобальным, ни локальным (пробел), или одновременно глобальным и локальным (!). Символ не может быть ни локальным, ни глобальным по целому ряду причин, например, потому что он используется для отладки, но, вероятно, это указывает на ошибку, если он когда-либо был и локальным, и глобальным. Уникальные глобальные символы — это GNU расширение стандартного набора привязок символов ELF. Для такого символа динамический компоновщик позаботится о том, чтобы во всем процессе использовался только один символ с таким именем и типом.

Символ слабый (w) или сильный (пробел).

Символ обозначает конструктор (C) или обычный символ (пробел).

Этот символ является предупреждением (W) или обычным символом (пробел). Имя предупреждающего символа – это сообщение, которое будет отображаться при упоминании символа, следующего за предупреждающим.

Символ является косвенной ссылкой на другой символ (I), функцию, которую нужно вычислить во время обработки перемещения (i), или обычный символ (пробел).

Это символ отладки (d), динамический символ (D) или обычный символ (пробел).

Символ — это имя функции (F), файла (f), объекта (O) или просто обычный символ (пробел).

-T --dynamic-syms Распечатать записи таблицы динамических символов файла. Это имеет смысл только для динамических объектов, таких как определенные типы разделяемых библиотек. Это похоже на информацию, предоставляемую программой nm при использовании опции -D (--dynamic). --special-syms При отображении символы включают те, которые цель считает в некотором роде особенными и которые обычно не представляют интереса для пользователя. -V --version Вывести номер версии objdump и выйти. -x --all-headers Показать всю доступную информацию заголовков, включая таблицу символов и записи перемещения. Использование -x эквивалентно указанию всех -a -f -h -p -r -t. -w --wide Отформатировать некоторые строки для устройств вывода, содержащих более 80 столбцов. Также не обрезайте имена символов при их отображении. -z --disassemble-zeroes Обычно выходные данные дизассемблирования пропускают блоки нулей. Эта опция указывает дизассемблеру дизассемблировать эти блоки, как и любые другие данные. @file Чтение параметров командной строки из file. Прочитанные параметры вставляются вместо исходного параметра @file.Если файл не существует или не может быть прочитан, параметр будет рассматриваться буквально и не будет удален.

Параметры в файле разделены пробелом. Пробельный символ может быть включен в параметр, заключая весь параметр в одинарные или двойные кавычки. Любой символ (включая обратную косую черту) может быть включен путем добавления к включаемому символу обратной косой черты. Сам файл может содержать дополнительные опции @file; любые такие параметры будут обрабатываться рекурсивно.

См. также

nm(1), readelf(1) и записи Info для binutils.

Авторское право

Авторское право © 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc.

р>

Разрешается копировать, распространять и/или изменять этот документ в соответствии с условиями лицензии на бесплатную документацию GNU версии 1.3 или любой более поздней версии, опубликованной Free Software Foundation; без неизменяемых разделов, без текстов на передней и задней обложках. Копия лицензии включена в раздел, озаглавленный «Лицензия свободной документации GNU».

Читайте также: