Una herramienta de diferenciación local para proyectos de descompilación. Inspirado en decomp.me y asm-differ.
Características:
Soporta:
Consulte Uso para obtener más información.
Para compilar desde el código fuente, consulte Construir.
Para Linux y macOS, ejecute chmod +x objdiff-*
para que el binario sea ejecutable.
Los archivos binarios de CLI se pueden encontrar en la página de versiones.
objdiff funciona comparando dos archivos de objetos reubicables ( .o
). Se espera que los objetos tengan la misma ruta relativa desde los directorios "destino" y "base".
Por ejemplo, si el objeto de destino ("esperado") está ubicado en build/asm/MetroTRK/mslsupp.o
y el objeto base ("real") está ubicado en build/src/MetroTRK/mslsupp.o
, la siguiente configuración utilizarse:
build/asm
build/src
MetroTRK/mslsupp.o
objdiff luego ejecutará el sistema de compilación desde el directorio del proyecto para compilar ambos objetos:
$ make build/asm/MetroTRK/mslsupp.o # Only if "Build target object" is enabled
$ make build/src/MetroTRK/mslsupp.o
Luego se compararán los objetos y los resultados se mostrarán en la interfaz de usuario.
Consulte Configuración para obtener más información.
Si bien no es necesario (la mayoría de las configuraciones se pueden especificar en la interfaz de usuario), los proyectos pueden agregar un archivo objdiff.json
para configurar la herramienta automáticamente. El archivo de configuración debe estar ubicado en el directorio raíz del proyecto.
Si su proyecto tiene un script generador (por ejemplo, configure.py
), se recomienda generar también el archivo de configuración objdiff. Luego puede agregar objdiff.json
a su .gitignore
para evitar que se confirme.
{
"$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" : {}
}
]
}
Vea config.schema.json para conocer todas las opciones disponibles. La siguiente lista es un resumen de las opciones más importantes.
custom_make
(opcional) : de forma predeterminada, objdiff usará make
para construir el proyecto.
Si el proyecto utiliza un sistema de compilación diferente (por ejemplo, ninja
), especifíquelo aquí.
El comando de compilación será [custom_make] [custom_args] path/to/object.o
.
custom_args
(opcional) : argumentos adicionales para pasar al comando de compilación antes de la ruta del objeto.
build_target
: si es verdadero, objdiff le indicará al sistema de compilación que cree los objetos de destino antes de realizar la diferenciación (por ejemplo, make path/to/target.o
).
Esto es útil si los objetos de destino no están creados de forma predeterminada o pueden cambiar según la configuración del proyecto o las ediciones de los archivos de ensamblaje.
Requiere que el sistema de compilación esté configurado correctamente.
build_base
: si es verdadero, objdiff le indicará al sistema de compilación que cree los objetos base antes de realizar la diferenciación (por ejemplo, make path/to/base.o
).
Es poco probable que desee desactivar esto, a menos que esté utilizando una herramienta externa para reconstruir el objeto base en los cambios del archivo fuente.
watch_patterns
(opcional) : una lista de patrones globales para observar los cambios. (Sintaxis admitida)
Si alguno de estos archivos cambia, objdiff reconstruirá automáticamente los objetos y los volverá a comparar.
Si no se especifica, objdiff utilizará los patrones predeterminados enumerados anteriormente.
units
(opcional) : si se especifica, objdiff mostrará una lista de objetos en la barra lateral para facilitar la navegación.
name
(opcional) : el nombre del objeto en la interfaz de usuario. Si no se especifica, se utilizará lapath
del objeto.
target_path
: Ruta al objeto "destino" o "esperado" desde la raíz del proyecto.
Este objeto es el resultado previsto del partido.
base_path
: ruta al objeto "base" o "real" desde la raíz del proyecto.
Este objeto se construye a partir del código fuente actual .
metadata.auto_generated
(opcional) : oculta el objeto de la lista de objetos, pero aún lo incluye en los informes.
metadata.complete
(opcional) : marca el objeto como "completo" (o "vinculado") en la lista de objetos.
Esto es útil para marcar objetos que están completamente descompilados. Un valor defalse
marcará el objeto como "incompleto".
Instale Rust mediante Rustup.
$ git clone https://github.com/encounter/objdiff.git
$ cd objdiff
$ cargo run --release
O usando cargo install
.
$ cargo install --locked --git https://github.com/encounter/objdiff.git objdiff-gui objdiff-cli
Los binarios se instalarán en ~/.cargo/bin
como objdiff
y objdiff-cli
.
Con licencia bajo cualquiera de
a tu elección.
A menos que indique explícitamente lo contrario, cualquier contribución enviada intencionalmente para su inclusión en el trabajo, tal como se define en la licencia Apache-2.0, tendrá una licencia doble como se indicó anteriormente, sin términos ni condiciones adicionales.