Commande Linux objdump

Linux 命令大全Encyclopédie des commandes Linux


objdump est un outil en ligne de commande important de la suite GNU Binutils, utilisé pour afficher diverses informations sur les fichiers objets et les fichiers exécutables. C'est un outil puissant pour l'analyse binaire, la rétro-ingénierie et le débogage sur les systèmes Linux.

Les principales fonctions d'objdump incluent :

  • Désassembler les fichiers binaires
  • Afficher les informations d'en-tête du fichier
  • Afficher le contenu des sections
  • Afficher la table des symboles
  • Afficher les informations de relocation
  • Analyser la structure du fichier

Syntaxe de base

Le format de commande de base d'objdump est le suivant :

objdump [选项] 文件名

Si aucune option n'est spécifiée, objdump affiche les informations d'en-tête de section du fichier.


Explication détaillée des options courantes

Options liées au désassemblage

Exemple

-d, --disassemble        # Désassembler les sections contenant du code
-D, --disassemble-all    # Désassembler toutes les sections
-S, --source             # Affichage mixte du code source et du code assembleur (nécessite l'option -g lors de la compilation)
--prefix-addresses       # Afficher les adresses complètes pendant le désassemblage
--no-addresses           # Ne pas afficher les informations d'adresse

Options d'informations de section

Exemple

-h, --section-headers    # Afficher les informations d'en-tête de section
-j, --section=name# Afficher uniquement le contenu de la section spécifiée

Options de la table des symboles

Exemple

-t, --syms               # Afficher la table des symboles
-T, --dynamic-syms       # Afficher la table des symboles dynamiques

Informations d'en-tête de fichier

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

Autres options utiles

Exemple

-l, --line-numbers       # Afficher les informations de numéro de ligne (nécessite des informations de débogage)
-r, --reloc              # Afficher les entrées de relocalisation
-R, --dynamic-reloc      # Afficher les entrées de relocalisation dynamiques
-s, --full-contents      # Afficher le contenu complet de toutes les sections

Exemples pratiques

Exemple 1 : Affichage de la structure d’un fichier exécutable

objdump -h /bin/ls

Exemple de sortie :

/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
  ...

Exemple 2 : Désassemblage d’un fichier exécutable

objdump -d /bin/ls

Exemple de sortie (partielle) :

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
  ...

Exemple 3 : Affichage de la table des symboles

objdump -t myprogram.o

Exemple de sortie :

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

Exemple 4 : Affichage mixte du code source et du code assembleur

objdump -S myprogram

Exemple de sortie :

Exemple

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
}

Scénarios d'application pratiques

Scénario 1 : Débogage des plantages de programme

Lorsqu'un programme plante, vous pouvez utiliser objdump pour afficher le code près de l'adresse du plantage :

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

Scénario 2 : Analyse des appels de fonctions de bibliothèque

Voir quelles fonctions de bibliothèque dynamique le programme appelle :

objdump -T myprogram | grep UND

Scénario 3 : Apprentissage du langage assembleur

Apprenez le langage assembleur en désassemblant de simples programmes C :

Exemple

gcc -o simple simple.c
objdump -d simple

Notes

  1. Informations de débogage: Pour obtenir des informations au niveau du code source, vous devez ajouter-goption
  2. Impact de l'optimisation: L'optimisation du compilateur affecte le code assembleur généré ; soyez prudent lors de l'analyse
  3. Différences d'architecture: Différentes architectures de CPU ont des instructions assembleur différentes ; assurez-vous d'utiliser les bonnes options de désassemblage
  4. Problèmes de permissions: L'analyse de fichiers système peut nécessiter des privilèges root
  5. Format de fichier: objdump est principalement destiné aux fichiers au format ELF ; les autres formats peuvent nécessiter un traitement spécial

Astuces avancées

Utilisation avec d'autres outils

Exemple

# Utiliser grep pour filtrer des fonctions spécifiques
objdump -d myprogram | grep -A20 "main>:"

# Calculer la taille des fonctions
objdump -d myprogram | awk '/^[0-9a-f]+ :/ {print $1,$2}'

Création d'un script de désassemblage

Exemple

#!/bin/bash
# Exemple de script de désassemblage
if [ $# -ne 1 ]; then
    echo "Utilisation : $0 "
    exit 1
fi

echo "=== Informations d'en-tête de fichier ==="
objdump -f $1

echo -e "n=== Informations de section ==="
objdump -h $1

echo -e "n=== Code de désassemblage ==="
objdump -d $1

Résumé

objdump est un puissant outil d'analyse binaire sur les systèmes Linux. Le maîtriser vous permet de :

  • Comprendre en profondeur les mécanismes d'exécution des programmes
  • Localiser rapidement les problèmes d'un programme
  • Apprendre le langage assembleur et les connaissances système
  • Effectuer une analyse de base de rétro-ingénierie

Avec l'utilisation de base et les exemples pratiques présentés dans cet article, vous devriez déjà pouvoir commencer à utiliser objdump pour l'analyse de base de fichiers binaires. Au fur et à mesure que vous accumulerez de l'expérience pratique, vous découvrirez davantage d'utilisations astucieuses en programmation système et en débogage.


Linux 命令大全Encyclopédie des commandes Linux

Autres extensions