Uma ferramenta de comparação local para projetos de descompilação. Inspirado em decomp.me e asm-differ.
Características:
Suporta:
Consulte Uso para obter mais informações.
Para construir a partir da fonte, consulte Construindo.
Para Linux e macOS, execute chmod +x objdiff-*
para tornar o binário executável.
Os binários CLI podem ser encontrados na página de lançamentos.
objdiff funciona comparando dois arquivos de objetos relocáveis ( .o
). Espera-se que os objetos tenham o mesmo caminho relativo dos diretórios "target" e "base".
Por exemplo, se o objeto de destino ("esperado") estiver localizado em build/asm/MetroTRK/mslsupp.o
e o objeto base ("real") estiver localizado em build/src/MetroTRK/mslsupp.o
, a configuração a seguir seria ser usado:
build/asm
build/src
MetroTRK/mslsupp.o
objdiff irá então executar o sistema de compilação a partir do diretório do projeto para construir ambos os objetos:
$ make build/asm/MetroTRK/mslsupp.o # Only if "Build target object" is enabled
$ make build/src/MetroTRK/mslsupp.o
Os objetos serão então comparados e os resultados serão exibidos na IU.
Consulte Configuração para obter mais informações.
Embora não seja obrigatório (a maioria das configurações pode ser especificada na UI), os projetos podem adicionar um arquivo objdiff.json
para configurar a ferramenta automaticamente. O arquivo de configuração deve estar localizado no diretório raiz do projeto.
Se o seu projeto possui um script gerador (por exemplo, configure.py
), é recomendado gerar também o arquivo de configuração objdiff. Você pode então adicionar objdiff.json
ao seu .gitignore
para evitar que ele seja confirmado.
{
"$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" : {}
}
]
}
Veja config.schema.json para todas as opções disponíveis. A lista abaixo é um resumo das opções mais importantes.
custom_make
(opcional) : Por padrão, objdiff usará make
para construir o projeto.
Se o projeto usar um sistema de construção diferente (por exemplo, ninja
), especifique-o aqui.
O comando de construção será [custom_make] [custom_args] path/to/object.o
.
custom_args
(opcional) : argumentos adicionais a serem passados para o comando de construção antes do caminho do objeto.
build_target
: Se verdadeiro, objdiff dirá ao sistema de compilação para construir os objetos de destino antes da comparação (por exemplo, make path/to/target.o
).
Isso é útil se os objetos de destino não forem criados por padrão ou puderem ser alterados com base na configuração do projeto ou nas edições dos arquivos de montagem.
Requer que o sistema de compilação seja configurado corretamente.
build_base
: Se verdadeiro, objdiff dirá ao sistema de compilação para construir os objetos base antes da comparação (por exemplo, make path/to/base.o
).
É improvável que você queira desabilitar isso, a menos que esteja usando uma ferramenta externa para reconstruir o objeto base nas alterações do arquivo de origem.
watch_patterns
(opcional) : uma lista de padrões glob para observar alterações. (Sintaxe suportada)
Se algum desses arquivos for alterado, o objdiff reconstruirá automaticamente os objetos e os comparará novamente.
Se não for especificado, objdiff usará os padrões padrão listados acima.
units
(opcional) : se especificado, objdiff exibirá uma lista de objetos na barra lateral para facilitar a navegação.
name
(opcional) : o nome do objeto na IU. Se não for especificado, opath
do objeto será usado.
target_path
: caminho para o objeto "destino" ou "esperado" da raiz do projeto.
Este objeto é o resultado pretendido da partida.
base_path
: caminho para o objeto "base" ou "real" da raiz do projeto.
Este objeto é construído a partir do código-fonte atual .
metadata.auto_generated
(opcional) : oculta o objeto da lista de objetos, mas ainda o inclui nos relatórios.
metadata.complete
(opcional) : Marca o objeto como "completo" (ou "vinculado") na lista de objetos.
Isso é útil para marcar objetos que estão totalmente descompilados. Um valorfalse
marcará o objeto como "incompleto".
Instale o Rust via Rustup.
$ git clone https://github.com/encounter/objdiff.git
$ cd objdiff
$ cargo run --release
Ou usando cargo install
.
$ cargo install --locked --git https://github.com/encounter/objdiff.git objdiff-gui objdiff-cli
Os binários serão instalados em ~/.cargo/bin
como objdiff
e objdiff-cli
.
Licenciado sob qualquer um dos
a sua opção.
A menos que você declare explicitamente o contrário, qualquer contribuição enviada intencionalmente para inclusão no trabalho por você, conforme definido na licença Apache-2.0, deverá ser licenciada duplamente conforme acima, sem quaisquer termos ou condições adicionais.