Un outil de comparaison locale pour les projets de décompilation. Inspiré de decomp.me et asm-differ.
Caractéristiques:
Prise en charge :
Voir Utilisation pour plus d'informations.
Pour construire à partir des sources, voir Construction.
Pour Linux et macOS, exécutez chmod +x objdiff-*
pour rendre le binaire exécutable.
Les binaires CLI peuvent être trouvés sur la page des versions.
objdiff fonctionne en comparant deux fichiers objets déplaçables ( .o
). Les objets doivent avoir le même chemin relatif depuis les répertoires « cible » et « base ».
Par exemple, si l'objet cible (« attendu ») se trouve dans build/asm/MetroTRK/mslsupp.o
et que l'objet de base (« réel ») se trouve dans build/src/MetroTRK/mslsupp.o
, la configuration suivante serait être utilisé :
build/asm
build/src
MetroTRK/mslsupp.o
objdiff exécutera ensuite le système de build à partir du répertoire du projet pour construire les deux objets :
$ make build/asm/MetroTRK/mslsupp.o # Only if "Build target object" is enabled
$ make build/src/MetroTRK/mslsupp.o
Les objets seront ensuite comparés et les résultats seront affichés dans l'interface utilisateur.
Voir Configuration pour plus d'informations.
Bien que cela ne soit pas obligatoire (la plupart des paramètres peuvent être spécifiés dans l'interface utilisateur), les projets peuvent ajouter un fichier objdiff.json
pour configurer automatiquement l'outil. Le fichier de configuration doit se trouver dans le répertoire racine du projet.
Si votre projet dispose d'un script générateur (par exemple configure.py
), il est recommandé de générer également le fichier de configuration objdiff. Vous pouvez ensuite ajouter objdiff.json
à votre .gitignore
pour empêcher sa validation.
{
"$schema" : " https://raw.githubusercontent.com/encounter/objdiff/main/config.schema.json " ,
"custom_make" : " ninja " ,
"custom_args" : [
" -d " ,
" keeprsp "
],
"build_target" : false ,
"build_base" : true ,
"watch_patterns" : [
" *.c " ,
" *.cp " ,
" *.cpp " ,
" *.cxx " ,
" *.h " ,
" *.hp " ,
" *.hpp " ,
" *.hxx " ,
" *.s " ,
" *.S " ,
" *.asm " ,
" *.inc " ,
" *.py " ,
" *.yml " ,
" *.txt " ,
" *.json "
],
"units" : [
{
"name" : " main/MetroTRK/mslsupp " ,
"target_path" : " build/asm/MetroTRK/mslsupp.o " ,
"base_path" : " build/src/MetroTRK/mslsupp.o " ,
"metadata" : {}
}
]
}
Consultez config.schema.json pour toutes les options disponibles. La liste ci-dessous est un résumé des options les plus importantes.
custom_make
(facultatif) : Par défaut, objdiff utilisera make
pour construire le projet.
Si le projet utilise un système de build différent (par exemple ninja
), spécifiez-le ici.
La commande de construction sera [custom_make] [custom_args] path/to/object.o
.
custom_args
(facultatif) : arguments supplémentaires à transmettre à la commande build avant le chemin de l'objet.
build_target
: Si vrai, objdiff dira au système de construction de construire les objets cibles avant de comparer (par exemple make path/to/target.o
).
Ceci est utile si les objets cibles ne sont pas créés par défaut ou peuvent changer en fonction de la configuration du projet ou des modifications apportées aux fichiers d'assemblage.
Nécessite que le système de build soit configuré correctement.
build_base
: Si vrai, objdiff dira au système de construction de construire les objets de base avant de comparer (par exemple make path/to/base.o
).
Il est peu probable que vous souhaitiez désactiver cette fonctionnalité, sauf si vous utilisez un outil externe pour reconstruire l'objet de base lors des modifications du fichier source.
watch_patterns
(facultatif) : une liste de modèles globaux à surveiller pour les changements. (Syntaxe prise en charge)
Si l'un de ces fichiers change, objdiff reconstruira automatiquement les objets et les comparera à nouveau.
S'il n'est pas spécifié, objdiff utilisera les modèles par défaut répertoriés ci-dessus.
units
(facultatif) : Si spécifié, objdiff affichera une liste d'objets dans la barre latérale pour une navigation facile.
name
(facultatif) : Le nom de l'objet dans l'interface utilisateur. S'il n'est pas spécifié, lepath
de l'objet sera utilisé.
target_path
: Chemin d'accès à l'objet "cible" ou "attendu" depuis la racine du projet.
Cet objet est le résultat attendu du match.
base_path
: Chemin d'accès à l'objet "base" ou "réel" à partir de la racine du projet.
Cet objet est construit à partir du code source actuel .
metadata.auto_generated
(facultatif) : masque l'objet de la liste d'objets, mais l'inclut toujours dans les rapports.
metadata.complete
(facultatif) : marque l'objet comme "complet" (ou "lié") dans la liste d'objets.
Ceci est utile pour marquer les objets entièrement décompilés. Une valeurfalse
marquera l’objet comme « incomplet ».
Installez Rust via rustup.
$ git clone https://github.com/encounter/objdiff.git
$ cd objdiff
$ cargo run --release
Ou en utilisant cargo install
.
$ cargo install --locked --git https://github.com/encounter/objdiff.git objdiff-gui objdiff-cli
Les binaires seront installés sur ~/.cargo/bin
en tant que objdiff
et objdiff-cli
.
Autorisé sous l'un ou l'autre des
à votre choix.
Sauf indication contraire explicite de votre part, toute contribution intentionnellement soumise pour inclusion dans le travail par vous, telle que définie dans la licence Apache-2.0, bénéficiera d'une double licence comme ci-dessus, sans termes ou conditions supplémentaires.