Ein lokales Vergleichstool für Dekompilierungsprojekte. Inspiriert von decomp.me und asm-differ.
Merkmale:
Unterstützt:
Weitere Informationen finden Sie unter Verwendung.
Informationen zum Erstellen aus dem Quellcode finden Sie unter Erstellen.
Führen Sie unter Linux und macOS chmod +x objdiff-*
aus, um die Binärdatei ausführbar zu machen.
CLI-Binärdateien finden Sie auf der Release-Seite.
objdiff funktioniert durch den Vergleich zweier verschiebbarer Objektdateien ( .o
). Es wird erwartet, dass die Objekte denselben relativen Pfad von den Verzeichnissen „Ziel“ und „Basis“ haben.
Wenn sich beispielsweise das Zielobjekt („erwartet“) unter build/asm/MetroTRK/mslsupp.o
und das Basisobjekt („tatsächlich“) unter build/src/MetroTRK/mslsupp.o
befindet, würde die folgende Konfiguration erfolgen verwendet werden:
build/asm
build/src
MetroTRK/mslsupp.o
objdiff führt dann das Build-System aus dem Projektverzeichnis aus, um beide Objekte zu erstellen:
$ make build/asm/MetroTRK/mslsupp.o # Only if "Build target object" is enabled
$ make build/src/MetroTRK/mslsupp.o
Anschließend werden die Objekte verglichen und die Ergebnisse in der Benutzeroberfläche angezeigt.
Weitere Informationen finden Sie unter Konfiguration.
Obwohl dies nicht erforderlich ist (die meisten Einstellungen können in der Benutzeroberfläche angegeben werden), können Projekte eine objdiff.json
Datei hinzufügen, um das Tool automatisch zu konfigurieren. Die Konfigurationsdatei muss sich im Stammverzeichnis des Projekts befinden.
Wenn Ihr Projekt über ein Generatorskript verfügt (z. B. configure.py
), wird empfohlen, auch die objdiff-Konfigurationsdatei zu generieren. Anschließend können Sie objdiff.json
zu Ihrem .gitignore
hinzufügen, um zu verhindern, dass es festgeschrieben wird.
{
"$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" : {}
}
]
}
Sehen Sie sich config.schema.json für alle verfügbaren Optionen an. Die folgende Liste ist eine Zusammenfassung der wichtigsten Optionen.
custom_make
(optional) : Standardmäßig verwendet objdiff make
, um das Projekt zu erstellen.
Wenn das Projekt ein anderes Build-System verwendet (z. B. ninja
), geben Sie es hier an.
Der Build-Befehl lautet [custom_make] [custom_args] path/to/object.o
.
custom_args
(optional) : Zusätzliche Argumente, die vor dem Objektpfad an den Build-Befehl übergeben werden.
build_target
: Wenn true, weist objdiff das Build-System an, die Zielobjekte vor dem Diffing zu erstellen (z. B. make path/to/target.o
).
Dies ist nützlich, wenn die Zielobjekte nicht standardmäßig erstellt werden oder sich aufgrund der Projektkonfiguration oder Änderungen an Baugruppendateien ändern können.
Erfordert, dass das Build-System ordnungsgemäß konfiguriert ist.
build_base
: Wenn true, weist objdiff das Build-System an, die Basisobjekte vor dem Diffing zu erstellen (z. B. make path/to/base.o
).
Es ist unwahrscheinlich, dass Sie dies deaktivieren möchten, es sei denn, Sie verwenden ein externes Tool, um das Basisobjekt anhand von Quelldateiänderungen neu zu erstellen.
watch_patterns
(optional) : Eine Liste von Glob-Mustern, die auf Änderungen überwacht werden sollen. (Unterstützte Syntax)
Wenn sich eine dieser Dateien ändert, erstellt objdiff die Objekte automatisch neu und vergleicht sie erneut.
Wenn nicht angegeben, verwendet objdiff die oben aufgeführten Standardmuster.
units
(optional) : Wenn angegeben, zeigt objdiff eine Liste von Objekten in der Seitenleiste an, um die Navigation zu erleichtern.
name
(optional) : Der Name des Objekts in der Benutzeroberfläche. Wenn nicht angegeben, wird derpath
des Objekts verwendet.
target_path
: Pfad zum „Ziel“- oder „erwarteten“ Objekt vom Projektstamm.
Dieses Objekt ist das beabsichtigte Ergebnis des Spiels.
base_path
: Pfad zum „Basis“- oder „tatsächlichen“ Objekt vom Projektstamm aus.
Dieses Objekt wird aus dem aktuellen Quellcode erstellt.
metadata.auto_generated
(optional) : Blendet das Objekt aus der Objektliste aus, schließt es jedoch weiterhin in Berichte ein.
metadata.complete
(optional) : Markiert das Objekt in der Objektliste als „vollständig“ (oder „verlinkt“).
Dies ist nützlich, um Objekte zu markieren, die vollständig dekompiliert sind. Der Wertfalse
markiert das Objekt als „unvollständig“.
Installieren Sie Rust über Rustup.
$ git clone https://github.com/encounter/objdiff.git
$ cd objdiff
$ cargo run --release
Oder verwenden Sie cargo install
.
$ cargo install --locked --git https://github.com/encounter/objdiff.git objdiff-gui objdiff-cli
Die Binärdateien werden als objdiff
und objdiff-cli
in ~/.cargo/bin
installiert.
Lizenziert unter einem von beiden
nach Ihrer Wahl.
Sofern Sie nicht ausdrücklich etwas anderes angeben, unterliegt jeder Beitrag, der von Ihnen absichtlich zur Aufnahme in das Werk eingereicht wird, wie in der Apache-2.0-Lizenz definiert, einer Doppellizenz wie oben, ohne zusätzliche Bedingungen oder Konditionen.