Lazygeek Lazygeek
Title

Introduction

Les fichiers compilés existent sous plusieurs formes:

  • .o : fichier objet. Contient le code compilé d’un fichier source
  • .a : librairie statique. Assemblage de plusieurs .o. Doit lui-même être assemblé pour créer un exécutable
  • .so : librairie dynamique. Contient du code exécutable qui sera chargé dynamiquement par un exécutable
  • .exe : Fichier executable. Contient tout ou partie du code exécutable d’un programme
  • .elf : Executable and Linking Format. globalement tous les fichiers cité ci-dessus.

Il existe une multitude d’outils pour analyser le contenu de ces fichiers.

ldd

Permet de lister les dépendances d’un fichier et d’indiquer lesquelles sont utilisées

ldd <binaire>

nm

Liste tous les symbôles présents dans un exécutable. Les symbôles correspondent aux fonctions, classes, variables qu’on peut écrire dans un code source.

nm <binaire>

> output:
         U external_function
00000000 T internal_function1
00000000 T internal_function2

On obtient tous les symboles contenus dans le fichier

  • 1ère colonne: adresse du symbole
  • 2e colonne: le type
  • 3e colonne: le nom du symbole
Type Description
B BSS - variable globale non initialisée
b BSS - variable locale non initialisée
D Data - variable globale initialisée
d Data - variable locale initialisée
R Read only data - constante globale
r Read only data - constante locale
T Text - dans la section text, ce qui signifie que le symbole est définit et correspond à du code
t text - mais privé
U Undefined - le symbôle est utilisé mais non défini. Il devra être fourni par un autre exécutable au moment du link.
W Weak - si un autre symbôle de même nom est trouvé ailleurs, alors cet autre symbôle sera utilisé de préférence

Options utiles

Option Description
-A affiche toujours le nom du fichier devant l’adresse (pratique lorsqu’on liste les symboles d’une lib qui regroupe plusieurs objets)
-C demangle des symboles
-D Affiche uniquement les symbôles dynamiques
-v trier par nom
-S trier par taille d’objet
-n trier par adresse
-r inverse l’ordre
-u uniquement les symboles non définis
-g uniquement les symboles externes

file

Permet d’avoir des informations rapides sur le type d’un fichier.

Permet de savoir si le fichier est du code source, une lib so, une archive .a, un exécutable, etc. Si le fichier est destiné aux architectures x86, arm, s’il est 32 ou 64 bits.

ne s’applique pas uniquement aux binaires mais à tous les types de fichiers.

readelf

Permet de lire les différentes sections d’un fichier elf et d’obtenir des infos sur le binaire.

readelf -h binaire

Lit le header pour avoir des infos générales

Dynamic

readelf -d binaire

Permet d’avoir des infos sur les liens dynamiques du binaire

  • NEEDED: les libs requises par le binaire
  • RUNPATH: le dossier dans lequel le binaire va cherher les libs
  • SONAME: le nom de la lib dans le cas d’un .so

objdump

Permet de dumper tout le contenu d’un fichier binaire.

Dans une utilisation basique, son utilité est très proche de readelf.

  • objdump -p binaire: permet d’avoir des infos sur les libs requises