Команда Linux objdump

Linux 命令大全Энциклопедия команд Linux


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

Основные функции objdump включают:

  • Дизассемблирование бинарных файлов
  • Просмотр информации о заголовке файла
  • Отображение содержимого секций
  • Просмотр таблицы символов
  • Отображение информации о перемещениях
  • Анализ структуры файла

Базовый синтаксис

Базовый формат команды objdump выглядит следующим образом:

objdump [选项] 文件名

Если параметры не указаны, objdump отображает информацию о заголовках секций файла.


Подробное объяснение общих опций

Параметры, связанные с дизассемблированием

Пример

-d, --disassemble        # Дизассемблировать секции, содержащие код
-D, --disassemble-all    # Дизассемблировать все секции
-S, --source             # Смешанное отображение исходного кода и ассемблерного кода (требуется параметр -g при компиляции)
--prefix-addresses       # Отображать полные адреса при дизассемблировании
--no-addresses           # Не отображать информацию об адресах

Параметры информации о секциях

Пример

-h, --section-headers    # Показывать информацию о заголовках секций
-j, --section=name# Показывать только содержимое указанной секции

Параметры таблицы символов

Пример

-t, --syms               # Показывать таблицу символов
-T, --dynamic-syms       # Показывать динамическую таблицу символов

Информация о заголовке файла

-f, --file-headers       # 显示文件头部信息

Другие полезные параметры

Пример

-l, --line-numbers       # Показывать информацию о номерах строк (требуется отладочная информация)
-r, --reloc              # Показывать записи перемещений
-R, --dynamic-reloc      # Показывать записи динамических перемещений
-s, --full-contents      # Отобразить полное содержимое всех секций

Практические примеры

Пример 1: Просмотр структуры исполняемого файла

objdump -h /bin/ls

Пример вывода:

/bin/ls:     file format elf64-x86-64

Sections:
Idx Name          Size      VMA               LMA               File off  Algn
  0 .interp       0000001c  0000000000400238  0000000000400238  00000238  2**0
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  1 .note.ABI-tag 00000020  0000000000400254  0000000000400254  00000254  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  ...

Пример 2: Дизассемблирование исполняемого файла

objdump -d /bin/ls

Пример вывода (частично):

0000000000405a50 :
  405a50:       31 ed                   xor    %ebp,%ebp
  405a52:       49 89 d1                mov    %rdx,%r9
  405a55:       5e                      pop    %rsi
  405a56:       48 89 e2                mov    %rsp,%rdx
  405a59:       48 83 e4 f0             and    $0xfffffffffffffff0,%rsp
  ...

Пример 3: Просмотр таблицы символов

objdump -t myprogram.o

Пример вывода:

myprogram.o:     file format elf64-x86-64

SYMBOL TABLE:
0000000000000000 l    df *ABS*  0000000000000000 myprogram.c
0000000000000000 l    d  .text  0000000000000000 .text
0000000000000000 g     F .text  0000000000000015 main
0000000000000000         *UND*  0000000000000000 printf

Пример 4: Смешанное отображение исходного кода и ассемблерного кода

objdump -S myprogram

Пример вывода:

Пример

int main() {
  400526:       55                      push   %rbp
  400527:       48 89 e5                mov    %rsp,%rbp
    printf("Hello, World!n");
  40052a:       bf d4 05 40 00          mov    $0x4005d4,%edi
  40052f:       e8 cc fe ff ff          callq  400400
    return 0;
  400534:       b8 00 00 00 00          mov    $0x0,%eax
}

Практические сценарии применения

Сценарий 1: Отладка сбоев программы

Когда программа аварийно завершается, можно использовать objdump для просмотра кода рядом с адресом сбоя:

objdump -d --start-address=0x400526 --stop-address=0x400536 myprogram

Сценарий 2: Анализ вызовов библиотечных функций

Просмотр того, какие функции динамических библиотек вызывает программа:

objdump -T myprogram | grep UND

Сценарий 3: Изучение языка ассемблера

Изучайте язык ассемблера, дизассемблируя простые программы на C:

Пример

gcc -o simple simple.c
objdump -d simple

Примечания

  1. Отладочная информация: Чтобы получить информацию на уровне исходного кода, необходимо добавить-goption
  2. Влияние оптимизации: Оптимизация компилятора влияет на генерируемый код ассемблера; будьте внимательны при анализе
  3. Различия архитектур: Разные архитектуры процессоров имеют разные инструкции ассемблера; убедитесь, что используете правильные параметры дизассемблирования
  4. Проблемы с правами доступа: Для анализа системных файлов могут потребоваться права root
  5. Формат файла: objdump в основном предназначен для файлов формата ELF; другие форматы могут требовать специальной обработки

Дополнительные советы

Использование с другими инструментами

Пример

# Используйте grep для фильтрации конкретных функций
objdump -d myprogram | grep -A20 "main>:"

# Вычислить размеры функций
objdump -d myprogram | awk '/^[0-9a-f]+ :/ {print $1,$2}'

Создание скрипта дизассемблирования

Пример

#!/bin/bash
# Пример скрипта дизассемблирования
if [ $# -ne 1 ]; then
    echo "Использование: $0 "
    exit 1
fi

echo "=== Информация о заголовке файла ==="
objdump -f $1

echo -e "n=== Информация о секции ==="
objdump -h $1

echo -e "n=== Дизассемблированный код ==="
objdump -d $1

Итог

objdump — мощный инструмент анализа бинарных файлов в Linux-системах. Его освоение позволяет:

  • Глубоко понимать механизмы выполнения программ
  • Быстро находить проблемы в программах
  • Изучать язык ассемблера и системные знания
  • Проводить базовый анализ методом обратной разработки

С базовым использованием и практическими примерами, рассмотренными в этой статье, вы уже сможете начать использовать objdump для базового анализа бинарных файлов. По мере накопления практического опыта вы откроете для себя больше его неочевидных возможностей в системном программировании и отладке.


Linux 命令大全Энциклопедия команд Linux

Другие расширения